DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
BatteryCharger.c
См. документацию.
1class BatteryCharger extends ItemBase
2{
3 // Model selections
4 protected static const string SEL_CLIPS_CAR = "clips_car_battery";
5 protected static const string SEL_CLIPS_TRUCK = "clips_truck_battery";
6 protected static const string SEL_CLIPS_DETACHED = "clips_detached";
7 protected static const string SEL_CLIPS_FOLDED = "clips_folded";
8 protected static const string SEL_SWITCH_ON = "switch_on";
9 protected static const string SEL_SWITCH_OFF = "switch_off";
10 protected static const string SEL_CORD_PLUGGED = "cord_plugged";
11 protected static const string SEL_CORD_FOLDED = "cord_folded";
12 protected static const string SEL_LIGHT_STATE_1 = "light_stand_by";
13 protected static const string SEL_LIGHT_STATE_2 = "light_charging";
14 protected static const string SEL_LIGHT_STATE_3 = "light_charged";
15 protected static const string SEL_STANDBY_LIGHT = "light_stand_by_on";
16 protected static const string SEL_SWITCH_LIGHT_ON = "light_switch_on";
17 protected static const string SEL_LIGHT_CHARGED_ON = "light_charged_on";
18 protected static const string SEL_LIGHT_CHARGING_ON = "light_charging_on";
19
20 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.
21 protected const int ATTACHED_CLIPS_STATES_COUNT = 2; // Reffers to this ^ array
22
24 protected float m_ChargeEnergyPerSecond;
25
26 static protected float m_BlinkingStatusLightInterval = 0.4; // How often the lights blink
28 protected bool m_BlinkingStatusLightIsOn = false; // Status of one blinking light
29
31 {
32 m_ChargeEnergyPerSecond = g_Game.ConfigGetFloat ("CfgVehicles " + GetType() + " ChargeEnergyPerSecond");
34 RegisterNetSyncVariableInt("m_BatteryEnergy0To100");
35 }
36
37 override void EEInit()
38 {
39 super.EEInit();
40
41 // Set visuals on init
46 }
47
48 override bool IsElectricAppliance()
49 {
50 return true;
51 }
52
53 override void OnWork( float consumed_energy )
54 {
55 // Charging functionality
56 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
57
58 if ( battery )
59 {
60 if ( g_Game.IsServer() )
61 {
62 float battery_capacity = battery.GetCompEM().GetEnergyMax();
63
64 if ( battery.GetCompEM().GetEnergy() < battery_capacity )
65 {
66 float charger_health = GetHealth("", "");
67 float energy_add = m_ChargeEnergyPerSecond * ( consumed_energy / GetCompEM().GetEnergyUsage() );
68
69 #ifdef DIAG_DEVELOPER
70 if (FeatureTimeAccel.GetFeatureTimeAccelEnabled(ETimeAccelCategories.ENERGY_RECHARGE))
71 {
72 float timeAccel = FeatureTimeAccel.GetFeatureTimeAccelValue();
73 energy_add *= timeAccel;
74 }
75 #endif
76
77 if ( GetCompEM().ConsumeEnergy(energy_add) ) // consumes energy from the power source
78 {
79 // There is enough of energy to use
80 energy_add = energy_add * ( 0.5 + charger_health*0.005 ); // Damaged charger works less efficiently - 50% damage causes 75% efficiency
81 }
82 else
83 {
84 // There is NOT enough of energy to use
85 energy_add = 0;
86 }
87
88 battery.GetCompEM().AddEnergy( energy_add );
89 }
90 else
91 {
92 battery.GetCompEM().SetEnergy( battery_capacity );
93 }
94 m_BatteryEnergy0To100 = battery.GetCompEM().GetEnergy0To100();
95 SetSynchDirty();
96 }
97 }
98 }
99
100 override void OnWorkStart()
101 {
102 if ( g_Game.IsClient() || !g_Game.IsMultiplayer() )
103 {
105 m_UpdateStatusLightsTimer.Run( m_BlinkingStatusLightInterval/2 , this, "UpdateStatusLights", NULL, true);
106 }
107 }
108
109 override void OnWorkStop()
110 {
111 if ( g_Game.IsClient() || !g_Game.IsMultiplayer() )
112 {
115 }
116 }
117
119 {
120 if ( g_Game.IsClient() || !g_Game.IsMultiplayer() )
121 {
122 if (GetCompEM().IsWorking())
123 {
125 ItemBase battery = ItemBase.Cast( GetCompEM().GetPluggedDevice() );
126
127 if (battery)
128 {
129 RedLightOff();
130
131 if (m_BatteryEnergy0To100 <= 33)
132 {
133 // Less than 1/3 charged, yellow status light must repeatedly blink
134
137 else
139
141 }
142 else if (m_BatteryEnergy0To100 > 33 && m_BatteryEnergy0To100 <= 66)
143 {
144 // Less than 2/3 charged, yellow status light must glow
145
147 }
148 else if (m_BatteryEnergy0To100 > 66 && m_BatteryEnergy0To100 < 100)
149 {
150 // Less than 3/3 charged, yellow status light must glow, green light must blink
151
153
155 GreenLightOn();
156 else
158
160 }
161 else if (m_BatteryEnergy0To100 >= 100)
162 {
163 // Fully charged, green light must glow
165 GreenLightOn();
166 }
167 }
168 else
169 {
171 RedLightOn();
172 else
173 RedLightOff();
174
176
179 }
180 }
181 else
182 {
185 RedLightOff();
187 }
188 }
189 }
190
191 override bool CanPutInCargo( EntityAI parent )
192 {
193 if( !super.CanPutInCargo(parent) ) {return false;}
194 // No "Take" action if the item is connected
195 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
196 {
197 return true;
198 }
199
200 return false;
201 }
202
203 override bool CanPutIntoHands( EntityAI parent )
204 {
205 if( !super.CanPutIntoHands( parent ) )
206 {
207 return false;
208 }
209 // No "Take into hands" action if the item is connected
210 if ( !GetCompEM().IsPlugged() && !GetCompEM().GetPluggedDevice() )
211 {
212 return true;
213 }
214
215 return false;
216 }
217
218 override void OnOwnSocketTaken( EntityAI device )
219 {
220 string att_type = device.GetType();
221
222 if ( att_type == "CarBattery" )
223 {
225 ShowSelection(SEL_CLIPS_CAR);
226 }
227
228 if ( att_type == "TruckBattery" )
229 {
231 ShowSelection(SEL_CLIPS_TRUCK);
232 }
233
234 HideSelection(SEL_CLIPS_DETACHED);
235 HideSelection(SEL_CLIPS_FOLDED);
236 }
237
238 override void OnOwnSocketReleased( EntityAI device )
239 {
241 ShowSelection(SEL_CLIPS_DETACHED);
242 }
243
244 override bool CanReceiveAttachment( EntityAI attachment, int slotId )
245 {
246 if ( !super.CanReceiveAttachment(attachment, slotId) )
247 return false;
248
249 ItemBase ibase;
250 Class.CastTo(ibase, attachment);
251
252 // No attaching if the charger is in inventory!
253 PlayerBase charger_owner = PlayerBase.Cast( GetHierarchyRootPlayer() );
254 if ( charger_owner )
255 return false;
256
257 // Only one attachment allowed
258 if ( GetCompEM().GetPluggedDevice() )
259 return false;
260
261 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
262 return false;
263
264 return true;
265 }
266
267 override bool CanLoadAttachment( EntityAI attachment)
268 {
269 if ( !super.CanLoadAttachment(attachment) )
270 return false;
271
272 ItemBase ibase;
273 Class.CastTo(ibase, attachment);
274
275 // Only one attachment allowed
276 if ( GetCompEM().GetPluggedDevice() )
277 return false;
278
279 if ( ibase.HasEnergyManager() && ibase.GetCompEM().GetPluggedDevicesCount() >= 1 ) // Make sure nothing is plugged into the battery
280 return false;
281
282 return true;
283 }
284
286 {
287 for ( int i = 0; i < ATTACHED_CLIPS_STATES_COUNT; i++ )
288 {
289 string selection = ATTACHED_CLIPS_STATES[i];
290 HideSelection(selection);
291 }
292 }
293
294
295
296 // Control of status lights
297 // ON
299 {
300 SetAnimationPhase(SEL_STANDBY_LIGHT, 0);
301 }
303 {
304 SetAnimationPhase(SEL_LIGHT_CHARGED_ON, 0);
305 }
307 {
308 SetAnimationPhase(SEL_LIGHT_CHARGING_ON, 0);
309 }
311 {
312 SetAnimationPhase(SEL_SWITCH_LIGHT_ON, 0);
313 SetAnimationPhase(SEL_SWITCH_ON, 1.0);
314 }
315 // OFF
317 {
318 SetAnimationPhase(SEL_STANDBY_LIGHT, 1.0);
319 }
321 {
322 SetAnimationPhase(SEL_LIGHT_CHARGED_ON, 1.0);
323 }
325 {
326 SetAnimationPhase(SEL_LIGHT_CHARGING_ON, 1.0);
327 }
329 {
330 SetAnimationPhase(SEL_SWITCH_LIGHT_ON, 1.0);
331 SetAnimationPhase(SEL_SWITCH_ON, 0);
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
365 override void RefreshPhysics()
366 {
367 super.RefreshPhysics();
368
369 if ( GetAttachmentByType(CarBattery) )
370 {
371 RemoveProxyPhysics( "battery" );
372 AddProxyPhysics( "battery" );
373 }
374 else
375 RemoveProxyPhysics( "battery" );
376 }
377
378 //================================================================
379 // ADVANCED PLACEMENT
380 //================================================================
381
382 override void OnPlacementStarted(Man player)
383 {
384 super.OnPlacementStarted(player);
385
386 SetAnimationPhase(SEL_CLIPS_DETACHED, 0);
387 SetAnimationPhase(SEL_CLIPS_FOLDED, 1);
388 SetAnimationPhase(SEL_SWITCH_ON, 1);
389 SetAnimationPhase(SEL_SWITCH_OFF, 1);
390 SetAnimationPhase(SEL_LIGHT_STATE_1, 1);
391 SetAnimationPhase(SEL_LIGHT_STATE_2, 1);
392 SetAnimationPhase(SEL_LIGHT_STATE_3, 1);
393
394 array<string> selections = {
399 };
400
401 PlayerBase playerPB = PlayerBase.Cast(player);
402 foreach (string selection : selections)
403 {
404 if (g_Game.IsMultiplayer() && g_Game.IsServer())
405 playerPB.GetHologramServer().SetSelectionToRefresh(selection);
406 else
407 playerPB.GetHologramLocal().SetSelectionToRefresh(selection);
408 }
409 }
410
411 override bool IsDeployable()
412 {
413 return true;
414 }
415
427}
eBleedingSourceType GetType()
ActionPlaceObjectCB ActiondeployObjectCB ActionPlaceObject()
Определения ActionPlaceObject.c:11
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
DayZGame g_Game
Определения DayZGame.c:4074
Определения ActionPlugIn.c:2
Определения CarBattery.c:2
Super root of all classes in Enforce script.
Определения EnScript.c:11
override void OnSwitchOn()
Определения BatteryCharger.c:334
override void OnInventoryEnter(Man player)
Определения BatteryCharger.c:356
static const string SEL_CORD_PLUGGED
Определения BatteryCharger.c:10
float m_BlinkingStatusLightInterval
Определения BatteryCharger.c:26
static const string SEL_LIGHT_CHARGING_ON
Определения BatteryCharger.c:18
void GreenLightOn()
Определения BatteryCharger.c:302
override void OnWork(float consumed_energy)
Определения BatteryCharger.c:53
override void OnWorkStart()
Определения BatteryCharger.c:100
static const string SEL_SWITCH_OFF
Определения BatteryCharger.c:9
override void OnOwnSocketReleased(EntityAI device)
Определения BatteryCharger.c:238
override void OnOwnSocketTaken(EntityAI device)
Определения BatteryCharger.c:218
void GreenLightOff()
Определения BatteryCharger.c:320
static const string SEL_LIGHT_STATE_2
Определения BatteryCharger.c:13
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:382
override bool CanPutIntoHands(EntityAI parent)
Определения BatteryCharger.c:203
override bool IsElectricAppliance()
Определения BatteryCharger.c:48
override void SetActions()
Определения BatteryCharger.c:416
void SwitchLightOff()
Определения BatteryCharger.c:328
override bool CanLoadAttachment(EntityAI attachment)
Определения BatteryCharger.c:267
static const string SEL_STANDBY_LIGHT
Определения BatteryCharger.c:15
void UpdateStatusLights()
Определения BatteryCharger.c:118
override void OnWorkStop()
Определения BatteryCharger.c:109
int m_BatteryEnergy0To100
Определения BatteryCharger.c:23
static const string SEL_CLIPS_TRUCK
Определения BatteryCharger.c:5
void HideAttachedClipsStates()
Определения BatteryCharger.c:285
ref Timer m_UpdateStatusLightsTimer
Определения BatteryCharger.c:27
float m_ChargeEnergyPerSecond
Определения BatteryCharger.c:24
static const string SEL_LIGHT_STATE_1
Определения BatteryCharger.c:12
const string ATTACHED_CLIPS_STATES[]
Определения BatteryCharger.c:20
static const string SEL_SWITCH_ON
Определения BatteryCharger.c:8
override void RefreshPhysics()
Определения BatteryCharger.c:365
bool m_BlinkingStatusLightIsOn
Определения BatteryCharger.c:28
override void OnSwitchOff()
Определения BatteryCharger.c:340
static const string SEL_LIGHT_STATE_3
Определения BatteryCharger.c:14
const int ATTACHED_CLIPS_STATES_COUNT
Определения BatteryCharger.c:21
static const string SEL_SWITCH_LIGHT_ON
Определения BatteryCharger.c:16
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BatteryCharger.c:244
override bool CanPutInCargo(EntityAI parent)
Определения BatteryCharger.c:191
override void EEInit()
Определения BatteryCharger.c:37
static const string SEL_CLIPS_DETACHED
Определения BatteryCharger.c:6
static const string SEL_CORD_FOLDED
Определения BatteryCharger.c:11
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:347
void RedLightOff()
Определения BatteryCharger.c:316
static const string SEL_CLIPS_FOLDED
Определения BatteryCharger.c:7
void YellowLightOn()
Определения BatteryCharger.c:306
void SwitchLightOn()
Определения BatteryCharger.c:310
static const string SEL_CLIPS_CAR
Определения BatteryCharger.c:4
void BatteryCharger()
Определения BatteryCharger.c:30
void RedLightOn()
Определения BatteryCharger.c:298
override bool IsDeployable()
Определения BatteryCharger.c:411
static const string SEL_LIGHT_CHARGED_ON
Определения BatteryCharger.c:17
void YellowLightOff()
Определения BatteryCharger.c:324
Определения PlayerBaseClient.c:2
Определения DayZPlayerImplement.c:39
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8