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

◆ UpdateVicinityTemperatureRecursive()

void UniversalTemperatureSourceLambdaEngine::UpdateVicinityTemperatureRecursive ( EntityAI ent,
TemperatureData dta,
float heatPermeabilityCoef = 1.0 )
protected

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

303{
304 override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
305 {
306 float distanceToTemperatureSource;
307
308 foreach (Object nearestObject : nearestObjects)
309 {
310 ItemBase nearestItem = ItemBase.Cast(nearestObject);
311 ItemBase temperatureSource = ItemBase.Cast(pSettings.m_Parent);
312
314 if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
315 {
316 distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
317 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.001);
318 distanceToTemperatureSource = 1 / distanceToTemperatureSource;
319 distanceToTemperatureSource = Math.Clamp(distanceToTemperatureSource, 0.0, 1.0);
320
321 float dryValue = 0;
322
323 if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
324 {
325 dryValue = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
326 Math.Clamp(dryValue, nearestItem.GetWetMin(), nearestItem.GetWetMax());
327 nearestItem.AddWet(dryValue);
328 }
329
330 array<EntityAI> cargoEntities = new array<EntityAI>();
331 nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
332 foreach (EntityAI cargoEntity : cargoEntities)
333 {
334 ItemBase cargoItem = ItemBase.Cast(cargoEntity);
335 if (cargoItem)
336 {
337 dryValue = 0;
338 if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
339 {
340 dryValue = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
341 Math.Clamp(dryValue, cargoItem.GetWetMin(), cargoItem.GetWetMax());
342 cargoItem.AddWet(dryValue);
343 }
344 }
345 }
346 }
347 }
348 }
349
350 override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
351 {
352 float distanceToTemperatureSource;
353 float tempTarget = pSettings.m_TemperatureItemCap;
354 EntityAI nearestEntity;
355
356 foreach (Object nearestObject : nearestObjects)
357 {
358 if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
359 {
360 float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
361
362 distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
363 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
364
365 float time = m_ExecuteInterval;
366 if (m_ExecuteInterval == -1) //bogus time in the first execute
367 time = 1;
368
369 float distFactor = 1;
370 if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
371 {
372 distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
373 distFactor = Math.Max(distFactor, 0.0);
374 }
375
376 TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
377
378 if (nearestEntity.GetInventory())
379 {
380 UpdateVicinityTemperatureRecursive(nearestEntity,dta);
381 }
382 else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
383 {
384 dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
385
386 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !nearestEntity.IsFreezeThawProgressFinished()) //ignoring insignificant increments
387 nearestEntity.SetTemperatureEx(dta);
388 else
389 nearestEntity.RefreshTemperatureAccess(dta);
390 }
391 }
392 }
393 }
394
395 protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0)
396 {
397 float heatPermCoef = heatPermeabilityCoef;
398 heatPermCoef *= ent.GetHeatPermeabilityCoef();
399 dta.m_HeatPermeabilityCoef = heatPermCoef;
400
401 //handle temperature of this entity
402 if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
403 {
404 float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
405 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !ent.IsFreezeThawProgressFinished()) //ignoring insignificant increments
406 ent.SetTemperatureEx(dta);
407 else
408 ent.RefreshTemperatureAccess(dta);
409 }
410
411 // go through any attachments and cargo, recursive
412 int inventoryAttCount = ent.GetInventory().AttachmentCount();
413 for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
414 {
415 EntityAI attachmentEnt;
416 if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
417 {
418 UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
419 }
420 }
421
422 CargoBase cargo = ent.GetInventory().GetCargo();
423 if (cargo)
424 {
425 int inventoryItemCount = cargo.GetItemCount();
426 for (int j = 0; j < inventoryItemCount; ++j)
427 {
428 EntityAI cargoEnt;
429 if (Class.CastTo(cargoEnt, cargo.GetItem(j)))
430 {
431 UpdateVicinityTemperatureRecursive(cargoEnt, dta, heatPermCoef);
432 }
433 }
434 }
435 }
436
437 override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
438 {
439 resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
440 resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
441
442 vector pos = pSettings.m_Position;
443 if (pSettings.m_Parent != null)
444 pos = pSettings.m_Parent.GetPosition();
445
446 // Define half-size (range)
447 float halfRange = pSettings.m_RangeMax;
448
449 // Calculate min and max positions of the box
450 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
451 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
452
453 array<EntityAI> nearestObjects = {};
454 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
455
456 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
457 {
458 EntityAI entity = nearestObjects[i];
459 if (entity)
460 {
461 vector objPos = entity.GetPosition();
462 float distance = vector.Distance(objPos, pos);
463 if (distance > pSettings.m_RangeMax)
464 nearestObjects.Remove(i);
465 }
466 }
467
468 if (nearestObjects.Count() > 0)
469 {
470 DryItemsInVicinity(pSettings, pos, nearestObjects);
471 WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
472 }
473 }
474
477 {
478 vector pos = pSettings.m_Position;
479 if (pSettings.m_Parent != null)
480 pos = pSettings.m_Parent.GetPosition();
481
482 // Define half-size (range)
483 float halfRange = pSettings.m_RangeMax;
484
485 // Calculate min and max positions of the box
486 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
487 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
488
489 array<EntityAI> nearestObjects = {};
490 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
491
492 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
493 {
494 EntityAI entity = nearestObjects[i];
495 if (entity)
496 {
497 vector objPos = entity.GetPosition();
498 float distance = vector.Distance(objPos, pos);
499 if (distance > pSettings.m_RangeMax)
500 nearestObjects.Remove(i);
501 }
502 }
503
504 DryItemsInVicinity(pSettings, pos, nearestObjects);
505 }
506}
507
508class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
510{
512 {
513 m_AffectsPlayer = false;
514 }
515}
516
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
QueryFlags
Определения DayZPlayerUtils.c:2
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array< EntityAI > nearestObjects)
override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array< EntityAI > nearestObjects)
void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef=1.0)
UniversalTemperatureSourceLambdaBaseImpl UniversalTemperatureSourceLambdaBase UniversalTemperatureSourceLambdaEngine()
override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
represents base for cargo storage for entities
Определения Cargo.c:7
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения 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:19
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_ItemDryModifier
maximum range where the receiver can get some temperature
Определения UniversalTemperatureSource.c:9
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:119
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
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
Определения 3_Game/DayZ/constants.c:943
const float STATE_DAMP
Определения 3_Game/DayZ/constants.c:878
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float 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.