From 000652c9695084e9e6be4f3ea515bb9f71261584 Mon Sep 17 00:00:00 2001 From: FateJH Date: Fri, 15 Jun 2018 14:50:42 -0400 Subject: [PATCH] documentation and tests; added projectile names; changed logging level for ActorTests to OFF to remove the majority of log clutter; issue with number pool hub re-assignment and the existence of fixed objects (LocalProjectile) that requires unrelated tests be modified --- .../psforever/objects/GlobalDefinitions.scala | 277 +++++++++--------- .../psforever/objects/LocalProjectile.scala | 20 ++ .../objects/{ => ballistics}/Projectile.scala | 20 +- .../ballistics/ProjectileResolution.scala | 6 +- .../definition/ProjectileDefinition.scala | 5 + .../net/psforever/objects/zones/Zone.scala | 51 +++- common/src/test/scala/objects/ActorTest.scala | 12 +- .../test/scala/objects/ProjectileTest.scala | 198 +++++++++++++ .../scala/objects/VehicleSpawnPadTest.scala | 3 +- common/src/test/scala/objects/ZoneTest.scala | 78 ++++- .../src/main/scala/WorldSessionActor.scala | 67 +++-- pslogin/src/test/scala/ActorTest.scala | 10 +- 12 files changed, 556 insertions(+), 191 deletions(-) create mode 100644 common/src/main/scala/net/psforever/objects/LocalProjectile.scala rename common/src/main/scala/net/psforever/objects/{ => ballistics}/Projectile.scala (55%) create mode 100644 common/src/test/scala/objects/ProjectileTest.scala diff --git a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index c95aba14..d9c43c79 100644 --- a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -1514,7 +1514,7 @@ object GlobalDefinitions { * Initialize `ProjectileDefinition` globals. */ private def init_projectile() : Unit = { - // 105mmbullet_projectile + bullet_105mm_projectile.Name = "105mmbullet_projectile" bullet_105mm_projectile.Damage0 = 150 bullet_105mm_projectile.Damage1 = 300 bullet_105mm_projectile.Damage2 = 300 @@ -1526,7 +1526,7 @@ object GlobalDefinitions { bullet_105mm_projectile.InitialVelocity = 100 bullet_105mm_projectile.Lifespan = 4f - // 12mmbullet_projectile + bullet_12mm_projectile.Name= "12mmbullet_projectile" bullet_12mm_projectile.Damage0 = 25 bullet_12mm_projectile.Damage1 = 10 bullet_12mm_projectile.Damage2 = 25 @@ -1538,7 +1538,7 @@ object GlobalDefinitions { bullet_12mm_projectile.InitialVelocity = 500 bullet_12mm_projectile.Lifespan = 0.5f - // 12mmbullet_projectileb + bullet_12mm_projectileb.Name = "12mmbullet_projectileb" // TODO for later, maybe : set_resource_parent 12mmbullet_projectileb game_objects 12mmbullet_projectile bullet_12mm_projectileb.Damage0 = 25 bullet_12mm_projectileb.Damage1 = 10 @@ -1551,7 +1551,7 @@ object GlobalDefinitions { bullet_12mm_projectileb.InitialVelocity = 500 bullet_12mm_projectileb.Lifespan = 0.5f - // 150mmbullet_projectile + bullet_150mm_projectile.Name = "150mmbullet_projectile" bullet_150mm_projectile.Damage0 = 150 bullet_150mm_projectile.Damage1 = 450 bullet_150mm_projectile.Damage2 = 450 @@ -1563,7 +1563,7 @@ object GlobalDefinitions { bullet_150mm_projectile.InitialVelocity = 100 bullet_150mm_projectile.Lifespan = 4f - // 15mmbullet_apc_projectile + bullet_15mm_apc_projectile.Name = "15mmbullet_apc_projectile" // TODO for later, maybe : set_resource_parent 15mmbullet_apc_projectile game_objects 15mmbullet_projectile bullet_15mm_apc_projectile.Damage0 = 12 bullet_15mm_apc_projectile.Damage1 = 20 @@ -1576,7 +1576,7 @@ object GlobalDefinitions { bullet_15mm_apc_projectile.InitialVelocity = 500 bullet_15mm_apc_projectile.Lifespan = 0.5f - // 15mmbullet_projectile + bullet_15mm_projectile.Name = "15mmbullet_projectile" bullet_15mm_projectile.Damage0 = 21 bullet_15mm_projectile.Damage1 = 18 bullet_15mm_projectile.Damage2 = 25 @@ -1588,7 +1588,7 @@ object GlobalDefinitions { bullet_15mm_projectile.InitialVelocity = 500 bullet_15mm_projectile.Lifespan = 0.5f - // 20mmbullet_apc_projectile + bullet_20mm_apc_projectile.Name = "20mmbullet_apc_projectile" // TODO for later, maybe : set_resource_parent 20mmbullet_apc_projectile game_objects 20mmbullet_projectile bullet_20mm_apc_projectile.Damage0 = 24 bullet_20mm_apc_projectile.Damage1 = 40 @@ -1601,7 +1601,7 @@ object GlobalDefinitions { bullet_20mm_apc_projectile.InitialVelocity = 500 bullet_20mm_apc_projectile.Lifespan = 0.5f - // 20mmbullet_projectile + bullet_20mm_projectile.Name = "20mmbullet_projectile" bullet_20mm_projectile.Damage0 = 20 bullet_20mm_projectile.Damage1 = 20 bullet_20mm_projectile.Damage2 = 40 @@ -1613,7 +1613,7 @@ object GlobalDefinitions { bullet_20mm_projectile.InitialVelocity = 500 bullet_20mm_projectile.Lifespan = 0.5f - // 25mmbullet_projectile + bullet_25mm_projectile.Name = "25mmbullet_projectile" bullet_25mm_projectile.Damage0 = 25 bullet_25mm_projectile.Damage1 = 35 bullet_25mm_projectile.Damage2 = 50 @@ -1623,7 +1623,7 @@ object GlobalDefinitions { bullet_25mm_projectile.InitialVelocity = 500 bullet_25mm_projectile.Lifespan = 0.6f - // 35mmbullet_projectile + bullet_35mm_projectile.Name = "35mmbullet_projectile" bullet_35mm_projectile.Damage0 = 40 bullet_35mm_projectile.Damage1 = 50 bullet_35mm_projectile.Damage2 = 60 @@ -1633,7 +1633,7 @@ object GlobalDefinitions { bullet_35mm_projectile.InitialVelocity = 200 bullet_35mm_projectile.Lifespan = 1.5f - // 75mmbullet_apc_projectile + bullet_75mm_apc_projectile.Name = "75mmbullet_apc_projectile" // TODO for later, maybe : set_resource_parent 75mmbullet_apc_projectile game_objects 75mmbullet_projectile bullet_75mm_apc_projectile.Damage0 = 85 bullet_75mm_apc_projectile.Damage1 = 155 @@ -1643,7 +1643,7 @@ object GlobalDefinitions { bullet_75mm_apc_projectile.InitialVelocity = 100 bullet_75mm_apc_projectile.Lifespan = 4f - // 75mmbullet_projectile + bullet_75mm_projectile.Name = "75mmbullet_projectile" bullet_75mm_projectile.Damage0 = 75 bullet_75mm_projectile.Damage1 = 125 bullet_75mm_projectile.DamageAtEdge = 0.1f @@ -1652,7 +1652,7 @@ object GlobalDefinitions { bullet_75mm_projectile.InitialVelocity = 100 bullet_75mm_projectile.Lifespan = 4f - // 9mmbullet_AP_projectile + bullet_9mm_AP_projectile.Name = "9mmbullet_AP_projectile" // TODO for later, maybe : set_resource_parent 9mmbullet_AP_projectile game_objects 9mmbullet_projectile bullet_9mm_AP_projectile.Damage0 = 10 bullet_9mm_AP_projectile.Damage1 = 15 @@ -1663,7 +1663,7 @@ object GlobalDefinitions { bullet_9mm_AP_projectile.Lifespan = 0.4f bullet_9mm_AP_projectile.UseDamage1Subtract = true - // 9mmbullet_projectile + bullet_9mm_projectile.Name = "9mmbullet_projectile" bullet_9mm_projectile.Damage0 = 18 bullet_9mm_projectile.Damage1 = 10 bullet_9mm_projectile.ProjectileDamageType = DamageType.Direct @@ -1673,7 +1673,7 @@ object GlobalDefinitions { bullet_9mm_projectile.Lifespan = 0.4f bullet_9mm_projectile.UseDamage1Subtract = true - // anniversary_projectilea + anniversary_projectilea.Name = "anniversary_projectilea" anniversary_projectilea.Damage0 = 30 anniversary_projectilea.Damage1 = 15 anniversary_projectilea.Damage2 = 15 @@ -1685,7 +1685,7 @@ object GlobalDefinitions { anniversary_projectilea.InitialVelocity = 500 anniversary_projectilea.Lifespan = 0.5f - // anniversary_projectileb + anniversary_projectileb.Name = "anniversary_projectileb" // TODO for later, maybe : set_resource_parent anniversary_projectileb game_objects anniversary_projectilea anniversary_projectileb.Damage0 = 30 anniversary_projectileb.Damage1 = 15 @@ -1698,7 +1698,7 @@ object GlobalDefinitions { anniversary_projectileb.InitialVelocity = 500 anniversary_projectileb.Lifespan = 0.5f - // aphelion_immolation_cannon_projectile + aphelion_immolation_cannon_projectile.Name = "aphelion_immolation_cannon_projectile" aphelion_immolation_cannon_projectile.Damage0 = 55 aphelion_immolation_cannon_projectile.Damage1 = 225 aphelion_immolation_cannon_projectile.Damage2 = 210 @@ -1710,7 +1710,7 @@ object GlobalDefinitions { aphelion_immolation_cannon_projectile.InitialVelocity = 250 aphelion_immolation_cannon_projectile.Lifespan = 1.4f - // aphelion_laser_projectile + aphelion_laser_projectile.Name = "aphelion_laser_projectile" aphelion_laser_projectile.Damage0 = 3 aphelion_laser_projectile.Damage1 = 5 aphelion_laser_projectile.Damage2 = 5 @@ -1722,7 +1722,7 @@ object GlobalDefinitions { aphelion_laser_projectile.InitialVelocity = 500 aphelion_laser_projectile.Lifespan = 0.35f - // aphelion_plasma_rocket_projectile + aphelion_plasma_rocket_projectile.Name = "aphelion_plasma_rocket_projectile" aphelion_plasma_rocket_projectile.Damage0 = 38 aphelion_plasma_rocket_projectile.Damage1 = 70 aphelion_plasma_rocket_projectile.Damage2 = 95 @@ -1736,7 +1736,7 @@ object GlobalDefinitions { aphelion_plasma_rocket_projectile.InitialVelocity = 75 aphelion_plasma_rocket_projectile.Lifespan = 5f - // aphelion_ppa_projectile + aphelion_ppa_projectile.Name = "aphelion_ppa_projectile" // TODO for later, maybe : set_resource_parent aphelion_ppa_projectile game_objects ppa_projectile aphelion_ppa_projectile.Damage0 = 31 aphelion_ppa_projectile.Damage1 = 84 @@ -1751,7 +1751,7 @@ object GlobalDefinitions { aphelion_ppa_projectile.InitialVelocity = 350 aphelion_ppa_projectile.Lifespan = .7f - // aphelion_starfire_projectile + aphelion_starfire_projectile.Name = "aphelion_starfire_projectile" // TODO for later, maybe : set_resource_parent aphelion_starfire_projectile game_objects starfire_projectile aphelion_starfire_projectile.Damage0 = 12 aphelion_starfire_projectile.Damage1 = 20 @@ -1764,7 +1764,7 @@ object GlobalDefinitions { aphelion_starfire_projectile.Lifespan = 7f aphelion_starfire_projectile.ProjectileDamageType = DamageType.Aggravated - // bolt_projectile + bolt_projectile.Name = "bolt_projectile" bolt_projectile.Damage0 = 100 bolt_projectile.Damage1 = 50 bolt_projectile.Damage2 = 50 @@ -1774,7 +1774,7 @@ object GlobalDefinitions { bolt_projectile.InitialVelocity = 500 bolt_projectile.Lifespan = 1.0f - // burster_projectile + burster_projectile.Name = "burster_projectile" burster_projectile.Damage0 = 18 burster_projectile.Damage1 = 25 burster_projectile.Damage2 = 50 @@ -1785,7 +1785,7 @@ object GlobalDefinitions { burster_projectile.InitialVelocity = 125 burster_projectile.Lifespan = 4f - // chainblade_projectile + chainblade_projectile.Name = "chainblade_projectile" // TODO for later, maybe : set_resource_parent chainblade_projectile game_objects melee_ammo_projectile chainblade_projectile.Damage0 = 50 chainblade_projectile.Damage1 = 0 @@ -1793,7 +1793,7 @@ object GlobalDefinitions { chainblade_projectile.InitialVelocity = 100 chainblade_projectile.Lifespan = .02f - // colossus_100mm_projectile + colossus_100mm_projectile.Name = "colossus_100mm_projectile" colossus_100mm_projectile.Damage0 = 58 colossus_100mm_projectile.Damage1 = 330 colossus_100mm_projectile.Damage2 = 300 @@ -1805,7 +1805,7 @@ object GlobalDefinitions { colossus_100mm_projectile.InitialVelocity = 100 colossus_100mm_projectile.Lifespan = 4f - // colossus_burster_projectile + colossus_burster_projectile.Name = "colossus_burster_projectile" // TODO for later, maybe : set_resource_parent colossus_burster_projectile game_objects burster_projectile colossus_burster_projectile.Damage0 = 18 colossus_burster_projectile.Damage1 = 26 @@ -1819,7 +1819,7 @@ object GlobalDefinitions { colossus_burster_projectile.InitialVelocity = 175 colossus_burster_projectile.Lifespan = 2.5f - // colossus_chaingun_projectile + colossus_chaingun_projectile.Name = "colossus_chaingun_projectile" // TODO for later, maybe : set_resource_parent colossus_chaingun_projectile game_objects 35mmbullet_projectile colossus_chaingun_projectile.Damage0 = 15 colossus_chaingun_projectile.Damage1 = 14 @@ -1832,7 +1832,7 @@ object GlobalDefinitions { colossus_chaingun_projectile.InitialVelocity = 500 colossus_chaingun_projectile.Lifespan = .50f - // colossus_cluster_bomb_projectile + colossus_cluster_bomb_projectile.Name = "colossus_cluster_bomb_projectile" colossus_cluster_bomb_projectile.Damage0 = 40 colossus_cluster_bomb_projectile.Damage1 = 88 colossus_cluster_bomb_projectile.Damage2 = 100 @@ -1844,7 +1844,7 @@ object GlobalDefinitions { colossus_cluster_bomb_projectile.InitialVelocity = 75 colossus_cluster_bomb_projectile.Lifespan = 5f - // colossus_tank_cannon_projectile + colossus_tank_cannon_projectile.Name = "colossus_tank_cannon_projectile" // TODO for later, maybe : set_resource_parent colossus_tank_cannon_projectile game_objects 75mmbullet_projectile colossus_tank_cannon_projectile.Damage0 = 33 colossus_tank_cannon_projectile.Damage1 = 90 @@ -1857,7 +1857,7 @@ object GlobalDefinitions { colossus_tank_cannon_projectile.InitialVelocity = 165 colossus_tank_cannon_projectile.Lifespan = 2f - // comet_projectile + comet_projectile.Name = "comet_projectile" comet_projectile.Damage0 = 15 comet_projectile.Damage1 = 60 comet_projectile.Damage2 = 60 @@ -1871,7 +1871,7 @@ object GlobalDefinitions { comet_projectile.InitialVelocity = 80 comet_projectile.Lifespan = 3.1f - // dualcycler_projectile + dualcycler_projectile.Name = "dualcycler_projectile" dualcycler_projectile.Damage0 = 18 dualcycler_projectile.Damage1 = 10 dualcycler_projectile.ProjectileDamageType = DamageType.Direct @@ -1880,7 +1880,7 @@ object GlobalDefinitions { dualcycler_projectile.InitialVelocity = 500 dualcycler_projectile.Lifespan = 0.5f - // dynomite_projectile + dynomite_projectile.Name = "dynomite_projectile" // TODO for later, maybe : set_resource_parent dynomite_projectile game_objects frag_grenade_projectile_enh dynomite_projectile.Damage0 = 75 dynomite_projectile.Damage1 = 175 @@ -1890,7 +1890,7 @@ object GlobalDefinitions { dynomite_projectile.InitialVelocity = 30 dynomite_projectile.Lifespan = 3f - // energy_cell_projectile + energy_cell_projectile.Name = "energy_cell_projectile" energy_cell_projectile.Damage0 = 18 energy_cell_projectile.Damage1 = 10 energy_cell_projectile.ProjectileDamageType = DamageType.Direct @@ -1900,14 +1900,14 @@ object GlobalDefinitions { energy_cell_projectile.Lifespan = .4f energy_cell_projectile.UseDamage1Subtract = true - // energy_gun_nc_projectile + energy_gun_nc_projectile.Name = "energy_gun_nc_projectile" energy_gun_nc_projectile.Damage0 = 10 energy_gun_nc_projectile.Damage1 = 13 energy_gun_nc_projectile.ProjectileDamageType = DamageType.Direct energy_gun_nc_projectile.InitialVelocity = 500 energy_gun_nc_projectile.Lifespan = 0.5f - // energy_gun_tr_projectile + energy_gun_tr_projectile.Name = "energy_gun_tr_projectile" energy_gun_tr_projectile.Damage0 = 14 energy_gun_tr_projectile.Damage1 = 18 energy_gun_tr_projectile.ProjectileDamageType = DamageType.Direct @@ -1916,7 +1916,7 @@ object GlobalDefinitions { energy_gun_tr_projectile.InitialVelocity = 500 energy_gun_tr_projectile.Lifespan = 0.5f - // energy_gun_vs_projectile + energy_gun_vs_projectile.Name = "energy_gun_vs_projectile" energy_gun_vs_projectile.Damage0 = 25 energy_gun_vs_projectile.Damage1 = 35 energy_gun_vs_projectile.ProjectileDamageType = DamageType.Direct @@ -1925,7 +1925,7 @@ object GlobalDefinitions { energy_gun_vs_projectile.InitialVelocity = 500 energy_gun_vs_projectile.Lifespan = .5f - // enhanced_energy_cell_projectile + enhanced_energy_cell_projectile.Name = "enhanced_energy_cell_projectile" // TODO for later, maybe : set_resource_parent enhanced_energy_cell_projectile game_objects energy_cell_projectile enhanced_energy_cell_projectile.Damage0 = 7 enhanced_energy_cell_projectile.Damage1 = 15 @@ -1936,7 +1936,7 @@ object GlobalDefinitions { enhanced_energy_cell_projectile.Lifespan = .4f enhanced_energy_cell_projectile.UseDamage1Subtract = true - // enhanced_quasar_projectile + enhanced_quasar_projectile.Name = "enhanced_quasar_projectile" // TODO for later, maybe : set_resource_parent enhanced_quasar_projectile game_objects quasar_projectile enhanced_quasar_projectile.Damage1 = 12 enhanced_quasar_projectile.Damage0 = 10 @@ -1946,7 +1946,7 @@ object GlobalDefinitions { enhanced_quasar_projectile.InitialVelocity = 500 enhanced_quasar_projectile.Lifespan = .4f - // falcon_projectile + falcon_projectile.Name = "falcon_projectile" falcon_projectile.Damage0 = 35 falcon_projectile.Damage1 = 132 falcon_projectile.Damage2 = 132 @@ -1960,7 +1960,7 @@ object GlobalDefinitions { falcon_projectile.InitialVelocity = 120 falcon_projectile.Lifespan = 2.1f - // firebird_missile_projectile + firebird_missile_projectile.Name = "firebird_missile_projectile" firebird_missile_projectile.Damage0 = 125 firebird_missile_projectile.Damage1 = 220 firebird_missile_projectile.Damage2 = 220 @@ -1974,7 +1974,7 @@ object GlobalDefinitions { firebird_missile_projectile.InitialVelocity = 75 firebird_missile_projectile.Lifespan = 5f - // flail_projectile + flail_projectile.Name = "flail_projectile" flail_projectile.Damage0 = 75 flail_projectile.Damage1 = 200 flail_projectile.Damage2 = 200 @@ -1988,7 +1988,7 @@ object GlobalDefinitions { flail_projectile.InitialVelocity = 75 flail_projectile.Lifespan = 40f - // flamethrower_fireball + flamethrower_fireball.Name = "flamethrower_fireball" flamethrower_fireball.Damage0 = 30 flamethrower_fireball.Damage1 = 0 flamethrower_fireball.Damage2 = 0 @@ -2000,7 +2000,7 @@ object GlobalDefinitions { flamethrower_fireball.InitialVelocity = 15 flamethrower_fireball.Lifespan = 1.2f - // flamethrower_projectile + flamethrower_projectile.Name = "flamethrower_projectile" flamethrower_projectile.Damage0 = 10 flamethrower_projectile.Damage1 = 0 flamethrower_projectile.Damage2 = 0 @@ -2014,7 +2014,7 @@ object GlobalDefinitions { flamethrower_projectile.InitialVelocity = 10 flamethrower_projectile.Lifespan = 2.0f - // flux_cannon_apc_projectile + flux_cannon_apc_projectile.Name = "flux_cannon_apc_projectile" // TODO for later, maybe : set_resource_parent flux_cannon_apc_projectile game_objects flux_cannon_thresher_projectile flux_cannon_apc_projectile.Damage0 = 14 flux_cannon_apc_projectile.Damage1 = 23 @@ -2027,7 +2027,7 @@ object GlobalDefinitions { flux_cannon_apc_projectile.InitialVelocity = 300 flux_cannon_apc_projectile.Lifespan = 1f - // flux_cannon_thresher_projectile + flux_cannon_thresher_projectile.Name = "flux_cannon_thresher_projectile" flux_cannon_thresher_projectile.Damage0 = 30 flux_cannon_thresher_projectile.Damage1 = 44 flux_cannon_thresher_projectile.Damage2 = 44 @@ -2039,7 +2039,7 @@ object GlobalDefinitions { flux_cannon_thresher_projectile.InitialVelocity = 75 flux_cannon_thresher_projectile.Lifespan = 3f - // fluxpod_projectile + fluxpod_projectile.Name = "fluxpod_projectile" fluxpod_projectile.Damage0 = 110 fluxpod_projectile.Damage1 = 80 fluxpod_projectile.Damage2 = 125 @@ -2051,7 +2051,7 @@ object GlobalDefinitions { fluxpod_projectile.InitialVelocity = 80 fluxpod_projectile.Lifespan = 4f - // forceblade_projectile + forceblade_projectile.Name = "forceblade_projectile" // TODO for later, maybe : set_resource_parent forceblade_projectile game_objects melee_ammo_projectile forceblade_projectile.Damage0 = 50 forceblade_projectile.Damage1 = 0 @@ -2059,7 +2059,7 @@ object GlobalDefinitions { forceblade_projectile.InitialVelocity = 100 forceblade_projectile.Lifespan = .02f - // frag_cartridge_projectile + frag_cartridge_projectile.Name = "frag_cartridge_projectile" // TODO for later, maybe : set_resource_parent frag_cartridge_projectile game_objects frag_grenade_projectile frag_cartridge_projectile.Damage0 = 75 frag_cartridge_projectile.Damage1 = 100 @@ -2069,7 +2069,7 @@ object GlobalDefinitions { frag_cartridge_projectile.InitialVelocity = 30 frag_cartridge_projectile.Lifespan = 15f - // frag_cartridge_projectile_b + frag_cartridge_projectile_b.Name = "frag_cartridge_projectile_b" // TODO for later, maybe : set_resource_parent frag_cartridge_projectile_b game_objects frag_grenade_projectile_enh frag_cartridge_projectile_b.Damage0 = 75 frag_cartridge_projectile_b.Damage1 = 100 @@ -2079,7 +2079,7 @@ object GlobalDefinitions { frag_cartridge_projectile_b.InitialVelocity = 30 frag_cartridge_projectile_b.Lifespan = 2f - // frag_grenade_projectile + frag_grenade_projectile.Name = "frag_grenade_projectile" frag_grenade_projectile.Damage0 = 75 frag_grenade_projectile.Damage1 = 100 frag_grenade_projectile.DamageAtEdge = 0.1f @@ -2088,7 +2088,7 @@ object GlobalDefinitions { frag_grenade_projectile.InitialVelocity = 30 frag_grenade_projectile.Lifespan = 15f - // frag_grenade_projectile_enh + frag_grenade_projectile_enh.Name = "frag_grenade_projectile_enh" // TODO for later, maybe : set_resource_parent frag_grenade_projectile_enh game_objects frag_grenade_projectile frag_grenade_projectile_enh.Damage0 = 75 frag_grenade_projectile_enh.Damage1 = 100 @@ -2098,7 +2098,7 @@ object GlobalDefinitions { frag_grenade_projectile_enh.InitialVelocity = 30 frag_grenade_projectile_enh.Lifespan = 2f - // galaxy_gunship_gun_projectile + galaxy_gunship_gun_projectile.Name = "galaxy_gunship_gun_projectile" // TODO for later, maybe : set_resource_parent galaxy_gunship_gun_projectile game_objects 35mmbullet_projectile galaxy_gunship_gun_projectile.Damage0 = 40 galaxy_gunship_gun_projectile.Damage1 = 50 @@ -2109,7 +2109,7 @@ object GlobalDefinitions { galaxy_gunship_gun_projectile.InitialVelocity = 400 galaxy_gunship_gun_projectile.Lifespan = 0.8f - // gauss_cannon_projectile + gauss_cannon_projectile.Name = "gauss_cannon_projectile" gauss_cannon_projectile.Damage0 = 190 gauss_cannon_projectile.Damage1 = 370 gauss_cannon_projectile.Damage2 = 370 @@ -2121,7 +2121,7 @@ object GlobalDefinitions { gauss_cannon_projectile.InitialVelocity = 150 gauss_cannon_projectile.Lifespan = 2.67f - // grenade_projectile + grenade_projectile.Name = "grenade_projectile" grenade_projectile.Damage0 = 50 grenade_projectile.DamageAtEdge = 0.2f grenade_projectile.DamageRadius = 100f @@ -2129,7 +2129,7 @@ object GlobalDefinitions { grenade_projectile.InitialVelocity = 15 grenade_projectile.Lifespan = 15f - // heavy_grenade_projectile + heavy_grenade_projectile.Name = "heavy_grenade_projectile" heavy_grenade_projectile.Damage0 = 50 heavy_grenade_projectile.Damage1 = 82 heavy_grenade_projectile.Damage2 = 82 @@ -2141,7 +2141,7 @@ object GlobalDefinitions { heavy_grenade_projectile.InitialVelocity = 75 heavy_grenade_projectile.Lifespan = 5f - // heavy_rail_beam_projectile + heavy_rail_beam_projectile.Name = "heavy_rail_beam_projectile" heavy_rail_beam_projectile.Damage0 = 75 heavy_rail_beam_projectile.Damage1 = 215 heavy_rail_beam_projectile.Damage2 = 215 @@ -2153,7 +2153,7 @@ object GlobalDefinitions { heavy_rail_beam_projectile.InitialVelocity = 600 heavy_rail_beam_projectile.Lifespan = .5f - // heavy_sniper_projectile + heavy_sniper_projectile.Name = "heavy_sniper_projectile" heavy_sniper_projectile.Damage0 = 55 heavy_sniper_projectile.Damage1 = 28 heavy_sniper_projectile.Damage2 = 28 @@ -2163,7 +2163,7 @@ object GlobalDefinitions { heavy_sniper_projectile.InitialVelocity = 500 heavy_sniper_projectile.Lifespan = 1.0f - // hellfire_projectile + hellfire_projectile.Name = "hellfire_projectile" hellfire_projectile.Damage0 = 50 hellfire_projectile.Damage1 = 250 hellfire_projectile.Damage2 = 250 @@ -2177,7 +2177,7 @@ object GlobalDefinitions { hellfire_projectile.InitialVelocity = 125 hellfire_projectile.Lifespan = 1.5f - // hunter_seeker_missile_dumbfire + hunter_seeker_missile_dumbfire.Name = "hunter_seeker_missile_dumbfire" hunter_seeker_missile_dumbfire.Damage0 = 50 hunter_seeker_missile_dumbfire.Damage1 = 350 hunter_seeker_missile_dumbfire.Damage2 = 250 @@ -2189,7 +2189,7 @@ object GlobalDefinitions { hunter_seeker_missile_dumbfire.InitialVelocity = 40 hunter_seeker_missile_dumbfire.Lifespan = 6.3f - // hunter_seeker_missile_projectile + hunter_seeker_missile_projectile.Name = "hunter_seeker_missile_projectile" hunter_seeker_missile_projectile.Damage0 = 50 hunter_seeker_missile_projectile.Damage1 = 350 hunter_seeker_missile_projectile.Damage2 = 250 @@ -2201,7 +2201,7 @@ object GlobalDefinitions { hunter_seeker_missile_projectile.InitialVelocity = 40 hunter_seeker_missile_projectile.Lifespan = 6.3f - // jammer_cartridge_projectile + jammer_cartridge_projectile.Name = "jammer_cartridge_projectile" // TODO for later, maybe : set_resource_parent jammer_cartridge_projectile game_objects jammer_grenade_projectile jammer_cartridge_projectile.Damage0 = 0 jammer_cartridge_projectile.Damage1 = 0 @@ -2211,7 +2211,7 @@ object GlobalDefinitions { jammer_cartridge_projectile.InitialVelocity = 30 jammer_cartridge_projectile.Lifespan = 15f - // jammer_cartridge_projectile_b + jammer_cartridge_projectile_b.Name = "jammer_cartridge_projectile_b" // TODO for later, maybe : set_resource_parent jammer_cartridge_projectile_b game_objects jammer_grenade_projectile_enh jammer_cartridge_projectile_b.Damage0 = 0 jammer_cartridge_projectile_b.Damage1 = 0 @@ -2221,7 +2221,7 @@ object GlobalDefinitions { jammer_cartridge_projectile_b.InitialVelocity = 30 jammer_cartridge_projectile_b.Lifespan = 2f - // jammer_grenade_projectile + jammer_grenade_projectile.Name = "jammer_grenade_projectile" jammer_grenade_projectile.Damage0 = 0 jammer_grenade_projectile.Damage1 = 0 jammer_grenade_projectile.DamageAtEdge = 1.0f @@ -2230,7 +2230,7 @@ object GlobalDefinitions { jammer_grenade_projectile.InitialVelocity = 30 jammer_grenade_projectile.Lifespan = 15f - // jammer_grenade_projectile_enh + jammer_grenade_projectile_enh.Name = "jammer_grenade_projectile_enh" // TODO for later, maybe : set_resource_parent jammer_grenade_projectile_enh game_objects jammer_grenade_projectile jammer_grenade_projectile_enh.Damage0 = 0 jammer_grenade_projectile_enh.Damage1 = 0 @@ -2240,14 +2240,14 @@ object GlobalDefinitions { jammer_grenade_projectile_enh.InitialVelocity = 30 jammer_grenade_projectile_enh.Lifespan = 3f - // katana_projectile + katana_projectile.Name = "katana_projectile" katana_projectile.Damage0 = 25 katana_projectile.Damage1 = 0 katana_projectile.ProjectileDamageType = DamageType.Direct katana_projectile.InitialVelocity = 100 katana_projectile.Lifespan = .03f - // katana_projectileb + katana_projectileb.Name = "katana_projectileb" // TODO for later, maybe : set_resource_parent katana_projectileb game_objects katana_projectile katana_projectileb.Damage0 = 25 katana_projectileb.Damage1 = 0 @@ -2255,7 +2255,7 @@ object GlobalDefinitions { katana_projectileb.InitialVelocity = 100 katana_projectileb.Lifespan = .03f - // lancer_projectile + lancer_projectile.Name = "lancer_projectile" lancer_projectile.Damage0 = 25 lancer_projectile.Damage1 = 175 lancer_projectile.Damage2 = 125 @@ -2265,7 +2265,7 @@ object GlobalDefinitions { lancer_projectile.InitialVelocity = 500 lancer_projectile.Lifespan = 0.6f - // lasher_projectile + lasher_projectile.Name = "lasher_projectile" lasher_projectile.Damage0 = 30 lasher_projectile.Damage1 = 15 lasher_projectile.Damage2 = 15 @@ -2277,7 +2277,7 @@ object GlobalDefinitions { lasher_projectile.InitialVelocity = 120 lasher_projectile.Lifespan = 0.75f - // lasher_projectile_ap + lasher_projectile_ap.Name = "lasher_projectile_ap" lasher_projectile_ap.Damage0 = 12 lasher_projectile_ap.Damage1 = 25 lasher_projectile_ap.Damage2 = 25 @@ -2289,7 +2289,7 @@ object GlobalDefinitions { lasher_projectile_ap.InitialVelocity = 120 lasher_projectile_ap.Lifespan = 0.75f - // liberator_bomb_cluster_bomblet_projectile + liberator_bomb_cluster_bomblet_projectile.Name = "liberator_bomb_cluster_bomblet_projectile" liberator_bomb_cluster_bomblet_projectile.Damage0 = 75 liberator_bomb_cluster_bomblet_projectile.Damage1 = 100 liberator_bomb_cluster_bomblet_projectile.DamageAtEdge = 0.25f @@ -2298,7 +2298,7 @@ object GlobalDefinitions { liberator_bomb_cluster_bomblet_projectile.InitialVelocity = 0 liberator_bomb_cluster_bomblet_projectile.Lifespan = 30f - // liberator_bomb_cluster_projectile + liberator_bomb_cluster_projectile.Name = "liberator_bomb_cluster_projectile" liberator_bomb_cluster_projectile.Damage0 = 75 liberator_bomb_cluster_projectile.Damage1 = 100 liberator_bomb_cluster_projectile.DamageAtEdge = 0.25f @@ -2307,7 +2307,7 @@ object GlobalDefinitions { liberator_bomb_cluster_projectile.InitialVelocity = 0 liberator_bomb_cluster_projectile.Lifespan = 30f - // liberator_bomb_projectile + liberator_bomb_projectile.Name = "liberator_bomb_projectile" liberator_bomb_projectile.Damage0 = 250 liberator_bomb_projectile.Damage1 = 1000 liberator_bomb_projectile.Damage2 = 1000 @@ -2319,7 +2319,7 @@ object GlobalDefinitions { liberator_bomb_projectile.InitialVelocity = 0 liberator_bomb_projectile.Lifespan = 30f - // maelstrom_grenade_projectile + maelstrom_grenade_projectile.Name = "maelstrom_grenade_projectile" maelstrom_grenade_projectile.Damage0 = 32 maelstrom_grenade_projectile.Damage1 = 60 maelstrom_grenade_projectile.DamageRadius = 20.0f @@ -2327,7 +2327,7 @@ object GlobalDefinitions { maelstrom_grenade_projectile.InitialVelocity = 30 maelstrom_grenade_projectile.Lifespan = 2f - // maelstrom_grenade_projectile_contact + maelstrom_grenade_projectile_contact.Name = "maelstrom_grenade_projectile_contact" // TODO for later, maybe : set_resource_parent maelstrom_grenade_projectile_contact game_objects maelstrom_grenade_projectile maelstrom_grenade_projectile_contact.Damage0 = 32 maelstrom_grenade_projectile_contact.Damage1 = 60 @@ -2336,7 +2336,7 @@ object GlobalDefinitions { maelstrom_grenade_projectile_contact.InitialVelocity = 30 maelstrom_grenade_projectile_contact.Lifespan = 15f - // maelstrom_stream_projectile + maelstrom_stream_projectile.Name = "maelstrom_stream_projectile" maelstrom_stream_projectile.Damage0 = 15 maelstrom_stream_projectile.Damage1 = 6 maelstrom_stream_projectile.ProjectileDamageType = DamageType.Direct @@ -2345,7 +2345,7 @@ object GlobalDefinitions { maelstrom_stream_projectile.InitialVelocity = 200 maelstrom_stream_projectile.Lifespan = 0.2f - // magcutter_projectile + magcutter_projectile.Name = "magcutter_projectile" // TODO for later, maybe : set_resource_parent magcutter_projectile game_objects melee_ammo_projectile magcutter_projectile.Damage0 = 50 magcutter_projectile.Damage1 = 0 @@ -2353,20 +2353,20 @@ object GlobalDefinitions { magcutter_projectile.InitialVelocity = 100 magcutter_projectile.Lifespan = .02f - // melee_ammo_projectile + melee_ammo_projectile.Name = "melee_ammo_projectile" melee_ammo_projectile.Damage0 = 25 melee_ammo_projectile.Damage1 = 0 melee_ammo_projectile.ProjectileDamageType = DamageType.Direct melee_ammo_projectile.InitialVelocity = 100 melee_ammo_projectile.Lifespan = .02f - // meteor_common + meteor_common.Name = "meteor_common" meteor_common.DamageAtEdge = .1f meteor_common.ProjectileDamageType = DamageType.Splash meteor_common.InitialVelocity = 0 meteor_common.Lifespan = 40 - // meteor_projectile_b_large + meteor_projectile_b_large.Name = "meteor_projectile_b_large" // TODO for later, maybe : set_resource_parent meteor_projectile_b_large game_objects meteor_common meteor_projectile_b_large.Damage0 = 2500 meteor_projectile_b_large.Damage1 = 5000 @@ -2376,7 +2376,7 @@ object GlobalDefinitions { meteor_projectile_b_large.InitialVelocity = 0 meteor_projectile_b_large.Lifespan = 40 - // meteor_projectile_b_medium + meteor_projectile_b_medium.Name = "meteor_projectile_b_medium" // TODO for later, maybe : set_resource_parent meteor_projectile_b_medium game_objects meteor_common meteor_projectile_b_medium.Damage0 = 1250 meteor_projectile_b_medium.Damage1 = 2500 @@ -2386,7 +2386,7 @@ object GlobalDefinitions { meteor_projectile_b_medium.InitialVelocity = 0 meteor_projectile_b_medium.Lifespan = 40 - // meteor_projectile_b_small + meteor_projectile_b_small.Name = "meteor_projectile_b_small" // TODO for later, maybe : set_resource_parent meteor_projectile_b_small game_objects meteor_common meteor_projectile_b_small.Damage0 = 625 meteor_projectile_b_small.Damage1 = 1250 @@ -2396,7 +2396,7 @@ object GlobalDefinitions { meteor_projectile_b_small.InitialVelocity = 0 meteor_projectile_b_small.Lifespan = 40 - // meteor_projectile_large + meteor_projectile_large.Name = "meteor_projectile_large" // TODO for later, maybe : set_resource_parent meteor_projectile_large game_objects meteor_common meteor_projectile_large.Damage0 = 2500 meteor_projectile_large.Damage1 = 5000 @@ -2406,7 +2406,7 @@ object GlobalDefinitions { meteor_projectile_large.InitialVelocity = 0 meteor_projectile_large.Lifespan = 40 - // meteor_projectile_medium + meteor_projectile_medium.Name = "meteor_projectile_medium" // TODO for later, maybe : set_resource_parent meteor_projectile_medium game_objects meteor_common meteor_projectile_medium.Damage0 = 1250 meteor_projectile_medium.Damage1 = 2500 @@ -2416,7 +2416,7 @@ object GlobalDefinitions { meteor_projectile_medium.InitialVelocity = 0 meteor_projectile_medium.Lifespan = 40 - // meteor_projectile_small + meteor_projectile_small.Name = "meteor_projectile_small" // TODO for later, maybe : set_resource_parent meteor_projectile_small game_objects meteor_common meteor_projectile_small.Damage0 = 625 meteor_projectile_small.Damage1 = 1250 @@ -2426,11 +2426,11 @@ object GlobalDefinitions { meteor_projectile_small.InitialVelocity = 0 meteor_projectile_small.Lifespan = 40 - // mine_projectile + mine_projectile.Name = "mine_projectile" mine_projectile.Lifespan = 0.01f mine_projectile.InitialVelocity = 300 - // mine_sweeper_projectile + mine_sweeper_projectile.Name = "mine_sweeper_projectile" mine_sweeper_projectile.Damage0 = 0 mine_sweeper_projectile.Damage1 = 0 mine_sweeper_projectile.DamageAtEdge = .33f @@ -2439,7 +2439,7 @@ object GlobalDefinitions { mine_sweeper_projectile.InitialVelocity = 30 mine_sweeper_projectile.Lifespan = 15f - // mine_sweeper_projectile_enh + mine_sweeper_projectile_enh.Name = "mine_sweeper_projectile_enh" mine_sweeper_projectile_enh.Damage0 = 0 mine_sweeper_projectile_enh.Damage1 = 0 mine_sweeper_projectile_enh.DamageAtEdge = 0.33f @@ -2447,7 +2447,7 @@ object GlobalDefinitions { mine_sweeper_projectile_enh.InitialVelocity = 30 mine_sweeper_projectile_enh.Lifespan = 3f - // oicw_projectile + oicw_projectile.Name = "oicw_projectile" oicw_projectile.Damage0 = 50 oicw_projectile.Damage1 = 50 oicw_projectile.Acceleration = 15 @@ -2458,7 +2458,7 @@ object GlobalDefinitions { oicw_projectile.InitialVelocity = 5 oicw_projectile.Lifespan = 6.1f - // pellet_gun_projectile + 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 pellet_gun_projectile.Damage1 = 8 @@ -2467,7 +2467,7 @@ object GlobalDefinitions { pellet_gun_projectile.Lifespan = 0.1875f pellet_gun_projectile.UseDamage1Subtract = false - // peregrine_dual_machine_gun_projectile + peregrine_dual_machine_gun_projectile.Name = "peregrine_dual_machine_gun_projectile" // TODO for later, maybe : set_resource_parent peregrine_dual_machine_gun_projectile game_objects 35mmbullet_projectile peregrine_dual_machine_gun_projectile.Damage0 = 16 peregrine_dual_machine_gun_projectile.Damage1 = 44 @@ -2480,7 +2480,7 @@ object GlobalDefinitions { peregrine_dual_machine_gun_projectile.InitialVelocity = 250 peregrine_dual_machine_gun_projectile.Lifespan = 1.1f - // peregrine_mechhammer_projectile + peregrine_mechhammer_projectile.Name = "peregrine_mechhammer_projectile" peregrine_mechhammer_projectile.Damage0 = 5 peregrine_mechhammer_projectile.Damage1 = 4 peregrine_mechhammer_projectile.Damage2 = 4 @@ -2490,7 +2490,7 @@ object GlobalDefinitions { peregrine_mechhammer_projectile.InitialVelocity = 500 peregrine_mechhammer_projectile.Lifespan = 0.4f - // peregrine_particle_cannon_projectile + peregrine_particle_cannon_projectile.Name = "peregrine_particle_cannon_projectile" peregrine_particle_cannon_projectile.Damage0 = 70 peregrine_particle_cannon_projectile.Damage1 = 525 peregrine_particle_cannon_projectile.Damage2 = 350 @@ -2502,7 +2502,7 @@ object GlobalDefinitions { peregrine_particle_cannon_projectile.InitialVelocity = 500 peregrine_particle_cannon_projectile.Lifespan = .6f - // peregrine_rocket_pod_projectile + peregrine_rocket_pod_projectile.Name = "peregrine_rocket_pod_projectile" peregrine_rocket_pod_projectile.Damage0 = 30 peregrine_rocket_pod_projectile.Damage1 = 50 peregrine_rocket_pod_projectile.Damage2 = 50 @@ -2516,7 +2516,7 @@ object GlobalDefinitions { peregrine_rocket_pod_projectile.InitialVelocity = 200 peregrine_rocket_pod_projectile.Lifespan = 1.85f - // peregrine_sparrow_projectile + peregrine_sparrow_projectile.Name = "peregrine_sparrow_projectile" // TODO for later, maybe : set_resource_parent peregrine_sparrow_projectile game_objects sparrow_projectile peregrine_sparrow_projectile.Damage0 = 20 peregrine_sparrow_projectile.Damage1 = 40 @@ -2531,7 +2531,7 @@ object GlobalDefinitions { peregrine_sparrow_projectile.InitialVelocity = 45 peregrine_sparrow_projectile.Lifespan = 7.5f - // phalanx_av_projectile + phalanx_av_projectile.Name = "phalanx_av_projectile" phalanx_av_projectile.Damage0 = 60 phalanx_av_projectile.Damage1 = 140 phalanx_av_projectile.DamageAtEdge = 0.1f @@ -2540,7 +2540,7 @@ object GlobalDefinitions { phalanx_av_projectile.InitialVelocity = 100 phalanx_av_projectile.Lifespan = 4f - // phalanx_flak_projectile + phalanx_flak_projectile.Name = "phalanx_flak_projectile" phalanx_flak_projectile.Damage0 = 15 phalanx_flak_projectile.Damage1 = 25 phalanx_flak_projectile.Damage2 = 70 @@ -2551,7 +2551,7 @@ object GlobalDefinitions { phalanx_flak_projectile.InitialVelocity = 100 phalanx_flak_projectile.Lifespan = 5f - // phalanx_projectile + phalanx_projectile.Name = "phalanx_projectile" phalanx_projectile.Damage0 = 20 phalanx_projectile.Damage1 = 30 phalanx_projectile.Damage2 = 30 @@ -2563,7 +2563,7 @@ object GlobalDefinitions { phalanx_projectile.InitialVelocity = 400 phalanx_projectile.Lifespan = 1f - // phoenix_missile_guided_projectile + phoenix_missile_guided_projectile.Name = "phoenix_missile_guided_projectile" // TODO for later, maybe : set_resource_parent phoenix_missile_guided_projectile game_objects phoenix_missile_projectile phoenix_missile_guided_projectile.Damage0 = 80 phoenix_missile_guided_projectile.Damage1 = 400 @@ -2578,7 +2578,7 @@ object GlobalDefinitions { phoenix_missile_guided_projectile.InitialVelocity = 0 phoenix_missile_guided_projectile.Lifespan = 3f - // phoenix_missile_projectile + phoenix_missile_projectile.Name = "phoenix_missile_projectile" phoenix_missile_projectile.Damage0 = 80 phoenix_missile_projectile.Damage1 = 400 phoenix_missile_projectile.Damage2 = 400 @@ -2592,7 +2592,7 @@ object GlobalDefinitions { phoenix_missile_projectile.InitialVelocity = 0 phoenix_missile_projectile.Lifespan = 3f - // plasma_cartridge_projectile + plasma_cartridge_projectile.Name = "plasma_cartridge_projectile" // TODO for later, maybe : set_resource_parent plasma_cartridge_projectile game_objects plasma_grenade_projectile plasma_cartridge_projectile.Damage0 = 20 plasma_cartridge_projectile.Damage1 = 15 @@ -2602,7 +2602,7 @@ object GlobalDefinitions { plasma_cartridge_projectile.InitialVelocity = 30 plasma_cartridge_projectile.Lifespan = 15f - // plasma_cartridge_projectile_b + plasma_cartridge_projectile_b.Name = "plasma_cartridge_projectile_b" // TODO for later, maybe : set_resource_parent plasma_cartridge_projectile_b game_objects plasma_grenade_projectile_B plasma_cartridge_projectile_b.Damage0 = 20 plasma_cartridge_projectile_b.Damage1 = 15 @@ -2612,7 +2612,7 @@ object GlobalDefinitions { plasma_cartridge_projectile_b.InitialVelocity = 30 plasma_cartridge_projectile_b.Lifespan = 2f - // plasma_grenade_projectile + plasma_grenade_projectile.Name = "plasma_grenade_projectile" plasma_grenade_projectile.Damage0 = 40 plasma_grenade_projectile.Damage1 = 30 plasma_grenade_projectile.DamageAtEdge = 0.1f @@ -2621,7 +2621,7 @@ object GlobalDefinitions { plasma_grenade_projectile.InitialVelocity = 30 plasma_grenade_projectile.Lifespan = 15f - // plasma_grenade_projectile_B + plasma_grenade_projectile_B.Name = "plasma_grenade_projectile_B" // TODO for later, maybe : set_resource_parent plasma_grenade_projectile_B game_objects plasma_grenade_projectile plasma_grenade_projectile_B.Damage0 = 40 plasma_grenade_projectile_B.Damage1 = 30 @@ -2631,7 +2631,7 @@ object GlobalDefinitions { plasma_grenade_projectile_B.InitialVelocity = 30 plasma_grenade_projectile_B.Lifespan = 3f - // pounder_projectile + pounder_projectile.Name = "pounder_projectile" pounder_projectile.Damage0 = 31 pounder_projectile.Damage1 = 120 pounder_projectile.Damage2 = 120 @@ -2643,7 +2643,7 @@ object GlobalDefinitions { pounder_projectile.InitialVelocity = 120 pounder_projectile.Lifespan = 2.5f - // pounder_projectile_enh + pounder_projectile_enh.Name = "pounder_projectile_enh" // TODO for later, maybe : set_resource_parent pounder_projectile_enh game_objects pounder_projectile pounder_projectile_enh.Damage0 = 31 pounder_projectile_enh.Damage1 = 120 @@ -2656,7 +2656,7 @@ object GlobalDefinitions { pounder_projectile_enh.InitialVelocity = 120 pounder_projectile_enh.Lifespan = 3.2f - // ppa_projectile + ppa_projectile.Name = "ppa_projectile" ppa_projectile.Damage0 = 20 ppa_projectile.Damage1 = 20 ppa_projectile.Damage2 = 40 @@ -2666,7 +2666,7 @@ object GlobalDefinitions { ppa_projectile.InitialVelocity = 400 ppa_projectile.Lifespan = .5f - // pulsar_ap_projectile + pulsar_ap_projectile.Name = "pulsar_ap_projectile" // TODO for later, maybe : set_resource_parent pulsar_ap_projectile game_objects pulsar_projectile pulsar_ap_projectile.Damage0 = 7 pulsar_ap_projectile.Damage1 = 15 @@ -2677,7 +2677,7 @@ object GlobalDefinitions { pulsar_ap_projectile.Lifespan = .4f pulsar_ap_projectile.UseDamage1Subtract = true - // pulsar_projectile + pulsar_projectile.Name = "pulsar_projectile" pulsar_projectile.Damage0 = 20 pulsar_projectile.Damage1 = 10 pulsar_projectile.ProjectileDamageType = DamageType.Direct @@ -2687,7 +2687,7 @@ object GlobalDefinitions { pulsar_projectile.Lifespan = .4f pulsar_projectile.UseDamage1Subtract = true - // quasar_projectile + quasar_projectile.Name = "quasar_projectile" quasar_projectile.Damage0 = 18 quasar_projectile.Damage1 = 8 quasar_projectile.ProjectileDamageType = DamageType.Direct @@ -2696,18 +2696,18 @@ object GlobalDefinitions { quasar_projectile.InitialVelocity = 500 quasar_projectile.Lifespan = .4f - // radiator_grenade_projectile // Todo : Radiator damages ? + radiator_grenade_projectile.Name = "radiator_grenade_projectile" // Todo : Radiator damages ? radiator_grenade_projectile.ProjectileDamageType = DamageType.Direct radiator_grenade_projectile.InitialVelocity = 30 radiator_grenade_projectile.Lifespan = 3f - // radiator_sticky_projectile + radiator_sticky_projectile.Name = "radiator_sticky_projectile" // TODO for later, maybe : set_resource_parent radiator_sticky_projectile game_objects radiator_grenade_projectile radiator_sticky_projectile.ProjectileDamageType = DamageType.Direct radiator_sticky_projectile.InitialVelocity = 30 radiator_sticky_projectile.Lifespan = 4f - // reaver_rocket_projectile + reaver_rocket_projectile.Name = "reaver_rocket_projectile" reaver_rocket_projectile.Damage0 = 25 reaver_rocket_projectile.Damage1 = 88 reaver_rocket_projectile.Damage2 = 75 @@ -2721,7 +2721,7 @@ object GlobalDefinitions { reaver_rocket_projectile.InitialVelocity = 100 reaver_rocket_projectile.Lifespan = 2.1f - // rocket_projectile + rocket_projectile.Name = "rocket_projectile" rocket_projectile.Damage0 = 50 rocket_projectile.Damage1 = 105 rocket_projectile.Damage2 = 75 @@ -2735,7 +2735,7 @@ object GlobalDefinitions { rocket_projectile.InitialVelocity = 50 rocket_projectile.Lifespan = 8f - // rocklet_flak_projectile + rocklet_flak_projectile.Name = "rocklet_flak_projectile" rocklet_flak_projectile.Damage0 = 20 rocklet_flak_projectile.Damage1 = 30 rocklet_flak_projectile.Damage2 = 57 @@ -2748,7 +2748,7 @@ object GlobalDefinitions { rocklet_flak_projectile.InitialVelocity = 60 rocklet_flak_projectile.Lifespan = 3.2f - // rocklet_jammer_projectile + rocklet_jammer_projectile.Name = "rocklet_jammer_projectile" rocklet_jammer_projectile.Damage0 = 0 rocklet_jammer_projectile.Acceleration = 10 rocklet_jammer_projectile.AccelerationUntil = 2f @@ -2758,14 +2758,14 @@ object GlobalDefinitions { rocklet_jammer_projectile.InitialVelocity = 50 rocklet_jammer_projectile.Lifespan = 8f - // scattercannon_projectile + scattercannon_projectile.Name = "scattercannon_projectile" scattercannon_projectile.Damage0 = 11 scattercannon_projectile.Damage1 = 5 scattercannon_projectile.ProjectileDamageType = DamageType.Direct scattercannon_projectile.InitialVelocity = 400 scattercannon_projectile.Lifespan = 0.25f - // scythe_projectile + scythe_projectile.Name = "scythe_projectile" scythe_projectile.Damage0 = 30 scythe_projectile.Damage1 = 20 scythe_projectile.ProjectileDamageType = DamageType.Direct @@ -2774,11 +2774,11 @@ object GlobalDefinitions { scythe_projectile.InitialVelocity = 60 scythe_projectile.Lifespan = 3f - // scythe_projectile_slave // Todo how does it work ? + scythe_projectile_slave.Name = "scythe_projectile_slave" // Todo how does it work ? scythe_projectile_slave.InitialVelocity = 30 scythe_projectile_slave.Lifespan = 3f - // shotgun_shell_AP_projectile + shotgun_shell_AP_projectile.Name = "shotgun_shell_AP_projectile" // TODO for later, maybe : set_resource_parent shotgun_shell_AP_projectile game_objects shotgun_shell_projectile shotgun_shell_AP_projectile.Damage0 = 5 shotgun_shell_AP_projectile.Damage1 = 10 @@ -2787,7 +2787,7 @@ object GlobalDefinitions { shotgun_shell_AP_projectile.Lifespan = 0.25f shotgun_shell_AP_projectile.UseDamage1Subtract = true - // shotgun_shell_projectile + shotgun_shell_projectile.Name = "shotgun_shell_projectile" shotgun_shell_projectile.Damage0 = 12 shotgun_shell_projectile.Damage1 = 5 shotgun_shell_projectile.ProjectileDamageType = DamageType.Direct @@ -2795,7 +2795,7 @@ object GlobalDefinitions { shotgun_shell_projectile.Lifespan = 0.25f shotgun_shell_projectile.UseDamage1Subtract = true - // six_shooter_projectile + six_shooter_projectile.Name = "six_shooter_projectile" // TODO for later, maybe : set_resource_parent six_shooter_projectile game_objects 9mmbullet_projectile six_shooter_projectile.Damage0 = 22 six_shooter_projectile.Damage1 = 20 @@ -2806,7 +2806,7 @@ object GlobalDefinitions { six_shooter_projectile.Lifespan = 0.4f six_shooter_projectile.UseDamage1Subtract = false - // skyguard_flak_cannon_projectile + skyguard_flak_cannon_projectile.Name = "skyguard_flak_cannon_projectile" skyguard_flak_cannon_projectile.Damage0 = 15 skyguard_flak_cannon_projectile.Damage1 = 25 skyguard_flak_cannon_projectile.Damage2 = 50 @@ -2817,7 +2817,7 @@ object GlobalDefinitions { skyguard_flak_cannon_projectile.InitialVelocity = 100 skyguard_flak_cannon_projectile.Lifespan = 5f - // sparrow_projectile + sparrow_projectile.Name = "sparrow_projectile" sparrow_projectile.Damage0 = 35 sparrow_projectile.Damage1 = 50 sparrow_projectile.Damage2 = 125 @@ -2829,7 +2829,7 @@ object GlobalDefinitions { sparrow_projectile.InitialVelocity = 60 sparrow_projectile.Lifespan = 5.85f - // sparrow_secondary_projectile + sparrow_secondary_projectile.Name = "sparrow_secondary_projectile" // TODO for later, maybe : set_resource_parent sparrow_secondary_projectile game_objects sparrow_projectile sparrow_secondary_projectile.Damage0 = 35 sparrow_secondary_projectile.Damage1 = 50 @@ -2842,7 +2842,7 @@ object GlobalDefinitions { sparrow_secondary_projectile.InitialVelocity = 60 sparrow_secondary_projectile.Lifespan = 5.85f - // spiker_projectile + spiker_projectile.Name = "spiker_projectile" // spiker_projectile.Damage0 = 75 spiker_projectile.Damage0 = 20 // spiker_projectile.Damage0_min = 20 @@ -2856,7 +2856,7 @@ object GlobalDefinitions { spiker_projectile.InitialVelocity = 40 spiker_projectile.Lifespan = 5f - // spitfire_aa_ammo_projectile + spitfire_aa_ammo_projectile.Name = "spitfire_aa_ammo_projectile" spitfire_aa_ammo_projectile.Damage0 = 5 spitfire_aa_ammo_projectile.Damage1 = 15 spitfire_aa_ammo_projectile.Damage2 = 12 @@ -2869,7 +2869,7 @@ object GlobalDefinitions { spitfire_aa_ammo_projectile.InitialVelocity = 100 spitfire_aa_ammo_projectile.Lifespan = 5f - // spitfire_ammo_projectile + spitfire_ammo_projectile.Name = "spitfire_ammo_projectile" spitfire_ammo_projectile.Damage0 = 15 spitfire_ammo_projectile.Damage1 = 10 spitfire_ammo_projectile.ProjectileDamageType = DamageType.Direct @@ -2878,7 +2878,7 @@ object GlobalDefinitions { spitfire_ammo_projectile.InitialVelocity = 100 spitfire_ammo_projectile.Lifespan = .5f - // starfire_projectile + starfire_projectile.Name = "starfire_projectile" starfire_projectile.Damage0 = 16 starfire_projectile.Damage1 = 20 starfire_projectile.Damage2 = 58 @@ -2888,7 +2888,7 @@ object GlobalDefinitions { starfire_projectile.InitialVelocity = 45 starfire_projectile.Lifespan = 7.8f - // striker_missile_projectile + striker_missile_projectile.Name = "striker_missile_projectile" striker_missile_projectile.Damage0 = 35 striker_missile_projectile.Damage1 = 175 striker_missile_projectile.Damage2 = 125 @@ -2902,7 +2902,7 @@ object GlobalDefinitions { striker_missile_projectile.InitialVelocity = 30 striker_missile_projectile.Lifespan = 4.2f - // striker_missile_targeting_projectile + striker_missile_targeting_projectile.Name = "striker_missile_targeting_projectile" // TODO for later, maybe : set_resource_parent striker_missile_targeting_projectile game_objects striker_missile_projectile striker_missile_targeting_projectile.Damage0 = 35 striker_missile_targeting_projectile.Damage1 = 175 @@ -2917,7 +2917,7 @@ object GlobalDefinitions { striker_missile_targeting_projectile.InitialVelocity = 30 striker_missile_targeting_projectile.Lifespan = 4.2f - // trek_projectile + trek_projectile.Name = "trek_projectile" trek_projectile.Damage0 = 0 trek_projectile.Damage1 = 0 trek_projectile.Damage2 = 0 @@ -2929,7 +2929,7 @@ object GlobalDefinitions { trek_projectile.InitialVelocity = 40 trek_projectile.Lifespan = 7f - // vanu_sentry_turret_projectile + vanu_sentry_turret_projectile.Name = "vanu_sentry_turret_projectile" vanu_sentry_turret_projectile.Damage0 = 25 vanu_sentry_turret_projectile.Damage1 = 35 vanu_sentry_turret_projectile.Damage2 = 100 @@ -2939,7 +2939,7 @@ object GlobalDefinitions { vanu_sentry_turret_projectile.InitialVelocity = 240 vanu_sentry_turret_projectile.Lifespan = 1.3f - // vulture_bomb_projectile + vulture_bomb_projectile.Name = "vulture_bomb_projectile" vulture_bomb_projectile.Damage0 = 175 vulture_bomb_projectile.Damage1 = 1750 vulture_bomb_projectile.Damage2 = 1000 @@ -2951,7 +2951,7 @@ object GlobalDefinitions { vulture_bomb_projectile.InitialVelocity = 0 vulture_bomb_projectile.Lifespan = 30f - // vulture_nose_bullet_projectile + vulture_nose_bullet_projectile.Name = "vulture_nose_bullet_projectile" vulture_nose_bullet_projectile.Damage0 = 12 vulture_nose_bullet_projectile.Damage1 = 15 vulture_nose_bullet_projectile.Damage2 = 10 @@ -2963,7 +2963,7 @@ object GlobalDefinitions { vulture_nose_bullet_projectile.InitialVelocity = 500 vulture_nose_bullet_projectile.Lifespan = 0.46f - // vulture_tail_bullet_projectile + vulture_tail_bullet_projectile.Name = "vulture_tail_bullet_projectile" vulture_tail_bullet_projectile.Damage0 = 25 vulture_tail_bullet_projectile.Damage1 = 35 vulture_tail_bullet_projectile.Damage2 = 50 @@ -2973,7 +2973,7 @@ object GlobalDefinitions { vulture_tail_bullet_projectile.InitialVelocity = 500 vulture_tail_bullet_projectile.Lifespan = 0.6f - // wasp_gun_projectile + wasp_gun_projectile.Name = "wasp_gun_projectile" wasp_gun_projectile.Damage0 = 10 wasp_gun_projectile.Damage1 = 15 wasp_gun_projectile.Damage2 = 25 @@ -2985,7 +2985,7 @@ object GlobalDefinitions { wasp_gun_projectile.InitialVelocity = 500 wasp_gun_projectile.Lifespan = 0.5f - // wasp_rocket_projectile + wasp_rocket_projectile.Name = "wasp_rocket_projectile" wasp_rocket_projectile.Damage0 = 35 wasp_rocket_projectile.Damage1 = 50 wasp_rocket_projectile.Damage2 = 300 @@ -2997,7 +2997,7 @@ object GlobalDefinitions { wasp_rocket_projectile.InitialVelocity = 60 wasp_rocket_projectile.Lifespan = 6.5f - // winchester_projectile + winchester_projectile.Name = "winchester_projectile" // TODO for later, maybe : set_resource_parent winchester_projectile game_objects bolt_projectile winchester_projectile.Damage0 = 80 winchester_projectile.Damage1 = 40 @@ -3009,7 +3009,6 @@ object GlobalDefinitions { winchester_projectile.Lifespan = 0.6f } - /** * Initialize `ToolDefinition` globals. */ diff --git a/common/src/main/scala/net/psforever/objects/LocalProjectile.scala b/common/src/main/scala/net/psforever/objects/LocalProjectile.scala new file mode 100644 index 00000000..86afd33e --- /dev/null +++ b/common/src/main/scala/net/psforever/objects/LocalProjectile.scala @@ -0,0 +1,20 @@ +// Copyright (c) 2017 PSForever +package net.psforever.objects + +/** + * A `LocalProjectile` is a server-side object designed to populate a fake shared space. + * It is a placeholder intended to block out the existence of projectiles communicated from clients. + * All clients reserve the same internal range of user-generated GUID's from 40100 to 40124, inclusive. + * All clients recognize this same range independent of each other as "their own featureless projectiles." + * @see `Zone.MakeReservedObjects`
+ * `Projectile.BaseUID`
+ * `Projectile.RangeUID` + */ +class LocalProjectile extends PlanetSideGameObject { + def Definition = LocalProjectile.local +} + +object LocalProjectile { + import net.psforever.objects.definition.ObjectDefinition + def local = new ObjectDefinition(0) { Name = "projectile" } +} diff --git a/common/src/main/scala/net/psforever/objects/Projectile.scala b/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala similarity index 55% rename from common/src/main/scala/net/psforever/objects/Projectile.scala rename to common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala index 0ee77c7c..aaf48c5a 100644 --- a/common/src/main/scala/net/psforever/objects/Projectile.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/Projectile.scala @@ -1,25 +1,23 @@ // Copyright (c) 2017 PSForever -package net.psforever.objects +package net.psforever.objects.ballistics import net.psforever.objects.definition.{ProjectileDefinition, ToolDefinition} import net.psforever.objects.entity.SimpleWorldEntity -import net.psforever.objects.ballistics.ProjectileResolution import net.psforever.types.Vector3 final case class Projectile(profile : ProjectileDefinition, tool_def : ToolDefinition, - pos : Vector3, - orient : Vector3, + shot_origin : Vector3, + shot_angle : Vector3, resolution : ProjectileResolution.Value, fire_time : Long = System.nanoTime, hit_time : Long = 0) { val current : SimpleWorldEntity = new SimpleWorldEntity() - def Resolve(hitPos : Vector3, hitAng : Vector3, hitVel : Vector3, resolution : ProjectileResolution.Value) : Projectile = { + def Resolve(hitPos : Vector3, hitAng : Vector3, resolution : ProjectileResolution.Value) : Projectile = { val obj = Resolve(resolution) obj.current.Position = hitPos obj.current.Orientation = hitAng - obj.current.Velocity = hitVel obj } @@ -28,15 +26,19 @@ final case class Projectile(profile : ProjectileDefinition, case ProjectileResolution.Unresolved => this case _ => - Projectile(profile, tool_def, pos, orient, resolution, fire_time, System.nanoTime) + Projectile(profile, tool_def, shot_origin, shot_angle, resolution, fire_time, System.nanoTime) } } } object Projectile { + /** the first projectile GUID used by all clients internally */ final val BaseUID : Int = 40100 + /** all clients progress through 40100 to 40124 normally, skipping only for long-lived projectiles + * 40125 to 40149 are being reserved as a guard against undetected overflow */ + final val RangeUID : Int = 40150 - def apply(profile : ProjectileDefinition, tool_def : ToolDefinition, pos : Vector3, orient : Vector3) : Projectile = { - Projectile(profile, tool_def, pos, orient, ProjectileResolution.Unresolved) + def apply(profile : ProjectileDefinition, tool_def : ToolDefinition, shot_origin : Vector3, shot_angle : Vector3) : Projectile = { + Projectile(profile, tool_def, shot_origin, shot_angle, ProjectileResolution.Unresolved) } } diff --git a/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala b/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala index 85fc958b..c4afcd5e 100644 --- a/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala +++ b/common/src/main/scala/net/psforever/objects/ballistics/ProjectileResolution.scala @@ -6,8 +6,10 @@ object ProjectileResolution extends Enumeration { val Unresolved, + Resolved, MissedShot, - Target, - Obstacle + Hit, + Splash, + Lash = Value } 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 def0b20b..892e0f21 100644 --- a/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala +++ b/common/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala @@ -3,6 +3,11 @@ package net.psforever.objects.definition import net.psforever.objects.ballistics.{DamageProfile, DamageType, Projectiles} +/** + * The definition that outlines the damage-dealing characteristics of any projectile. + * `Tool` objects emit `ProjectileDefinition` objects and that is later wrapped into a `Projectile` object. + * @param objectId the object's identifier number + */ class ProjectileDefinition(objectId : Int) extends ObjectDefinition(objectId) with DamageProfile { private val projectileType : Projectiles.Value = Projectiles(objectId) //let throw NoSuchElementException private var damage0 : Int = 0 diff --git a/common/src/main/scala/net/psforever/objects/zones/Zone.scala b/common/src/main/scala/net/psforever/objects/zones/Zone.scala index 930ac574..849b7150 100644 --- a/common/src/main/scala/net/psforever/objects/zones/Zone.scala +++ b/common/src/main/scala/net/psforever/objects/zones/Zone.scala @@ -3,7 +3,8 @@ package net.psforever.objects.zones import akka.actor.{ActorContext, ActorRef, Props} import akka.routing.RandomPool -import net.psforever.objects.{Avatar, PlanetSideGameObject, Player, Vehicle} +import net.psforever.objects.ballistics.Projectile +import net.psforever.objects._ import net.psforever.objects.equipment.Equipment import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.actor.UniqueNumberSystem @@ -47,6 +48,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { private var guid : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(65536)) guid.AddPool("environment", (0 to 3000).toList) //TODO tailer ro suit requirements of zone guid.AddPool("dynamic", (3001 to 10000).toList).Selector = new RandomSelector //TODO unlump pools later; do not make too big + guid.AddPool("projectiles", (Projectile.BaseUID until Projectile.RangeUID).toList) //TODO unlump pools later; do not make too big /** A synchronized `List` of items (`Equipment`) dropped by players on the ground and can be collected again. */ private val equipmentOnGround : ListBuffer[Equipment] = ListBuffer[Equipment]() /** */ @@ -97,6 +99,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { MakeBuildings(context) AssignAmenities() CreateSpawnGroups() + MakeLocalProjectiles() } } @@ -150,10 +153,15 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { /** * Replace the current globally unique identifier system with a new one. * The replacement will not occur if the current system is populated or if its synchronized reference has been created. + * The primary use of this function should be testing. + * A warning will be issued. * @return synchronized reference to the globally unique identifier system */ def GUID(hub : NumberPoolHub) : Boolean = { if(actor == ActorRef.noSender && guid.Pools.map({case ((_, pool)) => pool.Count}).sum == 0) { + import org.fusesource.jansi.Ansi.Color.RED + import org.fusesource.jansi.Ansi.ansi + println(ansi().fgBright(RED).a(s"""Caution: replacement of the number pool system for zone $Id; function is for testing purposes only""").reset()) guid = hub true } @@ -162,6 +170,43 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { } } + /** + * Wraps around the globally unique identifier system to insert a new number pool. + * Throws exceptions for specific reasons if the pool can not be populated before the system has been started. + * @see `NumberPoolHub.AddPool` + * @param name the name of the pool + * @param pool the numbers that will belong to the pool + * @return `true`, if the new pool is created; + * `false`, if the new pool can not be created because the system has already been started + */ + def AddPool(name : String, pool : Seq[Int]) : Boolean = { + if(accessor == ActorRef.noSender) { + guid.AddPool(name, pool.toList) + true + } + else { + false + } + } + + /** + * Wraps around the globally unique identifier system to remove an existing number pool. + * Throws exceptions for specific reasons if the pool can not be removed before the system has been started. + * @see `NumberPoolHub.RemovePool` + * @param name the name of the pool + * @return `true`, if the new pool is un-made; + * `false`, if the new pool can not be removed because the system has already been started + */ + def RemovePool(name : String) : Boolean = { + if(accessor == ActorRef.noSender) { + guid.RemovePool(name) + true + } + else { + false + } + } + /** * Recover an object from the globally unique identifier system by the number that was assigned previously. * @param object_guid the globally unique identifier requested @@ -258,6 +303,10 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { entry } + def MakeLocalProjectiles() : Unit = { + (Projectile.BaseUID until Projectile.RangeUID) foreach { guid.register(new LocalProjectile(), _) } + } + /** * Provide bulk correspondence on all map entities that can be composed into packet messages and reported to a client. * These messages are sent in this fashion at the time of joining the server:
diff --git a/common/src/test/scala/objects/ActorTest.scala b/common/src/test/scala/objects/ActorTest.scala index cdb7ca00..9c772cd9 100644 --- a/common/src/test/scala/objects/ActorTest.scala +++ b/common/src/test/scala/objects/ActorTest.scala @@ -3,11 +3,21 @@ package objects import akka.actor.ActorSystem import akka.testkit.{ImplicitSender, TestKit} +import com.typesafe.config.{ConfigFactory, ConfigValueFactory} import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} import org.specs2.specification.Scope -abstract class ActorTest(sys : ActorSystem = ActorSystem("system")) extends TestKit(sys) with Scope with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { +abstract class ActorTest(sys : ActorSystem = ActorSystem("system", ConfigFactory.parseMap(ActorTest.LoggingConfig))) + extends TestKit(sys) with Scope with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { override def afterAll { TestKit.shutdownActorSystem(system) } } + +object ActorTest { + import scala.collection.JavaConverters._ + private val LoggingConfig = Map( + "akka.loglevel" -> ConfigValueFactory.fromAnyRef("OFF"), + "akka.stdout-loglevel" -> ConfigValueFactory.fromAnyRef("OFF") + ).asJava +} diff --git a/common/src/test/scala/objects/ProjectileTest.scala b/common/src/test/scala/objects/ProjectileTest.scala new file mode 100644 index 00000000..d28aba91 --- /dev/null +++ b/common/src/test/scala/objects/ProjectileTest.scala @@ -0,0 +1,198 @@ +// Copyright (c) 2017 PSForever +package objects + +import net.psforever.objects.{GlobalDefinitions, LocalProjectile, Tool} +import net.psforever.objects.ballistics.{DamageType, Projectile, ProjectileResolution, Projectiles} +import net.psforever.objects.definition.ProjectileDefinition +import net.psforever.types.Vector3 +import org.specs2.mutable.Specification + +class ProjectileTest extends Specification { + "LocalProjectile" should { + "construct" in { + val obj = new LocalProjectile() //since they're just placeholders, they only need to construct + obj.Definition.ObjectId mustEqual 0 + obj.Definition.Name mustEqual "projectile" + } + } + + "ProjectileDefinition" should { + "define (default)" in { + val obj = new ProjectileDefinition(31) //9mmbullet_projectile + + obj.ProjectileType mustEqual Projectiles.bullet_9mm_projectile + obj.ObjectId mustEqual 31 + obj.Damage0 mustEqual 0 + obj.Damage1 mustEqual 0 + obj.Damage2 mustEqual 0 + obj.Damage3 mustEqual 0 + obj.Damage4 mustEqual 0 + obj.Acceleration mustEqual 0 + obj.AccelerationUntil mustEqual 0f + obj.ProjectileDamageType mustEqual DamageType.None + obj.ProjectileDamageTypeSecondary mustEqual DamageType.None + obj.DegradeDelay mustEqual 1f + obj.DegradeMultiplier mustEqual 1f + obj.InitialVelocity mustEqual 1 + obj.Lifespan mustEqual 1f + obj.DamageAtEdge mustEqual 1f + obj.DamageRadius mustEqual 1f + obj.UseDamage1Subtract mustEqual false + } + + "define (custom)" in { + val obj = new ProjectileDefinition(31) //9mmbullet_projectile + obj.Damage0 = 2 + obj.Damage1 = 4 + obj.Damage2 = 8 + obj.Damage3 = 16 + obj.Damage4 = 32 + obj.Acceleration = 5 + obj.AccelerationUntil = 5.5f + obj.ProjectileDamageType = DamageType.Splash + obj.ProjectileDamageTypeSecondary = DamageType.Radiation + obj.DegradeDelay = 11.1f + obj.DegradeMultiplier = 22.2f + obj.InitialVelocity = 50 + obj.Lifespan = 11.2f + obj.DamageAtEdge = 3f + obj.DamageRadius = 3f + obj.UseDamage1Subtract = true + + obj.Damage0 mustEqual 2 + obj.Damage1 mustEqual 4 + obj.Damage2 mustEqual 8 + obj.Damage3 mustEqual 16 + obj.Damage4 mustEqual 32 + obj.Acceleration mustEqual 5 + obj.AccelerationUntil mustEqual 5.5f + obj.ProjectileDamageType mustEqual DamageType.Splash + obj.ProjectileDamageTypeSecondary mustEqual DamageType.Radiation + obj.DegradeDelay mustEqual 11.1f + obj.DegradeMultiplier mustEqual 22.2f + obj.InitialVelocity mustEqual 50 + obj.Lifespan mustEqual 11.2f + obj.DamageAtEdge mustEqual 3f + obj.DamageRadius mustEqual 3f + obj.UseDamage1Subtract mustEqual true + } + + "define (failure)" in { + Projectiles(31) mustEqual Projectiles.bullet_9mm_projectile + try { + ProjectileDefinition(Projectiles.bullet_9mm_projectile) //passes + } + catch { + case _ : NoSuchElementException => + ko + } + + Projectiles(2) must throwA[NoSuchElementException] + new ProjectileDefinition(2) must throwA[NoSuchElementException] + } + + "cascade damage values" in { + val obj = new ProjectileDefinition(31) //9mmbullet_projectile + obj.Damage4 = 32 + obj.Damage3 = 16 + obj.Damage2 = 8 + obj.Damage1 = 4 + obj.Damage0 = 2 + + //initial + obj.Damage4 mustEqual 32 + obj.Damage3 mustEqual 16 + obj.Damage2 mustEqual 8 + obj.Damage1 mustEqual 4 + obj.Damage0 mustEqual 2 + //negate Damage4 + obj.Damage4 = None + obj.Damage4 mustEqual 16 + obj.Damage3 mustEqual 16 + obj.Damage2 mustEqual 8 + obj.Damage1 mustEqual 4 + obj.Damage0 mustEqual 2 + //negate Damage3 + obj.Damage3 = None + obj.Damage4 mustEqual 8 + obj.Damage3 mustEqual 8 + obj.Damage2 mustEqual 8 + obj.Damage1 mustEqual 4 + obj.Damage0 mustEqual 2 + //negate Damage2 + obj.Damage2 = None + obj.Damage4 mustEqual 4 + obj.Damage3 mustEqual 4 + obj.Damage2 mustEqual 4 + obj.Damage1 mustEqual 4 + obj.Damage0 mustEqual 2 + //negate Damage1 + obj.Damage1 = None + obj.Damage4 mustEqual 2 + obj.Damage3 mustEqual 2 + obj.Damage2 mustEqual 2 + obj.Damage1 mustEqual 2 + obj.Damage0 mustEqual 2 + //negate Damage0 + obj.Damage0 = None + obj.Damage4 mustEqual 0 + obj.Damage3 mustEqual 0 + obj.Damage2 mustEqual 0 + obj.Damage1 mustEqual 0 + obj.Damage0 mustEqual 0 + //set Damage3, set Damage0 + obj.Damage3 = 13 + obj.Damage0 = 7 + obj.Damage4 mustEqual 13 + obj.Damage3 mustEqual 13 + obj.Damage2 mustEqual 7 + obj.Damage1 mustEqual 7 + obj.Damage0 mustEqual 7 + } + } + + "Projectile" should { + "construct" in { + val beamer_wep = Tool(GlobalDefinitions.beamer) + val projectile = beamer_wep.Projectile + val obj = Projectile(projectile, beamer_wep.Definition, Vector3(1.2f, 3.4f, 5.6f), Vector3(0.2f, 0.4f, 0.6f)) + + obj.profile mustEqual beamer_wep.Projectile + obj.tool_def mustEqual GlobalDefinitions.beamer + obj.shot_origin mustEqual Vector3(1.2f, 3.4f, 5.6f) + obj.shot_angle mustEqual Vector3(0.2f, 0.4f, 0.6f) + obj.resolution mustEqual ProjectileResolution.Unresolved + obj.fire_time <= System.nanoTime mustEqual true + obj.hit_time mustEqual 0 + } + + "resolve" in { + val beamer_wep = Tool(GlobalDefinitions.beamer) + val projectile = beamer_wep.Projectile + val obj = Projectile(projectile, beamer_wep.Definition, Vector3(1.2f, 3.4f, 5.6f), Vector3(0.2f, 0.4f, 0.6f)) + val obj2 = obj.Resolve(ProjectileResolution.MissedShot) + + obj.resolution mustEqual ProjectileResolution.Unresolved + obj.fire_time <= System.nanoTime mustEqual true + obj.hit_time mustEqual 0 + obj2.resolution mustEqual ProjectileResolution.MissedShot + obj2.fire_time == obj.fire_time mustEqual true + obj2.hit_time <= System.nanoTime mustEqual true + obj2.fire_time <= obj2.hit_time mustEqual true + } + + "resolve, with coordinates" in { + val beamer_wep = Tool(GlobalDefinitions.beamer) + val projectile = beamer_wep.Projectile + val obj = Projectile(projectile, beamer_wep.Definition, Vector3(1.2f, 3.4f, 5.6f), Vector3(0.2f, 0.4f, 0.6f)) + val obj2 = obj.Resolve(Vector3(7.2f, 8.4f, 9.6f), Vector3(1.2f, 1.4f, 1.6f), ProjectileResolution.Resolved) + + obj.resolution mustEqual ProjectileResolution.Unresolved + obj.current.Position mustEqual Vector3.Zero + obj.current.Orientation mustEqual Vector3.Zero + obj2.resolution mustEqual ProjectileResolution.Resolved + obj2.current.Position mustEqual Vector3(7.2f, 8.4f, 9.6f) + obj2.current.Orientation mustEqual Vector3(1.2f, 1.4f, 1.6f) + } + } +} diff --git a/common/src/test/scala/objects/VehicleSpawnPadTest.scala b/common/src/test/scala/objects/VehicleSpawnPadTest.scala index e2693030..3e3c8a2e 100644 --- a/common/src/test/scala/objects/VehicleSpawnPadTest.scala +++ b/common/src/test/scala/objects/VehicleSpawnPadTest.scala @@ -3,6 +3,7 @@ package objects import akka.actor.{ActorRef, ActorSystem, Props} import akka.testkit.TestProbe +import net.psforever.objects.ballistics.Projectile import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.structures.StructureType @@ -326,7 +327,7 @@ object VehicleSpawnPadControlTest { val zone = new Zone("test-zone", map, 0) val vehicle = Vehicle(GlobalDefinitions.two_man_assault_buggy) val weapon = vehicle.WeaponControlledFromSeat(1).get.asInstanceOf[Tool] - val guid : NumberPoolHub = new NumberPoolHub(LimitedNumberSource(3)) + val guid : NumberPoolHub = new NumberPoolHub(LimitedNumberSource(40150)) guid.AddPool("test-pool", (0 to 2).toList) guid.register(vehicle, "test-pool") guid.register(weapon, "test-pool") diff --git a/common/src/test/scala/objects/ZoneTest.scala b/common/src/test/scala/objects/ZoneTest.scala index 3804825d..3fa320ac 100644 --- a/common/src/test/scala/objects/ZoneTest.scala +++ b/common/src/test/scala/objects/ZoneTest.scala @@ -16,6 +16,7 @@ import net.psforever.types.{CharacterGender, CharacterVoice, PlanetSideEmpire, V import net.psforever.objects.serverobject.structures.{Building, FoundationBuilder, StructureType} import net.psforever.objects.zones.{Zone, ZoneActor, ZoneMap} import net.psforever.objects.Vehicle +import net.psforever.objects.ballistics.Projectile import org.specs2.mutable.Specification import scala.concurrent.duration._ @@ -96,18 +97,15 @@ class ZoneTest extends Specification { "can have its unique identifier system changed if no objects were added to it" in { val zone = new Zone("home3", map13, 13) val guid1 : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(100)) - guid1.AddPool("pool1", (0 to 50).toList) - guid1.AddPool("pool2", (51 to 75).toList) zone.GUID(guid1) mustEqual true + zone.AddPool("pool1", (0 to 50).toList) + zone.AddPool("pool2", (51 to 75).toList) val obj = new TestObject() guid1.register(obj, "pool2").isSuccess mustEqual true guid1.WhichPool(obj) mustEqual Some("pool2") - val guid2 : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(150)) - guid2.AddPool("pool3", (0 to 50).toList) - guid2.AddPool("pool4", (51 to 75).toList) - zone.GUID(guid2) mustEqual false + zone.GUID(new NumberPoolHub(new LimitedNumberSource(150))) mustEqual false } } } @@ -121,6 +119,48 @@ class ZoneActorTest extends ActorTest { assert(zone.Actor != ActorRef.noSender) } + "create new number pools before the Actor is started" in { + val zone = new Zone("test", new ZoneMap("map6"), 1) + zone.GUID(new NumberPoolHub(new LimitedNumberSource(10))) + assert( zone.AddPool("test1", 1 to 2) ) + + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-add-pool-actor") //note: not Init'd yet + assert( zone.AddPool("test2", 3 to 4) ) + } + + "remove existing number pools before the Actor is started" in { + val zone = new Zone("test", new ZoneMap("map6"), 1) + zone.GUID(new NumberPoolHub(new LimitedNumberSource(10))) + assert( zone.AddPool("test1", 1 to 2) ) + assert( zone.RemovePool("test1") ) + + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-remove-pool-actor") //note: not Init'd yet + assert( zone.AddPool("test2", 3 to 4) ) + assert( zone.RemovePool("test2") ) + } + + "refuse new number pools after the Actor is started" in { + val zone = new Zone("test", new ZoneMap("map6"), 1) + zone.GUID(new NumberPoolHub(new LimitedNumberSource(40150))) + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-add-pool-actor-init") + zone.Actor ! Zone.Init() + expectNoMsg(Duration.create(300, "ms")) + + assert( !zone.AddPool("test1", 1 to 2) ) + } + + "refuse to remove number pools after the Actor is started" in { + val zone = new Zone("test", new ZoneMap("map6"), 1) + + zone.GUID(new NumberPoolHub(new LimitedNumberSource(40150))) + zone.AddPool("test", 1 to 2) + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-remove-pool-actor-init") + zone.Actor ! Zone.Init() + expectNoMsg(Duration.create(300, "ms")) + + assert( !zone.RemovePool("test") ) + } + "set up spawn groups based on buildings" in { val map6 = new ZoneMap("map6") { LocalBuilding(1, FoundationBuilder(Building.Structure(StructureType.Building, Vector3(1,1,1)))) @@ -225,6 +265,20 @@ class ZoneActorTest extends ActorTest { assert(reply.asInstanceOf[Zone.Lattice.NoValidSpawnPoint].spawn_group.contains(7)) } } + + "populate a series of reference projectiles" in { + val zone = new Zone("test", new ZoneMap("map6"), 1) + zone.Actor = system.actorOf(Props(classOf[ZoneActor], zone), "test-projectiles") + zone.Actor ! Zone.Init() + expectNoMsg(Duration.create(300, "ms")) + + (Projectile.BaseUID until Projectile.RangeUID) + .map { zone.GUID } + .collect { + case Some(_ : LocalProjectile) => ; //pass + case _ => assert(false) + } + } } class ZonePopulationTest extends ActorTest { @@ -466,7 +520,7 @@ class ZonePopulationTest extends ActorTest { class ZoneGroundDropItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) hub.register(item, 10) val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) @@ -490,7 +544,7 @@ class ZoneGroundDropItemTest extends ActorTest { class ZoneGroundCanNotDropItem1Test extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) //hub.register(item, 10) //!important val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) @@ -538,7 +592,7 @@ class ZoneGroundCanNotDropItem2Test extends ActorTest { class ZoneGroundCanNotDropItem3Test extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) hub.register(item, 10) //!important val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) //!important @@ -570,7 +624,7 @@ class ZoneGroundCanNotDropItem3Test extends ActorTest { class ZoneGroundPickupItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) hub.register(item, 10) val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) @@ -597,7 +651,7 @@ class ZoneGroundPickupItemTest extends ActorTest { class ZoneGroundCanNotPickupItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) hub.register(item, 10) val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) //still registered to this zone @@ -620,7 +674,7 @@ class ZoneGroundCanNotPickupItemTest extends ActorTest { class ZoneGroundRemoveItemTest extends ActorTest { val item = AmmoBox(GlobalDefinitions.bullet_9mm) - val hub = new NumberPoolHub(new LimitedNumberSource(20)) + val hub = new NumberPoolHub(new LimitedNumberSource(40150)) hub.register(item, 10) val zone = new Zone("test", new ZoneMap("test-map"), 0) zone.GUID(hub) //still registered to this zone diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 16c70c62..c9d962ca 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -53,7 +53,7 @@ import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.Success import akka.pattern.ask -import net.psforever.objects.ballistics.ProjectileResolution +import net.psforever.objects.ballistics.{Projectile, ProjectileResolution} class WorldSessionActor extends Actor with MDCContextAware { import WorldSessionActor._ @@ -85,9 +85,7 @@ class WorldSessionActor extends Actor with MDCContextAware { var traveler : Traveler = null var deadState : DeadState.Value = DeadState.Dead var whenUsedLastKit : Long = 0 - /** the client rotates between 40100 -- 40124 for projectiles normally, skipping only for long-lived projectiles - * 40125 -- 40149 is being reserved as a (potential) guard against overflow */ - val projectiles : Array[Option[Projectile]] = Array.fill[Option[Projectile]](50)(None) + val projectiles : Array[Option[Projectile]] = Array.fill[Option[Projectile]](Projectile.RangeUID - Projectile.BaseUID)(None) var amsSpawnPoint : Option[SpawnTube] = None @@ -2686,13 +2684,22 @@ class WorldSessionActor extends Actor with MDCContextAware { } } + case Some(_ : LocalProjectile) => + FindProjectileEntry(object_guid) match { + case Some(projectile) => + if(projectile.resolution != ProjectileResolution.Unresolved) { + log.warn(s"RequestDestroy: tried to clean up missed projectile ${object_guid.guid} but it was already resolved") + } + ResolveProjectileEntry(object_guid, ProjectileResolution.MissedShot) + case None => + log.warn(s"RequestDestroy: projectile ${object_guid.guid} has never been fired") + } + case Some(thing) => log.warn(s"RequestDestroy: not allowed to delete object $thing") case None => - if(ResolveProjectileEntry(object_guid.guid - Projectile.BaseUID, ProjectileResolution.MissedShot).isEmpty) { - log.warn(s"RequestDestroy: object $object_guid not found") - } + log.warn(s"RequestDestroy: object ${object_guid.guid} not found") } case msg @ ObjectDeleteMessage(object_guid, unk1) => @@ -3173,15 +3180,15 @@ class WorldSessionActor extends Actor with MDCContextAware { case msg @ HitMessage(seq_time, projectile_guid, unk1, hit_info, unk2, unk3, unk4) => log.info(s"Hit: $msg") - ResolveProjectileEntry(projectile_guid.guid - Projectile.BaseUID, ProjectileResolution.Target) + ResolveProjectileEntry(projectile_guid, ProjectileResolution.Hit) case msg @ SplashHitMessage(seq_time, projectile_guid, explosion_pos, direct_victim_uid, unk3, projectile_vel, unk4, targets) => log.info(s"Splash: $msg") - ResolveProjectileEntry(projectile_guid.guid - Projectile.BaseUID, ProjectileResolution.Target) + ResolveProjectileEntry(projectile_guid, ProjectileResolution.Splash) case msg @ LashMessage(seq_time, killer_guid, victim_guid, projectile_guid, pos, unk1) => log.info(s"Lash: $msg") - ResolveProjectileEntry(projectile_guid.guid - Projectile.BaseUID, ProjectileResolution.Target) + ResolveProjectileEntry(projectile_guid, ProjectileResolution.Lash) case msg @ AvatarFirstTimeEventMessage(avatar_guid, object_guid, unk1, event_name) => log.info("AvatarFirstTimeEvent: " + msg) @@ -5249,22 +5256,32 @@ class WorldSessionActor extends Actor with MDCContextAware { } } - def ResolveProjectileEntry(index : Int, resolution : ProjectileResolution.Value) : Option[Projectile] = { + def FindProjectileEntry(projectile_guid : PlanetSideGUID) : Option[Projectile] = { + val index = projectile_guid.guid - Projectile.BaseUID if(0 <= index && index < projectiles.length) { - val entry = projectiles(index) - entry match { - case None => - log.warn(s"ResolveProjectile: expected projectile, but ${Projectile.BaseUID + index} not found") - None - case Some(projectile) => - projectile.resolution match { - case ProjectileResolution.Unresolved => ; - case _ => - log.warn(s"ResolveProjectileEntry: ${projectile.profile.ProjectileType} projectile found but reports to already be resolved") - } - projectiles(index) = Some(projectile.Resolve(resolution)) - projectiles(index) - } + projectiles(index) + } + else { + log.warn(s"ResolveProjectile: expected projectile, but ${projectile_guid.guid} not found") + None + } + } + + def ResolveProjectileEntry(projectile_guid : PlanetSideGUID, resolution : ProjectileResolution.Value) : Option[Projectile] = { + FindProjectileEntry(projectile_guid) match { + case Some(projectile) => + val index = projectile_guid.guid - Projectile.BaseUID + ResolveProjectileEntry(projectile, index, resolution) + case None => + log.warn(s"ResolveProjectile: expected projectile, but ${projectile_guid.guid} not found") + None + } + } + + def ResolveProjectileEntry(projectile : Projectile, index : Int, resolution : ProjectileResolution.Value) : Option[Projectile] = { + if(projectiles(index).contains(projectile)) { + projectiles(index) = Some(projectile.Resolve(ProjectileResolution.Resolved)) + Some(projectile.Resolve(resolution)) } else { None diff --git a/pslogin/src/test/scala/ActorTest.scala b/pslogin/src/test/scala/ActorTest.scala index 116f6b21..21e57b5a 100644 --- a/pslogin/src/test/scala/ActorTest.scala +++ b/pslogin/src/test/scala/ActorTest.scala @@ -2,17 +2,25 @@ import akka.actor.{ActorRef, ActorSystem, MDCContextAware} import akka.testkit.{ImplicitSender, TestKit, TestProbe} +import com.typesafe.config.{ConfigFactory, ConfigValueFactory} import net.psforever.packet.{ControlPacket, GamePacket} import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} import org.specs2.specification.Scope -abstract class ActorTest(sys : ActorSystem = ActorSystem("system")) extends TestKit(sys) with Scope with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { +abstract class ActorTest(sys : ActorSystem = ActorSystem("system", ConfigFactory.parseMap(ActorTest.LoggingConfig))) + extends TestKit(sys) with Scope with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { override def afterAll { TestKit.shutdownActorSystem(system) } } object ActorTest { + import scala.collection.JavaConverters._ + private val LoggingConfig = Map( + "akka.loglevel" -> ConfigValueFactory.fromAnyRef("OFF"), + "akka.stdout-loglevel" -> ConfigValueFactory.fromAnyRef("OFF") + ).asJava + final case class MDCGamePacket(packet : GamePacket) final case class MDCControlPacket(packet : ControlPacket)