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

◆ UpdateVicinityTemperatureRecursive()

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

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

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