DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
BatteryCharger.c
Go to the documentation of this file.
1class BatteryCharger extends ItemBase
2{
3 // Model selections
4 static protected const string SEL_CLIPS_CAR = "clips_car_battery";
5 static protected const string SEL_CLIPS_TRUCK = "clips_truck_battery";
6 static protected const string SEL_CLIPS_DETACHED = "clips_detached";
7 static protected const string SEL_CLIPS_FOLDED = "clips_folded";
8 static protected const string SEL_SWITCH_ON = "switch_on";
9 static protected const string SEL_SWITCH_OFF = "switch_off";
10 static protected const string SEL_CORD_PLUGGED = "cord_plugged";
11 static protected const string SEL_CORD_FOLDED = "cord_folded";
12 static protected const string SEL_LIGHT_STATE_1 = "light_stand_by";
13 static protected const string SEL_LIGHT_STATE_2 = "light_charging";
14 static protected const string SEL_LIGHT_STATE_3 = "light_charged";
15
16 // glow materials
17 static protected const string RED_LIGHT_GLOW = "dz\\gear\\camping\\data\\battery_charger_light_r.rvmat";
18 static protected const string GREEN_LIGHT_GLOW = "dz\\gear\\camping\\data\\battery_charger_light_g.rvmat";
19 static protected const string YELLOW_LIGHT_GLOW = "dz\\gear\\camping\\data\\battery_charger_light_y.rvmat";
20 static protected const string SWITCH_LIGHT_GLOW = "dz\\gear\\camping\\data\\battery_charger_light_switch_on.rvmat";
21 static protected const string DEFAULT_MATERIAL = "dz\\gear\\camping\\data\\battery_charger.rvmat";
22
23 protected const string ATTACHED_CLIPS_STATES[] = {SEL_CLIPS_CAR, SEL_CLIPS_TRUCK}; // TO DO: If it's required by design, add helicopter battery here and register its selection names.
24 protected const int ATTACHED_CLIPS_STATES_COUNT = 2; // Reffers to this ^ array
25
26
27
29 protected float m_ChargeEnergyPerSecond;
30
31 static protected float m_BlinkingStatusLightInterval = 0.4; // How often the lights blink
33 protected bool m_BlinkingStatusLightIsOn = false; // Status of one blinking light
34
36 {
37 m_ChargeEnergyPerSecond = GetGame().ConfigGetFloat ("CfgVehicles " + GetType() + " ChargeEnergyPerSecond");
38 m_UpdateStatusLightsTimer = new Timer( CALL_CATEGORY_SYSTEM );
40 RegisterNetSyncVariableInt("m_BatteryEnergy0To100");
41 RegisterNetSyncVariableBool("m_IsSoundSynchRemote");
42 RegisterNetSyncVariableBool("m_IsPlaceSound");
43 }
44
45 override bool IsElectricAppliance()
46 {
47 return true;
48 }
49
50 override void OnWork( float consumed_energy )
51 {
52 // Charging functionality
53 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
54
55 if ( battery )
56 {
57 if ( GetGame().IsServer() )
58 {
59 float battery_capacity = battery.GetCompEM().GetEnergyMax();
60
61 if ( battery.GetCompEM().GetEnergy() < battery_capacity )
62 {
63 // Heat up the items so players know they are working.
64 this.SetTemperature(60);
65 battery.SetTemperature(60);
66
67 float charger_health = GetHealth("", "");
68 float energy_add = m_ChargeEnergyPerSecond * ( consumed_energy / GetCompEM().GetEnergyUsage() );
69
70 #ifdef DIAG_DEVELOPER
71 if (FeatureTimeAccel.GetFeatureTimeAccelEnabled(ETimeAccelCategories.ENERGY_RECHARGE))
72 {
73 float timeAccel = FeatureTimeAccel.GetFeatureTimeAccelValue();
74 energy_add *= timeAccel;
75 }
76 #endif
77
78 if ( GetCompEM().ConsumeEnergy(energy_add) ) // consumes energy from the power source
79 {
80 // There is enough of energy to use
81 energy_add = energy_add * ( 0.5 + charger_health*0.005 ); // Damaged charger works less efficiently - 50% damage causes 75% efficiency
82 }
83 else
84 {
85 // There is NOT enough of energy to use
86 energy_add = 0;
87 }
88
89 battery.GetCompEM().AddEnergy( energy_add );
90 }
91 else
92 {
93 battery.GetCompEM().SetEnergy( battery_capacity );
94 }
95 m_BatteryEnergy0To100 = battery.GetCompEM().GetEnergy0To100();
96 SetSynchDirty();
97 }
98 }
99 }
100
101 override void OnWorkStart()
102 {
103 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
104 {
106 m_UpdateStatusLightsTimer.Run( m_BlinkingStatusLightInterval/2 , this, "UpdateStatusLights", NULL, true);
107 }
108 }
109
110 override void OnWorkStop()
111 {
112 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
113 {
115 m_UpdateStatusLightsTimer.Stop();
116 }
117 }
118
120 {
121 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
122 {
123 if (GetCompEM().IsWorking())
124 {
126 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
127
128 if (battery)
129 {
130 RedLightOff();
131
132 if (m_BatteryEnergy0To100 <= 33)
133 {
134 // Less than 1/3 charged, yellow status light must repeatedly blink
135
136 if (m_BlinkingStatusLightIsOn)
138 else
140
141 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
142 }
143 else if (m_BatteryEnergy0To100 > 33 && m_BatteryEnergy0To100 <= 66)
144 {
145 // Less than 2/3 charged, yellow status light must glow
146
148 }
149 else if (m_BatteryEnergy0To100 > 66 && m_BatteryEnergy0To100 < 100)
150 {
151 // Less than 3/3 charged, yellow status light must glow, green light must blink
152
154
155 if (m_BlinkingStatusLightIsOn)
156 GreenLightOn();
157 else
159
160 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
161 }
162 else if (m_BatteryEnergy0To100 >= 100)
163 {
164 // Fully charged, green light must glow
166 GreenLightOn();
167 }
168 }
169 else
170 {
171 if (m_BlinkingStatusLightIsOn)
172 RedLightOn();
173 else
174 RedLightOff();
175
176 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
177
180 }
181 }
182 else
183 {
186 RedLightOff();
188 }
189 }
190 }
191
192 override bool CanPutInCargo( EntityAI parent )
193 {
194 if( !super.CanPutInCargo(parent) ) {return false;}
195 // No "Take" action if the item is connected
196 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
197 {
198 return true;
199 }
200
201 return false;
202 }
203
204 override bool CanPutIntoHands( EntityAI player )
205 {
206 if( !super.CanPutIntoHands( parent ) )
207 {
208 return false;
209 }
210 // No "Take into hands" action if the item is connected
211 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
212 {
213 return true;
214 }
215
216 return false;
217 }
218
219 override void OnOwnSocketTaken( EntityAI device )
220 {
221 string att_type = device.GetType();
222
223 if ( att_type == "CarBattery" )
224 {
226 ShowSelection(SEL_CLIPS_CAR);
227 }
228
229 if ( att_type == "TruckBattery" )
230 {
232 ShowSelection(SEL_CLIPS_TRUCK);
233 }
234
235 HideSelection(SEL_CLIPS_DETACHED);
236 HideSelection(SEL_CLIPS_FOLDED);
237 }
238
239 override void OnOwnSocketReleased( EntityAI device )
240 {
242 ShowSelection(SEL_CLIPS_DETACHED);
243 }
244
245 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
246 {
247 if ( !super.CanReceiveAttachment(attachment, slotId) )
248 return false;
249
250 ItemBase ibase;
251 Class.CastTo(ibase, attachment);
252
253 // No attaching if the charger is in inventory!
254 PlayerBase charger_owner = PlayerBase.Cast( GetHierarchyRootPlayer() );
255 if ( charger_owner )
256 return false;
257
258 // Only one attachment allowed
259 if ( GetCompEM().GetPluggedDevice() )
260 return false;
261
262 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
263 return false;
264
265 return true;
266 }
267
268 override bool CanLoadAttachment( EntityAI attachment)
269 {
270 if ( !super.CanLoadAttachment(attachment) )
271 return false;
272
273 ItemBase ibase;
274 Class.CastTo(ibase, attachment);
275
276 // Only one attachment allowed
277 if ( GetCompEM().GetPluggedDevice() )
278 return false;
279
280 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
281 return false;
282
283 return true;
284 }
285
287 {
288 for ( int i = 0; i < ATTACHED_CLIPS_STATES_COUNT; i++ )
289 {
290 string selection = ATTACHED_CLIPS_STATES[i];
291 HideSelection(selection);
292 }
293 }
294
295
296
297 // Control of status lights
298 // ON
300 {
301 SetObjectMaterial( 0, RED_LIGHT_GLOW );
302 }
304 {
305 SetObjectMaterial( 2, GREEN_LIGHT_GLOW );
306 }
308 {
309 SetObjectMaterial( 1, YELLOW_LIGHT_GLOW );
310 }
312 {
313 SetObjectMaterial( 3, SWITCH_LIGHT_GLOW );
314 }
315 // OFF
317 {
318 SetObjectMaterial( 0, DEFAULT_MATERIAL );
319 }
321 {
322 SetObjectMaterial( 2, DEFAULT_MATERIAL );
323 }
325 {
326 SetObjectMaterial( 1, DEFAULT_MATERIAL );
327 }
329 {
330 SetObjectMaterial( 3, DEFAULT_MATERIAL );
331 }
332
333
334 override void OnSwitchOn()
335 {
336 HideSelection(SEL_SWITCH_OFF);
337 ShowSelection(SEL_SWITCH_ON);
338 }
339
340 override void OnSwitchOff()
341 {
342 HideSelection(SEL_SWITCH_ON);
343 ShowSelection(SEL_SWITCH_OFF);
344 }
345
346 // Inventory manipulation
347 override void OnInventoryExit(Man player)
348 {
349 super.OnInventoryExit(player);
350
352 HideSelection(SEL_CLIPS_FOLDED);
353 ShowSelection(SEL_CLIPS_DETACHED);
354 }
355
356 override void OnInventoryEnter(Man player)
357 {
358 super.OnInventoryEnter(player);
359
361 HideSelection(SEL_CLIPS_DETACHED);
362 ShowSelection(SEL_CLIPS_FOLDED);
363 }
364
366 {
367 super.OnVariablesSynchronized();
368
369 if ( IsPlaceSound() )
370 {
372 }
373 }
374
375 override void RefreshPhysics()
376 {
377 super.RefreshPhysics();
378
379 if ( GetAttachmentByType(CarBattery) )
380 {
381 RemoveProxyPhysics( "battery" );
382 AddProxyPhysics( "battery" );
383 }
384 else
385 RemoveProxyPhysics( "battery" );
386 }
387
388 //================================================================
389 // ADVANCED PLACEMENT
390 //================================================================
391
392 override void OnPlacementStarted( Man player )
393 {
394 super.OnPlacementStarted( player );
395
396 SetAnimationPhase( SEL_CLIPS_DETACHED, 0);
397 SetAnimationPhase( SEL_CLIPS_FOLDED, 1);
398 SetAnimationPhase( SEL_SWITCH_ON, 1);
399 SetAnimationPhase( SEL_SWITCH_OFF, 1);
400 SetAnimationPhase( SEL_LIGHT_STATE_1, 1);
401 SetAnimationPhase( SEL_LIGHT_STATE_2, 1);
402 SetAnimationPhase( SEL_LIGHT_STATE_3, 1);
403
404 ref array<string> array_of_selections = {SEL_CORD_PLUGGED, SEL_CORD_FOLDED, SEL_CLIPS_DETACHED, SEL_CLIPS_FOLDED};
405 PlayerBase player_PB = PlayerBase.Cast( player );
406
407 if ( GetGame().IsMultiplayer() && GetGame().IsServer() )
408 {
409 player_PB.GetHologramServer().SetSelectionToRefresh( array_of_selections );
410 }
411 else
412 {
413 player_PB.GetHologramLocal().SetSelectionToRefresh( array_of_selections );
414 }
415 }
416
417 override void OnPlacementComplete( Man player, vector position = "0 0 0", vector orientation = "0 0 0" )
418 {
419 super.OnPlacementComplete( player, position, orientation );
420
421 SetIsPlaceSound( true );
422 }
423
424 override bool IsDeployable()
425 {
426 return true;
427 }
428
429 override string GetPlaceSoundset()
430 {
431 return "placeBatteryCharger_SoundSet";
432 }
433
434 override void SetActions()
435 {
436 super.SetActions();
437
444 }
445}
eBleedingSourceType GetType()
void AddAction(typename actionName)
override void SetTemperature(float value, bool allow_client=false)
Definition ItemBase.c:8130
void SetIsPlaceSound(bool is_place_sound)
Definition ItemBase.c:8900
void PlayPlaceSound()
Definition ItemBase.c:8938
bool IsPlaceSound()
Definition ItemBase.c:8905
proto native float ConfigGetFloat(string path)
Get float value from config on path.
Super root of all classes in Enforce script.
Definition EnScript.c:11
protected const int ATTACHED_CLIPS_STATES_COUNT
int m_BatteryEnergy0To100
static protected const string SEL_CORD_FOLDED
void SwitchLightOn()
override void OnInventoryExit(Man player)
void SwitchLightOff()
void RedLightOff()
override void OnSwitchOn()
void GreenLightOn()
protected bool m_BlinkingStatusLightIsOn
override bool CanPutIntoHands(EntityAI player)
override void OnSwitchOff()
override void RefreshPhysics()
override bool CanPutInCargo(EntityAI parent)
override void OnWorkStop()
protected float m_ChargeEnergyPerSecond
void YellowLightOn()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
void YellowLightOff()
override string GetPlaceSoundset()
override void OnWork(float consumed_energy)
static protected const string SEL_CLIPS_DETACHED
override bool IsElectricAppliance()
override bool IsDeployable()
void HideAttachedClipsStates()
override void OnWorkStart()
override void OnOwnSocketReleased(EntityAI device)
override void OnOwnSocketTaken(EntityAI device)
override void OnPlacementStarted(Man player)
ref Timer m_UpdateStatusLightsTimer
void RedLightOn()
override void OnInventoryEnter(Man player)
override void OnVariablesSynchronized()
static protected const string SEL_CORD_PLUGGED
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
void UpdateStatusLights()
void BatteryCharger()
override bool CanLoadAttachment(EntityAI attachment)
static protected const string SEL_CLIPS_CAR
override void SetActions()
void GreenLightOff()
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native CGame GetGame()
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int CALL_CATEGORY_SYSTEM
Definition tools.c:8