plugindevelopersync.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. enum PDS_SYSTEMS
  2. {
  3. STATS = 1,
  4. LEVELS = 2,
  5. MODS = 4,
  6. AGENTS = 8,
  7. STOMACH = 16,
  8. MODS_DETAILED = 32,
  9. TEMPERATURE = 64,
  10. HEALTH = 128,
  11. }
  12. class RegisterPlayerData
  13. {
  14. int m_Bitmask;
  15. int m_DetailedModifierIndex;
  16. void RegisterPlayerData()
  17. {
  18. m_Bitmask = 0;
  19. m_DetailedModifierIndex = 0;
  20. }
  21. }
  22. class PluginDeveloperSync extends PluginBase
  23. {
  24. int m_DetailedInfoRequested = 0;
  25. ref Timer m_UpdateTimer;
  26. ref map<PlayerBase, ref RegisterPlayerData> m_RegisteredPlayers;
  27. ref array<ref SyncedValue> m_PlayerStatsSynced;
  28. ref array<ref Param> m_PlayerStomachSynced;
  29. ref array<ref SyncedValueLevel> m_PlayerLevelsSynced;
  30. ref array<ref SyncedValueModifier> m_PlayerModsSynced;
  31. string m_PlayerModsDetailedSynced;
  32. string m_EnvironmentDebugMessage;
  33. ref array<ref SyncedValueAgent> m_PlayerAgentsSynced;
  34. protected ref array<ref SyncedValue> m_TargetHealthSynced;
  35. protected bool m_IsTargetChanged; // client update
  36. protected ref map<PlayerBase, bool> m_HealthObserverMode; // server tracking of player X health mode selection | true = target / false = self
  37. protected ref map<PlayerBase, EntityAI> m_HealthObserverEntity; // server tracking of player X health target
  38. bool m_StatsUpdateStatus;
  39. bool m_LevelsUpdateStatus;
  40. bool m_ModsUpdateStatus;
  41. bool m_AgentsUpdateStatus;
  42. bool m_StomachUpdateStatus;
  43. void PluginDeveloperSync()
  44. {
  45. m_RegisteredPlayers = new map<PlayerBase, ref RegisterPlayerData>;
  46. m_PlayerStatsSynced = new array<ref SyncedValue>;
  47. m_PlayerLevelsSynced = new array<ref SyncedValueLevel>;
  48. m_PlayerModsSynced = new array<ref SyncedValueModifier>;
  49. m_PlayerAgentsSynced = new array<ref SyncedValueAgent>;
  50. m_PlayerStomachSynced = new array<ref Param>;
  51. m_TargetHealthSynced = new array<ref SyncedValue>;
  52. m_HealthObserverMode = new map<PlayerBase,bool>;
  53. m_HealthObserverEntity = new map<PlayerBase,EntityAI>;
  54. m_StatsUpdateStatus = false;
  55. m_LevelsUpdateStatus = false;
  56. m_ModsUpdateStatus = false;
  57. m_AgentsUpdateStatus = false;
  58. m_StomachUpdateStatus = false;
  59. }
  60. //================================================================
  61. // Init / Update
  62. //================================================================
  63. override void OnInit()
  64. {
  65. super.OnInit();
  66. if ( GetGame().IsServer() )
  67. {
  68. //create timer
  69. m_UpdateTimer = new Timer( CALL_CATEGORY_GAMEPLAY );
  70. }
  71. }
  72. void EnableUpdate( bool enable, int type, PlayerBase player )
  73. {
  74. //set update by type
  75. if ( !IsPlayerRegistered(player))
  76. RegisterPlayer( player );
  77. switch ( type )
  78. {
  79. case ERPCs.DEV_STATS_UPDATE:
  80. {
  81. SetSystemInBitmask(player, PDS_SYSTEMS.STATS, enable);
  82. break;
  83. }
  84. case ERPCs.DEV_LEVELS_UPDATE:
  85. {
  86. SetSystemInBitmask(player, PDS_SYSTEMS.LEVELS, enable);
  87. break;
  88. }
  89. case ERPCs.DEV_MODS_UPDATE:
  90. {
  91. SetSystemInBitmask(player, PDS_SYSTEMS.MODS, enable);
  92. break;
  93. }
  94. case ERPCs.DEV_AGENTS_UPDATE:
  95. {
  96. SetSystemInBitmask(player, PDS_SYSTEMS.AGENTS, enable);
  97. break;
  98. }
  99. case ERPCs.DEV_STOMACH_UPDATE:
  100. {
  101. SetSystemInBitmask(player, PDS_SYSTEMS.STOMACH, enable);
  102. break;
  103. }
  104. case ERPCs.DEV_TEMP_UPDATE:
  105. {
  106. SetSystemInBitmask(player, PDS_SYSTEMS.TEMPERATURE, enable);
  107. break;
  108. }
  109. case ERPCs.DEV_HEALTH_UPDATE:
  110. {
  111. SetSystemInBitmask(player, PDS_SYSTEMS.HEALTH, enable);
  112. break;
  113. }
  114. }
  115. //remove players with empty mask
  116. for (int i = 0; i < m_RegisteredPlayers.Count(); i++)
  117. {
  118. if (m_RegisteredPlayers.GetElement(i).m_Bitmask == 0)
  119. {
  120. m_RegisteredPlayers.RemoveElement(i);
  121. i = 0;
  122. }
  123. }
  124. //start/stop the tick based on existence/absence of players registered
  125. if ( m_UpdateTimer )
  126. {
  127. if ( m_RegisteredPlayers.Count() == 0)
  128. {
  129. m_UpdateTimer.Stop();
  130. }
  131. else if (!m_UpdateTimer.IsRunning())
  132. {
  133. m_UpdateTimer.Run( 1, this, "Update", NULL, true );
  134. }
  135. }
  136. }
  137. void Update()
  138. {
  139. if ( !GetDayZGame().IsMultiplayer() || GetDayZGame().IsServer() )
  140. {
  141. for ( int i = 0; i < m_RegisteredPlayers.Count(); ++i )
  142. {
  143. PlayerBase player = m_RegisteredPlayers.GetKey( i );
  144. if ( !player || !player.IsAlive() )
  145. {
  146. m_RegisteredPlayers.RemoveElement(i);
  147. i--;
  148. }
  149. else
  150. {
  151. int bit_mask = m_RegisteredPlayers.Get( player ).m_Bitmask;
  152. if ((PDS_SYSTEMS.MODS & bit_mask) != 0 )
  153. {
  154. SendRPCMods( player);
  155. if ( PDS_SYSTEMS.MODS_DETAILED & bit_mask )
  156. SendRPCModsDetail( player); //!!!!! Highly suspect
  157. }
  158. if ((PDS_SYSTEMS.LEVELS & bit_mask) != 0 )
  159. {
  160. SendRPCLevels( player );
  161. }
  162. if ((PDS_SYSTEMS.STATS & bit_mask) != 0 )
  163. {
  164. SendRPCStats( player );
  165. }
  166. if ((PDS_SYSTEMS.STOMACH & bit_mask) != 0 )
  167. {
  168. SendRPCStomach( player );
  169. }
  170. if ((PDS_SYSTEMS.AGENTS & bit_mask) != 0 )
  171. {
  172. SendRPCAgents( player );
  173. }
  174. if ((PDS_SYSTEMS.TEMPERATURE & bit_mask) )
  175. {
  176. SendRPCTemp( player );
  177. }
  178. if ((PDS_SYSTEMS.HEALTH & bit_mask) )
  179. {
  180. SendRPCHealth( player );
  181. }
  182. }
  183. }
  184. }
  185. }
  186. //turns on/off a bit for a given system marking it active/inactive
  187. void SetSystemInBitmask( PlayerBase player, int system_bit, bool state)
  188. {
  189. if ( IsPlayerRegistered(player) )
  190. {
  191. int current_mask = m_RegisteredPlayers.Get(player).m_Bitmask;
  192. if (state)
  193. m_RegisteredPlayers.Get(player).m_Bitmask = current_mask | system_bit;
  194. else
  195. m_RegisteredPlayers.Get(player).m_Bitmask = current_mask & ~system_bit;
  196. }
  197. }
  198. //turns on/off a bit for a given system marking it active/inactive
  199. bool IsSetSystemInBitmask( PlayerBase player, int system_bit)
  200. {
  201. if ( IsPlayerRegistered(player) )
  202. {
  203. return (m_RegisteredPlayers.Get(player).m_Bitmask & system_bit);
  204. }
  205. return false;
  206. }
  207. //--- Register / Unregister player
  208. void RegisterPlayer( PlayerBase player )
  209. {
  210. if ( !IsPlayerRegistered( player ) )
  211. {
  212. m_RegisteredPlayers.Insert( player, new RegisterPlayerData );
  213. }
  214. }
  215. /*
  216. void UnregisterPlayer( PlayerBase player )
  217. {
  218. if ( IsPlayerRegistered( player ) )
  219. {
  220. m_RegisteredPlayers.Remove( player );
  221. }
  222. }
  223. */
  224. bool IsPlayerRegistered( PlayerBase player )
  225. {
  226. if ( m_RegisteredPlayers.Contains( player ))
  227. {
  228. return true;
  229. }
  230. return false;
  231. }
  232. //================================================================
  233. // RPC
  234. //================================================================
  235. void OnRPC( PlayerBase player, int rpc_type, ParamsReadContext ctx )
  236. {
  237. if ( !GetGame().IsDebug() )
  238. {
  239. return;
  240. }
  241. switch ( rpc_type )
  242. {
  243. case ERPCs.DEV_STATS_UPDATE:
  244. {
  245. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_STATS_UPDATE, player ); break;
  246. }
  247. case ERPCs.DEV_LEVELS_UPDATE:
  248. {
  249. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_LEVELS_UPDATE, player ); break;
  250. }
  251. case ERPCs.DEV_MODS_UPDATE:
  252. {
  253. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_MODS_UPDATE, player ); break;
  254. }
  255. case ERPCs.DEV_AGENTS_UPDATE:
  256. {
  257. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_AGENTS_UPDATE, player ); break;
  258. }
  259. case ERPCs.DEV_STOMACH_UPDATE:
  260. {
  261. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_STOMACH_UPDATE, player ); break;
  262. }
  263. case ERPCs.DEV_HEALTH_UPDATE:
  264. {
  265. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_HEALTH_UPDATE, player ); break;
  266. }
  267. case ERPCs.DEV_RPC_STATS_DATA:
  268. {
  269. OnRPCStats( ctx ); break;
  270. }
  271. case ERPCs.DEV_RPC_LEVELS_DATA:
  272. {
  273. OnRPCLevels( ctx ); break;
  274. }
  275. case ERPCs.DEV_RPC_MODS_DATA:
  276. {
  277. OnRPCMods( ctx ); break;
  278. }
  279. case ERPCs.DEV_RPC_MODS_DATA_DETAILED:
  280. {
  281. OnRPCModsDetailed( ctx ); break;
  282. }
  283. case ERPCs.DEV_RPC_AGENTS_DATA:
  284. {
  285. OnRPCAgents( ctx ); break;
  286. }
  287. case ERPCs.DEV_RPC_STOMACH_DATA:
  288. {
  289. OnRPCStomach( ctx ); break;
  290. }
  291. case ERPCs.DEV_RPC_MODS_ACTIVATE:
  292. {
  293. ActivateModifier( GetRPCModifierID( ctx ), player ); break;
  294. }
  295. case ERPCs.DEV_RPC_MODS_DETAILED:
  296. {
  297. RequestDetailedInfo( GetRPCModifierID( ctx ), player ); break;
  298. }
  299. case ERPCs.DEV_RPC_MODS_DEACTIVATE:
  300. {
  301. DeactivateModifier( GetRPCModifierID( ctx ), player ); break;
  302. }
  303. case ERPCs.DEV_RPC_MODS_LOCK:
  304. {
  305. int id;
  306. bool lock;
  307. GetRPCModifierLock( ctx, id, lock );
  308. LockModifier( id, lock, player ); break;
  309. }
  310. case ERPCs.DEV_RPC_MODS_RESET:
  311. {
  312. player.GetModifiersManager().DeactivateAllModifiers();
  313. break;
  314. }
  315. case ERPCs.DEV_RPC_STATS_RESET:
  316. {
  317. player.GetPlayerStats().ResetAllStats();
  318. break;
  319. }
  320. case ERPCs.DEV_RPC_STAT_SET:
  321. {
  322. OnRPCStatSet(ctx, player);
  323. break;
  324. }
  325. case ERPCs.DEV_TEMP_UPDATE:
  326. {
  327. OnRPCTemp(ctx, player);
  328. break;
  329. }
  330. case ERPCs.DEV_RPC_HEALTH_DATA:
  331. {
  332. OnRPCHealth(ctx, player); break;
  333. }
  334. case ERPCs.DEV_RPC_HEALTH_SET:
  335. {
  336. OnRPCHealthSet(ctx, player);
  337. break;
  338. }
  339. }
  340. }
  341. //get update status from ctx data
  342. bool GetRPCUpdateState( ParamsReadContext ctx )
  343. {
  344. Param1<bool> p = new Param1<bool>( 0 );
  345. if ( ctx.Read( p ) )
  346. {
  347. return p.param1;
  348. }
  349. return false;
  350. }
  351. //get modifier id from ctx data
  352. int GetRPCModifierID( ParamsReadContext ctx )
  353. {
  354. Param1<int> p = new Param1<int>( 0 );
  355. if ( ctx.Read( p ) )
  356. {
  357. return p.param1;
  358. }
  359. return 0;
  360. }
  361. //get modifier lock state from lock ctx data
  362. void GetRPCModifierLock( ParamsReadContext ctx, out int id, out bool lock )
  363. {
  364. Param2<int, bool> p = new Param2<int, bool>( 0, false );
  365. if ( ctx.Read( p ) )
  366. {
  367. id = p.param1;
  368. lock = p.param2;
  369. }
  370. }
  371. //============================================
  372. // STATS
  373. //============================================
  374. //send player stats through RPC
  375. void SendRPCStats( PlayerBase player )
  376. {
  377. //write and send values
  378. if ( player )
  379. {
  380. array<ref Param> rpc_params = new array<ref Param>;
  381. //param count
  382. for ( int i = 0; i < player.m_PlayerStats.GetPCO().Get().Count(); i++ )
  383. {
  384. string label = player.m_PlayerStats.GetPCO().Get().Get( i ).GetLabel();
  385. float value = (float) player.m_PlayerStats.GetPCO().Get().Get( i ).Get();
  386. float value_norm = (float) player.m_PlayerStats.GetPCO().Get().Get( i ).GetNormalized();
  387. rpc_params.Insert( new Param3<string, float, float>( label, value, value_norm ) );
  388. }
  389. rpc_params.Insert(new Param3<string, float, float>( "(NaS)Immunity", player.GetImmunity(),0 ));
  390. rpc_params.Insert(new Param3<string, float, float>( "(NaS)BrokenLegs", player.m_BrokenLegState,0 ));
  391. rpc_params.InsertAt( new Param1<int>(rpc_params.Count() ), 0);// param count
  392. //send params
  393. GetDayZGame().RPC( player, ERPCs.DEV_RPC_STATS_DATA, rpc_params, true, player.GetIdentity() );
  394. }
  395. }
  396. //Display player stats
  397. void OnRPCStats( ParamsReadContext ctx )
  398. {
  399. //clear values
  400. m_PlayerStatsSynced.Clear();
  401. Param1<int> p_count = new Param1<int>(0);
  402. Param3<string, float, float> p = new Param3<string, float, float>( "", 0, 0 );
  403. //get param count
  404. int param_count = 0;
  405. if ( ctx.Read(p_count) )
  406. {
  407. param_count = p_count.param1;
  408. }
  409. //read values and set
  410. for ( int i = 0; i < param_count; i++ )
  411. {
  412. ctx.Read(p);
  413. m_PlayerStatsSynced.Insert( new SyncedValue( p.param1, p.param2, false, p.param3 ) );
  414. }
  415. }
  416. //Update data on local
  417. void UpdateStatsLocal()
  418. {
  419. PlayerBase player = PlayerBase.Cast( GetDayZGame().GetPlayer() );
  420. //clear values
  421. m_PlayerStatsSynced.Clear();
  422. //set values
  423. for ( int i = 0; i < player.m_PlayerStats.GetPCO().Get().Count(); i++ )
  424. {
  425. string label = player.m_PlayerStats.GetPCO().Get().Get( i ).GetLabel();
  426. float value = player.m_PlayerStats.GetPCO().Get().Get( i ).Get();
  427. float value_norm = player.m_PlayerStats.GetPCO().Get().Get( i ).GetNormalized();
  428. m_PlayerStatsSynced.Insert( new SyncedValue( label, value, false, value_norm ) );
  429. }
  430. m_PlayerStatsSynced.Insert(new SyncedValue( "(NaS)Immunity", player.GetImmunity() , false, 0));
  431. m_PlayerStatsSynced.Insert(new SyncedValue( "(NaS) BrokenLegs", player.m_BrokenLegState, false, 0));
  432. }
  433. void OnRPCStatSet( ParamsReadContext ctx , PlayerBase player)
  434. {
  435. Param2<string, float> p = new Param2<string, float>( "", 0 );
  436. if ( ctx.Read(p) )
  437. {
  438. for ( int i = 0; i < player.m_PlayerStats.GetPCO().Get().Count(); i++ )
  439. {
  440. string label = player.m_PlayerStats.GetPCO().Get().Get( i ).GetLabel();
  441. if ( label == p.param1 )
  442. {
  443. player.m_PlayerStats.GetPCO().Get().Get( i).SetByFloatEx(p.param2);
  444. }
  445. }
  446. }
  447. }
  448. //============================================
  449. // HEALTH
  450. //============================================
  451. ref array<ref SyncedValue> GetHealthZonesSynched()
  452. {
  453. return m_TargetHealthSynced;
  454. }
  455. bool GetIsTargetChanged()
  456. {
  457. return m_IsTargetChanged;
  458. }
  459. void SetTargetChanged(bool state)
  460. {
  461. m_IsTargetChanged = state;
  462. }
  463. void SendRPCHealth(PlayerBase player)
  464. {
  465. //write and send values
  466. if ( player )
  467. {
  468. array<ref Param> rpc_params = new array<ref Param>;
  469. EntityAI target;
  470. if (m_HealthObserverMode.Get(player) == false)
  471. target = player;
  472. else
  473. {
  474. PluginItemDiagnostic itemDiagPlugin = PluginItemDiagnostic.Cast(GetPlugin(PluginItemDiagnostic));
  475. target = EntityAI.Cast(itemDiagPlugin.GetWatchedItem(player));
  476. }
  477. if (target)
  478. {
  479. DamageZoneMap dmgZones = target.GetEntityDamageZoneMap();
  480. SetupZoneValues(rpc_params, dmgZones, target, "Health", 0);
  481. SetupZoneValues(rpc_params, dmgZones, target, "Shock", 1);
  482. SetupZoneValues(rpc_params, dmgZones, target, "Blood", 2);
  483. }
  484. bool targetChanged = false;
  485. if (target != m_HealthObserverEntity.Get(player))
  486. {
  487. targetChanged = true;
  488. m_HealthObserverEntity.Set(player, target);
  489. }
  490. rpc_params.InsertAt( new Param2<int, bool>(rpc_params.Count(), targetChanged), 0);
  491. GetDayZGame().RPC( player, ERPCs.DEV_RPC_HEALTH_DATA, rpc_params, true, player.GetIdentity() );
  492. }
  493. }
  494. void OnRPCHealth(ParamsReadContext ctx , PlayerBase player)
  495. {
  496. m_TargetHealthSynced.Clear();
  497. Param2<int, bool> paramsHeader = new Param2<int, bool>(0, false);
  498. Param4<string, float, float, bool> p = new Param4<string, float, float, bool>("", 0, 0, false);
  499. int paramCount = 0;
  500. if ( ctx.Read(paramsHeader) )
  501. {
  502. paramCount = paramsHeader.param1;
  503. SetTargetChanged(paramsHeader.param2);
  504. }
  505. for ( int i = 0; i < paramCount; i++ )
  506. {
  507. ctx.Read(p);
  508. m_TargetHealthSynced.Insert( new SyncedValue( p.param1, p.param2, p.param4, p.param3 ) );
  509. }
  510. }
  511. void SetupZoneValues(inout array<ref Param> rpc_params, DamageZoneMap dmgZones, EntityAI target, string healthType, int typeID)
  512. {
  513. array<string> outHealthTypes = new array<string>;
  514. //title entry
  515. bool isTitleEntry = true;
  516. rpc_params.Insert( new Param4<string, float, float, bool>( "", 0, typeID, isTitleEntry ) );
  517. // global entry
  518. isTitleEntry = false;
  519. float value;
  520. target.GetAdditionalHealthTypes("", outHealthTypes);
  521. if (healthType == "Health" || outHealthTypes.Find(healthType) != -1) // zone might not have additional health type
  522. {
  523. value = target.GetHealth("", healthType);
  524. rpc_params.Insert( new Param4<string, float, float, bool>( "Global", value, typeID, isTitleEntry ) );
  525. }
  526. //entries
  527. int count = dmgZones.Count();
  528. for (int i = 0; i < count; i++)
  529. {
  530. string zoneName = dmgZones.GetKey(i);
  531. outHealthTypes.Clear();
  532. target.GetAdditionalHealthTypes(zoneName, outHealthTypes);
  533. if (healthType != "Health")
  534. {
  535. if (outHealthTypes.Find(healthType) == -1)
  536. continue;
  537. }
  538. if (target.GetMaxHealth(zoneName, healthType) == 0)
  539. continue;
  540. isTitleEntry = false;
  541. value = target.GetHealth(zoneName, healthType);
  542. rpc_params.Insert( new Param4<string, float, float, bool>( zoneName, value, typeID, isTitleEntry ) );
  543. }
  544. }
  545. // Used for client requesting health change or targeting mode (self/target) change
  546. void OnRPCHealthSet( ParamsReadContext ctx , PlayerBase player)
  547. {
  548. Param3<int, string, string> p = new Param3<int, string, string>( 0, "", "" );
  549. if ( !ctx.Read(p) )
  550. return;
  551. int buttonID = p.param1;
  552. string zoneName = p.param2;
  553. string healthType = p.param3;
  554. if (buttonID > 3) // target change only
  555. {
  556. if (buttonID == 4) // ButtonTarget
  557. m_HealthObserverMode.Set(player, true);
  558. else if (buttonID == 5) // ButtonSelf
  559. m_HealthObserverMode.Set(player, false);
  560. return;
  561. }
  562. EntityAI target;
  563. if (m_HealthObserverMode.Get(player) == false)
  564. target = player;
  565. else
  566. {
  567. PluginItemDiagnostic itemDiagPlugin = PluginItemDiagnostic.Cast(GetPlugin(PluginItemDiagnostic));
  568. target = EntityAI.Cast(itemDiagPlugin.GetWatchedItem(player));
  569. }
  570. if (zoneName == "Global")
  571. zoneName = "";
  572. float zoneMax = target.GetMaxHealth(zoneName, healthType);
  573. float zoneCurrentHealth = target.GetHealth(zoneName, healthType);
  574. float targetHealth;
  575. if (buttonID == 0) // ButtonMin
  576. targetHealth = 0;
  577. else if (buttonID == 1) // ButtonMax
  578. targetHealth = zoneMax;
  579. else if (buttonID == 2) // ButtonAdd
  580. targetHealth = zoneCurrentHealth + zoneMax * 0.1;
  581. else if (buttonID == 3) // ButtonSubtract
  582. targetHealth = zoneCurrentHealth - zoneMax * 0.1;
  583. target.SetHealth(zoneName, healthType, targetHealth);
  584. }
  585. //============================================
  586. // LEVELS
  587. //============================================
  588. //send player stats through RPC
  589. void SendRPCLevels( PlayerBase player )
  590. {
  591. //write and send values
  592. if ( player )
  593. {
  594. array<ref Param> rpc_params = new array<ref Param>;
  595. rpc_params.Insert(new Param3<string, float, float>( "Immunity: "+ typename.EnumToString(EStatLevels, player.GetImmunityLevel() ),player.GetImmunityLevel(), player.GetBordersImmunity()));
  596. rpc_params.Insert(new Param3<string, float, float>( "Blood: "+ typename.EnumToString(EStatLevels, player.GetStatLevelBlood()),player.GetStatLevelBlood(), player.GetStatBordersBlood()));
  597. rpc_params.Insert(new Param3<string, float, float>( "Health: "+ typename.EnumToString(EStatLevels, player.GetStatLevelHealth() ),player.GetStatLevelHealth(), player.GetStatBordersHealth()));
  598. rpc_params.Insert(new Param3<string, float, float>( "Energy: "+ typename.EnumToString(EStatLevels, player.GetStatLevelEnergy() ),player.GetStatLevelEnergy(), player.GetStatBordersEnergy()));
  599. rpc_params.Insert(new Param3<string, float, float>( "Water: "+ typename.EnumToString(EStatLevels, player.GetStatLevelWater() ),player.GetStatLevelWater(), player.GetStatBordersWater()));
  600. int param_count = rpc_params.Count();
  601. rpc_params.InsertAt( new Param3<string, float, float>( "PARAM_COUNT", param_count,0 ), 0);
  602. //send params
  603. GetDayZGame().RPC( player, ERPCs.DEV_RPC_LEVELS_DATA, rpc_params, true, player.GetIdentity() );
  604. }
  605. }
  606. //Display player stats
  607. void OnRPCLevels( ParamsReadContext ctx )
  608. {
  609. //clear values
  610. m_PlayerLevelsSynced.Clear();
  611. Param3<string, float, float> p3 = new Param3<string, float, float>( "", 0,0 );
  612. //get param count
  613. int param_count = 0;
  614. if ( ctx.Read(p3) )
  615. {
  616. param_count = p3.param2;
  617. }
  618. //read values and set
  619. for ( int i = 0; i < param_count; i++ )
  620. {
  621. if ( ctx.Read(p3) )
  622. m_PlayerLevelsSynced.Insert( new SyncedValueLevel( p3.param1, p3.param2, p3.param3 ) );
  623. }
  624. }
  625. void SendRPCMods( PlayerBase player )
  626. {
  627. //write and send values
  628. if ( player )
  629. {
  630. array<ref Param> rpc_params = new array<ref Param>;
  631. //get modifiers
  632. ModifiersManager mods_manager = player.GetModifiersManager();
  633. //param count
  634. array<ref ModifierDebugObj> modifiers = new array<ref ModifierDebugObj>;
  635. mods_manager.DbgGetModifiers( modifiers );
  636. float param_count = ( float ) modifiers.Count();
  637. rpc_params.Insert( new Param1<int>( param_count ));
  638. //set modifiers
  639. for ( int i = 0; i < modifiers.Count(); ++i )
  640. {
  641. int id = modifiers.Get(i).GetID();
  642. string name = modifiers.Get(i).GetName();
  643. bool active = modifiers.Get(i).IsActive();
  644. bool locked = modifiers.Get(i).IsLocked();
  645. rpc_params.Insert( new Param4<int, string, bool, bool>( id, name, active, locked ) );
  646. }
  647. //send params
  648. GetDayZGame().RPC( player, ERPCs.DEV_RPC_MODS_DATA, rpc_params, true, player.GetIdentity() );
  649. }
  650. }
  651. //============================================
  652. // MODS
  653. //============================================
  654. //send player mods through RPC
  655. void SendRPCModsDetail( PlayerBase player )
  656. {
  657. //write and send values
  658. if ( player )
  659. {
  660. Param1<string> p1 = new Param1<string>("");
  661. ModifiersManager mods_manager = player.GetModifiersManager();
  662. int mod_id = m_RegisteredPlayers.Get(player).m_DetailedModifierIndex;
  663. p1.param1 = mods_manager.GetModifier(mod_id).GetDebugText();
  664. //send params
  665. if (p1.param1 != "")
  666. GetDayZGame().RPCSingleParam( player, ERPCs.DEV_RPC_MODS_DATA_DETAILED, p1, true, player.GetIdentity() );
  667. }
  668. }
  669. //Display player modifiers
  670. void OnRPCMods( ParamsReadContext ctx )
  671. {
  672. //clear values
  673. m_PlayerModsSynced.Clear();
  674. //ref Param3<string, float, bool> p = new Param3<string, float, bool>( "", 0, false );
  675. Param1<int> p1 = new Param1<int>(0);
  676. Param4<int, string, bool, bool> p4 = new Param4<int, string, bool, bool>( 0,"", false, false );
  677. //get param count
  678. int param_count = 0;
  679. if ( ctx.Read(p1) )
  680. {
  681. param_count = (int) p1.param1;
  682. }
  683. //read values and set
  684. for ( int i = 0; i < param_count; i++ )
  685. {
  686. if (ctx.Read(p4))
  687. {
  688. m_PlayerModsSynced.Insert( new SyncedValueModifier( p4.param1, p4.param2, p4.param3, p4.param4 ) );
  689. }
  690. }
  691. }
  692. void OnRPCModsDetailed( ParamsReadContext ctx )
  693. {
  694. Param1<string> p1 = new Param1<string>("");
  695. //get param count
  696. if ( ctx.Read(p1) )
  697. {
  698. m_PlayerModsDetailedSynced = p1.param1;
  699. }
  700. }
  701. /*
  702. //Activates modifier with given ID
  703. void RequestDetailedInfo( int id, PlayerBase player = NULL )
  704. {
  705. int modifier_id = Math.AbsInt( id );
  706. if(id == m_DetailedInfoRequested)
  707. {
  708. m_DetailedInfoRequested = 0;//repeated request --> disable
  709. }
  710. else
  711. {
  712. m_DetailedInfoRequested = modifier_id;
  713. }
  714. }
  715. */
  716. //Activates modifier with given ID
  717. void RequestDetailedInfo( int id, notnull PlayerBase player)
  718. {
  719. int modifier_id = Math.AbsInt( id );
  720. m_RegisteredPlayers.Get(player).m_DetailedModifierIndex = modifier_id;
  721. if (IsSetSystemInBitmask(player, PDS_SYSTEMS.MODS_DETAILED ))
  722. {
  723. SetSystemInBitmask(player, PDS_SYSTEMS.MODS_DETAILED, false);
  724. }
  725. else
  726. {
  727. SetSystemInBitmask(player, PDS_SYSTEMS.MODS_DETAILED, true);
  728. }
  729. }
  730. //Activates modifier with given ID
  731. void ActivateModifier( int id, PlayerBase player = NULL )
  732. {
  733. if ( !player )
  734. {
  735. player = PlayerBase.Cast( GetDayZGame().GetPlayer() );
  736. }
  737. ModifiersManager mods_manager = player.GetModifiersManager();
  738. mods_manager.ActivateModifier( Math.AbsInt( id ) );
  739. }
  740. //Activates modifier with given ID
  741. void DeactivateModifier( int id, PlayerBase player = NULL )
  742. {
  743. if ( !player )
  744. {
  745. player = PlayerBase.Cast( GetDayZGame().GetPlayer() );
  746. }
  747. ModifiersManager mods_manager = player.GetModifiersManager();
  748. mods_manager.DeactivateModifier( Math.AbsInt( id ) );
  749. }
  750. //Activates modifier with given ID
  751. void LockModifier( int id, bool lock, PlayerBase player = NULL )
  752. {
  753. if ( !player )
  754. {
  755. player = PlayerBase.Cast( GetDayZGame().GetPlayer() );
  756. }
  757. ModifiersManager mods_manager = player.GetModifiersManager();
  758. mods_manager.SetModifierLock( Math.AbsInt( id ), lock );
  759. }
  760. bool IsModifierLocked( int id, PlayerBase player = NULL )
  761. {
  762. if ( !player )
  763. {
  764. player = PlayerBase.Cast( GetDayZGame().GetPlayer() );
  765. }
  766. ModifiersManager mods_manager = player.GetModifiersManager();
  767. return mods_manager.GetModifierLock( Math.AbsInt( id ) );
  768. }
  769. //============================================
  770. // TEMPERATURE
  771. //============================================
  772. void SendRPCTemp( PlayerBase player )
  773. {
  774. if ( player )
  775. {
  776. CachedObjectsParams.PARAM1_STRING.param1 = player.m_Environment.GetDebugMessage();
  777. GetDayZGame().RPCSingleParam( player, ERPCs.DEV_TEMP_UPDATE, CachedObjectsParams.PARAM1_STRING, true, player.GetIdentity() );
  778. }
  779. }
  780. void OnRPCTemp( ParamsReadContext ctx , PlayerBase player)
  781. {
  782. if (GetGame().IsServer() && GetGame().IsMultiplayer())
  783. {
  784. EnableUpdate( GetRPCUpdateState( ctx ), ERPCs.DEV_TEMP_UPDATE, player );
  785. }
  786. else if (!GetGame().IsMultiplayer() || GetGame().IsClient())
  787. {
  788. if ( ctx.Read(CachedObjectsParams.PARAM1_STRING) )
  789. {
  790. m_EnvironmentDebugMessage = CachedObjectsParams.PARAM1_STRING.param1;
  791. }
  792. }
  793. }
  794. //============================================
  795. // AGENTS
  796. //============================================
  797. //send player mods through RPC
  798. void SendRPCAgents( PlayerBase player )
  799. {
  800. //write and send values
  801. if ( ( player && player.GetIdentity() && player.m_AgentPool != null ) || ( player && !GetGame().IsMultiplayer() && player.m_AgentPool != null ) )
  802. {
  803. //get agent pool data
  804. array<ref Param> agent_pool = new array<ref Param>;
  805. player.m_AgentPool.GetDebugObject( agent_pool );
  806. GetDayZGame().RPC( player, ERPCs.DEV_RPC_AGENTS_DATA, agent_pool, true, player.GetIdentity() );
  807. }
  808. }
  809. //Display player modifiers
  810. void OnRPCAgents(ParamsReadContext ctx)
  811. {
  812. //clear values
  813. m_PlayerAgentsSynced.Clear();
  814. Param4<string, string, int, float> p4 = new Param4<string, string, int, float>("", "" , 0, 0.0);
  815. Param1<int> p1 = new Param1<int>(0);
  816. //get param count
  817. int paramCount = 0;
  818. if (ctx.Read(p1))
  819. paramCount = p1.param1;
  820. //read values and set
  821. for (int i = 0; i < paramCount; i++)
  822. {
  823. ctx.Read(p4);
  824. m_PlayerAgentsSynced.Insert(new SyncedValueAgent(p4.param1, p4.param2, p4.param3, p4.param4));
  825. }
  826. }
  827. //============================================
  828. // STOMACH
  829. //============================================
  830. void SendRPCStomach( PlayerBase player )
  831. {
  832. //write and send values
  833. if ( player )
  834. {
  835. array<ref Param> stomach = new array<ref Param>;
  836. int count = player.m_PlayerStomach.GetDebugObject( stomach );
  837. stomach.InsertAt(new Param1<int>(count), 0);
  838. GetDayZGame().RPC( player, ERPCs.DEV_RPC_STOMACH_DATA, stomach, true, player.GetIdentity() );
  839. }
  840. }
  841. void OnRPCStomach( ParamsReadContext ctx )
  842. {
  843. //clear values
  844. m_PlayerStomachSynced.Clear();
  845. Param1<int> p1 = new Param1<int>(0);
  846. int param_count = 0;
  847. if ( ctx.Read(p1) )
  848. {
  849. param_count = p1.param1;
  850. }
  851. if (param_count)
  852. {
  853. //invidividual stomach items
  854. for ( int i = 0; i < param_count; i++ )
  855. {
  856. Param5<int,int,int,float,float> p5 = new Param5<int,int,int,float,float>(0,0,0,0,0);
  857. ctx.Read(p5);
  858. m_PlayerStomachSynced.Insert(p5);
  859. }
  860. //volume
  861. Param1<float> p1b = new Param1<float>(0);
  862. ctx.Read(p1b);
  863. m_PlayerStomachSynced.Insert(p1b);
  864. //temperature
  865. Param1<float> paramTemp = new Param1<float>(0);
  866. ctx.Read(paramTemp);
  867. m_PlayerStomachSynced.Insert(paramTemp);
  868. }
  869. }
  870. //================================================================
  871. // FOCUS
  872. //================================================================
  873. void CaptureFocus()
  874. {
  875. GetGame().GetInput().ChangeGameFocus( 1 );
  876. GetGame().GetUIManager().ShowUICursor( true );
  877. }
  878. void ReleaseFocus()
  879. {
  880. GetGame().GetInput().ChangeGameFocus( -1 );
  881. GetGame().GetUIManager().ShowUICursor( false );
  882. }
  883. void ToggleFocus()
  884. {
  885. if ( GetGame().GetInput().HasGameFocus() )
  886. {
  887. GetGame().GetInput().ChangeGameFocus( 1 );
  888. GetGame().GetUIManager().ShowUICursor( true );
  889. }
  890. else
  891. {
  892. GetGame().GetInput().ResetGameFocus();
  893. GetGame().GetUIManager().ShowUICursor( false );
  894. }
  895. }
  896. }