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();
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 )
279 bool is_base = part.
IsBase();
282 if ( is_part_built_sync )
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 g_Game.ObjectDelete( construction_kit );
416 g_Game.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);
525 barbed_wire.SetMountedState(
false );
537 super.EEOnAfterLoad();
555 super.EEItemAttached( item, slot_name );
564 super.EEItemDetached( item, slot_name );
592 if (construtionPart.
IsBase())
653 if (construtionPart.
IsBase())
693 if (construtionPart.
IsBase())
709 bool process =
false;
718 if (!MemoryPointExists(part.
m_PartName +
"_min") || !MemoryPointExists(part.
m_PartName +
"_max"))
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;
753 foreach (
EntityAI entity : foundEntities)
791 foreach (
string slotName : attachmentSlots)
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)
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() );
942 string config_path =
"CfgVehicles" +
" " + entity.GetType() +
" " +
"attachments";
943 if (
g_Game.ConfigIsExisting( config_path ) )
945 g_Game.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 );
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)
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)
void SoundDestroyStart(string part_name)
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
void SetActionFromSyncData()
void OnPartDestroyedClient(string part_name, int action_id)
string GetBuildSoundByMaterial(string part_name)
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
bool IsPartBuildInSyncData(int part_id)
void SetBaseState(bool has_base)
string GetDismantleSoundByMaterial(string part_name)
ItemBase CreateConstructionKit()
void RegisterPartForSync(int part_id)
Construction GetConstruction()
void SoundDismantleStart(string part_name)
void CheckForHybridAttachments(EntityAI item, string slot_name)
void bsbDebugSpam(string s)
void DestroyConstruction()
void OnPartBuiltClient(string part_name, int action_id)
void RegisterActionForSync(int part_id, int action_id)
class BaseBuildingBase extends ItemBase bsbDebugPrint(string s)
bool IsAttachmentSlotLocked(EntityAI attachment)
void SetPartFromSyncData(ConstructionPart part)
void ItemFall(vector min, vector max)
Disconnected temporarily.
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
void UnregisterPartForSync(int part_id)
void SetPartsFromSyncData()
void SynchronizeBaseState()
void SoundBuildStart(string part_name)
override string GetInvulnerabilityTypeString()
ConstructionPart GetConstructionPartById(int id)
void SetPartsAfterStoreLoad()
const int ECE_PLACE_ON_SURFACE
PlayerSpawnPreset slotName
A particular version of the deferred loop used to not damage players inside vehicles.
override void SetDeferDuration(float time)
override void SetLoopInterval(float time)
override array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
override void UpdateVisuals()
override void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
override vector GetKitSpawnPosition()
Super root of all classes in Enforce script.
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.
Wrapper class for managing sound through SEffectManager.
proto native int GetSlot()
returns slot id if current type is Attachment
provides access to slot configuration
static proto native owned string GetSlotName(int id)
static proto native int GetSlotIdFromString(string slot_name)
const string ANIMATION_DEPLOYED
override void OnDebugSpawn()
void OnPartDismantledServer(notnull Man player, string part_name, int action_id)
override string GetLoopFoldSoundset()
override void OnCreatePhysics()
void OnPartDismantledClient(string part_name, int action_id)
void SoundDestroyStart(string part_name)
void UpdateAttachmentVisuals(string slot_name, bool is_locked)
void CreateAreaDamage(string slot_name, float rotation_angle=0)
const string SOUND_BUILD_WOOD_LOG
void SetActionFromSyncData()
void OnPartDestroyedClient(string part_name, int action_id)
override bool IgnoreOutOfReachCondition()
bool CheckMemoryPointVerticalDistance(float max_dist, string selection, PlayerBase player)
override bool IsFacingPlayer(PlayerBase player, string selection)
void ResetActionSyncData()
override bool CanUseConstruction()
const string SOUND_DISMANTLE_METAL
bool HasAttachmentsBesidesBase()
string GetBuildSoundByMaterial(string part_name)
override void OnStoreSave(ParamsWriteContext ctx)
void GetAttachmentSlots(EntityAI entity, out array< string > attachment_slots)
override bool ShowZonesHealth()
ref array< string > m_HybridAttachments
bool CheckLevelVerticalDistance(float max_dist, string selection, PlayerBase player)
void UpdateAttachmentPhysics(string slot_name, bool is_locked)
bool IsPartBuildInSyncData(int part_id)
void SetBaseState(bool has_base)
string GetDismantleSoundByMaterial(string part_name)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override bool CanPutInCargo(EntityAI parent)
const string SOUND_BUILD_WOOD_PLANK
void OnPartBuiltServer(notnull Man player, string part_name, int action_id)
ref array< string > m_Mountables
const string SOUND_BUILD_WIRE
ItemBase CreateConstructionKit()
bool IsFacingCamera(string selection)
void RegisterPartForSync(int part_id)
Construction GetConstruction()
override bool IsPlayerInside(PlayerBase player, string selection)
ref Construction m_Construction
void SoundDismantleStart(string part_name)
string GetConstructionKitType()
void CheckForHybridAttachments(EntityAI item, string slot_name)
void OnSetSlotLock(int slotId, bool locked, bool was_locked)
void DestroyConstruction()
void HandleItemFalling(ConstructionPart part)
Disconnected temporarily.
override void EEDelete(EntityAI parent)
override void EEItemDetached(EntityAI item, string slot_name)
override int GetDamageSystemVersionChange()
override bool CanObstruct()
bool HasProperDistance(string selection, PlayerBase player)
override void AfterStoreLoad()
void DestroyAreaDamage(string slot_name)
ItemBase FoldBaseBuildingObject()
const string SOUND_DISMANTLE_WOOD_PLANK
void OnPartBuiltClient(string part_name, int action_id)
override void EEOnAfterLoad()
override bool CanPutIntoHands(EntityAI parent)
override int GetHideIconMask()
const string SOUND_DISMANTLE_WOOD_LOG
bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
override bool IsIgnoredByConstruction()
void RegisterActionForSync(int part_id, int action_id)
const string SOUND_BUILD_WOOD_STAIRS
array< string > OnDebugSpawnBuildExcludes()
Excludes certain parts from being built by OnDebugSpawn, uses Contains to compare.
bool MustBeBuiltFromOutside()
Some buildings can only be built from outside.
bool IsAttachmentSlotLocked(EntityAI attachment)
bool CanFoldBaseBuildingObject()
void OnPartDestroyedServer(Man player, string part_name, int action_id, bool destroyed_by_connected_part=false)
override bool CanUseConstructionBuild()
void SetPartFromSyncData(ConstructionPart part)
override bool CanRemoveFromCargo(EntityAI parent)
override bool IsDeployable()
override bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnSynchronizedClient()
override bool IsTakeable()
override void EEItemAttached(EntityAI item, string slot_name)
bool IsAttachmentSlotLocked(string slot_name)
void CreateConstructionKitInHands(notnull PlayerBase player)
const string SOUND_DISMANTLE_WIRE
float m_ConstructionKitHealth
void ItemFall(vector min, vector max)
Disconnected temporarily.
override void OnVariablesSynchronized()
void CalcDamageAreaRotation(float angle_deg, out vector center, out vector orientation)
void UnregisterPartForSync(int part_id)
bool CheckSlotVerticalDistance(int slot_id, PlayerBase player)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
vector GetKitSpawnPosition()
void SetPartsFromSyncData()
void SynchronizeBaseState()
ref map< string, ref AreaDamageManager > m_DamageTriggers
const string SOUND_BUILD_METAL
void SoundBuildStart(string part_name)
override string GetFoldSoundset()
override string GetInvulnerabilityTypeString()
override void InitItemSounds()
void DestroyConstructionKit(ItemBase construction_kit)
override void SetActions()
ConstructionPart GetConstructionPartById(int id)
void SetPartsAfterStoreLoad()
const string SOUND_DISMANTLE_WOOD_STAIRS
static bool IsBaseBuildingLogEnable()
proto bool Write(void value_out)
proto bool Read(void value_in)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
void Construction(BaseBuildingBase parent)
override string GetDebugName()
void DayZPlayerUtils()
cannot be instantiated
Serializer ParamsReadContext
Serializer ParamsWriteContext
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.
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Min(float x, float y)
Returns smaller of two given values.
static const float DEG2RAD
static proto float Sin(float angle)
Returns sinus of angle in radians.
vector GetPosition()
Get the world position of the Effect.
bool Contains(string sample)
Returns true if sample is substring of string.
proto int ToLower()
Changes string to lowercase.
string GetLoopFoldSoundset()
ItemSoundHandler GetItemSoundHandler()
bool m_FixDamageSystemInit
void ItemSoundHandler(ItemBase parent)