16enum EEnvironmentSoakingCategories
22enum EEnvironmentDryingCategories
26 PLAYER_HEATSOURCE, = 2,
30class EnvironmentSnapshotData
32 float m_ClothingHeatComfort;
33 float m_TargetHeatComfort;
36class EnvironmentDrynessData
38 bool m_UseTemperatureSources =
false;
39 float m_TemperatureSourceDistance = 1.0;
42class EnvironmentEntityData
46 bool m_HasTemperature;
52 ref InventoryLocation m_InventoryLocation =
new InventoryLocation();
60 override bool OnContact(IEntity other, Contact contact)
74 const float RAIN_LIMIT_LOW = 0.05;
76 protected const float SNOWFALL_LIMIT_LOW = 0.5;
77 protected const float SNOWFALL_WIND_COMBINED_THRESHOLD = 1.3;
79 protected const float HC_EXPOSED_HEAD_TO_SUN = 1.2;
81 const float WATER_LEVEL_HIGH = 1.5;
82 const float WATER_LEVEL_MID = 1.2;
83 const float WATER_LEVEL_LOW = 0.5;
84 const float WATER_LEVEL_NONE = 0.15;
86 protected float m_WetDryTick;
87 protected float m_ItemsWetnessMax;
88 protected float m_RoofCheckTimer;
89 protected float m_ShadowCheckTimer;
93 protected float m_PlayerHeightPos;
94 protected float m_PlayerSpeed;
95 protected float m_PlayerTemperature;
96 protected float m_PlayerHeat;
97 protected float m_HeatComfort;
98 protected float m_TargetHeatComfort;
99 protected float m_TargetHeatComfortRaw;
102 protected float m_Rain = 0;
103 protected float m_Snowfall = 0;
104 protected float m_Wind = 0;
105 protected float m_Fog = 0;
106 protected float m_DayOrNight = 0;
107 protected float m_Clouds = 0;
108 protected float m_EnvironmentTemperature;
109 protected float m_Time = 0;
111 protected int m_DayTime;
115 protected float m_ItemTemperatureCoef;
118 protected float m_WaterLevel;
119 protected bool m_IsUnderRoof;
120 private bool m_IsUnderRoofBuilding;
121 protected bool m_IsInWater;
122 protected bool m_IsTempSet;
123 protected bool m_ShadowPresence;
125 protected float m_HeatBufferTimer;
126 protected float m_HeatBufferCapPrevious;
128 protected ref array<int> m_SlotIdsComplete;
129 protected ref array<int> m_SlotIdsUpper;
130 protected ref array<int> m_SlotIdsBottom;
131 protected ref array<int> m_SlotIdsLower;
133 protected ref array<int> m_HeadParts;
134 protected ref array<int> m_BodyParts;
135 protected ref array<int> m_FeetParts;
137 protected WorldData m_WorldData;
139 protected bool m_HasTemperatureSources;
140 protected float m_UTSAverageTemperature;
141 protected ref array<UTemperatureSource> m_UTemperatureSources;
142 protected ref SimpleMovingAverage<float> m_UTSAverageTemperatureBuffer;
143 protected ref SimpleMovingAverage<float> m_AverageHeatComfortBuffer;
145 protected int m_HeatComfortBehaviorCategory;
149 #ifdef DIAG_DEVELOPER
150 bool m_Debug =
false;
153 #ifdef ENABLE_LOGGING
154 bool m_DebugLogDryWet =
false;
155 bool m_DebugLogItemHeat =
false;
160 void Environment(PlayerBase pPlayer)
169 m_RoofCheckTimer = 0.0;
171 m_HeatComfort =
m_Player.GetStatHeatComfort().Get();
172 m_WorldData =
g_Game.GetMission().GetWorldData();
175 m_IsUnderRoof =
false;
179 m_HeatBufferTimer = 0.0;
181 m_UTSAverageTemperature = 0.0;
182 m_UTemperatureSources =
new array<UTemperatureSource>();
183 m_UTSAverageTemperatureBuffer =
new SimpleMovingAverage<float>(10, 0.0);
184 m_AverageHeatComfortBuffer =
new SimpleMovingAverage<float>(20, m_HeatComfort);
187 m_SlotIdsComplete =
new array<int>();
188 m_SlotIdsComplete = {
189 InventorySlots.HEADGEAR,
191 InventorySlots.EYEWEAR,
192 InventorySlots.GLOVES,
193 InventorySlots.ARMBAND,
203 m_SlotIdsUpper =
new array<int>();
205 InventorySlots.GLOVES,
206 InventorySlots.ARMBAND,
216 m_SlotIdsBottom =
new array<int>();
224 m_SlotIdsLower =
new array<int>();
231 m_HeadParts =
new array<int>();
233 InventorySlots.HEADGEAR,
237 m_BodyParts =
new array<int>();
239 InventorySlots.GLOVES,
244 InventorySlots.MELEE,
245 InventorySlots.SHOULDER
248 m_FeetParts =
new array<int>();
255 m_EnvironmentSnapshot =
new EnvironmentSnapshotData();
257 m_TargetHeatComfortRaw = 0.0;
266 protected void CachePlayerInventoryItemAttributes()
268 m_EnvironmentEntityDataCache.Clear();
270 EnvironmentEntityData bodyPartItemData;
271 GameInventory itemInventory;
272 GameInventory playerInventory =
m_Player.GetInventory();
277 bodyPartItemData =
new EnvironmentEntityData();
278 itemInventory = itemInHands.GetInventory();
280 bodyPartItemData.m_SlotId = bodyPartItemData.m_InventoryLocation.GetSlot();
281 bodyPartItemData.m_Wetness = itemInHands.GetWet();
283 bodyPartItemData.m_Attachments = ProcessAttachmentAttributes(itemInventory);
284 bodyPartItemData.m_Cargo = ProcessCargoAttributes(itemInventory);
286 m_EnvironmentEntityDataCache.Set(itemInHands, bodyPartItemData);
290 for (
int attIdx = 0; attIdx < attCount; ++attIdx)
293 if (bodyPartItem.IsClothing())
295 bodyPartItemData =
new EnvironmentEntityData();
297 itemInventory = item.GetInventory();
299 bodyPartItemData.m_SlotId = bodyPartItemData.m_InventoryLocation.GetSlot();
300 bodyPartItemData.m_Wetness = item.GetWet();
302 bodyPartItemData.m_Attachments = ProcessAttachmentAttributes(itemInventory);
303 bodyPartItemData.m_Cargo = ProcessCargoAttributes(itemInventory);
305 m_EnvironmentEntityDataCache.Set(
ItemBase.Cast(bodyPartItem), bodyPartItemData);
316 if (inventoryAttCount > 0)
318 for (
int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
322 EnvironmentEntityData bodyPartAttachmentData =
new EnvironmentEntityData();
325 GameInventory attachmentInventory = attachmentItem.GetInventory();
327 if (attachmentItem.CanHaveTemperature())
329 bodyPartAttachmentData.m_HasTemperature =
true;
330 bodyPartAttachmentData.m_Temperature = attachmentItem.GetTemperature();
331 if (bodyPartAttachmentData.m_Temperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT || bodyPartAttachmentData.m_Temperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
332 bodyPartAttachmentData.m_HeatComfort = NormalizedTemperature(bodyPartAttachmentData.m_Temperature) * attachmentItem.GetQuantityNormalizedScripted() * attachmentItem.GetTemperaturePerQuantityWeight();
336 bodyPartAttachmentData.m_Wetness = attachmentItem.GetWet();
337 outData.Set(attachmentItem, bodyPartAttachmentData);
351 CargoBase inventoryItemCargo = parentItemInventory.
GetCargo();
352 if (inventoryItemCargo)
354 int inventoryItemCount = inventoryItemCargo.
GetItemCount();
355 if (inventoryItemCount > 0)
357 for (
int j = 0; j < inventoryItemCount; ++j)
360 EnvironmentEntityData bodyPartCargoData =
new EnvironmentEntityData();
363 GameInventory cargoInventory = cargoItem.GetInventory();
366 if (cargoItem.CanHaveTemperature())
368 bodyPartCargoData.m_HasTemperature =
true;
369 bodyPartCargoData.m_Temperature = cargoItem.GetTemperature();
370 if (bodyPartCargoData.m_Temperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT || bodyPartCargoData.m_Temperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
371 bodyPartCargoData.m_HeatComfort = NormalizedTemperature(bodyPartCargoData.m_Temperature) * cargoItem.GetQuantityNormalizedScripted() * cargoItem.GetTemperaturePerQuantityWeight();
375 bodyPartCargoData.m_Wetness = cargoItem.GetWet();
376 outData.Set(cargoItem, bodyPartCargoData);
394 m_RoofCheckTimer += pDelta;
396 if ( m_RoofCheckTimer >= GameConstants.ENVIRO_TICK_ROOF_RC_CHECK )
398 if (!IsInsideBuilding())
401 m_IsUnderRoof =
true;
403 m_RoofCheckTimer = 0;
406 m_ShadowCheckTimer += pDelta;
407 if (m_ShadowCheckTimer >= GameConstants.ENVIRO_TICK_SHADOW_RC_CHECK)
409 if (IsInsideBuilding())
410 m_ShadowPresence =
true;
412 CheckShadowPresence();
414 m_ShadowCheckTimer = 0;
418 if (
m_Time >= GameConstants.ENVIRO_TICK_RATE)
420 CachePlayerInventoryItemAttributes();
426 CheckWaterContact(m_WaterLevel);
427 CollectAndSetPlayerData();
428 CollectAndSetEnvironmentData();
430 GatherTemperatureSources();
431 ProcessTemperatureSources();
434 ProcessItemsTemperature(m_HeadParts);
435 ProcessItemsTemperature(m_BodyParts);
436 ProcessItemsTemperature(m_FeetParts);
437 ProcessItemsInHandsTemperature();
440 if (DetermineHeatcomfortBehavior())
441 SetHeatcomfortDirectly();
443 ProcessHeatComfort();
446 if (m_WetDryTick >= GameConstants.ENVIRO_TICKS_TO_WETNESS_CALCULATION)
448 if (IsWaterContact())
450 ProcessWetnessByWaterLevel(m_WaterLevel);
452 else if ((IsRaining() || (IsSnowing() && MiscGameplayFunctions.GetCombinedSnowfallWindValue() > SNOWFALL_WIND_COMBINED_THRESHOLD)) && !IsInsideBuilding() && !
IsUnderRoof() && !IsChildOfType({Car}))
454 ProcessItemsWetness(m_SlotIdsComplete);
458 ProcessItemsDryness();
463 if ((m_ItemsWetnessMax < GameConstants.STATE_WET) && (wetnessStat.Get() == 1))
467 else if ((m_ItemsWetnessMax >= GameConstants.STATE_WET) && (wetnessStat.Get() == 0))
473 m_ItemsWetnessMax = 0;
484 bool IsTemperatureSet()
493 protected float GetPlayerHeat()
495 float heat = m_PlayerSpeed * GameConstants.ENVIRO_DEFAULT_ENTITY_HEAT;
505 return m_IsUnderRoof;
511 bool IsInsideBuilding()
513 return m_Player.IsSoundInsideBuilding();
521 return m_ShadowPresence;
527 protected bool IsWaterContact()
536 private bool IsChildOfType(array<typename> typenames)
540 return parent.IsAnyInherited(typenames);
549 private bool IsUnderRoofBuilding()
551 return m_IsUnderRoofBuilding;
557 protected bool IsRaining()
559 return m_Rain > RAIN_LIMIT_LOW;
565 protected bool IsSnowing()
567 return m_Snowfall > SNOWFALL_LIMIT_LOW;
575 protected bool DetermineHeatcomfortBehavior()
578 m_TargetHeatComfortRaw = 0.0;
580 if (IsChildOfType({Car}))
582 CarScript car = CarScript.Cast(
m_Player.GetParent());
583 if (car && car.EngineIsOn())
594 if (IsChildOfType({Motorbike}))
596 Motorbike motorbike = Motorbike.Cast(
m_Player.GetParent());
599 speed = Math.Round(Math.AbsFloat(motorbike.GetSpeedometerAbsolute()));
600 if (speed > GameConstants.ENVIRO_HEATCOMFORT_MOTORBIKE_SPEED_MIN)
610 if (IsChildOfType({Boat}))
612 Boat boat = Boat.Cast(
m_Player.GetParent());
615 speed = Math.Round(Math.AbsFloat(boat.GetSpeedometerAbsolute()));
616 if (speed > GameConstants.ENVIRO_HEATCOMFORT_BOAT_SPEED_MIN)
634 protected void CheckUnderRoof()
637 if (IsChildOfType({Transport}))
639 m_IsUnderRoof =
false;
640 m_IsUnderRoofBuilding =
false;
645 vector hitPosition, hitNormal;
646 vector from =
m_Player.GetPosition();
647 vector to = from +
"0 25 0";
654 m_IsUnderRoof = DayZPhysics.RayCastBullet(from, to, collisionLayerMask, null, hitObject, hitPosition, hitNormal,
hitFraction);
656 m_IsUnderRoofBuilding = hitObject && hitObject.IsInherited(House);
665 protected void CheckShadowPresence()
667 if (IsInsideBuilding() || m_IsUnderRoof || m_IsUnderRoofBuilding)
669 m_ShadowPresence =
true;
673 if (IsChildOfType({Car}))
675 m_ShadowPresence =
true;
683 vector playerHeadPosition = MiscGameplayFunctions.GetPlayerHeadPosition(
m_Player);
685 vector to = playerHeadPosition + -
g_Game.GetWorld().GetSunOrMoonDirection() * length;
688 vector dir = (to - playerHeadPosition).Normalized();
692 vector forward = vector.
Up;
693 if (Math.AbsFloat(vector.Dot(forward, up)) > 0.99)
694 forward = vector.
Aside;
700 transform[0] = right;
703 transform[3] = (playerHeadPosition + to) * 0.5;
705 #ifdef CHECK_SHADOW_VIZ
708 cylinder.SetMatrix(transform);
718 ShadowDetectionCollisionCallback callback =
new ShadowDetectionCollisionCallback();
719 m_ShadowPresence = DayZPhysics.CapsuleOverlapBullet(transform, radius, length, collisionLayerMask, callback);
730 protected void CheckWaterContact(out
float pWaterLevel)
734 if (
m_Player.PhysicsGetLinkedEntity() || IsChildOfType({Transport}))
745 g_Game.SurfaceUnderObjectByBoneCorrectedLiquid(
m_Player, SurfaceAnimationBone.RightFrontLimb, surfType, liquidType);
752 HumanMovementState hms =
new HumanMovementState();
755 pWaterLevel = WATER_LEVEL_MID;
757 pWaterLevel = WATER_LEVEL_HIGH;
771 if (IsUnderRoofBuilding())
778 g_Game.SurfaceUnderObjectExCorrectedLiquid(
m_Player, surfType, impact, liquidType);
809 float GetWindModifierPerSurface()
811 if (IsUnderRoofBuilding())
817 float GetTemperature()
819 return m_EnvironmentTemperature;
822 float GetTargetHeatComfort()
824 return m_TargetHeatComfort;
837 protected float GetEnvironmentTemperature()
841 if (IsWaterContact())
849 if (IsInsideBuilding() || m_IsUnderRoofBuilding)
853 else if (IsChildOfType({Car}))
855 temperature += Math.AbsFloat(temperature * GameConstants.ENVIRO_TEMPERATURE_INSIDE_VEHICLE_COEF);
861 temperature += WindEffectTemperatureValue(temperature) * GetWindModifierPerSurface() * GameConstants.ENVIRO_TEMPERATURE_UNDERROOF_COEF;
875 float temperaturesDiff = temperature - m_UTSAverageTemperature;
876 if (temperaturesDiff * (temperaturesDiff - temperature) > 0.0)
877 temperature = m_UTSAverageTemperature;
892 if ( IsWaterContact() )
895 if (m_WaterLevel >= WATER_LEVEL_HIGH)
899 else if (m_WaterLevel >= WATER_LEVEL_MID && m_WaterLevel < WATER_LEVEL_HIGH)
903 else if (m_WaterLevel >= WATER_LEVEL_LOW && m_WaterLevel < WATER_LEVEL_MID)
907 else if (m_WaterLevel >= WATER_LEVEL_NONE && m_WaterLevel < WATER_LEVEL_LOW)
912 else if (!IsInsideBuilding() && !
IsUnderRoof() && !IsChildOfType({Car}))
915 wetDelta = GameConstants.ENVIRO_WET_INCREMENT * GameConstants.ENVIRO_TICKS_TO_WETNESS_CALCULATION * (m_Rain) * (1 + (GameConstants.ENVIRO_WIND_EFFECT * m_Wind));
917 if (IsSnowing() && MiscGameplayFunctions.GetCombinedSnowfallWindValue() > SNOWFALL_WIND_COMBINED_THRESHOLD)
918 wetDelta = GameConstants.ENVIRO_WET_INCREMENT * GameConstants.ENVIRO_TICKS_TO_WETNESS_CALCULATION * (m_Snowfall - SNOWFALL_LIMIT_LOW) * GameConstants.ENVIRO_SNOW_WET_COEF * (1 + (GameConstants.ENVIRO_WIND_EFFECT * m_Wind));
923 float tempEffect = Math.Max(m_PlayerHeat + GetEnvironmentTemperature(), 1.0);
925 float weatherEffect = ((1 - (m_Fog * GameConstants.ENVIRO_FOG_DRY_EFFECT))) * (1 - (m_Clouds * GameConstants.ENVIRO_CLOUD_DRY_EFFECT));
926 if (weatherEffect <= 0)
931 wetDelta = -(GameConstants.ENVIRO_DRY_INCREMENT * weatherEffect * tempEffect);
932 if (!IsInsideBuilding())
934 wetDelta *= 1 + (GameConstants.ENVIRO_WIND_EFFECT * m_Wind);
949 protected void CollectAndSetPlayerData()
951 vector playerPos =
m_Player.GetPosition();
952 m_PlayerHeightPos = playerPos[1];
960 m_PlayerHeat = GetPlayerHeat();
968 protected void CollectAndSetEnvironmentData()
970 Weather weather =
g_Game.GetWeather();
973 m_DayTime =
g_Game.GetMission().GetWorldData().GetDaytime();
974 m_DayOrNight = m_DayTime;
979 SetEnvironmentTemperature();
980 SetAreaGenericColdness();
985 void SetEnvironmentTemperature()
988 m_EnvironmentTemperature = GetEnvironmentTemperature();
994 void SetAreaGenericColdness()
997 m_Player.SetInColdArea(heigthCorrectedTemp <= GameConstants.COLD_AREA_TEMPERATURE_THRESHOLD);
1004 protected void ProcessWetnessByWaterLevel(
float pWaterLevel)
1006 if (pWaterLevel >= WATER_LEVEL_HIGH)
1007 ProcessItemsWetness(m_SlotIdsComplete);
1008 else if (pWaterLevel >= WATER_LEVEL_MID && pWaterLevel < WATER_LEVEL_HIGH)
1009 ProcessItemsWetness(m_SlotIdsUpper);
1010 else if (pWaterLevel >= WATER_LEVEL_LOW && pWaterLevel < WATER_LEVEL_MID)
1011 ProcessItemsWetness(m_SlotIdsBottom);
1012 else if (pWaterLevel >= WATER_LEVEL_NONE && pWaterLevel < WATER_LEVEL_LOW)
1013 ProcessItemsWetness(m_SlotIdsLower);
1022 protected void ProcessItemsWetness(array<int> pSlotIds)
1024 #ifdef ENABLE_LOGGING
1025 LogDryWetProcess(
string.Format(
"Environment :: ProcessItemsWetness (update interval=%1s)", GameConstants.ENVIRO_TICK_RATE));
1028 foreach (
ItemBase item, EnvironmentEntityData attributes : m_EnvironmentEntityDataCache)
1031 ApplyWetnessToItem(item);
1034 #ifdef ENABLE_LOGGING
1035 LogDryWetProcess(
"==========");
1040 protected void ApplyWetnessToItem(
ItemBase pItem, EnvironmentEntityData itemAttributes = null)
1042 EnvironmentEntityData itemData;
1043 if (pItem && !itemAttributes)
1044 itemData = m_EnvironmentEntityDataCache.Get(pItem);
1045 else if (pItem && itemAttributes)
1046 itemData = itemAttributes;
1051 bool isParentWet =
false;
1052 bool parentContainsLiquid =
false;
1054 if (itemData.m_InventoryLocation != null)
1056 EntityAI parent = itemData.m_InventoryLocation.GetParent();
1059 parentItem =
ItemBase.Cast(parent);
1062 if (parentItem.GetWet() >= GameConstants.STATE_SOAKING_WET)
1065 if ((parentItem.GetLiquidType() != 0) && (parentItem.GetQuantity() > 0))
1066 parentContainsLiquid =
true;
1071 if ((itemData.m_Wetness > m_ItemsWetnessMax) && (parent ==
m_Player))
1072 m_ItemsWetnessMax = itemData.m_Wetness;
1076 if (isParentWet || parentContainsLiquid)
1078 float soakingCoef = 0;
1079 if (parentContainsLiquid)
1081 soakingCoef = pItem.GetSoakingIncrement(EEnvironmentSoakingCategories.PARENT_LIQUID);
1082 #ifdef ENABLE_LOGGING
1083 LogDryWetProcess(
string.Format(
"%1 (soak coef=%2/s, current wetness=%3) [parent contains liquid]", pItem.GetDisplayName(), soakingCoef / GameConstants.ENVIRO_TICK_RATE, pItem.GetWet()), parentItem != null);
1086 else if (isParentWet && parentItem)
1088 if (itemData.m_Wetness < parentItem.GetWet())
1089 soakingCoef = GetWetDelta();
1091 #ifdef ENABLE_LOGGING
1092 LogDryWetProcess(
string.Format(
"%1 (soak coef=%2/s, current wetness=%3) [parent wet]", pItem.GetDisplayName(), soakingCoef / GameConstants.ENVIRO_TICK_RATE, pItem.GetWet()), parentItem != null);
1097 soakingCoef = GetWetDelta();
1098 #ifdef ENABLE_LOGGING
1099 LogDryWetProcess(
string.Format(
"%1 (soak coef=%2/s, current wetness=%3) [normal]", pItem.GetDisplayName(), soakingCoef / GameConstants.ENVIRO_TICK_RATE, pItem.GetWet()), parentItem != null);
1103 pItem.AddWet(soakingCoef);
1105 if (itemData.m_Attachments.Count() > 0)
1106 ApplyWetnessToItem(itemData.m_Attachments);
1107 if (itemData.m_Cargo.Count() > 0)
1108 ApplyWetnessToItem(itemData.m_Cargo);
1117 foreach (
ItemBase item, EnvironmentEntityData itemAttributes : itemDataCached)
1118 ApplyWetnessToItem(item, itemAttributes);
1126 protected void ProcessItemsDryness()
1128 #ifdef ENABLE_LOGGING
1129 LogDryWetProcess(
string.Format(
"Environment :: ProcessItemsDryness (update interval=%1s)", GameConstants.ENVIRO_TICK_RATE));
1131 EnvironmentDrynessData drynessData =
new EnvironmentDrynessData();
1132 drynessData.m_UseTemperatureSources = m_HasTemperatureSources;
1134 if (m_HasTemperatureSources)
1136 float distance = vector.Distance(m_UTemperatureSources[0].
GetPosition(),
m_Player.GetPosition());
1137 distance = Math.Max(distance, 0.1);
1138 drynessData.m_TemperatureSourceDistance = distance;
1139 #ifdef ENABLE_LOGGING
1140 LogDryWetProcess(
string.Format(
"distance to heatsource: %1 m", distance));
1144 foreach (
ItemBase item, EnvironmentEntityData attributes : m_EnvironmentEntityDataCache)
1145 ApplyDrynessToItemEx(item, drynessData);
1147 #ifdef ENABLE_LOGGING
1148 LogDryWetProcess(
"==========");
1152 protected void ApplyDrynessToItem(
ItemBase pItem)
1154 EnvironmentDrynessData drynessData =
new EnvironmentDrynessData();
1155 ApplyDrynessToItemEx(pItem, drynessData);
1159 protected void ApplyDrynessToItemEx(
ItemBase pItem, EnvironmentDrynessData pDrynessData, EnvironmentEntityData itemAttributes = null)
1161 EnvironmentEntityData itemData;
1162 if (pItem && !itemAttributes)
1163 itemData = m_EnvironmentEntityDataCache.Get(pItem);
1164 else if (pItem && itemAttributes)
1165 itemData = itemAttributes;
1169 float dryingIncrement = pItem.GetDryingIncrement(EEnvironmentDryingCategories.PLAYER);
1170 if (pDrynessData.m_UseTemperatureSources)
1171 dryingIncrement = pItem.GetDryingIncrement(EEnvironmentDryingCategories.PLAYER_HEATSOURCE);
1174 bool isParentWet =
false;
1175 bool parentContainsLiquid =
false;
1177 if (itemData.m_InventoryLocation != null)
1179 EntityAI parent = itemData.m_InventoryLocation.GetParent();
1182 parentItem =
ItemBase.Cast(parent);
1185 if (parentItem.GetWet() >= GameConstants.STATE_SOAKING_WET)
1188 if ((parentItem.GetLiquidType() != 0) && (parentItem.GetQuantity() > 0))
1189 parentContainsLiquid =
true;
1192 if ((itemData.m_Wetness > m_ItemsWetnessMax) && (parent ==
m_Player))
1193 m_ItemsWetnessMax = itemData.m_Wetness;
1197 float dryingCoef = 0;
1198 float normalizedTemp = Math.Clamp(Math.InverseLerp(GameConstants.ENVIRO_LOW_TEMP_LIMIT, GameConstants.ENVIRO_HIGH_TEMP_LIMIT, GetEnvironmentTemperature()), 0.0, 2.0);
1199 float temperatureCoef = Math.Clamp(normalizedTemp * normalizedTemp * 10.5, 0.1, 4.0);
1201 if (!isParentWet && !parentContainsLiquid)
1203 dryingCoef = (-1 * GameConstants.ENVIRO_TICK_RATE * dryingIncrement * temperatureCoef) / pDrynessData.m_TemperatureSourceDistance;
1204 if (itemData.m_Wetness >= GameConstants.STATE_DAMP)
1206 #ifdef ENABLE_LOGGING
1207 LogDryWetProcess(
string.Format(
"%1 (dry coef=%2/s, tempCoef=%3, current wetness=%4) [normal]", pItem.GetDisplayName(), dryingCoef / GameConstants.ENVIRO_TICK_RATE, temperatureCoef, pItem.GetWet()), parentItem != null);
1209 pItem.AddWet(dryingCoef);
1212 if (itemData.m_Attachments.Count() > 0)
1213 ApplyDrynessToItemEx(pDrynessData, itemData.m_Attachments);
1214 if (itemData.m_Cargo.Count() > 0)
1215 ApplyDrynessToItemEx(pDrynessData, itemData.m_Cargo);
1218 if (parentContainsLiquid)
1221 dryingCoef = (GameConstants.ENVIRO_TICK_RATE * pItem.GetSoakingIncrement(EEnvironmentSoakingCategories.PARENT_LIQUID) * temperatureCoef) / pDrynessData.m_TemperatureSourceDistance;
1222 #ifdef ENABLE_LOGGING
1223 LogDryWetProcess(
string.Format(
"%1 (dry coef=%2/s, tempCoef=%3, current wetness=%4) [parent contains liquid]", pItem.GetDisplayName(), dryingCoef / GameConstants.ENVIRO_TICK_RATE, temperatureCoef, pItem.GetWet()), parentItem != null);
1225 pItem.AddWet(dryingCoef);
1231 dryingCoef = (GameConstants.ENVIRO_TICK_RATE * pItem.GetSoakingIncrement(EEnvironmentSoakingCategories.PARENT_WET) * temperatureCoef) / pDrynessData.m_TemperatureSourceDistance;
1232 #ifdef ENABLE_LOGGING
1233 LogDryWetProcess(
string.Format(
"%1 (dry coef=%2/s, tempCoef=%3, current wetness=%4) [parent wet]", pItem.GetDisplayName(), dryingCoef / GameConstants.ENVIRO_TICK_RATE, temperatureCoef, pItem.GetWet()), parentItem != null);
1235 pItem.AddWet(dryingCoef);
1244 foreach (
ItemBase item, EnvironmentEntityData itemAttributes : itemDataCached)
1245 ApplyDrynessToItemEx(item, pDrynessData, itemAttributes);
1253 protected void ProcessHeatComfort()
1255 float hcPenaltyTotal
1258 float hcBodyPartTotal, hcBodyPart;
1259 float hBodyPartTotal, hBodyPart;
1261 float heatComfortSum = 0.0;
1262 float heatItems = 0.0;
1264 #ifdef ENABLE_LOGGING
1265 LogItemHeat(
"====================");
1267 BodyPartHeatProperties(InventorySlots.HEADGEAR, GameConstants.ENVIRO_HEATCOMFORT_HEADGEAR_WEIGHT, hcBodyPart, hBodyPart);
1268 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1269 BodyPartHeatProperties(InventorySlots.MASK, GameConstants.ENVIRO_HEATCOMFORT_MASK_WEIGHT, hcBodyPart, hBodyPart);
1270 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1271 BodyPartHeatProperties(InventorySlots.VEST, GameConstants.ENVIRO_HEATCOMFORT_VEST_WEIGHT, hcBodyPart, hBodyPart);
1272 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1273 BodyPartHeatProperties(InventorySlots.BODY, GameConstants.ENVIRO_HEATCOMFORT_BODY_WEIGHT, hcBodyPart, hBodyPart);
1274 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1275 BodyPartHeatProperties(InventorySlots.BACK, GameConstants.ENVIRO_HEATCOMFORT_BACK_WEIGHT, hcBodyPart, hBodyPart);
1276 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1277 BodyPartHeatProperties(InventorySlots.GLOVES, GameConstants.ENVIRO_HEATCOMFORT_GLOVES_WEIGHT, hcBodyPart, hBodyPart);
1278 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1279 BodyPartHeatProperties(InventorySlots.LEGS, GameConstants.ENVIRO_HEATCOMFORT_LEGS_WEIGHT, hcBodyPart, hBodyPart);
1280 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1281 BodyPartHeatProperties(InventorySlots.FEET, GameConstants.ENVIRO_HEATCOMFORT_FEET_WEIGHT, hcBodyPart, hBodyPart);
1282 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1283 BodyPartHeatProperties(InventorySlots.HIPS, GameConstants.ENVIRO_HEATCOMFORT_HIPS_WEIGHT, hcBodyPart, hBodyPart);
1284 hcBodyPartTotal += hcBodyPart; hBodyPartTotal += hBodyPart;
1286 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.HEADGEAR, GameConstants.ENVIRO_HEATCOMFORT_HEADGEAR_WEIGHT);
1287 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.MASK, GameConstants.ENVIRO_HEATCOMFORT_MASK_WEIGHT);
1288 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.BODY, GameConstants.ENVIRO_HEATCOMFORT_BODY_WEIGHT);
1289 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.GLOVES, GameConstants.ENVIRO_HEATCOMFORT_GLOVES_WEIGHT);
1290 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.LEGS, GameConstants.ENVIRO_HEATCOMFORT_LEGS_WEIGHT);
1291 hcPenaltyTotal += NakedBodyPartHeatComfortPenalty(InventorySlots.FEET, GameConstants.ENVIRO_HEATCOMFORT_FEET_WEIGHT);
1293 heatItems = hBodyPartTotal;
1294 heatComfortSum = hcBodyPartTotal;
1295 heatComfortSum += hcPenaltyTotal;
1299 if (
m_Player.GetStomach().GetStomachVolume() > 0.0)
1301 float stomachContentTemperature =
m_Player.GetStomach().GetStomachTemperature();
1302 if (stomachContentTemperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT)
1304 stomachContentTemperature = Math.Remap(
1306 GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT,
1307 -GameConstants.ENVIRO_STOMACH_WEIGHT,
1309 stomachContentTemperature,
1312 else if (stomachContentTemperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
1314 stomachContentTemperature = Math.Remap(
1315 GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT,
1318 GameConstants.ENVIRO_STOMACH_WEIGHT,
1319 stomachContentTemperature,
1323 stomachContentTemperature = 0.0;
1325 heatComfortSum += stomachContentTemperature * GameConstants.ENVIRO_STOMACH_WEIGHT;
1329 float targetHeatComfort = (heatComfortSum + heatItems + (m_PlayerHeat / 100)) + EnvTempToCoef(m_EnvironmentTemperature);
1332 m_EnvironmentSnapshot.m_ClothingHeatComfort = hcBodyPartTotal;
1333 m_EnvironmentSnapshot.m_TargetHeatComfort = targetHeatComfort;
1334 ProcessHeatBuffer(m_EnvironmentSnapshot);
1337 targetHeatComfort = Math.Clamp(targetHeatComfort, 0.0,
m_Player.GetStatHeatComfort().GetMax());
1339 targetHeatComfort = Math.Clamp(targetHeatComfort,
m_Player.GetStatHeatComfort().GetMin(),
m_Player.GetStatHeatComfort().GetMax());
1341 targetHeatComfort = Math.Round(targetHeatComfort * 100) * 0.01;
1343 float dynamicHeatComfort;
1346 float direction = 1.0;
1347 if (targetHeatComfort < 0.0)
1350 if (Math.AbsFloat(targetHeatComfort - m_HeatComfort) <= GameConstants.ENVIRO_HEATCOMFORT_MAX_STEP_SIZE)
1351 dynamicHeatComfort = m_AverageHeatComfortBuffer.Add(targetHeatComfort);
1353 dynamicHeatComfort = m_AverageHeatComfortBuffer.Add((Math.AbsFloat(targetHeatComfort) - GameConstants.ENVIRO_HEATCOMFORT_MAX_STEP_SIZE) * direction);
1356 dynamicHeatComfort = Math.Round(dynamicHeatComfort * 100) * 0.01;
1358 m_HeatComfort = dynamicHeatComfort;
1360 SetTargetHeatComfort(targetHeatComfort);
1361 m_Player.GetStatHeatComfort().Set(m_HeatComfort);
1364 protected void SetTargetHeatComfort(
float value)
1366 m_TargetHeatComfort = Math.Clamp(value, -1.0, 1.0);
1369 protected void SetHeatcomfortDirectly()
1371 float targetHeatComfort = 0.0;
1372 float dynamicHeatComfort = 0.0;
1374 float speed, normalizedSpeed;
1375 float heatcomfortMax;
1378 switch (m_HeatComfortBehaviorCategory)
1381 dynamicHeatComfort = m_AverageHeatComfortBuffer.Add(targetHeatComfort);
1382 m_HeatComfort = dynamicHeatComfort;
1384 SetTargetHeatComfort(targetHeatComfort);
1385 m_Player.GetStatHeatComfort().Set(dynamicHeatComfort);
1390 if (m_TargetHeatComfortRaw == 0.0)
1392 ProcessHeatComfort();
1393 m_TargetHeatComfortRaw = m_TargetHeatComfort;
1396 targetHeatComfort = m_TargetHeatComfortRaw;
1400 speed = Math.Round(Math.AbsFloat(motorbike.GetSpeedometerAbsolute()));
1401 normalizedSpeed = Math.Clamp(speed / (
float)(GameConstants.ENVIRO_HEATCOMFORT_MOTORBIKE_SPEED_MAX - GameConstants.ENVIRO_HEATCOMFORT_MOTORBIKE_SPEED_MIN), 0.0, 1.0);
1403 heatcomfortMax = GameConstants.ENVIRO_HEATCOMFORT_MOTORBIKE_TARGET_MAX - motorbike.GetHeatComfortOverride();
1404 result = Easing.EaseInCubic(normalizedSpeed) * heatcomfortMax;
1405 targetHeatComfort = Math.Clamp(result, -1.0, heatcomfortMax);
1406 targetHeatComfort = m_TargetHeatComfortRaw - targetHeatComfort;
1408 dynamicHeatComfort = m_AverageHeatComfortBuffer.Add(targetHeatComfort);
1409 m_HeatComfort = dynamicHeatComfort;
1411 SetTargetHeatComfort(targetHeatComfort);
1412 m_Player.GetStatHeatComfort().Set(dynamicHeatComfort);
1418 if (m_TargetHeatComfortRaw == 0.0)
1420 ProcessHeatComfort();
1421 m_TargetHeatComfortRaw = m_TargetHeatComfort;
1424 targetHeatComfort = m_TargetHeatComfortRaw;
1425 BoatScript boat = BoatScript.Cast(
m_Player.GetParent());
1428 speed = Math.Round(Math.AbsFloat(boat.GetSpeedometerAbsolute()));
1429 normalizedSpeed = Math.Clamp(speed / (
float)(GameConstants.ENVIRO_HEATCOMFORT_BOAT_SPEED_MAX - GameConstants.ENVIRO_HEATCOMFORT_BOAT_SPEED_MIN), 0.0, 1.0);
1432 result = Easing.EaseInCubic(normalizedSpeed) * heatcomfortMax;
1433 targetHeatComfort = Math.Clamp(result, -1.0, heatcomfortMax);
1434 targetHeatComfort = m_TargetHeatComfortRaw - targetHeatComfort;
1436 dynamicHeatComfort = m_AverageHeatComfortBuffer.Add(targetHeatComfort);
1437 m_HeatComfort = dynamicHeatComfort;
1439 SetTargetHeatComfort(targetHeatComfort);
1440 m_Player.GetStatHeatComfort().Set(dynamicHeatComfort);
1449 protected void ProcessHeatBuffer(EnvironmentSnapshotData data)
1453 float applicableHeatbuffer = GetApplicableHeatbuffer();
1456 float heatBufferCap = Math.InverseLerp(0.0, GameConstants.ENVIRO_HEATCOMFORT_WEIGHT_SUMMARY, data.m_ClothingHeatComfort);
1457 float heatBufferMax = GameConstants.ENVIRO_PLAYER_HEATBUFFER_CAPACITY_MIN + heatBufferCap * (1 - GameConstants.ENVIRO_PLAYER_HEATBUFFER_CAPACITY_MIN);
1458 m_Player.SetHeatBufferDynamicMax(heatBufferMax);
1463 if (heatBufferCap < m_HeatBufferCapPrevious)
1465 float heatBufferValueCorrection = GameConstants.ENVIRO_PLAYER_HEATBUFFER_INCREASE / (heatBufferMax * ((-GameConstants.ENVIRO_PLAYER_HEATBUFFER_TEMP_AFFECT * data.m_TargetHeatComfort) + 1 ));
1466 heatBuffer.Add(-heatBufferValueCorrection);
1467 m_HeatBufferCapPrevious = heatBufferCap;
1470 float increaseRate = 0.0;
1471 float decreaseRate = 0.0;
1474 increaseRate = GameConstants.ENVIRO_PLAYER_HEATBUFFER_INCREASE / (heatBufferMax * (( -GameConstants.ENVIRO_PLAYER_HEATBUFFER_TEMP_AFFECT * data.m_TargetHeatComfort) + 1 ));
1475 decreaseRate = GameConstants.ENVIRO_PLAYER_HEATBUFFER_DECREASE / (heatBufferMax * (( GameConstants.ENVIRO_PLAYER_HEATBUFFER_TEMP_AFFECT * data.m_TargetHeatComfort) + 1 ));
1477 float decreaseRateByHeatBufferStageCoef = 1;
1479 if (heatBufferMax > HeatBufferMdfr.STAGE_THRESHOLDS[1])
1481 float heatBufferMaxInversed = Math.InverseLerp(HeatBufferMdfr.STAGE_THRESHOLDS[1], 1.0, heatBufferMax);
1482 switch (
m_Player.GetHeatBufferStage())
1485 decreaseRateByHeatBufferStageCoef = Math.Lerp(
1486 GameConstants.ENVIRO_PLAYER_HEATBUFFER_STAGE_RATELIMIT[2][0],
1487 GameConstants.ENVIRO_PLAYER_HEATBUFFER_STAGE_RATELIMIT[2][1],
1488 heatBufferMaxInversed,
1492 decreaseRateByHeatBufferStageCoef = Math.Lerp(
1493 GameConstants.ENVIRO_PLAYER_HEATBUFFER_STAGE_RATELIMIT[1][0],
1494 GameConstants.ENVIRO_PLAYER_HEATBUFFER_STAGE_RATELIMIT[1][1],
1495 heatBufferMaxInversed,
1502 decreaseRateByHeatBufferStageCoef = GameConstants.ENVIRO_PLAYER_HEATBUFFER_STAGE_RATELIMIT[1][0];
1505 decreaseRate *= decreaseRateByHeatBufferStageCoef;
1508 decreaseRate *= GameConstants.ENVIRO_PLAYER_HEATBUFFER_WATEREFFECT * m_WaterLevel;
1511 if (!m_HasTemperatureSources)
1515 if (m_HeatBufferTimer >= 1.0)
1516 heatBuffer.Add(-decreaseRate);
1518 m_HeatBufferTimer = 1.0;
1522 m_HeatBufferTimer = 0.0;
1523 if (applicableHeatbuffer > 0.0)
1524 heatBuffer.Add(-decreaseRate);
1525 else if (applicableHeatbuffer != 0.0 && !
m_Player.GetModifiersManager().IsModifierActive(
eModifiers.MDF_HEATBUFFER))
1526 heatBuffer.Set(0.0);
1531 if (m_HeatComfort > PlayerConstants.THRESHOLD_HEAT_COMFORT_MINUS_WARNING && m_UTSAverageTemperature > 0)
1533 if (applicableHeatbuffer < heatBufferMax)
1535 heatBuffer.Add(increaseRate);
1536 m_HeatBufferCapPrevious = heatBufferCap;
1539 else if (applicableHeatbuffer > 0.0)
1540 heatBuffer.Add(-decreaseRate);
1541 else if (applicableHeatbuffer != 0.0 && !
m_Player.GetModifiersManager().IsModifierActive(
eModifiers.MDF_HEATBUFFER))
1542 heatBuffer.Set(0.0);
1544 m_HeatBufferTimer = 0.0;
1549 protected float GetApplicableHeatbuffer()
1552 float applicableHeatbuffer = Math.Round((heatBuffer.Get() / heatBuffer.GetMax()) * 1000) * 0.001;
1554 return applicableHeatbuffer;
1563 protected void ProcessItemsTemperature(array<int> pBodyPartIds)
1565 foreach (
ItemBase item, EnvironmentEntityData attributes : m_EnvironmentEntityDataCache)
1569 float heatPermCoef = item.GetHeatPermeabilityCoef();
1572 SetProcessedItemTemperature(item, heatPermCoef);
1574 ProcessItemHierarchyRecursive(item, heatPermCoef);
1582 protected void ProcessItemsInHandsTemperature()
1587 float heatPermCoef = item.GetHeatPermeabilityCoef();
1590 SetProcessedItemTemperature(item, heatPermCoef);
1592 ProcessItemHierarchyRecursive(item, heatPermCoef);
1596 protected void ProcessItemHierarchyRecursive(
ItemBase item,
float heatPermeabilityCoef = 1.0)
1598 float heatPermCoef = heatPermeabilityCoef;
1601 EnvironmentEntityData itemData;
1602 if (m_EnvironmentEntityDataCache.Find(item, itemData))
1604 foreach (
ItemBase attachment, EnvironmentEntityData attachmentAttributes : itemData.m_Attachments)
1606 heatPermCoef = heatPermeabilityCoef;
1607 heatPermCoef *= attachment.GetHeatPermeabilityCoef();
1610 SetProcessedItemTemperature(attachment, heatPermCoef);
1612 ProcessItemHierarchyRecursive(attachment, heatPermCoef);
1615 foreach (
ItemBase cargo, EnvironmentEntityData cargoAttributes : itemData.m_Cargo)
1617 heatPermCoef = heatPermeabilityCoef;
1618 heatPermCoef *= cargo.GetHeatPermeabilityCoef();
1621 SetProcessedItemTemperature(cargo, heatPermCoef);
1623 ProcessItemHierarchyRecursive(cargo, heatPermCoef);
1628 protected void SetProcessedItemTemperature(
ItemBase item,
float heatPermeabilityCoef = 1.0)
1630 float targetTemperature = GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE;
1631 bool globalCooling =
true;
1635 SetItemHeatingCoef(GameConstants.TEMP_COEF_SWIMMING);
1637 globalCooling =
false;
1640 if (item.GetTemperature() != targetTemperature || !item.IsFreezeThawProgressFinished())
1642 TemperatureDataInterpolated temperatureData =
new TemperatureDataInterpolated(
1645 GameConstants.ENVIRO_TICK_RATE,
1646 m_ItemTemperatureCoef,
1647 heatPermeabilityCoef,
1649 temperatureData.m_UseGlobalCooling = globalCooling;
1651 item.SetTemperatureEx(temperatureData);
1657 protected float EnvTempToCoef(
float pTemp)
1659 return (pTemp - GameConstants.ENVIRO_PLAYER_COMFORT_TEMP) / GameConstants.ENVIRO_TEMP_EFFECT_ON_PLAYER;
1669 protected void BodyPartHeatProperties(
int pBodyPartId,
float pCoef, out
float pHeatComfort, out
float pHeat)
1674 foreach (
ItemBase item, EnvironmentEntityData attributes : m_EnvironmentEntityDataCache)
1676 if (attributes.m_SlotId == pBodyPartId)
1678 #ifdef ENABLE_LOGGING
1679 LogItemHeat(
string.Format(
"BodyPartHeatProperties (%1)", EnumTools.EnumToString(InventorySlots, pBodyPartId)));
1682 float itemHeatcomfort = 0;
1683 float itemTemperature = 0;
1686 foreach (
ItemBase attachmentItem, EnvironmentEntityData attachmentAttributes : attributes.m_Attachments)
1688 #ifdef ENABLE_LOGGING
1689 LogItemHeat(
string.Format(
"attachments:"),
false);
1691 if (attachmentAttributes.m_HasTemperature)
1693 itemTemperature = attachmentAttributes.m_Temperature;
1694 itemHeatcomfort = attachmentAttributes.m_HeatComfort;
1695 #ifdef ENABLE_LOGGING
1696 LogItemHeat(
string.Format(
"%1: temperature=%2 heat=%3", attachmentItem, itemTemperature, pHeat),
true);
1698 pHeat += itemHeatcomfort;
1702 foreach (
ItemBase cargoItem, EnvironmentEntityData cargoAttributes : attributes.m_Cargo)
1704 #ifdef ENABLE_LOGGING
1705 LogItemHeat(
string.Format(
"cargo:"),
false);
1707 if (cargoAttributes.m_HasTemperature)
1709 itemTemperature = cargoAttributes.m_Temperature;
1710 itemHeatcomfort = cargoAttributes.m_HeatComfort;
1711 #ifdef ENABLE_LOGGING
1712 LogItemHeat(
string.Format(
"%1: temperature=%2 heat=%3", cargoItem, itemTemperature, itemHeatcomfort),
true);
1714 pHeat += itemHeatcomfort;
1718 pHeatComfort = MiscGameplayFunctions.GetCurrentItemHeatIsolation(item) * pCoef;
1720 #ifdef ENABLE_LOGGING
1721 LogItemHeat(
string.Format(
"overall heat from items=%1 (coef applied)", pHeat));
1736 protected float NakedBodyPartHeatComfortPenalty(
int pBodyPartSlotId,
float pCoef)
1738 float penalty = 0.0;
1740 if (!IsInsideBuilding() && !
IsUnderRoof() && !IsChildOfType({Car}) && !IsWaterContact())
1742 if (m_Rain > GameConstants.ENVIRO_NAKED_BODY_PENALTY_RAIN_MIN_VALUE || m_Snowfall > GameConstants.ENVIRO_NAKED_BODY_PENALTY_SNOWFALL_MIN_VALUE)
1744 if (
m_Player.GetInventory().FindAttachment(pBodyPartSlotId))
1747 penalty += GameConstants.ENVIRO_ISOLATION_WETFACTOR_DRENCHED;
1760 protected void GatherTemperatureSources()
1762 m_UTemperatureSources.Clear();
1765 vector pos =
m_Player.GetPosition();
1766 vector minPos = pos -
Vector(GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS, GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS / 2, GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS);
1767 vector maxPos = pos +
Vector(GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS, GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS / 2, GameConstants.ENVIRO_TEMP_SOURCES_LOOKUP_RADIUS);
1769 array<EntityAI> nearestObjects = {};
1772 foreach (
EntityAI nearestEntity : nearestObjects)
1774 if (nearestEntity.IsUniversalTemperatureSource() && nearestEntity !=
m_Player)
1777 if (!nearestEntity.GetUniversalTemperatureSource().GetLambda().AffectsPlayer())
1781 if (vector.DistanceSq(pos, nearestEntity.GetPosition()) > Math.SqrFloat(nearestEntity.GetUniversalTemperatureSource().GetMaxRange()))
1784 m_UTemperatureSources.Insert(nearestEntity.GetUniversalTemperatureSource());
1789 if (inHandsItem && inHandsItem.IsUniversalTemperatureSource())
1790 m_UTemperatureSources.Insert(inHandsItem.GetUniversalTemperatureSource());
1796 protected void ProcessTemperatureSources()
1798 int UTScount = m_UTemperatureSources.Count();
1801 m_HasTemperatureSources =
false;
1802 OnTemperatureSourcesLeft();
1803 m_UTSAverageTemperatureBuffer.Add(0.0);
1804 m_UTSAverageTemperature = 0.0;
1805 SetItemHeatingCoef(GameConstants.TEMP_COEF_INVENTORY);
1813 float itemCoefAverage = 0.0;
1814 foreach (UTemperatureSource tempSource : m_UTemperatureSources)
1816 utsTemperatures.Insert(CalcTemperatureFromTemperatureSource(tempSource));
1817 itemCoefAverage += tempSource.GetTemperatureItemCoef();
1819 itemCoefAverage /= UTScount;
1820 SetItemHeatingCoef(itemCoefAverage);
1822 float min = MiscGameplayFunctions.GetMinValue(utsTemperatures);
1823 float max = MiscGameplayFunctions.GetMaxValue(utsTemperatures);
1825 if (max > 0 && min < 0)
1828 m_UTSAverageTemperature = m_UTSAverageTemperatureBuffer.Add((max + min) * 0.5);
1832 m_UTSAverageTemperature = m_UTSAverageTemperatureBuffer.Add(max);
1835 if (m_HasTemperatureSources ==
false)
1836 OnTemperatureSourcesEnter();
1838 m_HasTemperatureSources =
true;
1841 protected void SetItemHeatingCoef(
float val)
1843 m_ItemTemperatureCoef = val;
1849 protected void OnTemperatureSourcesEnter();
1854 protected void OnTemperatureSourcesLeft();
1856 float GetUniversalSourcesTemperageAverage()
1858 return m_UTSAverageTemperature;
1861 float CalcTemperatureFromTemperatureSource(notnull UTemperatureSource uts)
1863 float distance = vector.Distance(
m_Player.GetPosition(), uts.GetPosition());
1864 distance = Math.Max(distance, 0.1);
1865 float temperature = 0;
1868 if (distance > uts.GetFullRange())
1870 float distFactor = Math.InverseLerp(uts.GetMaxRange(), uts.GetFullRange(), distance);
1871 temperature = uts.GetTemperatureCap() * distFactor;
1875 temperature = uts.GetTemperatureCap();
1884 #ifdef DIAG_DEVELOPER
1885 EnvDebugData GetEnvDebugData()
1887 EnvDebugData data =
new EnvDebugData();
1892 void ShowEnvDebugPlayerInfo(
bool enabled)
1894 EnvDebugData data = GetEnvDebugData();
1895 DisplayEnvDebugPlayerInfo(enabled, data);
1898 static void DisplayEnvDebugPlayerInfo(
bool enabled, EnvDebugData data)
1908 DbgUI.Text(
string.Format(
"Heat comfort(target): %1", data.m_PlayerData.m_HeatComfortTarget));
1909 DbgUI.Text(
string.Format(
"Heat comfort(dynamic): %1", data.m_PlayerData.m_HeatComfortDynamic));
1910 DbgUI.Text(
string.Format(
"Inside: %1 (%2)", data.m_PlayerData.m_Inside, data.m_PlayerData.m_Surface));
1911 DbgUI.Text(
string.Format(
"Under roof: %1 (%2)", data.m_PlayerData.m_UnderRoof, data.m_PlayerData.m_UnderRoofTimer));
1912 if ( data.m_PlayerData.m_WaterLevel > 0 )
1914 DbgUI.Text(
string.Format(
"Water Level: %1", data.m_PlayerData.m_WaterLevel));
1923 DbgUI.Text(
string.Format(
"Env temperature (base): %1", data.m_MiscData.m_TemperatureBase));
1924 DbgUI.Text(
string.Format(
"Env temperature (height corrected): %1", data.m_MiscData.m_HeightCorrectedTemperature));
1925 DbgUI.Text(
string.Format(
"Env temperature (modfied): %1", data.m_MiscData.m_TemperatureModified));
1926 DbgUI.Text(
string.Format(
"Wind magnitude(surface mult): %1 (x%2)", data.m_WeatherData.m_Wind, data.m_WeatherData.m_WindModifier));
1927 DbgUI.Text(
string.Format(
"Rain: %1", data.m_WeatherData.m_Rain));
1928 DbgUI.Text(
string.Format(
"Snow: %1", data.m_WeatherData.m_Snowfall));
1929 DbgUI.Text(
string.Format(
"Datetime: %1", WorldDataDaytime.ToString(
g_Game.GetMission().GetWorldData().GetDaytime())));
1930 DbgUI.Text(
string.Format(
"Fog: %1", data.m_WeatherData.m_Fog));
1931 DbgUI.Text(
string.Format(
"Clouds: %1", data.m_WeatherData.m_Clouds));
1932 DbgUI.Text(
string.Format(
"Wet delta: %1", data.m_MiscData.m_WetDelta));
1937 void FillDebugWeatherData(EnvDebugWeatherData data)
1939 data.m_Wind = m_Wind;
1940 data.m_WindModifier = GetWindModifierPerSurface();
1941 data.m_Rain = m_Rain;
1942 data.m_Snowfall = m_Snowfall;
1944 data.m_Clouds = m_Clouds;
1948 string GetDebugMessage()
1951 message +=
"Player stats";
1952 message +=
"\nHeat comfort(target): " + GetTargetHeatComfort().
ToString();
1953 message +=
"\nHeat comfort(dynamic): " + m_HeatComfort.
ToString();
1956 string impact, surfaceType;
1957 g_Game.SurfaceUnderObjectExCorrectedLiquid(
m_Player, surfaceType, impact, liquidType);
1959 bool insideBuilding = IsInsideBuilding();
1960 message +=
"\nInside: " + insideBuilding.
ToString();
1961 message +=
"\nSurface: " + surfaceType;
1962 message +=
"\nLiquid: " + liquidType;
1964 string roofCheckRemaining = GetNextRoofCheck().
ToString();
1965 string shadowCheckRemaining = GetNextShadowCheck().
ToString();
1968 roofCheckRemaining =
string.
Format(
"%1, inside override", roofCheckRemaining);
1969 shadowCheckRemaining =
string.
Format(
"%1, inside override", shadowCheckRemaining);
1971 message +=
"\nUnder roof: " + m_IsUnderRoof.
ToString() +
" (" + roofCheckRemaining +
")";
1972 message +=
"\nIn Shadow: " + IsInShadow().
ToString() +
" (" + shadowCheckRemaining +
")";
1974 if (IsWaterContact() && m_WaterLevel > WATER_LEVEL_NONE)
1976 message +=
"\nWater Level: " + m_WaterLevel;
1979 message +=
"\n\nWeather stats";
1982 message +=
"\nEnv temperature (modified): " + m_EnvironmentTemperature.
ToString();
1983 message +=
"\nWind: " + m_Wind.
ToString() +
" (x" + GetWindModifierPerSurface() +
")";
1984 message +=
"\nRain: " + m_Rain.
ToString();
1985 message +=
"\nSnow: " + m_Snowfall.
ToString();
1986 message +=
"\nDaytime: " + WorldDataDaytime.
ToString(m_DayTime);
1987 message +=
"\nFog: " + m_Fog.
ToString();
1988 message +=
"\nClouds: " + m_Clouds.
ToString();
1989 message +=
"\nWet delta: " + GetWetDelta().
ToString();
1994 int GetNextRoofCheck()
1996 return (GameConstants.ENVIRO_TICK_ROOF_RC_CHECK - m_RoofCheckTimer) + 1;
1999 int GetNextShadowCheck()
2001 return (GameConstants.ENVIRO_TICK_SHADOW_RC_CHECK - m_ShadowCheckTimer) + 1;
2004 float GetWaterLevel()
2006 if (IsWaterContact() && m_WaterLevel > WATER_LEVEL_NONE)
2008 return m_WaterLevel;
2014 private bool IsNeutralTemperature(
float temperature,
float lowerLimit = GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT,
float upperLimit = GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
2016 if (temperature >= lowerLimit && temperature <= upperLimit)
2022 private float NormalizedTemperature(
float temperature,
float lowerLimit = GameConstants.ENVIRO_LOW_TEMP_LIMIT,
float upperLimit = GameConstants.ENVIRO_HIGH_TEMP_LIMIT)
2024 if (temperature >= GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT && temperature <= GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
2027 if (temperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT)
2028 return Math.Clamp(Math.InverseLerp(lowerLimit, GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT, temperature), -1.0, -0.1);
2030 if (temperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
2031 return Math.Clamp(Math.InverseLerp(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT, upperLimit, temperature), 0.1, 1.0);
2037 private float HeadGearProtectionAgainstSun()
2039 float isolation = 0;
2040 GameInventory playerInventory =
m_Player.GetInventory();
2042 for (
int attIdx = 0; attIdx < attCount; ++attIdx)
2045 if (attachment.IsClothing())
2048 int attachmentSlot = attachment.GetInventory().GetSlotId(0);
2050 if (attachmentSlot == InventorySlots.HEADGEAR)
2052 isolation = MiscGameplayFunctions.GetCurrentItemHeatIsolation(item);
2056 return HC_EXPOSED_HEAD_TO_SUN;
2062 return (isolation * HC_EXPOSED_HEAD_TO_SUN) + 0.4;
2064 return HC_EXPOSED_HEAD_TO_SUN;
2067 #ifdef ENABLE_LOGGING
2068 private void LogDryWetProcess(
string message,
bool indented =
false)
2070 if (m_DebugLogDryWet)
2072 string indentation =
"";
2074 indentation =
"|--";
2076 Debug.Log(
string.Format(
"%1 %2", indentation, message));
2081 #ifdef ENABLE_LOGGING
2082 private void LogItemHeat(
string message,
bool indented =
false)
2084 if (m_DebugLogItemHeat)
2086 string indentation =
"";
2088 indentation =
"|--";
2090 Debug.Log(
string.Format(
"%1 %2", indentation, message));
2098 protected float m_HeatSourceTemp;
2099 protected ref SimpleMovingAverage<float> m_WindAverageBuffer;
2100 protected ref EnvironmentSnapshotData m_EnvironmentSnapshot;
2102 void Init(PlayerBase pPlayer)
2107 protected bool OverridenHeatComfort(out
float value);
2108 void AddToEnvironmentTemperature(
float pTemperature);
2110 protected void ProcessItemsHeat()
2113 ProcessHeatComfort();
2116 protected void ProcessWetnessByRain()
2118 ProcessItemsWetness(m_SlotIdsComplete);
2122 float GetTemperatureHeightCorrection()
2125 return temperature_reduction;
2129 protected void BodyPartHeatProperties(array<int> pBodyPartIds,
float pCoef, out
float pHeatComfort, out
float pHeat)
2134 if (pBodyPartIds.Count() > 0)
2136 #ifdef ENABLE_LOGGING
2137 LogItemHeat(
string.Format(
"BodyPartHeatProperties (%1)", EnumTools.EnumToString(InventorySlots, pBodyPartIds[0])));
2140 int attCount =
m_Player.GetInventory().AttachmentCount();
2141 for (
int attIdx = 0; attIdx < attCount; ++attIdx)
2143 EntityAI attachment =
m_Player.GetInventory().GetAttachmentFromIndex(attIdx);
2144 if (attachment.IsClothing())
2147 int attachmentSlot = attachment.GetInventory().GetSlotId(0);
2150 for (
int i = 0; i < pBodyPartIds.Count(); ++i)
2152 if (attachmentSlot == pBodyPartIds[i])
2154 float heatIsoMult = 1.0;
2155 if (attachmentSlot == InventorySlots.BACK)
2156 heatIsoMult = GameConstants.ENVIRO_HEATISOLATION_BACK_WEIGHT;
2157 else if (attachmentSlot == InventorySlots.VEST)
2158 heatIsoMult = GameConstants.ENVIRO_HEATISOLATION_VEST_WEIGHT;
2160 pHeatComfort += heatIsoMult * MiscGameplayFunctions.GetCurrentItemHeatIsolation(item);
2162 float itemHeatcomfort = 0;
2163 float itemTemperature = 0;
2166 int inventoryAttCount = item.GetInventory().AttachmentCount();
2167 if (inventoryAttCount > 0)
2169 #ifdef ENABLE_LOGGING
2170 LogItemHeat(
string.Format(
"attachments:"),
false);
2172 for (
int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
2174 EntityAI inAttachment = item.GetInventory().GetAttachmentFromIndex(inAttIdx);
2176 if (attachmentItem && attachmentItem.CanHaveTemperature())
2178 itemTemperature = attachmentItem.GetTemperature();
2179 if (itemTemperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT || itemTemperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
2181 itemHeatcomfort = NormalizedTemperature(itemTemperature) * attachmentItem.GetQuantityNormalizedScripted() * attachmentItem.GetTemperaturePerQuantityWeight();
2182 #ifdef ENABLE_LOGGING
2183 LogItemHeat(
string.Format(
"%1: temperature=%2 heat=%3", attachmentItem, itemTemperature, pHeat),
true);
2184 pHeat += itemHeatcomfort;
2190 if (item.GetInventory().GetCargo())
2192 int inventoryItemCount = item.GetInventory().GetCargo().GetItemCount();
2194 if (inventoryItemCount > 0)
2196 #ifdef ENABLE_LOGGING
2197 LogItemHeat(
string.Format(
"cargo:"),
false);
2199 for (
int j = 0; j < inventoryItemCount; ++j)
2201 ItemBase inventoryItem =
ItemBase.Cast(item.GetInventory().GetCargo().GetItem(j));
2202 if (inventoryItem && inventoryItem.CanHaveTemperature())
2204 itemTemperature = inventoryItem.GetTemperature();
2205 if (itemTemperature < GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_LOWER_LIMIT || itemTemperature > GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_UPPER_LIMIT)
2207 itemHeatcomfort = NormalizedTemperature(itemTemperature) * inventoryItem.GetQuantityNormalizedScripted() * inventoryItem.GetTemperaturePerQuantityWeight();
2208 #ifdef ENABLE_LOGGING
2209 LogItemHeat(
string.Format(
"%1: temperature=%2 heat=%3", inventoryItem, itemTemperature, itemHeatcomfort),
true);
2211 pHeat += itemHeatcomfort;
2222 pHeatComfort += (pHeatComfort / pBodyPartIds.Count()) * pCoef;
2224 #ifdef ENABLE_LOGGING
2225 LogItemHeat(
string.Format(
"overall heat from items=%1 (coef applied)", pHeat));
2231 protected void SetEnvironmentSnapshotData()
2233 EnvironmentSnapshotData data =
new EnvironmentSnapshotData();
2234 data.m_TargetHeatComfort = m_TargetHeatComfort;
2236 m_EnvironmentSnapshot = data;
2240 protected void ProcessHeatBuffer(
float heatComfortCloths)
2242 m_EnvironmentSnapshot.m_ClothingHeatComfort = heatComfortCloths;
2243 m_EnvironmentSnapshot.m_TargetHeatComfort = m_TargetHeatComfort;
2245 ProcessHeatBuffer(m_EnvironmentSnapshot);
2249 protected float WindEffectTemperatureValue(
float temperatureInput)
2253 output = (temperatureInput - GameConstants.ENVIRO_WIND_CHILL_LIMIT) / (GameConstants.ENVIRO_WIND_EFFECT_SLOPE - GameConstants.ENVIRO_WIND_CHILL_LIMIT);
2254 output = output * m_Wind * m_WorldData.
GetWindCoef();
2259 float GetDayOrNight()
2264 protected bool IsInsideVehicle()
2266 return IsChildOfType({Car});
2270#ifdef DIAG_DEVELOPER
2271class EnvDebugPlayerData :
Param
2273 float m_HeatComfortDynamic;
2274 float m_HeatComfortTarget;
2279 int m_UnderRoofTimer;
2282 void Synch(Environment env, PlayerBase player)
2284 m_HeatComfortTarget = env.GetTargetHeatComfort();
2285 m_HeatComfortDynamic = player.GetStatHeatComfort().Get();
2286 m_Inside = env.IsInsideBuilding();
2287 m_InShadow = env.IsInShadow();
2289 m_UnderRoof = env.IsUnderRoof();
2290 m_UnderRoofTimer = env.GetNextRoofCheck();
2291 m_WaterLevel = env.GetWaterLevel();
2302 return ctx.
Read(m_HeatComfortTarget) && ctx.
Read(m_HeatComfortDynamic) && ctx.
Read(m_Inside) && ctx.
Read(m_InShadow) && ctx.
Read(
m_Surface) && ctx.
Read(m_UnderRoof) && ctx.
Read(m_UnderRoofTimer) && ctx.
Read(m_WaterLevel);
2306class EnvDebugMiscData :
Param
2308 float m_TemperatureBase;
2309 float m_TemperatureModified;
2310 float m_HeightCorrectedTemperature;
2313 void Synch(Environment env)
2315 m_TemperatureBase =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperature();
2316 m_TemperatureModified = env.GetTemperature();
2317 m_HeightCorrectedTemperature = m_TemperatureBase - env.GetTemperatureHeightCorrection();
2318 m_WetDelta = env.GetWetDelta();
2323 return ctx.
Write(m_TemperatureBase) && ctx.
Write(m_TemperatureModified) && ctx.
Write(m_HeightCorrectedTemperature) && ctx.
Write(m_WetDelta);
2328 return ctx.
Read(m_TemperatureBase) && ctx.
Read(m_TemperatureModified) && ctx.
Read(m_HeightCorrectedTemperature) && ctx.
Read(m_WetDelta);
2332class EnvDebugWeatherData :
Param
2335 float m_WindModifier;
2341 void Synch(Environment env)
2343 env.FillDebugWeatherData(
this);
2353 return ctx.
Read(m_Wind) && ctx.
Read(m_WindModifier) && ctx.
Read(m_Rain) && ctx.
Read(m_Snowfall) && ctx.
Read(m_Fog) && ctx.
Read(m_Clouds);
2357class EnvDebugData :
Param
2359 ref EnvDebugPlayerData m_PlayerData =
new EnvDebugPlayerData();
2360 ref EnvDebugMiscData m_MiscData =
new EnvDebugMiscData();
2361 ref EnvDebugWeatherData m_WeatherData =
new EnvDebugWeatherData();
2363 void Synch(Environment env, PlayerBase player)
2365 m_PlayerData.Synch(env, player);
2366 m_MiscData.Synch(env);
2367 m_WeatherData.Synch(env);
2372 return m_PlayerData.Serialize(ctx) && m_MiscData.Serialize(ctx) && m_WeatherData.Serialize(ctx);
2377 return m_PlayerData.Deserializer(ctx) && m_MiscData.Deserializer(ctx) && m_WeatherData.Deserializer(ctx);
ObtainLiquidActionReciveData m_LiquidType
@ PLAYER
indicates if driver is controlled by player
void DayZPlayerUtils()
cannot be instantiated
EEnvironmentTemperatureComponent
enum EEnvironmentHeatcomfortBehaviorCategory PARENT_LIQUID
EEnvironmentHeatcomfortBehaviorCategory
Categories that are changing behavior of Heat comfort processing.
class GP5GasMask extends MaskBase ItemBase
static bool IsUnderRoof(EntityAI entity, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
void PlayerStat(T min, T max, T init, string label, int flags)
class PresenceNotifierNoiseEvents windowPosX
dbgUI settings
void Synch(EntityAI victim)
keeping "step" here for consistency only
float m_Temperature
Player HC target(?) value.
float GetHeatComfortOverride()
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
bool OnContact(IEntity other, Contact contact)
override float GetCurrentWaterLevel()
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native CargoBase GetCargo()
cargo
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native float GetCurrentMovementSpeed()
0,1,2..3 idle, walk, run, sprint
int m_iMovement
current stance (DayZPlayerConstants.STANCEIDX_ERECT, ...), only if the command has a stance
override bool IsSelfAdjustingTemperature()
bool Deserializer(Serializer ctx)
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native Fog GetFog()
Returns a fog phenomenon object.
proto native WindMagnitude GetWindMagnitude()
Returns a wind magnitude phenomenon object.
proto native Snowfall GetSnowfall()
Returns a snowfall phenomenon object.
proto native Rain GetRain()
Returns a rain phenomenon object.
proto native Overcast GetOvercast()
Returns an overcast phenomenon object.
proto native float GetActual()
float GetTemperature(Object object, EEnvironmentTemperatureComponent properties=EEnvironmentTemperatureComponent.BASE)
Return actual temperature of environment based on provided parameters.
float GetSunEffectOnTemperature(int m_DayTime)
float GetBaseEnvTemperature()
float GetBaseEnvTemperatureAtObject(notnull Object object)
float m_WaterContactTemperatureModifier
float m_TemperaturePerHeightReductionModifier
directly accesible (defined/overriden in Init())
ref map< int, float > m_TemperatureUnderSunModifier
float m_TemperatureInsideBuildingsModifier
how many % of environment temperature can be lowered by clouds
float GetLiquidTypeEnviroTemperature(int liquidType)
float GetTemperatureComponentValue(float temperatureIn, EEnvironmentTemperatureComponent properties=0)
Return value of queried EEnvironmentTemperatureComponent which can be used in future calculation(s)
proto string ToString(bool simple=true)
proto vector Normalized()
return normalized vector (keeps orginal vector untouched)
static const vector Aside
vector Cross(vector v)
Returns cross product of this vector with passed vector.
DayZPlayerConstants
defined in C++
const int INDEX_NOT_FOUND
array< float > TFloatArray
const int LIQUID_STILLWATER
const int LIQUID_HOTWATER
const int LIQUID_FRESHWATER
const int LIQUID_RIVERWATER
const int LIQUID_SALTWATER
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
vector GetPosition()
Get the world position of the Effect.
static proto string ToString(void var, bool type=false, bool name=false, bool quotes=true)
Return string representation of variable.
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.
int ARGB(int a, int r, int g, int b)