DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ WarmAndCoolItemsInVicinity()

override void UniversalTemperatureSourceLambdaEngine::WarmAndCoolItemsInVicinity ( UniversalTemperatureSourceSettings pSettings,
vector position,
out notnull array< Object > nearestObjects )

dist factor minimum should be at 0

См. определение в файле UniversalTemperatureSourceLambdaBaseImpl.c строка 219

220{
221 override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<Object> nearestObjects)
222 {
223 float distanceToTemperatureSource;
224
225 foreach (Object nearestObject : nearestObjects)
226 {
227 ItemBase nearestItem = ItemBase.Cast(nearestObject);
228
230 if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
231 {
232 distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
233 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.3); //min distance cannot be 0 (division by zero)
234
235 float dryModifier = 0;
236
237 if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
238 {
239 dryModifier = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
240 Math.Clamp(dryModifier, nearestItem.GetWetMin(), nearestItem.GetWetMax());
241 nearestItem.AddWet(dryModifier);
242 }
243
244 array<EntityAI> cargoEntities = new array<EntityAI>();
245 nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
246 foreach (EntityAI cargoEntity : cargoEntities)
247 {
248 ItemBase cargoItem = ItemBase.Cast(cargoEntity);
249 if (cargoItem)
250 {
251 dryModifier = 0;
252 if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
253 {
254 dryModifier = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
255 Math.Clamp(dryModifier, cargoItem.GetWetMin(), cargoItem.GetWetMax());
256 cargoItem.AddWet(dryModifier);
257 }
258 }
259 }
260 }
261 }
262 }
263
264 override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<Object> nearestObjects)
265 {
266 float distanceToTemperatureSource;
267 float tempTarget = pSettings.m_TemperatureItemCap;
268 EntityAI nearestEntity;
269
270 foreach (Object nearestObject : nearestObjects)
271 {
272 if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
273 {
274 float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
275
276 distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
277 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
278
279 float time = m_ExecuteInterval;
280 if (m_ExecuteInterval == -1) //bogus time in the first execute
281 time = 1;
282
283 float distFactor = 1;
284 if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
285 {
286 distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
287 distFactor = Math.Max(distFactor, 0.0);
288 }
289
290 TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
291
292 if (nearestEntity.GetInventory())
293 {
294 UpdateVicinityTemperatureRecursive(nearestEntity,dta);
295 }
296 else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
297 {
298 dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
299
300 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !nearestEntity.IsFreezeThawProgressFinished()) //ignoring insignificant increments
301 nearestEntity.SetTemperatureEx(dta);
302 else
303 nearestEntity.RefreshTemperatureAccess(dta);
304 }
305 }
306 }
307 }
308
309 protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0)
310 {
311 float heatPermCoef = heatPermeabilityCoef;
312 heatPermCoef *= ent.GetHeatPermeabilityCoef();
313 dta.m_HeatPermeabilityCoef = heatPermCoef;
314
315 //handle temperature of this entity
316 if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
317 {
318 float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
319 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !ent.IsFreezeThawProgressFinished()) //ignoring insignificant increments
320 ent.SetTemperatureEx(dta);
321 else
322 ent.RefreshTemperatureAccess(dta);
323 }
324
325 // go through any attachments and cargo, recursive
326 int inventoryAttCount = ent.GetInventory().AttachmentCount();
327 if (inventoryAttCount > 0)
328 {
329 EntityAI attachmentEnt;
330 for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
331 {
332 if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
333 {
334 UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
335 }
336 }
337 }
338
339 if (ent.GetInventory().GetCargo())
340 {
341 int inventoryItemCount = ent.GetInventory().GetCargo().GetItemCount();
342 if (inventoryItemCount > 0)
343 {
344 EntityAI cargoEnt;
345 for (int j = 0; j < inventoryItemCount; ++j)
346 {
347 if (Class.CastTo(cargoEnt,ent.GetInventory().GetCargo().GetItem(j)))
348 {
349 UpdateVicinityTemperatureRecursive(cargoEnt,dta,heatPermCoef);
350 }
351 }
352 }
353 }
354 }
355
356 override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
357 {
358 resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
359 resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
360
361 array<Object> nearestObjects = new array<Object>();
362
363 vector pos = pSettings.m_Position;
364 if (pSettings.m_Parent != null)
365 pos = pSettings.m_Parent.GetPosition();
366
367 GetGame().GetObjectsAtPosition(pos, pSettings.m_RangeMax, nearestObjects, null);
368 if (nearestObjects.Count() > 0)
369 {
370 DryItemsInVicinity(pSettings, pos, nearestObjects);
371 WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
372 }
373 }
374
377 {
378 array<Object> nearestObjects = new array<Object>();
379
380 vector pos = pSettings.m_Position;
381 if (pSettings.m_Parent != null)
382 pos = pSettings.m_Parent.GetPosition();
383
384 GetGame().GetObjectsAtPosition(pos, pSettings.m_RangeMax, nearestObjects, null);
385
386 DryItemsInVicinity(pSettings, pos, nearestObjects);
387 }
388}
389
390class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
392{
394 {
395 m_AffectsPlayer = false;
396 }
397}
398
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array< Object > nearestObjects)
void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef=1.0)
UniversalTemperatureSourceLambdaBaseImpl UniversalTemperatureSourceLambdaBase UniversalTemperatureSourceLambdaEngine()
override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array< Object > nearestObjects)
proto native void GetObjectsAtPosition(vector pos, float radius, out array< Object > objects, out array< CargoBase > proxyCargos)
Returns list of all objects in circle "radius" around position "pos".
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения Building.c:6
Определения constants.c:659
Определения InventoryItem.c:731
Определения EnMath.c:7
Определения ObjectTyped.c:2
float m_AdjustedTarget
Определения TemperatureData.c:6
float m_HeatPermeabilityCoef
Определения TemperatureData.c:9
Определения TemperatureData.c:2
vector m_Position
if the stats can be overriden by coefficient/variables from WorldData (currently TemperatureCap only)
Определения UniversalTemperatureSource.c:18
float m_RangeFull
temperature cap that will limit the return value from GetTemperature method
Определения UniversalTemperatureSource.c:7
float m_TemperatureCap
used to determine speed of temperature change, and some temperature subsystems
Определения UniversalTemperatureSource.c:6
float m_TemperatureItemCoef
max temperature 'non-IsSelfAdjustingTemperature' entity in vicinity will get per update (cap);
Определения UniversalTemperatureSource.c:5
float m_RangeMax
range where the full temperature is given to receiver
Определения UniversalTemperatureSource.c:8
float m_TemperatureItemCap
how often the Update is ticking
Определения UniversalTemperatureSource.c:4
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
Определения EnConvert.c:106
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
proto native CGame GetGame()
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
static const float TEMPERATURE_SENSITIVITY_THRESHOLD
Определения constants.c:938
const float STATE_DAMP
Определения constants.c:873
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float InverseLerp(float a, float b, float value)
Calculates the linear value that produces the interpolant value within the range [a,...
static proto float AbsFloat(float f)
Returns absolute value.