From be18edf7c64cce66f4155696d79c78637e735c19 Mon Sep 17 00:00:00 2001
From: teknomunk <teknomunk@protonmail.com>
Date: Sun, 31 Mar 2024 10:41:00 +0000
Subject: [PATCH] Update all rail types to new version

---
 mods/ENTITIES/mcl_minecarts/rails.lua | 343 +++++++++++++-------------
 1 file changed, 172 insertions(+), 171 deletions(-)

diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua
index cc84390eb..e4770f39b 100644
--- a/mods/ENTITIES/mcl_minecarts/rails.lua
+++ b/mods/ENTITIES/mcl_minecarts/rails.lua
@@ -201,6 +201,25 @@ local BASE_DEF = {
 		update_rail_connections(pos, true)
 	end,
 }
+local function register_straight_rail(base_name, tiles, def)
+	def = def or {}
+	local base_def = table.copy(BASE_DEF)
+	table_merge(base_def,{
+		_mcl_minecarts = { base_name = base_name },
+		drop = base_name,
+	})
+	table_merge(base_def, def)
+
+	-- Register the base node
+	mod.register_rail(base_name, table_merge(table.copy(base_def),{
+		tiles = { tiles[1] },
+		_mcl_minecarts = {
+			get_next_dir = rail_dir_straight
+		}
+	}))
+	BASE_DEF.craft = nil
+end
+mod.register_straight_rail = register_straight_rail
 local function register_curves_rail(base_name, tiles, def)
 	def = def or {}
 	local base_def = table.copy(BASE_DEF)
@@ -303,9 +322,6 @@ local function register_rail_sloped(itemstring, def)
 end
 mod.register_rail_sloped = register_rail_sloped
 
