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