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

◆ DryItemsInVicinity() [1/2]

override void UniversalTemperatureSourceLambdaEngine::DryItemsInVicinity ( UniversalTemperatureSourceSettings pSettings)
protected

DEPRECATED.

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

384{
385 override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
386 {
387 float distanceToTemperatureSource;
388
389 foreach (Object nearestObject : nearestObjects)
390 {
391 ItemBase nearestItem = ItemBase.Cast(nearestObject);
392 ItemBase temperatureSource = ItemBase.Cast(pSettings.m_Parent);
393
395 if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
396 {
397 distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
398 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.001);
399 distanceToTemperatureSource = 1 / distanceToTemperatureSource;
400 distanceToTemperatureSource = Math.Clamp(distanceToTemperatureSource, 0.0, 1.0);
401
402 float dryValue = 0;
403
404 if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
405 {
406 dryValue = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
407 Math.Clamp(dryValue, nearestItem.GetWetMin(), nearestItem.GetWetMax());
408 nearestItem.AddWet(dryValue);
409 }
410
411 array<EntityAI> cargoEntities = new array<EntityAI>();
412 nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
413 foreach (EntityAI cargoEntity : cargoEntities)
414 {
415 ItemBase cargoItem = ItemBase.Cast(cargoEntity);
416 if (cargoItem)
417 {
418 dryValue = 0;
419 if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
420 {
421 dryValue = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) * pSettings.m_ItemDryModifier * distanceToTemperatureSource;
422 Math.Clamp(dryValue, cargoItem.GetWetMin(), cargoItem.GetWetMax());
423 cargoItem.AddWet(dryValue);
424 }
425 }
426 }
427 }
428 }
429 }
430
431 override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
432 {
433 float distanceToTemperatureSource;
434 float tempTarget = pSettings.m_TemperatureItemCap;
435 EntityAI nearestEntity;
436
437 foreach (Object nearestObject : nearestObjects)
438 {
439 if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
440 {
441 float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
442
443 distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
444 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
445
446 float time = m_ExecuteInterval;
447 if (m_ExecuteInterval == -1) //bogus time in the first execute
448 time = 1;
449
450 float distFactor = 1;
451 if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
452 {
453 distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
454 distFactor = Math.Max(distFactor, 0.0);
455 }
456
457 TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
458
459 if (nearestEntity.GetInventory())
460 {
461 UpdateVicinityTemperatureRecursive(nearestEntity,dta);
462 }
463 else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
464 {
465 dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
466
467 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !nearestEntity.IsFreezeThawProgressFinished()) //ignoring insignificant increments
468 nearestEntity.SetTemperatureEx(dta);
469 else
470 nearestEntity.RefreshTemperatureAccess(dta);
471 }
472 }
473 }
474 }
475
476 protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0)
477 {
478 float heatPermCoef = heatPermeabilityCoef;
479 heatPermCoef *= ent.GetHeatPermeabilityCoef();
480 dta.m_HeatPermeabilityCoef = heatPermCoef;
481
482 //handle temperature of this entity
483 if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
484 {
485 float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
486 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !ent.IsFreezeThawProgressFinished()) //ignoring insignificant increments
487 ent.SetTemperatureEx(dta);
488 else
489 ent.RefreshTemperatureAccess(dta);
490 }
491
492 // go through any attachments and cargo, recursive
493 int inventoryAttCount = ent.GetInventory().AttachmentCount();
494 for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
495 {
496 EntityAI attachmentEnt;
497 if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
498 {
499 UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
500 }
501 }
502
503 CargoBase cargo = ent.GetInventory().GetCargo();
504 if (cargo)
505 {
506 int inventoryItemCount = cargo.GetItemCount();
507 for (int j = 0; j < inventoryItemCount; ++j)
508 {
509 EntityAI cargoEnt;
510 if (Class.CastTo(cargoEnt, cargo.GetItem(j)))
511 {
512 UpdateVicinityTemperatureRecursive(cargoEnt, dta, heatPermCoef);
513 }
514 }
515 }
516 }
517
518 override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
519 {
520 resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
521 resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
522
523 vector pos = pSettings.m_Position;
524 if (pSettings.m_Parent != null)
525 pos = pSettings.m_Parent.GetPosition();
526
527 // Define half-size (range)
528 float halfRange = pSettings.m_RangeMax;
529
530 // Calculate min and max positions of the box
531 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
532 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
533
534 array<EntityAI> nearestObjects = {};
535 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
536
537 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
538 {
539 EntityAI entity = nearestObjects[i];
540 if (entity)
541 {
542 vector objPos = entity.GetPosition();
543 float distance = vector.Distance(objPos, pos);
544 if (distance > pSettings.m_RangeMax)
545 nearestObjects.Remove(i);
546 }
547 }
548
549 if (nearestObjects.Count() > 0)
550 {
551 DryItemsInVicinity(pSettings, pos, nearestObjects);
552 WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
553 }
554 }
555
558 {
559 vector pos = pSettings.m_Position;
560 if (pSettings.m_Parent != null)
561 pos = pSettings.m_Parent.GetPosition();
562
563 // Define half-size (range)
564 float halfRange = pSettings.m_RangeMax;
565
566 // Calculate min and max positions of the box
567 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
568 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
569
570 array<EntityAI> nearestObjects = {};
571 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
572
573 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
574 {
575 EntityAI entity = nearestObjects[i];
576 if (entity)
577 {
578 vector objPos = entity.GetPosition();
579 float distance = vector.Distance(objPos, pos);
580 if (distance > pSettings.m_RangeMax)
581 nearestObjects.Remove(i);
582 }
583 }
584
585 DryItemsInVicinity(pSettings, pos, nearestObjects);
586 }
587}
588
589class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
591{
593 {
594 m_AffectsPlayer = false;
595 }
596}
597
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.