weaponmanager.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Commando *
  23. * *
  24. * $Archive:: /Commando/Code/Combat/weaponmanager.cpp $*
  25. * *
  26. * $Author:: Byon_g $*
  27. * *
  28. * $Modtime:: 1/02/02 3:05p $*
  29. * *
  30. * $Revision:: 106 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "weaponmanager.h"
  36. #include "weapons.h"
  37. #include "debug.h"
  38. #include "damage.h"
  39. #include "combatchunkid.h"
  40. #include "simpledefinitionfactory.h"
  41. #include "persistfactory.h"
  42. #include "assets.h"
  43. #include "surfaceeffects.h"
  44. /*
  45. ** Weapon Type Names
  46. */
  47. char *WeaponStyleNames[ NUM_WEAPON_HOLD_STYLES ] = {
  48. "C4", // WEAPON_HOLD_STYLE_C4 = 0,
  49. "---", // WEAPON_HOLD_STYLE_NOT_USED,
  50. "Shoulder", // WEAPON_HOLD_STYLE_AT_SHOULDER, // 2
  51. "Hip", // WEAPON_HOLD_STYLE_AT_HIP,
  52. "Launcher", // WEAPON_HOLD_STYLE_LAUNCHER,
  53. "Handgun", // WEAPON_HOLD_STYLE_HANDGUN,
  54. "Beacon", // WEAPON_HOLD_STYLE_BEACON
  55. "Empty Hands", // WEAPON_HOLD_STYLE_EMPTY_HANDS,
  56. "At Chest", // WEAPON_HOLD_STYLE_AT_CHEST,
  57. "Hands Down", // WEAPON_HOLD_STYLE_HANDS_DOWN,
  58. };
  59. /*
  60. ** WeaponDefinitionClass
  61. */
  62. SimplePersistFactoryClass<WeaponDefinitionClass, CHUNKID_WEAPON_DEF> _WeaponDefPersistFactory;
  63. DECLARE_DEFINITION_FACTORY(WeaponDefinitionClass, CLASSID_DEF_WEAPON, "Weapon") _WeaponDefDefFactory;
  64. uint32 WeaponDefinitionClass::Get_Class_ID (void) const { return CLASSID_DEF_WEAPON; }
  65. const PersistFactoryClass & WeaponDefinitionClass::Get_Factory (void) const { return _WeaponDefPersistFactory; }
  66. WeaponDefinitionClass::WeaponDefinitionClass( void ) :
  67. Style( 1 ),
  68. SwitchTime( 0 ),
  69. ReloadTime( 0 ),
  70. KeyNumber( 0 ),
  71. CanSnipe( false ),
  72. CanReceiveGenericCnCAmmo( true ),
  73. // LegacyFireSoundDefID( 0 ),
  74. EjectPhysDefID( 0 ),
  75. MuzzleFlashPhysDefID( 0 ),
  76. Rating( 0.1f ),
  77. FirstPersonOffset( 0,0,0 ),
  78. RecoilImpulse( 0.0f ),
  79. ReloadSoundDefID( 0 ),
  80. EmptySoundDefID( 0 ),
  81. PrimaryAmmoDefID( 0 ),
  82. SecondaryAmmoDefID( 0 ),
  83. ClipSize( 0 ),
  84. RecoilTime( 0.1f ),
  85. RecoilScale( 1.0f ),
  86. AGiveWeaponsWeapon( false ),
  87. MaxInventoryRounds( 100 ),
  88. IconNameID( 0 ),
  89. IconTextureUV( 0,0,0,0 ),
  90. IconOffset( 0,0 )
  91. {
  92. #ifdef PARAM_EDITING_ON
  93. int i;
  94. // EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_INT, Style);
  95. EnumParameterClass *param;
  96. param = new EnumParameterClass( &Style );
  97. param->Set_Name ( "Style" );
  98. for ( i = 0; i <= WEAPON_HOLD_STYLE_HANDGUN; i++ ) {
  99. param->Add_Value ( WeaponStyleNames[i], i );
  100. }
  101. param->Add_Value ( WeaponStyleNames[WEAPON_HOLD_STYLE_BEACON], WEAPON_HOLD_STYLE_BEACON );
  102. GENERIC_EDITABLE_PARAM(WeaponDefinitionClass,param)
  103. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, Model);
  104. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, IdleAnim);
  105. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, FireAnim);
  106. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, BackModel);
  107. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FLOAT, SwitchTime);
  108. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FLOAT, ReloadTime);
  109. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FLOAT, KeyNumber);
  110. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_BOOL, CanSnipe);
  111. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_BOOL, CanReceiveGenericCnCAmmo);
  112. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FLOAT, Rating);
  113. PHYS_DEF_PARAM( WeaponDefinitionClass, EjectPhysDefID, "ProjectileDef" );
  114. PHYS_DEF_PARAM( WeaponDefinitionClass, MuzzleFlashPhysDefID, "TimedDecorationPhysDef" );
  115. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, FirstPersonModel );
  116. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_VECTOR3, FirstPersonOffset );
  117. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FLOAT, RecoilImpulse);
  118. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, HUDIconTextureName );
  119. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, ReloadSoundDefID);
  120. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, EmptySoundDefID);
  121. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_AMMOOBJDEFINITIONID, PrimaryAmmoDefID);
  122. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_AMMOOBJDEFINITIONID, SecondaryAmmoDefID);
  123. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_INT, ClipSize);
  124. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_INT, MaxInventoryRounds);
  125. FLOAT_UNITS_PARAM( WeaponDefinitionClass, RecoilTime, 0.0f, 10.0f, "seconds" );
  126. FLOAT_EDITABLE_PARAM( WeaponDefinitionClass, RecoilScale, 0.0f, 10.0f );
  127. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_BOOL, AGiveWeaponsWeapon);
  128. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_STRINGSDB_ID, IconNameID );
  129. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_FILENAME, IconTextureName );
  130. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_RECT, IconTextureUV );
  131. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_VECTOR2, IconOffset );
  132. EDITABLE_PARAM( WeaponDefinitionClass, ParameterClass::TYPE_STRING, HumanFiringAnimation);
  133. #endif //PARAM_EDITING_ON
  134. }
  135. /*
  136. **
  137. */
  138. enum {
  139. CHUNKID_WEAPON_DEF_VARIABLES = 1205091654,
  140. CHUNKID_WEAPON_DEF_PARENT,
  141. MICROCHUNKID_WEAPON_DEF_STYLE = 1,
  142. MICROCHUNKID_WEAPON_DEF_MODEL,
  143. MICROCHUNKID_WEAPON_DEF_IDLE_ANIM,
  144. MICROCHUNKID_WEAPON_DEF_FIRE_ANIM,
  145. MICROCHUNKID_WEAPON_DEF_BACK_MODEL,
  146. MICROCHUNKID_WEAPON_DEF_XXXXX,
  147. XXXMICROCHUNKID_WEAPON_DEF_RATE_OF_FIRE,
  148. MICROCHUNKID_WEAPON_DEF_SWITCH_TIME,
  149. MICROCHUNKID_WEAPON_DEF_RELOAD_TIME,
  150. XXXMICROCHUNKID_WEAPON_DEF_HELP_ANGLE,
  151. XXXMICROCHUNKID_WEAPON_DEF_MUZZLE_FLASH_MODEL,
  152. XXXMICROCHUNKID_WEAPON_DEF_MUZZLE_FLASH_DURATION,
  153. XXXMICROCHUNKID_WEAPON_DEF_EJECT_EMITTER,
  154. XXXMICROCHUNKID_WEAPON_DEF_TILT,
  155. XXXMICROCHUNKID_WEAPON_DEF_KEY_NUMBER,
  156. MICROCHUNKID_WEAPON_DEF_CAN_SNIPE,
  157. XXXMICROCHUNKID_WEAPON_DEF_SOUND_RADIUS,
  158. LEGACY_MICROCHUNKID_WEAPON_DEF_FIRE_SOUND_DEFID,
  159. MICROCHUNKID_WEAPON_DEF_EJECT_PHYS_DEF_ID,
  160. MICROCHUNKID_WEAPON_DEF_MUZZLE_FLASH_PHYS_DEF_ID,
  161. MICROCHUNKID_WEAPON_DEF_RATING,
  162. MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_MODEL,
  163. MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_OFFSET,
  164. MICROCHUNKID_WEAPON_DEF_RECOIL_IMPULSE,
  165. XXX_MICROCHUNKID_WEAPON_DEF_HUD_MODEL,
  166. MICROCHUNKID_WEAPON_DEF_RELOAD_SOUND_DEFID,
  167. MICROCHUNKID_WEAPON_DEF_PRIMARY_AMMO_DEF_ID,
  168. MICROCHUNKID_WEAPON_DEF_SECONDARY_AMMO_DEF_ID,
  169. MICROCHUNKID_WEAPON_DEF_CLIP_SIZE,
  170. MICROCHUNKID_WEAPON_DEF_RECOIL_TIME,
  171. MICROCHUNKID_WEAPON_DEF_RECOIL_SCALE,
  172. MICROCHUNKID_WEAPON_DEF_A_GIVE_WEAPONS_WEAPON,
  173. XXXMICROCHUNKID_WEAPON_DEF_FIRST_PERSON_TYPE,
  174. MICROCHUNKID_WEAPON_DEF_HUD_ICON_TEXTURE_NAME,
  175. MICROCHUNKID_WEAPON_DEF_MAX_INVENTORY_ROUNDS,
  176. XXXMICROCHUNKID_WEAPON_DEF_FIRST_PERSON_TYPE_NAME,
  177. MICROCHUNKID_WEAPON_DEF_KEY_NUMBER,
  178. MICROCHUNKID_WEAPON_ICON_NAME_ID,
  179. MICROCHUNKID_WEAPON_ICON_TEXTURE_NAME,
  180. MICROCHUNKID_WEAPON_ICON_TEXTURE_UV,
  181. MICROCHUNKID_WEAPON_ICON_OFFSET,
  182. MICROCHUNKID_HUMAN_FIRING_ANIMATION,
  183. MICROCHUNKID_WEAPON_DEF_EMPTY_SOUND_DEFID,
  184. MICROCHUNKID_WEAPON_DEF_GENERIC_AMMO_OK
  185. };
  186. bool WeaponDefinitionClass::Save( ChunkSaveClass & csave )
  187. {
  188. csave.Begin_Chunk( CHUNKID_WEAPON_DEF_PARENT );
  189. DefinitionClass::Save( csave );
  190. csave.End_Chunk();
  191. csave.Begin_Chunk( CHUNKID_WEAPON_DEF_VARIABLES );
  192. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_STYLE, Style );
  193. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_MODEL, Model );
  194. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_IDLE_ANIM, IdleAnim );
  195. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_FIRE_ANIM, FireAnim );
  196. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_BACK_MODEL, BackModel );
  197. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_SWITCH_TIME, SwitchTime );
  198. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_RELOAD_TIME, ReloadTime, float );
  199. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_KEY_NUMBER, KeyNumber );
  200. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_CAN_SNIPE, CanSnipe );
  201. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_GENERIC_AMMO_OK, CanReceiveGenericCnCAmmo );
  202. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_EJECT_PHYS_DEF_ID, EjectPhysDefID );
  203. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_MUZZLE_FLASH_PHYS_DEF_ID, MuzzleFlashPhysDefID );
  204. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_RATING, Rating );
  205. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_MODEL, FirstPersonModel );
  206. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_OFFSET, FirstPersonOffset );
  207. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_RECOIL_IMPULSE, RecoilImpulse );
  208. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_DEF_HUD_ICON_TEXTURE_NAME, HUDIconTextureName );
  209. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_RELOAD_SOUND_DEFID, ReloadSoundDefID );
  210. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_EMPTY_SOUND_DEFID, EmptySoundDefID);
  211. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_PRIMARY_AMMO_DEF_ID, PrimaryAmmoDefID );
  212. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_SECONDARY_AMMO_DEF_ID, SecondaryAmmoDefID );
  213. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_CLIP_SIZE, ClipSize, int );
  214. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_RECOIL_TIME, RecoilTime );
  215. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_RECOIL_SCALE, RecoilScale );
  216. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_DEF_A_GIVE_WEAPONS_WEAPON, AGiveWeaponsWeapon );
  217. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_WEAPON_DEF_MAX_INVENTORY_ROUNDS,MaxInventoryRounds, int );
  218. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_ICON_NAME_ID, IconNameID );
  219. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_WEAPON_ICON_TEXTURE_NAME, IconTextureName );
  220. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_ICON_TEXTURE_UV, IconTextureUV );
  221. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_WEAPON_ICON_OFFSET, IconOffset );
  222. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_HUMAN_FIRING_ANIMATION, HumanFiringAnimation );
  223. csave.End_Chunk();
  224. return true;
  225. }
  226. bool WeaponDefinitionClass::Load( ChunkLoadClass &cload )
  227. {
  228. while (cload.Open_Chunk()) {
  229. switch(cload.Cur_Chunk_ID()) {
  230. case CHUNKID_WEAPON_DEF_PARENT:
  231. DefinitionClass::Load( cload );
  232. break;
  233. case CHUNKID_WEAPON_DEF_VARIABLES:
  234. while (cload.Open_Micro_Chunk()) {
  235. switch(cload.Cur_Micro_Chunk_ID()) {
  236. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_STYLE, Style );
  237. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_MODEL, Model );
  238. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_IDLE_ANIM, IdleAnim );
  239. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_FIRE_ANIM, FireAnim );
  240. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_BACK_MODEL, BackModel );
  241. // READ_MICRO_CHUNK( cload, LEGACY_MICROCHUNKID_WEAPON_DEF_FIRE_SOUND_DEFID, LegacyFireSoundDefID );
  242. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_SWITCH_TIME, SwitchTime );
  243. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RELOAD_TIME, ReloadTime, float);
  244. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_KEY_NUMBER, KeyNumber );
  245. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_CAN_SNIPE, CanSnipe );
  246. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_GENERIC_AMMO_OK, CanReceiveGenericCnCAmmo );
  247. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_EJECT_PHYS_DEF_ID, EjectPhysDefID );
  248. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_MUZZLE_FLASH_PHYS_DEF_ID, MuzzleFlashPhysDefID );
  249. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RATING, Rating );
  250. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_MODEL, FirstPersonModel );
  251. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_FIRST_PERSON_OFFSET, FirstPersonOffset );
  252. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RECOIL_IMPULSE, RecoilImpulse );
  253. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_WEAPON_DEF_HUD_ICON_TEXTURE_NAME, HUDIconTextureName );
  254. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RELOAD_SOUND_DEFID, ReloadSoundDefID );
  255. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_EMPTY_SOUND_DEFID, EmptySoundDefID);
  256. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_PRIMARY_AMMO_DEF_ID, PrimaryAmmoDefID );
  257. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_SECONDARY_AMMO_DEF_ID, SecondaryAmmoDefID );
  258. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_CLIP_SIZE, ClipSize, int );
  259. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RECOIL_TIME, RecoilTime );
  260. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_RECOIL_SCALE, RecoilScale );
  261. READ_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_A_GIVE_WEAPONS_WEAPON, AGiveWeaponsWeapon );
  262. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_WEAPON_DEF_MAX_INVENTORY_ROUNDS,MaxInventoryRounds, int );
  263. READ_MICRO_CHUNK ( cload, MICROCHUNKID_WEAPON_ICON_NAME_ID, IconNameID );
  264. READ_MICRO_CHUNK_WWSTRING ( cload, MICROCHUNKID_WEAPON_ICON_TEXTURE_NAME, IconTextureName );
  265. READ_MICRO_CHUNK ( cload, MICROCHUNKID_WEAPON_ICON_TEXTURE_UV, IconTextureUV );
  266. READ_MICRO_CHUNK ( cload, MICROCHUNKID_WEAPON_ICON_OFFSET, IconOffset );
  267. READ_MICRO_CHUNK_WWSTRING ( cload, MICROCHUNKID_HUMAN_FIRING_ANIMATION, HumanFiringAnimation );
  268. default:
  269. Debug_Say(( "Unrecognized WeaponDef Variable chunkID\n" ));
  270. break;
  271. }
  272. cload.Close_Micro_Chunk();
  273. }
  274. break;
  275. default:
  276. Debug_Say(( "Unrecognized WeaponDef chunkID\n" ));
  277. break;
  278. }
  279. cload.Close_Chunk();
  280. }
  281. return true;
  282. }
  283. /*
  284. ** AmmoDefinitionClass
  285. */
  286. SimplePersistFactoryClass<AmmoDefinitionClass, CHUNKID_AMMO_DEF> _AmmoDefPersistFactory;
  287. DECLARE_DEFINITION_FACTORY(AmmoDefinitionClass, CLASSID_DEF_AMMO, "Ammo") _AmmoDefDefFactory;
  288. uint32 AmmoDefinitionClass::Get_Class_ID (void) const { return CLASSID_DEF_AMMO; }
  289. const PersistFactoryClass & AmmoDefinitionClass::Get_Factory (void) const { return _AmmoDefPersistFactory; }
  290. AmmoDefinitionClass::AmmoDefinitionClass( void ) :
  291. Warhead( 0 ),
  292. Damage( 1 ),
  293. Range( 10 ),
  294. EffectiveRange( 10 ),
  295. Velocity( 1 ),
  296. Gravity( 0 ),
  297. Elasticity( 1.0f ),
  298. RateOfFire( 1 ),
  299. SprayAngle( 0 ),
  300. SprayCount( 1 ),
  301. AquireTime( 0 ),
  302. BurstDelayTime( 0 ),
  303. BurstMax( 0 ),
  304. SoftPierceLimit( 0 ),
  305. TurnRate( 0 ),
  306. TimeActivated( false ),
  307. TerrainActivated( false ),
  308. IsTracking( false ),
  309. // WeaponDefID( 0 ),
  310. ExplosionDefID( 0 ),
  311. RandomTrackingScale( 0 ),
  312. DisplayLaser( false ),
  313. ChargeTime( 0 ),
  314. ContinuousSoundDefID( 0 ),
  315. FireSoundDefID( 0 ),
  316. MaxBounces( 0 ),
  317. SprayBulletCost( 1 ),
  318. AmmoType( AMMO_TYPE_NORMAL ),
  319. BeaconDefID( 0 ),
  320. C4TriggerTime1( 0 ),
  321. C4TriggerTime2( 0 ),
  322. C4TriggerTime3( 0 ),
  323. C4TriggerRange1( 0 ),
  324. C4TriggerRange2( 0 ),
  325. C4TriggerRange3( 0 ),
  326. C4TimingSound1ID( 0 ),
  327. C4TimingSound2ID( 0 ),
  328. C4TimingSound3ID( 0 ),
  329. AliasedSpeed( 0 ),
  330. HitterType( SurfaceEffectsManager::HITTER_TYPE_BULLET ),
  331. BeamEnabled(false),
  332. BeamColor(1,1,1),
  333. BeamTime(0.3f),
  334. BeamWidth(0.25f),
  335. BeamEndCaps(true),
  336. BeamSubdivisionEnabled(false),
  337. BeamSubdivisionScale(1.0f),
  338. BeamSubdivisionFrozen(false),
  339. IconNameID( 0 ),
  340. IconTextureUV( 0,0,0,0 ),
  341. IconOffset( 0,0 ),
  342. GrenadeSafetyTime( 0 )
  343. {
  344. #ifdef PARAM_EDITING_ON
  345. int i;
  346. EnumParameterClass *param;
  347. param = new EnumParameterClass( &AmmoType );
  348. param->Set_Name ( "Ammo Type" );
  349. param->Add_Value ( "Normal", AmmoDefinitionClass::AMMO_TYPE_NORMAL );
  350. param->Add_Value ( "Remote C4", AmmoDefinitionClass::AMMO_TYPE_C4_REMOTE );
  351. param->Add_Value ( "Timed C4", AmmoDefinitionClass::AMMO_TYPE_C4_TIMED );
  352. param->Add_Value ( "Proximity C4", AmmoDefinitionClass::AMMO_TYPE_C4_PROXIMITY );
  353. GENERIC_EDITABLE_PARAM(AmmoDefinitionClass,param)
  354. // EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_WEAPONOBJDEFINITIONID, WeaponDefID);
  355. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FILENAME, ModelFilename);
  356. // EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, Warhead);
  357. param = new EnumParameterClass( &Warhead );
  358. param->Set_Name ( "Warhead" );
  359. for ( i = 0; i < ArmorWarheadManager::Get_Num_Warhead_Types(); i++ ) {
  360. param->Add_Value ( ArmorWarheadManager::Get_Warhead_Name( i ), i );
  361. }
  362. GENERIC_EDITABLE_PARAM(AmmoDefinitionClass,param)
  363. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, Damage);
  364. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, Range);
  365. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, EffectiveRange);
  366. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, Velocity);
  367. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, Gravity);
  368. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, Elasticity);
  369. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, RateOfFire);
  370. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_ANGLE, SprayAngle);
  371. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, SprayCount);
  372. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, SprayBulletCost);
  373. // EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FILENAME, TrailEmitter);
  374. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, AquireTime);
  375. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, BurstDelayTime);
  376. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, BurstMax);
  377. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, SoftPierceLimit);
  378. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_ANGLE, TurnRate);
  379. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, TimeActivated);
  380. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, TerrainActivated);
  381. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, IsTracking);
  382. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_EXPLOSIONDEFINITIONID, ExplosionDefID);
  383. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, RandomTrackingScale);
  384. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, DisplayLaser);
  385. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, ChargeTime);
  386. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, ContinuousSoundDefID);
  387. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, FireSoundDefID);
  388. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FILENAME, ContinuousEmitterName );
  389. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_INT, MaxBounces);
  390. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerTime1 );
  391. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerTime2 );
  392. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerTime3 );
  393. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerRange1 );
  394. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerRange2 );
  395. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, C4TriggerRange3 );
  396. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, C4TimingSound1ID );
  397. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, C4TimingSound2ID );
  398. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_SOUNDDEFINITIONID, C4TimingSound3ID );
  399. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, AliasedSpeed );
  400. param = new EnumParameterClass( &HitterType );
  401. param->Set_Name ( "HitterType" );
  402. for ( i = 0; i < SurfaceEffectsManager::Num_Hitter_Types(); i++ ) {
  403. param->Add_Value ( SurfaceEffectsManager::Hitter_Type_Name( i ), i );
  404. }
  405. GENERIC_EDITABLE_PARAM(AmmoDefinitionClass,param)
  406. GenericDefParameterClass *beacon_param = new GenericDefParameterClass (&BeaconDefID);
  407. beacon_param->Set_Class_ID (CLASSID_GAME_OBJECT_DEF_BEACON);
  408. beacon_param->Set_Name ("Beacon Object");
  409. GENERIC_EDITABLE_PARAM (AmmoDefinitionClass, beacon_param);
  410. /*
  411. ** Beam effect parameters
  412. */
  413. PARAM_SEPARATOR( AmmoDefinitionClass, "Instant Bullet Beam Effects");
  414. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, BeamEnabled);
  415. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_VECTOR3, BeamColor);
  416. FLOAT_UNITS_PARAM( AmmoDefinitionClass, BeamTime, 0.01f, 10.0f, "seconds");
  417. FLOAT_UNITS_PARAM( AmmoDefinitionClass, BeamWidth, 0.01f, 10.0f, "meters");
  418. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, BeamEndCaps);
  419. FILENAME_PARAM( AmmoDefinitionClass, BeamTexture, "Texture filename",".tga");
  420. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, BeamSubdivisionEnabled);
  421. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_BOOL, BeamSubdivisionFrozen);
  422. FLOAT_EDITABLE_PARAM( AmmoDefinitionClass, BeamSubdivisionScale, 0.01f,10.0f);
  423. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_STRINGSDB_ID, IconNameID );
  424. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FILENAME, IconTextureName );
  425. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_RECT, IconTextureUV );
  426. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_VECTOR2, IconOffset );
  427. EDITABLE_PARAM( AmmoDefinitionClass, ParameterClass::TYPE_FLOAT, GrenadeSafetyTime );
  428. #endif
  429. }
  430. /*
  431. **
  432. */
  433. enum {
  434. CHUNKID_AMMO_DEF_VARIABLES = 1206091429,
  435. CHUNKID_AMMO_DEF_PARENT,
  436. XXXMICROCHUNKID_AMMO_DEF_WEAPON_DEF_ID = 1,
  437. MICROCHUNKID_AMMO_DEF_MODEL,
  438. MICROCHUNKID_AMMO_DEF_WARHEAD,
  439. MICROCHUNKID_AMMO_DEF_DAMAGE,
  440. MICROCHUNKID_AMMO_DEF_RANGE,
  441. MICROCHUNKID_AMMO_DEF_VELOCITY,
  442. MICROCHUNKID_AMMO_DEF_GRAVITY,
  443. XXXMICROCHUNKID_AMMO_DEF_ELASTICITY,
  444. XXXMICROCHUNKID_AMMO_DEF_CLIP_SIZE,
  445. MICROCHUNKID_AMMO_DEF_SPRAY_ANGLE,
  446. MICROCHUNKID_AMMO_DEF_SPRAY_COUNT,
  447. MICROCHUNKID_AMMO_DEF_TRAIL_EMITTER,
  448. MICROCHUNKID_AMMO_DEF_AQUIRE_TIME,
  449. MICROCHUNKID_AMMO_DEF_BURST_DELAY_TIME,
  450. MICROCHUNKID_AMMO_DEF_BURST_MAX,
  451. XXXXMICROCHUNKID_AMMO_DEF_EXPLOSION,
  452. MICROCHUNKID_AMMO_DEF_SOFT_PIERCE_LIMIT,
  453. MICROCHUNKID_AMMO_DEF_TURN_RATE,
  454. MICROCHUNKID_AMMO_DEF_TIME_ACTIVATED,
  455. MICROCHUNKID_AMMO_DEF_TERRAIN_ACTIVATED,
  456. MICROCHUNKID_AMMO_DEF_IS_TRACKING,
  457. XXXMICROCHUNKID_AMMO_DEF_ACTIVATE_SOUND_RADIUS,
  458. MICROCHUNKID_AMMO_DEF_EFFECTIVE_RANGE,
  459. MICROCHUNKID_AMMO_DEF_EXPLOSION_DEF_ID,
  460. MICROCHUNKID_AMMO_DEF_RANDOM_TRACKING_SCALE,
  461. MICROCHUNKID_AMMO_DEF_DISPLAY_LASER,
  462. MICROCHUNKID_AMMO_DEF_CHARGE_TIME,
  463. MICROCHUNKID_AMMO_DEF_CONTINUOUS_SOUND_DEF_ID,
  464. MICROCHUNKID_AMMO_DEF_CONTINUOUS_EMITTER_NAME,
  465. MICROCHUNKID_AMMO_DEF_MAX_BOUNCES,
  466. MICROCHUNKID_AMMO_DEF_SPRAY_BULLET_COST,
  467. MICROCHUNKID_AMMO_DEF_AMMO_TYPE,
  468. XXXMICROCHUNKID_AMMO_DEF_C4_DETONATE_SOUND_ID,
  469. XXXMICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_ID,
  470. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_1,
  471. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_2,
  472. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_3,
  473. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_1,
  474. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_2,
  475. MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_3,
  476. MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_1_ID,
  477. MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_2_ID,
  478. MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_3_ID,
  479. MICROCHUNKID_AMMO_DEF_ELASTICITY,
  480. MICROCHUNKID_AMMO_DEF_ALIASED_SPEED,
  481. MICROCHUNKID_AMMO_DEF_HITTER_TYPE,
  482. MICROCHUNKID_AMMO_DEF_BEACON_DEFID,
  483. MICROCHUNKID_AMMO_DEF_RATE_OF_FIRE,
  484. MICROCHUNKID_AMMO_DEF_BEAM_ENABLED,
  485. MICROCHUNKID_AMMO_DEF_BEAM_COLOR,
  486. MICROCHUNKID_AMMO_DEF_BEAM_TIME,
  487. MICROCHUNKID_AMMO_DEF_BEAM_WIDTH,
  488. MICROCHUNKID_AMMO_DEF_BEAM_TEXTURE,
  489. MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_ENABLED,
  490. MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_SCALE,
  491. MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_FROZEN,
  492. MICROCHUNKID_AMMO_DEF_BEAM_END_CAPS,
  493. MICROCHUNKID_AMMO_ICON_NAME_ID,
  494. MICROCHUNKID_AMMO_ICON_TEXTURE_NAME,
  495. MICROCHUNKID_AMMO_ICON_TEXTURE_UV,
  496. MICROCHUNKID_AMMO_ICON_OFFSET,
  497. MICROCHUNKID_AMMO_DEF_FIRE_SOUND_DEFID,
  498. MICROCHUNKID_AMMO_GRENADE_SAFETY_TIME,
  499. };
  500. bool AmmoDefinitionClass::Save( ChunkSaveClass & csave )
  501. {
  502. csave.Begin_Chunk( CHUNKID_AMMO_DEF_PARENT );
  503. DefinitionClass::Save( csave );
  504. csave.End_Chunk( );
  505. csave.Begin_Chunk( CHUNKID_AMMO_DEF_VARIABLES );
  506. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_AMMO_DEF_MODEL, ModelFilename );
  507. // WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_WEAPON_DEF_ID, WeaponDefID );
  508. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_WARHEAD, Warhead, int );
  509. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_DAMAGE, Damage, float );
  510. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_RANGE, Range, float );
  511. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_VELOCITY, Velocity, float );
  512. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_GRAVITY, Gravity );
  513. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_ELASTICITY, Elasticity );
  514. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_RATE_OF_FIRE, RateOfFire );
  515. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_SPRAY_ANGLE, SprayAngle );
  516. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_SPRAY_COUNT, SprayCount, int );
  517. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_AMMO_DEF_TRAIL_EMITTER, TrailEmitter );
  518. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_AQUIRE_TIME, AquireTime );
  519. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BURST_DELAY_TIME, BurstDelayTime );
  520. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BURST_MAX, BurstMax, int );
  521. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_SOFT_PIERCE_LIMIT, SoftPierceLimit );
  522. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_TURN_RATE, TurnRate );
  523. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_TIME_ACTIVATED, TimeActivated );
  524. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_TERRAIN_ACTIVATED, TerrainActivated );
  525. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_IS_TRACKING, IsTracking );
  526. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_EFFECTIVE_RANGE, EffectiveRange, float );
  527. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_EXPLOSION_DEF_ID, ExplosionDefID );
  528. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_RANDOM_TRACKING_SCALE, RandomTrackingScale );
  529. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_DISPLAY_LASER, DisplayLaser );
  530. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_CHARGE_TIME, ChargeTime, float );
  531. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_CONTINUOUS_SOUND_DEF_ID, ContinuousSoundDefID );
  532. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_FIRE_SOUND_DEFID, FireSoundDefID );
  533. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_AMMO_DEF_CONTINUOUS_EMITTER_NAME, ContinuousEmitterName );
  534. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_MAX_BOUNCES, MaxBounces );
  535. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_SPRAY_BULLET_COST, SprayBulletCost );
  536. WRITE_SAFE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_AMMO_TYPE, AmmoType, int );
  537. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_1, C4TriggerTime1 );
  538. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_2, C4TriggerTime2 );
  539. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_3, C4TriggerTime3 );
  540. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_1, C4TriggerRange1 );
  541. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_2, C4TriggerRange2 );
  542. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_3, C4TriggerRange3 );
  543. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_1_ID, C4TimingSound1ID );
  544. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_2_ID, C4TimingSound2ID );
  545. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_3_ID, C4TimingSound3ID );
  546. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_ALIASED_SPEED, AliasedSpeed );
  547. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_HITTER_TYPE, HitterType );
  548. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEACON_DEFID, BeaconDefID );
  549. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_ENABLED, BeamEnabled );
  550. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_COLOR, BeamColor );
  551. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_TIME, BeamTime );
  552. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_WIDTH, BeamWidth );
  553. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_AMMO_DEF_BEAM_TEXTURE, BeamTexture );
  554. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_ENABLED, BeamSubdivisionEnabled);
  555. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_SCALE, BeamSubdivisionScale);
  556. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_FROZEN, BeamSubdivisionFrozen);
  557. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_AMMO_DEF_BEAM_END_CAPS, BeamEndCaps);
  558. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_AMMO_ICON_NAME_ID, IconNameID );
  559. WRITE_MICRO_CHUNK_WWSTRING( csave, MICROCHUNKID_AMMO_ICON_TEXTURE_NAME, IconTextureName );
  560. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_AMMO_ICON_TEXTURE_UV, IconTextureUV );
  561. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_AMMO_ICON_OFFSET, IconOffset );
  562. WRITE_MICRO_CHUNK ( csave, MICROCHUNKID_AMMO_GRENADE_SAFETY_TIME, GrenadeSafetyTime );
  563. csave.End_Chunk();
  564. return true;
  565. }
  566. bool AmmoDefinitionClass::Load( ChunkLoadClass &cload )
  567. {
  568. while (cload.Open_Chunk()) {
  569. switch(cload.Cur_Chunk_ID()) {
  570. case CHUNKID_AMMO_DEF_PARENT:
  571. DefinitionClass::Load( cload );
  572. break;
  573. case CHUNKID_AMMO_DEF_VARIABLES:
  574. while (cload.Open_Micro_Chunk()) {
  575. switch(cload.Cur_Micro_Chunk_ID()) {
  576. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_AMMO_DEF_MODEL, ModelFilename );
  577. // READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_WEAPON_DEF_ID, WeaponDefID );
  578. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_WARHEAD, Warhead, int );
  579. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_DAMAGE, Damage, float );
  580. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_RANGE, Range, float );
  581. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_VELOCITY, Velocity, float );
  582. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_GRAVITY, Gravity );
  583. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_ELASTICITY, Elasticity );
  584. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_RATE_OF_FIRE, RateOfFire );
  585. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_SPRAY_ANGLE, SprayAngle );
  586. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_SPRAY_COUNT, SprayCount, int );
  587. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_AMMO_DEF_TRAIL_EMITTER, TrailEmitter );
  588. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_AQUIRE_TIME, AquireTime );
  589. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BURST_DELAY_TIME, BurstDelayTime );
  590. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BURST_MAX, BurstMax, int );
  591. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_SOFT_PIERCE_LIMIT, SoftPierceLimit );
  592. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_TURN_RATE, TurnRate );
  593. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_TIME_ACTIVATED, TimeActivated );
  594. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_TERRAIN_ACTIVATED, TerrainActivated );
  595. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_IS_TRACKING, IsTracking );
  596. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_EFFECTIVE_RANGE, EffectiveRange, float );
  597. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_EXPLOSION_DEF_ID, ExplosionDefID );
  598. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_RANDOM_TRACKING_SCALE, RandomTrackingScale );
  599. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_DISPLAY_LASER, DisplayLaser );
  600. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_CHARGE_TIME, ChargeTime, float );
  601. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_CONTINUOUS_SOUND_DEF_ID, ContinuousSoundDefID );
  602. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_FIRE_SOUND_DEFID, FireSoundDefID );
  603. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_AMMO_DEF_CONTINUOUS_EMITTER_NAME, ContinuousEmitterName );
  604. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_MAX_BOUNCES, MaxBounces );
  605. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_SPRAY_BULLET_COST, SprayBulletCost );
  606. READ_SAFE_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_AMMO_TYPE, AmmoType, int );
  607. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_1, C4TriggerTime1 );
  608. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_2, C4TriggerTime2 );
  609. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_TIME_3, C4TriggerTime3 );
  610. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_1, C4TriggerRange1 );
  611. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_2, C4TriggerRange2 );
  612. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TRIGGER_RANGE_3, C4TriggerRange3 );
  613. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_1_ID, C4TimingSound1ID );
  614. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_2_ID, C4TimingSound2ID );
  615. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_C4_TIMING_SOUND_3_ID, C4TimingSound3ID );
  616. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_ALIASED_SPEED, AliasedSpeed );
  617. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_HITTER_TYPE, HitterType );
  618. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEACON_DEFID, BeaconDefID );
  619. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_ENABLED, BeamEnabled );
  620. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_COLOR, BeamColor );
  621. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_TIME, BeamTime );
  622. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_WIDTH, BeamWidth );
  623. READ_MICRO_CHUNK_WWSTRING( cload, MICROCHUNKID_AMMO_DEF_BEAM_TEXTURE, BeamTexture );
  624. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_ENABLED, BeamSubdivisionEnabled);
  625. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_SCALE, BeamSubdivisionScale);
  626. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_SUBDIVISION_FROZEN, BeamSubdivisionFrozen);
  627. READ_MICRO_CHUNK( cload, MICROCHUNKID_AMMO_DEF_BEAM_END_CAPS, BeamEndCaps);
  628. READ_MICRO_CHUNK ( cload, MICROCHUNKID_AMMO_ICON_NAME_ID, IconNameID );
  629. READ_MICRO_CHUNK_WWSTRING ( cload, MICROCHUNKID_AMMO_ICON_TEXTURE_NAME, IconTextureName );
  630. READ_MICRO_CHUNK ( cload, MICROCHUNKID_AMMO_ICON_TEXTURE_UV, IconTextureUV );
  631. READ_MICRO_CHUNK ( cload, MICROCHUNKID_AMMO_ICON_OFFSET, IconOffset );
  632. READ_MICRO_CHUNK ( cload, MICROCHUNKID_AMMO_GRENADE_SAFETY_TIME, GrenadeSafetyTime );
  633. default:
  634. Debug_Say(( "Unrecognized AmmoDef Variable chunkID\n" ));
  635. break;
  636. }
  637. cload.Close_Micro_Chunk();
  638. }
  639. break;
  640. default:
  641. Debug_Say(( "Unrecognized AmmoDef chunkID\n" ));
  642. break;
  643. }
  644. cload.Close_Chunk();
  645. }
  646. // Init the model name from the model filename
  647. ::Get_Render_Obj_Name_From_Filename( ModelName, ModelFilename );
  648. if ( ModelName.Is_Empty() ) {
  649. ModelName = "NULL";
  650. }
  651. return true;
  652. }
  653. /*
  654. **
  655. */
  656. bool WeaponManager::IsWeaponHelpDisabled = false;
  657. const WeaponDefinitionClass *WeaponManager::Find_Weapon_Definition( const char *name )
  658. {
  659. return (const WeaponDefinitionClass *)DefinitionMgrClass::Find_Typed_Definition( name, CLASSID_DEF_WEAPON );
  660. }
  661. const WeaponDefinitionClass *WeaponManager::Find_Weapon_Definition( int id )
  662. {
  663. return (const WeaponDefinitionClass *)DefinitionMgrClass::Find_Definition( id );
  664. }
  665. const AmmoDefinitionClass *WeaponManager::Find_Ammo_Definition( const char *name )
  666. {
  667. return (const AmmoDefinitionClass *)DefinitionMgrClass::Find_Typed_Definition( name, CLASSID_DEF_AMMO );
  668. }
  669. const AmmoDefinitionClass *WeaponManager::Find_Ammo_Definition( int id )
  670. {
  671. return (const AmmoDefinitionClass *)DefinitionMgrClass::Find_Definition( id );
  672. }