Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CompositionSlotManagerComponent.c
Go to the documentation of this file.
1void OnCompositionSlotManagerEntityChangedMethod(SCR_CompositionSlotManagerComponent slotManager, IEntity slot);
3typedef ScriptInvokerBase<OnCompositionSlotManagerEntityChangedMethod> OnCompsitionSlotManagerEntityChanged;
4
5[ComponentEditorProps(category: "GameScripted/Compositions", description: "")]
9
10class SCR_CompositionSlotManagerComponent : ScriptComponent
11{
14 protected ref array<IEntity> m_aQueriedEntities;
15
17
18 //------------------------------------------------------------------------------------------------
27
28 //------------------------------------------------------------------------------------------------
30 static SCR_CompositionSlotManagerComponent GetInstance()
31 {
32 if (GetGame().GetGameMode())
33 return SCR_CompositionSlotManagerComponent.Cast(GetGame().GetGameMode().FindComponent(SCR_CompositionSlotManagerComponent));
34 else
35 return null;
36 }
37
38 //------------------------------------------------------------------------------------------------
41 void SetOccupant(IEntity slot, IEntity occupant)
42 {
43 if (Replication.IsClient())
44 return;
45
46 RplId rplID = Replication.FindItemId(slot);
47 if (rplID.IsValid())
48 SetOccupiedDynamic(rplID, occupant != null, occupant);
49 else
50 SetOccupiedStatic(slot.GetID(), occupant != null, occupant);
51 }
52
53 //------------------------------------------------------------------------------------------------
56 void SetOccupant(vector pos, IEntity occupant)
57 {
58 if (Replication.IsClient())
59 return;
60
62 GetOwner().GetWorld().QueryEntitiesBySphere(pos, 1, QueryEntity, null, EQueryEntitiesFlags.STATIC);
63 if (!m_aQueriedEntities.IsEmpty())
64 SetOccupant(m_aQueriedEntities[0], occupant);
65
66 m_aQueriedEntities = null;
67 }
68
69 //------------------------------------------------------------------------------------------------
73 {
74 IEntity occupant;
75 RplId slotID = Replication.FindItemId(slot);
76 if (slotID.IsValid())
77 m_aOccupiedDynamic.Find(slotID, occupant);
78 else
79 m_aOccupiedStatic.Find(slot.GetID(), occupant);
80
81 return occupant;
82 }
83
84 //------------------------------------------------------------------------------------------------
89 {
90 RplId slotID = Replication.FindItemId(slot);
91 if (slotID.IsValid())
92 return m_aOccupiedDynamic.Contains(slotID);
93 else
94 return m_aOccupiedStatic.Contains(slot.GetID());
95 }
96
97 //------------------------------------------------------------------------------------------------
101 {
102 for (int i = 0, count = m_aOccupiedStatic.Count(); i < count; i++)
103 {
104 if (m_aOccupiedStatic.GetElement(i) == occupant)
105 return GetGame().GetWorld().FindEntityByID(m_aOccupiedStatic.GetKey(i));
106 }
107
108 for (int i = 0, count = m_aOccupiedDynamic.Count(); i < count; i++)
109 {
110 if (m_aOccupiedDynamic.GetElement(i) == occupant)
111 return IEntity.Cast(Replication.FindItem(m_aOccupiedDynamic.GetKey(i)));
112 }
113
114 return null;
115 }
116
117 //------------------------------------------------------------------------------------------------
120 bool IsInSlot(IEntity occupant)
121 {
122 for (int i = 0, count = m_aOccupiedStatic.Count(); i < count; i++)
123 {
124 if (m_aOccupiedStatic.GetElement(i) == occupant)
125 return true;
126 }
127
128 for (int i = 0, count = m_aOccupiedDynamic.Count(); i < count; i++)
129 {
130 if (m_aOccupiedDynamic.GetElement(i) == occupant)
131 return true;
132 }
133
134 return false;
135 }
136
137 //--- Static
138
139 //------------------------------------------------------------------------------------------------
140 protected void SetOccupiedStatic(EntityID slotID, bool isOccupied, IEntity occupant)
141 {
142 if (Replication.IsServer() && ModifyArray(slotID, isOccupied, occupant))
143 Rpc(SetOccupiedStaticBroadcast, slotID, isOccupied);
144 }
145
146 //------------------------------------------------------------------------------------------------
147 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
148 protected void SetOccupiedStaticBroadcast(EntityID slotID, bool isOccupied)
149 {
150 ModifyArray(slotID, isOccupied, null);
151 }
152
153 //--- Dynamic
154
155 //------------------------------------------------------------------------------------------------
156 protected void SetOccupiedDynamic(RplId slotID, bool isOccupied, IEntity occupant)
157 {
158 if (Replication.IsServer() && ModifyArray(slotID, isOccupied, occupant))
159 Rpc(SetOccupiedDynamicBroadcast, slotID, isOccupied);
160 }
161
162 //------------------------------------------------------------------------------------------------
163 [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)]
164 protected void SetOccupiedDynamicBroadcast(RplId slotID, bool isOccupied)
165 {
166 ModifyArray(slotID, isOccupied, null);
167 }
168
169 //--- Arrays
170
171 //------------------------------------------------------------------------------------------------
172 protected bool ModifyArray(EntityID slotID, bool isOccupied, IEntity occupant)
173 {
174 if (isOccupied)
175 {
176 bool isChange = m_aOccupiedStatic.Insert(slotID, occupant);
177 UpdateSlot(GetGame().GetWorld().FindEntityByID(slotID), isOccupied);
178 return isChange;
179 }
180 else
181 {
182 if (m_aOccupiedStatic.Find(slotID, occupant))
183 {
184 m_aOccupiedStatic.Remove(slotID);
185 UpdateSlot(GetGame().GetWorld().FindEntityByID(slotID), isOccupied);
186 return true;
187 }
188 else
189 {
190 return false;
191 }
192 }
193 }
194
195 //------------------------------------------------------------------------------------------------
196 protected bool ModifyArray(RplId slotID, bool isOccupied, IEntity occupant)
197 {
198 if (isOccupied)
199 {
200 bool isChange = m_aOccupiedDynamic.Insert(slotID, occupant);
201 UpdateSlot(IEntity.Cast(Replication.FindItem(slotID)), isOccupied);
202 return isChange;
203 }
204 else
205 {
206 if (m_aOccupiedDynamic.Find(slotID, occupant))
207 {
208 m_aOccupiedDynamic.Remove(slotID);
209 UpdateSlot(IEntity.Cast(Replication.FindItem(slotID)), isOccupied);
210 return true;
211 }
212 else
213 {
214 return false;
215 }
216 }
217 }
218
219 //------------------------------------------------------------------------------------------------
220 protected void UpdateSlot(IEntity slot, bool isOccupied)
221 {
222 if (!slot)
223 return;
224
226 if (!entity)
227 return;
228
229 if (entity.GetEntityType(slot) == EEditableEntityType.SLOT)
230 entity.SetVisible(!isOccupied);
231
233 if (core)
234 core.Event_OnEntityExtendedChange.Invoke(entity, isOccupied);
235
237 m_OnEntityChanged.Invoke(this, slot);
238 }
239
240 //------------------------------------------------------------------------------------------------
242 {
243 IEntity slot = GetSlot(entity.GetOwner());
244 if (!slot)
245 return;
246
247 //--- Ignore when not deleted and position didn't change (e.g., only rotation did)
248 if (entity.IsRegistered())
249 {
250 vector transform[4];
251 entity.GetTransform(transform);
252 if (vector.Distance(transform[3], slot.GetWorldTransformAxis(3)) < 0.1)
253 {
255 m_OnEntityChanged.Invoke(this, slot);
256
257 return;
258 }
259 }
260
261 SetOccupant(slot, null);
263 m_OnEntityChanged.Invoke(this, slot);
264 }
265
266 //------------------------------------------------------------------------------------------------
267 protected bool QueryEntity(IEntity entity)
268 {
269 if (entity.IsInherited(SCR_SiteSlotEntity))
270 {
271 m_aQueriedEntities.Insert(entity);
272 return false;
273 }
274 else
275 {
276 return true;
277 }
278 }
279
280 //------------------------------------------------------------------------------------------------
281 override bool RplSave(ScriptBitWriter writer)
282 {
283 int occupiedCount = m_aOccupiedStatic.Count();
284 writer.WriteInt(occupiedCount);
285 for (int i = 0; i < occupiedCount; i++)
286 {
287 writer.WriteEntityId(m_aOccupiedStatic.GetKey(i));
288 }
289
290 occupiedCount = m_aOccupiedDynamic.Count();
291 writer.WriteInt(occupiedCount);
292 for (int i = 0; i < occupiedCount; i++)
293 {
294 writer.WriteRplId(m_aOccupiedDynamic.GetKey(i));
295 }
296
297 return true;
298 }
299
300 //------------------------------------------------------------------------------------------------
301 override bool RplLoad(ScriptBitReader reader)
302 {
303 int occupiedCount;
304 reader.ReadInt(occupiedCount);
305
306 EntityID entityID;
307 m_aOccupiedStatic.Clear();
308 for (int i = 0; i < occupiedCount; i++)
309 {
310 reader.ReadEntityId(entityID);
311 m_aOccupiedStatic.Insert(entityID, null);
312 UpdateSlot(GetGame().GetWorld().FindEntityByID(entityID), true);
313 }
314
315 RplId rplID;
316 reader.ReadInt(occupiedCount);
317 m_aOccupiedDynamic.Clear();
318 for (int i = 0; i < occupiedCount; i++)
319 {
320 reader.ReadRplId(rplID);
321 m_aOccupiedDynamic.Insert(rplID, null);
322 UpdateSlot(IEntity.Cast(Replication.FindItem(rplID)), true);
323 }
324
325 return true;
326 }
327
328 //------------------------------------------------------------------------------------------------
329 override void OnPostInit(IEntity owner)
330 {
332 if (core)
333 {
334 core.Event_OnEntityUnregistered.Insert(OnEntityChanged);
335 core.Event_OnEntityTransformChanged.Insert(OnEntityChanged);
336 }
337 }
338
339 //------------------------------------------------------------------------------------------------
340 override void OnDelete(IEntity owner)
341 {
343 if (core)
344 {
345 core.Event_OnEntityUnregistered.Remove(OnEntityChanged);
346 core.Event_OnEntityTransformChanged.Remove(OnEntityChanged);
347 }
348 }
349}
ArmaReforgerScripted GetGame()
Definition game.c:1398
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
SCR_BaseGameMode GetGameMode()
bool IsInSlot(IEntity occupant)
void SetOccupant(IEntity slot, IEntity occupant)
void SetOccupiedDynamic(RplId slotID, bool isOccupied, IEntity occupant)
void SetOccupiedDynamicBroadcast(RplId slotID, bool isOccupied)
ref array< IEntity > m_aQueriedEntities
SCR_CompositionSlotManagerComponentClass m_aOccupiedStatic
bool ModifyArray(EntityID slotID, bool isOccupied, IEntity occupant)
ref OnCompsitionSlotManagerEntityChanged m_OnEntityChanged
IEntity GetSlot(IEntity occupant)
void SetOccupiedStaticBroadcast(EntityID slotID, bool isOccupied)
void SetOccupiedStatic(EntityID slotID, bool isOccupied, IEntity occupant)
void OnEntityChanged(SCR_EditableEntityComponent entity)
IEntity GetOccupant(IEntity slot)
ScriptInvokerBase< OnCompositionSlotManagerEntityChangedMethod > OnCompsitionSlotManagerEntityChanged
bool QueryEntity(IEntity entity)
OnCompsitionSlotManagerEntityChanged GetOnEntityChanged()
func OnCompositionSlotManagerEntityChangedMethod
void UpdateSlot(IEntity slot, bool isOccupied)
ref map< RplId, IEntity > m_aOccupiedDynamic
bool IsOccupied()
Returns true, if slot is occupied.
proto external GenericComponent FindComponent(typename typeName)
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
proto external Managed FindComponent(typename typeName)
proto external vector GetWorldTransformAxis(int axis)
See IEntity::GetTransformAxis.
proto external BaseWorld GetWorld()
proto external EntityID GetID()
Main replication API.
Definition Replication.c:14
Replication item identifier.
Definition RplId.c:14
EEditableEntityType GetEntityType(IEntity owner=null)
bool GetTransform(out vector outTransform[4])
proto external GenericEntity GetOwner()
Get owner entity.
bool RplLoad(ScriptBitReader reader)
bool RplSave(ScriptBitWriter writer)
Definition Types.c:486
EEditableEntityType
Defines type of SCR_EditableEntityComponent. Assigned automatically based on IEntity inheritance.
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
Definition EnNetwork.c:95
RplRcver
Definition RplRcver.c:59
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
Definition RplChannel.c:14
EQueryEntitiesFlags