DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
CarScript.c
См. документацию.
7
8enum CarHeadlightBulbsState
9{
13 BOTH
14}
15
16enum CarRearLightType
17{
18 NONE,
21 BRAKES_AND_REVERSE
22}
23
24enum ECarOperationalState
25{
26 OK = 0,
27 RUINED = 1,
31}
32
33enum CarEngineSoundState
34{
35 NONE,
43}
44
45enum ECarHornState
46{
47 OFF = 0,
48 SHORT = 1,
49 LONG = 2
50}
51
53class CarContactData : VehicleContactData {}
54typedef VehicleContactCache CarContactCache;
55
56
58{
59 float m_fTime;
60
61 protected override event void Write(PawnStateWriter ctx)
62 {
63 ctx.Write(m_fTime);
64 }
65
66 protected override event void Read(PawnStateReader ctx)
67 {
68 ctx.Read(m_fTime);
69 }
70};
71
73{
74};
75
76#ifdef DIAG_DEVELOPER
77enum ECarDebugMode
78{
79 NONE,
80 FORWARD_10,
81 FORWARD_50,
82 RANDOM_DRIVING,
83 PREDEFINED_PATH,
84};
85#endif
86
87#ifdef DIAG_DEVELOPER
88CarScript _car;
89#endif
90
94class CarScript extends Car
95{
99
100 protected float m_Time;
101
102 static float DROWN_ENGINE_THRESHOLD = 0.5;
103 static float DROWN_ENGINE_DAMAGE = 350.0;
104
105 static const string MEMORY_POINT_NAME_CAR_HORN = "pos_carHorn";
106
108 protected float m_FuelAmmount;
109 protected float m_CoolantAmmount;
110 protected float m_OilAmmount;
111 protected float m_BrakeAmmount;
112
114 //protected float m_dmgContactCoef = 0.023;
116
118 protected float m_DrownTime;
120
122 protected float m_EngineHealth;
123 protected float m_RadiatorHealth;
124 protected float m_FuelTankHealth;
125 protected float m_BatteryHealth;
126 protected float m_PlugHealth;
127
129
130 protected float m_BatteryConsume = 15; //Battery energy consumption upon engine start
131 protected float m_BatteryContinuousConsume = 0.25; //Battery consumption with lights on and engine is off
132 protected float m_BatteryRecharge = 0.15; //Battery recharge rate when engine is on
133 private float m_BatteryTimer = 0; //Used to factor energy consumption / recharging
134 private const float BATTERY_UPDATE_DELAY = 100;
135
138
141 protected vector m_backPos;
146
148 string m_EngineStartOK = "";
150 string m_EngineStartPlug = "";
151 string m_EngineStartFuel = "";
152 string m_EngineStop = "";
153 string m_EngineStopFuel = "";
154
159
163
164 // Memory points
165 static string m_ReverseLightPoint = "light_reverse";
166 static string m_LeftHeadlightPoint = "light_left";
167 static string m_RightHeadlightPoint = "light_right";
168 static string m_LeftHeadlightTargetPoint = "light_left_dir";
169 static string m_RightHeadlightTargetPoint = "light_right_dir";
170 static string m_DrownEnginePoint = "drown_engine";
171
172 // Model selection IDs for texture/material changes
173 // If each car needs different IDs, then feel free to remove the 'static' flag and overwrite these numbers down the hierarchy
174 static const int SELECTION_ID_FRONT_LIGHT_L = 0;
175 static const int SELECTION_ID_FRONT_LIGHT_R = 1;
176 static const int SELECTION_ID_BRAKE_LIGHT_L = 2;
177 static const int SELECTION_ID_BRAKE_LIGHT_R = 3;
178 static const int SELECTION_ID_REVERSE_LIGHT_L = 4;
179 static const int SELECTION_ID_REVERSE_LIGHT_R = 5;
180 static const int SELECTION_ID_TAIL_LIGHT_L = 6;
181 static const int SELECTION_ID_TAIL_LIGHT_R = 7;
182 static const int SELECTION_ID_DASHBOARD_LIGHT = 8;
183
186
190
191 #ifdef DIAG_DEVELOPER
192 private const int DEBUG_MESSAGE_CLEAN_TIME_SECONDS = 10;
193 private float m_DebugMessageCleanTime;
194 private string m_DebugContactDamageMessage;
195 #endif
196
197#ifdef DIAG_DEVELOPER
198 ECarDebugMode m_eDebugMode;
199#endif
200
202 {
203#ifdef DIAG_DEVELOPER
204 _car = this;
205#endif
206
207 SetEventMask(EntityEvent.POSTSIMULATE);
208 SetEventMask(EntityEvent.POSTFRAME);
209
210 m_Time = 0;
211 // sets max health for all components at init
212 m_EngineHealth = 1;
214 m_RadiatorHealth = -1;
215 m_BatteryHealth = -1;
216 m_PlugHealth = -1;
217
218 m_enginePtcFx = -1;
219 m_coolantPtcFx = -1;
220 m_exhaustPtcFx = -1;
221
223
224 m_dmgContactCoef = 0.058;
225
226 m_CarEngineSoundState = CarEngineSoundState.NONE;
227
228 // TODO(kumarjac): MOVE THIS ALL TO 'CarScriptType' ONCE THAT EXISTS! re:Server Performance
230 m_LightsComponent.RegisterSelection("DashboardOn", {new VehicleLightSelectionData(SELECTION_ID_DASHBOARD_LIGHT, "dashboardMatOn")});
231 m_LightsComponent.RegisterSelection("DashboardOff", {new VehicleLightSelectionData(SELECTION_ID_DASHBOARD_LIGHT, "dashboardMatOff")});
232 m_LightsComponent.RegisterSelection("FrontLeftOn", {new VehicleLightSelectionData(SELECTION_ID_FRONT_LIGHT_L, "frontReflectorMatOn")});
233 m_LightsComponent.RegisterSelection("FrontLeftOff", {new VehicleLightSelectionData(SELECTION_ID_FRONT_LIGHT_L, "frontReflectorMatOff")});
234 m_LightsComponent.RegisterSelection("FrontRightOn", {new VehicleLightSelectionData(SELECTION_ID_FRONT_LIGHT_R, "frontReflectorMatOn")});
235 m_LightsComponent.RegisterSelection("FrontRightOff", {new VehicleLightSelectionData(SELECTION_ID_FRONT_LIGHT_R, "frontReflectorMatOff")});
236
237 m_LightsComponent.RegisterSelection("TailOn", {
238 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_L, "TailReflectorMatOn"),
239 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_R, "TailReflectorMatOn"),
240 });
241 m_LightsComponent.RegisterSelection("TailOff", {
242 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_L, "TailReflectorMatOff"),
243 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_R, "TailReflectorMatOff"),
244 });
245 m_LightsComponent.RegisterSelection("TailLeftOnly", {
246 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_L, "TailReflectorMatOn"),
247 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_R, "TailReflectorMatOff"),
248 });
249 m_LightsComponent.RegisterSelection("TailRightOnly", {
250 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_L, "TailReflectorMatOff"),
251 new VehicleLightSelectionData(SELECTION_ID_TAIL_LIGHT_R, "TailReflectorMatOn"),
252 });
253 m_LightsComponent.RegisterSelection("BrakesOn", {
254 new VehicleLightSelectionData(SELECTION_ID_BRAKE_LIGHT_L, "brakeReflectorMatOn"),
255 new VehicleLightSelectionData(SELECTION_ID_BRAKE_LIGHT_R, "brakeReflectorMatOn"),
256 });
257 m_LightsComponent.RegisterSelection("BrakesOff", {
258 new VehicleLightSelectionData(SELECTION_ID_BRAKE_LIGHT_L, "brakeReflectorMatOff"),
259 new VehicleLightSelectionData(SELECTION_ID_BRAKE_LIGHT_R, "brakeReflectorMatOff"),
260 });
261 m_LightsComponent.RegisterSelection("ReverseOn", {
262 new VehicleLightSelectionData(SELECTION_ID_REVERSE_LIGHT_L, "ReverseReflectorMatOn"),
263 new VehicleLightSelectionData(SELECTION_ID_REVERSE_LIGHT_R, "ReverseReflectorMatOn"),
264 });
265 m_LightsComponent.RegisterSelection("ReverseOff", {
266 new VehicleLightSelectionData(SELECTION_ID_REVERSE_LIGHT_L, "ReverseReflectorMatOff"),
267 new VehicleLightSelectionData(SELECTION_ID_REVERSE_LIGHT_R, "ReverseReflectorMatOff"),
268 });
269
270 m_LightsComponent.RegisterLight("Front", new VehicleLightData(new VehicleLightProfileBase()));
271 m_LightsComponent.RegisterLight("Rear", new VehicleLightData(new VehicleLightProfileBase()));
272
275
276 if (MemoryPointExists("ptcCoolantPos"))
277 m_coolantPtcPos = GetMemoryPointPos("ptcCoolantPos");
278
279 RegisterNetSyncVariableBool("m_BrakesArePressed");
280 RegisterNetSyncVariableBoolSignal("m_PlayCrashSoundLight");
281 RegisterNetSyncVariableBoolSignal("m_PlayCrashSoundHeavy");
282
283 RegisterNetSyncVariableInt("m_HornComponent.m_Mode", VehicleHornMode.OFF, VehicleHornMode.COUNT);
284
285 RegisterNetSyncVariableInt("m_CarEngineSoundState", CarEngineSoundState.NONE, CarEngineSoundState.STOP_NO_FUEL);
286
288
290 m_CarHornState = ECarHornState.OFF;
291 RegisterNetSyncVariableInt("m_CarHornState", ECarHornState.OFF, ECarHornState.LONG);
292 }
293
294 override string GetVehicleType()
295 {
296 return "VehicleTypeCar";
297 }
298
303
305 {
306 return ModelToWorld( m_DrownEnginePos );
307 }
308
310 {
311 return ModelToWorld( m_coolantPtcPos );
312 }
313
315 {
316 return ModelToWorld( m_enginePos );
317 }
319 {
320 return ModelToWorld( m_frontPos );
321 }
323 {
324 return ModelToWorld( m_backPos );
325 }
327 {
328 return ModelToWorld( m_side_1_1Pos );
329 }
331 {
332 return ModelToWorld( m_side_1_2Pos );
333 }
335 {
336 return ModelToWorld( m_side_2_1Pos );
337 }
339 {
340 return ModelToWorld( m_side_2_2Pos );
341 }
342
343 protected void InitializeParticles()
344 {
345 if (GetGame().IsHeadlessOrDedicatedServer())
346 return;
347
349
350 // OBSOLETE (not used directly; backward compatibility only)
351 m_exhaustPtcPos = m_VFXComponent.ConvertMemPointToPosition("ptcExhaust_end");
353 {
354 vector exhaustStart = m_VFXComponent.ConvertMemPointToPosition("ptcExhaust_start");
355 vector tempOri = vector.Direction(exhaustStart, m_exhaustPtcPos);
356
357 m_exhaustPtcDir[0] = -tempOri[2];
358 m_exhaustPtcDir[1] = tempOri[1];
359 m_exhaustPtcDir[2] = tempOri[0];
360
361 m_exhaustPtcDir = m_exhaustPtcDir.Normalized().VectorToAngles();
362 }
363 else
364 m_exhaustPtcDir = "1 1 1";
365
366 m_enginePtcPos = m_VFXComponent.ConvertMemPointToPosition("ptcEnginePos");
367
368 m_DrownEnginePos = m_VFXComponent.ConvertMemPointToPosition("drown_engine");
369 m_enginePos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_engine");
370 m_frontPos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_front");
371 m_backPos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_back");
372 m_side_1_1Pos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_fender_1_1");
373 m_side_1_2Pos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_fender_1_2");
374 m_side_2_1Pos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_fender_2_1");
375 m_side_2_2Pos = m_VFXComponent.ConvertMemPointToPosition("dmgZone_fender_2_2");
376
377 m_VFXComponent.RegisterEffect(EVehicleVFXEffect.DUST_BEHIND, EffVehicleDust, new VehicleVFXDataParams(m_VFXComponent.ConvertMemPointToPosition("ptcDustPos")));
378 m_VFXComponent.RegisterEffect(EVehicleVFXEffect.ENGINE_SMOKE, EffEngineSmoke, new VehicleVFXDataParams(m_VFXComponent.ConvertMemPointToPosition("ptcEnginePos")));
379 m_VFXComponent.RegisterEffect(EVehicleVFXEffect.COOLANT_STEAM, EffCoolantSteam, new VehicleVFXDataParams(m_VFXComponent.ConvertMemPointToPosition("ptcCoolantPos")));
381 m_VFXComponent.RegisterEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE, EffWheelSmoke, WheelCount(), new VehicleVFXDataParams(vector.Zero, "0 1 -1", 5.0));
382 m_VFXComponent.RegisterEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT, EffWheelContact, WheelCount(), new VehicleVFXDataParams(vector.Zero, vector.Up, 5.0));
383 }
384
385 override float GetLiquidThroughputCoef()
386 {
388 }
389
390 override void CleanupEffects()
391 {
392 super.CleanupEffects();
393
394 if (m_VFXComponent)
395 m_VFXComponent.StopAllEffects();
396
398 {
399 m_LightsComponent.DestroyLight("Front");
400 m_LightsComponent.DestroyLight("Rear");
401 }
402
404 if (m_Headlight)
405 m_Headlight.Destroy();
407 if (m_RearLight)
408 m_RearLight.Destroy();
409
413 }
414
416 {
418 }
419
420 override int GetFluidCapacityScript(ETransportFluid fluidType)
421 {
422 return GetFluidCapacity(fluidType);
423 }
424
425 override float GetFluidFractionScript(ETransportFluid fluidType)
426 {
427 return GetFluidFraction(fluidType);
428 }
429
430 override void FillScript(ETransportFluid fluidType, float amount)
431 {
432 Fill(fluidType, amount);
433 }
434
436 {
437 super.OnVariablesSynchronized();
438
439 if (GetCrashHeavySound())
441 else if (GetCrashLightSound())
443
445
448
449 UpdateLights();
450 }
451
452 // --------------------------------------------------------------------------------
453
454 override protected void PlayCrashLightSound()
455 {
456 PlaySoundEx("offroad_hit_light_SoundSet", m_CrashSoundLight, m_PlayCrashSoundLight);
457 }
458
459 // --------------------------------------------------------------------------------
460
461 override protected void PlayCrashHeavySound()
462 {
463 PlaySoundEx("offroad_hit_heavy_SoundSet", m_CrashSoundHeavy, m_PlayCrashSoundHeavy);
464 }
465
466 // --------------------------------------------------------------------------------
467
469 {
470 return false;
471 }
472
474 {
475 if (g_Game.GetWaterDepth(GetEnginePosWS()) <= 0)
476 {
477 m_VFXComponent.PlayEffect(EVehicleVFXEffect.ENGINE_SMOKE);
479 }
480 }
481
482 override void EEItemAttached(EntityAI item, string slot_name)
483 {
484 super.EEItemAttached(item, slot_name);
485
486 switch (slot_name)
487 {
488 case "Reflector_1_1":
489 if (g_Game.IsServer())
490 SetHealth("Reflector_1_1", "Health", item.GetHealth());
491 break;
492 case "Reflector_2_1":
493 if (g_Game.IsServer())
494 SetHealth("Reflector_2_1", "Health", item.GetHealth());
495 break;
496 case "CarBattery":
497 case "TruckBattery":
498 if (g_Game.IsServer())
499 m_BatteryHealth = item.GetHealth01();
500 break;
501 case "SparkPlug":
502 case "GlowPlug":
503 if (g_Game.IsServer())
504 m_PlugHealth = item.GetHealth01();
505 break;
506 case "CarRadiator":
507 if (g_Game.IsServer())
508 m_RadiatorHealth = item.GetHealth01();
509
510 m_Radiator = item;
511 break;
512 }
513
514 if (g_Game.IsServer())
515 Synchronize();
516
518 UpdateLights();
519 }
520
521 // Updates state of attached headlight bulbs for faster access
523 {
524 EntityAI bulb_L = FindAttachmentBySlotName("Reflector_1_1");
525 EntityAI bulb_R = FindAttachmentBySlotName("Reflector_2_1");
526
527 if (bulb_L && !bulb_L.IsRuined() && bulb_R && !bulb_R.IsRuined())
528 {
529 m_HeadlightsState = CarHeadlightBulbsState.BOTH;
530 }
531 else if (bulb_L && !bulb_L.IsRuined())
532 {
533 m_HeadlightsState = CarHeadlightBulbsState.LEFT;
534 }
535 else if (bulb_R && !bulb_R.IsRuined())
536 {
537 m_HeadlightsState = CarHeadlightBulbsState.RIGHT;
538 }
539 else if ((!bulb_L || bulb_L.IsRuined()) && (!bulb_R || bulb_R.IsRuined()))
540 {
541 m_HeadlightsState = CarHeadlightBulbsState.NONE;
542 }
543 }
544
545 override void EEItemDetached(EntityAI item, string slot_name)
546 {
547 switch (slot_name)
548 {
549 case "CarBattery":
550 case "TruckBattery":
551 m_BatteryHealth = -1;
552 if (IsServerOrOwner())
553 {
554 if (EngineIsOn())
555 {
556 EngineStop();
557 }
558 }
559
560 if (g_Game.IsServer())
561 {
562 LightOff();
563
564 UpdateBattery(ItemBase.Cast(item));
565 }
566 break;
567 case "SparkPlug":
568 case "GlowPlug":
569 m_PlugHealth = -1;
570 if (g_Game.IsServer() && EngineIsOn())
571 {
572 EngineStop();
573 }
574 break;
575 case "CarRadiator":
576 m_Radiator = null;
577 if (IsServerOrOwner())
578 {
579 LeakAll(CarFluid.COOLANT);
580 }
581
582 if (g_Game.IsServer())
583 {
584 if (m_DamageZoneMap.Contains("Radiator"))
585 {
586 SetHealth("Radiator", "Health", 0);
587 }
588 }
589 break;
590 }
591
592 if (g_Game.IsServer())
593 {
594 Synchronize();
595 }
596
598 UpdateLights();
599 }
600
601 override void OnAttachmentRuined(EntityAI attachment)
602 {
603 super.OnAttachmentRuined(attachment);
604
606 UpdateLights();
607 }
608
609 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
610 {
611 if (!super.CanReceiveAttachment(attachment, slotId))
612 return false;
613
614 InventoryLocation attachmentInventoryLocation = new InventoryLocation();
615 attachment.GetInventory().GetCurrentInventoryLocation(attachmentInventoryLocation);
616 if (attachmentInventoryLocation.GetParent() == null)
617 {
618 return true;
619 }
620
621 if (attachment && attachment.Type().IsInherited(CarWheel))
622 {
623 string slotSelectionName;
624 InventorySlots.GetSelectionForSlotId(slotId, slotSelectionName);
625
626 switch (slotSelectionName)
627 {
628 case "wheel_spare_1":
629 case "wheel_spare_2":
630 return CanManipulateSpareWheel(slotSelectionName);
631 break;
632 }
633 }
634
635 return true;
636 }
637
638 override bool CanReleaseAttachment(EntityAI attachment)
639 {
640 if (!super.CanReleaseAttachment(attachment))
641 {
642 return false;
643 }
644
645 if (EngineIsOn() && IsMoving())
646 {
647 return false;
648 }
649
650 if (attachment && attachment.Type().IsInherited(CarWheel))
651 {
652 InventoryLocation attachmentInventoryLocation = new InventoryLocation();
653 attachment.GetInventory().GetCurrentInventoryLocation(attachmentInventoryLocation);
654
655 string slotSelectionName;
656 InventorySlots.GetSelectionForSlotId(attachmentInventoryLocation.GetSlot(), slotSelectionName);
657
658 switch (slotSelectionName)
659 {
660 case "wheel_spare_1":
661 case "wheel_spare_2":
662 return CanManipulateSpareWheel(slotSelectionName);
663 break;
664 }
665 }
666
667 return true;
668 }
669
670 protected bool CanManipulateSpareWheel(string slotSelectionName)
671 {
672 return false;
673 }
674
675 override void EOnPostFrame(IEntity other, int extra)
676 {
677 float carSpeed = GetVelocity(this).Length();
678 ParticleParamsOverrideData particleParamsData;
679
680 //FX only on Client and in Single
681 if ( !g_Game.IsHeadlessOrDedicatedServer() )
682 {
683 if (EngineIsOn())
684 {
685 if (!m_VFXComponent.IsEffectPlayed(EVehicleVFXEffect.EXHAUST_SMOKE))
686 {
687 particleParamsData = m_VFXComponent.GetParticleParamsOverrideData(EVehicleVFXEffect.EXHAUST_SMOKE);
688 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
689 m_VFXComponent.PlayEffect(EVehicleVFXEffect.EXHAUST_SMOKE);
690 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.EXHAUST_SMOKE, ParticleList.HATCHBACK_EXHAUST_SMOKE);
691 }
692
693 if (IsVitalRadiator() && GetFluidFraction(CarFluid.COOLANT) < 0.5)
694 {
695 if (!m_VFXComponent.IsEffectPlayed(EVehicleVFXEffect.COOLANT_STEAM))
696 m_VFXComponent.PlayEffect(EVehicleVFXEffect.COOLANT_STEAM);
697 else
698 {
699 if (GetFluidFraction(CarFluid.COOLANT) > 0)
700 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.COOLANT_STEAM, ParticleList.HATCHBACK_COOLANT_OVERHEATING);
701 else
702 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.COOLANT_STEAM, ParticleList.HATCHBACK_COOLANT_OVERHEATED);
703 }
704 }
705 else
706 m_VFXComponent.StopEffect(EVehicleVFXEffect.COOLANT_STEAM);
707 }
708 else
709 {
710 m_VFXComponent.StopEffect(EVehicleVFXEffect.EXHAUST_SMOKE);
711 m_VFXComponent.StopEffect(EVehicleVFXEffect.COOLANT_STEAM);
712 }
713
714 string surface;
715
717 {
718 particleParamsData = m_VFXComponent.GetParticleParamsOverrideData(EVehicleVFXEffect.DUST_BEHIND);
719 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
720 particleParamsData.m_FloatModifiers.InsertAt(GetWeightCoef(), 1);
721 m_VFXComponent.PlayEffect(EVehicleVFXEffect.DUST_BEHIND);
722 }
723 else
724 m_VFXComponent.StopEffect(EVehicleVFXEffect.DUST_BEHIND);
725
726
727 int wheelCount = WheelCount();
728 TVectorArray wheelsPosition = new TVectorArray();
729
730 int i;
731 for (i = 0; i < wheelCount; ++i)
732 wheelsPosition.InsertAt(Vector(-1, -1, -1), i);
733
734 for (i = 0; i < wheelCount; ++i)
735 {
736 CarWheel wheel = CarWheel.Cast(WheelGetEntity(i));
737 if (!wheel)
738 break;
739
740 vector wheelPos;
741 if (m_VFXComponent.CanPlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE))
742 {
743 if (WheelHasContact(i))
744 {
745 float wheelSpeed = WheelGetAngularVelocity(i) * wheel.GetRadius();
746 wheelPos = WheelGetContactPosition(i);
747 wheelPos = WorldToModel(wheelPos);
748 wheelsPosition.Set(i, wheelPos);
749
750 vector wheelVel = dBodyGetVelocityAt(this, wheelPos);
751
752 vector transform[3];
753 transform[2] = WheelGetDirection(i);
754 transform[1] = vector.Up;
755 transform[0] = transform[2] * transform[1];
756
757 wheelVel = wheelVel.InvMultiply3(transform);
758
759 float bodySpeed = wheelVel[2];
760
761 bool applyWheelSmokeEffect = false;
762
763 if ((wheelSpeed > 0 && bodySpeed > 0) || (wheelSpeed < 0 && bodySpeed < 0))
764 applyWheelSmokeEffect = Math.AbsFloat(wheelSpeed) > Math.AbsFloat(bodySpeed) + EffWheelSmoke.WHEEL_SMOKE_THRESHOLD;
765 else
766 applyWheelSmokeEffect = Math.AbsFloat(wheelSpeed) > EffWheelSmoke.WHEEL_SMOKE_THRESHOLD;
767
768 if (applyWheelSmokeEffect)
769 {
770 m_VFXComponent.SetEffectGroupPositions(EVehicleVFXEffectGroup.WHEEL_SMOKE, wheelsPosition);
771 m_VFXComponent.PlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE);
772 }
773 else
774 m_VFXComponent.StopEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE);
775 }
776 }
777
778 // actual wheel position
779 wheelPos = WheelGetPositionLS(i);
780 wheelsPosition.Set(i, wheelPos);
781
782
784 {
785 if (m_VFXComponent.CanPlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT))
786 {
787 bool applyWheelContactEffect = Math.AbsFloat(wheelSpeed) > EffWheelContact.SPEED_THRESHOLD;
788
789 if (wheel && applyWheelContactEffect)
790 {
791 particleParamsData = m_VFXComponent.GetEffectGroupParticleParamsOverrideData(EVehicleVFXEffectGroup.WHEEL_CONTACT);
792 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
793 particleParamsData.m_FloatModifiers.InsertAt(GetWeightCoef(), 1);
794 m_VFXComponent.SetSurfaceInfo(WheelGetSurface(i));
795 m_VFXComponent.SetEffectGroupPositions(EVehicleVFXEffectGroup.WHEEL_CONTACT, wheelsPosition);
796
797 m_VFXComponent.PlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT);
798 }
799 else
800 m_VFXComponent.StopEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT);
801 }
802 }
803 }
804 }
805 }
806
807 override void EOnPostSimulate(IEntity other, float timeSlice)
808 {
809 m_Time += timeSlice;
810
811 if (g_Game.IsServer())
812 {
813 #ifdef DIAG_DEVELOPER
814 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.CONTACT)
815 {
816 if (m_ContactCalled)
817 {
818 Debug.Log("Momentum delta: " + (GetMomentum() - m_MomentumPrevTick));
819 Debug.Log("--------------------------------------------------------------------");
820 m_ContactCalled = false;
821 }
822 }
823 #endif
824
825
827 m_VelocityPrevTick = GetVelocity(this);
828 m_MomentumPrevTick = GetMomentum();
829 #ifdef DIAG_DEVELOPER
830 m_DebugMessageCleanTime += timeSlice;
831 if (m_DebugMessageCleanTime >= DEBUG_MESSAGE_CLEAN_TIME_SECONDS)
832 {
833 m_DebugMessageCleanTime = 0;
834 m_DebugContactDamageMessage = "";
835 }
836 #endif
837 }
838
840 {
841 m_Time = 0;
842
844
845 bool isServerOrOwner = IsServerOrOwner();
846
847 //First of all check if the car should stop the engine
848 if (isServerOrOwner && EngineIsOn())
849 {
850 if (IsDamageDestroyed() || GetFluidFraction(CarFluid.FUEL) <= 0 || m_EngineHealth <= 0)
851 EngineStop();
852
853 CheckVitalItemCallback(IsVitalSparkPlug(), SparkPlug.SLOT_ID, this, "EngineStop");
854 CheckVitalItemCallback(IsVitalGlowPlug(), GlowPlug.SLOT_ID, this, "EngineStop");
855 }
856
857 if (g_Game.IsServer())
858 {
859 if (IsVitalFuelTank())
860 {
862 {
863 SetHealth("Engine", "Health", GameConstants.DAMAGE_RUINED_VALUE);
864 }
865 }
866 }
867
869 if (EngineIsOn())
870 {
871 if (g_Game.IsServer())
872 {
873 float dmg;
874
876 {
878 AddHealth( "Engine", "Health", -GetMaxHealth("Engine", "") * 0.05 ); //CAR_RPM_DMG
879
880 // only called on server, don't use deterministic RandomFloat
881 dmg = EngineGetRPM() * 0.001 * Math.RandomFloat( 0.02, 1.0 ); //CARS_TICK_DMG_MIN; //CARS_TICK_DMG_MAX
882 ProcessDirectDamage(DamageType.CUSTOM, null, "Engine", "EnviroDmg", vector.Zero, dmg);
883 SetEngineZoneReceivedHit(true);
884 }
885 else
886 {
887 SetEngineZoneReceivedHit(false);
888 }
889 }
890
891 if (isServerOrOwner)
892 {
894 if ( IsVitalRadiator() )
895 {
896 if ( GetFluidFraction(CarFluid.COOLANT) > 0 && m_RadiatorHealth < 0.5 ) //CARS_LEAK_THRESHOLD
897 LeakFluid( CarFluid.COOLANT );
898 }
899
901 LeakFluid( CarFluid.FUEL );
902
904 LeakFluid( CarFluid.BRAKE );
905
907 LeakFluid( CarFluid.OIL );
908
909 if ( m_EngineHealth < 0.25 )
910 LeakFluid( CarFluid.OIL );
911 }
912
913 if ( g_Game.IsServer() )
914 {
915 if ( IsVitalRadiator() )
916 {
917 if ( GetFluidFraction( CarFluid.COOLANT ) < 0.5 && GetFluidFraction( CarFluid.COOLANT ) >= 0 )
918 {
919 // only called on server, don't use deterministic RandomFloat
920 dmg = ( 1 - GetFluidFraction(CarFluid.COOLANT) ) * Math.RandomFloat( 0.02, 10.00 ); //CARS_DMG_TICK_MIN_COOLANT; //CARS_DMG_TICK_MAX_COOLANT
921 AddHealth( "Engine", "Health", -dmg );
922 SetEngineZoneReceivedHit(true);
923 }
924 }
925 }
926 }
927 }
928 }
929
931 {
932 UpdateLights();
933 }
934
936 {
937 UpdateLights();
938 }
939
940 override void OnDriverExit(Human player)
941 {
942 super.OnDriverExit(player);
943
944 if (GetGear() != GetNeutralGear())
945 {
946 EngineStop();
947 }
948 }
949
950 // Server side event for jump out processing
952 {
953 PlayerBase player = gotActionData.m_Player;
954
955 array<ClothingBase> equippedClothes = new array<ClothingBase>;
956 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("LEGS")));
957 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("BACK")));
958 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("VEST")));
959 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("HeadGear")));
960 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("Mask")));
961 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("BODY")));
962 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("FEET")));
963 equippedClothes.Insert(ClothingBase.Cast(player.GetItemOnSlot("GLOVES")));
964
965 // -----------------------------------------------
966 float shockTaken = (gotActionData.m_Speed * gotActionData.m_Speed) / ActionGetOutTransport.DMG_FACTOR;
967
968 //Lower shock taken if player uses a helmet
969 ItemBase headGear = ClothingBase.Cast(player.GetItemOnHead());
970 HelmetBase helmet;
971 if (Class.CastTo(helmet, headGear))
972 shockTaken *= 0.5;
973
974 // -----------------------------------------------
975
976 int randNum; //value used for probability evaluation
977 randNum = Math.RandomInt(0, 100);
979 {
980 if (randNum < 20)
981 player.GiveShock(-shockTaken); //To inflict shock, a negative value must be passed
982
983 randNum = Math.RandomIntInclusive(0, PlayerBase.m_BleedingSourcesLow.Count() - 1);
984
985 if (player.m_BleedingManagerServer)
986 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection(PlayerBase.m_BleedingSourcesLow[randNum]);
987 }
989 {
990 if (randNum < 50)
991 player.GiveShock(-shockTaken);
992
993 randNum = Math.RandomInt(0, PlayerBase.m_BleedingSourcesUp.Count() - 1);
994
995 if (player.m_BleedingManagerServer)
996 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection(PlayerBase.m_BleedingSourcesUp[randNum]);
997 }
998 else if (gotActionData.m_Speed >= ActionGetOutTransport.HIGH_SPEED_VALUE)
999 {
1000 if (!headGear && player.m_BleedingManagerServer)
1001 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection("Head");
1002
1003 if (randNum < 75)
1004 player.GiveShock(-shockTaken);
1005 }
1006
1007 float dmgTaken = (gotActionData.m_Speed * gotActionData.m_Speed) / ActionGetOutTransport.SHOCK_FACTOR;
1008
1009 //Damage all currently equipped clothes
1010 foreach (ClothingBase cloth : equippedClothes)
1011 {
1012 //If no item is equipped on slot, slot is ignored
1013 if (cloth == null)
1014 continue;
1015
1016 cloth.DecreaseHealth(dmgTaken, false);
1017 }
1018
1019 vector posMS = gotActionData.m_Player.WorldToModel(gotActionData.m_Player.GetPosition());
1020 gotActionData.m_Player.DamageAllLegs(dmgTaken); //Additionnal leg specific damage dealing
1021
1023 healthCoef = Math.Clamp(healthCoef, 0.0, 1.0);
1024 gotActionData.m_Player.ProcessDirectDamage(DamageType.CUSTOM, gotActionData.m_Player, "", "FallDamageHealth", posMS, healthCoef);
1025 }
1026
1027 protected override bool DetectFlipped(VehicleFlippedContext ctx)
1028 {
1030 return false;
1031 if (!DetectFlippedUsingSurface(ctx, GameConstants.VEHICLE_FLIP_ANGLE_TOLERANCE))
1032 return false;
1033 return true;
1034 }
1035
1036#ifdef DIAG_DEVELOPER
1037 ref DebugTextWorldSpace m_DebugText;
1038 ref Param8<float, float, float, float, float, float, float, float> m_DebugParams = new Param8<float, float, float, float, float, float, float, float>(0,0,0,0,0,0,0,0);
1039#endif
1040
1041 override void OnInput(float dt)
1042 {
1043 super.OnInput(dt);
1044
1045#ifdef DIAG_DEVELOPER
1046 if (m_eDebugMode == ECarDebugMode.NONE)
1047 return;
1048
1049 float currentRPM = EngineGetRPM();
1050 if (currentRPM < EngineGetRPMIdle())
1051 {
1052 if (currentRPM < 1.0 && EngineIsOn())
1053 {
1055 EngineStop();
1056 }
1057 else if (!EngineIsOn())
1058 {
1059 EngineStart();
1060 }
1061
1062 return;
1063 }
1064
1065 float currentSpeed = GetSpeedometer();
1066
1067 float longitudinalWanted = 0.0;
1068 float throttleWanted = 0.0;
1069 float steeringWanted = 0.0;
1070
1071 bool attemptSpeed = false;
1072 float speedWanted = 0;
1073
1074 string text = "";
1075
1076 switch (m_eDebugMode)
1077 {
1078 case ECarDebugMode.FORWARD_10:
1079 attemptSpeed = true;
1080 speedWanted = 3;
1081 break;
1082 case ECarDebugMode.FORWARD_50:
1083 attemptSpeed = true;
1084 speedWanted = 50;
1085 break;
1086 case ECarDebugMode.RANDOM_DRIVING:
1087 attemptSpeed = true;
1088
1089 m_DebugParams.param1 -= dt;
1090 if (m_DebugParams.param1 <= 0)
1091 {
1092 m_DebugParams.param1 = Math.RandomFloatInclusive(0.01, 1.0);
1093
1094 speedWanted = speedWanted + Math.RandomFloatInclusive(-25, 25);
1095
1096 speedWanted = Math.Clamp(speedWanted, -20, 100);
1097
1098 steeringWanted = Math.RandomFloatInclusive(-1, 1);
1099
1100 float steeringWantedSign = (steeringWanted > 0) - (steeringWanted < 0);
1101 steeringWanted = steeringWantedSign * Math.Pow(Math.AbsFloat(steeringWanted), 0.5);
1102
1103 if (Math.AbsFloat(speedWanted - currentSpeed) > 15)
1104 {
1105 steeringWanted *= 0.1;
1106 }
1107
1108 m_DebugParams.param2 = steeringWanted;
1109 m_DebugParams.param3 = speedWanted;
1110 }
1111
1112 steeringWanted = m_DebugParams.param2;
1113 speedWanted = m_DebugParams.param3;
1114
1115 text += "\nTarget Steering: " + steeringWanted;
1116 text += "\nTarget Speed: " + speedWanted;
1117 text += "\nCurrent Speed: " + currentSpeed;
1118
1119 break;
1120 case ECarDebugMode.PREDEFINED_PATH:
1121 attemptSpeed = true;
1122 speedWanted = 50;
1123 break;
1124 }
1125
1126 if (!GetGame().IsDedicatedServer())
1127 {
1128 vector transform[4];
1129 GetTransform(transform);
1130 m_DebugText = DebugTextWorldSpace.CreateInWorld(text, DebugTextFlags.DEFAULT | DebugTextFlags.FACE_CAMERA, transform, 1.0);
1131 }
1132
1133 if (attemptSpeed)
1134 {
1135 longitudinalWanted = speedWanted - currentSpeed;
1136
1137 if (speedWanted > 0.1 && currentSpeed > 0.1)
1138 {
1139 longitudinalWanted = Math.Max(longitudinalWanted, 0.1);
1140 }
1141 else if (speedWanted < 0.1 && currentSpeed < 0.1)
1142 {
1143 longitudinalWanted = Math.Min(longitudinalWanted, -0.1);
1144 }
1145 }
1146
1148 float hillFactor = GetOrientation()[1] / 10.0;
1149 hillFactor += 1.0;
1150 hillFactor = Math.Clamp(hillFactor, 0.5, 5.0);
1151
1153 throttleWanted = (EngineGetRPMMin() - EngineGetRPM()) / (EngineGetRPMMin() - EngineGetRPMRedline());
1154 throttleWanted = 1.0 - throttleWanted;
1155 throttleWanted *= Math.AbsFloat(longitudinalWanted);
1156 throttleWanted *= hillFactor;
1157 throttleWanted = Math.Clamp(throttleWanted, 0.0, 1.0);
1158
1159 bool isManual = GearboxGetType() == CarGearboxType.MANUAL;
1160 bool isReverse = GetGear() == CarGear.REVERSE;
1161
1162 if (isManual)
1163 {
1164 float thrustWantedAbs = Math.AbsFloat(throttleWanted);
1165
1166 /*
1167 wtf enforce script?
1168 bool override1 = false;
1169
1170 if (attemptSpeed)
1171 {
1172 if (speedWanted < 0 && currentSpeed < 10)
1173 {
1174 ShiftTo(CarGear.REVERSE);
1175 override1 = true;
1176 }
1177 else if (speedWanted <= 1)
1178 {
1179 ShiftTo(CarGear.NEUTRAL);
1180 override1 = true;
1181 }
1182 }
1183 */
1184
1185 if (currentRPM > EngineGetRPMRedline() * 0.8)
1186 {
1187 if (thrustWantedAbs > 0.1)
1188 {
1189 ShiftUp();
1190 }
1191 }
1192 else if (GetGear() > CarGear.FIRST && thrustWantedAbs < 0.1)
1193 {
1194 ShiftDown();
1195 }
1196 else if (GetGear() < CarGear.FIRST || (throttleWanted > 0.0 && Math.AbsFloat(currentSpeed) < 5.0))
1197 {
1198 ShiftTo(CarGear.FIRST);
1199 }
1200 }
1201
1202 SetThrottle(throttleWanted);
1203 SetSteering(steeringWanted);
1204 SetBrake(0.1);
1205 SetHandbrake(0.0);
1206 SetBrakesActivateWithoutDriver(false);
1207#endif
1208 }
1209
1210 override void OnUpdate(float dt)
1211 {
1212 Human driver = CrewDriver();
1213 if (driver && !driver.IsControllingVehicle())
1214 {
1215 // likely unconscious
1216 if (driver.IsAlive())
1217 {
1218 SetBrake(0.5);
1219 }
1220 }
1221
1222 if (g_Game.IsServer())
1223 {
1224 ItemBase battery = GetBattery();
1225 if (battery)
1226 {
1227 m_BatteryTimer += dt;
1229 {
1230 UpdateBattery(battery);
1231 }
1232 }
1233
1234 if ( g_Game.GetWaterDepth( GetEnginePosWS() ) > 0 )
1235 {
1236 m_DrownTime += dt;
1238 {
1239 // *dt to get damage per second
1240 AddHealth( "Engine", "Health", -DROWN_ENGINE_DAMAGE * dt);
1241 SetEngineZoneReceivedHit(true);
1242 }
1243 }
1244 else
1245 {
1246 m_DrownTime = 0;
1247 }
1248 }
1249
1250 // For visualisation of brake lights for all players
1251 float brake_coef = GetBrake();
1252 if ( brake_coef > 0 )
1253 {
1254 if ( !m_BrakesArePressed )
1255 {
1256 m_BrakesArePressed = true;
1257 SetSynchDirty();
1259 }
1260 }
1261 else
1262 {
1263 if ( m_BrakesArePressed )
1264 {
1265 m_BrakesArePressed = false;
1266 SetSynchDirty();
1268 }
1269 }
1270 }
1271
1272 override void EEKilled(Object killer)
1273 {
1274 super.EEKilled(killer);
1275 m_EngineDestroyed = true;
1276 }
1277
1280 {
1281 int contactZonesCount = m_ContactCache.Count();
1282
1283 if (contactZonesCount == 0)
1284 return;
1285
1286 for (int i = 0; i < contactZonesCount; ++i)
1287 {
1288 string zoneName = m_ContactCache.GetKey(i);
1289 array<ref VehicleContactData> data = m_ContactCache[zoneName];
1290
1291 float dmg = Math.AbsInt(data[0].m_Impulse * m_dmgContactCoef);
1292 float crewDmgBase = Math.AbsInt((data[0].m_Impulse / dBodyGetMass(this)) * 1000 * m_dmgContactCoef);// calculates damage as if the object's weight was 1000kg instead of its actual weight
1293
1294 #ifdef DIAG_DEVELOPER
1295 CrashDebugData.m_CrashDataPoint = new CrashDebugData();
1296 CrashDebugData.m_CrashDataPoint.m_VehicleType = GetDisplayName();
1297 CrashDebugData.m_CrashDataPoint.m_Damage = dmg;
1298 CrashDebugData.m_CrashDataPoint.m_Zone = zoneName;
1299 CrashDebugData.m_CrashDataPoint.m_MomentumCurr = GetMomentum();
1300 CrashDebugData.m_CrashDataPoint.m_MomentumPrev = m_MomentumPrevTick;
1301 CrashDebugData.m_CrashDataPoint.m_MomentumDelta = data[0].m_Impulse;
1302 CrashDebugData.m_CrashDataPoint.m_SpeedWorld = GetVelocity(this).Length() * 3.6;
1303 CrashDebugData.m_CrashDataPoint.m_SpeedWorldPrev = m_VelocityPrevTick.Length() * 3.6;
1304 CrashDebugData.m_CrashDataPoint.m_SpeedWorldDelta = (m_VelocityPrevTick.Length() - GetVelocity(this).Length()) * 3.6;
1305 CrashDebugData.m_CrashDataPoint.m_VelocityCur = GetVelocity(this);
1306 CrashDebugData.m_CrashDataPoint.m_VelocityPrev = m_VelocityPrevTick;
1307 CrashDebugData.m_CrashDataPoint.m_VelocityDot = vector.Dot(m_VelocityPrevTick.Normalized(), GetVelocity(this).Normalized());
1308 CrashDebugData.m_CrashDataPoint.m_Time = g_Game.GetTime();
1309
1310 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_CONSIDERED)
1311 {
1312 Debug.Log("--------------------------------------------------");
1313 Debug.Log("Vehicle:" + GetDisplayName());
1314 Debug.Log("DMG: " + dmg);
1315 Debug.Log("zoneName : "+ zoneName);
1316 Debug.Log("momentumCurr : "+ GetMomentum());
1317 Debug.Log("momentumPrev : "+ m_MomentumPrevTick);
1318 Debug.Log("momentumDelta : "+ data[0].m_Impulse);
1319 Debug.Log("speed(km/h): "+ GetVelocity(this).Length() * 3.6);
1320 Debug.Log("speedPrev(km/h): "+ m_VelocityPrevTick.Length() * 3.6);
1321 Debug.Log("speedDelta(km/h) : "+ (m_VelocityPrevTick.Length() - GetVelocity(this).Length()) * 3.6);
1322 Debug.Log("velocityCur.): "+ GetVelocity(this));
1323 Debug.Log("velocityPrev.): "+ m_VelocityPrevTick);
1324 Debug.Log("velocityDot): "+ vector.Dot(m_VelocityPrevTick.Normalized(), GetVelocity(this).Normalized()));
1325 Debug.Log("g_Game.GetTime(): "+ g_Game.GetTime());
1326 Debug.Log("--------------------------------------------------");
1327 }
1328 #endif
1330 continue;
1331
1332 int pddfFlags;
1333 #ifdef DIAG_DEVELOPER
1334 CrashDebugData.m_CrashData.Insert(CrashDebugData.m_CrashDataPoint);
1335 CrashDebugData.m_CrashDataPoint.m_Speedometer = GetSpeedometer();
1336 //Print("Crash data recorded");
1337 #endif
1339 {
1340 #ifdef DIAG_DEVELOPER
1341 CrashDebugData.m_CrashDataPoint.m_DamageType = "Small";
1342 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1343 Debug.Log(string.Format("[Vehiles:Damage]:: DMG %1 to the %2 zone is SMALL (threshold: %3), SPEEDOMETER: %4, TIME: %5", dmg, zoneName, GameConstants.CARS_CONTACT_DMG_MIN, GetSpeedometer(), g_Game.GetTime() ));
1344 #endif
1345 SynchCrashLightSound(true);
1346 pddfFlags = ProcessDirectDamageFlags.NO_TRANSFER;
1347 }
1348 else
1349 {
1350 #ifdef DIAG_DEVELOPER
1351 CrashDebugData.m_CrashDataPoint.m_DamageType = "Big";
1352 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1353 Debug.Log(string.Format("[Vehiles:Damage]:: DMG %1 to the %2 zone is BIG (threshold: %3), SPEED: %4, TIME: %5", dmg, zoneName, GameConstants.CARS_CONTACT_DMG_THRESHOLD, GetSpeedometer(), g_Game.GetTime() ));
1354 #endif
1355 DamageCrew(crewDmgBase);
1356 SynchCrashHeavySound(true);
1357 pddfFlags = 0;
1358 }
1359
1360 #ifdef DEVELOPER
1361 m_DebugContactDamageMessage += string.Format("%1: %2\n", zoneName, dmg);
1362 #endif
1363
1364 ProcessDirectDamage(DamageType.CUSTOM, null, zoneName, "EnviroDmg", "0 0 0", dmg, pddfFlags);
1365 }
1366
1368 UpdateLights();
1369
1370 m_ContactCache.Clear();
1371 }
1372
1374 void DamageCrew(float dmg)
1375 {
1376 int crewSize = CrewSize();
1377 for (int c = 0; c < crewSize; ++c)
1378 {
1379 Human crew = CrewMember(c);
1380 if (!crew)
1381 continue;
1382
1384 {
1385 #ifdef DIAG_DEVELOPER
1386 CrashDebugData.m_CrashDataPoint.m_CrewDamageBase = dmg;
1387 CrashDebugData.m_CrashDataPoint.m_DMGHealth = -100;
1388 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1389 {
1390 Debug.Log("--------------------------------------------------");
1391 Debug.Log("Killing the player");
1392 Debug.Log("Crew DMG Base: " + dmg);
1393 Debug.Log("--------------------------------------------------");
1394
1395 }
1396 #endif
1397 crew.SetHealth(0.0);
1398 }
1399 else
1400 {
1402 shockTemp = Math.Clamp(shockTemp,0,1);
1403 float shock = Math.Lerp(50, 150, shockTemp);
1404 float hp = Math.Lerp(2, 100, shockTemp);
1405
1406 #ifdef DIAG_DEVELOPER
1407 CrashDebugData.m_CrashDataPoint.m_CrewDamageBase = dmg;
1408 CrashDebugData.m_CrashDataPoint.m_ShockTemp = shockTemp;
1409 CrashDebugData.m_CrashDataPoint.m_DMGHealth = hp;
1410 CrashDebugData.m_CrashDataPoint.m_DMGShock = shock;
1411 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1412 {
1413 Debug.Log("--------------------------------------------------");
1414 Debug.Log("Crew DMG Base: " + dmg);
1415 Debug.Log("Crew shockTemp: " + shockTemp);
1416 Debug.Log("Crew DMG Health: " + hp);
1417 Debug.Log("Crew DMG Shock: " + shock);
1418 Debug.Log("--------------------------------------------------");
1419 }
1420 #endif
1421
1422 crew.AddHealth("", "Shock", -shock);
1423 crew.AddHealth("", "Health", -hp);
1424 }
1425 }
1426 }
1427
1433 override float OnSound( CarSoundCtrl ctrl, float oldValue )
1434 {
1435 switch (ctrl)
1436 {
1437 case CarSoundCtrl.ENGINE:
1438 if (!m_EngineStarted)
1439 {
1440 return 0.0;
1441 }
1442 break;
1443 }
1444
1445 return oldValue;
1446 }
1447
1448 override void OnAnimationPhaseStarted(string animSource, float phase)
1449 {
1450 #ifndef SERVER
1451 #ifndef NO_GUI
1452 HandleDoorsSound(animSource, phase);
1453 HandleSeatAdjustmentSound(animSource, phase);
1454 #endif
1455 #endif
1456 }
1457
1458 override protected EffectSound CreateSoundForAnimationSource(string animSource)
1459 {
1461 int pivotIndex = -1;
1462
1463 string selectionName = GetSelectionFromAnimSource(animSource);
1464 if (selectionName != "")
1465 {
1466 position = GetSelectionBasePositionLS(selectionName);
1467
1468 int level = GetViewGeometryLevel();
1469
1470 array<int> pivots = new array<int>();
1471
1472 pivots.Clear();
1473 GetBonePivotsForAnimationSource(level, animSource, pivots);
1474
1475 if (pivots.Count())
1476 {
1477 pivotIndex = pivots[0];
1478 }
1479 }
1480
1481 WaveKind waveKind = WaveKind.WAVEEFFECTEX;
1482
1483 EffectSound sound = new EffectSound();
1484
1485 PlayerBase player;
1486 if (Class.CastTo(player, g_Game.GetPlayer()))
1487 {
1488 if (player.IsCameraInsideVehicle())
1489 {
1490 waveKind = WaveKind.WAVEEFFECT;
1491 }
1492 }
1493
1494 sound.SetAutodestroy(true);
1495 sound.SetParent(this, pivotIndex);
1496 sound.SetPosition(ModelToWorld(position));
1497 sound.SetLocalPosition(position);
1498 sound.SetSoundWaveKind(waveKind);
1499
1500 return sound;
1501 }
1502
1503 protected void HandleDoorsSound(string animSource, float phase)
1504 {
1505 switch (animSource)
1506 {
1507 case "doorsdriver":
1508 case "doorscodriver":
1509 case "doorscargo1":
1510 case "doorscargo2":
1511 case "doorshood":
1512 case "doorstrunk":
1513 EffectSound sound = CreateSoundForAnimationSource(animSource);
1514
1515 if (phase == 0)
1517 else
1519
1521 sound.SoundPlay();
1522
1523 break;
1524 }
1525 }
1526
1527 protected void HandleSeatAdjustmentSound(string animSource, float phase)
1528 {
1529 switch (animSource)
1530 {
1531 case "seatdriver":
1532 case "seatcodriver":
1533 EffectSound sound = CreateSoundForAnimationSource(animSource);
1534
1535 if (phase == 0)
1537 else
1539
1541 sound.SoundPlay();
1542
1543 break;
1544 }
1545 }
1546
1547
1548 protected void HandleCarHornSound(ECarHornState pState)
1549 {
1550 m_HornComponent.HandleSound();
1551 }
1552
1553 // Only used for sound states which happen before engine start
1554 void SetCarEngineSoundState(CarEngineSoundState pState)
1555 {
1556 m_CarEngineSoundState = pState;
1557 SetSynchDirty();
1558 }
1559
1560 void HandleEngineSound(CarEngineSoundState state)
1561 {
1564
1565 #ifndef SERVER
1566 #ifndef NO_GUI
1567 PlayerBase player = null;
1568 EffectSound sound = null;
1569 WaveKind waveKind = WaveKind.WAVEEFFECTEX;
1570
1571 bool doInside = false;
1572
1574
1575 switch (state)
1576 {
1577 case CarEngineSoundState.STARTING:
1578 sound = new EffectSound();
1579 sound.SetSoundSet("Offroad_02_Starting_SoundSet");
1580 sound.SetSoundFadeOut(0.15);
1581
1582 m_PreStartSound = sound;
1583 break;
1584 case CarEngineSoundState.START_OK:
1585 doInside = true;
1586
1587 sound = new EffectSound();
1589 sound.SetAutodestroy(true);
1590
1592 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SetEngineStarted, 1000, false, true);
1593 break;
1594
1595 case CarEngineSoundState.START_NO_FUEL:
1596 sound = new EffectSound();
1597 sound.SetSoundSet("offroad_engine_failed_start_fuel_SoundSet");
1598 sound.SetAutodestroy(true);
1599 break;
1600
1601 case CarEngineSoundState.START_NO_BATTERY:
1602 sound = new EffectSound();
1603 sound.SetSoundSet("offroad_engine_failed_start_battery_SoundSet");
1604 sound.SetAutodestroy(true);
1605 break;
1606
1607 case CarEngineSoundState.START_NO_SPARKPLUG:
1608 sound = new EffectSound();
1609 sound.SetSoundSet("offroad_engine_failed_start_sparkplugs_SoundSet");
1610 sound.SetAutodestroy(true);
1611 break;
1612
1613 case CarEngineSoundState.STOP_OK:
1614 doInside = true;
1615
1616 sound = new EffectSound();
1618 sound.SetAutodestroy(true);
1619 break;
1620 case CarEngineSoundState.STOP_NO_FUEL:
1621 doInside = true;
1622
1623 sound = new EffectSound();
1625 sound.SetAutodestroy(true);
1626 break;
1627
1628 default:
1629 break;
1630 }
1631
1632 // play different sound based on selected camera
1633 if (doInside && Class.CastTo(player, g_Game.GetPlayer()))
1634 {
1635 if (player.IsCameraInsideVehicle())
1636 {
1637 waveKind = WaveKind.WAVEEFFECT;
1638 }
1639 }
1640
1641 if (sound)
1642 {
1643 vector enginePos = GetEnginePos();
1644
1645 sound.SetParent(this);
1646 sound.SetPosition(ModelToWorld(enginePos));
1647 sound.SetLocalPosition(enginePos);
1648 sound.SetSoundWaveKind(waveKind);
1650
1651 sound.SoundPlay();
1652 }
1653
1654 #endif
1655 #endif
1656 }
1657
1658 override void MarkCrewMemberUnconscious(int crewMemberIndex)
1659 {
1660 if (!IsAuthority())
1661 return;
1662
1663 if (crewMemberIndex == DayZPlayerConstants.VEHICLESEAT_DRIVER)
1664 {
1665 EngineStop();
1666 }
1667 }
1668
1669 override void MarkCrewMemberDead(int crewMemberIndex)
1670 {
1671 if (!IsAuthority())
1672 return;
1673
1674 if (crewMemberIndex == DayZPlayerConstants.VEHICLESEAT_DRIVER)
1675 {
1676 EngineStop();
1677 }
1678 }
1679
1686 override void OnFluidChanged(CarFluid fluid, float newValue, float oldValue)
1687 {
1688 switch ( fluid )
1689 {
1690 case CarFluid.FUEL:
1691 m_FuelAmmount = newValue;
1692 break;
1693
1694 case CarFluid.OIL:
1695 m_OilAmmount = newValue;
1696 break;
1697
1698 case CarFluid.BRAKE:
1699 m_BrakeAmmount = newValue;
1700 break;
1701
1702 case CarFluid.COOLANT:
1703 m_CoolantAmmount = newValue;
1704 break;
1705 }
1706 }
1707
1713 override bool OnBeforeEngineStart()
1714 {
1715 SetCarEngineSoundState(CarEngineSoundState.NONE);
1716
1717 ECarOperationalState state = CheckOperationalRequirements();
1718 return state == ECarOperationalState.OK;
1719 }
1720
1722 {
1723 ECarOperationalState state = CheckOperationalRequirements();
1724
1725 if (state == ECarOperationalState.RUINED)
1726 {
1727 return;
1728 }
1729
1730 if (state & ECarOperationalState.NO_BATTERY)
1731 {
1732 HandleEngineSound(CarEngineSoundState.START_NO_BATTERY);
1733 return;
1734 }
1735
1736 if (state & ECarOperationalState.NO_IGNITER)
1737 {
1738 HandleEngineSound(CarEngineSoundState.START_NO_SPARKPLUG);
1739 return;
1740 }
1741
1742 if (state & ECarOperationalState.NO_FUEL)
1743 {
1744 HandleEngineSound(CarEngineSoundState.START_NO_FUEL);
1745 return;
1746 }
1747
1748 HandleEngineSound(CarEngineSoundState.STARTING);
1749 }
1750
1751 // Whether the car engine can be started
1753 {
1754 int state = ECarOperationalState.OK;
1755
1756 EntityAI item = null;
1757
1758 if (IsDamageDestroyed() || GetHealthLevel("Engine") >= GameConstants.STATE_RUINED)
1759 {
1760 state |= ECarOperationalState.RUINED;
1761 }
1762
1763 if (GetFluidFraction(CarFluid.FUEL) <= 0)
1764 {
1765 state |= ECarOperationalState.NO_FUEL;
1766 }
1767
1769 {
1770 item = GetBattery();
1771 float batteryConsume = GetBatteryConsumption();
1772 if (!item || (item && (item.IsRuined() || item.GetCompEM().GetEnergy() < batteryConsume)))
1773 state |= ECarOperationalState.NO_BATTERY;
1774 }
1775
1776 if (IsVitalSparkPlug())
1777 {
1778 item = FindAttachmentBySlotName("SparkPlug");
1779 if (!item || (item && item.IsRuined()))
1780 state |= ECarOperationalState.NO_IGNITER;
1781 }
1782
1783 if (IsVitalGlowPlug())
1784 {
1785 item = FindAttachmentBySlotName("GlowPlug");
1786 if (!item || (item && item.IsRuined()))
1787 state |= ECarOperationalState.NO_IGNITER;
1788 }
1789
1790 return state;
1791 }
1792
1794 {
1795 return CheckOperationalRequirements() == ECarOperationalState.OK;
1796 }
1797
1798 override void OnGearChanged(int newGear, int oldGear)
1799 {
1800 //Debug.Log(string.Format("OnGearChanged newGear=%1,oldGear=%2", newGear, oldGear));
1801 UpdateLights(newGear);
1802 }
1803
1805 override void OnEngineStart()
1806 {
1807 ItemBase battery = GetBattery();
1808 if (g_Game.IsServer() && battery)
1809 {
1810 float batteryConsume = GetBatteryConsumption();
1811 battery.GetCompEM().ConsumeEnergy(batteryConsume);
1812
1813 UpdateBattery(battery);
1814 }
1815
1816 UpdateLights();
1817
1818 HandleEngineSound(CarEngineSoundState.START_OK);
1819 }
1820
1822 override void OnEngineStop()
1823 {
1824 ItemBase battery = GetBattery();
1825 if (g_Game.IsServer() && battery)
1826 {
1827 UpdateBattery(battery);
1828 }
1829
1830 UpdateLights();
1831
1832 CarEngineSoundState stopSoundState = CarEngineSoundState.STOP_OK;
1833 if (GetFluidFraction(CarFluid.FUEL) <= 0)
1834 stopSoundState = CarEngineSoundState.STOP_NO_FUEL;
1835
1836 HandleEngineSound(stopSoundState);
1837
1838 SetEngineZoneReceivedHit(false);
1839 }
1840
1841 override bool OnBeforeLightOn()
1842 {
1843 ItemBase neededItem = GetBattery();
1844
1845 if (neededItem && !neededItem.IsRuined())
1846 {
1847 return neededItem.GetCompEM() && neededItem.GetCompEM().GetEnergy() > 0.0;
1848 }
1849
1850 return false;
1851 }
1852
1853 override void UpdateLights(int new_gear = -1)
1854 {
1855 #ifndef SERVER
1856 UpdateLightsClient(new_gear);
1857 #endif
1858 UpdateLightsServer(new_gear);
1859 }
1860
1861 void UpdateLightsClient(int newGear = -1)
1862 {
1863 int gear;
1864
1865 if (newGear == -1)
1866 {
1867 gear = GetGear();
1868 }
1869 else
1870 {
1871 gear = newGear;
1872 }
1873
1874 if (LightIsOn())
1875 {
1876 if (!m_LightsComponent.LightExist("Front") && m_HeadlightsState != CarHeadlightBulbsState.NONE)
1877 m_LightsComponent.EnableLight("Front");
1878
1879 if (m_LightsComponent.LightExist("Front"))
1880 {
1881 switch (m_HeadlightsState)
1882 {
1883 case CarHeadlightBulbsState.LEFT:
1884 m_LightsComponent.AttachLightOnPoint("Front", m_LeftHeadlightPoint, m_LeftHeadlightTargetPoint, VehicleLightMode.SEGREGATED);
1885 break;
1886
1887 case CarHeadlightBulbsState.RIGHT:
1888 m_LightsComponent.AttachLightOnPoint("Front", m_RightHeadlightPoint, m_RightHeadlightTargetPoint, VehicleLightMode.SEGREGATED);
1889 break;
1890
1891 case CarHeadlightBulbsState.BOTH:
1892 vector local_pos_left = GetMemoryPointPos(m_LeftHeadlightPoint);
1893 vector local_pos_right = GetMemoryPointPos(m_RightHeadlightPoint);
1894
1895 vector local_pos_middle = (local_pos_left + local_pos_right) * 0.5;
1896 m_LightsComponent.AttachLightOnObject("Front", local_pos_middle, vector.Zero, VehicleLightMode.AGGREGATED);
1897 break;
1898
1899 default:
1900 m_LightsComponent.DisableLight("Front");
1901 }
1902 }
1903 }
1904 else
1905 {
1906 if (m_LightsComponent.LightExist("Front"))
1907 m_LightsComponent.DisableLight("Front");
1908 }
1909
1910 // brakes & reverse
1911 switch (gear)
1912 {
1913 case CarGear.REVERSE:
1916 m_RearLightType = CarRearLightType.BRAKES_AND_REVERSE;
1917 else
1918 m_RearLightType = CarRearLightType.REVERSE_ONLY;
1919 break;
1920 default:
1922 m_RearLightType = CarRearLightType.BRAKES_ONLY;
1923 else
1924 m_RearLightType = CarRearLightType.NONE;
1925 }
1926
1927 //Debug.Log(string.Format("m_BrakesArePressed=%1, m_RearLightType=%2", m_BrakesArePressed.ToString(), EnumTools.EnumToString(CarRearLightType, m_RearLightType)));
1928
1929 if (!m_LightsComponent.LightExist("Rear") && m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
1930 {
1931 if (EngineIsOn() || m_RearLightType == CarRearLightType.BRAKES_ONLY || m_RearLightType == CarRearLightType.BRAKES_AND_REVERSE)
1932 {
1933 m_LightsComponent.EnableLight("Rear");
1934 m_LightsComponent.AttachLightOnObject("Rear", GetMemoryPointPos(m_ReverseLightPoint), "180 0 0", VehicleLightMode.SEGREGATED);
1935 }
1936 }
1937
1938 // rear lights
1939 if (m_LightsComponent.LightExist("Rear") && m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
1940 {
1941 switch (m_RearLightType)
1942 {
1943 case CarRearLightType.BRAKES_ONLY:
1944 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.BRAKE, VehicleLightMode.SEGREGATED);
1945 break;
1946
1947 case CarRearLightType.REVERSE_ONLY:
1948 if (EngineIsOn())
1949 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.REVERSE, VehicleLightMode.SEGREGATED);
1950 else
1951 m_LightsComponent.DisableLight("Rear");
1952
1953 break;
1954
1955 case CarRearLightType.BRAKES_AND_REVERSE:
1956 if (EngineIsOn())
1957 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.REVERSE_BRAKE, VehicleLightMode.AGGREGATED);
1958 else
1959 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.BRAKE, VehicleLightMode.SEGREGATED);
1960
1961 break;
1962
1963 default:
1964 m_LightsComponent.DisableLight("Rear");
1965 }
1966 }
1967 else
1968 {
1969 if (m_LightsComponent.LightExist("Rear"))
1970 m_LightsComponent.DisableLight("Rear");
1971 }
1972 }
1973
1974 void UpdateLightsServer(int newGear = -1)
1975 {
1976 int gear;
1977
1978 if (newGear == -1)
1979 {
1980 gear = GetGear();
1981 if (GearboxGetType() == CarGearboxType.AUTOMATIC)
1982 {
1983 gear = GearboxGetMode();
1984 }
1985 }
1986 else
1987 {
1988 gear = newGear;
1989 }
1990
1991 if (LightIsOn())
1992 {
1993 m_LightsComponent.SetSelectionMaterial("DashboardOn");
1994
1995 switch (m_HeadlightsState)
1996 {
1997 case CarHeadlightBulbsState.LEFT:
1998 m_LightsComponent.SetSelectionMaterial("TailLeftOnly");
1999 m_LightsComponent.SetSelectionMaterial("FrontLeftOn");
2000 m_LightsComponent.SetSelectionMaterial("FrontRightOff");
2001 break;
2002 case CarHeadlightBulbsState.RIGHT:
2003 m_LightsComponent.SetSelectionMaterial("TailRightOnly");
2004 m_LightsComponent.SetSelectionMaterial("FrontLeftOff");
2005 m_LightsComponent.SetSelectionMaterial("FrontRightOn");
2006 break;
2007 case CarHeadlightBulbsState.BOTH:
2008 m_LightsComponent.SetSelectionMaterial("TailOn");
2009 m_LightsComponent.SetSelectionMaterial("FrontLeftOn");
2010 m_LightsComponent.SetSelectionMaterial("FrontRightOn");
2011 break;
2012 default:
2013 m_LightsComponent.SetSelectionMaterial("FrontLeftOff");
2014 m_LightsComponent.SetSelectionMaterial("FrontRightOff");
2015 }
2016
2017 //Debug.Log(string.Format("LightIsOn=%1, m_HeadlightsState=%2", LightIsOn().ToString(), EnumTools.EnumToString(CarHeadlightBulbsState, m_HeadlightsState)));
2018 }
2019 else
2020 {
2021 m_LightsComponent.SetSelectionMaterial("TailOff");
2022 m_LightsComponent.SetSelectionMaterial("DashboardOff");
2023 m_LightsComponent.SetSelectionMaterial("FrontLeftOff");
2024 m_LightsComponent.SetSelectionMaterial("FrontRightOff");
2025 }
2026
2027
2028 // brakes & reverse
2029 switch (gear)
2030 {
2031 case CarGear.REVERSE:
2034 m_RearLightType = CarRearLightType.BRAKES_AND_REVERSE;
2035 else
2036 m_RearLightType = CarRearLightType.REVERSE_ONLY;
2037 break;
2038 default:
2040 m_RearLightType = CarRearLightType.BRAKES_ONLY;
2041 else
2042 m_RearLightType = CarRearLightType.NONE;
2043 }
2044
2045 //Debug.Log(string.Format("m_BrakesArePressed=%1, m_RearLightType=%2", m_BrakesArePressed.ToString(), EnumTools.EnumToString(CarRearLightType, m_RearLightType)));
2046
2047
2048 // rear lights
2049 if (m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
2050 {
2051 switch (m_RearLightType)
2052 {
2053 case CarRearLightType.BRAKES_ONLY:
2054 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2055 m_LightsComponent.SetSelectionMaterial("BrakesOn");
2056 break;
2057 case CarRearLightType.REVERSE_ONLY:
2058 if (EngineIsOn())
2059 {
2060 m_LightsComponent.SetSelectionMaterial("ReverseOn");
2062 m_LightsComponent.SetSelectionMaterial("BrakesOff");
2063 }
2064 else
2065 {
2066 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2067 m_LightsComponent.SetSelectionMaterial("BrakesOff");
2068 }
2069 break;
2070 case CarRearLightType.BRAKES_AND_REVERSE:
2071 if (EngineIsOn())
2072 {
2073 m_LightsComponent.SetSelectionMaterial("BrakesOn");
2074 m_LightsComponent.SetSelectionMaterial("ReverseOn");
2075 }
2076 else
2077 {
2078 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2079 m_LightsComponent.SetSelectionMaterial("BrakesOn");
2080 }
2081 break;
2082 default:
2083 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2084
2086 m_LightsComponent.SetSelectionMaterial("BrakesOff");
2087 }
2088 }
2089 else
2090 {
2091 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2092
2094 m_LightsComponent.SetSelectionMaterial("BrakesOff");
2095 }
2096 }
2097
2098 protected void LeakFluid(CarFluid fluid)
2099 {
2100 float amount = 0;
2101
2102 switch (fluid)
2103 {
2104 case CarFluid.COOLANT:
2105 amount = (1 - m_RadiatorHealth) * RandomFloat(0.02, 0.05);//CARS_LEAK_TICK_MIN; CARS_LEAK_TICK_MAX
2106 Leak(fluid, amount);
2107 break;
2108
2109 case CarFluid.OIL:
2110 amount = (1 - m_EngineHealth) * RandomFloat(0.02, 1.0);//CARS_LEAK_OIL_MIN; CARS_LEAK_OIL_MAX
2111 Leak(fluid, amount);
2112 break;
2113
2114 case CarFluid.FUEL:
2115 amount = (1 - m_FuelTankHealth) * RandomFloat(0.02, 0.05);//CARS_LEAK_TICK_MIN; CARS_LEAK_TICK_MAX
2116 Leak(fluid, amount);
2117 break;
2118 }
2119 }
2120
2121 override protected void PartsHealthCheck()
2122 {
2123 if (HasRadiator())
2124 {
2125 EntityAI radiator = GetRadiator();
2126 int radiatorHealthLevel = radiator.GetHealthLevel("");
2127 m_RadiatorHealth = GetHealthLevelValue(radiatorHealthLevel, "");
2128 }
2129 else
2130 {
2131 m_RadiatorHealth = 0.0;
2132 }
2133
2134 int engineHealthLevel = GetHealthLevel("Engine");
2135 m_EngineHealth = GetHealthLevelValue(engineHealthLevel, "Engine");
2136
2137 int fuelTankHealthLevel = GetHealthLevel("FuelTank");
2138 m_FuelTankHealth = GetHealthLevelValue(fuelTankHealthLevel, "FuelTank");
2139 }
2140
2141 string GetDoorConditionPointFromSelection( string selection )
2142 {
2143 switch( selection )
2144 {
2145 case "seat_driver":
2146 return "seat_con_1_1";
2147 break;
2148 case "seat_codriver":
2149 return "seat_con_2_1";
2150 break;
2151 case "seat_cargo1":
2152 return "seat_con_1_2";
2153 break;
2154 case "seat_cargo2":
2155 return "seat_con_2_2";
2156 break;
2157 }
2158
2159 return "";
2160 }
2161
2163 {
2164 return "";
2165 }
2166
2168 {
2169 return "";
2170 }
2171
2172 int GetCrewIndex( string selection )
2173 {
2174 return -1;
2175 }
2176
2177 override bool CanReachSeatFromDoors( string pSeatSelection, vector pFromPos, float pDistance = 1.0 )
2178 {
2179 string conPointName = GetDoorConditionPointFromSelection(pSeatSelection);
2180 if (conPointName.Length() > 0)
2181 {
2182 if ( MemoryPointExists(conPointName) )
2183 {
2184 vector conPointMS = GetMemoryPointPos(conPointName);
2185 vector conPointWS = ModelToWorld(conPointMS);
2186
2188 conPointWS[1] = 0;
2189 pFromPos[1] = 0;
2190
2191 if (vector.Distance(pFromPos, conPointWS) <= pDistance)
2192 {
2193 return true;
2194 }
2195 }
2196 }
2197
2198 return false;
2199 }
2200
2202 {
2203 return true;
2204 }
2205
2207 {
2208 return true;
2209 }
2210
2212 {
2213 return m_Radiator != null;
2214 }
2215
2217 {
2218 return m_Radiator;
2219 }
2220
2222 {
2223 return GetSpeedometerAbsolute() > 3.5;
2224 }
2225
2227 {
2228 return GetHandbrake() > 0.0;
2229 }
2230
2233 {
2235
2236 }
2237
2238 void SetEngineStarted(bool started)
2239 {
2240 m_EngineStarted = started;
2241 }
2242
2243 int GetCarDoorsState(string slotType)
2244 {
2245 return CarDoorState.DOORS_MISSING;
2246 }
2247
2249 {
2250 if (GetAnimationPhase(animation) > 0.5)
2251 {
2252 return CarDoorState.DOORS_OPEN;
2253 }
2254 else
2255 {
2256 return CarDoorState.DOORS_CLOSED;
2257 }
2258 }
2259
2261 {
2262 return "radiator";
2263 }
2264
2266 {
2267 return 2.0;
2268 }
2269
2271 {
2272 return "carradiator";
2273 }
2274
2276 {
2277 return 2.0;
2278 }
2279
2281 {
2282 return "carradiator";
2283 }
2284
2286 {
2287 return 2.0;
2288 }
2289
2291 {
2293 if (!m_InputActionMap)
2294 {
2296 m_InputActionMap = iam;
2297 SetActions();
2298 m_CarTypeActionsMap.Insert(this.Type(), m_InputActionMap);
2299 }
2300 }
2301
2302 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
2303 {
2305 {
2306 m_ActionsInitialize = true;
2308 }
2309
2310 actions = m_InputActionMap.Get(action_input_type);
2311 }
2312
2323
2324 void AddAction(typename actionName)
2325 {
2326 ActionBase action = ActionManagerBase.GetAction(actionName);
2327
2328 if (!action)
2329 {
2330 Debug.LogError("Action " + actionName + " doesn't exist!");
2331 return;
2332 }
2333
2334 typename ai = action.GetInputType();
2335 if (!ai)
2336 {
2337 m_ActionsInitialize = false;
2338 return;
2339 }
2340 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
2341
2342 if (!action_array)
2343 {
2344 action_array = new array<ActionBase_Basic>;
2345 m_InputActionMap.Insert(ai, action_array);
2346 }
2347#ifdef ENABLE_LOGGING
2349 {
2350 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action" );
2351 }
2352#endif
2353 action_array.Insert(action);
2354 }
2355
2356 void RemoveAction(typename actionName)
2357 {
2358 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
2359 ActionBase action = player.GetActionManager().GetAction(actionName);
2360 typename ai = action.GetInputType();
2361 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
2362
2363 if (action_array)
2364 {
2365 action_array.RemoveItem(action);
2366 }
2367 }
2368
2369 override bool IsInventoryVisible()
2370 {
2371 return ( g_Game.GetPlayer() && ( !g_Game.GetPlayer().GetCommand_Vehicle() || g_Game.GetPlayer().GetCommand_Vehicle().GetTransport() == this ) );
2372 }
2373
2374 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
2375 {
2376 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2377
2378 if (newLevel == GameConstants.STATE_RUINED && oldLevel != newLevel)
2379 {
2380 bool dummy;
2381 switch ( zone )
2382 {
2383 case "WindowLR":
2384 case "WindowRR":
2385 if (m_Initialized)
2386 {
2387 PlaySoundEx("offroad_hit_window_small_SoundSet", m_WindowSmall, dummy);
2388 }
2389 break;
2390
2391 case "WindowFront":
2392 case "WindowBack":
2393 case "WindowFrontLeft":
2394 case "WindowFrontRight":
2395 if (m_Initialized)
2396 {
2397 PlaySoundEx("offroad_hit_window_large_SoundSet", m_WindowLarge, dummy);
2398 }
2399 break;
2400
2401 case "Engine":
2402 #ifndef SERVER
2403 #ifndef NO_GUI
2405 #endif
2406 #endif
2407 break;
2408 }
2409 }
2410 }
2411
2412 override void EEOnCECreate()
2413 {
2414
2415 float maxVolume = GetFluidCapacity( CarFluid.FUEL );
2416 float amount = Math.RandomFloat(0.0, maxVolume * 0.35 );
2417
2418 Fill( CarFluid.FUEL, amount );
2419 }
2420
2421 //Get the engine start battery consumption
2423 {
2424 return m_BatteryConsume;
2425 }
2426
2431
2433 {
2434 return -m_BatteryRecharge;
2435 }
2436
2438 {
2439 return ItemBase.Cast(GetElectricitySourceDevice());
2440 }
2441
2442 protected void UpdateBattery(ItemBase battery)
2443 {
2444 if (!battery)
2445 {
2446 m_BatteryTimer = 0;
2447 return;
2448 }
2449
2450 // unlikely
2451 if (m_BatteryTimer < 0)
2452 {
2453 m_BatteryTimer = 0;
2454 }
2455
2456 bool engineOn = EngineIsOn();
2457 bool lightsOn = LightIsOn();
2458
2459 if (engineOn)
2460 {
2461 // alternator
2462 battery.GetCompEM().ConsumeEnergy(GetBatteryRechargeRate() * m_BatteryTimer);
2463 }
2464 else if (!engineOn && lightsOn)
2465 {
2466 battery.GetCompEM().ConsumeEnergy(GetBatteryRuntimeConsumption() * m_BatteryTimer);
2467 }
2468
2469 if (lightsOn && battery.GetCompEM().GetEnergy() <= 0)
2470 {
2471 // lights currently don't automatically turn back on if the headlight was last turned on, so we just keep them on if the engine is on
2472 if (!engineOn)
2473 {
2474 LightOff();
2475 }
2476 }
2477
2478 m_BatteryTimer = 0;
2479 }
2480
2481 void SetCarHornState(int pState)
2482 {
2483 m_HornComponent.SetMode(pState);
2484
2486 m_CarHornState = pState;
2487 SetSynchDirty();
2488 }
2489
2491 {
2492 return vector.Zero;
2493 }
2494
2496 {
2497 return 1.0;
2498 }
2499
2500 protected void SpawnUniversalParts()
2501 {
2502 GameInventory inventory = GetInventory();
2503 inventory.CreateInInventory("HeadlightH7");
2504 inventory.CreateInInventory("HeadlightH7");
2505 inventory.CreateInInventory("HeadlightH7");
2506 inventory.CreateInInventory("HeadlightH7");
2507
2509 GetInventory().CreateInInventory(GetElectricitySourceDeviceType());
2510
2511 if (IsVitalRadiator())
2512 {
2513 inventory.CreateInInventory("CarRadiator");
2514 inventory.CreateInInventory("CarRadiator");
2515 }
2516
2517 if (IsVitalSparkPlug())
2518 {
2519 inventory.CreateInInventory("SparkPlug");
2520 inventory.CreateInInventory("SparkPlug");
2521 }
2522
2523 if (IsVitalGlowPlug())
2524 {
2525 inventory.CreateInInventory("GlowPlug");
2526 inventory.CreateInInventory("GlowPlug");
2527 }
2528 }
2529
2530 protected void SpawnAdditionalItems()
2531 {
2532 GameInventory inventory = GetInventory();
2533 inventory.CreateInInventory("Wrench");
2534 inventory.CreateInInventory("LugWrench");
2535 inventory.CreateInInventory("Screwdriver");
2536 inventory.CreateInInventory("EpoxyPutty");
2537
2538 inventory.CreateInInventory("CanisterGasoline");
2539
2540 EntityAI ent;
2541 ItemBase container;
2542 ent = inventory.CreateInInventory("CanisterGasoline");
2543 if (Class.CastTo(container, ent))
2544 {
2545 container.SetLiquidType(LIQUID_WATER, true);
2546 }
2547
2548 ent = inventory.CreateInInventory("Blowtorch");
2549 if (ent)
2550 {
2551 ent.GetInventory().CreateInInventory("LargeGasCanister");
2552 }
2553
2554 ent = inventory.CreateInInventory("Blowtorch");
2555 if (ent)
2556 {
2557 ent.GetInventory().CreateInInventory("LargeGasCanister");
2558 }
2559 }
2560
2561 protected void FillUpCarFluids()
2562 {
2563 Fill(CarFluid.FUEL, 200.0);
2564 Fill(CarFluid.COOLANT, 200.0);
2565 Fill(CarFluid.OIL, 200.0);
2566 }
2567
2568 protected override event typename GetOwnerStateType()
2569 {
2570 return CarScriptOwnerState;
2571 }
2572
2573 protected override event typename GetMoveType()
2574 {
2575 return CarScriptMove;
2576 }
2577
2578 protected override event void ObtainState(/*inout*/ PawnOwnerState pState)
2579 {
2580 auto state = CarScriptOwnerState.Cast(pState);
2581 state.m_fTime = m_Time;
2582 }
2583
2584 protected override event void RewindState(PawnOwnerState pState, /*inout*/ PawnMove pMove, inout NetworkRewindType pRewindType)
2585 {
2586 auto state = CarScriptOwnerState.Cast(pState);
2587 m_Time = state.m_fTime;
2588 }
2589
2590 // Cars that use the old networking only perform this part of the simulation on the server and not the clients
2591 // TODO(kumarjac): Obsolete this function once new networking is permanently enabled
2593 {
2594 bool isServer = g_Game.IsServer();
2595 if (isServer || GetNetworkMoveStrategy() != NetworkMoveStrategy.PHYSICS)
2596 {
2597 return isServer;
2598 }
2599
2600 return IsOwner();
2601 }
2602
2603 #ifdef DIAG_DEVELOPER
2604 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
2605 {
2606 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_HORN_START_LONG, "Horn Start Short", FadeColors.LIGHT_GREY));
2607 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_HORN_START_SHORT, "Horn Start Long", FadeColors.LIGHT_GREY));
2608 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_HORN_STOP, "Horn Stop", FadeColors.LIGHT_GREY));
2609 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
2610
2611 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "Fuel", FadeColors.RED));
2612 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_FUEL_FULL, "Full", FadeColors.LIGHT_GREY));
2613 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_FUEL_EMPTY, "Empty", FadeColors.LIGHT_GREY));
2614 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_FUEL_INCREASE, "10% increase", FadeColors.LIGHT_GREY));
2615 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.VEHICLE_FUEL_DECREASE, "10% decrease", FadeColors.LIGHT_GREY));
2616 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
2617
2618 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "Cooler", FadeColors.RED));
2619 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.CAR_COOLANT_FULL, "Full", FadeColors.LIGHT_GREY));
2620 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.CAR_COOLANT_EMPTY, "Empty", FadeColors.LIGHT_GREY));
2621 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.CAR_COOLANT_INCREASE, "10% increase", FadeColors.LIGHT_GREY));
2622 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.CAR_COOLANT_DECREASE, "10% decrease", FadeColors.LIGHT_GREY));
2623 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
2624
2625 typename e = ECarDebugMode;
2626
2627 int i;
2628
2629 int cnt = e.GetVariableCount();
2630 int val;
2631
2632 for (i = 0; i < cnt; i++)
2633 {
2634 if (!e.GetVariableValue(null, i, val))
2635 continue;
2636
2637 val = val + EActions.PLAYER_BOT_INTERNAL_START;
2638
2639 string name = e.GetVariableName(i);
2640
2641 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, val, name, FadeColors.LIGHT_GREY));
2642 }
2643
2644 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
2645
2646 super.GetDebugActions(outputList);
2647 }
2648
2649 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
2650 {
2651 if (super.OnAction(action_id, player, ctx))
2652 return true;
2653
2654 if (!GetGame().IsServer())
2655 {
2656 return false;
2657 }
2658
2659 switch (action_id)
2660 {
2661 case EActions.VEHICLE_HORN_START_SHORT:
2662 SetCarHornState(ECarHornState.SHORT);
2663 return true;
2664 case EActions.VEHICLE_HORN_START_LONG:
2665 SetCarHornState(ECarHornState.LONG);
2666 return true;
2667 case EActions.VEHICLE_HORN_STOP:
2668 SetCarHornState(ECarHornState.OFF);
2669 return true;
2670
2671 case EActions.VEHICLE_FUEL_FULL:
2673 return true;
2674 case EActions.VEHICLE_FUEL_EMPTY:
2675 LeakAll(CarFluid.FUEL);
2676 return true;
2677 case EActions.VEHICLE_FUEL_INCREASE:
2678 Fill(CarFluid.FUEL, GetFluidCapacity(CarFluid.FUEL) * 0.1);
2679 return true;
2680 case EActions.VEHICLE_FUEL_DECREASE:
2681 Leak(CarFluid.FUEL, GetFluidCapacity(CarFluid.FUEL) * 0.1);
2682 return true;
2683
2684 case EActions.CAR_COOLANT_FULL:
2685 Fill(CarFluid.COOLANT, GetFluidCapacity(CarFluid.COOLANT));
2686 return true;
2687 case EActions.CAR_COOLANT_EMPTY:
2688 LeakAll(CarFluid.COOLANT);
2689 return true;
2690 case EActions.CAR_COOLANT_INCREASE:
2691 Fill(CarFluid.COOLANT, GetFluidCapacity(CarFluid.COOLANT) * 0.1);
2692 return true;
2693 case EActions.CAR_COOLANT_DECREASE:
2694 Leak(CarFluid.COOLANT, GetFluidCapacity(CarFluid.COOLANT) * 0.1);
2695 return true;
2696 }
2697
2698 typename e = ECarDebugMode;
2699
2700 int i;
2701
2702 int cnt = e.GetVariableCount();
2703 int val;
2704
2705 for (i = 0; i < cnt; i++)
2706 {
2707 if (!e.GetVariableValue(null, i, val))
2708 continue;
2709
2710 if ((val + EActions.PLAYER_BOT_INTERNAL_START) == action_id)
2711 {
2712 m_eDebugMode = val;
2713 dBodyActive(this, ActiveState.ACTIVE);
2714 }
2715 }
2716
2717 return false;
2718 }
2719
2720 override void FixEntity()
2721 {
2722 if (GetGame().IsServer())
2723 {
2724 FillUpCarFluids();
2725 //server and single
2726
2727 for (int i = 5; i > 0; i--)//there is a problem with wheels when performed only once, this solves it
2728 super.FixEntity();
2729 if (!GetGame().IsMultiplayer())
2730 {
2731 //single
2733 }
2734 }
2735 else
2736 {
2737 //MP client
2739 }
2740 }
2741 #endif
2742
2743 #ifdef DEVELOPER
2744 override protected string GetDebugText()
2745 {
2746 string debug_output = super.GetDebugText();
2747 if (GetGame().IsServer())
2748 {
2749 debug_output += m_DebugContactDamageMessage + "\n";
2750 }
2751 debug_output += "Entity momentum: " + GetMomentum();
2752 int capacity = GetFluidCapacity(CarFluid.FUEL);
2753 debug_output += string.Format("\nFuel:%1/%2", capacity * GetFluidFraction(CarFluid.FUEL), capacity);
2754 debug_output += "\nIsEngineON: " + EngineIsOn();
2755
2756 return debug_output;
2757 }
2758 #endif
2759
2761
2764
2767 protected int m_CarHornState;
2769 protected ref NoiseParams m_NoisePar;
2771
2772 protected float m_BatteryEnergyStartMin = 5.0;
2773 protected bool m_HeadlightsOn;
2774 protected bool m_BrakesArePressed; // not yet actually removed, but functionality will be moved to native to prevent requiring updating of lights every game tick
2775
2780
2783
2784 protected int m_enginePtcFx;
2785 protected int m_coolantPtcFx;
2786 protected int m_exhaustPtcFx;
2787
2791
2796 [Obsolete("1.30: no replacement")]
2797 bool OnBeforeSwitchLights(bool toOn)
2798 {
2799 return true;
2800 }
2801
2802 [Obsolete("1.30: no replacement")]
2804
2805 [Obsolete("1.30: no replacement")]
2807
2808 [Obsolete("1.30: no replacement")]
2810
2811 [Obsolete("1.30: use Transport.NeedElectricitySourceDevice")]
2813 {
2814 return true;
2815 }
2816
2817 [Obsolete("1.30: use Transport.NeedElectricitySourceDevice")]
2819 {
2820 return true;
2821 }
2822
2823 [Obsolete("1.30: use Transport.LightIsOn")]
2825 {
2826 return LightIsOn();
2827 }
2828
2829 [Obsolete("1.30: use VehicleLightsComponent instead")]
2830 protected void BrakesRearLight()
2831 {
2832 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.BRAKE, VehicleLightMode.SEGREGATED);
2833 }
2834
2835 [Obsolete("1.30: use VehicleLightsComponent instead")]
2836 protected void ReverseRearLight()
2837 {
2838 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.REVERSE, VehicleLightMode.SEGREGATED);
2839 }
2840
2841 [Obsolete("1.30: use VehicleLightsComponent instead")]
2843 {
2844 m_LightsComponent.SetLightTypeAndMode("Rear", VehicleLightType.REVERSE_BRAKE, VehicleLightMode.AGGREGATED);
2845 }
2846
2847 [Obsolete("1.30: use VehicleLightsComponent instead")]
2848 protected void NoRearLight()
2849 {
2850 m_LightsComponent.DisableLight("Rear");
2851 }
2852
2853 [Obsolete("1.30: use VehicleLightsComponent instead")]
2854 protected void LeftFrontLightShineOn()
2855 {
2856 m_LightsComponent.SetSelectionMaterial("FrontLeftOn");
2857 }
2858
2859 [Obsolete("1.30: use VehicleLightsComponent instead")]
2860 protected void RightFrontLightShineOn()
2861 {
2862 m_LightsComponent.SetSelectionMaterial("FrontRightOn");
2863 }
2864
2865 [Obsolete("1.30: use VehicleLightsComponent instead")]
2866 protected void LeftFrontLightShineOff()
2867 {
2868 m_LightsComponent.SetSelectionMaterial("FrontLeftOff");
2869 }
2870
2871 [Obsolete("1.30: use VehicleLightsComponent instead")]
2873 {
2874 m_LightsComponent.SetSelectionMaterial("FrontRightOff");
2875 }
2876
2877 [Obsolete("1.30: use VehicleLightsComponent instead")]
2878 protected void ReverseLightsShineOn()
2879 {
2880 m_LightsComponent.SetSelectionMaterial("ReverseOn");
2881 }
2882
2883 [Obsolete("1.30: use VehicleLightsComponent instead")]
2884 protected void ReverseLightsShineOff()
2885 {
2886 m_LightsComponent.SetSelectionMaterial("ReverseOff");
2887 }
2888
2889 [Obsolete("1.30: VehicleLightsComponent instead")]
2890 protected void BrakeLightsShineOn()
2891 {
2892 m_LightsComponent.SetSelectionMaterial("BrakesOn");
2893 }
2894
2895 [Obsolete("1.30: use VehicleLightsComponent instead")]
2896 protected void BrakeLightsShineOff()
2897 {
2898 m_LightsComponent.SetSelectionMaterial("BrakesOff");
2899 }
2900
2901 [Obsolete("1.30: use VehicleLightsComponent instead")]
2902 protected void TailLightsShineOn()
2903 {
2904 if (m_HeadlightsState == CarHeadlightBulbsState.LEFT)
2905 {
2906 m_LightsComponent.SetSelectionMaterial("TailLeftOnly");
2907 }
2908 else if (m_HeadlightsState == CarHeadlightBulbsState.RIGHT)
2909 {
2910 m_LightsComponent.SetSelectionMaterial("TailRighttOnly");
2911 }
2912 else if (m_HeadlightsState == CarHeadlightBulbsState.BOTH)
2913 {
2914 m_LightsComponent.SetSelectionMaterial("TailOn");
2915 }
2916 }
2917
2918 [Obsolete("1.30: use VehicleLightsComponent instead")]
2919 protected void TailLightsShineOff()
2920 {
2921 m_LightsComponent.SetSelectionMaterial("TailOff");;
2922 }
2923
2924 [Obsolete("1.30: use VehicleLightsComponent instead")]
2925 protected void DashboardShineOn()
2926 {
2927 m_LightsComponent.SetSelectionMaterial("DashboardOn");
2928 }
2929
2930 [Obsolete("1.30: use VehicleLightsComponent instead")]
2931 protected void DashboardShineOff()
2932 {
2933 m_LightsComponent.SetSelectionMaterial("DashboardOff");
2934 }
2935
2936 // Override this for a car-specific light type
2937 [Obsolete("1.30: use VehicleLightsComponent instead")]
2939 {
2940 return CarRearLightBase.Cast(ScriptedLightBase.CreateLight(OffroadHatchbackFrontLight));
2941 }
2942
2943 // Override this for a car-specific light type
2944 [Obsolete("1.30: use VehicleLightsComponent instead")]
2946 {
2947 return CarLightBase.Cast(ScriptedLightBase.CreateLight(OffroadHatchbackFrontLight));
2948 }
2949
2950
2951 [Obsolete("1.30: use Transport::CheckVitalItemCallback instead")]
2952 protected void CheckVitalItem(bool isVital, int slotId)
2953 {
2954 GameInventory inventory = GetInventory();
2955 if ( !isVital || !inventory )
2956 return;
2957
2958 EntityAI item = inventory.FindAttachment(slotId);
2959
2960 if (!item || item.IsRuined())
2961 {
2962 EngineStop();
2963 }
2964 }
2965
2966 [Obsolete("1.30: use Transport::CheckVitalItemCallback instead")]
2967 protected void CheckVitalItem(bool isVital, string slot_name)
2968 {
2969 if ( !isVital )
2970 return;
2971
2972 int slotId = InventorySlots.GetSlotIdFromString(slot_name);
2973 CheckVitalItem(isVital, slotId);
2974 }
2975
2976 [Obsolete("1.30: use Transport::PartsHealthCheck instead")]
2977 protected void CarPartsHealthCheck()
2978 {
2980 }
2981}
Param4< int, int, string, int > TSelectableActionInfoWithColor
bool IsDamageDestroyed(ActionTarget target)
Определения ActionBase.c:1275
void ActionBase()
Определения ActionBase.c:82
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
ActionPushCarCB ActionPushObjectCB ActionPushCar()
Определения ActionPushCar.c:58
VehicleHornActionData ActionData ActionVehicleHornShort()
Определения ActionVehicleHorn.c:62
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void InitializeActions()
Определения AdvancedCommunication.c:190
vector GetOrientation()
Определения AreaDamageManager.c:306
@ OK
0 - No error. Can be returned from any call.
Определения BIOSErrorModule.c:9
enum EBoatEffects STOP_OK
enum EBoatEffects NO_FUEL
enum EBoatEffects NO_IGNITER
enum EBoatEffects START_NO_FUEL
enum EBoatEffects START_OK
CarAutomaticGearboxMode
Enumerated automatic gearbox modes. (native, do not change or extend)
Определения Car.c:58
CarFluid
Type of vehicle's fluid. (native, do not change or extend)
Определения Car.c:18
CarSoundCtrl
Car's sound controller list. (native, do not change or extend)
Определения Car.c:4
CarGearboxType
Enumerated gearbox types. (native, do not change or extend)
Определения Car.c:24
enum CarDoorState START_NO_BATTERY
CarDoorState
Определения CarScript.c:2
@ DOORS_CLOSED
Определения CarScript.c:5
@ DOORS_MISSING
Определения CarScript.c:3
@ DOORS_OPEN
Определения CarScript.c:4
enum CarDoorState LONG
enum CarDoorState NO_BATTERY
enum CarDoorState SHORT
enum CarDoorState STARTING
enum CarDoorState REVERSE_ONLY
enum CarDoorState BRAKES_ONLY
enum CarDoorState START_NO_SPARKPLUG
class EconomyOutputStrings OFF
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
Battery9V GetBattery()
Определения CodeLock.c:874
void Synchronize()
Определения CombinationLock.c:205
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения DayZAnimal.c:136
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения DayZAnimal.c:125
DayZGame g_Game
Определения DayZGame.c:4074
vector position
Определения DustKickupEffects.c:20
EActions
Определения EActions.c:2
EVehicleVFXEffect
Identifiers of individual vehicle VFX effects.
Определения EVehicleVFXTypes.c:3
bool IsOwner()
Определения Hand_Events.c:60
@ RUINED
Определения InjuryHandler.c:24
string Type
Определения JsonDataContaminatedArea.c:11
static string GetDisplayName(int liquid_type)
Определения Liquid.c:383
string GetDebugText()
Определения ModifierBase.c:71
proto native float GetHandbrake()
Returns the current front brake value in range <0, 1>.
proto native void ShiftTo(int gear)
Shifts the future gear to selected gear, triggering gearbox simulation.
proto native vector GetEnginePos()
Get actual position of engine (model space)
proto native void SetThrottle(float value)
Sets the future throttle value.
proto native float EngineGetRPMRedline()
Returns engine's maximal working rpm without damaging the engine.
proto native void Leak(MotorbikeFluid fluid, float amount)
Removes from the specified fluid the specified amount.
proto native vector WheelGetPositionLS(int wheelIdx)
proto native void SetHandbrake(float value)
Sets the future front brake value.
proto native CarGearboxType GearboxGetType()
Returns gearbox type. See CarGearboxType enum for more info.
proto native EntityAI WheelGetEntity(int wheelIdx)
proto native int GetNeutralGear()
Returns the index of the neutral gear.
proto native int WheelCount()
How many wheel can be attached to a motorbike (hubs only)
proto native void EngineStop()
Stops the engine.
proto native CarAutomaticGearboxMode GearboxGetMode()
Returns gearbox mode. This is useful when motorbike has automatic gearbox.
proto native bool WheelHasContact(int wheelIdx)
proto native void SetBrake(float value)
Sets the future rear brake value.
proto native void Fill(MotorbikeFluid fluid, float amount)
Adds to the specified fluid the specified amount.
proto native bool EngineIsOn()
Returns true when engine is running, false otherwise.
proto native float EngineGetRPMIdle()
Returns engine's idle rpm before engine stalls.
proto native void ShiftDown()
Shifts the future gear down, triggering gearbox simulation.
proto native void ShiftUp()
Shifts the future gear up, triggering gearbox simulation.
proto native vector WheelGetDirection(int wheelIdx)
proto native void EngineStart()
Starts the engine.
proto native float EngineGetRPM()
Returns engine's rpm value.
float GetSpeedometer()
Returns the current speed of the vehicle in km/h.
Определения Motorbike.c:45
proto native float EngineGetRPMMin()
Returns engine's min operating rpm.
proto native void SetSteering(float value)
Sets the future steering value.
proto native float GetFluidFraction(MotorbikeFluid fluid)
proto native int GetGear()
Returns the index of the future gear, -1 if there is no engine.
proto native void LeakAll(MotorbikeFluid fluid)
Removes all the specified fluid from vehicle.
proto native vector WheelGetContactPosition(int wheelIdx)
proto native float GetFluidCapacity(MotorbikeFluid fluid)
float GetSpeedometerAbsolute()
Returns the current speed of the vehicle in km/h. Value is absolute.
Определения Motorbike.c:55
proto native SurfaceInfo WheelGetSurface(int wheelIdx)
proto native float GetBrake()
Returns the current rear brake value in range <0, 1>.
proto native float EngineGetRPMMax()
Returns engine's max rpm before engine blows up.
bool DetectFlippedUsingWheels(VehicleFlippedContext ctx, bool disallowSide)
Определения Motorbike.c:75
proto native float WheelGetAngularVelocity(int wheelIdx)
override void UpdateLights(int new_gear=-1)
Определения MotorbikeScript.c:1080
void OnBrakesPressed()
Определения MotorbikeScript.c:827
void PartsHealthCheck()
Определения MotorbikeScript.c:1243
void InitializeParticles()
Определения MotorbikeScript.c:174
void UpdateLightsServer(int newGear=-1)
Определения MotorbikeScript.c:1168
void DamageCrew(float dmg)
Responsible for damaging crew in a car crash.
Определения MotorbikeScript.c:1360
void HandleEngineSound(MotorbikeEngineSoundState state)
Определения MotorbikeScript.c:1461
void CheckContactCache()
Определения MotorbikeScript.c:1252
ref VehicleVFXComponent m_VFXComponent
Определения MotorbikeScript.c:76
void UpdateLightsClient(int newGear=-1)
Определения MotorbikeScript.c:1088
@ STOP_NO_FUEL
Определения MotorbikeScript.c:50
int CheckOperationalRequirements()
Определения MotorbikeScript.c:1567
bool IsServerOrOwner()
Определения MotorbikeScript.c:1622
bool HasRadiator()
Определения MotorbikeScript.c:326
EffectSound CreateSoundForAnimationSource(string animSource)
Определения MotorbikeScript.c:277
void OnBrakesReleased()
Определения MotorbikeScript.c:832
EntityAI GetRadiator()
Определения MotorbikeScript.c:336
void UpdateHeadlightState()
Определения MotorbikeScript.c:1049
class NoiseSystem NoiseParams()
Определения Noise.c:18
ProcessDirectDamageFlags
Определения Object.c:2
BOTH
Определения PluginRecipesManagerBase.c:2
WaveKind
Определения Sound.c:2
map VehicleContactCache
bool m_Initialized
Определения UiHintPanel.c:317
void VehicleHornComponent(notnull EntityAI parent)
Определения VehicleHornComponent.c:24
void VehicleLightData(VehicleLightProfileBase profile)
Определения VehicleLightsComponent.c:21
void VehicleVFXDataParams(vector position=vector.Zero, vector orientation=vector.Up, float cooldownSec=0.0)
Определения VehicleVFXComponent.c:88
bool CanManipulateSpareWheel(string slotSelectionName)
override bool HasGangedTailAndBrakeLights()
override float GetWeightCoef()
PlayerBase m_Player
Определения ActionBase.c:40
const int SHOCK_FACTOR
Определения ActionGetOutTransport.c:27
const int LOW_SPEED_VALUE
Определения ActionGetOutTransport.c:30
const int HEALTH_HIGH_SPEED_VALUE
Определения ActionGetOutTransport.c:39
const int HIGH_SPEED_VALUE
Определения ActionGetOutTransport.c:31
const int HEALTH_LOW_SPEED_VALUE
Определения ActionGetOutTransport.c:38
const int DMG_FACTOR
Определения ActionGetOutTransport.c:26
int m_CarHornState
VehicleHornComponent.
Определения CarScript.c:2767
float m_DrownTime
Определения CarScript.c:118
float GetEnviroHeatComfortOverride()
override void EOnPostFrame(IEntity other, int extra)
Определения CarScript.c:675
string m_EngineStartOK
Sounds.
Определения CarScript.c:148
override float GetFluidFractionScript(ETransportFluid fluidType)
Определения CarScript.c:425
override void OnGearChanged(int newGear, int oldGear)
Определения CarScript.c:1798
vector m_side_2_2Pos
Определения CarScript.c:145
override event void ObtainState(PawnOwnerState pState)
Определения CarScript.c:2578
vector GetEnginePosWS()
Определения CarScript.c:304
ref EffVehicleSmoke m_engineFx
Определения CarScript.c:2778
float m_FuelAmmount
keeps ammount of each fluid
Определения CarScript.c:108
EffectSound CreateSoundForAnimationSource(string animSource)
Определения CarScript.c:1458
void RemoveAction(typename actionName)
Определения CarScript.c:2356
int m_CarEngineLastSoundState
Определения CarScript.c:185
override vector GetDefaultHitPosition()
Определения CarScript.c:2490
void CarScript()
Определения CarScript.c:201
string GetActionCompNameOil()
Определения CarScript.c:2270
void BrakeAndReverseRearLight()
Определения CarScript.c:2842
override void MarkCrewMemberUnconscious(int crewMemberIndex)
Определения CarScript.c:1658
override VehicleHornComponent GetVehicleHornComponent()
Определения CarScript.c:299
int m_CarEngineSoundState
Определения CarScript.c:184
static string m_LeftHeadlightPoint
Определения CarScript.c:166
bool IsVitalRadiator()
Определения CarScript.c:2206
void OnIgnition()
Определения CarScript.c:1721
float GetBatteryRechargeRate()
Определения CarScript.c:2432
void BrakeLightsShineOn()
Определения CarScript.c:2890
void CleanupSound(EffectSound sound)
Определения CarScript.c:415
ItemBase GetBattery()
Определения CarScript.c:2437
vector m_exhaustPtcDir
Particles.
Определения CarScript.c:137
float GetActionDistanceOil()
Определения CarScript.c:2275
void LeftFrontLightShineOn()
Определения CarScript.c:2854
float m_BatteryRecharge
Определения CarScript.c:132
vector m_coolantPtcPos
Определения CarScript.c:2790
override void MarkCrewMemberDead(int crewMemberIndex)
Определения CarScript.c:1669
static string m_ReverseLightPoint
Определения CarScript.c:165
void UpdateLightsServer(int newGear=-1)
Определения CarScript.c:1974
void TailLightsShineOn()
Определения CarScript.c:2902
vector GetEnginePointPosWS()
Определения CarScript.c:314
void LeftFrontLightShineOff()
Определения CarScript.c:2866
static const int SELECTION_ID_TAIL_LIGHT_L
Определения CarScript.c:180
bool IsVitalTruckBattery()
Определения CarScript.c:2818
static float DROWN_ENGINE_THRESHOLD
Определения CarScript.c:102
EntityAI GetRadiator()
Определения CarScript.c:2216
void SetEngineStarted(bool started)
Определения CarScript.c:2238
void RightFrontLightShineOff()
Определения CarScript.c:2872
static const int SELECTION_ID_BRAKE_LIGHT_R
Определения CarScript.c:177
void InitializeParticles()
Определения CarScript.c:343
override event GetMoveType()
Определения CarScript.c:2573
void CheckVitalItem(bool isVital, string slot_name)
Определения CarScript.c:2967
override void EEItemAttached(EntityAI item, string slot_name)
Определения CarScript.c:482
void HandleCarHornSound(ECarHornState pState)
Определения CarScript.c:1548
bool m_ActionsInitialize
Определения CarScript.c:98
float m_BrakeAmmount
Определения CarScript.c:111
static ref map< typename, ref TInputActionMap > m_CarTypeActionsMap
Определения CarScript.c:96
override void OnFluidChanged(CarFluid fluid, float newValue, float oldValue)
Определения CarScript.c:1686
float m_BatteryConsume
Определения CarScript.c:130
void ReverseLightsShineOn()
Определения CarScript.c:2878
float m_EnviroHeatComfortOverride
Определения CarScript.c:115
bool CheckOperationalState()
Определения CarScript.c:1793
vector m_side_1_1Pos
Определения CarScript.c:142
void UpdateHeadlightState()
Определения CarScript.c:522
float m_BatteryEnergyStartMin
VehicleHornComponent.
Определения CarScript.c:2772
void UpdateBattery(ItemBase battery)
Определения CarScript.c:2442
override void FillScript(ETransportFluid fluidType, float amount)
Определения CarScript.c:430
static const int SELECTION_ID_BRAKE_LIGHT_L
Определения CarScript.c:176
override float GetLiquidThroughputCoef()
Определения CarScript.c:385
void ForceUpdateLightsEnd()
void HandleEngineSound(CarEngineSoundState state)
Определения CarScript.c:1560
static string m_LeftHeadlightTargetPoint
Определения CarScript.c:168
ref VehicleVFXComponent m_VFXComponent
Определения CarScript.c:189
vector m_side_1_2Pos
Определения CarScript.c:143
void LeakFluid(CarFluid fluid)
Определения CarScript.c:2098
ref EffectSound m_CarHornSoundEffect
VehicleHornComponent.
Определения CarScript.c:2768
void OnBrakesPressed()
Определения CarScript.c:930
bool m_HeadlightsOn
Определения CarScript.c:2773
vector m_enginePos
Определения CarScript.c:139
void OnBrakesReleased()
Определения CarScript.c:935
float m_PlugHealth
Определения CarScript.c:126
bool IsScriptedLightsOn()
Определения CarScript.c:2824
override int Get3rdPersonCameraType()
camera type
Определения CarScript.c:2232
static const string MEMORY_POINT_NAME_CAR_HORN
Определения CarScript.c:105
static const int SELECTION_ID_REVERSE_LIGHT_R
Определения CarScript.c:179
static string m_DrownEnginePoint
Определения CarScript.c:170
override event void RewindState(PawnOwnerState pState, PawnMove pMove, inout NetworkRewindType pRewindType)
Определения CarScript.c:2584
vector Get_1_1PointPosWS()
Определения CarScript.c:326
override void OnEngineStop()
Gets called everytime the engine stops.
Определения CarScript.c:1822
static string m_RightHeadlightTargetPoint
Определения CarScript.c:169
override void OnEngineStart()
Gets called everytime the engine starts.
Определения CarScript.c:1805
void TailLightsShineOff()
Определения CarScript.c:2919
override float OnSound(CarSoundCtrl ctrl, float oldValue)
Определения CarScript.c:1433
override bool OnBeforeLightOn()
Определения CarScript.c:1841
override void OnUpdate(float dt)
Определения CarScript.c:1210
ref EffVehicleSmoke m_coolantFx
old particles
Определения CarScript.c:2777
void NoRearLight()
Определения CarScript.c:2848
int CheckOperationalRequirements()
Определения CarScript.c:1752
override string GetVehicleType()
Определения CarScript.c:294
string m_EngineStartFuel
Определения CarScript.c:151
ref EffectSound m_WindowSmall
Определения CarScript.c:160
void PlayCrashHeavySound()
Определения CarScript.c:461
float m_OilAmmount
Определения CarScript.c:110
float GetBatteryConsumption()
Определения CarScript.c:2422
vector m_enginePtcPos
Определения CarScript.c:2789
string GetDoorSelectionNameFromSeatPos(int posIdx)
Определения CarScript.c:2162
vector m_side_2_1Pos
Определения CarScript.c:144
void SetActions()
Определения CarScript.c:2313
NoiseSystem m_NoiseSystem
VehicleHornComponent.
Определения CarScript.c:2770
ref NoiseParams m_NoisePar
VehicleHornComponent.
Определения CarScript.c:2769
void CreateCarDestroyedEffect()
Определения CarScript.c:473
float m_BatteryContinuousConsume
Определения CarScript.c:131
void BrakesRearLight()
Определения CarScript.c:2830
string m_CarHornShortSoundName
VehicleLightsComponent.
Определения CarScript.c:2765
CarLightBase m_Headlight
DEPRECATED.
Определения CarScript.c:2762
int GetCrewIndex(string selection)
Определения CarScript.c:2172
string m_CarDoorCloseSound
Определения CarScript.c:156
override bool CanReleaseAttachment(EntityAI attachment)
Определения CarScript.c:638
override bool OnBeforeEngineStart()
Определения CarScript.c:1713
vector m_frontPos
Определения CarScript.c:140
string m_CarHornLongSoundName
VehicleHornComponent.
Определения CarScript.c:2766
override void OnAttachmentRuined(EntityAI attachment)
Определения CarScript.c:601
string m_CarSeatShiftInSound
Определения CarScript.c:157
static const int SELECTION_ID_REVERSE_LIGHT_L
Определения CarScript.c:178
vector GetCoolantPtcPosWS()
Определения CarScript.c:309
float m_Time
Определения CarScript.c:100
vector Get_2_1PointPosWS()
Определения CarScript.c:334
float m_EngineHealth
Определения CarScript.c:122
void ReverseRearLight()
Определения CarScript.c:2836
void HandleSeatAdjustmentSound(string animSource, float phase)
Определения CarScript.c:1527
override void OnVariablesSynchronized()
Определения CarScript.c:435
CarRearLightBase m_RearLight
VehicleLightsComponent.
Определения CarScript.c:2763
ref VehicleLightsComponent m_LightsComponent
Определения CarScript.c:187
string m_EngineStartBattery
Определения CarScript.c:149
override void OnInput(float dt)
Определения CarScript.c:1041
string m_EngineStopFuel
Определения CarScript.c:153
bool IsMoving()
Определения CarScript.c:2221
override bool DetectFlipped(VehicleFlippedContext ctx)
Определения CarScript.c:1027
void PartsHealthCheck()
Определения CarScript.c:2121
void CarPartsHealthCheck()
Определения CarScript.c:2977
vector m_exhaustPtcPos
Определения CarScript.c:2788
void SetCarHornState(int pState)
Определения CarScript.c:2481
void FillUpCarFluids()
Определения CarScript.c:2561
bool HasGangedTailAndBrakeLights()
Определения CarScript.c:468
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения CarScript.c:2374
void DashboardShineOff()
Определения CarScript.c:2931
string GetActionCompNameCoolant()
Определения CarScript.c:2260
bool IsVitalCarBattery()
Определения CarScript.c:2812
override void EEItemDetached(EntityAI item, string slot_name)
Определения CarScript.c:545
CarLightBase CreateFrontLight()
Определения CarScript.c:2945
void CheckContactCache()
Responsible for damaging the car according to contact events from OnContact.
Определения CarScript.c:1279
float m_RadiatorHealth
Определения CarScript.c:123
void OnVehicleJumpOutServer(GetOutTransportActionData gotActionData)
Определения CarScript.c:951
override void OnAnimationPhaseStarted(string animSource, float phase)
Определения CarScript.c:1448
static float DROWN_ENGINE_DAMAGE
Определения CarScript.c:103
void PlayCrashLightSound()
Определения CarScript.c:454
float m_FuelTankHealth
Определения CarScript.c:124
static const int SELECTION_ID_FRONT_LIGHT_R
Определения CarScript.c:175
string m_CarDoorOpenSound
Определения CarScript.c:155
CarDoorState TranslateAnimationPhaseToCarDoorState(string animation)
Определения CarScript.c:2248
void HandleDoorsSound(string animSource, float phase)
Определения CarScript.c:1503
void ReverseLightsShineOff()
Определения CarScript.c:2884
const float BATTERY_UPDATE_DELAY
Определения CarScript.c:134
float m_CoolantAmmount
Определения CarScript.c:109
override event GetOwnerStateType()
Определения CarScript.c:2568
override int GetFluidCapacityScript(ETransportFluid fluidType)
Определения CarScript.c:420
int m_exhaustPtcFx
Определения CarScript.c:2786
vector Get_1_2PointPosWS()
Определения CarScript.c:330
override void EEKilled(Object killer)
Определения CarScript.c:1272
static const int SELECTION_ID_TAIL_LIGHT_R
Определения CarScript.c:181
float GetBatteryRuntimeConsumption()
Определения CarScript.c:2427
ref EffectSound m_WindowLarge
Определения CarScript.c:161
ref EffVehicleSmoke m_exhaustFx
Определения CarScript.c:2779
override void OnDriverExit(Human player)
Определения CarScript.c:940
static string m_RightHeadlightPoint
Определения CarScript.c:167
bool OnBeforeSwitchLights(bool toOn)
Определения CarScript.c:2797
static vector m_DrownEnginePos
Определения CarScript.c:119
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения CarScript.c:609
vector GetBackPointPosWS()
Определения CarScript.c:322
void SpawnUniversalParts()
Определения CarScript.c:2500
string m_CarSeatShiftOutSound
Определения CarScript.c:158
float GetActionDistanceBrakes()
Определения CarScript.c:2285
void AddAction(typename actionName)
Определения CarScript.c:2324
vector m_backPos
Определения CarScript.c:141
bool IsVitalEngineBelt()
Определения CarScript.c:2201
string GetDoorConditionPointFromSelection(string selection)
Определения CarScript.c:2141
string GetActionCompNameBrakes()
Определения CarScript.c:2280
ref array< int > m_WheelSmokePtcFx
Определения CarScript.c:2782
vector Get_2_2PointPosWS()
Определения CarScript.c:338
float GetPushForceCoefficientMultiplier()
Определения CarScript.c:2495
void CheckVitalItem(bool isVital, int slotId)
Определения CarScript.c:2952
void DashboardShineOn()
Определения CarScript.c:2925
override bool CanReachSeatFromDoors(string pSeatSelection, vector pFromPos, float pDistance=1.0)
Определения CarScript.c:2177
CarRearLightBase CreateRearLight()
Определения CarScript.c:2938
string GetDoorInvSlotNameFromSeatPos(int posIdx)
Определения CarScript.c:2167
void SpawnAdditionalItems()
Определения CarScript.c:2530
ref EffectSound m_PreStartSound
Определения CarScript.c:162
void RightFrontLightShineOn()
Определения CarScript.c:2860
float m_BatteryHealth
Определения CarScript.c:125
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения CarScript.c:2302
bool CanManipulateSpareWheel(string slotSelectionName)
Определения CarScript.c:670
void SetCarEngineSoundState(CarEngineSoundState pState)
Определения CarScript.c:1554
vector GetFrontPointPosWS()
Определения CarScript.c:318
static const int SELECTION_ID_DASHBOARD_LIGHT
Определения CarScript.c:182
bool HasRadiator()
Определения CarScript.c:2211
void DamageCrew(float dmg)
Responsible for damaging crew in a car crash.
Определения CarScript.c:1374
void ForceUpdateLightsStart()
override void CleanupEffects()
Определения CarScript.c:390
override void EEOnCECreate()
Определения CarScript.c:2412
override void UpdateLights(int new_gear=-1)
Определения CarScript.c:1853
string m_EngineStartPlug
Определения CarScript.c:150
int m_coolantPtcFx
Определения CarScript.c:2785
override bool IsInventoryVisible()
Определения CarScript.c:2369
void BrakeLightsShineOff()
Определения CarScript.c:2896
override void EOnPostSimulate(IEntity other, float timeSlice)
Определения CarScript.c:807
string m_EngineStop
Определения CarScript.c:152
ref array< ref EffWheelSmoke > m_WheelSmokeFx
Определения CarScript.c:2781
ref VehicleHornComponent m_HornComponent
Определения CarScript.c:188
bool IsHandbrakeActive()
Определения CarScript.c:2226
TInputActionMap m_InputActionMap
Определения CarScript.c:97
bool m_BrakesArePressed
Определения CarScript.c:2774
bool IsServerOrOwner()
Определения CarScript.c:2592
void InitializeActions()
Определения CarScript.c:2290
void UpdateLightsClient(int newGear=-1)
Определения CarScript.c:1861
int m_enginePtcFx
Определения CarScript.c:2784
EntityAI m_Radiator
Определения CarScript.c:128
int GetCarDoorsState(string slotType)
Определения CarScript.c:2243
float m_BatteryTimer
Определения CarScript.c:133
static const int SELECTION_ID_FRONT_LIGHT_L
Определения CarScript.c:174
float GetActionDistanceCoolant()
Определения CarScript.c:2265
Определения CarScript.c:95
Определения CarRearLightBase.c:2
Определения Car.c:83
Определения Car.c:79
override string GetDoorConditionPointFromSelection(string selection)
Определения Van_01.c:269
override bool NeedElectricitySourceDevice()
Определения Truck_02.c:38
override bool IsVitalGlowPlug()
Определения Truck_02.c:231
override EntityAI GetElectricitySourceDevice()
Определения Truck_02.c:43
override string GetElectricitySourceDeviceType()
Определения Truck_02.c:50
override bool IsVitalRadiator()
Определения Truck_02.c:241
override bool IsVitalSparkPlug()
Определения Truck_02.c:226
Определения Truck_02.c:2
Определения CarScript.c:73
float m_fTime
Определения CarScript.c:59
override event void Write(PawnStateWriter ctx)
Определения CarScript.c:61
override event void Read(PawnStateReader ctx)
Определения CarScript.c:66
Определения CarScript.c:58
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения DallasMask.c:2
static const int DAYZCAMERA_3RD_VEHICLE
generic vehicle 3rd person
Определения DayZPlayerCameras.c:19
static void LogError(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message as error message.
Определения 3_Game/DayZ/tools/Debug.c:318
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/DayZ/tools/Debug.c:183
static void ActionLog(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Определения 3_Game/DayZ/tools/Debug.c:188
Определения 3_Game/DayZ/tools/Debug.c:2
static proto DebugTextWorldSpace CreateInWorld(string text, DebugTextFlags flags, vector transform[4], float size=20.0, int color=0xFFFFFFFF, int bgColor=0x00000000, int priority=1000)
Определения CoolantSteam.c:2
Определения EngineSmoke.c:2
Определения ExhaustSmoke.c:2
const float WHEEL_DUST_THRESHOLD
Определения VehicleDust.c:3
Определения VehicleDust.c:2
Определения VehicleSmoke.c:2
const float SPEED_THRESHOLD
Определения EffWheelContact.c:3
Определения EffWheelContact.c:2
const float WHEEL_SMOKE_THRESHOLD
Определения WheelSmoke.c:3
Определения WheelSmoke.c:2
void SetSoundSet(string snd)
Set soundset for the sound.
Определения EffectSound.c:798
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:607
void SetSoundWaveKind(WaveKind wave_kind)
Set WaveKind for the sound.
Определения EffectSound.c:788
void SetSoundFadeOut(float fade_out)
Set the sound fade out duration.
Определения EffectSound.c:908
override void SetParent(Object parent_obj, int pivot)
Set parent for the sound to follow.
Определения EffectSound.c:658
bool SoundPlay()
Plays sound.
Определения EffectSound.c:199
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
EntityAI CreateInInventory(string type)
creates entity somewhere in inventory
proto native EntityAI FindAttachment(int slot)
Returns attached entity in slot (you can use InventorySlots.GetSlotIdFromString(name) to get slot id)
script counterpart to engine's class Inventory
Определения GreatHelm.c:2
proto native bool IsControllingVehicle()
Определения human.c:1360
Определения EnEntity.c:165
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:30
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
static proto bool GetSelectionForSlotId(int slot_Id, out string selection)
provides access to slot configuration
Определения InventorySlots.c:6
static bool IsActionLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:749
Определения EnMath.c:7
Определения Noise.c:2
Определения ObjectTyped.c:2
static const int HATCHBACK_COOLANT_OVERHEATED
Определения ParticleList.c:296
static const int HATCHBACK_COOLANT_OVERHEATING
Определения ParticleList.c:295
static const int HATCHBACK_EXHAUST_SMOKE
Определения ParticleList.c:299
Определения ParticleList.c:12
Определения PlayerBaseClient.c:2
static int EffectRegister(Effect effect)
Registers Effect in SEffectManager.
Определения EffectManager.c:331
static void DestroyEffect(Effect effect)
Unregisters, stops and frees the Effect.
Определения EffectManager.c:280
Manager class for managing Effect (EffectParticle, EffectSound)
Определения EffectManager.c:6
Определения Transport.c:1145
const int OFF
Определения VehicleHornComponent.c:3
const int COUNT
Определения VehicleHornComponent.c:7
Base class for vehicle light profiles - all changeble parameters goes here.
Определения VehicleLightProfileBase.c:3
const int REVERSE
Определения VehicleLightsComponent.c:31
const int REVERSE_BRAKE
Определения VehicleLightsComponent.c:32
const int BRAKE
Определения VehicleLightsComponent.c:30
void StopEffect(EVehicleVFXEffect effectId)
Определения VehicleVFXComponent.c:282
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения Transport.c:70
proto native float Length()
Returns length of vector (magnitude)
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:305
static const vector Zero
Определения EnConvert.c:123
static vector Direction(vector p1, vector p2)
Returns direction vector from point p1 to point p2.
Определения EnConvert.c:254
proto vector InvMultiply3(vector mat[3])
Invert-transforms vector.
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
static const vector Up
Определения EnConvert.c:120
Определения EnConvert.c:119
Keffiyeh_LightBlue SetActions
Определения consumables.c:149
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
Serializer ParamsReadContext
Определения gameplay.c:15
DayZGame GetGame()
Определения gameplay.c:636
const float CARS_CONTACT_DMG_THRESHOLD
Определения 3_Game/DayZ/constants.c:888
const float CARS_CONTACT_DMG_MIN
Определения 3_Game/DayZ/constants.c:889
const float CARS_CONTACT_DMG_KILLCREW
Определения 3_Game/DayZ/constants.c:890
const int CARS_FLUIDS_TICK
Определения 3_Game/DayZ/constants.c:877
DebugTextFlags
Определения DebugTextFlags.c:8
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
array< vector > TVectorArray
Определения EnScript.c:738
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
const float DAMAGE_RUINED_VALUE
Определения 3_Game/DayZ/constants.c:925
const float DAMAGE_DAMAGED_VALUE
Определения 3_Game/DayZ/constants.c:923
const int STATE_RUINED
Определения 3_Game/DayZ/constants.c:909
const float LIQUID_THROUGHPUT_CAR_DEFAULT
Определения 3_Game/DayZ/constants.c:609
const int LIQUID_WATER
Определения 3_Game/DayZ/constants.c:578
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static float RandomFloatInclusive(float min, float max)
Returns a random float number between and min [inclusive] and max [inclusive].
Определения EnMath.c:106
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto int AbsInt(int i)
Returns absolute value.
static proto float RandomFloat(float min, float max)
Returns a random float number between and min[inclusive] and max[exclusive].
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float InverseLerp(float a, float b, float value)
Calculates the linear value that produces the interpolant value within the range [a,...
static proto float Pow(float v, float power)
Return power of v ^ power.
static proto int RandomInt(int min, int max)
Returns a random int number between and min [inclusive] and max [exclusive].
static proto float AbsFloat(float f)
Returns absolute value.
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Определения EnMath.c:54
@ LEFT
Определения EnSystem.c:312
@ RIGHT
Определения EnSystem.c:313
@ NONE
body is not in simulation, nor in collision world
Определения SimulationState.c:15
ActiveState
Определения ActiveState.c:10
proto native vector dBodyGetVelocityAt(notnull IEntity body, vector globalpos)
proto native vector GetVelocity(notnull IEntity ent)
Returns linear velocity.
proto native void dBodyActive(notnull IEntity ent, ActiveState activeState)
proto native float dBodyGetMass(notnull IEntity ent)
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:486
proto native int Length()
Returns length of string.
static proto string Format(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)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const float VEHICLE_FLIP_ANGLE_TOLERANCE
Определения 3_Game/DayZ/constants.c:868
const bool VEHICLE_FLIP_WHEELS_LIMITED
Angle of the vehicle from the normal of the surface under the vehicle.
Определения 3_Game/DayZ/constants.c:869