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;
159 m_SyncParts01 = m_SyncParts01 | mask;
161 else if ( part_id >= 32 && part_id <= 62 )
163 offset = ( part_id % 32 );
166 m_SyncParts02 = m_SyncParts02 | mask;
168 else if ( part_id >= 63 && part_id <= 93 )
170 offset = ( part_id % 63 );
173 m_SyncParts03 = m_SyncParts03 | mask;
183 if ( part_id >= 1 && part_id <= 31 )
185 offset = part_id - 1;
188 m_SyncParts01 = m_SyncParts01 & ~mask;
190 else if ( part_id >= 32 && part_id <= 62 )
192 offset = ( part_id % 32 );
195 m_SyncParts02 = m_SyncParts02 & ~mask;
197 else if ( part_id >= 63 && part_id <= 93 )
199 offset = ( part_id % 63 );
202 m_SyncParts03 = m_SyncParts03 & ~mask;
212 if ( part_id >= 1 && part_id <= 31 )
214 offset = part_id - 1;
217 if ( ( m_SyncParts01 & mask ) > 0 )
222 else if ( part_id >= 32 && part_id <= 62 )
224 offset = ( part_id % 32 );
227 if ( ( m_SyncParts02 & mask ) > 0 )
232 else if ( part_id >= 63 && part_id <= 93 )
234 offset = ( part_id % 63 );
237 if ( ( m_SyncParts03 & mask ) > 0 )
248 m_InteractedPartId = part_id;
249 m_PerformedActionId = action_id;
255 m_InteractedPartId = -1;
256 m_PerformedActionId = -1;
261 if ( m_InteractedPartId > -1 && m_PerformedActionId > -1 )
264 int build_action_id = m_PerformedActionId;
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() )
293 RemoveProxyPhysics( ANIMATION_DEPLOYED );
299 if ( part.IsBuilt() )
308 AddProxyPhysics( ANIMATION_DEPLOYED );
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 )
362 m_HasBase = has_base;
379 if ( m_ConstructionKitHealth > 0 )
381 construction_kit.SetHealth( m_ConstructionKitHealth );
384 return construction_kit;
390 if ( m_ConstructionKitHealth > 0 )
392 construction_kit.SetHealth( m_ConstructionKitHealth );
408 m_ConstructionKitHealth = construction_kit.GetHealth();
409 g_Game.ObjectDelete( construction_kit );
416 g_Game.ObjectDelete(
this );
422 super.OnStoreSave( ctx );
425 ctx.Write( m_SyncParts01 );
426 ctx.Write( m_SyncParts02 );
427 ctx.Write( m_SyncParts03 );
429 ctx.Write( m_HasBase );
434 if ( !super.OnStoreLoad( ctx, version ) )
439 if ( !ctx.Read( m_SyncParts01 ) )
444 if ( !ctx.Read( m_SyncParts02 ) )
449 if ( !ctx.Read( m_SyncParts03 ) )
456 if ( !ctx.Read( m_HasBase ) )
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") )
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);
776 SetAnimationPhase( ANIMATION_DEPLOYED, 0 );
780 SetAnimationPhase( ANIMATION_DEPLOYED, 1 );
791 foreach (
string slotName : attachmentSlots)
798 SetAnimationPhase(ANIMATION_DEPLOYED, 0);
800 SetAnimationPhase(ANIMATION_DEPLOYED, 1);
807 string slotNameMounted = slot_name +
"_Mounted";
808 EntityAI attachment = FindAttachmentBySlotName(slot_name);
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)
861 AddProxyPhysics(ANIMATION_DEPLOYED);
868 RemoveProxyPhysics(ANIMATION_DEPLOYED);
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 (
g_Game.ConfigIsExisting( config_path ) )
945 g_Game.ConfigGetTextArray( config_path, attachment_slots );
967 if ( !m_Construction )
977 return m_Construction;
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 g_Game.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 AreaDamageManager(EntityAI parent)
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()
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()
const string SOUND_BUILD_WIRE
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 SynchronizeBaseState()
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 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)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
void Construction(BaseBuildingBase parent)
override string GetDebugName()
Serializer ParamsReadContext
Serializer ParamsWriteContext
proto void PrintToRPT(void var)
Prints content of variable to RPT file (performance warning - each write means fflush!...
vector GetPosition()
Get the world position of the Effect.
string GetLoopFoldSoundset()
ItemSoundHandler GetItemSoundHandler()
bool m_FixDamageSystemInit
void ItemSoundHandler(ItemBase parent)