diff --git a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index f833b0fb..09be1073 100644 --- a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -1,6 +1,7 @@ // Copyright (c) 2017 PSForever package net.psforever.objects +import net.psforever.objects.GlobalDefinitions.sparrow_projectile import net.psforever.objects.ballistics.Projectiles import net.psforever.objects.ce.{DeployableCategory, DeployedItem} import net.psforever.objects.definition._ @@ -297,6 +298,8 @@ object GlobalDefinitions { val oicw_projectile = ProjectileDefinition(Projectiles.oicw_projectile) + val oicw_little_buddy = ProjectileDefinition(Projectiles.oicw_little_buddy) + val pellet_gun_projectile = ProjectileDefinition(Projectiles.pellet_gun_projectile) val peregrine_dual_machine_gun_projectile = ProjectileDefinition(Projectiles.peregrine_dual_machine_gun_projectile) @@ -2216,6 +2219,7 @@ object GlobalDefinitions { aphelion_starfire_projectile.InitialVelocity = 45 aphelion_starfire_projectile.Lifespan = 7f aphelion_starfire_projectile.ProjectileDamageType = DamageType.Aggravated + aphelion_starfire_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(aphelion_starfire_projectile) bolt_projectile.Name = "bolt_projectile" @@ -2692,6 +2696,7 @@ object GlobalDefinitions { hunter_seeker_missile_projectile.ProjectileDamageType = DamageType.Splash hunter_seeker_missile_projectile.InitialVelocity = 40 hunter_seeker_missile_projectile.Lifespan = 6.3f + hunter_seeker_missile_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(hunter_seeker_missile_projectile) jammer_cartridge_projectile.Name = "jammer_cartridge_projectile" @@ -2977,8 +2982,21 @@ object GlobalDefinitions { oicw_projectile.ProjectileDamageType = DamageType.Splash oicw_projectile.InitialVelocity = 5 oicw_projectile.Lifespan = 6.1f + oicw_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(oicw_projectile) + oicw_little_buddy.Name = "oicw_projectile" + oicw_little_buddy.Damage0 = 75 + oicw_little_buddy.Damage1 = 75 + oicw_little_buddy.DamageAtEdge = 0.1f + oicw_little_buddy.DamageRadius = 7.5f + oicw_little_buddy.ProjectileDamageType = DamageType.Splash + oicw_little_buddy.InitialVelocity = 40 + oicw_little_buddy.Lifespan = 0.5f + oicw_little_buddy.ExistsOnRemoteClients = true + //add_property oicw_little_buddy multi_stage_spawn_server_side true ... + ProjectileDefinition.CalculateDerivedFields(oicw_little_buddy) + pellet_gun_projectile.Name = "pellet_gun_projectile" // TODO for later, maybe : set_resource_parent pellet_gun_projectile game_objects shotgun_shell_projectile pellet_gun_projectile.Damage0 = 12 @@ -3056,6 +3074,7 @@ object GlobalDefinitions { peregrine_sparrow_projectile.ProjectileDamageType = DamageType.Splash peregrine_sparrow_projectile.InitialVelocity = 45 peregrine_sparrow_projectile.Lifespan = 7.5f + peregrine_sparrow_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(peregrine_sparrow_projectile) phalanx_av_projectile.Name = "phalanx_av_projectile" @@ -3383,6 +3402,7 @@ object GlobalDefinitions { sparrow_projectile.ProjectileDamageType = DamageType.Splash sparrow_projectile.InitialVelocity = 60 sparrow_projectile.Lifespan = 5.85f + sparrow_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(sparrow_projectile) sparrow_secondary_projectile.Name = "sparrow_secondary_projectile" @@ -3397,6 +3417,7 @@ object GlobalDefinitions { sparrow_secondary_projectile.ProjectileDamageType = DamageType.Splash sparrow_secondary_projectile.InitialVelocity = 60 sparrow_secondary_projectile.Lifespan = 5.85f + sparrow_secondary_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(sparrow_secondary_projectile) spiker_projectile.Name = "spiker_projectile" @@ -3447,6 +3468,7 @@ object GlobalDefinitions { starfire_projectile.ProjectileDamageType = DamageType.Aggravated starfire_projectile.InitialVelocity = 45 starfire_projectile.Lifespan = 7.8f + starfire_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(starfire_projectile) striker_missile_projectile.Name = "striker_missile_projectile" @@ -3478,6 +3500,7 @@ object GlobalDefinitions { striker_missile_targeting_projectile.ProjectileDamageType = DamageType.Splash striker_missile_targeting_projectile.InitialVelocity = 30 striker_missile_targeting_projectile.Lifespan = 4.2f + striker_missile_targeting_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(striker_missile_targeting_projectile) trek_projectile.Name = "trek_projectile" @@ -3565,6 +3588,7 @@ object GlobalDefinitions { wasp_rocket_projectile.ProjectileDamageType = DamageType.Splash wasp_rocket_projectile.InitialVelocity = 60 wasp_rocket_projectile.Lifespan = 6.5f + wasp_rocket_projectile.ExistsOnRemoteClients = true ProjectileDefinition.CalculateDerivedFields(wasp_rocket_projectile) winchester_projectile.Name = "winchester_projectile" diff --git a/common/src/main/scala/net/psforever/objects/ballistics/Projectiles.scala b/common/src/main/scala/net/psforever/objects/ballistics/Projectiles.scala index 45ed97d4..cb305609 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/Projectiles.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/Projectiles.scala @@ -92,6 +92,7 @@ object Projectiles extends Enumeration { final val mine_projectile = Value(551) final val mine_sweeper_projectile = Value(554) final val mine_sweeper_projectile_enh = Value(555) + final val oicw_little_buddy = Value(601) final val oicw_projectile = Value(602) final val pellet_gun_projectile = Value(631) final val peregrine_dual_machine_gun_projectile = Value(639) diff --git a/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala b/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala index 3a36cef9..0d01ec43 100644 --- a/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala +++ b/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala @@ -23,6 +23,7 @@ class ProjectileDefinition(objectId : Int) extends ObjectDefinition(objectId) private var damageAtEdge : Float = 1f private var damageRadius : Float = 1f private var useDamage1Subtract : Boolean = false + private var existsOnRemoteClients : Boolean = false //`true` spawns a server-managed object //derived calculations private var distanceMax : Float = 0f private var distanceFromAcceleration : Float = 0f @@ -109,6 +110,13 @@ class ProjectileDefinition(objectId : Int) extends ObjectDefinition(objectId) DamageRadius } + def ExistsOnRemoteClients : Boolean = existsOnRemoteClients + + def ExistsOnRemoteClients_=(existsOnRemoteClients : Boolean) : Boolean = { + this.existsOnRemoteClients = existsOnRemoteClients + ExistsOnRemoteClients + } + def DistanceMax : Float = distanceMax //accessor only def DistanceFromAcceleration : Float = distanceFromAcceleration //accessor only diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala index 527fdc5d..7308f84e 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala @@ -1230,6 +1230,7 @@ object ObjectClass { case ObjectClass.meteor_projectile_large => ConstructorData(TrackedProjectileData.codec, "meteor") case ObjectClass.meteor_projectile_medium => ConstructorData(TrackedProjectileData.codec, "meteor") case ObjectClass.meteor_projectile_small => ConstructorData(TrackedProjectileData.codec, "meteor") + case ObjectClass.oicw_little_buddy => ConstructorData(TrackedProjectileData.codec, "projectile") case ObjectClass.oicw_projectile => ConstructorData(TrackedProjectileData.codec, "projectile") case ObjectClass.sparrow_projectile => ConstructorData(TrackedProjectileData.codec, "projectile") case ObjectClass.starfire_projectile => ConstructorData(TrackedProjectileData.codec, "projectile") diff --git a/common/src/main/scala/net/psforever/packet/game/objectcreate/TrackedProjectileData.scala b/common/src/main/scala/net/psforever/packet/game/objectcreate/TrackedProjectileData.scala index dece6e29..89daa598 100644 --- a/common/src/main/scala/net/psforever/packet/game/objectcreate/TrackedProjectileData.scala +++ b/common/src/main/scala/net/psforever/packet/game/objectcreate/TrackedProjectileData.scala @@ -1,34 +1,19 @@ // Copyright (c) 2017 PSForever package net.psforever.packet.game.objectcreate -import net.psforever.packet.{Marshallable, PacketHelpers} +import net.psforever.packet.Marshallable import scodec.{Attempt, Codec, Err} import scodec.codecs._ import shapeless.{::, HNil} -object TrackedProjectile extends Enumeration { - type Type = Value - - val Meteor = Value(32) - val WaspRocket = Value(208) - val Sparrow = Value(3355579) - val OICW = Value(3355587) - val Striker = Value(6710918) - val HunterSeeker = Value(10131913) - val Starfire = Value(10131961) - - implicit val codec = PacketHelpers.createEnumerationCodec(this, uint24) -} - /** * A representation of a projectile that the server must intentionally convey to players other than the shooter. * @param data na - * @param unk2 na; - * data specific to the type of projectile(?) + * @param unk2 na * @param unk3 na */ final case class TrackedProjectileData(data : CommonFieldDataWithPlacement, - unk2 : TrackedProjectile.Value, + unk2 : Int, unk3 : Int = 0 ) extends ConstructorData { override def bitsize : Long = 33L + data.bitsize @@ -37,7 +22,7 @@ final case class TrackedProjectileData(data : CommonFieldDataWithPlacement, object TrackedProjectileData extends Marshallable[TrackedProjectileData] { implicit val codec : Codec[TrackedProjectileData] = ( ("data" | CommonFieldDataWithPlacement.codec) :: - ("unk2" | TrackedProjectile.codec) :: + ("unk2" | uint24) :: uint4 :: uint(3) :: uint2 diff --git a/common/src/test/scala/game/objectcreate/TrackedProjectileDataTest.scala b/common/src/test/scala/game/objectcreate/TrackedProjectileDataTest.scala index 998a50a3..def883bd 100644 --- a/common/src/test/scala/game/objectcreate/TrackedProjectileDataTest.scala +++ b/common/src/test/scala/game/objectcreate/TrackedProjectileDataTest.scala @@ -33,7 +33,7 @@ class TrackedProjectileDataTest extends Specification { deploy.v5.isEmpty mustEqual true deploy.guid mustEqual PlanetSideGUID(0) - unk2 mustEqual TrackedProjectile.Striker + unk2 mustEqual 6710918 unk3 mustEqual 0 case _ => @@ -50,7 +50,7 @@ class TrackedProjectileDataTest extends Specification { PlacementData(4644.5938f, 5472.0938f, 82.375f, 0f, 30.9375f, 171.5625f), CommonFieldData(PlanetSideEmpire.TR, false, false, true, None, false, None, None, PlanetSideGUID(0)) ), - TrackedProjectile.Striker, + 6710918, 0 ) val msg = ObjectCreateMessage(ObjectClass.striker_missile_targeting_projectile, PlanetSideGUID(40192), obj)