--- Register rails
-dofile(modpath.."/rails/standard.lua")
-
 -- Redstone rules
 local rail_rules_long =
 {{x=-1,  y= 0, z= 0, spread=true},
@@ -327,15 +343,6 @@ local rail_rules_long =
 local rail_rules_short = mesecon.rules.pplate
 
 -- Normal rail
-register_rail("mcl_minecarts:rail",
-	{"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
-	{
-		description = S("Rail"),
-		_tt_help = S("Track for minecarts"),
-		_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction."),
-		_doc_items_usagehelp = railuse,
-	}
-)
 mod.register_curves_rail("mcl_minecarts:rail_v2", {
 	"default_rail.png", 
 	"default_rail_curved.png",
@@ -343,6 +350,10 @@ mod.register_curves_rail("mcl_minecarts:rail_v2", {
 	"default_rail_t_junction_on.png",
 	"default_rail_crossing.png"
 },{
+	description = S("Rail"),
+	_tt_help = S("Track for minecarts"),
+	_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction."),
+	_doc_items_usagehelp = railuse,
 	craft = {
 		output = "mcl_minecarts:rail_v2 16",
 		recipe = {
@@ -352,188 +363,178 @@ mod.register_curves_rail("mcl_minecarts:rail_v2", {
 		}
 	},
 })
-
+register_rail("mcl_minecarts:rail", {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, {}, false ) -- deprecated
 
 -- Powered rail (off = brake mode)
-register_rail("mcl_minecarts:golden_rail",
-	{"mcl_minecarts_rail_golden.png", "mcl_minecarts_rail_golden_curved.png", "mcl_minecarts_rail_golden_t_junction.png", "mcl_minecarts_rail_golden_crossing.png"},
-	{
-		description = S("Powered Rail"),
-		_tt_help = S("Track for minecarts").."\n"..S("Speed up when powered, slow down when not powered"),
-		_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts."),
-		_doc_items_usagehelp = railuse .. "\n" .. S("Without redstone power, the rail will brake minecarts. To make this rail accelerate"..
-			" minecarts, power it with redstone power."),
-		_rail_acceleration = -3,
-		mesecons = {
-			conductor = {
-				state = mesecon.state.off,
-				offstate = "mcl_minecarts:golden_rail",
-				onstate = "mcl_minecarts:golden_rail_on",
-				rules = rail_rules_long,
-			},
+mod.register_straight_rail("mcl_minecarts:golden_rail_v2",{ "mcl_minecarts_rail_golden.png" },{
+	description = S("Powered Rail"),
+	_tt_help = S("Track for minecarts").."\n"..S("Speed up when powered, slow down when not powered"),
+	_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts."),
+	_doc_items_usagehelp = railuse .. "\n" .. S("Without redstone power, the rail will brake minecarts. To make this rail accelerate"..
+		" minecarts, power it with redstone power."),
+	_doc_items_create_entry = false,
+	_rail_acceleration = -3,
+	_max_acceleration_velocity = 8,
+	mesecons = {
+		conductor = {
+			state = mesecon.state.off,
+			offstate = "mcl_minecarts:golden_rail_v2",
+			onstate = "mcl_minecarts:golden_rail_v2_on",
+			rules = rail_rules_long,
 		},
+	},
+	drop = "mcl_minecarts:golden_rail_v2",
+	craft = {
+		output = "mcl_minecarts:golden_rail_v2 6",
+		recipe = {
+			{"mcl_core:gold_ingot", "", "mcl_core:gold_ingot"},
+			{"mcl_core:gold_ingot", "mcl_core:stick", "mcl_core:gold_ingot"},
+			{"mcl_core:gold_ingot", "mesecons:redstone", "mcl_core:gold_ingot"},
+		}
 	}
-)
+})
+register_rail("mcl_minecarts:golden_rail", {"mcl_minecarts_rail_golden.png", "mcl_minecarts_rail_golden_curved.png", "mcl_minecarts_rail_golden_t_junction.png", "mcl_minecarts_rail_golden_crossing.png"}, {}, false ) -- deprecated
 
 -- Powered rail (on = acceleration mode)
-register_rail("mcl_minecarts:golden_rail_on",
-	{"mcl_minecarts_rail_golden_powered.png", "mcl_minecarts_rail_golden_curved_powered.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"},
-	{
-		_doc_items_create_entry = false,
-		_rail_acceleration = 4,
-		_max_acceleration_velocity = 8,
-		mesecons = {
-			conductor = {
-				state = mesecon.state.on,
-				offstate = "mcl_minecarts:golden_rail",
-				onstate = "mcl_minecarts:golden_rail_on",
-				rules = rail_rules_long,
-			},
-		},
-		drop = "mcl_minecarts:golden_rail",
+mod.register_straight_rail("mcl_minecarts:golden_rail_v2_on",{ "mcl_minecarts_rail_golden_powered.png" },{
+	_doc_items_create_entry = false,
+	_rail_acceleration = 4,
+	_max_acceleration_velocity = 8,
+	groups = {
+		not_in_creative_inventory = 1,
 	},
-	false
-)
+	mesecons = {
+		conductor = {
+			state = mesecon.state.on,
+			offstate = "mcl_minecarts:golden_rail_v2",
+			onstate = "mcl_minecarts:golden_rail_v2_on",
+			rules = rail_rules_long,
+		},
+	},
+	drop = "mcl_minecarts:golden_rail_v2",
+})
+register_rail("mcl_minecarts:golden_rail_on", {"mcl_minecarts_rail_golden_powered.png", "mcl_minecarts_rail_golden_curved_powered.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"}, { }, false ) -- deprecated
 
 -- Activator rail (off)
-register_rail("mcl_minecarts:activator_rail",
-	{"mcl_minecarts_rail_activator.png", "mcl_minecarts_rail_activator_curved.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"},
-	{
-		description = S("Activator Rail"),
-		_tt_help = S("Track for minecarts").."\n"..S("Activates minecarts when powered"),
-		_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts."),
-		_doc_items_usagehelp = railuse .. "\n" .. S("To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail."),
-		mesecons = {
-			conductor = {
-				state = mesecon.state.off,
-				offstate = "mcl_minecarts:activator_rail",
-				onstate = "mcl_minecarts:activator_rail_on",
-				rules = rail_rules_long,
-
-			},
+mod.register_straight_rail("mcl_minecarts:activator_rail_v2", {"mcl_minecarts_rail_activator.png"},{
+	description = S("Activator Rail"),
+	_tt_help = S("Track for minecarts").."\n"..S("Activates minecarts when powered"),
+	_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts."),
+	_doc_items_usagehelp = railuse .. "\n" .. S("To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail."),
+	mesecons = {
+		conductor = {
+			state = mesecon.state.off,
+			offstate = "mcl_minecarts:activator_rail_v2",
+			onstate = "mcl_minecarts:activator_rail_v2_on",
+			rules = rail_rules_long,
 		},
-	}
-)
+	},
+	craft = {
+		output = "mcl_minecarts:activator_rail_v2 6",
+		recipe = {
+			{"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"},
+			{"mcl_core:iron_ingot", "mesecons_torch:mesecon_torch_on", "mcl_core:iron_ingot"},
+			{"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"},
+		}
+	},
+})
+register_rail("mcl_minecarts:activator_rail", {"mcl_minecarts_rail_activator.png", "mcl_minecarts_rail_activator_curved.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"}, {} ) -- deprecated
 
 -- Activator rail (on)
-register_rail("mcl_minecarts:activator_rail_on",
-	{"mcl_minecarts_rail_activator_powered.png", "mcl_minecarts_rail_activator_curved_powered.png", "mcl_minecarts_rail_activator_t_junction_powered.png", "mcl_minecarts_rail_activator_crossing_powered.png"},
-	{
-		_doc_items_create_entry = false,
-		mesecons = {
-			conductor = {
-				state = mesecon.state.on,
-				offstate = "mcl_minecarts:activator_rail",
-				onstate = "mcl_minecarts:activator_rail_on",
-				rules = rail_rules_long,
-			},
-			effector = {
-				-- Activate minecarts
-				action_on = function(pos, node)
-					local pos2 = { x = pos.x, y =pos.y + 1, z = pos.z }
-					local objs = minetest.get_objects_inside_radius(pos2, 1)
-					for _, o in pairs(objs) do
-						local l = o:get_luaentity()
-						if l and string.sub(l.name, 1, 14) == "mcl_minecarts:" and l.on_activate_by_rail then
-							l:on_activate_by_rail()
-						end
-					end
-				end,
-			},
-
-		},
-		_mcl_minecarts_on_enter = function(pos, cart)
-			if cart.on_activate_by_rail then
-				cart:on_activate_by_rail()
-			end
-		end,
-		drop = "mcl_minecarts:activator_rail",
+mod.register_straight_rail("mcl_minecarts:activator_rail_v2_on", {"mcl_minecarts_rail_activator_powered.png"},{
+	_doc_items_create_entry = false,
+	groups = {
+		not_in_creative_inventory = 1,
 	},
-	false
-)
+	mesecons = {
+		conductor = {
+			state = mesecon.state.on,
+			offstate = "mcl_minecarts:activator_rail_v2",
+			onstate = "mcl_minecarts:activator_rail_v2_on",
+			rules = rail_rules_long,
+		},
+		effector = {
+			-- Activate minecarts
+			action_on = function(pos, node)
+				local pos2 = { x = pos.x, y =pos.y + 1, z = pos.z }
+				local objs = minetest.get_objects_inside_radius(pos2, 1)
+				for _, o in pairs(objs) do
+					local l = o:get_luaentity()
+					if l and string.sub(l.name, 1, 14) == "mcl_minecarts:" and l.on_activate_by_rail then
+						l:on_activate_by_rail()
+					end
+				end
+			end,
+		},
+
+	},
+	_mcl_minecarts_on_enter = function(pos, cart)
+		if cart.on_activate_by_rail then
+			cart:on_activate_by_rail()
+		end
+	end,
+	drop = "mcl_minecarts:activator_rail_v2",
+})
+register_rail("mcl_minecarts:activator_rail_on", {"mcl_minecarts_rail_activator_powered.png", "mcl_minecarts_rail_activator_curved_powered.png", "mcl_minecarts_rail_activator_t_junction_powered.png", "mcl_minecarts_rail_activator_crossing_powered.png"}, { }, false ) -- deprecated
 
 -- Detector rail (off)
-register_rail("mcl_minecarts:detector_rail",
-	{"mcl_minecarts_rail_detector.png", "mcl_minecarts_rail_detector_curved.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"},
-	{
-		description = S("Detector Rail"),
-		_tt_help = S("Track for minecarts").."\n"..S("Emits redstone power when a minecart is detected"),
-		_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms."),
-		_doc_items_usagehelp = railuse .. "\n" .. S("To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail."),
-		mesecons = {
-			receptor = {
-				state = mesecon.state.off,
-				rules = rail_rules_short,
-			},
+mod.register_straight_rail("mcl_minecarts:detector_rail_v2",{"mcl_minecarts_rail_detector.png"},{
+	description = S("Detector Rail"),
+	_tt_help = S("Track for minecarts").."\n"..S("Emits redstone power when a minecart is detected"),
+	_doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms."),
+	_doc_items_usagehelp = railuse .. "\n" .. S("To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail."),
+	mesecons = {
+		receptor = {
+			state = mesecon.state.off,
+			rules = rail_rules_short,
 		},
-		_mcl_minecarts_on_enter = function(pos, cart)
-			local node = minetest.get_node(pos)
+	},
+	_mcl_minecarts_on_enter = function(pos, cart)
+		local node = minetest.get_node(pos)
 
-			local newnode = {
-				name = "mcl_minecarts:detector_rail_on",
-				param2 = node.param2
-			}
-			minetest.swap_node( pos, newnode )
-			mesecon.receptor_on(pos)
-		end,
+		local newnode = {
+			name = "mcl_minecarts:detector_rail_v2_on",
+			param2 = node.param2
+		}
+		minetest.swap_node( pos, newnode )
+		mesecon.receptor_on(pos)
+	end,
+	craft = {
+		output = "mcl_minecarts:detector_rail_v2 6",
+		recipe = {
+			{"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"},
+			{"mcl_core:iron_ingot", "mesecons_pressureplates:pressure_plate_stone_off", "mcl_core:iron_ingot"},
+			{"mcl_core:iron_ingot", "mesecons:redstone", "mcl_core:iron_ingot"},
+		}
 	}
-)
+})
+register_rail("mcl_minecarts:detector_rail", {"mcl_minecarts_rail_detector.png", "mcl_minecarts_rail_detector_curved.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"}, {} ) -- deprecated
 
 -- Detector rail (on)
-register_rail("mcl_minecarts:detector_rail_on",
-	{"mcl_minecarts_rail_detector_powered.png", "mcl_minecarts_rail_detector_curved_powered.png", "mcl_minecarts_rail_detector_t_junction_powered.png", "mcl_minecarts_rail_detector_crossing_powered.png"},
-	{
-		_doc_items_create_entry = false,
-		mesecons = {
-			receptor = {
-				state = mesecon.state.on,
-				rules = rail_rules_short,
-			},
-		},
-		_mcl_minecarts_on_leave = function(pos, cart)
-			local node = minetest.get_node(pos)
-
-			local newnode = {
-				name = "mcl_minecarts:detector_rail",
-				param2 = node.param2
-			}
-			minetest.swap_node( pos, newnode )
-			mesecon.receptor_off(pos)
-		end,
-		drop = "mcl_minecarts:detector_rail",
+mod.register_straight_rail("mcl_minecarts:detector_rail_v2_on",{"mcl_minecarts_rail_detector_powered.png"},{
+	groups = {
+		not_in_creative_inventory = 1,
 	},
-	false
-)
+	_doc_items_create_entry = false,
+	mesecons = {
+		receptor = {
+			state = mesecon.state.on,
+			rules = rail_rules_short,
+		},
+	},
+	_mcl_minecarts_on_leave = function(pos, cart)
+		local node = minetest.get_node(pos)
 
-
--- Crafting
-minetest.register_craft({
-	output = "mcl_minecarts:golden_rail 6",
-	recipe = {
-		{"mcl_core:gold_ingot", "", "mcl_core:gold_ingot"},
-		{"mcl_core:gold_ingot", "mcl_core:stick", "mcl_core:gold_ingot"},
-		{"mcl_core:gold_ingot", "mesecons:redstone", "mcl_core:gold_ingot"},
-	}
+		local newnode = {
+			name = "mcl_minecarts:detector_rail",
+			param2 = node.param2
+		}
+		minetest.swap_node( pos, newnode )
+		mesecon.receptor_off(pos)
+	end,
+	drop = "mcl_minecarts:detector_rail_v2",
 })
-
-minetest.register_craft({
-	output = "mcl_minecarts:activator_rail 6",
-	recipe = {
-		{"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"},
-		{"mcl_core:iron_ingot", "mesecons_torch:mesecon_torch_on", "mcl_core:iron_ingot"},
-		{"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"},
-	}
-})
-
-minetest.register_craft({
-	output = "mcl_minecarts:detector_rail 6",
-	recipe = {
-		{"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"},
-		{"mcl_core:iron_ingot", "mesecons_pressureplates:pressure_plate_stone_off", "mcl_core:iron_ingot"},
-		{"mcl_core:iron_ingot", "mesecons:redstone", "mcl_core:iron_ingot"},
-	}
-})
-
+register_rail("mcl_minecarts:detector_rail_on",	{"mcl_minecarts_rail_detector_powered.png", "mcl_minecarts_rail_detector_curved_powered.png", "mcl_minecarts_rail_detector_t_junction_powered.png", "mcl_minecarts_rail_detector_crossing_powered.png"}, { }, false ) -- deprecated
 
 -- Aliases
 if minetest.get_modpath("doc") then