Dayz Explorer 1.29.162510
Loading...
Searching...
No Matches
universaltemperaturesourcelambdabaseimpl.c
Go to the documentation of this file.
2{
3 override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
4 {
5 float distanceToTemperatureSource;
6
7 foreach (Object nearestObject : nearestObjects)
8 {
9 ItemBase nearestItem = ItemBase.Cast(nearestObject);
10 ItemBase temperatureSource = ItemBase.Cast(pSettings.m_Parent);
11
13 if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
14 {
15 distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
16 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.001);
17 distanceToTemperatureSource = 1 / distanceToTemperatureSource;
18 distanceToTemperatureSource = Math.Clamp(distanceToTemperatureSource, 0.0, 1.0);
19
20 float dryValue = 0;
21
22 if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
23 {
24 dryValue = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
25 Math.Clamp(dryValue, nearestItem.GetWetMin(), nearestItem.GetWetMax());
26 nearestItem.AddWet(dryValue);
27 }
28
29 array<EntityAI> cargoEntities = new array<EntityAI>();
30 nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
31 foreach (EntityAI cargoEntity : cargoEntities)
32 {
33 ItemBase cargoItem = ItemBase.Cast(cargoEntity);
34 if (cargoItem)
35 {
36 dryValue = 0;
37 if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
38 {
39 dryValue = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
40 Math.Clamp(dryValue, cargoItem.GetWetMin(), cargoItem.GetWetMax());
41 cargoItem.AddWet(dryValue);
42 }
43 }
44 }
45 }
46 }
47 }
48
49 override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
50 {
51 float distanceToTemperatureSource;
52 float tempTarget = pSettings.m_TemperatureItemCap;
53 EntityAI nearestEntity;
54
55 foreach (Object nearestObject : nearestObjects)
56 {
57 if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
58 {
59 float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
60
61 distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
62 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
63
64 float time = m_ExecuteInterval;
65 if (m_ExecuteInterval == -1) //bogus time in the first execute
66 time = 1;
67
68 float distFactor = 1;
69 if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
70 {
71 distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
72 distFactor = Math.Max(distFactor, 0.0);
73 }
74
75 TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
76
77 if (nearestEntity.GetInventory())
78 {
79 UpdateVicinityTemperatureRecursive(nearestEntity,dta);
80 }
81 else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
82 {
83 dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
84
85 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !nearestEntity.IsFreezeThawProgressFinished()) //ignoring insignificant increments
86 nearestEntity.SetTemperatureEx(dta);
87 else
88 nearestEntity.RefreshTemperatureAccess(dta);
89 }
90 }
91 }
92 }
93
94 protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0)
95 {
96 float heatPermCoef = heatPermeabilityCoef;
97 heatPermCoef *= ent.GetHeatPermeabilityCoef();
98 dta.m_HeatPermeabilityCoef = heatPermCoef;
99
100 //handle temperature of this entity
101 if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
102 {
103 float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
104 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !ent.IsFreezeThawProgressFinished()) //ignoring insignificant increments
105 ent.SetTemperatureEx(dta);
106 else
107 ent.RefreshTemperatureAccess(dta);
108 }
109
110 // go through any attachments and cargo, recursive
111 int inventoryAttCount = ent.GetInventory().AttachmentCount();
112 for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
113 {
114 EntityAI attachmentEnt;
115 if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
116 {
117 UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
118 }
119 }
120
121 CargoBase cargo = ent.GetInventory().GetCargo();
122 if (cargo)
123 {
124 int inventoryItemCount = cargo.GetItemCount();
125 for (int j = 0; j < inventoryItemCount; ++j)
126 {
127 EntityAI cargoEnt;
128 if (Class.CastTo(cargoEnt, cargo.GetItem(j)))
129 {
130 UpdateVicinityTemperatureRecursive(cargoEnt, dta, heatPermCoef);
131 }
132 }
133 }
134 }
135
136 override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
137 {
138 resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
139 resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
140
141 vector pos = pSettings.m_Position;
142 if (pSettings.m_Parent != null)
143 pos = pSettings.m_Parent.GetPosition();
144
145 // Define half-size (range)
146 float halfRange = pSettings.m_RangeMax;
147
148 // Calculate min and max positions of the box
149 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
150 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
151
152 array<EntityAI> nearestObjects = {};
153 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
154
155 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
156 {
157 EntityAI entity = nearestObjects[i];
158 if (entity)
159 {
160 vector objPos = entity.GetPosition();
161 float distance = vector.Distance(objPos, pos);
162 if (distance > pSettings.m_RangeMax)
163 nearestObjects.Remove(i);
164 }
165 }
166
167 if (nearestObjects.Count() > 0)
168 {
169 DryItemsInVicinity(pSettings, pos, nearestObjects);
170 WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
171 }
172 }
173
176 {
177 vector pos = pSettings.m_Position;
178 if (pSettings.m_Parent != null)
179 pos = pSettings.m_Parent.GetPosition();
180
181 // Define half-size (range)
182 float halfRange = pSettings.m_RangeMax;
183
184 // Calculate min and max positions of the box
185 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
186 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
187
188 array<EntityAI> nearestObjects = {};
189 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
190
191 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
192 {
193 EntityAI entity = nearestObjects[i];
194 if (entity)
195 {
196 vector objPos = entity.GetPosition();
197 float distance = vector.Distance(objPos, pos);
198 if (distance > pSettings.m_RangeMax)
199 nearestObjects.Remove(i);
200 }
201 }
202
203 DryItemsInVicinity(pSettings, pos, nearestObjects);
204 }
205}
206
207class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
209{
212 m_AffectsPlayer = false;
213 }
214}
215
represents base for cargo storage for entities
Definition cargo.c:7
Super root of all classes in Enforce script.
Definition enscript.c:11
Definition enmath.c:7
override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings)
DEPRECATED.
void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef=1.0)
override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
QueryFlags
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Definition gameplay.c:6
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
UniversalTemperatureSourceLambdaBaseImpl UniversalTemperatureSourceLambdaBase UniversalTemperatureSourceLambdaEngine()