DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
BaseBuildingBase.c
См. документацию.
1//BASE BUILDING BASE
3{
4 const string ANIMATION_DEPLOYED = "Deployed";
5
6 float m_ConstructionKitHealth; //stored health value for used construction kit
7
9
11 //variables for synchronization of base building parts (2x31 is the current limit)
12 int m_SyncParts01; //synchronization for already built parts (31 parts)
13 int m_SyncParts02; //synchronization for already built parts (+31 parts)
14 int m_SyncParts03; //synchronization for already built parts (+31 parts)
15 int m_InteractedPartId; //construction part id that an action was performed on
16 int m_PerformedActionId; //action id that was performed on a construction part
17
18 //Sounds
19 //build
20 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
21 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
22 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
23 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
24 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
25 //dismantle
26 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
27 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
28 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
29 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
30 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
31
33
37
38 // Constructor
40 {
42
43 //synchronized variables
44 RegisterNetSyncVariableInt( "m_SyncParts01" );
45 RegisterNetSyncVariableInt( "m_SyncParts02" );
46 RegisterNetSyncVariableInt( "m_SyncParts03" );
47 RegisterNetSyncVariableInt( "m_InteractedPartId" );
48 RegisterNetSyncVariableInt( "m_PerformedActionId" );
49 RegisterNetSyncVariableBool( "m_HasBase" );
50
51 //Construction init
53
54 if (ConfigIsExisting("hybridAttachments"))
55 {
57 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
58 }
59 if (ConfigIsExisting("mountables"))
60 {
62 ConfigGetTextArray("mountables", m_Mountables);
63 }
64
65 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
66 }
67
68 override void EEDelete(EntityAI parent)
69 {
70 super.EEDelete(parent);
71
72 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
73 {
74 areaDamage.Destroy();
75 }
76
77 }
78
80 {
81 return "disableBaseDamage";
82 }
83
84 override bool CanObstruct()
85 {
86 return true;
87 }
88
89 override int GetHideIconMask()
90 {
91 return EInventoryIconVisibility.HIDE_VICINITY;
92 }
93
94 // --- SYNCHRONIZATION
96 {
97 if ( GetGame().IsServer() )
98 {
99 SetSynchDirty();
100 }
101 }
102
104 {
105 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
106 super.OnVariablesSynchronized();
107
109 }
110
111 protected void OnSynchronizedClient()
112 {
113 //update parts
115
116 //update action on part
118
119 //update visuals (client)
121 }
122
123 //parts synchronization
124 void RegisterPartForSync( int part_id )
125 {
126 //part_id must starts from index = 1
127 int offset;
128 int mask;
129
130 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
131 {
132 offset = part_id - 1;
133 mask = 1 << offset;
134
136 }
137 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
138 {
139 offset = ( part_id % 32 );
140 mask = 1 << offset;
141
143 }
144 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
145 {
146 offset = ( part_id % 63 );
147 mask = 1 << offset;
148
150 }
151 }
152
153 void UnregisterPartForSync( int part_id )
154 {
155 //part_id must starts from index = 1
156 int offset;
157 int mask;
158
159 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
160 {
161 offset = part_id - 1;
162 mask = 1 << offset;
163
164 m_SyncParts01 = m_SyncParts01 & ~mask;
165 }
166 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
167 {
168 offset = ( part_id % 32 );
169 mask = 1 << offset;
170
171 m_SyncParts02 = m_SyncParts02 & ~mask;
172 }
173 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
174 {
175 offset = ( part_id % 63 );
176 mask = 1 << offset;
177
178 m_SyncParts03 = m_SyncParts03 & ~mask;
179 }
180 }
181
182 bool IsPartBuildInSyncData( int part_id )
183 {
184 //part_id must starts from index = 1
185 int offset;
186 int mask;
187
188 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
189 {
190 offset = part_id - 1;
191 mask = 1 << offset;
192
193 if ( ( m_SyncParts01 & mask ) > 0 )
194 {
195 return true;
196 }
197 }
198 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
199 {
200 offset = ( part_id % 32 );
201 mask = 1 << offset;
202
203 if ( ( m_SyncParts02 & mask ) > 0 )
204 {
205 return true;
206 }
207 }
208 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
209 {
210 offset = ( part_id % 63 );
211 mask = 1 << offset;
212
213 if ( ( m_SyncParts03 & mask ) > 0 )
214 {
215 return true;
216 }
217 }
218
219 return false;
220 }
221
222 protected void RegisterActionForSync( int part_id, int action_id )
223 {
224 m_InteractedPartId = part_id;
225 m_PerformedActionId = action_id;
226 }
227
228 protected void ResetActionSyncData()
229 {
230 //reset data
233 }
234
235 protected void SetActionFromSyncData()
236 {
237 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
238 {
240 int build_action_id = m_PerformedActionId;
241
242 switch( build_action_id )
243 {
244 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
245 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
246 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
247 }
248 }
249 }
250 //------
251
253 {
254 string key = part.m_PartName;
255 bool is_base = part.IsBase();
256 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
257 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
258 if ( is_part_built_sync )
259 {
260 if ( !part.IsBuilt() )
261 {
262 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
263 GetConstruction().AddToConstructedParts( key );
264 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
265
266 if (is_base)
267 {
269 RemoveProxyPhysics( ANIMATION_DEPLOYED );
270 }
271 }
272 }
273 else
274 {
275 if ( part.IsBuilt() )
276 {
277 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
278 GetConstruction().RemoveFromConstructedParts( key );
279 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
280
281 if (is_base)
282 {
284 AddProxyPhysics( ANIMATION_DEPLOYED );
285 }
286 }
287 }
288
289 //check slot lock for material attachments
290 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
291 }
292
293 //set construction parts based on synchronized data
295 {
296 Construction construction = GetConstruction();
297 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
298
299 for ( int i = 0; i < construction_parts.Count(); ++i )
300 {
301 string key = construction_parts.GetKey( i );
302 ConstructionPart value = construction_parts.Get( key );
303 SetPartFromSyncData(value);
304 }
305
306 //regenerate navmesh
307 UpdateNavmesh();
308 }
309
311 {
312 Construction construction = GetConstruction();
313 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
314
315 for ( int i = 0; i < construction_parts.Count(); ++i )
316 {
317 string key = construction_parts.GetKey( i );
318 ConstructionPart value = construction_parts.Get( key );
319
320 if ( value.GetId() == id )
321 {
322 return value;
323 }
324 }
325
326 return NULL;
327 }
328 //
329
330 //Base
331 bool HasBase()
332 {
333 return m_HasBase;
334 }
335
336 void SetBaseState( bool has_base )
337 {
338 m_HasBase = has_base;
339 }
340
341 override bool IsDeployable()
342 {
343 return true;
344 }
345
346 bool IsOpened()
347 {
348 return false;
349 }
350
351 //--- CONSTRUCTION KIT
353 {
354 ItemBase construction_kit = ItemBase.Cast( GetGame().CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
355 if ( m_ConstructionKitHealth > 0 )
356 {
357 construction_kit.SetHealth( m_ConstructionKitHealth );
358 }
359
360 return construction_kit;
361 }
362
364 {
365 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
366 if ( m_ConstructionKitHealth > 0 )
367 {
368 construction_kit.SetHealth( m_ConstructionKitHealth );
369 }
370 }
371
373 {
374 return GetPosition();
375 }
376
377 protected string GetConstructionKitType()
378 {
379 return "";
380 }
381
382 void DestroyConstructionKit( ItemBase construction_kit )
383 {
384 m_ConstructionKitHealth = construction_kit.GetHealth();
385 GetGame().ObjectDelete( construction_kit );
386 }
387
388 //--- CONSTRUCTION
390 {
391 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
392 GetGame().ObjectDelete( this );
393 }
394
395 // --- EVENTS
396 override void OnStoreSave( ParamsWriteContext ctx )
397 {
398 super.OnStoreSave( ctx );
399
400 //sync parts 01
401 ctx.Write( m_SyncParts01 );
402 ctx.Write( m_SyncParts02 );
403 ctx.Write( m_SyncParts03 );
404
405 ctx.Write( m_HasBase );
406 }
407
408 override bool OnStoreLoad( ParamsReadContext ctx, int version )
409 {
410 if ( !super.OnStoreLoad( ctx, version ) )
411 return false;
412
413 //--- Base building data ---
414 //Restore synced parts data
415 if ( !ctx.Read( m_SyncParts01 ) )
416 {
417 m_SyncParts01 = 0; //set default
418 return false;
419 }
420 if ( !ctx.Read( m_SyncParts02 ) )
421 {
422 m_SyncParts02 = 0; //set default
423 return false;
424 }
425 if ( !ctx.Read( m_SyncParts03 ) )
426 {
427 m_SyncParts03 = 0; //set default
428 return false;
429 }
430
431 //has base
432 if ( !ctx.Read( m_HasBase ) )
433 {
434 m_HasBase = false;
435 return false;
436 }
437 //---
438
439 return true;
440 }
441
442 override void AfterStoreLoad()
443 {
444 super.AfterStoreLoad();
445
447 {
449 }
450 }
451
453 {
454 //update server data
456
457 //set base state
458 ConstructionPart construction_part = GetConstruction().GetBaseConstructionPart();
459 SetBaseState( construction_part.IsBuilt() ) ;
460
461 //synchronize after load
463 }
464
465 override void OnCreatePhysics()
466 {
467 super.OnCreatePhysics();
470 }
471
472 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
473 {
475 return;
476
477 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
478
479 if (GetGame().IsMultiplayer() && !GetGame().IsServer())
480 return;
481
482 Construction construction = GetConstruction();
483 string part_name = zone;
484 part_name.ToLower();
485
486 if ( newLevel == GameConstants.STATE_RUINED )
487 {
488 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
489
490 if ( construction_part && construction.IsPartConstructed( part_name ) )
491 {
492 construction.DestroyPartServer( null, part_name, AT_DESTROY_PART );
493 construction.DestroyConnectedParts(part_name);
494 }
495
496 //barbed wire handling (hack-ish)
497 if ( part_name.Contains("barbed") )
498 {
499 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
500 if (barbed_wire)
501 barbed_wire.SetMountedState( false );
502 }
503 }
504 }
505
506 override void EEOnAfterLoad()
507 {
509 {
511 }
512
513 super.EEOnAfterLoad();
514 }
515
516 override void EEInit()
517 {
518 super.EEInit();
519
520 // init visuals and physics
522
523 //debug
524 #ifdef DEVELOPER
526 #endif
527 }
528
529 override void EEItemAttached( EntityAI item, string slot_name )
530 {
531 super.EEItemAttached( item, slot_name );
532
533 CheckForHybridAttachments( item, slot_name );
535 UpdateAttachmentPhysics( slot_name, false );
536 }
537
538 override void EEItemDetached( EntityAI item, string slot_name )
539 {
540 super.EEItemDetached( item, slot_name );
541
543 UpdateAttachmentPhysics( slot_name, false );
544 }
545
546 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
547 {
548 string slot_name = InventorySlots.GetSlotName( slotId );
549 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
550
551 UpdateAttachmentVisuals( slot_name, locked );
552 UpdateAttachmentPhysics( slot_name, locked );
553 }
554
555 //ignore out of reach condition
557 {
558 return true;
559 }
560
561 //CONSTRUCTION EVENTS
562 //Build
563 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
564 {
565 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
566
567 //check base state
568 if (construtionPart.IsBase())
569 {
570 SetBaseState(true);
571
572 //spawn kit
574 }
575
576 //register constructed parts for synchronization
577 RegisterPartForSync(construtionPart.GetId());
578
579 //register action that was performed on part
580 RegisterActionForSync(construtionPart.GetId(), action_id);
581
582 //synchronize
584
585 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
586
588
589 //update visuals
591
592 //reset action sync data
594 }
595
596 void OnPartBuiltClient(string part_name, int action_id)
597 {
598 //play sound
599 SoundBuildStart( part_name );
600 }
601
602 //Dismantle
603 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
604 {
605 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
606 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
607
608 //register constructed parts for synchronization
609 UnregisterPartForSync(construtionPart.GetId());
610
611 //register action that was performed on part
612 RegisterActionForSync(construtionPart.GetId(), action_id);
613
614 //synchronize
616
617 // server part of sync, client will be synced from SetPartsFromSyncData
618 SetPartFromSyncData(construtionPart);
619
621
622 //update visuals
624
625 //reset action sync data
627
628 //check base state
629 if (construtionPart.IsBase())
630 {
631 //Destroy construction
633 }
634
635 if (GetGame().IsServer())
636 HandleItemFalling(construtionPart);
637 }
638
639 void OnPartDismantledClient( string part_name, int action_id )
640 {
641 //play sound
642 SoundDismantleStart( part_name );
643 }
644
645 //Destroy
646 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
647 {
648 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
649 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
650
651 //register constructed parts for synchronization
652 UnregisterPartForSync(construtionPart.GetId());
653
654 //register action that was performed on part
655 RegisterActionForSync(construtionPart.GetId(), action_id);
656
657 //synchronize
659
660 // server part of sync, client will be synced from SetPartsFromSyncData
661 SetPartFromSyncData(construtionPart);
662
664
665 //update visuals
667
668 //reset action sync data
670
671 //check base state
672 if (construtionPart.IsBase())
673 {
674 //Destroy construction
676 }
677
678 if (GetGame().IsServer())
679 HandleItemFalling(construtionPart);
680 }
681
682 void OnPartDestroyedClient( string part_name, int action_id )
683 {
684 //play sound
685 SoundDestroyStart( part_name );
686 }
687
689 {
690 bool process = false;
691
692 //TODO: add a parameter to parts' config classes?
693 process |= part.m_PartName.Contains("_roof");
694 process |= part.m_PartName.Contains("_platform");
695 process |= part.m_PartName.Contains("_stair");
696
697 if (process)
698 {
699 if (!MemoryPointExists(part.m_PartName + "_min") || !MemoryPointExists(part.m_PartName + "_max"))
700 {
701 Debug.Log("min/max memory points do not exist for part: " + part.m_PartName);
702 return;
703 }
704
705 vector mins, maxs;
706 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_min"));
707 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName + "_max"));
708
709 //sanitize minmaxs
710 vector minTmp, maxTmp;
711 minTmp[0] = Math.Min(mins[0],maxs[0]);
712 maxTmp[0] = Math.Max(mins[0],maxs[0]);
713 minTmp[1] = Math.Min(mins[1],maxs[1]);
714 maxTmp[1] = Math.Max(mins[1],maxs[1]);
715 minTmp[2] = Math.Min(mins[2],maxs[2]);
716 maxTmp[2] = Math.Max(mins[2],maxs[2]);
717 mins = minTmp;
718 maxs = maxTmp;
719
720 maxs[1] = maxs[1] + 0.35; //reach a little above..
721
722 ItemFall(mins,maxs);
723 }
724 }
725
726 protected void ItemFall(vector min, vector max)
727 {
728 array<EntityAI> foundEntities = new array<EntityAI>();
729 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
730
731 //filtering
732 ItemBase item;
733 foreach (EntityAI entity : foundEntities)
734 {
735 if (Class.CastTo(item,entity) && !item.CanUseConstruction()) //BB items?
736 item.ThrowPhysically(null,vector.Zero);
737 }
738 }
739
740 // --- UPDATE
742 {
743 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
744
745 InitVisuals();
746 UpdateNavmesh(); //regenerate navmesh
747 GetConstruction().InitBaseState();
748 }
749
751 {
752 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
753 //check base
754 if ( !HasBase() )
755 {
756 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
757 }
758 else
759 {
760 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
761 }
762
763 GetConstruction().UpdateVisuals();
764 }
765
767 {
768 array<string> attachmentSlots = new array<string>;
769
770 GetAttachmentSlots(this, attachmentSlots);
771 foreach (string slotName : attachmentSlots)
772 {
774 }
775
776 //check base
777 if (!HasBase())
778 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
779 else
780 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
781
782 GetConstruction().UpdateVisuals();
783 }
784
785 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
786 {
787 string slotNameMounted = slot_name + "_Mounted";
788 EntityAI attachment = FindAttachmentBySlotName(slot_name);
789
790 if (attachment)
791 {
792 BarbedWire barbedWire = BarbedWire.Cast(attachment);
793 if (barbedWire && barbedWire.IsMounted())
794 CreateAreaDamage(slotNameMounted);
795 else
796 DestroyAreaDamage(slotNameMounted);
797
798 if (is_locked)
799 {
800 SetAnimationPhase(slotNameMounted, 0);
801 SetAnimationPhase(slot_name, 1);
802 }
803 else
804 {
805 SetAnimationPhase(slotNameMounted, 1);
806 SetAnimationPhase(slot_name, 0);
807 }
808 }
809 else
810 {
811 SetAnimationPhase(slotNameMounted, 1);
812 SetAnimationPhase(slot_name, 1);
813
814 DestroyAreaDamage(slotNameMounted);
815 }
816 }
817
818 // avoid calling this function on frequent occasions, it's a massive performance hit
820 {
822 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
823
824 array<string> attachmentSlots = new array<string>;
825 GetAttachmentSlots(this, attachmentSlots);
826
828 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
829
830 foreach (string slotName : attachmentSlots)
831 {
833 }
834
835 //check base
836 if (!HasBase())
837 {
839 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
840
841 AddProxyPhysics(ANIMATION_DEPLOYED);
842 }
843 else
844 {
846 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
847
848 RemoveProxyPhysics(ANIMATION_DEPLOYED);
849 }
850
851 GetConstruction().UpdatePhysics();
853 }
854
855 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
856 {
857 //checks for invalid appends; hotfix
858 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
859 return;
860 //----------------------------------
861 string slot_name_mounted = slot_name + "_Mounted";
862 EntityAI attachment = FindAttachmentBySlotName( slot_name );
863
864 //remove proxy physics
865 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
866 RemoveProxyPhysics( slot_name_mounted );
867 RemoveProxyPhysics( slot_name );
868
869 if ( attachment )
870 {
871 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
872 if ( is_locked )
873 {
874 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
875 AddProxyPhysics( slot_name_mounted );
876 }
877 else
878 {
879 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
880 AddProxyPhysics( slot_name );
881 }
882 }
883 }
884
885 protected void UpdateNavmesh()
886 {
887 SetAffectPathgraph( true, false );
888 GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( GetGame().UpdatePathgraphRegionByObject, 100, false, this );
889 }
890
891 override bool CanUseConstruction()
892 {
893 return true;
894 }
895
897 {
898 return true;
899 }
900
901 protected bool IsAttachmentSlotLocked( EntityAI attachment )
902 {
903 if ( attachment )
904 {
905 InventoryLocation inventory_location = new InventoryLocation;
906 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
907
908 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
909 }
910
911 return false;
912 }
913
914 protected bool IsAttachmentSlotLocked( string slot_name )
915 {
916 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
917 }
918
919 //--- ATTACHMENT SLOTS
920 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
921 {
922 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
923 if ( GetGame().ConfigIsExisting( config_path ) )
924 {
925 GetGame().ConfigGetTextArray( config_path, attachment_slots );
926 }
927 }
928
929 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
930 {
931 return true;
932 }
933
934 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
935 {
936 return true;
937 }
938
939 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
940 {
941 return true;
942 }
943
944 // --- INIT
946 {
947 if ( !m_Construction )
948 {
949 m_Construction = new Construction( this );
950 }
951
952 GetConstruction().Init();
953 }
954
956 {
957 return m_Construction;
958 }
959
960 //--- INVENTORY/ATTACHMENTS CONDITIONS
961 //attachments
962 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
963 {
964 return super.CanReceiveAttachment(attachment, slotId);
965 }
966
968 {
969 int attachment_count = GetInventory().AttachmentCount();
970 if ( attachment_count > 0 )
971 {
972 if ( HasBase() && attachment_count == 1 )
973 {
974 return false;
975 }
976
977 return true;
978 }
979
980 return false;
981 }
982
983 override bool ShowZonesHealth()
984 {
985 return true;
986 }
987
988 override bool IsTakeable()
989 {
990 return false;
991 }
992
993 //this into/outo parent.Cargo
994 override bool CanPutInCargo( EntityAI parent )
995 {
996 return false;
997 }
998
999 override bool CanRemoveFromCargo( EntityAI parent )
1000 {
1001 return false;
1002 }
1003
1004 //hands
1005 override bool CanPutIntoHands( EntityAI parent )
1006 {
1007 return false;
1008 }
1009
1010 //--- ACTION CONDITIONS
1011 //direction
1012 override bool IsFacingPlayer( PlayerBase player, string selection )
1013 {
1014 return true;
1015 }
1016
1017 override bool IsPlayerInside( PlayerBase player, string selection )
1018 {
1019 return true;
1020 }
1021
1024 {
1025 return false;
1026 }
1027
1028 //camera direction check
1029 bool IsFacingCamera( string selection )
1030 {
1031 return true;
1032 }
1033
1034 //roof check
1035 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
1036 {
1037 return false;
1038 }
1039
1040 //selection->player distance check
1041 bool HasProperDistance( string selection, PlayerBase player )
1042 {
1043 return true;
1044 }
1045
1046 //folding
1048 {
1049 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
1050 {
1051 return false;
1052 }
1053
1054 return true;
1055 }
1056
1058 {
1061
1062 return item;
1063 }
1064
1065 //Damage triggers (barbed wire)
1066 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
1067 {
1068 if ( GetGame() && GetGame().IsServer() )
1069 {
1070 //destroy area damage if some already exists
1071 DestroyAreaDamage( slot_name );
1072
1073 //create new area damage
1075 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
1076
1077 vector min_max[2];
1078 if ( MemoryPointExists( slot_name + "_min" ) )
1079 {
1080 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
1081 }
1082 if ( MemoryPointExists( slot_name + "_max" ) )
1083 {
1084 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
1085 }
1086
1087 //get proper trigger extents (min<max)
1088 vector extents[2];
1089 GetConstruction().GetTriggerExtents( min_max, extents );
1090
1091 //get box center
1092 vector center;
1093 center = GetConstruction().GetBoxCenter( min_max );
1094 center = ModelToWorld( center );
1095
1096 //rotate center if needed
1097 vector orientation = GetOrientation();;
1098 CalcDamageAreaRotation( rotation_angle, center, orientation );
1099
1100 areaDamage.SetExtents( extents[0], extents[1] );
1101 areaDamage.SetAreaPosition( center );
1102 areaDamage.SetAreaOrientation( orientation );
1103 areaDamage.SetLoopInterval( 1.0 );
1104 areaDamage.SetDeferDuration( 0.2 );
1105 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
1106 areaDamage.SetAmmoName( "BarbedWireHit" );
1107 areaDamage.Spawn();
1108
1109 m_DamageTriggers.Insert( slot_name, areaDamage );
1110 }
1111 }
1112
1113 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
1114 {
1115 if ( angle_deg != 0 )
1116 {
1117 //orientation
1118 orientation[0] = orientation[0] - angle_deg;
1119
1120 //center
1121 vector rotate_axis;
1122 if ( MemoryPointExists( "rotate_axis" ) )
1123 {
1124 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
1125 }
1126 float r_center_x = ( Math.Cos( angle_deg * Math.DEG2RAD ) * ( center[0] - rotate_axis[0] ) ) - ( Math.Sin( angle_deg * Math.DEG2RAD ) * ( center[2] - rotate_axis[2] ) ) + rotate_axis[0];
1127 float r_center_z = ( Math.Sin( angle_deg * Math.DEG2RAD ) * ( center[0] - rotate_axis[0] ) ) + ( Math.Cos( angle_deg * Math.DEG2RAD ) * ( center[2] - rotate_axis[2] ) ) + rotate_axis[2];
1128 center[0] = r_center_x;
1129 center[2] = r_center_z;
1130 }
1131 }
1132
1133 void DestroyAreaDamage( string slot_name )
1134 {
1135 if (GetGame() && GetGame().IsServer())
1136 {
1138 if (m_DamageTriggers.Find(slot_name, areaDamage))
1139 {
1140 if (areaDamage)
1141 {
1142 areaDamage.Destroy();
1143 }
1144
1145 m_DamageTriggers.Remove( slot_name );
1146 }
1147 }
1148 }
1149
1151 {
1152 return true;
1153 }
1154
1155 //================================================================
1156 // SOUNDS
1157 //================================================================
1158 protected void SoundBuildStart( string part_name )
1159 {
1160 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
1161 }
1162
1163 protected void SoundDismantleStart( string part_name )
1164 {
1165 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
1166 }
1167
1168 protected void SoundDestroyStart( string part_name )
1169 {
1170 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
1171 }
1172
1173 protected string GetBuildSoundByMaterial( string part_name )
1174 {
1175 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
1176
1177 switch ( material_type )
1178 {
1179 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
1180 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
1181 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
1182 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
1183 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
1184 }
1185
1186 return "";
1187 }
1188
1189 protected string GetDismantleSoundByMaterial( string part_name )
1190 {
1191 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
1192
1193 switch ( material_type )
1194 {
1195 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
1196 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
1197 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
1198 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
1199 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
1200 }
1201
1202 return "";
1203 }
1204
1205 //misc
1206 void CheckForHybridAttachments( EntityAI item, string slot_name )
1207 {
1208 if (!GetGame().IsMultiplayer() || GetGame().IsServer())
1209 {
1210 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
1211 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
1212 {
1213 SetHealth(slot_name,"Health",item.GetHealth());
1214 }
1215 }
1216 }
1217
1219 {
1220 return 111;
1221 }
1222
1223 override void SetActions()
1224 {
1225 super.SetActions();
1226
1230 }
1231
1232 //================================================================
1233 // DEBUG
1234 //================================================================
1235 protected void DebugCustomState()
1236 {
1237 }
1238
1241 {
1242 return null;
1243 }
1244
1245 override void OnDebugSpawn()
1246 {
1247 FullyBuild();
1248 }
1249
1251 {
1253 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
1254
1255 Man p;
1256
1257 #ifdef SERVER
1258 array<Man> players = new array<Man>;
1259 GetGame().GetWorld().GetPlayerList(players);
1260 if (players.Count())
1261 p = players[0];
1262 #else
1263 p = GetGame().GetPlayer();
1264 #endif
1265
1266 foreach (ConstructionPart part : parts)
1267 {
1268 bool excluded = false;
1269 string partName = part.GetPartName();
1270 if (excludes)
1271 {
1272 foreach (string exclude : excludes)
1273 {
1274 if (partName.Contains(exclude))
1275 {
1276 excluded = true;
1277 break;
1278 }
1279 }
1280 }
1281
1282 if (!excluded)
1283 {
1284 OnPartBuiltServer(p, partName, AT_BUILD_PART);
1285 }
1286 }
1287
1288 GetConstruction().UpdateVisuals();
1289 }
1290}
1291
1292void bsbDebugPrint (string s)
1294#ifdef BSB_DEBUG
1295 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
1296#else
1297 //Print("" + s); // comment/uncomment to hide/see debug logs
1298#endif
1300void bsbDebugSpam (string s)
1302#ifdef BSB_DEBUG_SPAM
1303 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
1304#else
1305 //Print("" + s); // comment/uncomment to hide/see debug logs
1306#endif
1307}
const int AT_DISMANTLE_PART
Определения _constants.c:7
const int AT_DESTROY_PART
Определения _constants.c:8
const int AT_BUILD_PART
Определения _constants.c:6
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
vector GetOrientation()
Определения AreaDamageManager.c:306
void AreaDamageManager(EntityAI parent)
Определения AreaDamageManager.c:22
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1928
void FullyBuild()
Определения BaseBuildingBase.c:2539
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1524
void UpdateNavmesh()
Определения BaseBuildingBase.c:2174
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2457
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2447
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2074
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2402
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1413
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1741
void DestroyConstruction()
Определения BaseBuildingBase.c:1678
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2478
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2190
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1885
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1511
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1583
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1368
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2495
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2209
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1971
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1442
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1300
Construction GetConstruction()
Определения BaseBuildingBase.c:2244
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2452
void DebugCustomState()
Определения BaseBuildingBase.c:2524
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1599
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1292
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1541
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2144
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2462
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1641
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1977
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:2015
bool HasBase()
Определения BaseBuildingBase.c:1620
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1384
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1625
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1471
void ConstructionInit()
Определения BaseBuildingBase.c:2234
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
PlayerSpawnPreset slotName
void InitVisuals()
Определения Construction.c:173
ConstructionMaterialType
Определения Construction.c:2
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
void InitBaseState()
Определения Construction.c:228
map
Определения ControlsXboxNew.c:4
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
void DestroyAreaDamage()
Определения FireplaceBase.c:2338
void CreateAreaDamage()
Определения FireplaceBase.c:2322
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
Определения ActionTakeItem.c:7
const int HITZONE
Определения AreaDamageManager.c:4
override void SetLoopInterval(float time)
Определения AreaDamageLooped.c:32
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
Определения AreaDamageLoopedDeferred.c:7
override string GetConstructionKitType()
Определения Fence.c:45
override array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения Fence.c:854
override void UpdateVisuals()
Определения Watchtower.c:44
override void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения Fence.c:297
override vector GetKitSpawnPosition()
Определения Fence.c:162
Определения Fence.c:2
proto native World GetWorld()
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void ObjectDelete(Object obj)
Super root of all classes in Enforce script.
Определения EnScript.c:11
int GetId()
Определения ConstructionPart.c:40
string GetPartName()
Определения ConstructionPart.c:30
bool IsBase()
Определения ConstructionPart.c:65
bool IsBuilt()
Определения ConstructionPart.c:45
string m_PartName
Определения ConstructionPart.c:5
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения Debug.c:122
Определения Debug.c:2
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
Определения Building.c:6
Определения constants.c:659
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:29
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:682
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:529
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:1047
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:639
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:124
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:1168
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:34
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:252
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:21
void UpdateVisuals()
Определения BaseBuildingBase.c:766
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:1023
bool IsAttachmentSlotLocked(string slot_name)
Определения BaseBuildingBase.c:914
void DebugCustomState()
Определения BaseBuildingBase.c:1235
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:336
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:408
int m_SyncParts02
Определения BaseBuildingBase.c:13
ref array< string > m_Mountables
Определения BaseBuildingBase.c:36
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:785
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:646
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:506
bool IsFacingCamera(string selection)
Определения BaseBuildingBase.c:1029
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:546
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:153
int m_SyncParts03
Определения BaseBuildingBase.c:14
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:1057
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:1005
void SetActionFromSyncData()
Определения BaseBuildingBase.c:235
override void SetActions()
Определения BaseBuildingBase.c:1223
int m_InteractedPartId
Определения BaseBuildingBase.c:15
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:603
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:4
int m_SyncParts01
Определения BaseBuildingBase.c:12
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:726
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:79
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:939
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:901
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:372
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:22
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:896
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:1189
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:382
void DestroyConstruction()
Определения BaseBuildingBase.c:389
void BaseBuildingBase()
Определения BaseBuildingBase.c:39
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:929
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:1158
bool IsOpened()
Определения BaseBuildingBase.c:346
override void OnCreatePhysics()
Определения BaseBuildingBase.c:465
override int GetHideIconMask()
Определения BaseBuildingBase.c:89
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:1173
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:29
string GetConstructionKitType()
Определения BaseBuildingBase.c:377
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:396
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:934
override void AfterStoreLoad()
Определения BaseBuildingBase.c:442
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:556
void OnSynchronizedClient()
Определения BaseBuildingBase.c:111
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:596
Construction GetConstruction()
Определения BaseBuildingBase.c:955
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:983
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:538
void DestroyAreaDamage(string slot_name)
Определения BaseBuildingBase.c:1133
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:103
void SynchronizeBaseState()
Определения BaseBuildingBase.c:95
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:999
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:26
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:1163
override bool CanObstruct()
Определения BaseBuildingBase.c:84
void UpdateNavmesh()
Определения BaseBuildingBase.c:885
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:994
override void EEInit()
Определения BaseBuildingBase.c:516
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:920
override void OnDebugSpawn()
Определения BaseBuildingBase.c:1245
bool m_HasBase
Определения BaseBuildingBase.c:10
void UpdatePhysics()
Определения BaseBuildingBase.c:819
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:363
void InitVisuals()
Определения BaseBuildingBase.c:750
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:35
ref Construction m_Construction
Определения BaseBuildingBase.c:8
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:967
void FullyBuild()
Определения BaseBuildingBase.c:1250
override bool CanUseConstruction()
Определения BaseBuildingBase.c:891
override bool IsTakeable()
Определения BaseBuildingBase.c:988
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:6
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
EffectSound m_Sound
Определения BaseBuildingBase.c:32
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:182
void CreateAreaDamage(string slot_name, float rotation_angle=0)
Определения BaseBuildingBase.c:1066
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:24
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:563
void ConstructionInit()
Определения BaseBuildingBase.c:945
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:28
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:23
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:294
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1012
void BarbedWire()
Определения BarbedWire.c:31
bool HasBase()
Определения BaseBuildingBase.c:331
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:310
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:30
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:452
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:1113
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1206
void InitBaseState()
Определения BaseBuildingBase.c:741
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:1240
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:1041
override bool IsDeployable()
Определения BaseBuildingBase.c:341
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:222
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:27
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:855
void ResetActionSyncData()
Определения BaseBuildingBase.c:228
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:20
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:688
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:352
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:1035
int m_PerformedActionId
Определения BaseBuildingBase.c:16
Определения InventoryItem.c:731
static bool IsBaseBuildingLogEnable()
Определения Debug.c:698
Определения Debug.c:594
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native void GetPlayerList(out array< Man > players)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static const vector Zero
Определения EnConvert.c:110
Определения EnConvert.c:106
override string GetDebugName()
Определения dayzplayer.c:1170
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int STATE_RUINED
Определения constants.c:846
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static const float DEG2RAD
Определения EnMath.c:17
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
proto int ToLower()
Changes string to lowercase. Returns length.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8