storage.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. local function storage_overview(pos, tier)
  2. local max_health = 250
  3. if tier == 2 then
  4. max_health = 500
  5. end
  6. local meta = core.get_meta(pos)
  7. local health = meta:get_int('health')
  8. local scale = (health/max_health) * 3
  9. local formspec =
  10. kobo.building_inv..
  11. 'textarea[3.25,0;7.5,1;;;Storage pit]'..
  12. 'image[0,0;3,3;kobo_storage_'..tier..'_snap.png]'..
  13. 'image_button[3.25,2;1,1;kobo_courier_ico.png;courier;;true;false]]'..
  14. 'tooltip[courier;Create a courier (15 lumber, 5 metal, 50 food);black;white]'..
  15. 'image[0,3.75;'..scale..',.25;kobo_health_fg.png]'
  16. return formspec
  17. end
  18. local function storage_overview_wrapper(player, pos, tier)
  19. local refresh = kobo.refresh[player]
  20. if refresh then
  21. core.show_formspec(player, 'kobo:storage', storage_overview(pos, tier))
  22. core.after(.25, function()
  23. storage_overview_wrapper(player, pos, tier)
  24. end)
  25. end
  26. end
  27. local stor_1_col = {
  28. type = 'fixed',
  29. fixed = {{-.4375, -.4375, -.4375, .4375, -.25, .4375}}
  30. }
  31. local stor_1_sel = {
  32. type = 'fixed',
  33. fixed = {{-.5, -.5, -.5, .5, 0, .5}}
  34. }
  35. core.register_node('kobo:storage_1', {
  36. description = 'Storage pit',
  37. drawtype = 'mesh',
  38. mesh = 'kobo_storage_1.obj',
  39. tiles = {'kobo_storage_1.png'},
  40. paramtype = 'light',
  41. paramtype2 = 'facedir',
  42. range = 15,
  43. selection_box = stor_1_sel,
  44. collision_box = stor_1_col,
  45. groups = {storage=1, player_building=1},
  46. _snapshot = 'kobo_storage_1_snap.png',
  47. _cost = {100, 100, 50, 500},
  48. _health = 250,
  49. _max_inv = 'No Max',
  50. _long_desc = 'A basic storage facility.',
  51. after_place_node = function(pos, placer)
  52. local player_name = placer:get_player_name()
  53. local meta = core.get_meta(pos)
  54. meta:set_string('owner', player_name)
  55. meta:set_int('health', 250)
  56. kobo.place_lights(pos)
  57. end,
  58. on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
  59. local player_name = clicker:get_player_name()
  60. local meta = core.get_meta(pos)
  61. local owner = meta:get_string('owner')
  62. if owner == player_name or core.check_player_privs(clicker, {server = true}) then
  63. local player_inv = clicker:get_inventory()
  64. local items = player_inv:get_stack('hand', 1)
  65. local item_name = items:get_name()
  66. local item_count = items:get_count()
  67. local resources = kobo.resources[player_name] or {}
  68. if item_name == 'kobo:lumber' then
  69. resources.lumber = resources.lumber + item_count
  70. elseif item_name == 'kobo:stone' then
  71. resources.stone = resources.stone + item_count
  72. elseif item_name == 'kobo:food' then
  73. resources.food = resources.food + item_count
  74. elseif item_name == 'kobo:metal' then
  75. resources.metal = resources.metal + item_count
  76. end
  77. player_inv:set_list('hand', {})
  78. kobo.player_pos[player_name] = pos
  79. kobo.refresh[player_name] = true
  80. storage_overview_wrapper(player_name, pos, 1)
  81. kobo.hud_refresh(clicker)
  82. kobo.save()
  83. end
  84. end,
  85. })
  86. core.register_on_player_receive_fields(function(player, formname, fields)
  87. if formname == 'kobo:storage' then
  88. local name = player:get_player_name()
  89. if fields.courier then
  90. local resources = kobo.resources[name] or {}
  91. if resources.lumber >= 15 and resources.food >= 50 and resources.metal >= 5 then
  92. local pos = kobo.player_pos[name]
  93. local home_pos = vector.add(pos, {x=0, y=1, z=0})
  94. local courier = minetest.add_entity(pos, 'kobo:courier')
  95. local courier_entity = courier:get_luaentity()
  96. courier_entity.owner = name
  97. courier_entity.home = home_pos
  98. courier_entity.state = 'idle'
  99. courier_entity.inv = 0
  100. courier_entity.mat = ''
  101. resources.lumber = resources.lumber - 15
  102. resources.food = resources.food - 50
  103. resources.metal = resources.metal - 5
  104. kobo.hud_refresh(player)
  105. else
  106. core.chat_send_player(name, 'You need more resources.')
  107. end
  108. elseif fields.remove then
  109. local pos = kobo.player_pos[name]
  110. local resources = kobo.resources[name] or {}
  111. resources.food = resources.food + 75
  112. resources.lumber = resources.lumber + 75
  113. resources.metal = resources.metal + 375
  114. resources.stone = resources.stone + 375
  115. core.remove_node(pos)
  116. kobo.refresh[name] = false
  117. kobo.hud_refresh(player)
  118. core.close_formspec(name, 'kobo:storage')
  119. elseif fields.repair then
  120. local pos = kobo.player_pos[name]
  121. local new_pos = vector.add(pos, {x=0, y=1, z=0})
  122. core.set_node(new_pos, {name='kobo:repair'})
  123. core.chat_send_player(name, 'Summonend a repairman.')
  124. end
  125. end
  126. end)