mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-05 07:41:06 +01:00
Get sloped connections working correctly
This commit is contained in:
parent
ad11fc22ec
commit
3391a28fa9
3 changed files with 102 additions and 36 deletions
|
@ -10,6 +10,12 @@ function mcl_minecarts:get_sign(z)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function get_path(base, first, ...)
|
||||||
|
if not first then return base end
|
||||||
|
if not base then return end
|
||||||
|
return get_path(base[first], ...)
|
||||||
|
end
|
||||||
|
|
||||||
function mcl_minecarts:velocity_to_dir(v)
|
function mcl_minecarts:velocity_to_dir(v)
|
||||||
if math.abs(v.x) > math.abs(v.z) then
|
if math.abs(v.x) > math.abs(v.z) then
|
||||||
return vector.new(
|
return vector.new(
|
||||||
|
@ -82,13 +88,13 @@ mod.west = west
|
||||||
|
|
||||||
local CONNECTIONS = { north, south, east, west }
|
local CONNECTIONS = { north, south, east, west }
|
||||||
local HORIZONTAL_STANDARD_RULES = {
|
local HORIZONTAL_STANDARD_RULES = {
|
||||||
[N] = { "", 0, mask = N, score = 1 },
|
[N] = { "", 0, mask = N, score = 1, can_slope = true },
|
||||||
[S] = { "", 0, mask = S, score = 1 },
|
[S] = { "", 0, mask = S, score = 1, can_slope = true },
|
||||||
[N+S] = { "", 0, mask = N+S, score = 2 },
|
[N+S] = { "", 0, mask = N+S, score = 2, can_slope = true },
|
||||||
|
|
||||||
[E] = { "", 1, mask = E, score = 1 },
|
[E] = { "", 1, mask = E, score = 1, can_slope = true },
|
||||||
[W] = { "", 1, mask = W, score = 1 },
|
[W] = { "", 1, mask = W, score = 1, can_slope = true },
|
||||||
[E+W] = { "", 1, mask = E+W, score = 2 },
|
[E+W] = { "", 1, mask = E+W, score = 2, can_slope = true },
|
||||||
}
|
}
|
||||||
|
|
||||||
local HORIZONTAL_CURVES_RULES = {
|
local HORIZONTAL_CURVES_RULES = {
|
||||||
|
@ -127,6 +133,26 @@ local function check_connection_rule(pos, connections, rule)
|
||||||
end
|
end
|
||||||
mod.check_connection_rules = check_connection_rules
|
mod.check_connection_rules = check_connection_rules
|
||||||
|
|
||||||
|
local function make_sloped_if_straight(pos, dir)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
|
local param2 = 0
|
||||||
|
if dir == east then
|
||||||
|
param2 = 3
|
||||||
|
elseif dir == west then
|
||||||
|
param2 = 1
|
||||||
|
elseif dir == north then
|
||||||
|
param2 = 2
|
||||||
|
elseif dir == south then
|
||||||
|
param2 = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
if get_path( nodedef, "_mcl_minecarts", "railtype" ) == "straight" then
|
||||||
|
minetest.swap_node(pos, {name = nodedef._mcl_minecarts.base_name .. "_sloped", param2 = param2})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function update_rail_connections(pos, update_neighbors)
|
local function update_rail_connections(pos, update_neighbors)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
local nodedef = minetest.registered_nodes[node.name]
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
@ -150,13 +176,17 @@ local function update_rail_connections(pos, update_neighbors)
|
||||||
local nodedef = minetest.registered_nodes[node.name]
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
-- Only allow connections to the open ends of rails, as decribed by get_next_dir
|
-- Only allow connections to the open ends of rails, as decribed by get_next_dir
|
||||||
if (nodedef.groups or {}).rail and nodedef._mcl_minecarts and nodedef._mcl_minecarts.get_next_dir then
|
if get_path(nodedef, "groups", "rail") and get_path(nodedef, "_mcl_minecarts", "get_next_dir" ) then
|
||||||
|
--if nodedef and (nodedef.groups or {}).rail and nodedef._mcl_minecarts and nodedef._mcl_minecarts.get_next_dir then
|
||||||
local diff = vector.direction(neighbor, pos)
|
local diff = vector.direction(neighbor, pos)
|
||||||
local next_dir = nodedef._mcl_minecarts.get_next_dir(neighbor, diff, node)
|
local next_dir = nodedef._mcl_minecarts.get_next_dir(neighbor, diff, node)
|
||||||
if next_dir == diff then
|
if next_dir == diff then
|
||||||
connections = connections + bit.lshift(1,i - 1)
|
connections = connections + bit.lshift(1,i - 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Check for rasing rails to slopes
|
||||||
|
make_sloped_if_straight( vector.offset(neighbor, 0, -1, 0), dir )
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Select the best allowed connection
|
-- Select the best allowed connection
|
||||||
|
@ -171,7 +201,7 @@ local function update_rail_connections(pos, update_neighbors)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not rule then return end
|
if rule then
|
||||||
|
|
||||||
-- Apply the mapping
|
-- Apply the mapping
|
||||||
local new_name = nodedef._mcl_minecarts.base_name..rule[1]
|
local new_name = nodedef._mcl_minecarts.base_name..rule[1]
|
||||||
|
@ -186,6 +216,21 @@ local function update_rail_connections(pos, update_neighbors)
|
||||||
rule.after(rule, pos, connections)
|
rule.after(rule, pos, connections)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local node_def = minetest.registered_nodes[node.name]
|
||||||
|
if get_path(node_def, "_mcl_minecarts", "can_slope") then
|
||||||
|
for _,dir in ipairs(CONNECTIONS) do
|
||||||
|
if mcl_minecarts:is_rail(vector.offset(pos,dir.x,1,dir.z)) then
|
||||||
|
local rev_dir = vector.direction(dir,vector.new(0,0,0))
|
||||||
|
print("try to make slope at "..tostring(pos))
|
||||||
|
make_sloped_if_straight(pos, rev_dir)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print(node.name.." can't slope")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
mod.update_rail_connections = update_rail_connections
|
mod.update_rail_connections = update_rail_connections
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# hand-made Wavefront .OBJ file for sloped rail
|
# hand-made Wavefront .OBJ file for sloped rail
|
||||||
mtllib mcl_minecarts_rail.mtl
|
mtllib mcl_minecarts_rail.mtl
|
||||||
o sloped_rail.001
|
o sloped_rail.001
|
||||||
v -0.500000 -0.500000 -0.500000
|
v -0.500000 -0.437500 -0.500000
|
||||||
v -0.500000 0.500000 0.500000
|
v -0.500000 0.562500 0.500000
|
||||||
v 0.500000 0.500000 0.500000
|
v 0.500000 0.562500 0.500000
|
||||||
v 0.500000 -0.500000 -0.500000
|
v 0.500000 -0.437500 -0.500000
|
||||||
vt 1.000000 0.000000
|
vt 1.000000 0.000000
|
||||||
vt 1.000000 1.000000
|
vt 1.000000 1.000000
|
||||||
vt 0.000000 1.000000
|
vt 0.000000 1.000000
|
||||||
|
|
|
@ -98,7 +98,7 @@ local BASE_DEF = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "4dir",
|
||||||
}
|
}
|
||||||
table_merge(BASE_DEF, RAIL_DEFAULTS) -- Merge together old rail values
|
table_merge(BASE_DEF, RAIL_DEFAULTS) -- Merge together old rail values
|
||||||
|
|
||||||
|
@ -213,27 +213,32 @@ end
|
||||||
local function register_straight_rail(base_name, tiles, def)
|
local function register_straight_rail(base_name, tiles, def)
|
||||||
def = def or {}
|
def = def or {}
|
||||||
local base_def = table.copy(BASE_DEF)
|
local base_def = table.copy(BASE_DEF)
|
||||||
table_merge(base_def,{
|
local sloped_def = table.copy(SLOPED_RAIL_DEF)
|
||||||
|
local add = {
|
||||||
tiles = { tiles[1] },
|
tiles = { tiles[1] },
|
||||||
_mcl_minecarts = { base_name = base_name },
|
|
||||||
drop = base_name,
|
drop = base_name,
|
||||||
groups = {
|
groups = {
|
||||||
rail = mod.RAIL_GROUPS.STRANDARD,
|
rail = mod.RAIL_GROUPS.STANDARD,
|
||||||
},
|
},
|
||||||
_mcl_minecarts = {
|
_mcl_minecarts = {
|
||||||
base_name = base_name,
|
base_name = base_name,
|
||||||
get_next_dir = rail_dir_straight
|
get_next_dir = rail_dir_straight,
|
||||||
|
can_slope = true,
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
table_merge(base_def, def)
|
table_merge(base_def, add); table_merge(sloped_def, add)
|
||||||
|
table_merge(base_def, def); table_merge(sloped_def, def)
|
||||||
|
|
||||||
-- Register the base node
|
-- Register the base node
|
||||||
mod.register_rail(base_name, base_def)
|
mod.register_rail(base_name, base_def)
|
||||||
base_def.craft = false
|
base_def.craft = nil; sloped_def.craft = nil
|
||||||
table_merge(base_def,{
|
table_merge(base_def,{
|
||||||
groups = {
|
groups = {
|
||||||
not_in_creative_inventory = 1,
|
not_in_creative_inventory = 1,
|
||||||
},
|
},
|
||||||
|
_mcl_minecarts = {
|
||||||
|
railtype = "straight",
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Sloped variant
|
-- Sloped variant
|
||||||
|
@ -243,6 +248,9 @@ local function register_straight_rail(base_name, tiles, def)
|
||||||
get_next_dir = rail_dir_cross,
|
get_next_dir = rail_dir_cross,
|
||||||
},
|
},
|
||||||
tiles = { tiles[1] },
|
tiles = { tiles[1] },
|
||||||
|
_mcl_minecarts = {
|
||||||
|
railtype = "sloped",
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
end
|
end
|
||||||
mod.register_straight_rail = register_straight_rail
|
mod.register_straight_rail = register_straight_rail
|
||||||
|
@ -250,21 +258,25 @@ mod.register_straight_rail = register_straight_rail
|
||||||
local function register_curves_rail(base_name, tiles, def)
|
local function register_curves_rail(base_name, tiles, def)
|
||||||
def = def or {}
|
def = def or {}
|
||||||
local base_def = table.copy(BASE_DEF)
|
local base_def = table.copy(BASE_DEF)
|
||||||
table_merge(base_def,{
|
local sloped_def = table.copy(SLOPED_RAIL_DEF)
|
||||||
|
local add = {
|
||||||
_mcl_minecarts = { base_name = base_name },
|
_mcl_minecarts = { base_name = base_name },
|
||||||
groups = {
|
groups = {
|
||||||
rail = mod.RAIL_GROUPS.CURVES
|
rail = mod.RAIL_GROUPS.CURVES
|
||||||
},
|
},
|
||||||
drop = base_name,
|
drop = base_name,
|
||||||
})
|
}
|
||||||
table_merge(base_def, def)
|
table_merge(base_def, add); table_merge(sloped_def, add)
|
||||||
|
table_merge(base_def, def); table_merge(sloped_def, def)
|
||||||
|
|
||||||
-- Register the base node
|
-- Register the base node
|
||||||
mod.register_rail(base_name, table_merge(table.copy(base_def),{
|
mod.register_rail(base_name, table_merge(table.copy(base_def),{
|
||||||
tiles = { tiles[1] },
|
tiles = { tiles[1] },
|
||||||
_mcl_minecarts = {
|
_mcl_minecarts = {
|
||||||
get_next_dir = rail_dir_straight
|
get_next_dir = rail_dir_straight,
|
||||||
}
|
railtype = "straight",
|
||||||
|
can_slope = true,
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
-- Update for other variants
|
-- Update for other variants
|
||||||
|
@ -280,6 +292,7 @@ local function register_curves_rail(base_name, tiles, def)
|
||||||
tiles = { tiles[2] },
|
tiles = { tiles[2] },
|
||||||
_mcl_minecarts = {
|
_mcl_minecarts = {
|
||||||
get_next_dir = rail_dir_curve,
|
get_next_dir = rail_dir_curve,
|
||||||
|
railtype = "corner",
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
@ -297,12 +310,16 @@ local function register_curves_rail(base_name, tiles, def)
|
||||||
end,
|
end,
|
||||||
rules = mesecon.rules.alldirs,
|
rules = mesecon.rules.alldirs,
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
_mcl_minecarts = {
|
||||||
|
railtype = "corner",
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
mod.register_rail(base_name.."_tee_on", table_merge(table.copy(base_def),{
|
mod.register_rail(base_name.."_tee_on", table_merge(table.copy(base_def),{
|
||||||
tiles = { tiles[4] },
|
tiles = { tiles[4] },
|
||||||
_mcl_minecarts = {
|
_mcl_minecarts = {
|
||||||
get_next_dir = rail_dir_tee,
|
get_next_dir = rail_dir_tee,
|
||||||
|
railtype = "tee",
|
||||||
},
|
},
|
||||||
mesecons = {
|
mesecons = {
|
||||||
effector = {
|
effector = {
|
||||||
|
@ -316,10 +333,11 @@ local function register_curves_rail(base_name, tiles, def)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
-- Sloped variant
|
-- Sloped variant
|
||||||
mod.register_rail_sloped(base_name.."_sloped", table_merge(table.copy(base_def),{
|
mod.register_rail_sloped(base_name.."_sloped", table_merge(table.copy(sloped_def),{
|
||||||
description = S("Sloped Rail"), -- Temporary name to make debugging easier
|
description = S("Sloped Rail"), -- Temporary name to make debugging easier
|
||||||
_mcl_minecarts = {
|
_mcl_minecarts = {
|
||||||
get_next_dir = rail_dir_cross,
|
get_next_dir = rail_dir_cross,
|
||||||
|
railtype = "tee",
|
||||||
},
|
},
|
||||||
tiles = { tiles[1] },
|
tiles = { tiles[1] },
|
||||||
}))
|
}))
|
||||||
|
@ -327,6 +345,9 @@ local function register_curves_rail(base_name, tiles, def)
|
||||||
-- Cross variant
|
-- Cross variant
|
||||||
mod.register_rail(base_name.."_cross", table_merge(table.copy(base_def),{
|
mod.register_rail(base_name.."_cross", table_merge(table.copy(base_def),{
|
||||||
tiles = { tiles[5] },
|
tiles = { tiles[5] },
|
||||||
|
_mcl_minecarts = {
|
||||||
|
railtype = "cross",
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
end
|
end
|
||||||
mod.register_curves_rail = register_curves_rail
|
mod.register_curves_rail = register_curves_rail
|
||||||
|
|
Loading…
Reference in a new issue