44 RegisterNetSyncVariableInt(
"m_SyncParts01" );
45 RegisterNetSyncVariableInt(
"m_SyncParts02" );
46 RegisterNetSyncVariableInt(
"m_SyncParts03" );
47 RegisterNetSyncVariableInt(
"m_InteractedPartId" );
48 RegisterNetSyncVariableInt(
"m_PerformedActionId" );
49 RegisterNetSyncVariableBool(
"m_HasBase" );
54 if (ConfigIsExisting(
"hybridAttachments"))
59 if (ConfigIsExisting(
"mountables"))
70 super.EEDelete(parent);
81 return "disableBaseDamage";
91 return EInventoryIconVisibility.HIDE_VICINITY;
96 super.InitItemSounds();
100 params.m_Loop =
true;
110 return "putDown_FenceKit_SoundSet";
115 return "Shelter_Site_Build_Loop_SoundSet";
130 super.OnVariablesSynchronized();
154 if ( part_id >= 1 && part_id <= 31 )
156 offset = part_id - 1;
161 else if ( part_id >= 32 && part_id <= 62 )
163 offset = ( part_id % 32 );
168 else if ( part_id >= 63 && part_id <= 93 )
170 offset = ( part_id % 63 );
183 if ( part_id >= 1 && part_id <= 31 )
185 offset = part_id - 1;
190 else if ( part_id >= 32 && part_id <= 62 )
192 offset = ( part_id % 32 );
197 else if ( part_id >= 63 && part_id <= 93 )
199 offset = ( part_id % 63 );
212 if ( part_id >= 1 && part_id <= 31 )
214 offset = part_id - 1;
222 else if ( part_id >= 32 && part_id <= 62 )
224 offset = ( part_id % 32 );
232 else if ( part_id >= 63 && part_id <= 93 )
234 offset = ( part_id % 63 );
266 switch( build_action_id )
278 string key = part.m_PartName;
279 bool is_base = part.IsBase();
281 bsbDebugSpam(
"[bsb] " +
GetDebugName(
this) +
" SetPartFromSyncData try to sync: built=" + is_part_built_sync +
" key=" + key +
" part=" + part.GetPartName() +
" part_built=" + part.IsBuilt());
282 if ( is_part_built_sync )
284 if ( !part.IsBuilt() )
299 if ( part.IsBuilt() )
314 GetConstruction().SetLockOnAttachedMaterials( part.GetPartName(), part.IsBuilt() );
323 for (
int i = 0; i < construction_parts.Count(); ++i )
325 string key = construction_parts.GetKey( i );
339 for (
int i = 0; i < construction_parts.Count(); ++i )
341 string key = construction_parts.GetKey( i );
344 if ( value.GetId() ==
id )
384 return construction_kit;
409 GetGame().ObjectDelete( construction_kit );
416 GetGame().ObjectDelete(
this );
422 super.OnStoreSave( ctx );
434 if ( !super.OnStoreLoad( ctx, version ) )
468 super.AfterStoreLoad();
491 super.OnCreatePhysics();
501 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
507 string part_name = zone;
512 ConstructionPart construction_part = construction.GetConstructionPart( part_name );
514 if ( construction_part && construction.IsPartConstructed( part_name ) )
517 construction.DestroyConnectedParts(part_name);
521 if ( part_name.Contains(
"barbed") )
523 BarbedWire barbed_wire = BarbedWire.Cast( FindAttachmentBySlotName( zone ) );
525 barbed_wire.SetMountedState(
false );
537 super.EEOnAfterLoad();
555 super.EEItemAttached( item, slot_name );
564 super.EEItemDetached( item, slot_name );
573 if (
LogManager.IsBaseBuildingLogEnable())
bsbDebugPrint(
"inv: OnSetSlotLock " +
GetDebugName(
this ) +
" slot=" + slot_name +
" locked=" + locked +
" was_locked=" + was_locked );
592 if (construtionPart.IsBase())
653 if (construtionPart.IsBase())
693 if (construtionPart.IsBase())
709 bool process =
false;
712 process |= part.m_PartName.Contains(
"_roof");
713 process |= part.m_PartName.Contains(
"_platform");
714 process |= part.m_PartName.Contains(
"_stair");
718 if (!MemoryPointExists(part.m_PartName +
"_min") || !MemoryPointExists(part.m_PartName +
"_max"))
720 Debug.Log(
"min/max memory points do not exist for part: " + part.m_PartName);
725 mins = ModelToWorld(GetMemoryPointPos(part.m_PartName +
"_min"));
726 maxs = ModelToWorld(GetMemoryPointPos(part.m_PartName +
"_max"));
730 minTmp[0] =
Math.Min(mins[0],maxs[0]);
731 maxTmp[0] =
Math.Max(mins[0],maxs[0]);
732 minTmp[1] =
Math.Min(mins[1],maxs[1]);
733 maxTmp[1] =
Math.Max(mins[1],maxs[1]);
734 minTmp[2] =
Math.Min(mins[2],maxs[2]);
735 maxTmp[2] =
Math.Max(mins[2],maxs[2]);
739 maxs[1] = maxs[1] + 0.35;
749 DayZPlayerUtils.PhysicsGetEntitiesInBox(min,max,foundEntities);
753 foreach (
EntityAI entity : foundEntities)
756 item.ThrowPhysically(null,
vector.Zero);
791 foreach (
string slotName : attachmentSlots)
807 string slotNameMounted = slot_name +
"_Mounted";
808 EntityAI attachment = FindAttachmentBySlotName(slot_name);
812 BarbedWire barbedWire = BarbedWire.Cast(attachment);
813 if (barbedWire && barbedWire.IsMounted())
820 SetAnimationPhase(slotNameMounted, 0);
821 SetAnimationPhase(slot_name, 1);
825 SetAnimationPhase(slotNameMounted, 1);
826 SetAnimationPhase(slot_name, 0);
831 SetAnimationPhase(slotNameMounted, 1);
832 SetAnimationPhase(slot_name, 1);
850 foreach (
string slotName : attachmentSlots)
881 string slot_name_mounted = slot_name +
"_Mounted";
882 EntityAI attachment = FindAttachmentBySlotName( slot_name );
886 RemoveProxyPhysics( slot_name_mounted );
887 RemoveProxyPhysics( slot_name );
895 AddProxyPhysics( slot_name_mounted );
900 AddProxyPhysics( slot_name );
907 SetAffectPathgraph(
true,
false );
926 attachment.GetInventory().GetCurrentInventoryLocation( inventory_location );
928 return GetInventory().GetSlotLock( inventory_location.GetSlot() );
936 return GetInventory().GetSlotLock(
InventorySlots.GetSlotIdFromString( slot_name ) );
942 string config_path =
"CfgVehicles" +
" " + entity.GetType() +
" " +
"attachments";
943 if (
GetGame().ConfigIsExisting( config_path ) )
945 GetGame().ConfigGetTextArray( config_path, attachment_slots );
984 return super.CanReceiveAttachment(attachment, slotId);
989 int attachment_count = GetInventory().AttachmentCount();
990 if ( attachment_count > 0 )
992 if (
HasBase() && attachment_count == 1 )
1069 if (
HasBase() || GetInventory().AttachmentCount() > 0 )
1098 if ( MemoryPointExists( slot_name +
"_min" ) )
1100 min_max[0] = GetMemoryPointPos( slot_name +
"_min" );
1102 if ( MemoryPointExists( slot_name +
"_max" ) )
1104 min_max[1] = GetMemoryPointPos( slot_name +
"_max" );
1114 center = ModelToWorld( center );
1120 areaDamage.SetExtents( extents[0], extents[1] );
1121 areaDamage.SetAreaPosition( center );
1122 areaDamage.SetAreaOrientation( orientation );
1123 areaDamage.SetLoopInterval( 1.0 );
1124 areaDamage.SetDeferDuration( 0.2 );
1125 areaDamage.SetHitZones( {
"Torso",
"LeftHand",
"LeftLeg",
"LeftFoot",
"RightHand",
"RightLeg",
"RightFoot" } );
1126 areaDamage.SetAmmoName(
"BarbedWireHit" );
1135 if ( angle_deg != 0 )
1138 orientation[0] = orientation[0] - angle_deg;
1142 if ( MemoryPointExists(
"rotate_axis" ) )
1144 rotate_axis = ModelToWorld( GetMemoryPointPos(
"rotate_axis" ) );
1146 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];
1147 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];
1148 center[0] = r_center_x;
1149 center[2] = r_center_z;
1162 areaDamage.Destroy();
1197 switch ( material_type )
1213 switch ( material_type )
1233 SetHealth(slot_name,
"Health",item.GetHealth());
1279 GetGame().GetWorld().GetPlayerList(players);
1280 if (players.Count())
1288 bool excluded =
false;
1289 string partName = part.GetPartName();
1292 foreach (
string exclude : excludes)
1294 if (partName.Contains(exclude))
1322#ifdef BSB_DEBUG_SPAM
const int AT_DISMANTLE_PART
const int AT_DESTROY_PART
void AddAction(typename actionName)
void RemoveAction(typename actionName)
void OnPartDismantledClient(string part_name, int action_id)
const string ANIMATION_DEPLOYED
void SetActionFromSyncData()
void SoundDestroyStart(string part_name)
const string SOUND_BUILD_WOOD_LOG
void SoundBuildStart(string part_name)
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
void RegisterPartForSync(int part_id)
const string SOUND_DISMANTLE_METAL
void SetPartsAfterStoreLoad()
void DestroyConstruction()
ref array< string > m_HybridAttachments
string GetDismantleSoundByMaterial(string part_name)
bool IsAttachmentSlotLocked(EntityAI attachment)
void OnPartBuiltClient(string part_name, int action_id)
void RegisterActionForSync(int part_id, int action_id)
const string SOUND_BUILD_WOOD_PLANK
void SetPartsFromSyncData()
ref array< string > m_Mountables
const string SOUND_BUILD_WIRE
void ResetActionSyncData()
override string GetInvulnerabilityTypeString()
void CheckForHybridAttachments(EntityAI item, string slot_name)
ref Construction m_Construction
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
void OnPartDestroyedClient(string part_name, int action_id)
void UnregisterPartForSync(int part_id)
void bsbDebugSpam(string s)
Construction GetConstruction()
void SoundDismantleStart(string part_name)
ConstructionPart GetConstructionPartById(int id)
const string SOUND_DISMANTLE_WOOD_PLANK
const string SOUND_DISMANTLE_WOOD_LOG
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
const string SOUND_BUILD_WOOD_STAIRS
void SetPartFromSyncData(ConstructionPart part)
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
string GetBuildSoundByMaterial(string part_name)
ItemBase CreateConstructionKit()
const string SOUND_DISMANTLE_WIRE
float m_ConstructionKitHealth
void ItemFall(vector min, vector max)
Disconnected temporarily.
void OnSynchronizedClient()
void SynchronizeBaseState()
ref map< string, ref AreaDamageManager > m_DamageTriggers
void SetBaseState(bool has_base)
const string SOUND_BUILD_METAL
bool IsPartBuildInSyncData(int part_id)
const string SOUND_DISMANTLE_WOOD_STAIRS
const int ECE_PLACE_ON_SURFACE
PlayerSpawnPreset slotName
A particular version of the deferred loop used to not damage players inside vehicles.
override string GetConstructionKitType()
override array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
override void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
override vector GetKitSpawnPosition()
Super root of all classes in Enforce script.
Wrapper class for managing sound through SEffectManager.
provides access to slot configuration
void OnPartDestroyedClient(string part_name, int action_id)
override void EEItemAttached(EntityAI item, string slot_name)
bool CanFoldBaseBuildingObject()
void OnPartDismantledClient(string part_name, int action_id)
void RegisterPartForSync(int part_id)
override string GetFoldSoundset()
void SoundDestroyStart(string part_name)
ref map< string, ref AreaDamageManager > m_DamageTriggers
void SetPartFromSyncData(ConstructionPart part)
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
bool IsAttachmentSlotLocked(string slot_name)
void SetBaseState(bool has_base)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
ref array< string > m_Mountables
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
override void EEOnAfterLoad()
bool IsFacingCamera(string selection)
override void EEDelete(EntityAI parent)
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
void UnregisterPartForSync(int part_id)
ItemBase FoldBaseBuildingObject()
override bool CanPutIntoHands(EntityAI parent)
void SetActionFromSyncData()
override void SetActions()
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
override string GetLoopFoldSoundset()
void ItemFall(vector min, vector max)
Disconnected temporarily.
override string GetInvulnerabilityTypeString()
override int GetDamageSystemVersionChange()
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
bool IsAttachmentSlotLocked(EntityAI attachment)
vector GetKitSpawnPosition()
override bool CanUseConstructionBuild()
string GetDismantleSoundByMaterial(string part_name)
void DestroyConstructionKit(ItemBase construction_kit)
void DestroyConstruction()
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
void SoundBuildStart(string part_name)
override void OnCreatePhysics()
override int GetHideIconMask()
string GetBuildSoundByMaterial(string part_name)
string GetConstructionKitType()
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
override void AfterStoreLoad()
override bool IgnoreOutOfReachCondition()
void OnSynchronizedClient()
void OnPartBuiltClient(string part_name, int action_id)
Construction GetConstruction()
override bool IsPlayerInside(PlayerBase player, string selection)
override bool ShowZonesHealth()
override void EEItemDetached(EntityAI item, string slot_name)
void DestroyAreaDamage(string slot_name)
override void OnVariablesSynchronized()
void SynchronizeBaseState()
override bool CanRemoveFromCargo(EntityAI parent)
void SoundDismantleStart(string part_name)
override bool CanObstruct()
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
override void OnDebugSpawn()
void CreateConstructionKitInHands(notnull PlayerBase player)
ref array< string > m_HybridAttachments
bool HasAttachmentsBesidesBase()
override bool CanUseConstruction()
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
bool IsPartBuildInSyncData(int part_id)
void CreateAreaDamage(string slot_name, float rotation_angle=0)
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
void SetPartsFromSyncData()
override bool IsFacingPlayer(PlayerBase player, string selection)
ConstructionPart GetConstructionPartById(int id)
void SetPartsAfterStoreLoad()
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
void CheckForHybridAttachments(EntityAI item, string slot_name)
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
bool HasProperDistance(string selection, PlayerBase player)
override bool IsDeployable()
void RegisterActionForSync(int part_id, int action_id)
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
void ResetActionSyncData()
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
ItemBase CreateConstructionKit()
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Serialization general interface. Serializer API works with:
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
void Construction(BaseBuildingBase parent)
override string GetDebugName()
proto native CGame GetGame()
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
class JsonUndergroundAreaTriggerData GetPosition
string GetLoopFoldSoundset()
ItemSoundHandler GetItemSoundHandler()
bool m_FixDamageSystemInit
void ItemSoundHandler(ItemBase parent)