forked from MTSR/techage_modpack
151 lines
4.1 KiB
Lua
151 lines
4.1 KiB
Lua
--[[
|
|
|
|
Minecart
|
|
========
|
|
|
|
Copyright (C) 2019-2020 Joachim Stolberg
|
|
|
|
MIT
|
|
See license.txt for more information
|
|
|
|
Cart library functions for entity based carts (level 2)
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local M = minetest.get_meta
|
|
local S = minecart.S
|
|
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
|
local S2P = minetest.string_to_pos
|
|
local MP = minetest.get_modpath("minecart")
|
|
|
|
local api = dofile(MP.."/cart_lib3.lua")
|
|
|
|
-- Add node, set metadata, and load carge
|
|
local function add_cart(pos, node_name, param2, owner, userID, cargo)
|
|
local obj = minetest.add_entity(pos, node_name)
|
|
local myID = api.get_object_id(obj)
|
|
if myID then
|
|
-- Copy item data to cart entity
|
|
local entity = obj:get_luaentity()
|
|
entity.owner = owner
|
|
entity.userID = userID
|
|
entity.cargo = cargo
|
|
entity.myID = myID
|
|
obj:set_nametag_attributes({color = "#FFFF00", text = owner..": "..userID})
|
|
minecart.add_to_monitoring(obj, myID, owner, userID)
|
|
return myID
|
|
else
|
|
print("Entity has no ID")
|
|
end
|
|
end
|
|
|
|
function api.stop_cart(pos, entity, node_name, param2)
|
|
-- Stop sound
|
|
if entity.sound_handle then
|
|
minetest.sound_stop(entity.sound_handle)
|
|
entity.sound_handle = nil
|
|
end
|
|
minecart.stop_cart(pos, entity.myID)
|
|
end
|
|
|
|
|
|
-- Player adds the node
|
|
function api.add_cart(itemstack, placer, pointed_thing, node_name)
|
|
local owner = placer:get_player_name()
|
|
local meta = placer:get_meta()
|
|
local param2 = minetest.dir_to_facedir(placer:get_look_dir())
|
|
local userID = 0
|
|
local cargo = {}
|
|
|
|
-- Add node
|
|
if carts:is_rail(pointed_thing.under) then
|
|
add_cart(pointed_thing.under, node_name, param2, owner, userID, cargo)
|
|
meta:set_string("cart_pos", P2S(pointed_thing.under))
|
|
elseif carts:is_rail(pointed_thing.above) then
|
|
add_cart(pointed_thing.above, node_name, param2, owner, userID, cargo)
|
|
meta:set_string("cart_pos", P2S(pointed_thing.above))
|
|
else
|
|
return
|
|
end
|
|
|
|
minetest.sound_play({name = "default_place_node_metal", gain = 0.5},
|
|
{pos = pointed_thing.above})
|
|
|
|
if not (creative and creative.is_enabled_for
|
|
and creative.is_enabled_for(placer:get_player_name())) then
|
|
itemstack:take_item()
|
|
end
|
|
|
|
minetest.show_formspec(owner, "minecart:userID_entity",
|
|
"size[4,3]" ..
|
|
"label[0,0;Enter cart number:]" ..
|
|
"field[1,1;3,1;userID;;]" ..
|
|
"button_exit[1,2;2,1;exit;Save]")
|
|
|
|
return itemstack
|
|
end
|
|
|
|
-- Player removes the node
|
|
function api.remove_cart(self, pos, player)
|
|
-- Add cart to player inventory
|
|
local inv = player:get_inventory()
|
|
if not (creative and creative.is_enabled_for
|
|
and creative.is_enabled_for(player:get_player_name()))
|
|
or not inv:contains_item("main", "minecart:cart") then
|
|
local leftover = inv:add_item("main", "minecart:cart")
|
|
-- If no room in inventory add a replacement cart to the world
|
|
if not leftover:is_empty() then
|
|
minetest.add_item(pos, leftover)
|
|
end
|
|
end
|
|
minecart.remove_from_monitoring(self.myID)
|
|
self.object:remove()
|
|
-- Stop sound
|
|
if self.sound_handle then
|
|
minetest.sound_stop(self.sound_handle)
|
|
self.sound_handle = nil
|
|
end
|
|
return true
|
|
end
|
|
|
|
function api.load_cargo(self, pos)
|
|
self.cargo = self.cargo or {}
|
|
for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
local entity = obj_:get_luaentity()
|
|
if not obj_:is_player() and entity and entity.name == "__builtin:item" then
|
|
obj_:remove()
|
|
self.cargo[#self.cargo + 1] = entity.itemstring
|
|
end
|
|
end
|
|
end
|
|
|
|
function api.unload_cargo(self, pos)
|
|
-- Spawn loaded items again
|
|
for _,item in ipairs(self.cargo or {}) do
|
|
minetest.add_item(pos, ItemStack(item))
|
|
end
|
|
self.cargo = {}
|
|
end
|
|
|
|
-- in the case the owner punches the cart
|
|
function api.add_cargo_to_player_inv(self, pos, puncher)
|
|
local added = false
|
|
local inv = puncher:get_inventory()
|
|
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
local entity = obj:get_luaentity()
|
|
if not obj:is_player() and entity and entity.name == "__builtin:item" then
|
|
obj:remove()
|
|
local item = ItemStack(entity.itemstring)
|
|
local leftover = inv:add_item("main", item)
|
|
if leftover:get_count() > 0 then
|
|
minetest.add_item(pos, leftover)
|
|
end
|
|
added = true -- don't dig the cart
|
|
end
|
|
end
|
|
return added
|
|
end
|
|
|
|
return api
|