Make legacy rail update apply to all old rail types, add basic detached railcart physics with a stub to use mcl_physics when it gets merged

This commit is contained in:
teknomunk 2024-04-04 07:33:16 +00:00
parent 9d41eed732
commit 892c2d3e95
5 changed files with 72 additions and 11 deletions

View File

@ -1171,3 +1171,11 @@ local function table_merge(base, overlay)
end end
mcl_util.table_merge = table_merge mcl_util.table_merge = table_merge
function mcl_util.table_keys(t)
local keys = {}
for k,_ in pairs(t) do
keys[#keys + 1] = k
end
return keys
end

View File

@ -145,7 +145,6 @@ local function check_connection_rule(pos, connections, rule)
return true return true
end end
mod.check_connection_rules = check_connection_rules
local function make_sloped_if_straight(pos, dir) local function make_sloped_if_straight(pos, dir)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)

View File

@ -39,6 +39,22 @@ mcl_minecarts.on_enter_below = function(pos, cart, next_dir, node_def)
end end
end end
local function detach_minecart(self)
local staticdata = self._staticdata
print("Detaching minecart")
staticdata.connected_at = nil
self.object:set_velocity(staticdata.dir * staticdata.velocity)
end
local function try_detach_minecart(self)
local staticdata = self._staticdata
local node = minetest.get_node(staticdata.connected_at)
if minetest.get_item_group(node.name, "rail") == 0 then
detach_minecart(self)
end
end
--[[ --[[
Array of hooks { {u,v,w}, name } Array of hooks { {u,v,w}, name }
Actual position is pos + u * dir + v * right + w * up Actual position is pos + u * dir + v * right + w * up
@ -175,6 +191,9 @@ end
local function calculate_acceleration(self, staticdata) local function calculate_acceleration(self, staticdata)
local acceleration = 0 local acceleration = 0
-- Fix up movement data
staticdata.velocity = staticdata.velocity or 0
-- Apply friction if moving -- Apply friction if moving
if staticdata.velocity > 0 then if staticdata.velocity > 0 then
acceleration = -friction acceleration = -friction
@ -338,6 +357,8 @@ local function do_movement_step(self, dtime)
-- Enter the new node -- Enter the new node
handle_cart_enter(self, pos, next_dir) handle_cart_enter(self, pos, next_dir)
try_detach_minecart(self)
-- Handle end of track -- Handle end of track
if next_dir == staticdata.dir * -1 and next_dir.y == 0 then if next_dir == staticdata.dir * -1 and next_dir.y == 0 then
if DEBUG then print("Stopping cart at end of track at "..tostring(pos)) end if DEBUG then print("Stopping cart at end of track at "..tostring(pos)) end
@ -412,6 +433,40 @@ local function do_movement( self, dtime )
end end
end end
local function do_detached_movement(self, dtime)
local staticdata = self._staticdata
-- Apply physics
if mcl_physics then
mcl_physics.apply_entity_environmental_physics(self)
else
-- Simple physics
local friction = self.object:get_velocity()
friction.y = 0
local accel = vector.new(0,-9.81,0) -- gravity
accel = vector.add(accel, vector.multiply(friction,-0.9))
self.object:set_acceleration(accel)
end
-- Try to reconnect to rail
local pos_r = vector.round(self.object:get_pos())
local node = minetest.get_node(pos_r)
if minetest.get_item_group(node.name, "rail") ~= 0 then
print("Reconnected railcart at "..tostring(pos_r))
staticdata.connected_at = pos_r
staticdata.railtype = node.name
local freebody_velocity = self.object:get_velocity()
staticdata.dir = vector.normalize(freebody_velocity)
staticdata.velocity = vector.length(freebody_velocity)
-- Clear freebody movement
self.object:set_velocity(vector.new(0,0,0))
self.object:set_acceleration(vector.new(0,0,0))
end
end
local function detach_driver(self) local function detach_driver(self)
if not self._driver then if not self._driver then
return return
@ -756,6 +811,7 @@ local function register_entity(entity_id, def)
end end
-- Fix railtype field -- Fix railtype field
local pos = self.object:get_pos()
if staticdata.connected_at and not staticdata.railtype then if staticdata.connected_at and not staticdata.railtype then
local node = minetest.get_node(vector.floor(pos)).name local node = minetest.get_node(vector.floor(pos)).name
staticdata.railtype = minetest.get_item_group(node, "connect_to_raillike") staticdata.railtype = minetest.get_item_group(node, "connect_to_raillike")
@ -769,8 +825,6 @@ local function register_entity(entity_id, def)
staticdata.hopper_delay = staticdata.hopper_delay - dtime staticdata.hopper_delay = staticdata.hopper_delay - dtime
end end
local pos, rou_pos, node = self.object:get_pos()
-- Controls -- Controls
local ctrl, player = nil, nil local ctrl, player = nil, nil
if self._driver then if self._driver then
@ -794,7 +848,11 @@ local function register_entity(entity_id, def)
end end
end end
do_movement(self, dtime) if staticdata.connected_at then
do_movement(self, dtime)
else
do_detached_movement(self, dtime)
end
-- TODO: move this into mcl_core:cactus _mcl_minecarts_on_enter_side -- TODO: move this into mcl_core:cactus _mcl_minecarts_on_enter_side
-- Drop minecart if it collides with a cactus node -- Drop minecart if it collides with a cactus node
@ -850,7 +908,6 @@ function mcl_minecarts.place_minecart(itemstack, pointed_thing, placer)
-- Call placer -- Call placer
if le._mcl_minecarts_on_place then if le._mcl_minecarts_on_place then
--print("Calling on_place")
le._mcl_minecarts_on_place(le, placer) le._mcl_minecarts_on_place(le, placer)
end end

View File

@ -2,4 +2,4 @@ name = mcl_minecarts
author = Krock author = Krock
description = Minecarts are vehicles to move players quickly on rails. description = Minecarts are vehicles to move players quickly on rails.
depends = mcl_title, mcl_explosions, mcl_core, mcl_util, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons, mcl_entity_invs depends = mcl_title, mcl_explosions, mcl_core, mcl_util, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons, mcl_entity_invs
optional_depends = doc_identifier, mcl_wip optional_depends = doc_identifier, mcl_wip, mcl_physics

View File

@ -372,7 +372,6 @@ local function register_rail_sloped(itemstring, def)
-- Make registrations -- Make registrations
minetest.register_node(itemstring, ndef) minetest.register_node(itemstring, ndef)
if craft then minetest.register_craft(craft) end
end end
mod.register_rail_sloped = register_rail_sloped mod.register_rail_sloped = register_rail_sloped
@ -595,13 +594,12 @@ if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", "mcl_minecarts:golden_rail", "nodes", "mcl_minecarts:golden_rail_on") doc.add_entry_alias("nodes", "mcl_minecarts:golden_rail", "nodes", "mcl_minecarts:golden_rail_on")
end end
if 0==0 then
local CURVY_RAILS_MAP = { local CURVY_RAILS_MAP = {
["mcl_minecarts:rail"] = "mcl_minecarts:rail_v2", ["mcl_minecarts:rail"] = "mcl_minecarts:rail_v2",
} }
minetest.register_lbm({ minetest.register_lbm({
name = "mcl_minecarts:update_legacy_curvy_rails", name = "mcl_minecarts:update_legacy_curvy_rails",
nodenames = {"mcl_minecarts:rail"}, nodenames = mcl_util.table_keys(CURVY_RAILS_MAP),
action = function(pos, node) action = function(pos, node)
node.name = CURVY_RAILS_MAP[node.name] node.name = CURVY_RAILS_MAP[node.name]
if node.name then if node.name then
@ -620,7 +618,7 @@ local STRAIGHT_RAILS_MAP ={
} }
minetest.register_lbm({ minetest.register_lbm({
name = "mcl_minecarts:update_legacy_straight_rails", name = "mcl_minecarts:update_legacy_straight_rails",
nodenames = {"mcl_minecarts:golden_rail"}, nodenames = mcl_util.table_keys(STRAIGHT_RAILS_MAP),
action = function(pos, node) action = function(pos, node)
node.name = STRAIGHT_RAILS_MAP[node.name] node.name = STRAIGHT_RAILS_MAP[node.name]
if node.name then if node.name then
@ -641,4 +639,3 @@ minetest.register_lbm({
end end
end end
}) })
end