Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_RearmRequestedTaskEntity.c
Go to the documentation of this file.
4
5class SCR_RearmRequestedTaskEntity : SCR_BaseRequestedTaskEntity
6{
7 protected const int PERIODICAL_CHECK_INTERVAL = 2000; //ms
8
9 [Attribute("150", UIWidgets.EditBox, "Area radius [m]", "0 inf")]
10 protected float m_fAreaRadius;
11
12 [Attribute("180", UIWidgets.EditBox, "The time [s] it takes to finish a task when arsenal truck is in the zone", "0 inf")]
13 protected float m_fFinishTime;
14
15 protected float m_fAreaRadiusSq;
16 protected int m_iSpentSupplies;
18 protected RplComponent m_RplComponent;
19
22
23 //------------------------------------------------------------------------------------------------
24 protected void AddXPReward()
25 {
26 SCR_XPHandlerComponent comp = SCR_XPHandlerComponent.Cast(GetGame().GetGameMode().FindComponent(SCR_XPHandlerComponent));
27 if (!comp || !m_RplComponent || m_RplComponent.IsProxy())
28 return;
29
30 // add XP to all players in the assigned group
31 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
32 if (!assigneePlayerIDs)
33 return;
34
35 foreach (int playerID : assigneePlayerIDs)
36 {
37 comp.AwardXP(playerID, SCR_EXPRewards.REARM_TASK_COMPLETED, 1.0, false);
38 }
39 }
40
41 //------------------------------------------------------------------------------------------------
42 protected void RegisterVehicle(IEntity vehicle)
43 {
44 ChimeraWorld world = GetGame().GetWorld();
45 if (!world)
46 return;
47
48 // set vehicle start timestamp in the zone
49 m_mArsenalTrucksInZone.Set(vehicle, world.GetServerTimestamp());
50
51 #ifdef REARM_TASK_DEBUG
52 PrintFormat("Rearm task, arsenal truck registered to the zone");
53 #endif
54 }
55
56 //------------------------------------------------------------------------------------------------
57 protected void UnregisterVehicle(IEntity vehicle)
58 {
59 m_mArsenalTrucksInZone.Remove(vehicle);
60
61 #ifdef REARM_TASK_DEBUG
62 PrintFormat("Rearm task, arsenal truck unregistered from the zone");
63 #endif
64 }
65
66 //------------------------------------------------------------------------------------------------
67 protected void PeriodicalCheck()
68 {
69 ChimeraWorld world = GetGame().GetWorld();
70 if (!world)
71 return;
72
73 WorldTimestamp currentTime = world.GetServerTimestamp();
74
75 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
76 if (!assigneePlayerIDs)
77 return; // TODO check can be there return
78
79 foreach (int playerID : assigneePlayerIDs)
80 {
81 IEntity playerEntity = GetGame().GetPlayerManager().GetPlayerControlledEntity(playerID);
82 if (!playerEntity)
83 continue;
84
86 if (!compartmentAccess)
87 continue;
88
89 IEntity vehicle = compartmentAccess.GetVehicle();
90 if (!vehicle)
91 continue;
92
93 SCR_EditableVehicleComponent editableVehicle = SCR_EditableVehicleComponent.Cast(vehicle.FindComponent(SCR_EditableVehicleComponent));
94 if (!editableVehicle)
95 continue;
96
97 // check if it is arsenal truck
98 SCR_EditableEntityUIInfo info = SCR_EditableEntityUIInfo.Cast(editableVehicle.GetInfo());
99 if (!info || !info.HasEntityLabel(EEditableEntityLabel.TRAIT_REARMING))
100 continue;
101
102 if (vector.DistanceSqXZ(vehicle.GetOrigin(), GetOrigin()) > m_fAreaRadiusSq)
103 {
104 // player could leave the zone
105 UnregisterVehicle(vehicle);
106 continue;
107 }
108
109 if (m_mArsenalTrucksInZone.Contains(vehicle))
110 continue;
111
112 // the vehicle has entered the zone by a player who is in the assigned group
113
114 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.FindResourceComponent(vehicle);
115 if (!resourceComponent)
116 continue;
117
118 SCR_ResourceContainer container = resourceComponent.GetContainer(EResourceType.SUPPLIES);
119 if (!container)
120 continue;
121
122 // check resourses
123 float neededResources = container.GetMaxResourceValue() * 0.5;
124 if (container.GetResourceValue() < neededResources)
125 continue;
126
127 RegisterVehicle(vehicle);
128 }
129
130 foreach (IEntity vehicle, WorldTimestamp timestamp : m_mArsenalTrucksInZone)
131 {
132 if (!vehicle)
133 continue; // probably destroyed
134
135 SCR_DamageManagerComponent damageManager = SCR_DamageManagerComponent.Cast(vehicle.FindComponent(SCR_DamageManagerComponent));
136 if (!damageManager || damageManager.GetState() == EDamageState.DESTROYED)
137 continue;
138
139 // check finish by time
140 WorldTimestamp finishTimestamp = timestamp.PlusSeconds(m_fFinishTime);
141
142 #ifdef REARM_TASK_DEBUG
143 PrintFormat("Rearm task, finish remaining time %1", finishTimestamp.DiffSeconds(currentTime));
144 #endif
145
146 if (currentTime.Less(finishTimestamp))
147 continue;
148
149 m_TaskSystem.SetTaskState(this, SCR_ETaskState.COMPLETED);
150 DeleteTask();
151
152 break;
153 }
154 }
155
156 //------------------------------------------------------------------------------------------------
157 protected void OnArsenalItemRequested(SCR_ResourceComponent resourceComponent, ResourceName resourceName, IEntity requesterEntity, BaseInventoryStorageComponent inventoryStorageComponent, EResourceType resourceType, int resourceValue)
158 {
159 if (!resourceComponent || !inventoryStorageComponent)
160 return;
161
162 SCR_ArsenalComponent arsenalComponent = SCR_ArsenalComponent.FindArsenalComponent(resourceComponent.GetOwner());
163 if (!arsenalComponent || resourceType != EResourceType.SUPPLIES)
164 return;
165
166 IEntity parent = resourceComponent.GetOwner().GetRootParent(); // vehicle
167 if (!parent)
168 return;
169
170 SCR_ChimeraCharacter character = SCR_ChimeraCharacter.Cast(inventoryStorageComponent.GetOwner());
171 if (!character && inventoryStorageComponent.GetOwner())
172 character = SCR_ChimeraCharacter.Cast(inventoryStorageComponent.GetOwner().GetParent());
173
174 int requesterPlayerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(character);
175
176 #ifdef REARM_TASK_DEBUG
177 PrintFormat("Rearm task, OnArsenalItemRequested, playerId:%1 character:%2", requesterPlayerId, character);
178 #endif
179
180 RegisterSpentSupplies(parent, requesterPlayerId, resourceValue);
181 }
182
183 //------------------------------------------------------------------------------------------------
184 protected void OnSupportStationExecuted(SCR_BaseSupportStationComponent supportStation, ESupportStationType supportStationType, IEntity actionOwner, IEntity actionUser, SCR_BaseUseSupportStationAction action)
185 {
186 if (!supportStation)
187 return;
188
189 IEntity parent = supportStation.GetOwner().GetRootParent();
190 if (!parent || !action || !actionUser)
191 return;
192
193 int playerId = GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(actionUser);
194
195 RegisterSpentSupplies(parent, playerId, action.GetSupportStationSuppliesOnUse());
196 }
197
198 //------------------------------------------------------------------------------------------------
199 protected void RegisterSpentSupplies(IEntity vehicle, int playerId, int supplyCost)
200 {
201 if (supplyCost <= 0 || !vehicle || !m_mArsenalTrucksInZone.Contains(vehicle))
202 return;
203
204 array<int> assigneePlayerIDs = GetTaskAssigneePlayerIDs();
205 if (!assigneePlayerIDs)
206 return;
207
208 // ignore players with same task
209 SCR_TaskExecutor taskExecutor = SCR_TaskExecutor.FromPlayerID(playerId);
210 if (assigneePlayerIDs.Contains(playerId))
211 return;
212
213 m_iSpentSupplies += supplyCost;
214
215 SCR_ResourceComponent resourceComponent = SCR_ResourceComponent.FindResourceComponent(vehicle);
216 if (!resourceComponent)
217 return;
218
219 SCR_ResourceContainer container = resourceComponent.GetContainer(EResourceType.SUPPLIES);
220 if (!container)
221 return;
222
223 float neededSupplies = container.GetMaxResourceValue() * 0.5;
224
225 #ifdef REARM_TASK_DEBUG
226 PrintFormat("Rearm task, SpentSupplies:%1 neededSupplies:%2", m_iSpentSupplies, neededSupplies);
227 #endif
228
229 // check spent resourses from arsenal truck for finish task sooner
230 if (m_iSpentSupplies < neededSupplies)
231 return;
232
233 m_TaskSystem.SetTaskState(this, SCR_ETaskState.COMPLETED);
234 DeleteTask();
235 }
236
237 //------------------------------------------------------------------------------------------------
239 {
240 if (task != this)
241 return;
242
243 if (newState == SCR_ETaskState.COMPLETED)
244 {
245 AddXPReward();
246
247 #ifdef REARM_TASK_DEBUG
248 PrintFormat("Rearm task, finish task");
249 #endif
250 }
251 }
252
253 //------------------------------------------------------------------------------------------------
254 override void EOnInit(IEntity owner)
255 {
256 super.EOnInit(owner);
257
258 if (SCR_Global.IsEditMode(this))
259 return;
260
262
263 GetOnTaskStateChanged().Insert(OnTaskStateChanged);
264
266
267 m_RplComponent = RplComponent.Cast(owner.FindComponent(RplComponent));
268 if (!m_RplComponent || m_RplComponent.IsProxy())
269 return;
270
271 GetGame().GetCallqueue().CallLater(PeriodicalCheck, PERIODICAL_CHECK_INTERVAL, true);
272
274 if (supportStationManager)
276
278 }
279
280 //------------------------------------------------------------------------------------------------
282 {
283 GetOnTaskStateChanged().Remove(OnTaskStateChanged);
284 GetGame().GetCallqueue().Remove(PeriodicalCheck);
285
287 if (supportStationManager)
289
291
293 }
294}
EEditableEntityLabel
ESupportStationType
ArmaReforgerScripted GetGame()
Definition game.c:1398
ResourceName resourceName
Definition SCR_AIGroup.c:66
vector GetOrigin()
void DeleteTask()
void PeriodicalCheck()
float m_fAreaRadius
SCR_AttackTaskEntityClass PERIODICAL_CHECK_INTERVAL
float m_fAreaRadiusSq
SCR_BaseGameMode GetGameMode()
RplComponent m_RplComponent
void OnTaskStateChanged(SCR_Task task, SCR_ETaskState newState)
void AddXPReward()
void SCR_GroupsManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
ref map< IEntity, WorldTimestamp > m_mArsenalTrucksInZone
map for tracking arsenal trucks which got in the zone, <vehicle, serverTimeStamp>
void UnregisterVehicle(IEntity vehicle)
void OnArsenalItemRequested(SCR_ResourceComponent resourceComponent, ResourceName resourceName, IEntity requesterEntity, BaseInventoryStorageComponent inventoryStorageComponent, EResourceType resourceType, int resourceValue)
SCR_GroupsManagerComponent m_GroupsManagerComponent
void RegisterSpentSupplies(IEntity vehicle, int playerId, int supplyCost)
void RegisterVehicle(IEntity vehicle)
void ~SCR_RearmRequestedTaskEntity()
array< int > GetTaskAssigneePlayerIDs()
Definition SCR_Task.c:458
void SCR_Task(IEntitySource src, IEntity parent)
Definition SCR_Task.c:1938
SCR_ETaskState
Definition SCR_Task.c:3
SCR_TaskSystem m_TaskSystem
void OnSupportStationExecuted(SCR_BaseSupportStationComponent supportStation, ESupportStationType supportStationType, IEntity actionTarget, IEntity actionUser, SCR_BaseUseSupportStationAction action)
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external IEntity GetRootParent()
static SCR_ArsenalComponent FindArsenalComponent(notnull IEntity entity, bool getFromSlotted=true)
bool HasEntityLabel(EEditableEntityLabel label)
static bool IsEditMode()
Definition Functions.c:1566
ScriptInvokerBase< SupportStation_OnSupportStationExecuted > GetOnSupportStationExecutedSuccessfully()
static SCR_SupportStationManagerComponent GetInstance()
Definition Types.c:486
override void EOnInit(IEntity owner)
proto void PrintFormat(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL, LogLevel level=LogLevel.NORMAL)
SCR_FieldOfViewSettings Attribute
EDamageState