1
0
Fork 0

Fix call signature of mcl_util.hopper_pull_to_inventory, move cart-specific behaviors to _mcl_minecarts_on_step handlers, fix typo, change distance used in rail reattach code, move cart_id generation

This commit is contained in:
teknomunk 2024-03-23 07:09:20 +00:00
parent f9e8f60a1c
commit 64b930ac3e
2 changed files with 109 additions and 139 deletions

View File

@ -345,7 +345,7 @@ function mcl_util.hopper_push(pos, dst_pos)
return ok return ok
end end
function mcl_util.hopper_pull_to_inventory(hop_inv, hop_list, src_pos) function mcl_util.hopper_pull_to_inventory(hop_inv, hop_list, src_pos, pos)
-- TODO: merge together with hopper_pull after https://git.minetest.land/MineClone2/MineClone2/pulls/4190 is merged -- TODO: merge together with hopper_pull after https://git.minetest.land/MineClone2/MineClone2/pulls/4190 is merged
-- Get node pos' for item transfer -- Get node pos' for item transfer
local src = minetest.get_node(src_pos) local src = minetest.get_node(src_pos)

View File

@ -645,6 +645,9 @@ local function register_entity(entity_id, def)
-- Fix up types -- Fix up types
data.dir = vector.new(data.dir) data.dir = vector.new(data.dir)
-- Make sure all carts have an ID to isolate them
data.cart_id = staticdata.cart_id or math.random(1,1000000000)
self._staticdata = data self._staticdata = data
end end
self.object:set_armor_groups({immortal=1}) self.object:set_armor_groups({immortal=1})
@ -671,12 +674,13 @@ local function register_entity(entity_id, def)
pos = self.object:get_pos() pos = self.object:get_pos()
-- Try to reattach -- Try to reattach
local rounded_pos = vector.round(pos) local rounded_pos = vector.round(pos)
if mcl_minecarts:is_rail(rounded_pos) and vector.distance(pos, rounded_pos) < 0.25 then if mcl_minecarts:is_rail(rounded_pos) and vector.distance(pos, rounded_pos) < 0.5 then
-- Reattach -- Reattach
staticdata.connected_at = rounded_pos staticdata.connected_at = rounded_pos
pos = rounded_pos pos = rounded_pos
else else
mineclone.log("warning","TODO: handle detached cart behavior") minetest.log("warning","rounded_pos="..tostring(rounded_pos)..",dist="..vector.distance(pos, rounded_pos))
minetest.log("warning","TODO: handle detached cart behavior")
end end
end end
@ -783,7 +787,7 @@ local function register_entity(entity_id, def)
local new_watches = {} local new_watches = {}
for _,node_pos in ipairs(watches) do for _,node_pos in ipairs(watches) do
if node_pos ~= post then if node_pos ~= pos then
new_watches[#new_watches] = node_pos new_watches[#new_watches] = node_pos
end end
end end
@ -791,18 +795,12 @@ local function register_entity(entity_id, def)
end end
function cart:on_step(dtime) function cart:on_step(dtime)
-- TODO: move to _mcl_minecarts_on_step handler and on_enter handler for hopper minecart
hopper_take_item(self, dtime)
local staticdata = self._staticdata local staticdata = self._staticdata
-- Make sure all carts have an ID to isolate them
staticdata.cart_id = staticdata.cart_id or math.random(1,1000000000)
if not staticdata then if not staticdata then
staticdata = make_staticdata() staticdata = make_staticdata()
self._staticdata = staticdata self._staticdata = staticdata
end end
if (staticdata.hopper_delay or 0) > 0 then if (staticdata.hopper_delay or 0) > 0 then
staticdata.hopper_delay = staticdata.hopper_delay - dtime staticdata.hopper_delay = staticdata.hopper_delay - dtime
end end
@ -849,129 +847,9 @@ local function register_entity(entity_id, def)
end end
end end
-- TODO: move to _mcl_minecarts_on_step handler for plain minecart -- Cart specific behaviors
-- Grab mob local hook = self._mcl_minecarts_on_step
if math.random(1,20) > 15 and not self._passenger then if hook then hook(self,dtime) end
if self.name == "mcl_minecarts:minecart" then
local mobsnear = minetest.get_objects_inside_radius(self.object:get_pos(), 1.3)
for n=1, #mobsnear do
local mob = mobsnear[n]
if mob then
local entity = mob:get_luaentity()
if entity and entity.is_mob then
self._passenger = entity
mob:set_attach(self.object, "", passenger_attach_position, vector.zero())
break
end
end
end
end
elseif self._passenger then
local passenger_pos = self._passenger.object:get_pos()
if not passenger_pos then
self._passenger = nil
end
end
-- Drop minecart if it isn't on a rail anymore
--[[ Remove this entirely once off-cart minecart behavior is implemented
if self._last_float_check == nil then
self._last_float_check = 0
else
self._last_float_check = self._last_float_check + dtime
end
if self._last_float_check >= mcl_minecarts.check_float_time then
pos = self.object:get_pos()
rou_pos = vector.round(pos)
node = minetest.get_node(rou_pos)
local g = minetest.get_item_group(node.name, "connect_to_raillike")
if g ~= self._staticdata.railtype and self._staticdata.railtype then
-- Detach driver
detach_driver(self)
-- Explode if already ignited
if self._boomtimer then
self.object:remove()
mcl_explosions.explode(pos, 4, { drop_chance = 1.0 })
return
end
-- Do not drop minecart. It goes off the rails too frequently, and anyone using them for farms won't
-- notice and lose their iron and not bother. Not cool until fixed.
end
self._last_float_check = 0
end
]]
local hook = cart._mcl_minecarts_on_step
if hook then hook(cart,dtime) end
-- TODO: move the below into cart-specific hooks
-- TODO: move to _mcl_minecarts_on_step handler for furnace minecart
-- Update furnace stuff
if self._fueltime and self._fueltime > 0 then
self._fueltime = self._fueltime - dtime
if self._fueltime <= 0 then
self.object:set_properties({textures =
{
"default_furnace_top.png",
"default_furnace_top.png",
"default_furnace_front.png",
"default_furnace_side.png",
"default_furnace_side.png",
"default_furnace_side.png",
"mcl_minecarts_minecart.png",
}})
self._fueltime = 0
end
end
local has_fuel = self._fueltime and self._fueltime > 0
-- TODO: move to _mcl_minecarts_on_step handler for TNT minecart
-- Update TNT stuff
if self._boomtimer then
-- Explode
self._boomtimer = self._boomtimer - dtime
local pos = self.object:get_pos()
if self._boomtimer <= 0 then
self.object:remove()
mcl_explosions.explode(pos, 4, { drop_chance = 1.0 })
return
else
tnt.smoke_step(pos)
end
end
if self._blinktimer then
self._blinktimer = self._blinktimer - dtime
if self._blinktimer <= 0 then
self._blink = not self._blink
if self._blink then
self.object:set_properties({textures =
{
"default_tnt_top.png",
"default_tnt_bottom.png",
"default_tnt_side.png",
"default_tnt_side.png",
"default_tnt_side.png",
"default_tnt_side.png",
"mcl_minecarts_minecart.png",
}})
else
self.object:set_properties({textures =
{
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_minecarts_minecart.png",
}})
end
self._blinktimer = tnt.BLINKTIMER
end
end
end end
function cart:get_staticdata() function cart:get_staticdata()
@ -1152,7 +1030,31 @@ register_minecart({
end, name) end, name)
end end
end, end,
on_activate_by_rail = activate_normal_minecart on_activate_by_rail = activate_normal_minecart,
_mcl_minecarts_on_step = function(self, dtime)
-- Grab mob
if math.random(1,20) > 15 and not self._passenger then
if self.name == "mcl_minecarts:minecart" then
local mobsnear = minetest.get_objects_inside_radius(self.object:get_pos(), 1.3)
for n=1, #mobsnear do
local mob = mobsnear[n]
if mob then
local entity = mob:get_luaentity()
if entity and entity.is_mob then
self._passenger = entity
mob:set_attach(self.object, "", passenger_attach_position, vector.zero())
break
end
end
end
end
elseif self._passenger then
local passenger_pos = self._passenger.object:get_pos()
if not passenger_pos then
self._passenger = nil
end
end
end
}) })
-- Minecart with Chest -- Minecart with Chest
@ -1230,7 +1132,27 @@ register_minecart({
end end
end, end,
on_activate_by_rail = nil, on_activate_by_rail = nil,
creative = true creative = true,
_mcl_minecarts_on_step = function(self, dtime)
-- Update furnace stuff
if self._fueltime and self._fueltime > 0 then
self._fueltime = self._fueltime - dtime
if self._fueltime <= 0 then
self.object:set_properties({textures =
{
"default_furnace_top.png",
"default_furnace_top.png",
"default_furnace_front.png",
"default_furnace_side.png",
"default_furnace_side.png",
"default_furnace_side.png",
"mcl_minecarts_minecart.png",
}})
self._fueltime = 0
end
end
--local has_fuel = self._fueltime and self._fueltime > 0
end
}) })
-- Minecart with Command Block -- Minecart with Command Block
@ -1287,7 +1209,7 @@ register_minecart({
groups = { container = 1 }, groups = { container = 1 },
on_rightclick = nil, on_rightclick = nil,
on_activate_by_rail = nil, on_activate_by_rail = nil,
_mcl_minecarts_on_enter = function(self,pos) _mcl_minecarts_on_enter = function(self, pos)
local staticdata = self._staticdata local staticdata = self._staticdata
if (staticdata.hopper_delay or 0) > 0 then if (staticdata.hopper_delay or 0) > 0 then
return return
@ -1296,10 +1218,13 @@ register_minecart({
-- try to pull from containers into our inventory -- try to pull from containers into our inventory
local inv = mcl_entity_invs.load_inv(self,5) local inv = mcl_entity_invs.load_inv(self,5)
local above_pos = pos + vector.new(0,1,0) local above_pos = pos + vector.new(0,1,0)
mcl_util.hopper_pull_to_inventory(inv, 'main', above_pos) mcl_util.hopper_pull_to_inventory(inv, 'main', above_pos, pos)
staticdata.hopper_delay = (staticdata.hopper_delay or 0) + (1/20) staticdata.hopper_delay = (staticdata.hopper_delay or 0) + (1/20)
end, end,
_mcl_minecarts_on_step = function(self, dtime)
hopper_take_item(self, dtime)
end,
creative = true creative = true
}) })
mcl_entity_invs.register_inv("mcl_minecarts:hopper_minecart", "Hopper Minecart", 5, false, true) mcl_entity_invs.register_inv("mcl_minecarts:hopper_minecart", "Hopper Minecart", 5, false, true)
@ -1345,7 +1270,52 @@ register_minecart({
end end
end, end,
on_activate_by_rail = activate_tnt_minecart, on_activate_by_rail = activate_tnt_minecart,
creative = true creative = true,
_mcl_minecarts_on_step = function(self, dtime)
-- Update TNT stuff
if self._boomtimer then
-- Explode
self._boomtimer = self._boomtimer - dtime
local pos = self.object:get_pos()
if self._boomtimer <= 0 then
self.object:remove()
mcl_explosions.explode(pos, 4, { drop_chance = 1.0 })
return
else
tnt.smoke_step(pos)
end
end
if self._blinktimer then
self._blinktimer = self._blinktimer - dtime
if self._blinktimer <= 0 then
self._blink = not self._blink
if self._blink then
self.object:set_properties({textures =
{
"default_tnt_top.png",
"default_tnt_bottom.png",
"default_tnt_side.png",
"default_tnt_side.png",
"default_tnt_side.png",
"default_tnt_side.png",
"mcl_minecarts_minecart.png",
}})
else
self.object:set_properties({textures =
{
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_tnt_blink.png",
"mcl_minecarts_minecart.png",
}})
end
self._blinktimer = tnt.BLINKTIMER
end
end
end,
}) })