DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
BatteryCharger.c
См. документацию.
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");
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 {
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
132 else
134
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
150 GreenLightOn();
151 else
153
155 }
156 else if (m_BatteryEnergy0To100 >= 100)
157 {
158 // Fully charged, green light must glow
160 GreenLightOn();
161 }
162 }
163 else
164 {
166 RedLightOn();
167 else
168 RedLightOff();
169
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 = {
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()
Определения BleedingSource.c:63
ActionPlaceObjectCB ActiondeployObjectCB ActionPlaceObject()
Определения ActionPlaceObject.c:11
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
Определения ActionPlugIn.c:2
proto native float ConfigGetFloat(string path)
Get float value from config on path.
Определения CarBattery.c:1
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения Building.c:6
override void OnSwitchOn()
Определения BatteryCharger.c:328
override void OnInventoryEnter(Man player)
Определения BatteryCharger.c:350
float m_BlinkingStatusLightInterval
Определения BatteryCharger.c:31
void GreenLightOn()
Определения BatteryCharger.c:297
override void OnWork(float consumed_energy)
Определения BatteryCharger.c:48
override void OnWorkStart()
Определения BatteryCharger.c:95
const string SEL_SWITCH_OFF
Определения BatteryCharger.c:9
override void OnOwnSocketReleased(EntityAI device)
Определения BatteryCharger.c:233
override void OnOwnSocketTaken(EntityAI device)
Определения BatteryCharger.c:213
void GreenLightOff()
Определения BatteryCharger.c:314
const string SEL_LIGHT_STATE_2
Определения BatteryCharger.c:13
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override bool CanPutIntoHands(EntityAI parent)
Определения BatteryCharger.c:198
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override void SetActions()
Определения BatteryCharger.c:415
void SwitchLightOff()
Определения BatteryCharger.c:322
override bool CanLoadAttachment(EntityAI attachment)
Определения BatteryCharger.c:262
const string SWITCH_LIGHT_GLOW
Определения BatteryCharger.c:20
const string RED_LIGHT_GLOW
Определения BatteryCharger.c:17
const string SEL_CORD_PLUGGED
Определения BatteryCharger.c:10
override string GetDeploySoundset()
Определения BatteryCharger.c:410
void UpdateStatusLights()
Определения BatteryCharger.c:113
override void OnWorkStop()
Определения BatteryCharger.c:104
int m_BatteryEnergy0To100
Определения BatteryCharger.c:28
const string SEL_CLIPS_TRUCK
Определения BatteryCharger.c:5
void HideAttachedClipsStates()
Определения BatteryCharger.c:280
const string GREEN_LIGHT_GLOW
Определения BatteryCharger.c:18
ref Timer m_UpdateStatusLightsTimer
Определения BatteryCharger.c:32
const string YELLOW_LIGHT_GLOW
Определения BatteryCharger.c:19
float m_ChargeEnergyPerSecond
Определения BatteryCharger.c:29
const string SEL_LIGHT_STATE_1
Определения BatteryCharger.c:12
const string ATTACHED_CLIPS_STATES[]
Определения BatteryCharger.c:23
const string SEL_SWITCH_ON
Определения BatteryCharger.c:8
override void RefreshPhysics()
Определения BatteryCharger.c:359
bool m_BlinkingStatusLightIsOn
Определения BatteryCharger.c:33
override void OnSwitchOff()
Определения BatteryCharger.c:334
const string SEL_LIGHT_STATE_3
Определения BatteryCharger.c:14
const int ATTACHED_CLIPS_STATES_COUNT
Определения BatteryCharger.c:24
const string SEL_CORD_FOLDED
Определения BatteryCharger.c:11
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BatteryCharger.c:239
override bool CanPutInCargo(EntityAI parent)
Определения BatteryCharger.c:186
const string SEL_CLIPS_DETACHED
Определения BatteryCharger.c:6
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
void RedLightOff()
Определения BatteryCharger.c:310
const string SEL_CLIPS_FOLDED
Определения BatteryCharger.c:7
void YellowLightOn()
Определения BatteryCharger.c:301
void SwitchLightOn()
Определения BatteryCharger.c:305
const string SEL_CLIPS_CAR
Определения BatteryCharger.c:4
void BatteryCharger()
Определения BatteryCharger.c:35
void RedLightOn()
Определения BatteryCharger.c:293
override bool IsDeployable()
Определения BatteryCharger.c:405
const string DEFAULT_MATERIAL
Определения BatteryCharger.c:21
void YellowLightOff()
Определения BatteryCharger.c:318
Определения InventoryItem.c:731
Определения PlayerBaseClient.c:2
Определения DayZPlayerImplement.c:63
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
Определения tools.c:8