49 [
Attribute(
"",
UIWidgets.ResourceNamePicker,
"The building configuration object to use for this building",
"conf",
category:
"Destruction Building")]
52 #ifdef ENABLE_BUILDING_DESTRUCTION
54 [
Attribute(
"0",
UIWidgets.CheckBox,
"Check to update various data in the config (must be defined)",
category:
"EDITOR: Destruction Building")]
55 bool UpdateConfigData;
61 if (!api || api.UndoOrRedoIsRestoring())
64 if (key !=
"UpdateConfigData")
68 entSrc.ClearVariable(
"UpdateConfigData");
73 Print(
"SCR_DestructibleBuildingEntity: Trying to update data in config, but config not defined!");
80 Print(
"SCR_DestructibleBuildingEntity: Trying to update data in config, but config not loaded!");
84 Print(
"SCR_DestructibleBuildingEntity: Updating data in config...");
86 m_BuildingSetup.FillDamagedModels();
91 configBase.Set(
"m_DamagedRegionModels", m_BuildingSetup.m_DamagedRegionModels);
92 configBase.Set(
"m_DamagedRegionIntersectDebrisModels", m_BuildingSetup.m_DamagedRegionIntersectDebrisModels);
94 Print(
"SCR_DestructibleBuildingEntity: Success! Config data updated and stored.");
96 Print(
"SCR_DestructibleBuildingEntity: Failed! Config data was not successfully stored!!");
118 ref array<SCR_BuildingRegionEntity> m_RegionEntities = null;
121 static ref array<IEntity> s_aQueryPropsList =
new array<IEntity>();
126 #ifdef BUILDING_DEBUG_TEMP
128 static ref array<ref Shape> debugShapes =
new array<ref Shape>();
132 protected bool m_bDestroyed =
false;
136 private void RPC_OnRegionDestroyed(
int regionNumber,
bool destroyed,
bool doStructuralIntegrityCheck,
bool doDamageEffects)
139 SetRegionDamage01(regionNumber, 1, doStructuralIntegrityCheck, doDamageEffects,
false);
141 SetRegionDamage01(regionNumber, 0, doStructuralIntegrityCheck, doDamageEffects,
false);
146 override bool RplLoad(ScriptBitReader reader)
149 reader.Read(undamaged, 1);
154 SetDestroyedState(
false);
159 reader.Read(destroyed, 1);
164 SetDestroyedState(
true);
169 SetDestroyedState(
false);
172 int numRegions, regionIndex;
173 reader.Read(numRegions, 16);
174 for (
int i = 0; i < numRegions; i++)
176 reader.Read(regionIndex, 16);
177 SetRegionDamage01(regionIndex, 1,
false,
false,
false);
185 override bool RplSave(ScriptBitWriter writer)
205 autoptr array<int> destroyedRegions =
new array<int>();
206 int numRegions = GetRegionsCount();
207 for (
int i = 0; i < numRegions; i++)
209 if (GetRegionDestroyed(i))
210 destroyedRegions.Insert(i);
212 numRegions = destroyedRegions.Count();
213 writer.Write(numRegions, 16);
214 for (
int i = 0; i < numRegions; i++)
216 writer.Write(destroyedRegions.Get(i), 16);
225 if (!m_BuildingSetup)
231 if (RplSession.Mode() ==
RplMode.Client)
234 SCR_DestructibleBuildingEntityClass prefabData = SCR_DestructibleBuildingEntityClass.Cast(
GetPrefabData());
238 damage = SCR_Global.GetScaledStructuralDamage(damage,
type);
249 vector hitPos = outMat[0];
250 vector hitDir = outMat[1];
253 autoptr TraceParam param =
new TraceParam;
255 param.Start = hitPos + hitDir * -10;
256 param.End = hitPos + hitDir * 10;
258 param.LayerMask = -1;
263 float traceDist = GetWorld().TraceMove(param, SCR_Global.FilterCallback_IgnoreNotInList);
266 SCR_BuildingRegionEntity regionEnt = SCR_BuildingRegionEntity.Cast(param.TraceEnt);
268 hitRegion = regionEnt.GetRegionNumber();
272 if (hitRegion == -1 && m_BuildingSetup)
273 hitRegion = m_BuildingSetup.GetBoundingRegionNumber(CoordToLocal(hitPos));
280 AddRegionDamage(hitRegion, damage);
285 #ifdef BUILDING_DESTRUCTION_DEBUG
288 bool GetCameraViewIntersect()
290 if (!m_BuildingSetup)
294 GetWorld().GetCurrentCamera(camMat);
296 vector from = CoordToLocal(camMat[3]);
297 vector to = VectorToLocal(camMat[2]);
298 to = to * 1000 + from;
299 float intersect = Math3D.IntersectRayBox(from, to, m_BuildingSetup.m_vBuildingMins, m_BuildingSetup.m_vBuildingMaxs);
309 override int _WB_GetAfterWorldUpdateSpecs(IEntitySource src)
311 return EEntityFrameUpdateSpecs.CALL_WHEN_ENTITY_VISIBLE;
315 override void _WB_AfterWorldUpdate(
float timeSlice)
318 m_BuildingSetup = SCR_BuildingConfigManagerEntity.GetBuildingSetupFromConfig(
m_BuildingConfig);
333 if (!m_BuildingSetup)
337 if (!GetCameraViewIntersect())
345 GetWorld().GetCurrentCamera(textMat);
346 textMat[3] =
GetOrigin() +
Vector(0, m_BuildingSetup.m_vBuildingMaxs[1] + 2, 0);
350 else if (GetDamaged())
354 for (
int i = 0; i < GetRegionsCount(); i++)
356 dmgPct += GetRegionDamage01(i) / GetRegionsCount();
358 textMat[3] = textMat[1] * -0.6 + textMat[3];
367 void DisplayRegions()
369 if (!m_BuildingSetup)
373 GetWorld().GetCurrentCamera(textMat);
374 vector camDir = textMat[2];
375 vector camPos = textMat[3];
377 int highlightRegion = -1;
378 float highlightDist = -1;
381 for (
int i = 0; i < GetRegionsCount(); i++)
383 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(i);
387 vector regionPos = CoordToParent(regionStruct.GetRegionPos());
389 vector intersectScreenDiff = regionPos.InvMultiply4(textMat);
390 intersectScreenDiff[2] = 0;
392 float distScale = vector.Distance(camPos, regionPos) * 0.1;
393 distScale = Math.Clamp(distScale, 0.5, 5);
395 float distToCircle = intersectScreenDiff.Length() / distScale;
396 if (distToCircle < 0.75 && (distToCircle < highlightDist || highlightDist == -1))
399 highlightDist = distToCircle;
403 for (
int i = 0; i < GetRegionsCount(); i++)
405 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(i);
409 vector regionPos = CoordToParent(regionStruct.GetRegionPos());
411 float distScale = vector.Distance(camPos, regionPos) * 0.1;
412 distScale = Math.Clamp(distScale, 0.5, 3);
414 textMat[3] = textMat[1] * 0.05 * distScale + regionPos;
417 if (i == highlightRegion)
419 int color =
ARGBF(1, 1, 1, 1);
420 CreateSimpleText(
"Region " + i.ToString(), textMat, 0.17 * distScale, color,
ShapeFlags.ONCE |
ShapeFlags.TRANSP |
ShapeFlags.NOZBUFFER, null, 0.7,
true,
ARGB(128, 0, 0, 0));
421 textMat[3] = textMat[1] * -0.3 * distScale + textMat[3];
422 CreateSimpleText(GetRegionDamage(i).
ToString() +
"/" + GetRegionMaxDamage(i).
ToString(), textMat, 0.17 * distScale, color,
ShapeFlags.ONCE |
ShapeFlags.TRANSP |
ShapeFlags.NOZBUFFER, null, 0.7,
true,
ARGB(128, 0, 0, 0));
429 int color =
ARGBF(0.1, 1, 1 - GetRegionDamage01(i), 1 - GetRegionDamage01(i));
432 textMat[3] = textMat[1] * 0.18 * distScale + textMat[3];
437 for (
int s = 0; s < regionStruct.GetConnectionNumOut(); s++)
439 SCR_BuildingRegion suppRegionStruct = regionStruct.GetConnectedRegionOut(s);
440 if (!suppRegionStruct)
443 int suppRegion = suppRegionStruct.GetRegionIndex();
444 vector suppRegionPos = CoordToParent(suppRegionStruct.GetRegionPos());
446 int arrowsColor =
ARGBF(0.02, 1, 1, 1);
447 if (i == highlightRegion || suppRegion == highlightRegion)
448 arrowsColor =
ARGB(255, 128, 128, 64);
450 int numArrows = Math.Ceil(vector.Distance(suppRegionPos, regionPos) * 5 / distScale);
461 protected void OnRegionDestroyed(
int region,
bool doDamageEffects)
463 SCR_BuildingRegionEntity regionEnt = null;
464 if (m_RegionEntities && m_RegionEntities.Count() > region)
465 regionEnt = m_RegionEntities.Get(region);
470 SCR_DebrisBuildingEntity buildingDebris = null;
472 buildingDebris = SpawnFallingRegionDebris(region);
474 DestroyPropsForRegion(regionEnt, buildingDebris);
480 auto soundComponent = BaseSoundComponent.Cast(FindComponent(BaseSoundComponent));
483 vector camMat[4], regionMat[4];
484 GetWorld().GetCurrentCamera(camMat);
485 regionEnt.GetTransform(regionMat);
487 soundComponent.SetSignalValueStr(
"partSoundID", region);
488 soundComponent.SetSignalValueStr(
"Distance", vector.Distance(camMat[3], SCR_EntityHelper.GetEntityCenterWorld(regionEnt)));
489 soundComponent.SoundEventTransform(SCR_SoundEvent.SOUND_BUILDING_CRACK, regionMat)
495 protected void OnRegionRepaired(
int region)
501 vector GetRegionPosition(
int regionNumber)
503 if (!m_BuildingSetup)
506 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(regionNumber);
510 return CoordToParent(regionStruct.GetRegionPos());
515 protected SCR_DebrisBuildingEntity SpawnFallingRegionDebris(
int region)
518 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(region);
525 SCR_DebrisBuildingEntity buildingDebris = SCR_DebrisBuildingEntity.
SpawnBuildingDebris(mat, m_BuildingSetup, region, GetRegionEntity(region));
529 vector regionDir = buildingDebris.CoordToParent(regionStruct.GetRegionPos()) - buildingDebris.GetOrigin();
533 return buildingDebris;
538 protected void CheckStructuralIntegrity(
int region)
540 if (!m_BuildingSetup)
544 if (!GetRegionDestroyed(region))
552 autoptr array<int> toCheckRegionsList =
new array<int>;
553 toCheckRegionsList.Insert(region);
555 while (toCheckRegionsList.Count() > 0)
558 int checkRegion = toCheckRegionsList.Get(0);
559 toCheckRegionsList.Remove(0);
562 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(checkRegion);
567 if (checkRegion != region)
570 int numSupportingRegions = regionStruct.GetConnectionNumIn();
571 int numOKSupportingRegions = 0;
572 for (
int n = 0; n < numSupportingRegions; n++)
574 SCR_BuildingRegion regionSupportingStruct = regionStruct.GetConnectedRegionIn(n);
576 if (GetRegionDestroyed(regionSupportingStruct.GetRegionIndex()))
579 numOKSupportingRegions++;
583 float heldPct = (float)numOKSupportingRegions / (
float)numSupportingRegions;
584 if (heldPct >= regionStruct.GetStructuralSupportPercentage())
588 SetRegionDamage01(checkRegion, 1,
false,
true,
false);
592 for (
int i = 0; i < regionStruct.GetConnectionNumOut(); i++)
594 SCR_BuildingRegion regionSupportedStruct = regionStruct.GetConnectedRegionOut(i);
596 int r = regionSupportedStruct.GetRegionIndex();
597 if (toCheckRegionsList.Find(r) > -1)
600 if (GetRegionDestroyed(r))
603 toCheckRegionsList.Insert(r);
612 if (!m_bDestroyed && !m_RegionMask && !m_RegionDamage)
631 else if (GetDestroyed())
639 bool GetRegionDestroyed(
int regionNumber)
647 return m_RegionMask.GetBit(regionNumber);
652 int GetRegionsCount()
654 if (!m_BuildingSetup)
657 return m_BuildingSetup.GetRegionNum();
662 float GetRegionMaxDamage(
int regionNumber)
664 if (!m_BuildingSetup)
667 if (regionNumber < 0)
670 if (regionNumber >= GetRegionsCount())
673 SCR_BuildingRegion regionStruct = m_BuildingSetup.GetRegionStruct(regionNumber);
677 return regionStruct.GetMaxHealth();
682 float GetRegionDamage(
int regionNumber)
690 return GetRegionMaxDamage(regionNumber);
693 if (m_RegionMask && m_RegionMask.GetBit(regionNumber))
694 return GetRegionMaxDamage(regionNumber);
701 return m_RegionDamage.Get(regionNumber);
706 float GetRegionDamage01(
int regionNumber)
708 if (regionNumber >= GetRegionsCount())
711 float maxDamage = GetRegionMaxDamage(regionNumber);
715 return GetRegionDamage(regionNumber) / maxDamage;
720 protected void SetRegionDamage(
int regionNumber,
float damage,
bool doStructuralIntegrityCheck =
true,
bool doDamageEffects =
true,
bool sendRPC =
true)
722 if (!m_BuildingSetup)
725 if (regionNumber >= GetRegionsCount())
728 float maxDamage = GetRegionMaxDamage(regionNumber);
731 if (GetDestroyed() && damage >= maxDamage)
735 if (GetUndamaged() && damage <= 0)
742 else if (GetDestroyed())
745 damage = Math.Clamp(damage, 0, maxDamage);
746 float curDam = GetRegionDamage(regionNumber);
749 if (curDam == damage)
754 if (damage >= maxDamage)
755 Rpc(RPC_OnRegionDestroyed, regionNumber,
true, doStructuralIntegrityCheck, doDamageEffects);
756 else if (damage <= 0)
757 Rpc(RPC_OnRegionDestroyed, regionNumber,
false, doStructuralIntegrityCheck, doDamageEffects);
761 if (GetDestroyed() && damage < maxDamage)
763 SetDestroyedState(
false,
false);
764 SetAllZonesDestroyed();
768 if (damage == 0 || damage == maxDamage)
775 m_RegionMask.SetBit(regionNumber,
false);
776 if (m_RegionMask.GetEmpty())
780 OnRegionRepaired(regionNumber);
782 else if (damage == maxDamage)
786 m_RegionMask =
new SCR_BitMaskArray(GetRegionsCount());
787 m_RegionMask.SetBit(regionNumber,
true);
789 OnRegionDestroyed(regionNumber, doDamageEffects);
795 for (
int i = 0; i < m_RegionDamage.Count(); i++)
797 if (m_RegionDamage.GetKey(i) == regionNumber)
799 m_RegionDamage.RemoveElement(i);
805 if (m_RegionDamage.Count() == 0)
806 delete m_RegionDamage;
814 m_RegionMask.SetBit(regionNumber,
false);
815 if (m_RegionMask.GetEmpty())
821 m_RegionDamage =
new map<int, float>;
823 if (m_RegionDamage.Contains(regionNumber))
824 m_RegionDamage.Set(regionNumber, damage);
826 m_RegionDamage.Insert(regionNumber, damage);
830 if (GetAllZonesAtMaxDamage())
831 SetDestroyedState(
true,
false);
837 else if (GetDestroyed())
841 if (newState != state)
842 UpdateBuildingModel();
847 UpdateBuildingRegions();
848 if (doStructuralIntegrityCheck)
849 CheckStructuralIntegrity(regionNumber);
855 void SetRegionDamage01(
int regionNumber,
float damagePct,
bool doStructuralIntegrityCheck =
true,
bool doDamageEffects =
true,
bool sendRPC =
true)
857 SetRegionDamage(regionNumber, GetRegionMaxDamage(regionNumber) * damagePct, doStructuralIntegrityCheck, doDamageEffects, sendRPC);
862 void AddRegionDamage(
int regionNumber,
float damage,
bool doStructuralIntegrityCheck =
true,
bool doDamageEffects =
true,
bool sendRPC =
true)
864 SetRegionDamage(regionNumber, GetRegionDamage(regionNumber) + damage, doStructuralIntegrityCheck, doDamageEffects, sendRPC);
869 void SetDestroyedState(
bool destroyed,
bool updateModel =
true)
873 delete m_RegionDamage;
879 m_bDestroyed = destroyed;
882 UpdateBuildingModel();
887 SCR_BuildingRegionEntity GetRegionEntity(
int regionNumber)
889 if (!m_RegionEntities)
892 if (m_RegionEntities.Count() > regionNumber)
893 return m_RegionEntities.Get(regionNumber);
900 private SCR_BuildingRegionEntity SpawnRegionEntity(
int regionNumber)
902 if (!m_RegionEntities)
903 m_RegionEntities =
new array<SCR_BuildingRegionEntity>;
905 SCR_BuildingRegionEntity regionEnt = null;
906 if (m_RegionEntities.Count() > regionNumber)
907 regionEnt = m_RegionEntities.Get(regionNumber);
912 vector buildingMat[4];
920 regionEnt.SetBuildingAndIndex(
this, regionNumber);
921 regionEnt.LoadRegionModel();
924 regionEnt.SetTransform(buildingMat);
926 m_RegionEntities.InsertAt(regionEnt, regionNumber);
933 bool GetPropDestructible(notnull
IEntity prop)
935 GenericEntity genEnt = GenericEntity.Cast(prop);
940 if (genEnt.
FindComponent(SCR_DestructionDamageManagerComponent))
953 bool QueryRegionProp(
IEntity prop,
bool propIsChild =
false,
float traceUp = 0.1,
float traceDown = 0.1)
959 if (SCR_DestructibleBuildingEntity.Cast(prop))
963 if (SCR_BuildingRegionEntity.Cast(prop))
971 if (!propIsChild && !GetPropDestructible(prop))
975 if (s_aQueryPropsList.Find(prop) >= 0)
978 vector mins, maxs, mat[4];
994 for (
int a = 0; a < 3; a++)
996 float min = mins[a] + 0.2;
997 float max = maxs[a] - 0.2;
1008 autoptr TraceOBB param =
new TraceOBB;
1009 param.Mat[0] = mat[0];
1010 param.Mat[1] = mat[1];
1011 param.Mat[2] = mat[2];
1013 param.LayerMask = EPhysicsLayerDefs.Default;
1017 param.Mins = -vector.One;
1018 param.Maxs = vector.One;
1020 param.Start = mat[3] + vector.Up * 1;
1021 param.End = mat[3] - vector.Up * 1;
1023 SCR_Global.g_TraceFilterEnt = s_QueryBuildingRegion;
1024 float traced = GetWorld().TraceMove(param, SCR_Global.FilterCallback_IgnoreAllButEntity);
1028 if (traced < 1 && param.TraceEnt == s_QueryBuildingRegion)
1029 s_aQueryPropsList.Insert(prop);
1031 #ifdef BUILDING_DEBUG_TEMP
1034 int color =
ARGB(255, 255, 0, 0);
1036 color =
ARGB(255, 0, 255, 0);
1038 int color2 =
ARGB(255, 0, 0, 255);
1040 vector mins2 = param.Mins - vector.One * 0.025;
1041 vector maxs2 = param.Maxs + vector.One * 0.025;
1045 mat[3] = param.Start;
1047 debugShapes.Insert(shp);
1053 debugShapes.Insert(shp);
1057 debugShapes.Insert(shp);
1061 mat[3] = param.Start;
1063 debugShapes.Insert(shp);
1067 mat[3] = (param.End - param.Start) * traced + param.Start;
1069 debugShapes.Insert(shp);
1072 shp = Shape.Create(
ShapeType.LINE, color,
ShapeFlags.VISIBLE |
ShapeFlags.NOZBUFFER, param.Start + vector.One * 0.025, (param.End - param.Start) * traced + param.Start + vector.One * 0.025);
1073 debugShapes.Insert(shp);
1075 CreateSimpleText(
"REGION: " + s_QueryBuildingRegion.GetRegionNumber().ToString(), mat, 0.2,
ARGB(255, 255, 255, 255),
ShapeFlags.NOZBUFFER, debugShapes, 0.7);
1077 PrintFormat(
"REGION: %1", s_QueryBuildingRegion.GetRegionNumber());
1083 bool QueryRegionPropCallback(
IEntity e)
1085 return QueryRegionProp(e);
1090 void GetPropsForRegion(SCR_BuildingRegionEntity regionEnt)
1092 #ifdef BUILDING_DEBUG_TEMP
1093 debugShapes.Clear();
1096 s_aQueryPropsList.Clear();
1097 s_QueryBuildingRegion = regionEnt;
1099 if (!s_QueryBuildingRegion)
1109 QueryRegionProp(prop,
true);
1113 vector regionMins, regionMaxs, regionMat[4];
1114 s_QueryBuildingRegion.GetWorldBounds(regionMins, regionMaxs);
1116 GetWorld().QueryEntitiesByAABB(regionMins, regionMaxs, QueryRegionPropCallback);
1121 protected void CopyPropToBuildingDebris(SCR_DebrisBuildingEntity buildingDebris,
IEntity prop, vector debrisMat[4])
1123 if (!buildingDebris)
1133 CopyPropToBuildingDebris(buildingDebris, propChild, debrisMat);
1143 vector propMat[4], localPropMat[4];
1145 Math3D.MatrixInvMultiply4(debrisMat, propMat, localPropMat);
1149 propCopy.SetObject(obj,
string.Empty);
1151 buildingDebris.AddChild(propCopy, -1,
EAddChildFlags.AUTO_TRANSFORM);
1156 protected void DestroyPropsForRegion(SCR_BuildingRegionEntity regionEnt, SCR_DebrisBuildingEntity buildingDebris)
1161 GetPropsForRegion(regionEnt);
1163 vector debrisMat[4];
1165 buildingDebris.GetWorldTransform(debrisMat);
1167 int numProps = s_aQueryPropsList.Count();
1168 for (
int i = numProps - 1; i >= 0; i--)
1170 IEntity prop = s_aQueryPropsList.Get(i);
1175 GenericEntity genProp = GenericEntity.Cast(prop);
1178 SCR_DestructionDamageManagerComponent
destructible = SCR_DestructionDamageManagerComponent.Cast(genProp.
FindComponent(SCR_DestructionDamageManagerComponent));
1182 Math3D.MatrixIdentity3(mat);
1188 CopyPropToBuildingDebris(buildingDebris, prop, debrisMat);
1191 SCR_EntityHelper.DeleteEntityAndChildren(prop);
1201 private void DeleteRegionEntity(
int regionNumber)
1203 if (!m_RegionEntities || m_RegionEntities.Count() <= regionNumber)
1206 SCR_BuildingRegionEntity regionEnt = m_RegionEntities.Get(regionNumber);
1213 for (
int i = 0; i < m_RegionEntities.Count(); i++)
1215 regionEnt = m_RegionEntities.Get(i);
1221 delete m_RegionEntities;
1222 m_RegionEntities = null;
1227 private void DeleteAllRegionEntities()
1229 if (!m_RegionEntities)
1232 for (
int i = m_RegionEntities.Count() - 1; i > -1; i--)
1234 SCR_BuildingRegionEntity regionEnt = m_RegionEntities.Get(i);
1235 m_RegionEntities.Remove(i);
1239 delete m_RegionEntities;
1240 m_RegionEntities = null;
1245 private void SpawnAllRegionEntities(
bool addRegionsToTraceIgnoreList =
false)
1247 if (addRegionsToTraceIgnoreList)
1248 SCR_Global.g_TraceFilterList.Clear();
1250 DeleteAllRegionEntities();
1252 for (
int i = 0; i < GetRegionsCount(); i++)
1254 SCR_BuildingRegionEntity region = SpawnRegionEntity(i);
1255 if (addRegionsToTraceIgnoreList && region)
1256 SCR_Global.g_TraceFilterList.Insert(region);
1262 private void UpdateBuildingModel(
int forceState = -1,
bool addRegionsToTraceIgnoreList =
false)
1264 if (!m_BuildingSetup)
1274 if (forceState != -1)
1275 buildingState = forceState;
1277 ResourceName assetPath = m_BuildingSetup.m_ModelUndamaged;
1279 assetPath = m_BuildingSetup.m_ModelDestroyed;
1314 Physics phys = GetPhysics();
1319 if (assetPath ==
"")
1321 SetObject(null,
"");
1326 Resource resource = Resource.Load(assetPath);
1327 VObject asset = resource.GetResource().ToVObject();
1328 SetObject(asset,
"");
1331 Physics.CreateStatic(
this, -1);
1343 SpawnAllRegionEntities(addRegionsToTraceIgnoreList);
1345 DeleteAllRegionEntities();
1350 private void UpdateBuildingRegions()
1352 if (!m_BuildingSetup)
1355 int regionNum = GetRegionsCount();
1356 for (
int i = 0; i < regionNum; i++)
1358 if (GetRegionDestroyed(i))
1360 DeleteRegionEntity(i);
1364 SCR_BuildingRegionEntity regionEnt = SpawnRegionEntity(i);
1370 for (
int n = 0; n < regionNum; n++)
1376 if (GetRegionDestroyed(n))
1377 regionEnt.CreateIntersectDebris(n);
1379 regionEnt.DeleteIntersectDebris(n);
1386 private void SetAllZonesDestroyed()
1390 delete m_RegionDamage;
1392 for (
int i = 0; i < GetRegionsCount(); i++)
1396 m_RegionMask =
new SCR_BitMaskArray(GetRegionsCount());
1397 m_RegionMask.SetBit(i,
true);
1403 bool GetAllZonesAtMaxDamage()
1409 for (
int i = 0; i < GetRegionsCount(); i++)
1412 if (m_RegionMask.GetBit(i))
1426 RplComponent rplComponent = RplComponent.Cast(FindComponent(RplComponent));
1428 rplComponent.InsertToReplication();
1432 void SCR_DestructibleBuildingEntity(IEntitySource src,
IEntity parent)
1439 #ifdef BUILDING_DESTRUCTION_DEBUG
1445 m_BuildingSetup = SCR_BuildingConfigManagerEntity.GetBuildingSetupFromConfig(
m_BuildingConfig);
1449 void ~SCR_DestructibleBuildingEntity()
1454 DeleteAllRegionEntities();