8enum CarHeadlightBulbsState
24enum ECarOperationalState
33enum CarEngineSoundState
53enum EVehicleDebugOutputType
57 DAMAGE_CONSIDERED = 2,
66 static ref CrashDebugData m_CrashDataPoint;
82 Print(
"Vehicle; DamageType; Damage; Zone; Momentum; Momentum Prev; Momentum Delta; Speedometer; SpeedWorld; SpeedWorld Prev; SpeedWorld Delta; Velocity; Velocity Prev; Velocity Dot; TimeStamp (ms); CrewDamageBase; ShockTemp; DMGHealth; DMGShock");
83 foreach (CrashDebugData data:dataArray)
89 static void DumpData(CrashDebugData data)
91 string output = data.m_VehicleType+
";"+data.m_DamageType+
";"+data.m_Damage+
";"+data.m_Zone+
";"+data.m_MomentumCurr+
";"+data.m_MomentumPrev+
";"+data.m_MomentumDelta+
";"+data.m_Speedometer;
92 output +=
";"+data.m_SpeedWorld+
";"+data.m_SpeedWorldPrev+
";"+data.m_SpeedWorldDelta+
";"+data.m_VelocityCur;
93 output +=
";"+data.m_VelocityPrev+
";"+data.m_VelocityDot+
";"+data.m_Time+
";"+data.m_CrewDamageBase+
";"+data.m_ShockTemp+
";"+data.m_DMGHealth+
";"+data.m_DMGShock;
101 float m_MomentumCurr;
102 float m_MomentumPrev;
103 float m_MomentumDelta;
106 float m_SpeedWorldPrev;
107 float m_SpeedWorldDelta;
112 float m_CrewDamageBase;
125 void CarContactData(
vector _localPos,
IEntity _other,
float _impulse)
127 localPos = _localPos;
139 protected override event void Write(PawnStateWriter ctx)
144 protected override event void Read(PawnStateReader ctx)
163 #ifdef DIAG_DEVELOPER
164 static EVehicleDebugOutputType DEBUG_OUTPUT_TYPE;
165 bool m_ContactCalled;
176 static float DROWN_ENGINE_THRESHOLD = 0.5;
177 static float DROWN_ENGINE_DAMAGE = 350.0;
179 static const string MEMORY_POINT_NAME_CAR_HORN =
"pos_carHorn";
189 protected float m_dmgContactCoef = 0.058;
205 protected float m_BatteryConsume = 15;
206 protected float m_BatteryContinuousConsume = 0.25;
207 protected float m_BatteryRecharge = 0.15;
208 private float m_BatteryTimer = 0;
209 private const float BATTERY_UPDATE_DELAY = 100;
234 string m_EngineStartOK =
"";
235 string m_EngineStartBattery =
"";
236 string m_EngineStartPlug =
"";
237 string m_EngineStartFuel =
"";
238 string m_EngineStop =
"";
239 string m_EngineStopFuel =
"";
241 string m_CarDoorOpenSound =
"";
242 string m_CarDoorCloseSound =
"";
243 string m_CarSeatShiftInSound =
"";
244 string m_CarSeatShiftOutSound =
"";
246 string m_CarHornShortSoundName =
"";
247 string m_CarHornLongSoundName =
"";
277 static string m_ReverseLightPoint =
"light_reverse";
278 static string m_LeftHeadlightPoint =
"light_left";
279 static string m_RightHeadlightPoint =
"light_right";
280 static string m_LeftHeadlightTargetPoint =
"light_left_dir";
281 static string m_RightHeadlightTargetPoint =
"light_right_dir";
282 static string m_DrownEnginePoint =
"drown_engine";
286 static const int SELECTION_ID_FRONT_LIGHT_L = 0;
287 static const int SELECTION_ID_FRONT_LIGHT_R = 1;
288 static const int SELECTION_ID_BRAKE_LIGHT_L = 2;
289 static const int SELECTION_ID_BRAKE_LIGHT_R = 3;
290 static const int SELECTION_ID_REVERSE_LIGHT_L = 4;
291 static const int SELECTION_ID_REVERSE_LIGHT_R = 5;
292 static const int SELECTION_ID_TAIL_LIGHT_L = 6;
293 static const int SELECTION_ID_TAIL_LIGHT_R = 7;
294 static const int SELECTION_ID_DASHBOARD_LIGHT = 8;
303 private const int DEBUG_MESSAGE_CLEAN_TIME_SECONDS = 10;
304 private float m_DebugMessageCleanTime;
305 private string m_DebugContactDamageMessage;
317 m_ContactCache =
new CarContactCache;
322 m_FuelTankHealth = 1;
323 m_RadiatorHealth = -1;
324 m_BatteryHealth = -1;
331 m_EnviroHeatComfortOverride = 0;
333 m_PlayCrashSoundLight =
false;
334 m_PlayCrashSoundHeavy =
false;
336 m_CarHornState = ECarHornState.OFF;
337 m_CarEngineSoundState = CarEngineSoundState.NONE;
339 RegisterNetSyncVariableBool(
"m_HeadlightsOn");
340 RegisterNetSyncVariableBool(
"m_BrakesArePressed");
341 RegisterNetSyncVariableBool(
"m_ForceUpdateLights");
342 RegisterNetSyncVariableBoolSignal(
"m_PlayCrashSoundLight");
343 RegisterNetSyncVariableBoolSignal(
"m_PlayCrashSoundHeavy");
344 RegisterNetSyncVariableInt(
"m_CarHornState", ECarHornState.OFF, ECarHornState.LONG);
345 RegisterNetSyncVariableInt(
"m_CarEngineSoundState", CarEngineSoundState.NONE, CarEngineSoundState.STOP_NO_FUEL);
347 if ( MemoryPointExists(
"ptcExhaust_end") )
349 m_exhaustPtcPos = GetMemoryPointPos(
"ptcExhaust_end");
350 if ( MemoryPointExists(
"ptcExhaust_start") )
352 vector exhaustStart = GetMemoryPointPos(
"ptcExhaust_start");
353 vector tempOri =
vector.Direction( exhaustStart, m_exhaustPtcPos);
355 m_exhaustPtcDir[0] = -tempOri[2];
356 m_exhaustPtcDir[1] = tempOri[1];
357 m_exhaustPtcDir[2] = tempOri[0];
359 m_exhaustPtcDir = m_exhaustPtcDir.Normalized().VectorToAngles();
364 m_exhaustPtcPos =
"0 0 0";
365 m_exhaustPtcDir =
"1 1 1";
368 if ( MemoryPointExists(
"ptcEnginePos") )
369 m_enginePtcPos = GetMemoryPointPos(
"ptcEnginePos");
371 m_enginePtcPos =
"0 0 0";
373 if ( MemoryPointExists(
"ptcCoolantPos") )
374 m_coolantPtcPos = GetMemoryPointPos(
"ptcCoolantPos");
376 m_coolantPtcPos =
"0 0 0";
378 if ( MemoryPointExists(
"drown_engine") )
379 m_DrownEnginePos = GetMemoryPointPos(
"drown_engine");
381 m_DrownEnginePos =
"0 0 0";
383 if ( MemoryPointExists(
"dmgZone_engine") )
384 m_enginePos = GetMemoryPointPos(
"dmgZone_engine");
386 m_enginePos =
"0 0 0";
388 if ( MemoryPointExists(
"dmgZone_front") )
389 m_frontPos = GetMemoryPointPos(
"dmgZone_front");
391 m_frontPos =
"0 0 0";
393 if ( MemoryPointExists(
"dmgZone_back") )
394 m_backPos = GetMemoryPointPos(
"dmgZone_back");
398 if ( MemoryPointExists(
"dmgZone_fender_1_1") )
399 m_side_1_1Pos = GetMemoryPointPos(
"dmgZone_fender_1_1");
401 m_side_1_1Pos =
"0 0 0";
403 if ( MemoryPointExists(
"dmgZone_fender_1_2") )
404 m_side_1_2Pos = GetMemoryPointPos(
"dmgZone_fender_1_2");
406 m_side_1_2Pos =
"0 0 0";
408 if ( MemoryPointExists(
"dmgZone_fender_2_1") )
409 m_side_2_1Pos = GetMemoryPointPos(
"dmgZone_fender_2_1");
411 m_side_2_1Pos =
"0 0 0";
413 if ( MemoryPointExists(
"dmgZone_fender_2_2") )
414 m_side_2_2Pos = GetMemoryPointPos(
"dmgZone_fender_2_2");
416 m_side_2_2Pos =
"0 0 0";
418 if (!
GetGame().IsDedicatedServer())
421 m_WheelSmokeFx.Resize(WheelCount());
423 m_WheelSmokePtcFx.Resize(WheelCount());
424 for (
int i = 0; i < m_WheelSmokePtcFx.Count(); i++)
426 m_WheelSmokePtcFx.Set(i, -1);
437 m_NoiseSystem =
GetGame().GetNoiseSystem();
446 #ifdef DIAG_DEVELOPER
448 override void FixEntity()
455 for (
int i = 5; i > 0; i--)
457 if (!
GetGame().IsMultiplayer())
473 return "VehicleTypeCar";
478 return ModelToWorld( m_DrownEnginePos );
483 return ModelToWorld( m_coolantPtcPos );
488 return ModelToWorld( m_enginePos );
492 return ModelToWorld( m_frontPos );
496 return ModelToWorld( m_backPos );
500 return ModelToWorld( m_side_1_1Pos );
504 return ModelToWorld( m_side_1_2Pos );
508 return ModelToWorld( m_side_2_1Pos );
512 return ModelToWorld( m_side_2_2Pos );
523 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
525 ForceUpdateLightsStart();
545 for (
int i = 0; i < m_WheelSmokeFx.Count(); i++ )
547 Effect ps = m_WheelSmokeFx.Get(i);
554 m_WheelSmokeFx.Clear();
555 m_WheelSmokePtcFx.Clear();
562 m_Headlight.Destroy();
565 m_RearLight.Destroy();
571 CleanupSound(m_CarHornSoundEffect);
600 super.GetDebugActions(outputList);
605 if (super.OnAction(action_id, player, ctx))
616 SetCarHornState(ECarHornState.SHORT);
619 SetCarHornState(ECarHornState.LONG);
622 SetCarHornState(ECarHornState.OFF);
657 super.OnVariablesSynchronized();
659 if (GetCrashHeavySound())
661 PlayCrashHeavySound();
663 else if (GetCrashLightSound())
665 PlayCrashLightSound();
668 HandleCarHornSound(m_CarHornState);
670 if (!
IsOwner() && m_CarEngineSoundState != m_CarEngineLastSoundState)
671 HandleEngineSound(m_CarEngineSoundState);
681 m_engineFx.SetParticleStateHeavy();
688 super.EEItemAttached(item, slot_name);
692 case "Reflector_1_1":
695 SetHealth(
"Reflector_1_1",
"Health", item.GetHealth());
698 case "Reflector_2_1":
701 SetHealth(
"Reflector_2_1",
"Health", item.GetHealth());
708 m_BatteryHealth = item.GetHealth01();
715 m_PlugHealth = item.GetHealth01();
721 m_RadiatorHealth = item.GetHealth01();
733 UpdateHeadlightState();
740 EntityAI bulb_L = FindAttachmentBySlotName(
"Reflector_1_1");
741 EntityAI bulb_R = FindAttachmentBySlotName(
"Reflector_2_1");
743 if (bulb_L && !bulb_L.IsRuined() && bulb_R && !bulb_R.IsRuined())
745 m_HeadlightsState = CarHeadlightBulbsState.BOTH;
747 else if (bulb_L && !bulb_L.IsRuined())
749 m_HeadlightsState = CarHeadlightBulbsState.LEFT;
751 else if (bulb_R && !bulb_R.IsRuined())
753 m_HeadlightsState = CarHeadlightBulbsState.RIGHT;
755 else if ((!bulb_L || bulb_L.IsRuined()) && (!bulb_R || bulb_R.IsRuined()))
757 m_HeadlightsState = CarHeadlightBulbsState.NONE;
767 m_BatteryHealth = -1;
768 if (IsServerOrOwner())
778 if (IsScriptedLightsOn())
789 if (
GetGame().IsServer() && EngineIsOn())
796 if (IsServerOrOwner())
803 if (m_DamageZoneMap.Contains(
"Radiator"))
805 SetHealth(
"Radiator",
"Health", 0);
816 UpdateHeadlightState();
822 super.OnAttachmentRuined(attachment);
824 UpdateHeadlightState();
830 if (!super.CanReceiveAttachment(attachment, slotId))
834 attachment.GetInventory().GetCurrentInventoryLocation(attachmentInventoryLocation);
835 if (attachmentInventoryLocation.GetParent() == null)
840 if (attachment && attachment.Type().IsInherited(
CarWheel))
842 string slotSelectionName;
845 switch (slotSelectionName)
847 case "wheel_spare_1":
848 case "wheel_spare_2":
859 if (!super.CanReleaseAttachment(attachment))
864 if (EngineIsOn() && IsMoving())
869 if (attachment && attachment.Type().IsInherited(
CarWheel))
872 attachment.GetInventory().GetCurrentInventoryLocation(attachmentInventoryLocation);
874 string slotSelectionName;
875 InventorySlots.GetSelectionForSlotId(attachmentInventoryLocation.GetSlot(), slotSelectionName);
877 switch (slotSelectionName)
879 case "wheel_spare_1":
880 case "wheel_spare_2":
900 #ifdef DIAG_DEVELOPER
901 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.CONTACT)
905 Debug.Log(
"Momentum delta: " + (GetMomentum() - m_MomentumPrevTick));
906 Debug.Log(
"--------------------------------------------------------------------");
907 m_ContactCalled =
false;
915 m_MomentumPrevTick = GetMomentum();
917 m_DebugMessageCleanTime += timeSlice;
918 if (m_DebugMessageCleanTime >= DEBUG_MESSAGE_CLEAN_TIME_SECONDS)
920 m_DebugMessageCleanTime = 0;
921 m_DebugContactDamageMessage =
"";
930 CarPartsHealthCheck();
932 bool isServerOrOwner = IsServerOrOwner();
935 if (isServerOrOwner && EngineIsOn())
937 if (IsDamageDestroyed() || GetFluidFraction(
CarFluid.FUEL) <= 0 || m_EngineHealth <= 0)
948 if (IsVitalFuelTank())
952 SetHealth(
"Engine",
"Health",
GameConstants.DAMAGE_RUINED_VALUE);
964 if ( EngineGetRPM() >= EngineGetRPMRedline() )
966 if (EngineGetRPM() > EngineGetRPMMax())
967 AddHealth(
"Engine",
"Health", -GetMaxHealth(
"Engine",
"") * 0.05 );
970 dmg = EngineGetRPM() * 0.001 *
Math.RandomFloat( 0.02, 1.0 );
971 ProcessDirectDamage(
DamageType.CUSTOM, null,
"Engine",
"EnviroDmg",
vector.Zero, dmg);
972 SetEngineZoneReceivedHit(
true);
976 SetEngineZoneReceivedHit(
false);
985 if ( GetFluidFraction(
CarFluid.COOLANT) > 0 && m_RadiatorHealth < 0.5 )
998 if ( m_EngineHealth < 0.25 )
1006 if ( GetFluidFraction(
CarFluid.COOLANT ) < 0.5 && GetFluidFraction(
CarFluid.COOLANT ) >= 0 )
1009 dmg = ( 1 - GetFluidFraction(
CarFluid.COOLANT) ) *
Math.RandomFloat( 0.02, 10.00 );
1010 AddHealth(
"Engine",
"Health", -dmg );
1011 SetEngineZoneReceivedHit(
true);
1017 if (!
GetGame().IsDedicatedServer())
1023 m_exhaustFx.SetParticleStateLight();
1036 if (GetFluidFraction(
CarFluid.COOLANT) > 0)
1037 m_coolantFx.SetParticleStateLight();
1039 m_coolantFx.SetParticleStateHeavy();
1052 if ( !
GetGame().IsDedicatedServer() )
1057 m_exhaustPtcFx = -1;
1063 m_coolantPtcFx = -1;
1071 if ( !
GetGame().IsDedicatedServer() )
1074 for (
int i = 0; i < WheelCount(); i++)
1077 int ptrEff = m_WheelSmokePtcFx.Get(i);
1078 bool haveParticle =
false;
1081 if (wheel && WheelHasContact(i))
1083 float wheelSpeed = WheelGetAngularVelocity(i) * wheel.GetRadius();
1085 vector wheelPos = WheelGetContactPosition(i);
1089 transform[2] = WheelGetDirection(i);
1090 transform[1] =
vector.Up;
1091 transform[0] = transform[2] * transform[1];
1093 wheelVel = wheelVel.InvMultiply3(transform);
1095 float bodySpeed = wheelVel[2];
1097 bool applyEffect =
false;
1098 if ((wheelSpeed > 0 && bodySpeed > 0) || (wheelSpeed < 0 && bodySpeed < 0))
1100 applyEffect =
Math.AbsFloat(wheelSpeed) >
Math.AbsFloat(bodySpeed) +
EffWheelSmoke.WHEEL_SMOKE_THRESHOLD;
1109 haveParticle =
true;
1113 wheelPos = WorldToModel(wheelPos);
1118 eff.SetSurface(surface);
1120 eff.SetCurrentLocalPosition(wheelPos);
1121 m_WheelSmokeFx.Set(i, eff);
1122 m_WheelSmokePtcFx.Set(i, ptrEff);
1126 if (!eff.IsPlaying() &&
Surface.GetWheelParticleID(surface) != 0)
1128 eff.SetSurface(surface);
1129 eff.SetCurrentLocalPosition(wheelPos);
1136 if (eff && eff.IsPlaying())
1155 super.OnDriverExit(player);
1157 if (GetGear() != GetNeutralGear())
1169 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"LEGS")));
1170 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"BACK")));
1171 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"VEST")));
1172 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"HeadGear")));
1173 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"Mask")));
1174 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"BODY")));
1175 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"FEET")));
1176 equippedClothes.Insert(
ClothingBase.Cast(player.GetItemOnSlot(
"GLOVES")));
1179 float shockTaken = (gotActionData.m_Speed * gotActionData.m_Speed) /
ActionGetOutTransport.DMG_FACTOR;
1184 if (
Class.CastTo(helmet, headGear))
1190 randNum =
Math.RandomInt(0, 100);
1194 player.GiveShock(-shockTaken);
1196 randNum =
Math.RandomIntInclusive(0,
PlayerBase.m_BleedingSourcesLow.Count() - 1);
1198 if (player.m_BleedingManagerServer)
1199 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection(
PlayerBase.m_BleedingSourcesLow[randNum]);
1204 player.GiveShock(-shockTaken);
1206 randNum =
Math.RandomInt(0,
PlayerBase.m_BleedingSourcesUp.Count() - 1);
1208 if (player.m_BleedingManagerServer)
1209 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection(
PlayerBase.m_BleedingSourcesUp[randNum]);
1213 if (!headGear && player.m_BleedingManagerServer)
1214 player.m_BleedingManagerServer.AttemptAddBleedingSourceBySelection(
"Head");
1217 player.GiveShock(-shockTaken);
1220 float dmgTaken = (gotActionData.m_Speed * gotActionData.m_Speed) /
ActionGetOutTransport.SHOCK_FACTOR;
1229 cloth.DecreaseHealth(dmgTaken,
false);
1232 vector posMS = gotActionData.m_Player.WorldToModel(gotActionData.m_Player.GetPosition());
1233 gotActionData.m_Player.DamageAllLegs(dmgTaken);
1236 healthCoef =
Math.Clamp(healthCoef, 0.0, 1.0);
1237 gotActionData.m_Player.ProcessDirectDamage(
DamageType.CUSTOM, gotActionData.m_Player,
"",
"FallDamageHealth", posMS, healthCoef);
1242 if (!DetectFlippedUsingWheels(ctx,
GameConstants.VEHICLE_FLIP_WHEELS_LIMITED))
1244 if (!DetectFlippedUsingSurface(ctx,
GameConstants.VEHICLE_FLIP_ANGLE_TOLERANCE))
1251 Human driver = CrewDriver();
1252 if (driver && !driver.IsControllingVehicle())
1255 if (driver.IsAlive())
1266 m_BatteryTimer += dt;
1267 if (m_BatteryTimer >= BATTERY_UPDATE_DELAY)
1269 UpdateBattery(battery);
1273 if (
GetGame().GetWaterDepth( GetEnginePosWS() ) > 0 )
1276 if ( m_DrownTime > DROWN_ENGINE_THRESHOLD )
1279 AddHealth(
"Engine",
"Health", -DROWN_ENGINE_DAMAGE * dt);
1280 SetEngineZoneReceivedHit(
true);
1290 float brake_coef = GetBrake();
1291 if ( brake_coef > 0 )
1293 if ( !m_BrakesArePressed )
1295 m_BrakesArePressed =
true;
1302 if ( m_BrakesArePressed )
1304 m_BrakesArePressed =
false;
1310 if ( (!
GetGame().IsDedicatedServer()) && m_ForceUpdateLights )
1313 m_ForceUpdateLights =
false;
1319 super.EEKilled(killer);
1320 m_EngineDestroyed =
true;
1328 #ifdef DIAG_DEVELOPER
1329 m_ContactCalled =
true;
1330 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.CONTACT)
1332 string output =
"Zone: " + zoneName +
" | Impulse:" + data.Impulse;
1336 if (m_ContactCache.Count() == 0)
1339 m_ContactCache.Insert(zoneName, ccd);
1340 float momentumDelta = GetMomentum() - m_MomentumPrevTick;
1341 float dot =
vector.Dot(m_VelocityPrevTick.Normalized(),
GetVelocity(
this).Normalized());
1344 momentumDelta = m_MomentumPrevTick;
1347 ccd.Insert(
new CarContactData(localPos, other, momentumDelta));
1356 int contactZonesCount = m_ContactCache.Count();
1358 if (contactZonesCount == 0)
1362 for (
int i = 0; i < contactZonesCount; ++i)
1364 string zoneName = m_ContactCache.GetKey(i);
1367 float dmg =
Math.AbsInt(data[0].impulse * m_dmgContactCoef);
1368 float crewDmgBase =
Math.AbsInt((data[0].impulse /
dBodyGetMass(
this)) * 1000 * m_dmgContactCoef);
1370 #ifdef DIAG_DEVELOPER
1371 CrashDebugData.m_CrashDataPoint =
new CrashDebugData();
1372 CrashDebugData.m_CrashDataPoint.m_VehicleType = GetDisplayName();
1373 CrashDebugData.m_CrashDataPoint.m_Damage = dmg;
1374 CrashDebugData.m_CrashDataPoint.m_Zone = zoneName;
1375 CrashDebugData.m_CrashDataPoint.m_MomentumCurr = GetMomentum();
1376 CrashDebugData.m_CrashDataPoint.m_MomentumPrev = m_MomentumPrevTick;
1377 CrashDebugData.m_CrashDataPoint.m_MomentumDelta = data[0].impulse;
1378 CrashDebugData.m_CrashDataPoint.m_SpeedWorld =
GetVelocity(
this).Length() * 3.6;
1379 CrashDebugData.m_CrashDataPoint.m_SpeedWorldPrev = m_VelocityPrevTick.Length() * 3.6;
1380 CrashDebugData.m_CrashDataPoint.m_SpeedWorldDelta = (m_VelocityPrevTick.Length() -
GetVelocity(
this).Length()) * 3.6;
1381 CrashDebugData.m_CrashDataPoint.m_VelocityCur =
GetVelocity(
this);
1382 CrashDebugData.m_CrashDataPoint.m_VelocityPrev = m_VelocityPrevTick;
1383 CrashDebugData.m_CrashDataPoint.m_VelocityDot =
vector.Dot(m_VelocityPrevTick.Normalized(),
GetVelocity(
this).Normalized());
1388 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_CONSIDERED)
1390 Debug.Log(
"--------------------------------------------------");
1391 Debug.Log(
"Vehicle:" + GetDisplayName());
1392 Debug.Log(
"DMG: " + dmg);
1393 Debug.Log(
"zoneName : "+ zoneName);
1394 Debug.Log(
"momentumCurr : "+ GetMomentum());
1395 Debug.Log(
"momentumPrev : "+ m_MomentumPrevTick);
1396 Debug.Log(
"momentumDelta : "+ data[0].impulse);
1398 Debug.Log(
"speedPrev(km/h): "+ m_VelocityPrevTick.Length() * 3.6);
1399 Debug.Log(
"speedDelta(km/h) : "+ (m_VelocityPrevTick.Length() -
GetVelocity(
this).Length()) * 3.6);
1401 Debug.Log(
"velocityPrev.): "+ m_VelocityPrevTick);
1402 Debug.Log(
"velocityDot): "+
vector.Dot(m_VelocityPrevTick.Normalized(),
GetVelocity(
this).Normalized()));
1404 Debug.Log(
"--------------------------------------------------");
1411 #ifdef DIAG_DEVELOPER
1412 CrashDebugData.m_CrashData.Insert(CrashDebugData.m_CrashDataPoint);
1413 CrashDebugData.m_CrashDataPoint.m_Speedometer = GetSpeedometer();
1418 #ifdef DIAG_DEVELOPER
1419 CrashDebugData.m_CrashDataPoint.m_DamageType =
"Small";
1420 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1421 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(),
GetGame().
GetTime() ));
1423 SynchCrashLightSound(
true);
1428 #ifdef DIAG_DEVELOPER
1429 CrashDebugData.m_CrashDataPoint.m_DamageType =
"Big";
1430 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1431 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(),
GetGame().
GetTime() ));
1433 DamageCrew(crewDmgBase);
1434 SynchCrashHeavySound(
true);
1439 m_DebugContactDamageMessage +=
string.Format(
"%1: %2\n", zoneName, dmg);
1442 ProcessDirectDamage(
DamageType.CUSTOM, null, zoneName,
"EnviroDmg",
"0 0 0", dmg, pddfFlags);
1447 if (targetEntity && targetEntity.IsTree())
1454 UpdateHeadlightState();
1457 m_ContactCache.Clear();
1464 for (
int c = 0; c < CrewSize(); ++c )
1466 Human crew = CrewMember( c );
1471 if (
Class.CastTo(player, crew ) )
1475 #ifdef DIAG_DEVELOPER
1476 CrashDebugData.m_CrashDataPoint.m_CrewDamageBase = dmg;
1477 CrashDebugData.m_CrashDataPoint.m_DMGHealth = -100;
1478 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1480 Debug.Log(
"--------------------------------------------------");
1481 Debug.Log(
"Killing the player");
1482 Debug.Log(
"Crew DMG Base: " + dmg);
1483 Debug.Log(
"--------------------------------------------------");
1487 player.SetHealth(0.0);
1492 shockTemp =
Math.Clamp(shockTemp,0,1);
1493 float shock =
Math.Lerp( 50, 150, shockTemp );
1494 float hp =
Math.Lerp( 2, 100, shockTemp );
1496 #ifdef DIAG_DEVELOPER
1497 CrashDebugData.m_CrashDataPoint.m_CrewDamageBase = dmg;
1498 CrashDebugData.m_CrashDataPoint.m_ShockTemp = shockTemp;
1499 CrashDebugData.m_CrashDataPoint.m_DMGHealth = hp;
1500 CrashDebugData.m_CrashDataPoint.m_DMGShock = shock;
1501 if (DEBUG_OUTPUT_TYPE & EVehicleDebugOutputType.DAMAGE_APPLIED)
1503 Debug.Log(
"--------------------------------------------------");
1504 Debug.Log(
"Crew DMG Base: " + dmg);
1505 Debug.Log(
"Crew shockTemp: " + shockTemp);
1506 Debug.Log(
"Crew DMG Health: " + hp);
1507 Debug.Log(
"Crew DMG Shock: " + shock);
1508 Debug.Log(
"--------------------------------------------------");
1512 player.AddHealth(
"",
"Shock", -shock );
1513 player.AddHealth(
"",
"Health", -hp );
1529 if (!m_EngineStarted)
1542 HandleDoorsSound(animSource, phase);
1543 HandleSeatAdjustmentSound(animSource, phase);
1550 int pivotIndex = -1;
1552 string selectionName = GetSelectionFromAnimSource(animSource);
1553 if (selectionName !=
"")
1555 position = GetSelectionBasePositionLS(selectionName);
1557 int level = GetViewGeometryLevel();
1562 GetBonePivotsForAnimationSource(level, animSource, pivots);
1566 pivotIndex = pivots[0];
1577 if (player.IsCameraInsideVehicle())
1585 sound.SetPosition(ModelToWorld(position));
1586 sound.SetLocalPosition(position);
1597 case "doorscodriver":
1602 EffectSound sound = CreateSoundForAnimationSource(animSource);
1621 case "seatcodriver":
1622 EffectSound sound = CreateSoundForAnimationSource(animSource);
1641 case ECarHornState.SHORT:
1642 PlaySoundSet(m_CarHornSoundEffect, m_CarHornShortSoundName, 0, 0,
false);
1644 case ECarHornState.LONG:
1645 PlaySoundSet(m_CarHornSoundEffect, m_CarHornLongSoundName, 0, 0,
true);
1648 CleanupSound(m_CarHornSoundEffect);
1656 m_CarEngineSoundState = pState;
1662 SetCarEngineSoundState(state);
1663 m_CarEngineLastSoundState = state;
1670 bool doInside =
false;
1672 m_CarEngineLastSoundState = state;
1676 case CarEngineSoundState.STARTING:
1678 sound.
SetSoundSet(
"Offroad_02_Starting_SoundSet");
1681 m_PreStartSound = sound;
1683 case CarEngineSoundState.START_OK:
1694 case CarEngineSoundState.START_NO_FUEL:
1696 sound.
SetSoundSet(
"offroad_engine_failed_start_fuel_SoundSet");
1700 case CarEngineSoundState.START_NO_BATTERY:
1702 sound.
SetSoundSet(
"offroad_engine_failed_start_battery_SoundSet");
1706 case CarEngineSoundState.START_NO_SPARKPLUG:
1708 sound.
SetSoundSet(
"offroad_engine_failed_start_sparkplugs_SoundSet");
1712 case CarEngineSoundState.STOP_OK:
1719 case CarEngineSoundState.STOP_NO_FUEL:
1734 if (player.IsCameraInsideVehicle())
1742 vector enginePos = GetEnginePos();
1745 sound.SetPosition(ModelToWorld(enginePos));
1746 sound.SetLocalPosition(enginePos);
1789 m_FuelAmmount = newValue;
1793 m_OilAmmount = newValue;
1797 m_BrakeAmmount = newValue;
1801 m_CoolantAmmount = newValue;
1813 ECarOperationalState state = CheckOperationalRequirements();
1814 SetCarEngineSoundState(CarEngineSoundState.NONE);
1815 return state == ECarOperationalState.OK;
1820 ECarOperationalState state = CheckOperationalRequirements();
1822 if (state == ECarOperationalState.RUINED)
1827 if (state & ECarOperationalState.NO_BATTERY)
1829 HandleEngineSound(CarEngineSoundState.START_NO_BATTERY);
1833 if (state & ECarOperationalState.NO_IGNITER)
1835 HandleEngineSound(CarEngineSoundState.START_NO_SPARKPLUG);
1839 if (state & ECarOperationalState.NO_FUEL)
1841 HandleEngineSound(CarEngineSoundState.START_NO_FUEL);
1845 HandleEngineSound(CarEngineSoundState.STARTING);
1851 int state = ECarOperationalState.OK;
1855 if (IsDamageDestroyed() || GetHealthLevel(
"Engine") >=
GameConstants.STATE_RUINED)
1857 state |= ECarOperationalState.RUINED;
1860 if (GetFluidFraction(
CarFluid.FUEL) <= 0)
1862 state |= ECarOperationalState.NO_FUEL;
1867 item = GetBattery();
1868 float batteryConsume = GetBatteryConsumption();
1869 if (!item || (item && (item.IsRuined() || item.GetCompEM().GetEnergy() < batteryConsume)))
1870 state |= ECarOperationalState.NO_BATTERY;
1875 item = FindAttachmentBySlotName(
"SparkPlug");
1876 if (!item || (item && item.IsRuined()))
1877 state |= ECarOperationalState.NO_IGNITER;
1882 item = FindAttachmentBySlotName(
"GlowPlug");
1883 if (!item || (item && item.IsRuined()))
1884 state |= ECarOperationalState.NO_IGNITER;
1892 return CheckOperationalRequirements() == ECarOperationalState.OK;
1898 UpdateLights(newGear);
1905 if (
GetGame().IsServer() && battery)
1907 float batteryConsume = GetBatteryConsumption();
1908 battery.GetCompEM().ConsumeEnergy(batteryConsume);
1910 UpdateBattery(battery);
1915 HandleEngineSound(CarEngineSoundState.START_OK);
1922 if (
GetGame().IsServer() && battery)
1924 UpdateBattery(battery);
1929 CarEngineSoundState stopSoundState = CarEngineSoundState.STOP_OK;
1930 if (GetFluidFraction(
CarFluid.FUEL) <= 0)
1931 stopSoundState = CarEngineSoundState.STOP_NO_FUEL;
1933 HandleEngineSound(stopSoundState);
1935 SetEngineZoneReceivedHit(
false);
1941 return m_HeadlightsOn;
1949 m_HeadlightsOn = !m_HeadlightsOn;
1956 UpdateLightsClient(new_gear);
1958 UpdateLightsServer(new_gear);
1976 if (!m_Headlight && m_HeadlightsState != CarHeadlightBulbsState.NONE)
1983 switch (m_HeadlightsState)
1985 case CarHeadlightBulbsState.LEFT:
1986 m_Headlight.AttachOnMemoryPoint(
this, m_LeftHeadlightPoint, m_LeftHeadlightTargetPoint);
1987 m_Headlight.SegregateLight();
1989 case CarHeadlightBulbsState.RIGHT:
1990 m_Headlight.AttachOnMemoryPoint(
this, m_RightHeadlightPoint, m_RightHeadlightTargetPoint);
1991 m_Headlight.SegregateLight();
1993 case CarHeadlightBulbsState.BOTH:
1994 vector local_pos_left = GetMemoryPointPos(m_LeftHeadlightPoint);
1995 vector local_pos_right = GetMemoryPointPos(m_RightHeadlightPoint);
1997 vector local_pos_middle = (local_pos_left + local_pos_right) * 0.5;
1998 m_Headlight.AttachOnObject(
this, local_pos_middle);
1999 m_Headlight.AggregateLight();
2002 m_Headlight.FadeOut();
2011 m_Headlight.FadeOut();
2019 case CarGear.REVERSE:
2021 if (m_BrakesArePressed)
2022 m_RearLightType = CarRearLightType.BRAKES_AND_REVERSE;
2024 m_RearLightType = CarRearLightType.REVERSE_ONLY;
2027 if (m_BrakesArePressed)
2028 m_RearLightType = CarRearLightType.BRAKES_ONLY;
2030 m_RearLightType = CarRearLightType.NONE;
2035 if (!m_RearLight && m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
2037 if (EngineIsOn() || m_RearLightType == CarRearLightType.BRAKES_ONLY || m_RearLightType == CarRearLightType.BRAKES_AND_REVERSE)
2040 vector localPos = GetMemoryPointPos(m_ReverseLightPoint);
2041 m_RearLight.AttachOnObject(
this, localPos,
"180 0 0");
2046 if (m_RearLight && m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
2048 switch (m_RearLightType)
2050 case CarRearLightType.BRAKES_ONLY:
2053 case CarRearLightType.REVERSE_ONLY:
2060 case CarRearLightType.BRAKES_AND_REVERSE:
2062 BrakeAndReverseRearLight();
2089 gear = GearboxGetMode();
2100 TailLightsShineOn();
2102 switch (m_HeadlightsState)
2104 case CarHeadlightBulbsState.LEFT:
2105 LeftFrontLightShineOn();
2106 RightFrontLightShineOff();
2108 case CarHeadlightBulbsState.RIGHT:
2109 LeftFrontLightShineOff();
2110 RightFrontLightShineOn();
2112 case CarHeadlightBulbsState.BOTH:
2113 LeftFrontLightShineOn();
2114 RightFrontLightShineOn();
2117 LeftFrontLightShineOff();
2118 RightFrontLightShineOff();
2125 TailLightsShineOff();
2126 DashboardShineOff();
2127 LeftFrontLightShineOff();
2128 RightFrontLightShineOff();
2135 case CarGear.REVERSE:
2137 if (m_BrakesArePressed)
2138 m_RearLightType = CarRearLightType.BRAKES_AND_REVERSE;
2140 m_RearLightType = CarRearLightType.REVERSE_ONLY;
2143 if (m_BrakesArePressed)
2144 m_RearLightType = CarRearLightType.BRAKES_ONLY;
2146 m_RearLightType = CarRearLightType.NONE;
2153 if (m_RearLightType != CarRearLightType.NONE && m_HeadlightsState != CarHeadlightBulbsState.NONE)
2155 switch (m_RearLightType)
2157 case CarRearLightType.BRAKES_ONLY:
2158 ReverseLightsShineOff();
2159 BrakeLightsShineOn();
2161 case CarRearLightType.REVERSE_ONLY:
2164 ReverseLightsShineOn();
2165 BrakeLightsShineOff();
2169 ReverseLightsShineOff();
2170 BrakeLightsShineOff();
2173 case CarRearLightType.BRAKES_AND_REVERSE:
2176 BrakeLightsShineOn();
2177 ReverseLightsShineOn();
2181 ReverseLightsShineOff();
2182 BrakeLightsShineOn();
2186 ReverseLightsShineOff();
2187 BrakeLightsShineOff();
2192 ReverseLightsShineOff();
2193 BrakeLightsShineOff();
2199 m_RearLight.SetAsSegregatedBrakeLight();
2204 m_RearLight.SetAsSegregatedReverseLight();
2209 m_RearLight.AggregateLight();
2210 m_RearLight.SetFadeOutTime(1);
2215 m_RearLight.FadeOut();
2221 string material = ConfigGetString(
"frontReflectorMatOn");
2225 SetObjectMaterial(SELECTION_ID_FRONT_LIGHT_L, material);
2231 string material = ConfigGetString(
"frontReflectorMatOn");
2235 SetObjectMaterial(SELECTION_ID_FRONT_LIGHT_R, material);
2241 string material = ConfigGetString(
"frontReflectorMatOff");
2245 SetObjectMaterial(SELECTION_ID_FRONT_LIGHT_L, material);
2251 string material = ConfigGetString(
"frontReflectorMatOff");
2255 SetObjectMaterial(SELECTION_ID_FRONT_LIGHT_R, material);
2261 string material = ConfigGetString(
"ReverseReflectorMatOn");
2265 SetObjectMaterial(SELECTION_ID_REVERSE_LIGHT_L, material);
2266 SetObjectMaterial(SELECTION_ID_REVERSE_LIGHT_R, material);
2272 string material = ConfigGetString(
"ReverseReflectorMatOff");
2276 SetObjectMaterial(SELECTION_ID_REVERSE_LIGHT_L, material);
2277 SetObjectMaterial(SELECTION_ID_REVERSE_LIGHT_R, material);
2283 string material = ConfigGetString(
"brakeReflectorMatOn");
2287 SetObjectMaterial(SELECTION_ID_BRAKE_LIGHT_L, material);
2288 SetObjectMaterial(SELECTION_ID_BRAKE_LIGHT_R, material);
2294 string material = ConfigGetString(
"brakeReflectorMatOff");
2298 SetObjectMaterial(SELECTION_ID_BRAKE_LIGHT_L, material);
2299 SetObjectMaterial(SELECTION_ID_BRAKE_LIGHT_R, material);
2305 string material = ConfigGetString(
"TailReflectorMatOn");
2306 string materialOff = ConfigGetString(
"TailReflectorMatOff");
2308 if (material && materialOff)
2310 if (m_HeadlightsState == CarHeadlightBulbsState.LEFT)
2312 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_L, material);
2313 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_R, materialOff);
2315 else if (m_HeadlightsState == CarHeadlightBulbsState.RIGHT)
2317 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_L, materialOff);
2318 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_R, material);
2320 else if (m_HeadlightsState == CarHeadlightBulbsState.BOTH)
2322 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_L, material);
2323 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_R, material);
2330 string material = ConfigGetString(
"TailReflectorMatOff");
2334 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_L, material);
2335 SetObjectMaterial(SELECTION_ID_TAIL_LIGHT_R, material);
2341 string material = ConfigGetString(
"dashboardMatOn");
2345 SetObjectMaterial(SELECTION_ID_DASHBOARD_LIGHT, material);
2351 string material = ConfigGetString(
"dashboardMatOff");
2355 SetObjectMaterial(SELECTION_ID_DASHBOARD_LIGHT, material);
2373 if ( !isVital || !GetInventory() )
2376 EntityAI item = GetInventory().FindAttachment(slotId);
2378 if (!item || item.IsRuined())
2390 CheckVitalItem(isVital, slotId);
2400 ammount = (1 - m_RadiatorHealth) * RandomFloat(0.02, 0.05);
2401 Leak(fluid, ammount);
2405 ammount = (1 - m_EngineHealth) * RandomFloat(0.02, 1.0);
2406 Leak(fluid, ammount);
2410 ammount = (1 - m_FuelTankHealth) * RandomFloat(0.02, 0.05);
2411 Leak(fluid, ammount);
2421 int radiatorHealthLevel = radiator.GetHealthLevel(
"");
2422 m_RadiatorHealth = GetHealthLevelValue(radiatorHealthLevel,
"");
2426 m_RadiatorHealth = 0;
2429 int engineHealthLevel = GetHealthLevel(
"Engine");
2430 m_EngineHealth = GetHealthLevelValue(engineHealthLevel,
"Engine");
2432 int fuelTankHealthLevel = GetHealthLevel(
"FuelTank");
2433 m_FuelTankHealth = GetHealthLevelValue(fuelTankHealthLevel,
"FuelTank");
2438 return m_PlayCrashSoundLight;
2443 if (m_PlayCrashSoundLight != play)
2445 m_PlayCrashSoundLight = play;
2452 PlaySoundEx(
"offroad_hit_light_SoundSet", m_CrashSoundLight, m_PlayCrashSoundLight);
2457 return m_PlayCrashSoundHeavy;
2462 if (m_PlayCrashSoundHeavy != play)
2464 m_PlayCrashSoundHeavy = play;
2471 PlaySoundEx(
"offroad_hit_heavy_SoundSet", m_CrashSoundHeavy, m_PlayCrashSoundHeavy);
2500 PlaySoundEx(soundset, sound, soundbool);
2513 GetSelectionList(allSelections);
2515 foreach (
string selectionAll : allSelections)
2519 if (animSrc != animSource)
2524 return selectionAll;
2536 return "seat_con_1_1";
2538 case "seat_codriver":
2539 return "seat_con_2_1";
2542 return "seat_con_1_2";
2545 return "seat_con_2_2";
2570 if (conPointName.Length() > 0)
2572 if ( MemoryPointExists(conPointName) )
2574 vector conPointMS = GetMemoryPointPos(conPointName);
2575 vector conPointWS = ModelToWorld(conPointMS);
2581 if (
vector.Distance(pFromPos, conPointWS) <= pDistance)
2623 return m_Radiator != null;
2633 return GetSpeedometerAbsolute() > 3.5;
2638 return GetHandbrake() > 0.0;
2650 m_EngineStarted = started;
2660 if (GetAnimationPhase(animation) > 0.5)
2682 return "carradiator";
2692 return "carradiator";
2708 if (!m_InputActionMap)
2713 m_CarTypeActionsMap.Insert(this.
Type(), m_InputActionMap);
2741 ActionBase action = ActionManagerBase.GetAction(actionName);
2745 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
2765 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action" );
2767 action_array.Insert(action);
2773 ActionBase action = player.GetActionManager().GetAction(actionName);
2779 action_array.RemoveItem(action);
2790 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
2792 if (newLevel ==
GameConstants.STATE_RUINED && oldLevel != newLevel)
2801 PlaySoundEx(
"offroad_hit_window_small_SoundSet", m_WindowSmall, dummy);
2807 case "WindowFrontLeft":
2808 case "WindowFrontRight":
2811 PlaySoundEx(
"offroad_hit_window_large_SoundSet", m_WindowLarge, dummy);
2817 CreateCarDestroyedEffect();
2827 float maxVolume = GetFluidCapacity(
CarFluid.FUEL );
2828 float amount =
Math.RandomFloat(0.0, maxVolume * 0.35 );
2840 if (!m_ForceUpdateLights)
2842 m_ForceUpdateLights =
true;
2849 if (m_ForceUpdateLights)
2851 m_ForceUpdateLights =
false;
2859 return m_BatteryConsume;
2864 return m_BatteryContinuousConsume;
2869 return -m_BatteryRecharge;
2895 if (m_BatteryTimer < 0)
2900 bool engineOn = EngineIsOn();
2901 bool lightsOn = IsScriptedLightsOn();
2906 battery.GetCompEM().ConsumeEnergy(GetBatteryRechargeRate() * m_BatteryTimer);
2908 else if (!engineOn && lightsOn)
2910 battery.GetCompEM().ConsumeEnergy(GetBatteryRuntimeConsumption() * m_BatteryTimer);
2913 if (lightsOn && battery.GetCompEM().GetEnergy() <= 0)
2927 m_CarHornState = pState;
2932 GenerateCarHornAINoise(pState);
2938 if (pState != ECarHornState.OFF)
2942 float noiseMultiplier = 1.0;
2943 if (pState == ECarHornState.LONG)
2944 noiseMultiplier = 2.0;
2966 string debug_output = super.GetDebugText();
2969 debug_output += m_DebugContactDamageMessage +
"\n";
2971 debug_output +=
"Entity momentum: " + GetMomentum();
2972 debug_output +=
"\nIsEngineON: " + EngineIsOn();
2974 return debug_output;
2980 GetInventory().CreateInInventory(
"HeadlightH7");
2981 GetInventory().CreateInInventory(
"HeadlightH7");
2982 GetInventory().CreateInInventory(
"HeadlightH7");
2983 GetInventory().CreateInInventory(
"HeadlightH7");
2987 GetInventory().CreateInInventory(
"CarBattery");
2988 GetInventory().CreateInInventory(
"CarBattery");
2993 GetInventory().CreateInInventory(
"TruckBattery");
2994 GetInventory().CreateInInventory(
"TruckBattery");
2999 GetInventory().CreateInInventory(
"CarRadiator");
3000 GetInventory().CreateInInventory(
"CarRadiator");
3005 GetInventory().CreateInInventory(
"SparkPlug");
3006 GetInventory().CreateInInventory(
"SparkPlug");
3011 GetInventory().CreateInInventory(
"GlowPlug");
3012 GetInventory().CreateInInventory(
"GlowPlug");
3018 GetInventory().CreateInInventory(
"Wrench");
3019 GetInventory().CreateInInventory(
"LugWrench");
3020 GetInventory().CreateInInventory(
"Screwdriver");
3021 GetInventory().CreateInInventory(
"EpoxyPutty");
3023 GetInventory().CreateInInventory(
"CanisterGasoline");
3027 ent = GetInventory().CreateInInventory(
"CanisterGasoline");
3028 if (
Class.CastTo(container, ent))
3033 ent = GetInventory().CreateInInventory(
"Blowtorch");
3036 ent.GetInventory().CreateInInventory(
"LargeGasCanister");
3039 ent = GetInventory().CreateInInventory(
"Blowtorch");
3042 ent.GetInventory().CreateInInventory(
"LargeGasCanister");
3055 return CarScriptOwnerState;
3065 auto state = CarScriptOwnerState.Cast(pState);
3069 protected override event void RewindState(PawnOwnerState pState, PawnMove pMove, inout NetworkRewindType pRewindType)
3071 auto state = CarScriptOwnerState.Cast(pState);
3080 if (isServer || GetNetworkMoveStrategy() != NetworkMoveStrategy.PHYSICS)
3089 protected float m_BatteryEnergyStartMin = 5.0;
Param4< int, int, string, int > TSelectableActionInfoWithColor
eBleedingSourceType GetType()
CarHornActionData ActionData ActionCarHornShort()
map< typename, ref array< ActionBase_Basic > > TInputActionMap
ref NoiseParams m_NoisePar
ActionPushCarCB ActionPushObjectCB ActionPushCar()
void AddAction(typename actionName)
TInputActionMap m_InputActionMap
CarAutomaticGearboxMode
Enumerated automatic gearbox modes. (native, do not change or extend)
CarSoundCtrl
Car's sound controller list. (native, do not change or extend)
CarFluid
Type of vehicle's fluid. (native, do not change or extend)
CarGearboxType
Enumerated gearbox types. (native, do not change or extend)
enum CarDoorState START_NO_BATTERY
enum CarDoorState START_NO_FUEL
enum CarDoorState NO_FUEL
override event void Read(PawnStateReader ctx)
enum CarDoorState NO_BATTERY
enum CarDoorState STOP_OK
enum CarDoorState STARTING
enum CarDoorState REVERSE_ONLY
enum CarDoorState NO_IGNITER
enum CarDoorState START_OK
enum CarDoorState BRAKES_ONLY
override event void Write(PawnStateWriter ctx)
enum CarDoorState START_NO_SPARKPLUG
const int HEALTH_HIGH_SPEED_VALUE
const int HEALTH_LOW_SPEED_VALUE
proto native bool IsServer()
proto float SurfaceGetType(float x, float z, out string type)
Returns: Y position the surface was found.
proto int GetTime()
returns mission time in milliseconds
float GetEnviroHeatComfortOverride()
override void OnGearChanged(int newGear, int oldGear)
override event void ObtainState(PawnOwnerState pState)
override void OnContact(string zoneName, vector localPos, IEntity other, Contact data)
WARNING: Can be called very frequently in one frame, use with caution.
ref EffVehicleSmoke m_engineFx
float m_FuelAmmount
keeps ammount of each fluid
EffectSound CreateSoundForAnimationSource(string animSource)
void RemoveAction(typename actionName)
int m_CarEngineLastSoundState
override vector GetDefaultHitPosition()
string GetActionCompNameOil()
void BrakeAndReverseRearLight()
override void MarkCrewMemberUnconscious(int crewMemberIndex)
int m_CarEngineSoundState
float GetBatteryRechargeRate()
void BrakeLightsShineOn()
void CleanupSound(EffectSound sound)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
float GetActionDistanceOil()
void LeftFrontLightShineOn()
override void MarkCrewMemberDead(int crewMemberIndex)
void UpdateLightsServer(int newGear=-1)
vector GetEnginePointPosWS()
void LeftFrontLightShineOff()
bool IsVitalTruckBattery()
void SetEngineStarted(bool started)
void RightFrontLightShineOff()
override event GetMoveType()
void CheckVitalItem(bool isVital, string slot_name)
override void EEItemAttached(EntityAI item, string slot_name)
void HandleCarHornSound(ECarHornState pState)
override void OnFluidChanged(CarFluid fluid, float newValue, float oldValue)
bool GetCrashHeavySound()
ref EffectSound m_CrashSoundHeavy
void ReverseLightsShineOn()
float m_EnviroHeatComfortOverride
bool CheckOperationalState()
void UpdateHeadlightState()
void UpdateBattery(ItemBase battery)
override float GetLiquidThroughputCoef()
void ForceUpdateLightsEnd()
void HandleEngineSound(CarEngineSoundState state)
void LeakFluid(CarFluid fluid)
override bool CanPutIntoHands(EntityAI parent)
ref EffectSound m_CarHornSoundEffect
bool IsScriptedLightsOn()
Proper way to get if light is swiched on. Use instead of IsLightsOn().
override int Get3rdPersonCameraType()
camera type
vector m_VelocityPrevTick
override event void RewindState(PawnOwnerState pState, PawnMove pMove, inout NetworkRewindType pRewindType)
vector Get_1_1PointPosWS()
override void OnEngineStop()
Gets called everytime the engine stops.
override void OnEngineStart()
Gets called everytime the engine starts.
void TailLightsShineOff()
override float OnSound(CarSoundCtrl ctrl, float oldValue)
override void OnUpdate(float dt)
ref EffVehicleSmoke m_coolantFx
Particles.
int CheckOperationalRequirements()
override string GetVehicleType()
ref EffectSound m_WindowSmall
void PlayCrashHeavySound()
float GetBatteryConsumption()
string GetDoorSelectionNameFromSeatPos(int posIdx)
NoiseSystem m_NoiseSystem
ref NoiseParams m_NoisePar
void CreateCarDestroyedEffect()
void PlaySoundEx(string soundset, EffectSound sound, out bool soundbool)
int GetCrewIndex(string selection)
bool GetCrashLightSound()
override bool CanReleaseAttachment(EntityAI attachment)
override bool OnBeforeEngineStart()
override void OnAttachmentRuined(EntityAI attachment)
vector GetCoolantPtcPosWS()
vector Get_2_1PointPosWS()
void HandleSeatAdjustmentSound(string animSource, float phase)
override void OnVariablesSynchronized()
CarRearLightBase m_RearLight
string GetAnimSourceFromSelection(string selection)
override bool DetectFlipped(VehicleFlippedContext ctx)
void CarPartsHealthCheck()
void SetCarHornState(int pState)
void SynchCrashHeavySound(bool play)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
string GetSelectionFromAnimSource(string animSource)
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
string GetActionCompNameCoolant()
override void EEItemDetached(EntityAI item, string slot_name)
CarLightBase CreateFrontLight()
void CheckContactCache()
Responsible for damaging the car according to contact events from OnContact.
void OnVehicleJumpOutServer(GetOutTransportActionData gotActionData)
void SynchCrashLightSound(bool play)
override void OnAnimationPhaseStarted(string animSource, float phase)
void GenerateCarHornAINoise(int pState)
override void EEDelete(EntityAI parent)
void PlayCrashLightSound()
CarDoorState TranslateAnimationPhaseToCarDoorState(string animation)
void HandleDoorsSound(string animSource, float phase)
void ReverseLightsShineOff()
ref EffectSound m_CrashSoundLight
override event GetOwnerStateType()
vector Get_1_2PointPosWS()
override void EEKilled(Object killer)
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
float GetBatteryRuntimeConsumption()
ref EffectSound m_WindowLarge
ref EffVehicleSmoke m_exhaustFx
override void OnDriverExit(Human player)
bool OnBeforeSwitchLights(bool toOn)
static vector m_DrownEnginePos
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
vector GetBackPointPosWS()
void SpawnUniversalParts()
float GetActionDistanceBrakes()
void AddAction(typename actionName)
string GetDoorConditionPointFromSelection(string selection)
string GetActionCompNameBrakes()
bool m_PlayCrashSoundLight
ref array< int > m_WheelSmokePtcFx
vector Get_2_2PointPosWS()
float GetPushForceCoefficientMultiplier()
void CheckVitalItem(bool isVital, int slotId)
override bool CanReachSeatFromDoors(string pSeatSelection, vector pFromPos, float pDistance=1.0)
CarRearLightBase CreateRearLight()
string GetDoorInvSlotNameFromSeatPos(int posIdx)
void SpawnAdditionalItems()
void RightFrontLightShineOn()
ref CarContactCache m_ContactCache
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
bool CanManipulateSpareWheel(string slotSelectionName)
void SetCarEngineSoundState(CarEngineSoundState pState)
vector GetFrontPointPosWS()
void DamageCrew(float dmg)
Responsible for damaging crew in a car crash.
void ForceUpdateLightsStart()
override void EEOnCECreate()
void UpdateLights(int new_gear=-1)
override bool IsInventoryVisible()
void PlaySound(string soundset, EffectSound sound, out bool soundbool)
void BrakeLightsShineOff()
override void EOnPostSimulate(IEntity other, float timeSlice)
ref array< ref EffWheelSmoke > m_WheelSmokeFx
void UpdateLightsClient(int newGear=-1)
bool m_PlayCrashSoundHeavy
void ToggleHeadlights()
Switches headlights on/off, including the illumination of the control panel and synchronizes this cha...
int GetCarDoorsState(string slotType)
float GetActionDistanceCoolant()
override CarRearLightBase CreateRearLight()
override string GetDoorConditionPointFromSelection(string selection)
override CarLightBase CreateFrontLight()
override bool IsVitalGlowPlug()
override bool IsVitalTruckBattery()
override string GetAnimSourceFromSelection(string selection)
override void SetActions()
override bool IsVitalRadiator()
override bool IsVitalCarBattery()
override bool IsVitalSparkPlug()
bool CanManipulateSpareWheel(string slotSelectionName)
Super root of all classes in Enforce script.
Wrapper class for managing sound through SEffectManager.
void SetSoundSet(string snd)
Set soundset for the sound.
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
void SetSoundWaveKind(WaveKind wave_kind)
Set WaveKind for the sound.
void SetSoundFadeOut(float fade_out)
Set the sound fade out duration.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
override void SetParent(Object parent_obj, int pivot)
Set parent for the sound to follow.
bool SoundPlay()
Plays sound.
provides access to slot configuration
Manager class for managing Effect (EffectParticle, EffectSound)
static EffectSound PlaySoundCachedParams(string sound_set, vector position, float play_fade_in=0, float stop_fade_out=0, bool loop=false)
Create and play an EffectSound, using or creating cached SoundParams.
static int PlayOnObject(notnull Effect eff, Object obj, vector local_pos="0 0 0", vector local_ori="0 0 0", bool force_rotation_relative_to_world=false)
Play an Effect.
static int CreateParticleServer(vector pos, EffecterParameters parameters)
returns unique effecter ID
static void Stop(int effect_id)
Stops the Effect.
static bool IsEffectExist(int effect_id)
Checks whether an Effect ID is registered in SEffectManager.
static int EffectRegister(Effect effect)
Registers Effect in SEffectManager.
static void DestroyEffect(Effect effect)
Unregisters, stops and frees the Effect.
Serialization general interface. Serializer API works with:
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
DamageType
exposed from C++ (do not change)
DayZPlayerConstants
defined in C++
proto native CGame GetGame()
proto void Print(void var)
Prints content of variable to console/log.
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
const float LIQUID_THROUGHPUT_CAR_DEFAULT
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
proto native vector dBodyGetVelocityAt(notnull IEntity body, vector globalpos)
proto native vector GetVelocity(notnull IEntity ent)
Returns linear velocity.
proto native float dBodyGetMass(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
class NoiseSystem NoiseParams()