Dayz Explorer 1.28.160049
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 }
42
43 override bool IsElectricAppliance()
44 {
45 return true;
46 }
47
48 override void OnWork( float consumed_energy )
49 {
50 // Charging functionality
51 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
52
53 if ( battery )
54 {
55 if ( GetGame().IsServer() )
56 {
57 float battery_capacity = battery.GetCompEM().GetEnergyMax();
58
59 if ( battery.GetCompEM().GetEnergy() < battery_capacity )
60 {
61 float charger_health = GetHealth("", "");
62 float energy_add = m_ChargeEnergyPerSecond * ( consumed_energy / GetCompEM().GetEnergyUsage() );
63
64 #ifdef DIAG_DEVELOPER
65 if (FeatureTimeAccel.GetFeatureTimeAccelEnabled(ETimeAccelCategories.ENERGY_RECHARGE))
66 {
67 float timeAccel = FeatureTimeAccel.GetFeatureTimeAccelValue();
68 energy_add *= timeAccel;
69 }
70 #endif
71
72 if ( GetCompEM().ConsumeEnergy(energy_add) ) // consumes energy from the power source
73 {
74 // There is enough of energy to use
75 energy_add = energy_add * ( 0.5 + charger_health*0.005 ); // Damaged charger works less efficiently - 50% damage causes 75% efficiency
76 }
77 else
78 {
79 // There is NOT enough of energy to use
80 energy_add = 0;
81 }
82
83 battery.GetCompEM().AddEnergy( energy_add );
84 }
85 else
86 {
87 battery.GetCompEM().SetEnergy( battery_capacity );
88 }
89 m_BatteryEnergy0To100 = battery.GetCompEM().GetEnergy0To100();
90 SetSynchDirty();
91 }
92 }
93 }
94
95 override void OnWorkStart()
96 {
97 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
98 {
100 m_UpdateStatusLightsTimer.Run( m_BlinkingStatusLightInterval/2 , this, "UpdateStatusLights", NULL, true);
101 }
102 }
103
104 override void OnWorkStop()
105 {
106 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
107 {
109 m_UpdateStatusLightsTimer.Stop();
110 }
111 }
112
114 {
115 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
116 {
117 if (GetCompEM().IsWorking())
118 {
120 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
121
122 if (battery)
123 {
124 RedLightOff();
125
126 if (m_BatteryEnergy0To100 <= 33)
127 {
128 // Less than 1/3 charged, yellow status light must repeatedly blink
129
130 if (m_BlinkingStatusLightIsOn)
132 else
134
135 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
136 }
137 else if (m_BatteryEnergy0To100 > 33 && m_BatteryEnergy0To100 <= 66)
138 {
139 // Less than 2/3 charged, yellow status light must glow
140
142 }
143 else if (m_BatteryEnergy0To100 > 66 && m_BatteryEnergy0To100 < 100)
144 {
145 // Less than 3/3 charged, yellow status light must glow, green light must blink
146
148
149 if (m_BlinkingStatusLightIsOn)
150 GreenLightOn();
151 else
153
154 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
155 }
156 else if (m_BatteryEnergy0To100 >= 100)
157 {
158 // Fully charged, green light must glow
160 GreenLightOn();
161 }
162 }
163 else
164 {
165 if (m_BlinkingStatusLightIsOn)
166 RedLightOn();
167 else
168 RedLightOff();
169
170 m_BlinkingStatusLightIsOn = !m_BlinkingStatusLightIsOn;
171
174 }
175 }
176 else
177 {
180 RedLightOff();
182 }
183 }
184 }
185
186 override bool CanPutInCargo( EntityAI parent )
187 {
188 if( !super.CanPutInCargo(parent) ) {return false;}
189 // No "Take" action if the item is connected
190 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
191 {
192 return true;
193 }
194
195 return false;
196 }
197
198 override bool CanPutIntoHands( EntityAI parent )
199 {
200 if( !super.CanPutIntoHands( parent ) )
201 {
202 return false;
203 }
204 // No "Take into hands" action if the item is connected
205 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
206 {
207 return true;
208 }
209
210 return false;
211 }
212
213 override void OnOwnSocketTaken( EntityAI device )
214 {
215 string att_type = device.GetType();
216
217 if ( att_type == "CarBattery" )
218 {
220 ShowSelection(SEL_CLIPS_CAR);
221 }
222
223 if ( att_type == "TruckBattery" )
224 {
226 ShowSelection(SEL_CLIPS_TRUCK);
227 }
228
229 HideSelection(SEL_CLIPS_DETACHED);
230 HideSelection(SEL_CLIPS_FOLDED);
231 }
232
233 override void OnOwnSocketReleased( EntityAI device )
234 {
236 ShowSelection(SEL_CLIPS_DETACHED);
237 }
238
239 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
240 {
241 if ( !super.CanReceiveAttachment(attachment, slotId) )
242 return false;
243
244 ItemBase ibase;
245 Class.CastTo(ibase, attachment);
246
247 // No attaching if the charger is in inventory!
248 PlayerBase charger_owner = PlayerBase.Cast( GetHierarchyRootPlayer() );
249 if ( charger_owner )
250 return false;
251
252 // Only one attachment allowed
253 if ( GetCompEM().GetPluggedDevice() )
254 return false;
255
256 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
257 return false;
258
259 return true;
260 }
261
262 override bool CanLoadAttachment( EntityAI attachment)
263 {
264 if ( !super.CanLoadAttachment(attachment) )
265 return false;
266
267 ItemBase ibase;
268 Class.CastTo(ibase, attachment);
269
270 // Only one attachment allowed
271 if ( GetCompEM().GetPluggedDevice() )
272 return false;
273
274 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
275 return false;
276
277 return true;
278 }
279
281 {
282 for ( int i = 0; i < ATTACHED_CLIPS_STATES_COUNT; i++ )
283 {
284 string selection = ATTACHED_CLIPS_STATES[i];
285 HideSelection(selection);
286 }
287 }
288
289
290
291 // Control of status lights
292 // ON
294 {
295 SetObjectMaterial( 0, RED_LIGHT_GLOW );
296 }
298 {
299 SetObjectMaterial( 2, GREEN_LIGHT_GLOW );
300 }
302 {
303 SetObjectMaterial( 1, YELLOW_LIGHT_GLOW );
304 }
306 {
307 SetObjectMaterial( 3, SWITCH_LIGHT_GLOW );
308 }
309 // OFF
311 {
312 SetObjectMaterial( 0, DEFAULT_MATERIAL );
313 }
315 {
316 SetObjectMaterial( 2, DEFAULT_MATERIAL );
317 }
319 {
320 SetObjectMaterial( 1, DEFAULT_MATERIAL );
321 }
323 {
324 SetObjectMaterial( 3, DEFAULT_MATERIAL );
325 }
326
327
328 override void OnSwitchOn()
329 {
330 HideSelection(SEL_SWITCH_OFF);
331 ShowSelection(SEL_SWITCH_ON);
332 }
333
334 override void OnSwitchOff()
335 {
336 HideSelection(SEL_SWITCH_ON);
337 ShowSelection(SEL_SWITCH_OFF);
338 }
339
340 // Inventory manipulation
341 override void OnInventoryExit(Man player)
342 {
343 super.OnInventoryExit(player);
344
346 HideSelection(SEL_CLIPS_FOLDED);
347 ShowSelection(SEL_CLIPS_DETACHED);
348 }
349
350 override void OnInventoryEnter(Man player)
351 {
352 super.OnInventoryEnter(player);
353
355 HideSelection(SEL_CLIPS_DETACHED);
356 ShowSelection(SEL_CLIPS_FOLDED);
357 }
358
359 override void RefreshPhysics()
360 {
361 super.RefreshPhysics();
362
363 if ( GetAttachmentByType(CarBattery) )
364 {
365 RemoveProxyPhysics( "battery" );
366 AddProxyPhysics( "battery" );
367 }
368 else
369 RemoveProxyPhysics( "battery" );
370 }
371
372 //================================================================
373 // ADVANCED PLACEMENT
374 //================================================================
375
376 override void OnPlacementStarted(Man player)
377 {
378 super.OnPlacementStarted(player);
379
380 SetAnimationPhase(SEL_CLIPS_DETACHED, 0);
381 SetAnimationPhase(SEL_CLIPS_FOLDED, 1);
382 SetAnimationPhase(SEL_SWITCH_ON, 1);
383 SetAnimationPhase(SEL_SWITCH_OFF, 1);
384 SetAnimationPhase(SEL_LIGHT_STATE_1, 1);
385 SetAnimationPhase(SEL_LIGHT_STATE_2, 1);
386 SetAnimationPhase(SEL_LIGHT_STATE_3, 1);
387
388 array<string> selections = {
392 SEL_CLIPS_FOLDED
393 };
394
395 PlayerBase playerPB = PlayerBase.Cast(player);
396 foreach (string selection : selections)
397 {
398 if (GetGame().IsMultiplayer() && GetGame().IsServer())
399 playerPB.GetHologramServer().SetSelectionToRefresh(selection);
400 else
401 playerPB.GetHologramLocal().SetSelectionToRefresh(selection);
402 }
403 }
404
405 override bool IsDeployable()
406 {
407 return true;
408 }
409
410 override string GetDeploySoundset()
411 {
412 return "placeBatteryCharger_SoundSet";
413 }
414
426}
eBleedingSourceType GetType()
ActionPlaceObjectCB ActiondeployObjectCB ActionPlaceObject()
void AddAction(typename actionName)
Super root of all classes in Enforce script.
Definition enscript.c:11
override void OnSwitchOn()
override void OnInventoryEnter(Man player)
void GreenLightOn()
override void OnWork(float consumed_energy)
override void OnWorkStart()
override void OnOwnSocketReleased(EntityAI device)
override void OnOwnSocketTaken(EntityAI device)
void GreenLightOff()
override void OnPlacementStarted(Man player)
override bool CanPutIntoHands(EntityAI parent)
override bool IsElectricAppliance()
override void SetActions()
void SwitchLightOff()
override bool CanLoadAttachment(EntityAI attachment)
const string SEL_CORD_PLUGGED
override string GetDeploySoundset()
void UpdateStatusLights()
override void OnWorkStop()
int m_BatteryEnergy0To100
void HideAttachedClipsStates()
ref Timer m_UpdateStatusLightsTimer
float m_ChargeEnergyPerSecond
override void RefreshPhysics()
bool m_BlinkingStatusLightIsOn
override void OnSwitchOff()
const int ATTACHED_CLIPS_STATES_COUNT
const string SEL_CORD_FOLDED
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
const string SEL_CLIPS_DETACHED
override void OnInventoryExit(Man player)
void RedLightOff()
void YellowLightOn()
void SwitchLightOn()
const string SEL_CLIPS_CAR
void BatteryCharger()
void RedLightOn()
override bool IsDeployable()
void YellowLightOff()
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native CGame GetGame()
const int CALL_CATEGORY_SYSTEM
Definition tools.c:8