init.lua 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. local S = minetest.get_translator("advtrains_vactrain")
  2. local vacuum_range = tonumber(minetest.settings:get("vactrain_range")) or 3
  3. local max_working_speed = tonumber(minetest.settings:get("vactrain_max_speed")) or 2
  4. function round_down(pos)
  5. return {x=pos.x, y=math.floor(pos.y), z=pos.z}
  6. end
  7. local function vacuum(pos, radius, inv)
  8. for _, object in ipairs(minetest.get_objects_inside_radius(pos, vacuum_range)) do
  9. local luaentity = object:get_luaentity()
  10. if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then
  11. if inv and inv:room_for_item("box", ItemStack(luaentity.itemstring)) then
  12. inv:add_item("box", ItemStack(luaentity.itemstring))
  13. luaentity.itemstring = ""
  14. object:remove()
  15. end
  16. end
  17. end
  18. end
  19. advtrains.register_wagon("advtrains_wagon_vac", {
  20. mesh = "moretrains_wagon_box.b3d",
  21. textures = {"vactrain_wagon.png"},
  22. seats = {},
  23. drives_on = {default=true},
  24. max_speed = 10,
  25. visual_size = {x=1,y=1},
  26. wagon_span = 2.672,
  27. collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0},
  28. drops = {"default:steelblock","pipeworks:sand_tube_1"},
  29. has_inventory = true,
  30. get_inventory = function (self) return minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id}) end,
  31. get_inventory_formspec = function(self, pname, invname)
  32. local data = advtrains.wagons[self.id]
  33. local prop = ""
  34. if data.owner==pname then
  35. prop = "button_exit[0,4;4,1;prop;"..S("Wagon properties").."]"
  36. end
  37. return "size[8,11]"..
  38. "list["..invname..";box;0,0;8,4;]"..
  39. "list[current_player;main;0,7;8,4;]"..
  40. "listring[]"..prop
  41. end,
  42. inventory_list_sizes = {
  43. box=8*4,
  44. },
  45. custom_on_step = function(self,dtime)
  46. --Reduce lag: don't run if stationary or in transit
  47. if (self:train().velocity == 0 or self:train().velocity > max_working_speed) then
  48. return
  49. end
  50. local pos = vector.round(round_down(self.object:getpos()))
  51. local inv = minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id})
  52. vacuum(pos,vacuum_range,inv)
  53. end,
  54. }, S("Vacuum Wagon"), "vactrain_wagon_inv.png")
  55. minetest.register_craft({
  56. output = "advtrains:advtrains_wagon_vac",
  57. recipe = {
  58. {"pipeworks:sand_tube_1","technic:motor","pipeworks:sand_tube_1"},
  59. {"","advtrains:moretrains_wagon_box",""}
  60. },
  61. })
  62. print("VacTrain loaded")