diff --git a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index b8666006..7a6a1bcd 100644 --- a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -6,7 +6,6 @@ import net.psforever.objects.definition.converter.{CommandDetonaterConverter, Lo import net.psforever.objects.equipment.CItem.DeployedItem import net.psforever.objects.equipment._ import net.psforever.objects.inventory.InventoryTile -import net.psforever.packet.game.objectcreate.ObjectClass import net.psforever.types.PlanetSideEmpire object GlobalDefinitions { @@ -161,6 +160,36 @@ object GlobalDefinitions { } } + /** + * Using the definition for a piece of `Equipment` determine if it is a grenade-type weapon. + * Only the normal grenades count; the grenade packs are excluded. + * @param edef the `EquipmentDefinition` of the item + * @return `true`, if it is a grenade-type weapon; `false`, otherwise + */ + def isGrenade(edef : EquipmentDefinition) : Boolean = { + edef match { + case `frag_grenade` | `jammer_grenade` | `plasma_grenade` => + true + case _ => + false + } + } + + /** + * Using the definition for a piece of `Equipment` determine if it is a grenade-type weapon. + * Only the grenade packs count; the normal grenades are excluded. + * @param edef the `EquipmentDefinition` of the item + * @return `true`, if it is a grenade-type weapon; `false`, otherwise + */ + def isGrenadePack(edef : EquipmentDefinition) : Boolean = { + edef match { + case `frag_cartridge` | `jammer_cartridge` | `plasma_cartridge` => + true + case _ => + false + } + } + /** * Using the definition for a piece of `Equipment` determine with which faction it aligns if it is a weapon. * Only checks `Tool` objects. @@ -241,6 +270,7 @@ object GlobalDefinitions { } } + import net.psforever.packet.game.objectcreate.ObjectClass val locker_container = new EquipmentDefinition(456) { Name = "locker container" diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala index 12e5ee29..963a7acb 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala @@ -16,8 +16,8 @@ class AvatarConverter extends ObjectCreateConverter[Player]() { MakeAppearanceData(obj), obj.Health / obj.MaxHealth * 255, //TODO not precise obj.Armor / obj.MaxArmor * 255, //TODO not precise - UniformStyle.Normal, - 0, + DressBattleRank(obj), + DressCommandRank(obj), None, //TODO cosmetics None, //TODO implant effects InventoryData(MakeHolsters(obj, BuildEquipment).sortBy(_.parentSlot)), @@ -38,7 +38,7 @@ class AvatarConverter extends ObjectCreateConverter[Player]() { obj.Armor, obj.MaxStamina, obj.Stamina, - obj.Certifications.toList.sortBy(_.id), + obj.Certifications.toList.sortBy(_.id), //TODO is sorting necessary? MakeImplantEntries(obj), List.empty[String], //TODO fte list List.empty[String], //TODO tutorial list @@ -75,6 +75,56 @@ class AvatarConverter extends ObjectCreateConverter[Player]() { ) } + /** + * Select the appropriate `UniformStyle` design for a player's accumulated battle experience points. + * At certain battle ranks, all exo-suits undergo some form of coloration change. + * @param obj the `Player` game object + * @return the resulting uniform upgrade level + */ + private def DressBattleRank(obj : Player) : UniformStyle.Value = { + val bep : Long = obj.BEP + if(bep > 2583440) { //BR25+ + UniformStyle.ThirdUpgrade + } + else if(bep > 308989) { //BR14+ + UniformStyle.SecondUpgrade + } + else if(bep > 44999) { //BR7+ + UniformStyle.FirstUpgrade + } + else { //BR1+ + UniformStyle.Normal + } + } + + /** + * Select the appropriate design for a player's accumulated command experience points. + * Visual cues for command rank include armlets, anklets, and, finally, a backpack, awarded at different ranks. + * @param obj the `Player` game object + * @return the resulting uniform upgrade level + */ + private def DressCommandRank(obj : Player) : Int = { + val cep = obj.CEP + if(cep > 599999) { + 5 + } + else if(cep > 299999) { + 4 + } + else if(cep > 149999) { + 3 + } + else if(cep > 49999) { + 2 + } + else if(cep > 9999) { + 1 + } + else { + 0 + } + } + /** * Transform an `Array` of `Implant` objects into a `List` of `ImplantEntry` objects suitable as packet data. * @param obj the `Player` game object