power.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. local vMod = vm_lighting_wand
  2. local max_power = 0
  3. -- Set the max power (set from levels)
  4. vMod.set_max_power = function(amount)
  5. max_power = amount or max_power
  6. end
  7. vMod.get_max_power = function()
  8. return max_power
  9. end
  10. -- Sets players power to the given amount or max_power
  11. vMod.set_power = function(player, amount)
  12. if not player or not amount or amount < 0 then
  13. return
  14. end
  15. local meta = player:get_meta()
  16. amount = vMod.round(amount)
  17. amount = amount >= 0 and amount or 0
  18. amount = amount <= max_power and amount or max_power
  19. meta:set_int(vMod.modname .. "_power", amount)
  20. end
  21. -- Get a players power
  22. vMod.get_power = function(player)
  23. if not player then
  24. return 0
  25. end
  26. local power = player:get_meta():get_int(vMod.modname .. "_power") or 0
  27. if power > max_power then
  28. power = max_power
  29. vMod.set_power(player, power)
  30. end
  31. return power
  32. end
  33. -- Add an amount to a player power
  34. vMod.add_power = function(player, amount)
  35. if not player or not amount or amount <= 0 then
  36. return
  37. end
  38. local power = vMod.get_power(player)
  39. local sum = power + amount
  40. vMod.set_power(player, sum)
  41. end
  42. -- Remove an amount from a players power
  43. vMod.remove_power = function(player, amount)
  44. if not player or not amount or amount <= 0 then
  45. return
  46. end
  47. local power = vMod.get_power(player)
  48. local sum = power - amount
  49. vMod.set_power(player, sum)
  50. end
  51. -- Test if the player has enough power for the given amount
  52. vMod.can_output_power = function(player, amount)
  53. if not player or not amount or amount < 0 then
  54. return false
  55. end
  56. if vMod.is_creative_mode(player) then
  57. return true
  58. end
  59. if vMod.get_power(player) >= amount then
  60. return true
  61. end
  62. return false
  63. end
  64. -- Test if the player can store the given amount
  65. vMod.can_input_power = function(player, amount)
  66. if not player or not amount or amount <= 0 then
  67. return 0
  68. end
  69. local free = max_power - vMod.get_power(player)
  70. if free <= 0 then
  71. free = 0
  72. end
  73. if free >= amount then
  74. return amount
  75. end
  76. return free
  77. end
  78. -- Works out the cost of placing a node
  79. vMod.get_power_cost = function(player, to_pos, removal)
  80. if not player or not to_pos then
  81. return false
  82. end
  83. if vMod.is_creative_mode(player) then
  84. return 0
  85. end
  86. removal = removal or false
  87. local cost = player:get_pos()
  88. local level = vMod.get_level(player)
  89. for key, value in pairs(cost) do
  90. value = to_pos[key] - vMod.round(value)
  91. cost[key] = value < 0 and value * -1 or value
  92. end
  93. local sum = (cost.x + cost.z + cost.y) * level.cost_per_node
  94. if not removal then
  95. return vMod.round(sum + level.cost_per_use)
  96. else
  97. return vMod.round((sum / level.removal_reduction) + level.cost_per_use)
  98. end
  99. end
  100. -- Will apply a charge to the players power if it can - returns true/false
  101. vMod.do_power_cost = function(player, to_pos, removal)
  102. -- skip everything if the player is in creative mode
  103. if vMod.is_creative_mode(player) then
  104. return true
  105. end
  106. local cost = vMod.get_power_cost(player, to_pos, removal)
  107. if cost == false then
  108. return false
  109. end
  110. -- if the player doesnt have enough power
  111. if not vMod.can_output_power(player, cost) then
  112. return false
  113. end
  114. -- charge the player
  115. vMod.remove_power(player, cost)
  116. return true
  117. end