mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-30 22:41:20 +01:00
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:
parent
284c366136
commit
5bd06f5c03
5 changed files with 72 additions and 11 deletions
|
@ -1143,3 +1143,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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
if staticdata.connected_at then
|
||||||
do_movement(self, dtime)
|
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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in a new issue