Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CompartmentAccessComponent.c
Go to the documentation of this file.
1void OnPlayerEnterCompartmentMethod(ChimeraCharacter playerCharacter, IEntity compartmentEntity);
3typedef ScriptInvokerBase<OnPlayerEnterCompartmentMethod> OnPlayerEnterCompartment;
4
5void OnPlayerExitCompartmentMethod(ChimeraCharacter playerCharacter, IEntity compartmentEntity);
7typedef ScriptInvokerBase<OnPlayerEnterCompartmentMethod> OnPlayerExitCompartment;
8
9[EntityEditorProps(category: "GameScripted/Vehicle", description: "CompartmentAccessComponent", color: "0 0 255 255")]
13
14//------------------------------------------------------------------------------------------------
15class SCR_CompartmentAccessComponent : CompartmentAccessComponent
16{
18 private ref ScriptInvoker m_OnCompartmentEntered;
19 private ref ScriptInvoker m_OnCompartmentLeft;
20
23
24 protected SCR_FireModeManagerComponent m_TurretFireModeManager;
25
26 protected const int WAIT_FOR_VEHICLE_MAX_TRIES = 10;
27 protected static int s_iWaitForVehicleTries = 0;
28
29 //------------------------------------------------------------------------------------------------
31 {
32 if (!m_OnCompartmentEntered && createNew)
33 m_OnCompartmentEntered = new ScriptInvoker();
34 return m_OnCompartmentEntered;
35 }
36
37 //------------------------------------------------------------------------------------------------
38 ScriptInvoker GetOnCompartmentLeft(bool createNew = true)
39 {
40 if (!m_OnCompartmentLeft && createNew)
41 m_OnCompartmentLeft = new ScriptInvoker();
42 return m_OnCompartmentLeft;
43 }
44
45 //------------------------------------------------------------------------------------------------
53
54 //------------------------------------------------------------------------------------------------
62
63 //------------------------------------------------------------------------------------------------
64 override protected void OnCompartmentEntered(IEntity targetEntity, BaseCompartmentManagerComponent manager, int mgrID, int slotID, bool move)
65 {
66 if (m_OnCompartmentEntered)
67 m_OnCompartmentEntered.Invoke( targetEntity, manager, mgrID, slotID, move );
68
69 PlayerManager playerManager = GetGame().GetPlayerManager();
70 ChimeraCharacter character = ChimeraCharacter.Cast(GetOwner());
71
72 if (!playerManager || !character)
73 return;
74
75 SCR_CharacterControllerComponent controller = SCR_CharacterControllerComponent.Cast(character.GetCharacterController());
76 if (controller)
78
80 if (slot)
82
83 //--- Check if the character is a player
84 int playerId = playerManager.GetPlayerIdFromControlledEntity(character);
85 if (playerId == 0)
86 return;
87
89 m_OnPlayerEnterCompartment.Invoke(character, targetEntity);
90 }
91
92 //------------------------------------------------------------------------------------------------
96 protected void ToggleTurretFireModeControlls(notnull BaseCompartmentSlot slot, bool entered)
97 {
98 ChimeraCharacter character = ChimeraCharacter.Cast(GetOwner());
100 if (!entered && character == localCharacter)
101 {
103 m_TurretFireModeManager.RemoveActionListeners();
104
106 return;
107 }
108
109 TurretControllerComponent turretController = slot.GetAttachedTurret();
110 Turret turret;
111 if (turretController)
112 {
113 turret = Turret.Cast(turretController.GetOwner());
114 }
115 else
116 {
117 string turretName = slot.GetAutoConnectTurret();
118 if (turretName.IsEmpty())
119 return;
120
121 IEntity child = slot.GetOwner().GetChildren();
122 while (child)
123 {
124 turret = Turret.Cast(child);
125 if (turret)
126 {
127 turretController = TurretControllerComponent.Cast(turret.FindComponent(TurretControllerComponent));
128 if (turretController && turretController.GetUniqueName() == turretName)
129 break;
130 }
131
132 child = child.GetSibling();
133 }
134
135 if (!turret)
136 return;
137 }
138
139 m_TurretFireModeManager = SCR_FireModeManagerComponent.Cast(turret.FindComponent(SCR_FireModeManagerComponent));
141 return;
142
143 if (character == localCharacter)
144 m_TurretFireModeManager.SetUpAllActionListeners(character);
145 }
146
147 //------------------------------------------------------------------------------------------------
148 SCR_FireModeManagerComponent GetControlledFireModeManager()
149 {
151 }
152
153 //------------------------------------------------------------------------------------------------
154 override protected void OnCompartmentLeft(IEntity targetEntity, BaseCompartmentManagerComponent manager, int mgrID, int slotID, bool move)
155 {
156 if (m_OnCompartmentLeft)
157 m_OnCompartmentLeft.Invoke( targetEntity, manager, mgrID, slotID, move );
158
159 PlayerManager playerManager = GetGame().GetPlayerManager();
160 ChimeraCharacter character = ChimeraCharacter.Cast(GetOwner());
161
162 if (!playerManager || !character)
163 return;
164
165 BaseCompartmentSlot slot = manager.FindCompartment(slotID);
166 if (slot)
168
169 //--- Check if the character is a player
170 int playerId = playerManager.GetPlayerIdFromControlledEntity(character);
171 if (playerId == 0)
172 return;
173
175 m_OnPlayerExitCompartment.Invoke(character, targetEntity);
176 }
177
178 //------------------------------------------------------------------------------------------------
179 void OnLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState)
180 {
181 IEntity vehicle = GetVehicle();
182 if (!vehicle)
183 return;
184
186 if (!vehicleFactionAff)
187 return;
188
189 vehicleFactionAff.OnOccupantLifeStateChanged(previousLifeState, newLifeState);
190 }
191
199 {
201 if (!compartmentManager)
202 return null;
203
204 array<BaseCompartmentSlot> compartments = {};
205 compartmentManager.GetCompartments(compartments);
206
207 if (customSlot)
208 {
209 if (!customSlot.IsCompartmentAccessible())
210 return null;
211 if (customSlot.IsGetInLockedFor(GetOwner()))
212 return null;
213 if (customSlot.GetOccupant())
214 return null;
215 if (compartmentType != customSlot.GetType())
216 return null;
217
218 return customSlot;
219 }
220
221 foreach (BaseCompartmentSlot compartment: compartments)
222 {
223 if (!compartment.IsCompartmentAccessible())
224 continue;
225 if (compartment.IsGetInLockedFor(GetOwner()))
226 continue;
227 if (compartment.GetOccupant())
228 continue;
229 if (compartmentType != compartment.GetType())
230 continue;
231
232 return compartment;
233 }
234
235 //--- Scan compartments in child entities (ToDo: Remove once GetCompartments is recursive)
236 BaseCompartmentSlot childSlot;
237 IEntity child = vehicle.GetChildren();
238 while (child)
239 {
240 childSlot = FindFreeAndAccessibleCompartment(child, compartmentType);
241 if (childSlot)
242 return childSlot;
243
244 child = child.GetSibling();
245 }
246
247 return null;
248 }
249
257 bool MoveInVehicle(IEntity vehicle, ECompartmentType compartmentType, bool performWhenPaused = false, BaseCompartmentSlot customSlot = null)
258 {
259 if (!vehicle)
260 return false;
261
262 //--- Find suitable slot
263 BaseCompartmentSlot slot = FindFreeAndAccessibleCompartment(vehicle, compartmentType, customSlot);
264 if (!slot)
265 return false;
266
267 //--- Move character in the slot (must be called where character is local)
268 IEntity slotEntity = slot.GetOwner();
269 RplComponent slotRplComponent = RplComponent.Cast(slotEntity.FindComponent(RplComponent));
270 RplId slotEntityID = slotRplComponent.Id();
271 int slotID = slot.GetCompartmentSlotID();
272 Rpc(MoveInVehicleOwner, slotEntityID, slotID, performWhenPaused);
273
274 //--- Lock the slot for a frame, so any other MoveInVehicle calls in this frame will skip it
275 slot.SetCompartmentAccessible(false);
276 GetGame().GetCallqueue().CallLater(slot.SetCompartmentAccessible, 1, false, true);
277 return true;
278 }
279
280 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
281 protected void MoveInVehicleOwner(RplId slotEntityID, int slotID, bool performWhenPaused)
282 {
283 RplComponent slotRplComponent = RplComponent.Cast(Replication.FindItem(slotEntityID));
284 if (!slotRplComponent)
285 {
287 {
288 // Time out, abort
290 return;
291 }
292
293 GetGame().GetCallqueue().CallLater(MoveInVehicleOwner, 1000, false, slotEntityID, slotID, performWhenPaused);
295 return;
296 }
297
299
300 IEntity slotEntity = slotRplComponent.GetEntity();
301
303 BaseCompartmentSlot slot = slotCompartmentManager.FindCompartment(slotID);
304
305 //--- Use slot's owner, not the vehicle - the slot may be in vehicle's child entity
306 GetInVehicle(slotEntity, slot, true, -1, ECloseDoorAfterActions.INVALID, performWhenPaused);
307 }
308
316 {
317 if (!vehicle)
318 return false;
319
320 ChimeraWorld world = GetGame().GetWorld();
321 if (MoveInVehicle(vehicle, ECompartmentType.PILOT, world.IsGameTimePaused()))
322 return true;
323
324 if (MoveInVehicle(vehicle, ECompartmentType.TURRET, world.IsGameTimePaused()))
325 return true;
326
327 if (MoveInVehicle(vehicle, ECompartmentType.CARGO, world.IsGameTimePaused()))
328 return true;
329
330 return false;
331 }
332
333 //------------------------------------------------------------------------------------------------
340 void AskOwnerToGetOutFromVehicle(EGetOutType type, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused, bool ejectOnTheSpot = false)
341 {
342 if (!GetCompartment())
343 return;
344
345 Rpc(GetOutOwner, type, doorInfoIndex, closeDoor, performWhenPaused, ejectOnTheSpot);
346 }
347
348 //------------------------------------------------------------------------------------------------
355 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
356 protected void GetOutOwner(EGetOutType type, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused, bool ejectOnTheSpot)
357 {
358 if (ejectOnTheSpot)
359 {
360 ChimeraCharacter character = ChimeraCharacter.Cast(GetOwner());
361 if (!character)
362 return;
363
364 vector mat[4];
365 character.GetTransform(mat);
366 mat[3] = character.AimingPosition();
367
368 GetOutVehicle_NoDoor(mat, true, false);
369 return;
370 }
371
372 GetOutVehicle(type, doorInfoIndex, closeDoor, performWhenPaused);
373 }
374
382 {
383 if (GetCompartment())
384 return GetCompartment().GetVehicle();
385 else
386 return null;
387 }
388 IEntity GetVehicle(out int compartmentID)
389 {
390 if (GetCompartment())
391 return GetCompartment().GetVehicle(compartmentID);
392 else
393 return null;
394 }
395
397 {
399 if (!char)
400 return;
401
403 if (!controller)
404 return;
405
406 controller.m_OnLifeStateChanged.Remove(OnLifeStateChanged);
407 }
408
414 [Obsolete("Use GetType() on the compartment instance directly.")]
416 {
417 return compartment.GetType();
418 }
419};
ECompartmentType
ArmaReforgerScripted GetGame()
Definition game.c:1398
SCR_CharacterControllerComponent GetCharacterController()
func OnPlayerEnterCompartmentMethod
func OnPlayerExitCompartmentMethod
ScriptInvokerBase< OnPlayerEnterCompartmentMethod > OnPlayerEnterCompartment
ScriptInvokerBase< OnPlayerEnterCompartmentMethod > OnPlayerExitCompartment
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
EDamageType type
void SetCompartmentAccessible(bool val)
proto external Managed FindComponent(typename typeName)
proto external IEntity GetChildren()
proto external IEntity GetSibling()
Main replication API.
Definition Replication.c:14
Replication item identifier.
Definition RplId.c:14
ref OnLifeStateChangedInvoker m_OnLifeStateChanged
OnPlayerExitCompartment GetOnPlayerCompartmentExit(bool createNew=true)
void AskOwnerToGetOutFromVehicle(EGetOutType type, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused, bool ejectOnTheSpot=false)
ScriptInvoker GetOnCompartmentEntered(bool createNew=true)
void OnLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState)
ref OnPlayerExitCompartment m_OnPlayerExitCompartment
SCR_FireModeManagerComponent GetControlledFireModeManager()
static ECompartmentType GetCompartmentType(notnull BaseCompartmentSlot compartment)
void OnCompartmentEntered(IEntity targetEntity, BaseCompartmentManagerComponent manager, int mgrID, int slotID, bool move)
void OnCompartmentLeft(IEntity targetEntity, BaseCompartmentManagerComponent manager, int mgrID, int slotID, bool move)
void ToggleTurretFireModeControlls(notnull BaseCompartmentSlot slot, bool entered)
OnPlayerEnterCompartment GetOnPlayerCompartmentEnter(bool createNew=true)
void MoveInVehicleOwner(RplId slotEntityID, int slotID, bool performWhenPaused)
IEntity GetVehicle(out int compartmentID)
SCR_FireModeManagerComponent m_TurretFireModeManager
void GetOutOwner(EGetOutType type, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused, bool ejectOnTheSpot)
BaseCompartmentSlot FindFreeAndAccessibleCompartment(IEntity vehicle, ECompartmentType compartmentType, BaseCompartmentSlot customSlot=null)
ScriptInvoker GetOnCompartmentLeft(bool createNew=true)
ref OnPlayerEnterCompartment m_OnPlayerEnterCompartment
bool MoveInVehicle(IEntity vehicle, ECompartmentType compartmentType, bool performWhenPaused=false, BaseCompartmentSlot customSlot=null)
static IEntity GetLocalControlledEntity()
void OnOccupantLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState)
IEntity GetOwner()
Owner entity of the fuel tank.
ECharacterLifeState
proto external bool GetOutVehicle_NoDoor(vector targetTransform[4], bool sendIntoRagdoll, bool performWhenPaused, bool isExitTeleport=false)
Uses teleport - character is teleported to targetTransform, and door state will not be changed.
proto external BaseCompartmentSlot GetCompartment()
Returns the compartent we're in.
proto external bool GetInVehicle(IEntity vehicle, BaseCompartmentSlot compartment, bool forceTeleport, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused)
If force teleport, doorInfoIndex is ignored. closeDoor is still respected.
proto external bool GetOutVehicle(EGetOutType type, int doorInfoIndex, ECloseDoorAfterActions closeDoor, bool performWhenPaused, bool isExitTeleport=false)
If force teleport, doorInfoIndex is used for the teleport position and closeDoor is ignored.
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
ECloseDoorAfterActions
EGetOutType
Definition EGetOutType.c:13
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134