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

◆ WarmAndCoolItemsInVicinity()

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

dist factor minimum should be at 0

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

257{
258 override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
259 {
260 float distanceToTemperatureSource;
261
262 foreach (Object nearestObject : nearestObjects)
263 {
264 ItemBase nearestItem = ItemBase.Cast(nearestObject);
265
267 if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
268 {
269 distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
270 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.3); //min distance cannot be 0 (division by zero)
271
272 float dryModifier = 0;
273
274 if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
275 {
276 dryModifier = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
277 Math.Clamp(dryModifier, nearestItem.GetWetMin(), nearestItem.GetWetMax());
278 nearestItem.AddWet(dryModifier);
279 }
280
281 array<EntityAI> cargoEntities = new array<EntityAI>();
282 nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
283 foreach (EntityAI cargoEntity : cargoEntities)
284 {
285 ItemBase cargoItem = ItemBase.Cast(cargoEntity);
286 if (cargoItem)
287 {
288 dryModifier = 0;
289 if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
290 {
291 dryModifier = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
292 Math.Clamp(dryModifier, cargoItem.GetWetMin(), cargoItem.GetWetMax());
293 cargoItem.AddWet(dryModifier);
294 }
295 }
296 }
297 }
298 }
299 }
300
301 override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<EntityAI> nearestObjects)
302 {
303 float distanceToTemperatureSource;
304 float tempTarget = pSettings.m_TemperatureItemCap;
305 EntityAI nearestEntity;
306
307 foreach (Object nearestObject : nearestObjects)
308 {
309 if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
310 {
311 float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
312
313 distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
314 distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
315
316 float time = m_ExecuteInterval;
317 if (m_ExecuteInterval == -1) //bogus time in the first execute
318 time = 1;
319
320 float distFactor = 1;
321 if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
322 {
323 distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
324 distFactor = Math.Max(distFactor, 0.0);
325 }
326
327 TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
328
329 if (nearestEntity.GetInventory())
330 {
331 UpdateVicinityTemperatureRecursive(nearestEntity,dta);
332 }
333 else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
334 {
335 dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
336
337 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !nearestEntity.IsFreezeThawProgressFinished()) //ignoring insignificant increments
338 nearestEntity.SetTemperatureEx(dta);
339 else
340 nearestEntity.RefreshTemperatureAccess(dta);
341 }
342 }
343 }
344 }
345
346 protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0)
347 {
348 float heatPermCoef = heatPermeabilityCoef;
349 heatPermCoef *= ent.GetHeatPermeabilityCoef();
350 dta.m_HeatPermeabilityCoef = heatPermCoef;
351
352 //handle temperature of this entity
353 if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
354 {
355 float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
356 if (Math.AbsFloat(temperatureDifference) >= GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD || !ent.IsFreezeThawProgressFinished()) //ignoring insignificant increments
357 ent.SetTemperatureEx(dta);
358 else
359 ent.RefreshTemperatureAccess(dta);
360 }
361
362 // go through any attachments and cargo, recursive
363 int inventoryAttCount = ent.GetInventory().AttachmentCount();
364 if (inventoryAttCount > 0)
365 {
366 EntityAI attachmentEnt;
367 for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
368 {
369 if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
370 {
371 UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
372 }
373 }
374 }
375
376 if (ent.GetInventory().GetCargo())
377 {
378 int inventoryItemCount = ent.GetInventory().GetCargo().GetItemCount();
379 if (inventoryItemCount > 0)
380 {
381 EntityAI cargoEnt;
382 for (int j = 0; j < inventoryItemCount; ++j)
383 {
384 if (Class.CastTo(cargoEnt,ent.GetInventory().GetCargo().GetItem(j)))
385 {
386 UpdateVicinityTemperatureRecursive(cargoEnt,dta,heatPermCoef);
387 }
388 }
389 }
390 }
391 }
392
393 override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
394 {
395 resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
396 resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
397
398 vector pos = pSettings.m_Position;
399 if (pSettings.m_Parent != null)
400 pos = pSettings.m_Parent.GetPosition();
401
402 // Define half-size (range)
403 float halfRange = pSettings.m_RangeMax;
404
405 // Calculate min and max positions of the box
406 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
407 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
408
409 array<EntityAI> nearestObjects = {};
410 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
411
412 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
413 {
414 EntityAI entity = nearestObjects[i];
415 if (entity)
416 {
417 vector objPos = entity.GetPosition();
418 float distance = vector.Distance(objPos, pos);
419 if (distance > pSettings.m_RangeMax)
420 nearestObjects.Remove(i);
421 }
422 }
423
424 if (nearestObjects.Count() > 0)
425 {
426 DryItemsInVicinity(pSettings, pos, nearestObjects);
427 WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
428 }
429 }
430
433 {
434 vector pos = pSettings.m_Position;
435 if (pSettings.m_Parent != null)
436 pos = pSettings.m_Parent.GetPosition();
437
438 // Define half-size (range)
439 float halfRange = pSettings.m_RangeMax;
440
441 // Calculate min and max positions of the box
442 vector minPos = pos - Vector(halfRange, halfRange / 2, halfRange);
443 vector maxPos = pos + Vector(halfRange, halfRange / 2, halfRange);
444
445 array<EntityAI> nearestObjects = {};
446 DayZPlayerUtils.SceneGetEntitiesInBox(minPos, maxPos, nearestObjects, QueryFlags.DYNAMIC);
447
448 for (int i = nearestObjects.Count() - 1; i >= 0; --i)
449 {
450 EntityAI entity = nearestObjects[i];
451 if (entity)
452 {
453 vector objPos = entity.GetPosition();
454 float distance = vector.Distance(objPos, pos);
455 if (distance > pSettings.m_RangeMax)
456 nearestObjects.Remove(i);
457 }
458 }
459
460 DryItemsInVicinity(pSettings, pos, nearestObjects);
461 }
462}
463
464class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
466{
468 {
469 m_AffectsPlayer = false;
470 }
471}
472
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.