1[
EntityEditorProps(
category:
"GameScripted/Power", description:
"This is the power pole entity.", color:
"0 255 0 255", visible:
false, dynamicBox:
true)]
18 [
Attribute(uiwidget: UIWidgets.None,
desc:
"[OBSOLETE (use Cable Slot Groups above)] Slots for connecting with other power poles",
category:
"[OLD] Power Cable Slots")]
19 protected ref array<ref SCR_PowerPoleSlotBase>
m_aSlots;
22 protected static const float CONNECTED_POLE_SEARCH_RADIUS = 3.0;
31 map<SCR_EPoleCableType, ref SCR_PoleCableSlotGroup> GetClosestCableSlotGroupsForEachCableType(vector worldPos,
bool isSameLine)
33 map<SCR_EPoleCableType, ref SCR_PoleCableSlotGroup> result =
new map<SCR_EPoleCableType, ref SCR_PoleCableSlotGroup>();
34 map<SCR_EPoleCableType, float> distancesSq =
new map<SCR_EPoleCableType, float>();
36 SCR_PowerPoleClass prefabData = SCR_PowerPoleClass.Cast(
GetPrefabData());
40 foreach (SCR_PoleCableSlotGroup group : prefabData.m_aCableSlotGroups)
42 vector avgPos = vector.Zero;
43 int count = group.m_aSlots.Count();
47 if (group.m_eConnectivity != SCR_EPoleCableSlotConnectivity.ALL_LINES)
53 if ((group.m_eConnectivity == SCR_EPoleCableSlotConnectivity.SAME_LINE) != isSameLine)
57 if (group.m_vAnchorOverride == vector.Zero)
59 foreach (SCR_PoleCableSlot slot : group.m_aSlots)
61 avgPos += slot.m_vPosition;
68 avgPos = group.m_vAnchorOverride;
71 float distanceSq = vector.DistanceSq(worldPos, CoordToParent(avgPos));
72 float storedGroupDistanceSq = distancesSq.Get(group.m_eCableType);
73 if (storedGroupDistanceSq == 0)
75 distancesSq.Insert(group.m_eCableType, distanceSq);
76 result.Insert(group.m_eCableType, group);
79 if (distanceSq < storedGroupDistanceSq)
81 distancesSq.Set(group.m_eCableType, distanceSq);
82 result.Set(group.m_eCableType, group);
93 protected static bool s_bDisplayCableSlots;
94 protected static ref SCR_DebugShapeManager s_DebugShapeManager;
96 protected static const float MIN_AVG_ANCHOR_DIST = 0.5;
97 protected static const int DEBUG_SLOT_POS_COLOUR_1 = Color.DARK_GREEN & 0x88FFFFFF;
98 protected static const int DEBUG_SLOT_POS_COLOUR_2 = Color.DARK_GREEN & 0x55FFFFFF;
99 protected static const int DEBUG_PRECISION_LINE_COLOUR = Color.RED;
100 protected static const float DEBUG_PRECISION_LINE_SIZE = 0.1;
102 protected static const int DEBUG_ANCHOR_POS_COLOUR = Color.ORANGE & 0xBBFFFFFF;
103 protected static const int DEBUG_ANCHOR_LINE_COLOUR = Color.ORANGE & 0x66FFFFFF;
104 protected static const float DEBUG_SLOT_POS_SIZE_1 = 0.05;
105 protected static const float DEBUG_SLOT_POS_SIZE_2 = 0.25;
106 protected static const float DEBUG_ANCHOR_POS = 0.075;
109 override bool _WB_OnKeyChanged(BaseContainer src,
string key, BaseContainerList ownerContainers,
IEntity parent)
111 bool result = super._WB_OnKeyChanged(src, key, ownerContainers, parent);
112 if (!src || _WB_GetEditorAPI().UndoOrRedoIsRestoring())
115 typename srcType = src.GetClassName().ToType();
118 (key !=
"m_vPosition" && key !=
"m_vAnchorOverride" && key !=
"m_eConnectivity") ||
119 (!srcType.IsInherited(SCR_PoleCableSlot) && !srcType.IsInherited(SCR_PoleCableSlotGroup)))
121 if (s_DebugShapeManager)
122 s_DebugShapeManager.Clear();
124 s_bDisplayCableSlots =
false;
128 s_bDisplayCableSlots =
true;
130 if (s_DebugShapeManager)
141 override int _WB_GetAfterWorldUpdateSpecs(IEntitySource src)
143 return EEntityFrameUpdateSpecs.CALL_WHEN_ENTITY_VISIBLE;
147 override void _WB_AfterWorldUpdate(
float timeSlice)
149 if (s_bDisplayCableSlots && _WB_GetEditorAPI() && _WB_GetEditorAPI().IsPrefabEditMode())
154 protected void UpdateDebugShapes()
156 SCR_PowerPoleClass prefabData = SCR_PowerPoleClass.Cast(
GetPrefabData());
160 array<vector> lines = {
161 vector.FromYaw(45) * DEBUG_PRECISION_LINE_SIZE,
162 vector.Up * DEBUG_PRECISION_LINE_SIZE,
163 vector.FromYaw(-45) * DEBUG_PRECISION_LINE_SIZE,
166 s_DebugShapeManager.Clear();
167 foreach (SCR_PoleCableSlotGroup group : prefabData.m_aCableSlotGroups)
169 foreach (SCR_PoleCableSlot slot : group.m_aSlots)
171 s_DebugShapeManager.AddSphere(slot.m_vPosition, DEBUG_SLOT_POS_SIZE_1, DEBUG_SLOT_POS_COLOUR_1,
ShapeFlags.DEPTH_DITHER |
ShapeFlags.NOOUTLINE);
172 s_DebugShapeManager.AddSphere(slot.m_vPosition, DEBUG_SLOT_POS_SIZE_2, DEBUG_SLOT_POS_COLOUR_2,
ShapeFlags.DEPTH_DITHER |
ShapeFlags.NOOUTLINE);
173 foreach (vector line : lines)
175 s_DebugShapeManager.AddLine(slot.m_vPosition + line, slot.m_vPosition - line, DEBUG_PRECISION_LINE_COLOUR,
ShapeFlags.DEPTH_DITHER);
179 vector anchor = group.m_vAnchorOverride;
180 int count = group.m_aSlots.Count();
181 bool drawAnchor = anchor != vector.Zero || count > 1;
183 if (anchor == vector.Zero && count > 1)
185 foreach (SCR_PoleCableSlot slot : group.m_aSlots)
187 anchor += slot.m_vPosition;
192 foreach (SCR_PoleCableSlot slot : group.m_aSlots)
194 if (vector.Distance(anchor, slot.m_vPosition) < MIN_AVG_ANCHOR_DIST)
202 if (anchor != vector.Zero || count > 1)
205 s_DebugShapeManager.AddSphere(anchor, DEBUG_ANCHOR_POS, DEBUG_ANCHOR_POS_COLOUR,
ShapeFlags.DEPTH_DITHER |
ShapeFlags.NOOUTLINE);
208 foreach (SCR_PoleCableSlot slot : group.m_aSlots)
210 s_DebugShapeManager.AddLine(slot.m_vPosition, anchor, DEBUG_ANCHOR_LINE_COLOUR,
ShapeFlags.DEPTH_DITHER);
222 super.OnStateChanged(destructibleState, frameData, JIP);
225 if (destructibleState == 1 && !JIP)
244 foreach (
vector polePosition : polePositions)
254 array<vector> positions = {};
258 if (!prefabData || !prefabData.m_aCableSlotGroups)
268 if (!slotGroup || !slotGroup.m_aSlots)
272 int validSlotCount = 0;
280 avgLocalPos += slot.m_vPosition;
285 if (validSlotCount > 0)
287 avgLocalPos = avgLocalPos / validSlotCount;
288 vector avgWorldPos = CoordToParent(avgLocalPos);
289 positions.Insert(avgWorldPos);
301 return entity.Type() == PowerlineEntity;
322 if (_WB_GetEditorAPI() && _WB_GetEditorAPI().IsPrefabEditMode())
324 if (!s_DebugShapeManager)
ArmaReforgerScripted GetGame()
ref array< SCR_WeaponRackSlotEntity > m_aSlots
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
override bool _WB_OnKeyChanged(IEntity owner, BaseContainer src, string key, BaseContainerList ownerContainers, IEntity parent)
Any property value has been changed. You can use editor API here and do some additional edit actions ...
override void OnStateChanged(int destructibleState, ScriptBitReader frameData, bool JIP)
void HandleConnectedPowerlines()
Cable Slots ref array< ref SCR_PoleCableSlotGroup > m_aCableSlotGroups
bool ProcessFoundPowerline(notnull IEntity entity)
array< vector > GetCableSlotGroupPositions()
Get cable slot group positions, following the exact pattern from SCR_DestructibleBuildingComponent.
void SCR_PowerPole(IEntitySource src, IEntity parent)
bool FilterPowerlineEntity(notnull IEntity entity)
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
SCR_VehicleDamageManagerComponentClass GetPrefabData()
enum EVehicleType IEntity
SCR_FieldOfViewSettings Attribute