diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 19ef4851..99857cef 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -69,6 +69,20 @@ database { game { # Allow instant action to AMS instant-action-ams = no + + # Battle experience rate + bep-rate = 1.0 + + # Command experience rate + cep-rate = 1.0 + + new-avatar { + # Starting battle rank + br = 1 + + # Starting command rank + cr = 1 + } } anti-cheat { diff --git a/src/main/scala/net/psforever/actors/session/AvatarActor.scala b/src/main/scala/net/psforever/actors/session/AvatarActor.scala index ea40d09c..67f74b08 100644 --- a/src/main/scala/net/psforever/actors/session/AvatarActor.scala +++ b/src/main/scala/net/psforever/actors/session/AvatarActor.scala @@ -58,7 +58,7 @@ import net.psforever.types.{ } import net.psforever.util.Database._ import net.psforever.persistence -import net.psforever.util.DefinitionUtil +import net.psforever.util.{Config, DefinitionUtil} import org.joda.time.{LocalDateTime, Seconds} import net.psforever.services.ServiceManager import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} @@ -306,7 +306,9 @@ class AvatarActor( _.factionId -> lift(empire.id), _.headId -> lift(head), _.voiceId -> lift(voice.id), - _.genderId -> lift(gender.id) + _.genderId -> lift(gender.id), + _.bep -> lift(Config.app.game.newAvatar.br.experience), + _.cep -> lift(Config.app.game.newAvatar.cr.experience) ) .returningGenerated(_.id) ) @@ -330,7 +332,7 @@ class AvatarActor( case Failure(e) => log.error(e)("db failure") } case Some(_) => - // send "char already exist" + // send "char already exists" sessionActor ! SessionActor.SendResponse(ActionResultMessage.Fail(1)) } case Failure(e) => diff --git a/src/main/scala/net/psforever/actors/session/SessionActor.scala b/src/main/scala/net/psforever/actors/session/SessionActor.scala index a2919e2a..98ea9277 100644 --- a/src/main/scala/net/psforever/actors/session/SessionActor.scala +++ b/src/main/scala/net/psforever/actors/session/SessionActor.scala @@ -1820,8 +1820,8 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con sendResponse(DestroyDisplayMessage(killer, victim, method, unk)) // TODO Temporary thing that should go somewhere else and use proper xp values if (killer.CharId == avatar.id && killer.Faction != victim.Faction) { - avatarActor ! AvatarActor.AwardBep(1000) - avatarActor ! AvatarActor.AwardCep(100) + avatarActor ! AvatarActor.AwardBep((1000 * Config.app.game.bepRate).toLong) + avatarActor ! AvatarActor.AwardCep((100 * Config.app.game.cepRate).toLong) } case AvatarResponse.DropItem(pkt) => diff --git a/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala b/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala index 0a0548c3..45817f3d 100644 --- a/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala +++ b/src/main/scala/net/psforever/packet/game/VNLWorldStatusMessage.scala @@ -25,8 +25,8 @@ object ServerType extends IntEnum[ServerType] { case object Released extends ServerType(3, "released") case object ReleasedGemini extends ServerType(4, "released_gemini") - val values = findValues - implicit val codec = PacketHelpers.createIntEnumCodec(this, uint8L) + val values: IndexedSeq[ServerType] = findValues + implicit val codec: Codec[ServerType] = PacketHelpers.createIntEnumCodec(this, uint8L) } // This MUST be an IP address. The client DOES NOT do name resolution properly diff --git a/src/main/scala/net/psforever/util/Config.scala b/src/main/scala/net/psforever/util/Config.scala index 0305b83a..51090cf6 100644 --- a/src/main/scala/net/psforever/util/Config.scala +++ b/src/main/scala/net/psforever/util/Config.scala @@ -5,6 +5,7 @@ import java.nio.file.Paths import com.typesafe.config.{Config => TypesafeConfig} import enumeratum.{Enum, EnumEntry} import enumeratum.values.{IntEnum, IntEnumEntry} +import net.psforever.objects.avatar.{BattleRank, CommandRank} import net.psforever.packet.game.ServerType import net.psforever.types.ChatMessageType import pureconfig.ConfigConvert.viaNonEmptyStringOpt @@ -30,7 +31,9 @@ object Config { viaNonEmptyStringOpt[A]( v => enum.values.toList.collectFirst { - case e: ServerType if e.name == v => e.asInstanceOf[A] + case e: ServerType if e.name == v => e.asInstanceOf[A] + case e: BattleRank if e.value.toString == v => e.asInstanceOf[A] + case e: CommandRank if e.value.toString == v => e.asInstanceOf[A] }, _.value.toString ) @@ -120,7 +123,15 @@ case class SessionConfig( ) case class GameConfig( - instantActionAms: Boolean + instantActionAms: Boolean, + bepRate: Double, + cepRate: Double, + newAvatar: NewAvatar +) + +case class NewAvatar( + br: BattleRank, + cr: CommandRank ) case class DevelopmentConfig(