Make straight rails with a free end bend towards newly placed rail and form corners
This commit is contained in:
parent
e27b83fd50
commit
322017b060
|
@ -225,30 +225,7 @@ local function get_rail_connections(pos, opt)
|
||||||
end
|
end
|
||||||
mod.get_rail_connections = get_rail_connections
|
mod.get_rail_connections = get_rail_connections
|
||||||
|
|
||||||
local function update_rail_connections(pos, opt)
|
local function apply_connection_rules(node, nodedef, pos, rules, connections)
|
||||||
local ignore_neighbor_connections = opt and opt.ignore_neighbor_connections
|
|
||||||
|
|
||||||
local node = minetest.get_node(pos)
|
|
||||||
local nodedef = minetest.registered_nodes[node.name]
|
|
||||||
if not nodedef or not nodedef._mcl_minecarts then return end
|
|
||||||
|
|
||||||
-- Get the mappings to use
|
|
||||||
local rules = HORIZONTAL_RULES_BY_RAIL_GROUP[nodedef.groups.rail]
|
|
||||||
if nodedef._mcl_minecarts and nodedef._mcl_minecarts.connection_rules then -- Custom connection rules
|
|
||||||
rules = nodedef._mcl_minecarts.connection_rules
|
|
||||||
end
|
|
||||||
if not rules then return end
|
|
||||||
|
|
||||||
-- Horizontal rules, Check for rails on each neighbor
|
|
||||||
local connections = get_rail_connections(pos, opt)
|
|
||||||
|
|
||||||
-- Check for rasing rails to slopes
|
|
||||||
for i = 1,#CONNECTIONS do
|
|
||||||
local dir = CONNECTIONS[i]
|
|
||||||
local neighbor = vector.add(pos, dir)
|
|
||||||
make_sloped_if_straight( vector.offset(neighbor, 0, -1, 0), dir )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Select the best allowed connection
|
-- Select the best allowed connection
|
||||||
local rule = nil
|
local rule = nil
|
||||||
local score = 0
|
local score = 0
|
||||||
|
@ -276,6 +253,90 @@ local function update_rail_connections(pos, opt)
|
||||||
rule.after(rule, pos, connections)
|
rule.after(rule, pos, connections)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function is_rail_end_connected(pos, dir)
|
||||||
|
-- Handle new track types that have track-specific direction handler
|
||||||
|
local node = force_get_node(pos)
|
||||||
|
local get_next_dir = get_path(minetest.registered_nodes,node.name,"_mcl_minecarts","get_next_dir")
|
||||||
|
if not get_next_dir then return false end
|
||||||
|
|
||||||
|
return get_next_dir(pos, dir, node) == dir
|
||||||
|
end
|
||||||
|
|
||||||
|
local function bend_straight_rail(pos, towards)
|
||||||
|
dir = CONNECTIONS[i]
|
||||||
|
local node = force_get_node(pos)
|
||||||
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
|
-- Only bend rails
|
||||||
|
local rail_type = minetest.get_item_group(node.name, "rail")
|
||||||
|
if rail_type == 0 then return end
|
||||||
|
|
||||||
|
-- Only bend unbent rails
|
||||||
|
if node.name ~= nodedef._mcl_minecarts.base_name then return end
|
||||||
|
|
||||||
|
-- only bend rails that have at least one free end
|
||||||
|
local dir1 = minetest.fourdir_to_dir(node.param2)
|
||||||
|
local dir2 = minetest.fourdir_to_dir((node.param2+2)%4)
|
||||||
|
local dir1_connected = is_rail_end_connected(pos + dir1, dir2)
|
||||||
|
local dir2_connected = is_rail_end_connected(pos + dir2, dir1)
|
||||||
|
if dir1_connected and dir2_connected then return end
|
||||||
|
|
||||||
|
-- TODO: bend the rail
|
||||||
|
local connections = {
|
||||||
|
vector.direction(pos, towards),
|
||||||
|
}
|
||||||
|
if dir1_connected then
|
||||||
|
connections[#connections+1] = dir1
|
||||||
|
end
|
||||||
|
if dir2_connected then
|
||||||
|
connections[#connections+1] = dir2
|
||||||
|
end
|
||||||
|
local connections_mask = 0
|
||||||
|
for i = 1,#CONNECTIONS do
|
||||||
|
for j = 1,#connections do
|
||||||
|
if CONNECTIONS[i] == connections[j] then
|
||||||
|
connections_mask = bit.bor(connections_mask, bit.lshift(1, i -1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local rules = HORIZONTAL_RULES_BY_RAIL_GROUP[nodedef.groups.rail]
|
||||||
|
apply_connection_rules(node, nodedef, pos, rules, connections_mask)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_rail_connections(pos, opt)
|
||||||
|
local ignore_neighbor_connections = opt and opt.ignore_neighbor_connections
|
||||||
|
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
if not nodedef or not nodedef._mcl_minecarts then return end
|
||||||
|
|
||||||
|
-- Get the mappings to use
|
||||||
|
local rules = HORIZONTAL_RULES_BY_RAIL_GROUP[nodedef.groups.rail]
|
||||||
|
if nodedef._mcl_minecarts and nodedef._mcl_minecarts.connection_rules then -- Custom connection rules
|
||||||
|
rules = nodedef._mcl_minecarts.connection_rules
|
||||||
|
end
|
||||||
|
if not rules then return end
|
||||||
|
|
||||||
|
if not (opt and opt.no_bend_straights) then
|
||||||
|
for i = 1,#CONNECTIONS do
|
||||||
|
bend_straight_rail(vector.add(pos, CONNECTIONS[i]), pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Horizontal rules, Check for rails on each neighbor
|
||||||
|
local connections = get_rail_connections(pos, opt)
|
||||||
|
|
||||||
|
-- Check for rasing rails to slopes
|
||||||
|
for i = 1,#CONNECTIONS do
|
||||||
|
local dir = CONNECTIONS[i]
|
||||||
|
local neighbor = vector.add(pos, dir)
|
||||||
|
make_sloped_if_straight( vector.offset(neighbor, 0, -1, 0), dir )
|
||||||
|
end
|
||||||
|
|
||||||
|
apply_connection_rules(node, nodedef, pos, rules, connections)
|
||||||
|
|
||||||
local node_def = minetest.registered_nodes[node.name]
|
local node_def = minetest.registered_nodes[node.name]
|
||||||
if get_path(node_def, "_mcl_minecarts", "can_slope") then
|
if get_path(node_def, "_mcl_minecarts", "can_slope") then
|
||||||
|
|
Loading…
Reference in New Issue