universaltemperaturesourcelambdabaseimpl.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. class UniversalTemperatureSourceLambdaBaseImpl : UniversalTemperatureSourceLambdaBase
  2. {
  3. override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<Object> nearestObjects)
  4. {
  5. float distanceToTemperatureSource;
  6. foreach (Object nearestObject : nearestObjects)
  7. {
  8. ItemBase nearestItem = ItemBase.Cast(nearestObject);
  9. //! heat transfer to items (not in player possession)
  10. if (nearestItem && nearestItem.HasWetness() && nearestItem != pSettings.m_Parent && !nearestItem.IsInherited(Man) && !nearestItem.IsUniversalTemperatureSource())
  11. {
  12. distanceToTemperatureSource = vector.Distance(nearestItem.GetPosition(), position);
  13. distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.3); //min distance cannot be 0 (division by zero)
  14. float dryModifier = 0;
  15. if (nearestItem.GetWet() >= GameConstants.STATE_DAMP)
  16. {
  17. dryModifier = (-1 * m_ExecuteInterval * nearestItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
  18. Math.Clamp(dryModifier, nearestItem.GetWetMin(), nearestItem.GetWetMax());
  19. nearestItem.AddWet(dryModifier);
  20. }
  21. array<EntityAI> cargoEntities = new array<EntityAI>();
  22. nearestItem.GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, cargoEntities);
  23. foreach (EntityAI cargoEntity : cargoEntities)
  24. {
  25. ItemBase cargoItem = ItemBase.Cast(cargoEntity);
  26. if (cargoItem)
  27. {
  28. dryModifier = 0;
  29. if (cargoItem.GetWet() >= GameConstants.STATE_DAMP)
  30. {
  31. dryModifier = (-1 * m_ExecuteInterval * cargoItem.GetDryingIncrement("groundHeatSource")) / distanceToTemperatureSource;
  32. Math.Clamp(dryModifier, cargoItem.GetWetMin(), cargoItem.GetWetMax());
  33. cargoItem.AddWet(dryModifier);
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. override void WarmAndCoolItemsInVicinity(UniversalTemperatureSourceSettings pSettings, vector position, out notnull array<Object> nearestObjects)
  41. {
  42. float distanceToTemperatureSource;
  43. float tempTarget = pSettings.m_TemperatureItemCap;
  44. EntityAI nearestEntity;
  45. foreach (Object nearestObject : nearestObjects)
  46. {
  47. if (Class.CastTo(nearestEntity,nearestObject) && nearestEntity != pSettings.m_Parent && !nearestEntity.IsSelfAdjustingTemperature())
  48. {
  49. float temperatureDifference = tempTarget - nearestEntity.GetTemperature();
  50. distanceToTemperatureSource = vector.Distance(nearestEntity.GetPosition(), position);
  51. distanceToTemperatureSource = Math.Max(distanceToTemperatureSource, 0.1);
  52. float time = m_ExecuteInterval;
  53. if (m_ExecuteInterval == -1) //bogus time in the first execute
  54. time = 1;
  55. float distFactor = 1;
  56. if (vector.Distance(nearestEntity.GetPosition(), position) > pSettings.m_RangeFull)
  57. {
  58. distFactor = Math.InverseLerp(pSettings.m_RangeMax,pSettings.m_RangeFull,distanceToTemperatureSource);
  59. distFactor = Math.Max(distFactor, 0.0); //! dist factor minimum should be at 0
  60. }
  61. TemperatureDataInterpolated dta = new TemperatureDataInterpolated(tempTarget,ETemperatureAccessTypes.ACCESS_UTS,time,pSettings.m_TemperatureItemCoef * distFactor);
  62. if (nearestEntity.GetInventory())
  63. {
  64. UpdateVicinityTemperatureRecursive(nearestEntity,dta);
  65. }
  66. else if (nearestEntity.CanHaveTemperature() && !nearestEntity.IsSelfAdjustingTemperature())
  67. {
  68. dta.m_HeatPermeabilityCoef = nearestEntity.GetHeatPermeabilityCoef();
  69. if (Math.AbsFloat(temperatureDifference) < GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD) //ignoring insignificant increments
  70. nearestEntity.RefreshTemperatureAccess(dta);
  71. else
  72. nearestEntity.SetTemperatureEx(dta);
  73. }
  74. }
  75. }
  76. }
  77. protected void UpdateVicinityTemperatureRecursive(EntityAI ent, TemperatureData dta, float heatPermeabilityCoef = 1.0) //TODO
  78. {
  79. float heatPermCoef = heatPermeabilityCoef;
  80. heatPermCoef *= ent.GetHeatPermeabilityCoef();
  81. dta.m_HeatPermeabilityCoef = heatPermCoef;
  82. //handle temperature of this entity
  83. if (ent.CanHaveTemperature() && !ent.IsSelfAdjustingTemperature())
  84. {
  85. float temperatureDifference = dta.m_AdjustedTarget - ent.GetTemperature();
  86. if (Math.AbsFloat(temperatureDifference) < GameConstants.TEMPERATURE_SENSITIVITY_THRESHOLD) //ignoring insignificant increments
  87. ent.RefreshTemperatureAccess(dta);
  88. else
  89. ent.SetTemperatureEx(dta);
  90. }
  91. // go through any attachments and cargo, recursive
  92. int inventoryAttCount = ent.GetInventory().AttachmentCount();
  93. if (inventoryAttCount > 0)
  94. {
  95. EntityAI attachmentEnt;
  96. for (int inAttIdx = 0; inAttIdx < inventoryAttCount; ++inAttIdx)
  97. {
  98. if (Class.CastTo(attachmentEnt,ent.GetInventory().GetAttachmentFromIndex(inAttIdx)))
  99. {
  100. UpdateVicinityTemperatureRecursive(attachmentEnt,dta,heatPermCoef);
  101. }
  102. }
  103. }
  104. if (ent.GetInventory().GetCargo())
  105. {
  106. int inventoryItemCount = ent.GetInventory().GetCargo().GetItemCount();
  107. if (inventoryItemCount > 0)
  108. {
  109. EntityAI cargoEnt;
  110. for (int j = 0; j < inventoryItemCount; ++j)
  111. {
  112. if (Class.CastTo(cargoEnt,ent.GetInventory().GetCargo().GetItem(j)))
  113. {
  114. UpdateVicinityTemperatureRecursive(cargoEnt,dta,heatPermCoef);
  115. }
  116. }
  117. }
  118. }
  119. }
  120. override void Execute(UniversalTemperatureSourceSettings pSettings, UniversalTemperatureSourceResult resultValues)
  121. {
  122. resultValues.m_TemperatureItem = pSettings.m_TemperatureItemCap;
  123. resultValues.m_TemperatureHeatcomfort = pSettings.m_TemperatureCap;
  124. array<Object> nearestObjects = new array<Object>();
  125. vector pos = pSettings.m_Position;
  126. if (pSettings.m_Parent != null)
  127. pos = pSettings.m_Parent.GetPosition();
  128. GetGame().GetObjectsAtPosition(pos, pSettings.m_RangeMax, nearestObjects, null);
  129. if (nearestObjects.Count() > 0)
  130. {
  131. DryItemsInVicinity(pSettings, pos, nearestObjects);
  132. WarmAndCoolItemsInVicinity(pSettings, pos, nearestObjects);
  133. }
  134. }
  135. //! DEPRECATED
  136. override void DryItemsInVicinity(UniversalTemperatureSourceSettings pSettings)
  137. {
  138. array<Object> nearestObjects = new array<Object>();
  139. vector pos = pSettings.m_Position;
  140. if (pSettings.m_Parent != null)
  141. pos = pSettings.m_Parent.GetPosition();
  142. GetGame().GetObjectsAtPosition(pos, pSettings.m_RangeMax, nearestObjects, null);
  143. DryItemsInVicinity(pSettings, pos, nearestObjects);
  144. }
  145. }
  146. class UniversalTemperatureSourceLambdaConstant : UniversalTemperatureSourceLambdaBaseImpl {}
  147. class UniversalTemperatureSourceLambdaEngine : UniversalTemperatureSourceLambdaBaseImpl
  148. {
  149. void UniversalTemperatureSourceLambdaEngine()
  150. {
  151. m_AffectsPlayer = false;
  152. }
  153. }