Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_GetInUserAction.c
Go to the documentation of this file.
2{
3 protected const LocalizedString OCCUPIED_BY_SUPPLIES = "#AR-UserAction_SeatOccupied";
4
5 protected SCR_BaseLockComponent m_pLockComp;
7 protected SCR_ResourceComponent m_ResourceComp;
8 protected SCR_BaseCompartmentManagerComponent m_CompartmentManager;
9
10 //------------------------------------------------------------------------------------------------
11 override void Init(IEntity pOwnerEntity, GenericComponent pManagerComponent)
12 {
13 IEntity vehicle = SCR_EntityHelper.GetMainParent(pOwnerEntity, true);
14 if (!vehicle)
15 return;
16
17 m_pLockComp = SCR_BaseLockComponent.Cast(pOwnerEntity.FindComponent(SCR_BaseLockComponent));
19
20 //~ Hotfix to prevent get in action if the vehicle has supplies
21 m_CompartmentManager = SCR_BaseCompartmentManagerComponent.Cast(pOwnerEntity.FindComponent(SCR_BaseCompartmentManagerComponent));
22 if (m_CompartmentManager && m_CompartmentManager.BlockSuppliesIfOccupied())
23 m_ResourceComp = SCR_ResourceComponent.FindResourceComponent(pOwnerEntity, true);
24 }
25
26 //------------------------------------------------------------------------------------------------
27 override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity)
28 {
29 if (!pOwnerEntity || !pUserEntity)
30 return;
31
32 ChimeraCharacter character = ChimeraCharacter.Cast(pUserEntity);
33 if (!character)
34 return;
35
36 SCR_CharacterControllerComponent controller = SCR_CharacterControllerComponent.Cast(character.GetCharacterController());
37 if (controller && controller.IsLoitering())
38 return;
39
40 BaseCompartmentSlot targetCompartment = GetCompartmentSlot();
41 if (!targetCompartment)
42 return;
43
44 CompartmentAccessComponent compartmentAccess = character.GetCompartmentAccessComponent();
45 if (!compartmentAccess)
46 return;
47
48 if (!compartmentAccess.GetInVehicle(pOwnerEntity, targetCompartment, false, GetRelevantDoorIndex(pUserEntity), ECloseDoorAfterActions.RETURN_TO_PREVIOUS_STATE, false))
49 return;
50
51 super.PerformAction(pOwnerEntity, pUserEntity);
52 }
53
54 //------------------------------------------------------------------------------------------------
55 override bool CanBePerformedScript(IEntity user)
56 {
57 if (m_DamageManager && m_DamageManager.GetState() == EDamageState.DESTROYED)
58 return false;
59
60 BaseCompartmentSlot compartment = GetCompartmentSlot();
61 if (!compartment)
62 return false;
63
64 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(user);
65 if (!character)
66 return false;
67
68 SCR_CharacterControllerComponent controller = SCR_CharacterControllerComponent.Cast(character.GetCharacterController());
69 if (controller && controller.IsLoitering())
70 return false;
71
72 CompartmentAccessComponent compartmentAccess = character.GetCompartmentAccessComponent();
73 if (!compartmentAccess)
74 return false;
75
76 //~ TODO: Hotfix until proper solution, only blocks player does not block AI or Editor actions
77 float storedResources;
78 if (m_ResourceComp && m_CompartmentManager && m_CompartmentManager.BlockSuppliesIfOccupied())
79 {
80 if (SCR_ResourceSystemHelper.GetStoredResources(m_ResourceComp, storedResources) && storedResources > 0)
81 {
83 return false;
84 }
85 }
86
87 IEntity owner = compartment.GetOwner();
88 Vehicle vehicle = Vehicle.Cast(SCR_EntityHelper.GetMainParent(owner, true));
89 if (vehicle)
90 {
91 Faction characterFaction = character.GetFaction();
92 Faction vehicleFaction = vehicle.GetFaction();
93 if (characterFaction && vehicleFaction && characterFaction.IsFactionEnemy(vehicleFaction))
94 {
95 SetCannotPerformReason("#AR-UserAction_SeatHostile");
96 return false;
97 }
98 }
99
100 if (compartment.GetOccupant() || m_CompartmentManager.IsGetInAndOutBlockedByDoorUser(GetRelevantDoorIndex(user)))
101 {
102 SetCannotPerformReason("#AR-UserAction_SeatOccupied");
103 return false;
104 }
105
106 // Check if the position isn't lock.
107 if (m_pLockComp && m_pLockComp.IsLocked(user, compartment))
108 {
109 SetCannotPerformReason(m_pLockComp.GetCannotPerformReason(user));
110 return false;
111 }
112
113 if (compartment.IsReserved() && !compartment.IsReservedBy(user))
114 {
115 SetCannotPerformReason("#AR-Campaign_Action_CannotEnterVehicle-UC");
116 return false;
117 }
118
119 // Make sure vehicle can be enter via provided door, if not, set reason.
120 if (!compartmentAccess.CanGetInVehicleViaDoor(owner, m_CompartmentManager, GetRelevantDoorIndex(user)))
121 {
122 SetCannotPerformReason("#AR-UserAction_SeatObstructed");
123 return false;
124 }
125
126 return true;
127 }
128
129 //------------------------------------------------------------------------------------------------
130 override bool CanBeShownScript(IEntity user)
131 {
132 if (m_DamageManager && m_DamageManager.GetState() == EDamageState.DESTROYED)
133 return false;
134
135 BaseCompartmentSlot compartment = GetCompartmentSlot();
136 if (!compartment)
137 return false;
138
139 ChimeraCharacter occupant = ChimeraCharacter.Cast(compartment.GetOccupant());
140 if (occupant)
141 {
142 CharacterControllerComponent controller = occupant.GetCharacterController();
143 if (controller && controller.GetLifeState() != ECharacterLifeState.ALIVE)
144 return false;
145 }
146
147 ChimeraCharacter character = ChimeraCharacter.Cast(user);
148 if (character && character.IsInVehicle())
149 return false;
150
151 CompartmentAccessComponent compartmentAccess = character.GetCompartmentAccessComponent();
152 if (!compartmentAccess)
153 return false;
154
155 if (compartmentAccess.IsGettingIn() || compartmentAccess.IsGettingOut())
156 return false;
157
158 return true;
159 }
160};
void SetCannotPerformReason(string reason)
proto external Managed FindComponent(typename typeName)
static IEntity GetMainParent(IEntity entity, bool self=false)
SCR_ResourceComponent m_ResourceComp
override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity)
DamageManagerComponent m_DamageManager
const LocalizedString OCCUPIED_BY_SUPPLIES
override void Init(IEntity pOwnerEntity, GenericComponent pManagerComponent)
override bool CanBeShownScript(IEntity user)
SCR_BaseCompartmentManagerComponent m_CompartmentManager
SCR_BaseLockComponent m_pLockComp
override bool CanBePerformedScript(IEntity user)
enum EPhysicsLayerPresets Vehicle
Definition gameLib.c:24
ECharacterLifeState
EDamageState
ECloseDoorAfterActions