5 ref array<ResourceName> m_Prefabs;
6 [
Attribute(
"0.1",
UIWidgets.Slider,
"Damage received to physics impulse (speed / mass) multiplier",
"0 10000 0.01")]
7 float m_fDamageToImpulse;
8 [
Attribute(
"0.25",
UIWidgets.Slider,
"Random linear velocity multiplier (m/s)",
"0 200 0.1")]
9 float m_fRandomVelocityLinear;
10 [
Attribute(
"45",
UIWidgets.Slider,
"Random angular velocity multiplier (deg/s)",
"0 3600 0.1")]
11 float m_fRandomVelocityAngular;
12 [
Attribute(
"0",
UIWidgets.CheckBox,
"Whether the spawned prefabs should be set as children (sets auto-transform)")]
13 bool m_bSpawnAsChildren;
23 if (!super.CompareAttributes(other))
26 int count = m_Prefabs.Count();
27 if (otherPrefab.m_Prefabs.Count() != count)
30 for (
int i = count - 1; i >= 0; i--)
32 if (otherPrefab.m_Prefabs[i] != m_Prefabs[i])
36 if (otherPrefab.m_fDamageToImpulse != m_fDamageToImpulse)
39 if (otherPrefab.m_fRandomVelocityLinear != m_fRandomVelocityLinear)
42 if (otherPrefab.m_fRandomVelocityAngular != m_fRandomVelocityAngular)
45 if (otherPrefab.m_bSpawnAsChildren != m_bSpawnAsChildren)
54 super.SetVariables(api, source,
path,
index);
56 string prefabsArray =
"";
58 for (
int i = 0, count = m_Prefabs.Count(); i < count; i++)
60 prefabsArray += m_Prefabs[i];
66 api.SetVariableValue(source,
path,
"m_Prefabs", prefabsArray);
68 api.SetVariableValue(source,
path,
"m_fDamageToImpulse", m_fDamageToImpulse.ToString());
69 api.SetVariableValue(source,
path,
"m_fRandomVelocityLinear", m_fRandomVelocityLinear.ToString());
70 api.SetVariableValue(source,
path,
"m_fRandomVelocityAngular", m_fRandomVelocityAngular.ToString());
71 api.SetVariableValue(source,
path,
"m_bSpawnAsChildren", m_bSpawnAsChildren.ToString(
true));
77 if (!AlreadyExists(api, source,
index))
79 api.CreateObjectArrayVariableMember(source,
path,
"m_aPhaseDestroySpawnObjects",
"SCR_PrefabSpawnable",
index);
94 int numModelPrefabs = 0;
96 numModelPrefabs = m_Prefabs.Count();
98 for (
int i = 0; i < numModelPrefabs; i++)
113 float ownerScale = owner.
GetScale();
116 spawnMat[0] = spawnMat[0] / ownerScale;
117 spawnMat[1] = spawnMat[1] / ownerScale;
118 spawnMat[2] = spawnMat[2] / ownerScale;
123 prefabSpawnParams.Transform = spawnMat;
125 prefabSpawnParams.Scale = ownerScale;
131 if (m_bSpawnAsChildren)
138 if (!prefabPhysics || !prefabPhysics.IsDynamic())
146 float terrainYMins =
GetGame().GetWorld().GetSurfaceY(mins[0], mins[2]);
147 float terrainYMaxs =
GetGame().GetWorld().GetSurfaceY(maxs[0], maxs[2]);
149 if ((mins[1] < terrainYMins || mins[1] < terrainYMaxs) && (maxs[1] > terrainYMins || maxs[1] > terrainYMaxs))
151 float highestTerrainY;
152 if (terrainYMaxs > terrainYMins)
153 highestTerrainY = terrainYMaxs;
155 highestTerrainY = terrainYMins;
157 float newHeight = highestTerrainY - mins[1] + entityOrigin[1] + 0.1;
158 spawnedPrefab.
SetOrigin({entityOrigin[0], newHeight, entityOrigin[2]});
161 float dmgSpeed = hitInfo.m_HitDamage * m_fDamageToImpulse / prefabPhysics.GetMass();
163 vector linearVelocity = hitInfo.m_HitDirection *
Math.RandomFloat(0, 1);
164 linearVelocity +=
Vector(
Math.RandomFloat(-1, 1),
Math.RandomFloat(-1, 1),
Math.RandomFloat(-1, 1)) * m_fRandomVelocityLinear;
165 linearVelocity *= dmgSpeed;
166 vector angularVelocity =
Vector(
Math.RandomFloat(-1, 1),
Math.RandomFloat(-1, 1),
Math.RandomFloat(-1, 1)) *
Math.RandomFloat(0.25, 4) * m_fRandomVelocityAngular;
167 angularVelocity *= dmgSpeed;
171 linearVelocity += parentPhysics.GetVelocity();
172 angularVelocity += parentPhysics.GetAngularVelocity();
175 prefabPhysics.SetVelocity(linearVelocity);
176 prefabPhysics.SetAngularVelocity(angularVelocity *
Math.DEG2RAD);