2021-05-14 20:19:09 +03:00
|
|
|
--[[
|
|
|
|
|
|
|
|
Minecart
|
|
|
|
========
|
|
|
|
|
|
|
|
Copyright (C) 2019-2021 Joachim Stolberg
|
|
|
|
|
|
|
|
MIT
|
|
|
|
See license.txt for more information
|
2023-03-05 13:54:37 +03:00
|
|
|
|
2021-05-14 20:19:09 +03:00
|
|
|
]]--
|
|
|
|
|
|
|
|
--
|
|
|
|
-- API functions
|
|
|
|
--
|
|
|
|
|
|
|
|
-- 'pos' is the position of the puncher/sensor, the cart
|
|
|
|
-- position will be determined by means of 'param2' and 'radius'
|
2021-08-01 12:00:22 +03:00
|
|
|
|
|
|
|
-- Function returns true for all standing carts (entities and nodes)
|
2021-05-14 20:19:09 +03:00
|
|
|
function minecart.is_cart_available(pos, param2, radius)
|
2021-08-01 12:00:22 +03:00
|
|
|
return minecart.get_nodecart_nearby(pos, param2, radius) ~= nil or
|
|
|
|
minecart.get_entitycart_nearby(pos, param2, radius) ~= nil
|
2023-03-05 13:54:37 +03:00
|
|
|
end
|
2021-05-14 20:19:09 +03:00
|
|
|
|
2021-08-01 12:00:22 +03:00
|
|
|
-- Function returns true if a standing cart as node is avaliable
|
2021-05-14 20:19:09 +03:00
|
|
|
function minecart.is_nodecart_available(pos, param2, radius)
|
2021-08-01 12:00:22 +03:00
|
|
|
return minecart.get_nodecart_nearby(pos, param2, radius) ~= nil
|
2023-03-05 13:54:37 +03:00
|
|
|
end
|
2021-08-01 12:00:22 +03:00
|
|
|
|
|
|
|
-- Function returns true if a standing cart as entity is avaliable
|
|
|
|
function minecart.is_entitycart_available(pos, param2, radius)
|
|
|
|
return minecart.get_entitycart_nearby(pos, param2, radius) ~= nil
|
2023-03-05 13:54:37 +03:00
|
|
|
end
|
2021-05-14 20:19:09 +03:00
|
|
|
|
|
|
|
function minecart.punch_cart(pos, param2, radius, punch_dir)
|
2023-03-05 13:54:37 +03:00
|
|
|
local pos2, node = minecart.get_nodecart_nearby(pos, param2, radius)
|
2021-05-14 20:19:09 +03:00
|
|
|
if pos2 then
|
|
|
|
minecart.start_nodecart(pos2, node.name, nil, punch_dir)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
-- The entity check is needed for a cart with driver
|
|
|
|
local entity = minecart.get_entitycart_nearby(pos, param2, radius)
|
|
|
|
if entity and entity.driver then
|
|
|
|
minecart.push_entitycart(entity, punch_dir)
|
|
|
|
return true
|
|
|
|
end
|
2023-03-05 13:54:37 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
-- API functions for other mods to add/remove carts
|
|
|
|
--------------------------------------------------------------------------------------------
|
|
|
|
function minecart.is_cart(name)
|
|
|
|
return minecart.tNodeNames[name] ~= nil
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Remove a cart, available as node
|
|
|
|
function minecart.remove_cart(pos)
|
|
|
|
local node = minecart.get_node_lvm(pos)
|
|
|
|
local cargo, owner, userID = minecart.remove_nodecart(pos, node)
|
|
|
|
minecart.monitoring_remove_cart(owner, userID)
|
|
|
|
local cartdef = {cargo = cargo, owner = owner, userID = userID}
|
|
|
|
return cartdef
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Place and start the cart
|
|
|
|
function minecart.place_and_start_cart(pos, node, cartdef, player)
|
|
|
|
local name = minecart.get_node_lvm(pos).name
|
|
|
|
if minecart.is_rail(pos, name) or minecart.is_cart(name) then
|
|
|
|
local vel = {x = 0, y = 0, z = 0}
|
|
|
|
local entity_name = minecart.tNodeNames[node.name]
|
|
|
|
local obj = minecart.add_entitycart(pos, node.name, entity_name, vel,
|
|
|
|
cartdef.cargo, cartdef.owner, cartdef.userID)
|
|
|
|
local entity = obj:get_luaentity()
|
|
|
|
minecart.monitoring_add_cart(cartdef.owner, cartdef.userID, pos, node.name, entity_name)
|
|
|
|
if player then
|
|
|
|
minecart.manage_attachment(player, entity, true)
|
|
|
|
end
|
|
|
|
minecart.start_entitycart(entity, pos, 0)
|
|
|
|
else
|
|
|
|
minecart.add_nodecart(pos, node.name, node.param2, cartdef.cargo, cartdef.owner, cartdef.userID, true)
|
|
|
|
end
|
|
|
|
end
|