vehiclebattery.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. class VehicleBattery : ItemBase
  2. {
  3. override bool CanPutAsAttachment(EntityAI parent)
  4. {
  5. if (!super.CanPutAsAttachment(parent))
  6. return false;
  7. if (parent.IsInherited(BatteryCharger))
  8. {
  9. BatteryCharger charger = BatteryCharger.Cast(parent);
  10. return charger.CanReceiveAttachment(this, InventorySlots.INVALID);
  11. }
  12. if (GetCompEM().GetPluggedDevice())
  13. return false;
  14. return true;
  15. }
  16. override bool CanDetachAttachment(EntityAI parent)
  17. {
  18. return true;
  19. }
  20. override bool CanReceiveAttachment(EntityAI attachment, int slotId)
  21. {
  22. if (GetCompEM().IsPlugged())
  23. return false;
  24. return super.CanReceiveAttachment(attachment, slotId);
  25. }
  26. override bool CanPutIntoHands(EntityAI parent)
  27. {
  28. if (!super.CanPutIntoHands(parent))
  29. {
  30. return false;
  31. }
  32. if (HasEnergyManager())
  33. {
  34. ItemBase poweredDevice = ItemBase.Cast(GetCompEM().GetPluggedDevice());
  35. if (poweredDevice && poweredDevice.IsInherited(MetalWire))
  36. {
  37. return true;
  38. }
  39. else if (poweredDevice && poweredDevice.IsOn())
  40. {
  41. return false;
  42. }
  43. }
  44. return true;
  45. }
  46. override bool CanPutInCargo(EntityAI parent)
  47. {
  48. if (!super.CanPutInCargo(parent))
  49. {
  50. return false;
  51. }
  52. ItemBase poweredDevice = ItemBase.Cast(GetCompEM().GetPluggedDevice());
  53. return !(poweredDevice && poweredDevice.IsInherited(MetalWire));
  54. }
  55. override void OnInventoryEnter(Man player)
  56. {
  57. super.OnInventoryEnter(player);
  58. if (GetHierarchyParent() == player || (GetHierarchyParent() && GetHierarchyParent().GetInventory().GetCargo()))
  59. {
  60. if (HasEnergyManager())
  61. {
  62. ItemBase poweredDevice = ItemBase.Cast(GetCompEM().GetPluggedDevice());
  63. if (poweredDevice)
  64. {
  65. if (poweredDevice.IsInherited(MetalWire))
  66. {
  67. //Unplug the device the wire is powering, but keep wire plugged to battery
  68. if (poweredDevice.GetCompEM().IsPlugged())
  69. poweredDevice.GetCompEM().UnplugDevice(poweredDevice.GetCompEM().GetPluggedDevice());
  70. }
  71. else
  72. {
  73. this.GetCompEM().UnplugAllDevices();
  74. }
  75. }
  76. }
  77. }
  78. }
  79. override void OnMovedInsideCargo(EntityAI container)
  80. {
  81. super.OnMovedInsideCargo(container);
  82. if (HasEnergyManager())
  83. {
  84. ItemBase poweredDevice = ItemBase.Cast(GetCompEM().GetPluggedDevice());
  85. if (poweredDevice)
  86. {
  87. //Should not be possible, but better safe than sorry
  88. if (poweredDevice.IsInherited(MetalWire))
  89. {
  90. poweredDevice.GetCompEM().UnplugAllDevices();
  91. }
  92. else
  93. {
  94. this.GetCompEM().UnplugAllDevices();
  95. }
  96. }
  97. }
  98. }
  99. override bool CanDisplayAttachmentSlot(int slot_id)
  100. {
  101. if (GetCompEM().IsPlugged())
  102. return false;
  103. return super.CanDisplayAttachmentSlot(slot_id);
  104. }
  105. override bool DisplayNameRuinAttach()
  106. {
  107. return true;
  108. }
  109. override bool ShowZonesHealth()
  110. {
  111. return true;
  112. }
  113. override void SetActions()
  114. {
  115. super.SetActions();
  116. AddAction(ActionAttachOnSelection);
  117. AddAction(ActionDetach);
  118. AddAction(ActionPlugTargetIntoThis);
  119. }
  120. //------------------------------------
  121. //!ENERGY CONSUMPTION
  122. //------------------------------------
  123. private int m_Efficiency0To10; // Synchronized variable
  124. static private float m_EfficiencyDecayStart = 0.1; // At this % of maximum energy the output of the battery starts to weaken.
  125. void VehicleBattery()
  126. {
  127. m_Efficiency0To10 = 10;
  128. RegisterNetSyncVariableInt("m_Efficiency0To10");
  129. }
  130. //! Returns efficiency of this battery. The value is synchronized from server to all clients and is accurate down to 0.1 units.
  131. float GetEfficiency0To1()
  132. {
  133. return m_Efficiency0To10 * 0.1;
  134. }
  135. //! Returns efficiency of this battery. The value is synchronized from server to all clients and is accurate down to 0.1 unit.
  136. float GetEfficiencyDecayStart()
  137. {
  138. return m_EfficiencyDecayStart;
  139. }
  140. override void OnEnergyConsumed()
  141. {
  142. super.OnEnergyConsumed();
  143. #ifdef SERVER
  144. float energyCoef = GetCompEM().GetEnergy0To1();
  145. if (energyCoef < m_EfficiencyDecayStart && m_EfficiencyDecayStart > 0)
  146. {
  147. m_Efficiency0To10 = Math.Round((energyCoef / m_EfficiencyDecayStart) * 10);
  148. }
  149. SetSynchDirty();
  150. #endif
  151. }
  152. // BatteryCharging
  153. override void OnEnergyAdded()
  154. {
  155. super.OnEnergyAdded();
  156. #ifdef SERVER
  157. float energyCoef = GetCompEM().GetEnergy0To1();
  158. if (energyCoef < m_EfficiencyDecayStart && m_EfficiencyDecayStart > 0)
  159. {
  160. m_Efficiency0To10 = Math.Round((energyCoef / m_EfficiencyDecayStart) * 10);
  161. }
  162. else
  163. {
  164. m_Efficiency0To10 = 10;
  165. }
  166. SetSynchDirty();
  167. #endif
  168. }
  169. }