DayZ 1.30
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 //variables for synchronization of base building parts (2x31 is the current limit)
10 int m_SyncParts01; //synchronization for already built parts (31 parts)
11 int m_SyncParts02; //synchronization for already built parts (+31 parts)
12 int m_SyncParts03; //synchronization for already built parts (+31 parts)
13 int m_InteractedPartId; //construction part id that an action was performed on
14 int m_PerformedActionId; //action id that was performed on a construction part
16
17 //Sounds
18 //build
19 const string SOUND_BUILD_WOOD_LOG = "putDown_WoodLog_SoundSet";
20 const string SOUND_BUILD_WOOD_PLANK = "putDown_WoodPlank_SoundSet";
21 const string SOUND_BUILD_WOOD_STAIRS = "putDown_WoodStairs_SoundSet";
22 const string SOUND_BUILD_METAL = "putDown_MetalPlank_SoundSet";
23 const string SOUND_BUILD_WIRE = "putDown_BarbedWire_SoundSet";
24 //dismantle
25 const string SOUND_DISMANTLE_WOOD_LOG = "Crash_WoodPlank_SoundSet";
26 const string SOUND_DISMANTLE_WOOD_PLANK = "Crash_WoodPlank_SoundSet";
27 const string SOUND_DISMANTLE_WOOD_STAIRS = "Crash_WoodPlank_SoundSet";
28 const string SOUND_DISMANTLE_METAL = "Crash_MetalPlank_SoundSet";
29 const string SOUND_DISMANTLE_WIRE = "putDown_BarbedWire_SoundSet";
30
32
36
37 // Constructor
39 {
41
42 //synchronized variables
43 RegisterNetSyncVariableInt( "m_SyncParts01" );
44 RegisterNetSyncVariableInt( "m_SyncParts02" );
45 RegisterNetSyncVariableInt( "m_SyncParts03" );
46 RegisterNetSyncVariableInt( "m_InteractedPartId" );
47 RegisterNetSyncVariableInt( "m_PerformedActionId" );
48 RegisterNetSyncVariableBool( "m_HasBase" );
49
50 //Construction init
51 ConstructionInit();
52
53 if (ConfigIsExisting("hybridAttachments"))
54 {
56 ConfigGetTextArray("hybridAttachments", m_HybridAttachments);
57 }
58 if (ConfigIsExisting("mountables"))
59 {
61 ConfigGetTextArray("mountables", m_Mountables);
62 }
63
64 ProcessInvulnerabilityCheck(GetInvulnerabilityTypeString());
65 SetAllowDamage(true);
66 }
67
69 {
70 return "disableBaseDamage";
71 }
72
73 override bool CanObstruct()
74 {
75 return true;
76 }
77
78 override int GetHideIconMask()
79 {
80 return EInventoryIconVisibility.HIDE_VICINITY;
81 }
82
83 override void InitItemSounds()
84 {
85 super.InitItemSounds();
86
88 SoundParameters params = new SoundParameters();
89 params.m_Loop = true;
90
91 if (GetFoldSoundset() != string.Empty)
92 handler.AddSound(SoundConstants.ITEM_FOLD, GetFoldSoundset());
93 if (GetLoopFoldSoundset() != string.Empty)
94 handler.AddSound(SoundConstants.ITEM_FOLD_LOOP, GetLoopFoldSoundset(), params);
95 }
96
97 override string GetFoldSoundset()
98 {
99 return "putDown_FenceKit_SoundSet";
100 }
101
102 override string GetLoopFoldSoundset()
103 {
104 return "Shelter_Site_Build_Loop_SoundSet";
105 }
106
107 // --- SYNCHRONIZATION
109 {
110 if ( g_Game.IsServer() )
111 {
112 SetSynchDirty();
113 }
114 }
115
117 {
118 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnVariablesSynchronized");
119 super.OnVariablesSynchronized();
120
121 g_Game.GetCallQueue( CALL_CATEGORY_GAMEPLAY ).CallLater( OnSynchronizedClient, 100, false );
122 }
123
124 protected void OnSynchronizedClient()
125 {
126 //update parts
128
129 //update action on part
131
132 //update visuals (client)
134 }
135
136 //parts synchronization
137 void RegisterPartForSync( int part_id )
138 {
139 //part_id must starts from index = 1
140 int offset;
141 int mask;
142
143 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
144 {
145 offset = part_id - 1;
146 mask = 1 << offset;
147
149 }
150 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
151 {
152 offset = ( part_id % 32 );
153 mask = 1 << offset;
154
156 }
157 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
158 {
159 offset = ( part_id % 63 );
160 mask = 1 << offset;
161
163 }
164 }
165
166 void UnregisterPartForSync( int part_id )
167 {
168 //part_id must starts from index = 1
169 int offset;
170 int mask;
171
172 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
173 {
174 offset = part_id - 1;
175 mask = 1 << offset;
176
177 m_SyncParts01 = m_SyncParts01 & ~mask;
178 }
179 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
180 {
181 offset = ( part_id % 32 );
182 mask = 1 << offset;
183
184 m_SyncParts02 = m_SyncParts02 & ~mask;
185 }
186 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
187 {
188 offset = ( part_id % 63 );
189 mask = 1 << offset;
190
191 m_SyncParts03 = m_SyncParts03 & ~mask;
192 }
193 }
194
195 bool IsPartBuildInSyncData( int part_id )
196 {
197 //part_id must starts from index = 1
198 int offset;
199 int mask;
200
201 if ( part_id >= 1 && part_id <= 31 ) //<1,31> (31 parts)
202 {
203 offset = part_id - 1;
204 mask = 1 << offset;
205
206 if ( ( m_SyncParts01 & mask ) > 0 )
207 {
208 return true;
209 }
210 }
211 else if ( part_id >= 32 && part_id <= 62 ) //<32,62> (31 parts)
212 {
213 offset = ( part_id % 32 );
214 mask = 1 << offset;
215
216 if ( ( m_SyncParts02 & mask ) > 0 )
217 {
218 return true;
219 }
220 }
221 else if ( part_id >= 63 && part_id <= 93 ) //<63,93> (31 parts)
222 {
223 offset = ( part_id % 63 );
224 mask = 1 << offset;
225
226 if ( ( m_SyncParts03 & mask ) > 0 )
227 {
228 return true;
229 }
230 }
231
232 return false;
233 }
234
235 protected void RegisterActionForSync( int part_id, int action_id )
236 {
237 m_InteractedPartId = part_id;
238 m_PerformedActionId = action_id;
239 }
240
241 protected void ResetActionSyncData()
242 {
243 //reset data
246 }
247
248 protected void SetActionFromSyncData()
249 {
250 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
251 {
253 int build_action_id = m_PerformedActionId;
254
255 switch( build_action_id )
256 {
257 case AT_BUILD_PART : OnPartBuiltClient( constrution_part.GetPartName(), build_action_id ); break;
258 case AT_DISMANTLE_PART : OnPartDismantledClient( constrution_part.GetPartName(), build_action_id ); break;
259 case AT_DESTROY_PART : OnPartDestroyedClient( constrution_part.GetPartName(), build_action_id ); break;
260 }
261 }
262 }
263 //------
264
266 {
267 string key = part.GetPartName();
268 bool is_base = part.IsBase();
269 bool is_part_built_sync = IsPartBuildInSyncData( part.GetId() );
270 bsbDebugSpam("[bsb] " + GetDebugName(this) + " SetPartFromSyncData try to sync: built=" + is_part_built_sync + " key=" + key + " part=" + part.GetPartName() + " part_built=" + part.IsBuilt());
271 if ( is_part_built_sync )
272 {
273 if ( !part.IsBuilt() )
274 {
275 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData +++ " + key);
276 GetConstruction().AddToConstructedParts( key );
277 GetConstruction().ShowConstructionPartPhysics(part.GetPartName());
278
279 if (is_base)
280 {
282 RemoveProxyPhysics( ANIMATION_DEPLOYED );
283 }
284 }
285 }
286 else
287 {
288 if ( part.IsBuilt() )
289 {
290 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " SetPartsFromSyncData --- " + key);
291 GetConstruction().RemoveFromConstructedParts( key );
292 GetConstruction().HideConstructionPartPhysics(part.GetPartName());
293
294 if (is_base)
295 {
297 AddProxyPhysics( ANIMATION_DEPLOYED );
298 }
299 }
300 }
301
302 //check slot lock for material attachments
303 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() ); //failsafe for corrupted sync/storage data
304 }
305
306 //set construction parts based on synchronized data
308 {
309 Construction construction = GetConstruction();
310 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
311
312 for ( int i = 0; i < construction_parts.Count(); ++i )
313 {
314 string key = construction_parts.GetKey( i );
315 ConstructionPart value = construction_parts.Get( key );
316 SetPartFromSyncData(value);
317 }
318
319 //regenerate navmesh
321 }
322
324 {
325 Construction construction = GetConstruction();
326 map<string, ref ConstructionPart> construction_parts = construction.GetConstructionParts();
327
328 for ( int i = 0; i < construction_parts.Count(); ++i )
329 {
330 string key = construction_parts.GetKey( i );
331 ConstructionPart value = construction_parts.Get( key );
332
333 if ( value.GetId() == id )
334 {
335 return value;
336 }
337 }
338
339 return NULL;
340 }
341 //
342
343 //Base
344 bool HasBase()
345 {
346 return m_HasBase;
347 }
348
349 void SetBaseState( bool has_base )
350 {
351 m_HasBase = has_base;
352 }
353
354 override bool IsDeployable()
355 {
356 return true;
357 }
358
359 bool IsOpened()
360 {
361 return false;
362 }
363
364 //--- CONSTRUCTION KIT
366 {
367 ItemBase construction_kit = ItemBase.Cast( g_Game.CreateObjectEx( GetConstructionKitType(), GetKitSpawnPosition(), ECE_PLACE_ON_SURFACE ) );
368 if ( m_ConstructionKitHealth > 0 )
369 {
370 construction_kit.SetHealth( m_ConstructionKitHealth );
371 }
372
373 return construction_kit;
374 }
375
377 {
378 ItemBase construction_kit = ItemBase.Cast(player.GetHumanInventory().CreateInHands(GetConstructionKitType()));
379 if ( m_ConstructionKitHealth > 0 )
380 {
381 construction_kit.SetHealth( m_ConstructionKitHealth );
382 }
383 }
384
386 {
387 return GetPosition();
388 }
389
390 protected string GetConstructionKitType()
391 {
392 return "";
393 }
394
395 void DestroyConstructionKit( ItemBase construction_kit )
396 {
397 m_ConstructionKitHealth = construction_kit.GetHealth();
398 g_Game.ObjectDelete( construction_kit );
399 }
400
401 //--- CONSTRUCTION
403 {
404 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " DestroyConstruction");
405 g_Game.ObjectDelete( this );
406 }
407
408 // --- EVENTS
409 override void EEDelete(EntityAI parent)
410 {
411 super.EEDelete(parent);
412
413 foreach (AreaDamageManager areaDamage : m_DamageTriggers)
414 {
415 areaDamage.Destroy();
416 }
417
418 }
419
420 override void OnStoreSave( ParamsWriteContext ctx )
421 {
422 super.OnStoreSave( ctx );
423
424 //sync parts 01
425 ctx.Write( m_SyncParts01 );
426 ctx.Write( m_SyncParts02 );
427 ctx.Write( m_SyncParts03 );
428
429 ctx.Write( m_HasBase );
430 }
431
432 override bool OnStoreLoad( ParamsReadContext ctx, int version )
433 {
434 if ( !super.OnStoreLoad( ctx, version ) )
435 return false;
436
437 //--- Base building data ---
438 //Restore synced parts data
439 if ( !ctx.Read( m_SyncParts01 ) )
440 {
441 m_SyncParts01 = 0; //set default
442 return false;
443 }
444 if ( !ctx.Read( m_SyncParts02 ) )
445 {
446 m_SyncParts02 = 0; //set default
447 return false;
448 }
449 if ( !ctx.Read( m_SyncParts03 ) )
450 {
451 m_SyncParts03 = 0; //set default
452 return false;
453 }
454
455 //has base
456 if ( !ctx.Read( m_HasBase ) )
457 {
458 m_HasBase = false;
459 return false;
460 }
461 //---
462
463 return true;
464 }
465
466 override void AfterStoreLoad()
467 {
468 super.AfterStoreLoad();
469
471 {
473 }
474 }
475
477 {
478 //update server data
480
481 //set base state
482 ConstructionPart part = GetConstruction().GetBaseConstructionPart();
483 SetBaseState( part.IsBuilt() ) ;
484
485 //synchronize after load
487 }
488
489 override void OnCreatePhysics()
490 {
491 super.OnCreatePhysics();
492
493 ConstructionInit();
495 }
496
497 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
498 {
500 return;
501
502 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
503 }
504
505 override void EEOnAfterLoad()
506 {
508 {
509 g_Game.GetCallQueue( CALL_CATEGORY_GAMEPLAY ).CallLater( SetPartsAfterStoreLoad, 500, false, this ); //todo: check damage system config presence and 'HasDamageSystem' instead?
510 }
511
512 super.EEOnAfterLoad();
513 }
514
515 override void EEItemAttached( EntityAI item, string slot_name )
516 {
517 super.EEItemAttached( item, slot_name );
518
519 CheckForHybridAttachments( item, slot_name );
521 UpdateAttachmentPhysics( slot_name, false );
522 }
523
524 override void EEItemDetached( EntityAI item, string slot_name )
525 {
526 super.EEItemDetached( item, slot_name );
527
529 UpdateAttachmentPhysics( slot_name, false );
530 }
531
532 protected void OnSetSlotLock( int slotId, bool locked, bool was_locked )
533 {
534 string slot_name = InventorySlots.GetSlotName( slotId );
535 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint( "inv: OnSetSlotLock " + GetDebugName( this ) + " slot=" + slot_name + " locked=" + locked + " was_locked=" + was_locked );
536
537 UpdateAttachmentVisuals( slot_name, locked );
538 UpdateAttachmentPhysics( slot_name, locked );
539 }
540
541 //ignore out of reach condition
543 {
544 return true;
545 }
546
547 //CONSTRUCTION EVENTS
548 //Build
549 void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
550 {
551 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
552
553 //check base state
554 if (construtionPart.IsBase())
555 {
556 SetBaseState(true);
557
558 //spawn kit
560 }
561
562 //register constructed parts for synchronization
563 RegisterPartForSync(construtionPart.GetId());
564
565 //register action that was performed on part
566 RegisterActionForSync(construtionPart.GetId(), action_id);
567
568 //synchronize
570
571 SetPartFromSyncData(construtionPart); // server part of sync, client will be synced from SetPartsFromSyncData
572
574
575 //update visuals
577
578 //reset action sync data
579 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
580 }
581
582 void OnPartBuiltClient(string part_name, int action_id)
583 {
584 //play sound
585 SoundBuildStart( part_name );
586 }
587
588 //Dismantle
589 void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
590 {
591 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDismantledServer " + part_name);
592 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
593
594 //register constructed parts for synchronization
595 UnregisterPartForSync(construtionPart.GetId());
596
597 //register action that was performed on part
598 RegisterActionForSync(construtionPart.GetId(), action_id);
599
600 //synchronize
602
603 // server part of sync, client will be synced from SetPartsFromSyncData
604 SetPartFromSyncData(construtionPart);
605
607
608 //update visuals
610
611 //reset action sync data
612 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
613
614 //check base state
615 if (construtionPart.IsBase())
616 {
617 //Destroy construction
618 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(DestroyConstruction, 200, false, this);
619 }
620 }
621
622 void OnPartDismantledClient( string part_name, int action_id )
623 {
624 //play sound
625 SoundDismantleStart( part_name );
626 }
627
628 //Destroy
629 void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part = false)
630 {
631 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " OnPartDestroyedServer " + part_name);
632 ConstructionPart construtionPart = GetConstruction().GetConstructionPart(part_name);
633
634 //register constructed parts for synchronization
635 UnregisterPartForSync(construtionPart.GetId());
636
637 //register action that was performed on part
638 RegisterActionForSync(construtionPart.GetId(), action_id);
639
640 //synchronize
642
643 // server part of sync, client will be synced from SetPartsFromSyncData
644 SetPartFromSyncData(construtionPart);
645
647
648 //update visuals
650
651 //reset action sync data
652 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ResetActionSyncData, 100, false, this);
653
654 //check base state
655 if (construtionPart.IsBase())
656 {
657 //Destroy construction
658 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(DestroyConstruction, 200, false, this);
659 }
660 }
661
662 void OnPartDestroyedClient( string part_name, int action_id )
663 {
664 //play sound
665 SoundDestroyStart( part_name );
666 }
667
668 // --- UPDATE
670 {
671 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::InitBaseState ");
672
673 InitVisuals();
674 UpdateNavmesh(); //regenerate navmesh
675 }
676
678 {
679 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " InitVisuals");
680 //check base
681 if ( !HasBase() )
682 {
683 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
684 }
685 else
686 {
687 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
688 }
689
690 GetConstruction().InitVisuals();
691 }
692
694 {
695 array<string> attachmentSlots = new array<string>;
696
697 GetAttachmentSlots(this, attachmentSlots);
698 foreach (string slotName : attachmentSlots)
699 {
701 }
702
703 //check base
704 if (!HasBase())
705 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
706 else
707 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
708
709 GetConstruction().UpdateVisuals();
710 }
711
712 void UpdateAttachmentVisuals(string slot_name, bool is_locked)
713 {
714 string slotNameMounted = slot_name + "_Mounted";
715 EntityAI attachment = FindAttachmentBySlotName(slot_name);
716
717 if (attachment)
718 {
719 BarbedWire barbedWire = BarbedWire.Cast(attachment);
720 if (barbedWire && barbedWire.IsMounted())
721 CreateAreaDamage(slotNameMounted);
722 else
723 DestroyAreaDamage(slotNameMounted);
724
725 if (is_locked)
726 {
727 SetAnimationPhase(slotNameMounted, 0);
728 SetAnimationPhase(slot_name, 1);
729 }
730 else
731 {
732 SetAnimationPhase(slotNameMounted, 1);
733 SetAnimationPhase(slot_name, 0);
734 }
735 }
736 else
737 {
738 SetAnimationPhase(slotNameMounted, 1);
739 SetAnimationPhase(slot_name, 1);
740
741 DestroyAreaDamage(slotNameMounted);
742 }
743 }
744
745 // avoid calling this function on frequent occasions, it's a massive performance hit
747 {
749 bsbDebugPrint("[bsb] " + GetDebugName(this) + " BaseBuildingBase::UpdatePhysics");
750
751 array<string> attachmentSlots = new array<string>;
752 GetAttachmentSlots(this, attachmentSlots);
753
755 bsbDebugPrint("[bsb] " + GetDebugName(this) + " att_cnt=" + attachmentSlots.Count());
756
757 foreach (string slotName : attachmentSlots)
758 {
760 }
761
762 //check base
763 if (!HasBase())
764 {
766 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " ADD");
767
768 AddProxyPhysics(ANIMATION_DEPLOYED);
769 }
770 else
771 {
773 bsbDebugPrint("[bsb] " + GetDebugName(this) + ANIMATION_DEPLOYED + " RM");
774
775 RemoveProxyPhysics(ANIMATION_DEPLOYED);
776 }
777
778 GetConstruction().UpdatePhysics();
780 }
781
782 void UpdateAttachmentPhysics( string slot_name, bool is_locked )
783 {
784 //checks for invalid appends; hotfix
785 if ( !m_Mountables || m_Mountables.Find(slot_name) == -1 )
786 return;
787 //----------------------------------
788 string slot_name_mounted = slot_name + "_Mounted";
789 EntityAI attachment = FindAttachmentBySlotName( slot_name );
790
791 //remove proxy physics
792 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Removing ATT SLOT=" + slot_name + " RM / RM");
793 RemoveProxyPhysics( slot_name_mounted );
794 RemoveProxyPhysics( slot_name );
795
796 if ( attachment )
797 {
798 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " Adding ATT=" + Object.GetDebugName(attachment));
799 if ( is_locked )
800 {
801 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " RM / RM");
802 AddProxyPhysics( slot_name_mounted );
803 }
804 else
805 {
806 if (LogManager.IsBaseBuildingLogEnable()) bsbDebugPrint("[bsb] " + GetDebugName(this) + " ADD");
807 AddProxyPhysics( slot_name );
808 }
809 }
810 }
811
812 protected void UpdateNavmesh()
813 {
814 SetAffectPathgraph( true, false );
815 g_Game.GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( g_Game.UpdatePathgraphRegionByObject, 100, false, this );
816 }
817
818 override bool CanUseConstruction()
819 {
820 return true;
821 }
822
824 {
825 return true;
826 }
827
828 protected bool IsAttachmentSlotLocked( EntityAI attachment )
829 {
830 if ( attachment )
831 {
832 InventoryLocation inventory_location = new InventoryLocation;
833 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
834
835 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
836 }
837
838 return false;
839 }
840
841 protected bool IsAttachmentSlotLocked( string slot_name )
842 {
843 return GetInventory().GetSlotLock( InventorySlots.GetSlotIdFromString( slot_name ) );
844 }
845
846 //--- ATTACHMENT SLOTS
847 void GetAttachmentSlots( EntityAI entity, out array<string> attachment_slots )
848 {
849 string config_path = "CfgVehicles" + " " + entity.GetType() + " " + "attachments";
850 if ( g_Game.ConfigIsExisting( config_path ) )
851 {
852 g_Game.ConfigGetTextArray( config_path, attachment_slots );
853 }
854 }
855
856 bool CheckSlotVerticalDistance( int slot_id, PlayerBase player )
857 {
858 return true;
859 }
860
861 protected bool CheckMemoryPointVerticalDistance( float max_dist, string selection, PlayerBase player )
862 {
863 return true;
864 }
865
866 protected bool CheckLevelVerticalDistance( float max_dist, string selection, PlayerBase player )
867 {
868 return true;
869 }
870
871 // --- INIT
873 {
874 m_Construction = new Construction(this);
875 return m_Construction;
876 }
877
879 {
880 return m_Construction;
881 }
882
887
889 {
890 int attachment_count = GetInventory().AttachmentCount();
891 if ( attachment_count > 0 )
892 {
893 if ( HasBase() && attachment_count == 1 )
894 {
895 return false;
896 }
897
898 return true;
899 }
900
901 return false;
902 }
903
904 override bool ShowZonesHealth()
905 {
906 return true;
907 }
908
909 override bool IsTakeable()
910 {
911 return false;
912 }
913
914 //this into/outo parent.Cargo
915 override bool CanPutInCargo( EntityAI parent )
916 {
917 return false;
918 }
919
920 override bool CanRemoveFromCargo( EntityAI parent )
921 {
922 return false;
923 }
924
925 //hands
926 override bool CanPutIntoHands( EntityAI parent )
927 {
928 return false;
929 }
930
931 //--- ACTION CONDITIONS
932 //direction
933 override bool IsFacingPlayer( PlayerBase player, string selection )
934 {
935 return true;
936 }
937
938 override bool IsPlayerInside( PlayerBase player, string selection )
939 {
940 return true;
941 }
942
945 {
946 return false;
947 }
948
949 //roof check
950 bool PerformRoofCheckForBase( string partName, PlayerBase player, out bool result )
951 {
952 return false;
953 }
954
955 //selection->player distance check
956 bool HasProperDistance( string selection, PlayerBase player )
957 {
958 return true;
959 }
960
961 //folding
963 {
964 if ( HasBase() || GetInventory().AttachmentCount() > 0 )
965 {
966 return false;
967 }
968
969 return true;
970 }
971
973 {
976
977 return item;
978 }
979
980 //Damage triggers (barbed wire)
981 void CreateAreaDamage( string slot_name, float rotation_angle = 0 )
982 {
983 if ( g_Game && g_Game.IsServer() )
984 {
985 //destroy area damage if some already exists
986 DestroyAreaDamage( slot_name );
987
988 //create new area damage
990 areaDamage.SetDamageComponentType(AreaDamageComponentTypes.HITZONE);
991
992 vector min_max[2];
993 if ( MemoryPointExists( slot_name + "_min" ) )
994 {
995 min_max[0] = GetMemoryPointPos( slot_name + "_min" );
996 }
997 if ( MemoryPointExists( slot_name + "_max" ) )
998 {
999 min_max[1] = GetMemoryPointPos( slot_name + "_max" );
1000 }
1001
1002 //get proper trigger extents (min<max)
1003 vector extents[2];
1004 GetConstruction().GetTriggerExtents( min_max, extents );
1005
1006 //get box center
1007 vector center;
1008 center = GetConstruction().GetBoxCenter( min_max );
1009 center = ModelToWorld( center );
1010
1011 //rotate center if needed
1013 CalcDamageAreaRotation( rotation_angle, center, orientation );
1014
1015 areaDamage.SetExtents( extents[0], extents[1] );
1016 areaDamage.SetAreaPosition( center );
1017 areaDamage.SetAreaOrientation( orientation );
1018 areaDamage.SetLoopInterval( 1.0 );
1019 areaDamage.SetDeferDuration( 0.2 );
1020 areaDamage.SetHitZones( { "Torso","LeftHand","LeftLeg","LeftFoot","RightHand","RightLeg","RightFoot" } );
1021 areaDamage.SetAmmoName( "BarbedWireHit" );
1022 areaDamage.Spawn();
1023
1024 m_DamageTriggers.Insert( slot_name, areaDamage );
1025 }
1026 }
1027
1028 void CalcDamageAreaRotation( float angle_deg, out vector center, out vector orientation )
1029 {
1030 if ( angle_deg != 0 )
1031 {
1032 //orientation
1033 orientation[0] = orientation[0] - angle_deg;
1034
1035 //center
1036 vector rotate_axis;
1037 if ( MemoryPointExists( "rotate_axis" ) )
1038 {
1039 rotate_axis = ModelToWorld( GetMemoryPointPos( "rotate_axis" ) );
1040 }
1041 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];
1042 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];
1043 center[0] = r_center_x;
1044 center[2] = r_center_z;
1045 }
1046 }
1047
1048 void DestroyAreaDamage( string slot_name )
1049 {
1050 if (g_Game && g_Game.IsServer())
1051 {
1053 if (m_DamageTriggers.Find(slot_name, areaDamage))
1054 {
1055 if (areaDamage)
1056 {
1057 areaDamage.Destroy();
1058 }
1059
1060 m_DamageTriggers.Remove( slot_name );
1061 }
1062 }
1063 }
1064
1066 {
1067 return true;
1068 }
1069
1070 //================================================================
1071 // SOUNDS
1072 //================================================================
1073 protected void SoundBuildStart( string part_name )
1074 {
1075 PlaySoundSet( m_Sound, GetBuildSoundByMaterial( part_name ), 0.1, 0.1 );
1076 }
1077
1078 protected void SoundDismantleStart( string part_name )
1079 {
1080 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
1081 }
1082
1083 protected void SoundDestroyStart( string part_name )
1084 {
1085 PlaySoundSet( m_Sound, GetDismantleSoundByMaterial( part_name ), 0.1, 0.1 );
1086 }
1087
1088 protected string GetBuildSoundByMaterial( string part_name )
1089 {
1090 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
1091
1092 switch ( material_type )
1093 {
1094 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_BUILD_WOOD_LOG;
1095 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_BUILD_WOOD_PLANK;
1096 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_BUILD_WOOD_STAIRS;
1097 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_BUILD_METAL;
1098 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_BUILD_WIRE;
1099 }
1100
1101 return "";
1102 }
1103
1104 protected string GetDismantleSoundByMaterial( string part_name )
1105 {
1106 ConstructionMaterialType material_type = GetConstruction().GetMaterialType( part_name );
1107
1108 switch ( material_type )
1109 {
1110 case ConstructionMaterialType.MATERIAL_LOG: return SOUND_DISMANTLE_WOOD_LOG;
1111 case ConstructionMaterialType.MATERIAL_WOOD: return SOUND_DISMANTLE_WOOD_PLANK;
1112 case ConstructionMaterialType.MATERIAL_STAIRS: return SOUND_DISMANTLE_WOOD_STAIRS;
1113 case ConstructionMaterialType.MATERIAL_METAL: return SOUND_DISMANTLE_METAL;
1114 case ConstructionMaterialType.MATERIAL_WIRE: return SOUND_DISMANTLE_WIRE;
1115 }
1116
1117 return "";
1118 }
1119
1120 //misc
1121 void CheckForHybridAttachments( EntityAI item, string slot_name )
1122 {
1123 if (!g_Game.IsMultiplayer() || g_Game.IsServer())
1124 {
1125 //if this is a hybrid attachment, set damage of appropriate damage zone. Zone name must match slot name...WIP
1126 if (m_HybridAttachments && m_HybridAttachments.Find(slot_name) != -1)
1127 {
1128 SetHealth(slot_name,"Health",item.GetHealth());
1129 }
1130 }
1131 }
1132
1134 {
1135 return 111;
1136 }
1137
1138 override void SetActions()
1139 {
1140 super.SetActions();
1141
1145 }
1146
1148 {
1149 Construction construction = GetConstruction();
1150 if (!construction)
1151 return;
1152
1153 map<string, ref ConstructionPart> constructionParts = construction.GetConstructionParts();
1154 for ( int i = constructionParts.Count() - 1; i >= 0; --i )
1155 {
1156 ConstructionPart part = constructionParts.GetElement(i);
1157 if (part && part.IsBuilt() && !part.IsUtilityPart())
1158 {
1159 construction.DestroyPartServer(null, part.GetPartName(), -1);
1160 }
1161 }
1162 }
1163
1165 {
1166 Construction construction = GetConstruction();
1167 if (!construction)
1168 return;
1169
1170 map<string, ref ConstructionPart> constructionParts = construction.GetConstructionParts();
1171 for ( int i = constructionParts.Count() - 1; i >= 0; --i )
1172 {
1173 ConstructionPart part = constructionParts.GetElement(i);
1174 if (part && part.IsBuilt() && !part.IsUtilityPart())
1175 {
1176 construction.HandleEntityFalling(part.GetPartName());
1177 }
1178 }
1179 }
1180
1182 override void OnItemFallRebuilding()
1183 {
1184 if (!g_Game.IsServer())
1185 return;
1186
1189
1190 if (DestroyOnFall())
1191 {
1193 {
1195 }
1196 else
1197 {
1199 {
1201 }
1202 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(g_Game.ObjectDelete, 100, false, this);
1203 }
1204 }
1205 }
1206
1208 {
1209 if (HasAnyAttachmentsOrCargo())
1210 {
1212 MiscGameplayFunctions.ThrowAllItemsInInventoryEx(this, ThrowEntityFlags.NONE, vector.Zero);
1213 }
1214 }
1215
1216 //================================================================
1217 // DEBUG
1218 //================================================================
1219
1222 {
1223 return null;
1224 }
1225
1226 override void OnDebugSpawn()
1227 {
1228 FullyBuild();
1229 }
1230
1232 {
1234 array<ConstructionPart> parts = GetConstruction().GetConstructionParts().GetValueArray();
1235
1236 Man p;
1237
1238 #ifdef SERVER
1239 array<Man> players = new array<Man>;
1240 g_Game.GetWorld().GetPlayerList(players);
1241 if (players.Count())
1242 p = players[0];
1243 #else
1244 p = g_Game.GetPlayer();
1245 #endif
1246
1247 foreach (ConstructionPart part : parts)
1248 {
1249 bool excluded = false;
1250 string partName = part.GetPartName();
1251 if (excludes)
1252 {
1253 foreach (string exclude : excludes)
1254 {
1255 if (partName.Contains(exclude))
1256 {
1257 excluded = true;
1258 break;
1259 }
1260 }
1261 }
1262
1263 if (!excluded)
1264 {
1265 OnPartBuiltServer(p, partName, AT_BUILD_PART);
1266 }
1267 }
1268
1269 GetConstruction().UpdateVisuals();
1270 }
1271
1273 //Deprecated code playpen//
1275 [Obsolete("handled in the Construction component directly")]
1277 {
1278 }
1279
1280 [Obsolete("handled in the Construction component directly")]
1281 protected void ItemFall(vector min, vector max)
1282 {
1283 }
1284
1285 [Obsolete("obsolete debug method")]
1286 protected void DebugCustomState()
1287 {
1288 }
1289}
1290
1291void bsbDebugPrint (string s)
1293#ifdef BSB_DEBUG
1294 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
1295#else
1296 //Print("" + s); // comment/uncomment to hide/see debug logs
1297#endif
1299void bsbDebugSpam (string s)
1301#ifdef BSB_DEBUG_SPAM
1302 PrintToRPT("" + s); // comment/uncomment to hide/see debug logs
1303#else
1304 //Print("" + s); // comment/uncomment to hide/see debug logs
1305#endif
1306}
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
const int AT_BUILD_PART
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:1910
void FullyBuild()
Определения BaseBuildingBase.c:2519
void SetActionFromSyncData()
Определения BaseBuildingBase.c:1536
void DropAttachmentAndCargoItems()
Определения BaseBuildingBase.c:2495
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:2371
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:2361
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2000
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:2316
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1425
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:1764
void DestroyConstruction()
Определения BaseBuildingBase.c:1690
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2392
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:2116
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1870
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:1523
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:1595
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:1356
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:2409
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:2135
void OnPartDestroyedClient(string part_name, int action_id)
Определения BaseBuildingBase.c:1950
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:1454
void bsbDebugSpam(string s)
Определения BaseBuildingBase.c:1299
Construction GetConstruction()
Определения BaseBuildingBase.c:2171
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:2366
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:1611
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
Определения BaseBuildingBase.c:1291
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:1553
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:2070
void HandleFallingForConstructedParts()
Определения BaseBuildingBase.c:2452
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:2376
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:1653
bool HasBase()
Определения BaseBuildingBase.c:1632
void SynchronizeBaseState()
Определения BaseBuildingBase.c:1396
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:1637
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:1483
void DestroyConstructedParts()
Определения BaseBuildingBase.c:2435
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:38
PlayerSpawnPreset slotName
void InitVisuals()
init ConstructionPart visuals
Определения ConstructionBase.c:439
ConstructionMaterialType
used to guide action sound selection, mostly. Could be also used for particles and stuff,...
Определения ConstructionBase.c:3
DayZGame g_Game
Определения DayZGame.c:4074
vector orientation
Определения DustKickupEffects.c:21
void DestroyAreaDamage()
Определения FireplaceBase.c:2363
void CreateAreaDamage()
Определения FireplaceBase.c:2347
Empty
Определения Hand_States.c:14
string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:1390
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:4407
string GetFoldSoundset()
Определения BaseBuildingBase.c:1385
bool m_FixDamageSystemInit
Определения ItemBase.c:61
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
ThrowEntityFlags
Определения MiscGameplayFunctions.c:208
Определения 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 void UpdateNavmesh()
Определения Fence.c:572
override bool DestroyOnFall()
Определения Fence.c:887
override array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения Fence.c:897
override void UpdateVisuals()
Определения Watchtower.c:49
override void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения Fence.c:331
override vector GetKitSpawnPosition()
Определения Fence.c:186
Определения Fence.c:2
static bool GetDisableRefundMaterialsOnFall()
Определения CfgGameplayHandler.c:362
static bool GetDisableDropAttachmentsOnFall()
Определения CfgGameplayHandler.c:357
static bool GetDisableItemFalling()
Определения CfgGameplayHandler.c:352
override void DestroyPartServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения Construction.c:93
just declared for module 3 use
Определения Construction_Basic.c:3
Used in BBB objects.
Определения Construction.c:3
int GetId()
Определения ConstructionPart.c:208
string GetPartName()
Определения ConstructionPart.c:198
bool IsBase()
Определения ConstructionPart.c:273
bool IsBuilt()
Определения ConstructionPart.c:160
bool IsUtilityPart()
Определения ConstructionPart.c:233
Instanced construction part data classes for dynamic data, statics now stored on EntityType level in ...
Определения ConstructionPart.c:4
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:30
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:662
override void EEItemAttached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:515
bool CanFoldBaseBuildingObject()
Определения BaseBuildingBase.c:962
void OnPartDismantledClient(string part_name, int action_id)
Определения BaseBuildingBase.c:622
void RegisterPartForSync(int part_id)
Определения BaseBuildingBase.c:137
override string GetFoldSoundset()
Определения BaseBuildingBase.c:97
void SoundDestroyStart(string part_name)
Определения BaseBuildingBase.c:1083
ref map< string, ref AreaDamageManager > m_DamageTriggers
Определения BaseBuildingBase.c:33
void SetPartFromSyncData(ConstructionPart part)
Определения BaseBuildingBase.c:265
const string SOUND_BUILD_WOOD_PLANK
Определения BaseBuildingBase.c:20
void UpdateVisuals()
Определения BaseBuildingBase.c:693
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
Определения BaseBuildingBase.c:944
override void OnItemFallRebuilding()
@Note for modders: This method and is subject to change!
Определения BaseBuildingBase.c:1182
bool IsAttachmentSlotLocked(string slot_name)
Определения BaseBuildingBase.c:841
void DebugCustomState()
Определения BaseBuildingBase.c:1286
void SetBaseState(bool has_base)
Определения BaseBuildingBase.c:349
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения BaseBuildingBase.c:432
int m_SyncParts02
Определения BaseBuildingBase.c:11
ref array< string > m_Mountables
Определения BaseBuildingBase.c:35
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:712
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
Определения BaseBuildingBase.c:629
override void EEOnAfterLoad()
Определения BaseBuildingBase.c:505
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:409
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
Определения BaseBuildingBase.c:532
void UnregisterPartForSync(int part_id)
Определения BaseBuildingBase.c:166
int m_SyncParts03
Определения BaseBuildingBase.c:12
ItemBase FoldBaseBuildingObject()
Определения BaseBuildingBase.c:972
override bool CanPutIntoHands(EntityAI parent)
Определения BaseBuildingBase.c:926
void SetActionFromSyncData()
Определения BaseBuildingBase.c:248
override void SetActions()
Определения BaseBuildingBase.c:1138
int m_InteractedPartId
Определения BaseBuildingBase.c:13
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:589
const string ANIMATION_DEPLOYED
Определения BaseBuildingBase.c:4
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:102
int m_SyncParts01
Определения BaseBuildingBase.c:10
void ItemFall(vector min, vector max)
Определения BaseBuildingBase.c:1281
override string GetInvulnerabilityTypeString()
Определения BaseBuildingBase.c:68
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1133
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:866
bool IsAttachmentSlotLocked(EntityAI attachment)
Определения BaseBuildingBase.c:828
override ConstructionBasic GetConstructionBasic()
Определения BaseBuildingBase.c:878
vector GetKitSpawnPosition()
Определения BaseBuildingBase.c:385
const string SOUND_BUILD_WOOD_STAIRS
Определения BaseBuildingBase.c:21
override bool CanUseConstructionBuild()
Определения BaseBuildingBase.c:823
string GetDismantleSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:1104
void DestroyConstructionKit(ItemBase construction_kit)
Определения BaseBuildingBase.c:395
void DestroyConstruction()
Определения BaseBuildingBase.c:402
void BaseBuildingBase()
Определения BaseBuildingBase.c:38
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
Определения BaseBuildingBase.c:856
void SoundBuildStart(string part_name)
Определения BaseBuildingBase.c:1073
bool IsOpened()
Определения BaseBuildingBase.c:359
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override int GetHideIconMask()
Определения BaseBuildingBase.c:78
string GetBuildSoundByMaterial(string part_name)
Определения BaseBuildingBase.c:1088
const string SOUND_DISMANTLE_METAL
Определения BaseBuildingBase.c:28
string GetConstructionKitType()
Определения BaseBuildingBase.c:390
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:497
override void OnStoreSave(ParamsWriteContext ctx)
Определения BaseBuildingBase.c:420
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
Определения BaseBuildingBase.c:861
override void AfterStoreLoad()
Определения BaseBuildingBase.c:466
override bool IgnoreOutOfReachCondition()
Определения BaseBuildingBase.c:542
void OnSynchronizedClient()
Определения BaseBuildingBase.c:124
void OnPartBuiltClient(string part_name, int action_id)
Определения BaseBuildingBase.c:582
Construction GetConstruction()
Определения BaseBuildingBase.c:883
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:938
override bool ShowZonesHealth()
Определения BaseBuildingBase.c:904
override void EEItemDetached(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:524
void DestroyAreaDamage(string slot_name)
Определения BaseBuildingBase.c:1048
override void OnVariablesSynchronized()
Определения BaseBuildingBase.c:116
void SynchronizeBaseState()
Определения BaseBuildingBase.c:108
void DestroyConstructedParts()
Определения BaseBuildingBase.c:1147
override bool CanRemoveFromCargo(EntityAI parent)
Определения BaseBuildingBase.c:920
const string SOUND_DISMANTLE_WOOD_LOG
Определения BaseBuildingBase.c:25
void SoundDismantleStart(string part_name)
Определения BaseBuildingBase.c:1078
override bool CanObstruct()
Определения BaseBuildingBase.c:73
void UpdateNavmesh()
Определения BaseBuildingBase.c:812
override bool CanPutInCargo(EntityAI parent)
Определения BaseBuildingBase.c:915
ConstructionBasic CreateConstructionComponent()
Определения BaseBuildingBase.c:872
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
Определения BaseBuildingBase.c:847
override void OnDebugSpawn()
Определения BaseBuildingBase.c:1226
bool m_HasBase
Определения BaseBuildingBase.c:8
void UpdatePhysics()
Определения BaseBuildingBase.c:746
void CreateConstructionKitInHands(notnull PlayerBase player)
Определения BaseBuildingBase.c:376
void InitVisuals()
Определения BaseBuildingBase.c:677
ref array< string > m_HybridAttachments
Определения BaseBuildingBase.c:34
bool HasAttachmentsBesidesBase()
Определения BaseBuildingBase.c:888
void FullyBuild()
Определения BaseBuildingBase.c:1231
override bool CanUseConstruction()
Определения BaseBuildingBase.c:818
override bool IsTakeable()
Определения BaseBuildingBase.c:909
float m_ConstructionKitHealth
Определения BaseBuildingBase.c:6
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1065
override void InitItemSounds()
Определения BaseBuildingBase.c:83
EffectSound m_Sound
Определения BaseBuildingBase.c:31
bool IsPartBuildInSyncData(int part_id)
Определения BaseBuildingBase.c:195
void DropAttachmentAndCargoItems()
Определения BaseBuildingBase.c:1207
void CreateAreaDamage(string slot_name, float rotation_angle=0)
Определения BaseBuildingBase.c:981
const string SOUND_BUILD_WIRE
Определения BaseBuildingBase.c:23
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
Определения BaseBuildingBase.c:549
const string SOUND_DISMANTLE_WOOD_STAIRS
Определения BaseBuildingBase.c:27
const string SOUND_BUILD_METAL
Определения BaseBuildingBase.c:22
void SetPartsFromSyncData()
Определения BaseBuildingBase.c:307
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:933
void BarbedWire()
Определения BarbedWire.c:31
bool HasBase()
Определения BaseBuildingBase.c:344
ConstructionPart GetConstructionPartById(int id)
Определения BaseBuildingBase.c:323
const string SOUND_DISMANTLE_WIRE
Определения BaseBuildingBase.c:29
void SetPartsAfterStoreLoad()
Определения BaseBuildingBase.c:476
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
Определения BaseBuildingBase.c:1028
void CheckForHybridAttachments(EntityAI item, string slot_name)
Определения BaseBuildingBase.c:1121
void InitBaseState()
Определения BaseBuildingBase.c:669
ref ConstructionBasic m_Construction
Определения BaseBuildingBase.c:15
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
Определения BaseBuildingBase.c:1221
bool HasProperDistance(string selection, PlayerBase player)
Определения BaseBuildingBase.c:956
override bool IsDeployable()
Определения BaseBuildingBase.c:354
void RegisterActionForSync(int part_id, int action_id)
Определения BaseBuildingBase.c:235
void HandleFallingForConstructedParts()
Определения BaseBuildingBase.c:1164
const string SOUND_DISMANTLE_WOOD_PLANK
Определения BaseBuildingBase.c:26
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
Определения BaseBuildingBase.c:782
void ResetActionSyncData()
Определения BaseBuildingBase.c:241
const string SOUND_BUILD_WOOD_LOG
Определения BaseBuildingBase.c:19
void HandleItemFalling(ConstructionPart part)
Определения BaseBuildingBase.c:1276
ItemBase CreateConstructionKit()
Определения BaseBuildingBase.c:365
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения BaseBuildingBase.c:950
int m_PerformedActionId
Определения BaseBuildingBase.c:14
static bool IsBaseBuildingLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:809
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения Transport.c:70
static const vector Zero
Определения EnConvert.c:123
Определения EnConvert.c:119
override string GetDebugName()
Определения dayzplayer.c:1191
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
void Obsolete(string msg="")
Определения EnScript.c:371
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
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
bool Contains(string sample)
Returns true if sample is substring of string.
Определения EnString.c:286
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8