aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororwell <orwell@bleipb.de>2023-10-15 15:06:20 +0200
committerorwell <orwell@bleipb.de>2023-10-15 15:06:20 +0200
commitad82b9cd4e12e16a176a2af08d480fa939076515 (patch)
tree48bb80c1fb78c2befe7b9a3c242e67e9d9cd97a6
parent10ea9b896b140ecc5ed4e53e7ee1daeaa4efa46e (diff)
downloadadvtrains-ad82b9cd4e12e16a176a2af08d480fa939076515.tar.gz
advtrains-ad82b9cd4e12e16a176a2af08d480fa939076515.tar.bz2
advtrains-ad82b9cd4e12e16a176a2af08d480fa939076515.zip
Forget it, and use the old preset tables for track registration. Just adapt it to the new definition.
-rw-r--r--advtrains/init.lua1
-rw-r--r--advtrains/track_reg_helper.lua743
-rw-r--r--advtrains/trackplacer.lua36
-rw-r--r--advtrains/tracks.lua24
-rw-r--r--advtrains_interlocking/init.lua3
-rw-r--r--advtrains_line_automation/init.lua3
-rw-r--r--[-rwxr-xr-x]advtrains_train_track/init.lua1122
-rw-r--r--advtrains_train_track/oldinit.lua937
8 files changed, 1720 insertions, 1149 deletions
diff --git a/advtrains/init.lua b/advtrains/init.lua
index 2213937..78126e5 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -206,6 +206,7 @@ dofile(advtrains.modpath.."/trainhud.lua")
dofile(advtrains.modpath.."/trackplacer.lua")
dofile(advtrains.modpath.."/copytool.lua")
dofile(advtrains.modpath.."/tracks.lua")
+dofile(advtrains.modpath.."/track_reg_helper.lua")
dofile(advtrains.modpath.."/occupation.lua")
dofile(advtrains.modpath.."/atc.lua")
dofile(advtrains.modpath.."/wagons.lua")
diff --git a/advtrains/track_reg_helper.lua b/advtrains/track_reg_helper.lua
new file mode 100644
index 0000000..ad73a40
--- /dev/null
+++ b/advtrains/track_reg_helper.lua
@@ -0,0 +1,743 @@
+-- New track registration helper
+-- Retains the old table-template-based definition format, but adapts it to the new (advtrains 2.5)
+-- track definition system
+-- Note to future: This is actually just a work-saver, avoiding me to port over all the crossing nodes as well as the linetrack tracks.
+-- Future track mods should please directly use the appropriate advtrains.register_node_4rot() API and not rely on this!
+
+--definition preparation
+local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
+local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end
+
+advtrains.ap={}
+advtrains.ap.t_30deg_flat={
+ v25_format = true,
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "cr",
+ },
+ cr={
+ conns = conns(0,7),
+ desc = "curve",
+ tpdouble = true,
+ trackworker = "swlst",
+ },
+ swlst={
+ conns = conns3(0,8,7),
+ desc = "left switch (straight)",
+ trackworker = "swrst",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ switchprefix = "swl",
+ conn_map = {2,1,1},
+ stmref = "swl",
+ },
+ swlcr={
+ conns = conns3(0,8,7),
+ desc = "left switch (curve)",
+ trackworker = "swrcr",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ switchprefix = "swl",
+ conn_map = {3,1,1},
+ stmref = "swl",
+ },
+ swrst={
+ conns = conns3(0,8,9),
+ desc = "right switch (straight)",
+ trackworker = "st",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ switchprefix = "swr",
+ conn_map = {2,1,1},
+ stmref = "swr",
+ },
+ swrcr={
+ conns = conns3(0,8,9),
+ desc = "right switch (curve)",
+ trackworker = "st",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ switchprefix = "swr",
+ conn_map = {3,1,1},
+ stmref = "swr",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_30", "_45", "_60"},
+ statemaps = {
+ swl = { st = "swlst", cr = "swlcr"},
+ swr = { st = "swrst", cr = "swrcr"}
+ }
+}
+advtrains.ap.t_yturnout={
+ v25_format = true,
+ regstep=1,
+ variant={
+ l={
+ conns = conns3(0,7,9),
+ desc = "Y-turnout (left)",
+ switchalt = "r",
+ switchmc = "off",
+ switchst = "l",
+ switchprefix = "",
+ conn_map = {2,1,1},
+ stmref = "sw",
+ tpsingle = true,
+ },
+ r={
+ conns = conns3(0,7,9),
+ desc = "Y-turnout (right)",
+ switchalt = "l",
+ switchmc = "on",
+ switchst = "r",
+ switchprefix = "",
+ conn_map = {3,1,1},
+ stmref = "sw",
+ }
+ },
+ regtp=true,
+ tpdefault="l",
+ rotation={"", "_30", "_45", "_60"},
+ statemaps = {
+ sw = { l = "l", r = "r"}
+ }
+}
+advtrains.ap.t_s3way={
+ v25_format = true,
+ regstep=1,
+ variant={
+ l={
+ conns = { {c=0}, {c=7}, {c=8}, {c=9}},
+ desc = "3-way turnout (left)",
+ switchalt = "s",
+ switchst="l",
+ switchprefix = "",
+ conn_map = {2,1,1},
+ stmref = "sw",
+ },
+ s={
+ conns = { {c=0}, {c=7}, {c=8}, {c=9}},
+ desc = "3-way turnout (straight)",
+ switchalt ="r",
+ switchst = "s",
+ switchprefix = "",
+ conn_map = {3,1,1},
+ stmref = "sw",
+ tpsingle = true,
+ },
+ r={
+ conns = { {c=0}, {c=7}, {c=8}, {c=9}},
+ desc = "3-way turnout (right)",
+ switchalt = "l",
+ switchst="r",
+ switchprefix = "",
+ conn_map = {4,1,1},
+ stmref = "sw",
+ }
+ },
+ regtp=true,
+ tpdefault="l",
+ rotation={"", "_30", "_45", "_60"},
+ statemaps = {
+ sw = { l = "l", s = "s", r = "r"}
+ }
+}
+advtrains.ap.t_30deg_slope={
+ v25_format = true,
+ regstep=1,
+ variant={
+ vst1={conns = conns(8,0,0,0.5), rail_y = 0.25, desc = "steep uphill 1/2", slope=true},
+ vst2={conns = conns(8,0,0.5,1), rail_y = 0.75, desc = "steep uphill 2/2", slope=true},
+ vst31={conns = conns(8,0,0,0.33), rail_y = 0.16, desc = "uphill 1/3", slope=true},
+ vst32={conns = conns(8,0,0.33,0.66), rail_y = 0.5, desc = "uphill 2/3", slope=true},
+ vst33={conns = conns(8,0,0.66,1), rail_y = 0.83, desc = "uphill 3/3", slope=true},
+ },
+ regsp=true,
+ slopeplacer={
+ [2]={"vst1", "vst2"},
+ [3]={"vst31", "vst32", "vst33"},
+ max=3,--highest entry
+ },
+ slopeplacer_45={
+ [2]={"vst1_45", "vst2_45"},
+ max=2,
+ },
+ rotation={"", "_30", "_45", "_60"},
+ trackworker={},
+ increativeinv={},
+}
+advtrains.ap.t_30deg_straightonly={
+ v25_format = true,
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_30deg_straightonly_noplacer={
+ v25_format = true,
+ regstep=1,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ },
+ },
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_45deg={
+ v25_format = true,
+ regstep=2,
+ variant={
+ st={
+ conns = conns(0,8),
+ desc = "straight",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "cr",
+ },
+ cr={
+ conns = conns(0,6),
+ desc = "curve",
+ tpdouble = true,
+ trackworker = "swlst",
+ },
+ swlst={
+ conns = conns3(0,8,6),
+ desc = "left switch (straight)",
+ trackworker = "swrst",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ },
+ swlcr={
+ conns = conns3(0,6,8),
+ desc = "left switch (curve)",
+ trackworker = "swrcr",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ },
+ swrst={
+ conns = conns3(0,8,10),
+ desc = "right switch (straight)",
+ trackworker = "st",
+ switchalt = "cr",
+ switchmc = "on",
+ switchst = "st",
+ },
+ swrcr={
+ conns = conns3(0,10,8),
+ desc = "right switch (curve)",
+ trackworker = "st",
+ switchalt = "st",
+ switchmc = "off",
+ switchst = "cr",
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_perpcrossing={
+ v25_format = true,
+ regstep = 1,
+ variant={
+ st={
+ conns = { {c=0}, {c=8}, {c=4}, {c=12} },
+ desc = "perpendicular crossing",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "st",
+ conn_map = {2,1,4,3},
+ },
+ },
+ regtp=true,
+ tpdefault="st",
+ rotation={"", "_30", "_45", "_60"},
+}
+advtrains.ap.t_90plusx_crossing={
+ v25_format = true,
+ regstep = 1,
+ variant={
+ ["30l"]={
+ conns = { {c=0}, {c=8}, {c=1}, {c=9} },
+ desc = "30/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "45l",
+ conn_map = {2,1,4,3},
+ },
+ ["45l"]={
+ conns = { {c=0}, {c=8}, {c=2}, {c=10} },
+ desc = "45/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "60l",
+ conn_map = {2,1,4,3},
+ },
+ ["60l"]={
+ conns = { {c=0}, {c=8}, {c=3}, {c=11}},
+ desc = "60/90 degree crossing (left)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "60r",
+ conn_map = {2,1,4,3},
+ },
+ ["60r"]={
+ conns = { {c=0}, {c=8}, {c=5}, {c=13} },
+ desc = "60/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "45r",
+ conn_map = {2,1,4,3},
+ },
+ ["45r"]={
+ conns = { {c=0}, {c=8}, {c=6}, {c=14} },
+ desc = "45/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "30r",
+ conn_map = {2,1,4,3},
+ },
+ ["30r"]={
+ conns = { {c=0}, {c=8}, {c=7}, {c=15}},
+ desc = "30/90 degree crossing (right)",
+ tpdouble = true,
+ tpsingle = true,
+ trackworker = "30l",
+ conn_map = {2,1,4,3},
+ },
+ },
+ regtp=true,
+ tpdefault="30l",
+ rotation={""},
+ trackworker = {
+ ["30l"] = "45l",
+ ["45l"] = "60l",
+ ["60l"] = "60r",
+ ["60r"] = "45r",
+ ["45r"] = "30r",
+ ["30r"] = "30l",
+ }
+}
+
+advtrains.ap.t_diagonalcrossing = {
+ v25_format = true,
+ regstep=1,
+ variant={
+ ["30l45r"]={
+ conns = {{c=1}, {c=9}, {c=6}, {c=14}},
+ desc = "30left-45right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l30l",
+ conn_map = {2,1,4,3},
+ },
+ ["60l30l"]={
+ conns = {{c=3}, {c=11}, {c=1}, {c=9}},
+ desc = "30left-60right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l45r",
+ conn_map = {2,1,4,3},
+ },
+ ["60l45r"]={
+ conns = {{c=3}, {c=11}, {c=6}, {c=14}},
+ desc = "60left-45right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60l60r",
+ conn_map = {2,1,4,3},
+ },
+ ["60l60r"]={
+ conns = {{c=3}, {c=11}, {c=5}, {c=13}},
+ desc = "60left-60right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60r45l",
+ conn_map = {2,1,4,3},
+ },
+ --If 60l60r had a mirror image, it would be here, but it's symmetric.
+ -- 60l60r is also equivalent to 30l30r but rotated 90 degrees.
+ ["60r45l"]={
+ conns = {{c=5}, {c=13}, {c=2}, {c=10}},
+ desc = "60right-45left diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="60r30r",
+ conn_map = {2,1,4,3},
+ },
+ ["60r30r"]={
+ conns = {{c=5}, {c=13}, {c=7}, {c=15}},
+ desc = "60right-30right diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="30r45l",
+ conn_map = {2,1,4,3},
+ },
+ ["30r45l"]={
+ conns = {{c=7}, {c=15}, {c=2}, {c=10}},
+ desc = "30right-45left diagonal crossing",
+ tpdouble=true,
+ tpsingle=true,
+ trackworker="30l45r",
+ conn_map = {2,1,4,3},
+ },
+
+ },
+ regtp=true,
+ tpdefault="30l45r",
+ rotation={""},
+ trackworker = {
+ ["30l45r"] = "60l30l",
+ ["60l30l"] = "60l45r",
+ ["60l45r"] = "60l60r",
+ ["60l60r"] = "60r45l",
+ ["60r45l"] = "60r30r",
+ ["60r30r"] = "30r45l",
+ ["30r45l"] = "30l45r",
+ }
+}
+
+advtrains.trackpresets = advtrains.ap
+
+--definition format: ([] optional)
+--[[{
+ nodename_prefix
+ texture_prefix
+ [shared_texture]
+ models_prefix
+ models_suffix (with dot)
+ [shared_model]
+ formats={
+ st,cr,swlst,swlcr,swrst,swrcr,vst1,vst2
+ (each a table with indices 0-3, for if to register a rail with this 'rotation' table entry. nil is assumed as 'all', set {} to not register at all)
+ }
+ common={} change something on common rail appearance
+}
+[18.12.17] Note on new connection system:
+In order to support real rail crossing nodes and finally make the trackplacer respect switches, I changed the connection system.
+There can be a variable number of connections available. These are specified as tuples {c=<connection>, y=<rely>}
+The table "at_conns" consists of {<conn1>, <conn2>...}
+the "at_rail_y" property holds the value that was previously called "railheight"
+Depending on the number of connections:
+2 conns: regular rail
+3 conns: switch:
+ - when train passes in at conn1, will move out of conn2
+ - when train passes in at conn2 or conn3, will move out of conn1
+4 conns: cross (or cross switch, depending on arrangement of conns):
+ - conn1 <> conn2
+ - conn3 <> conn4
+]]
+
+-- Notify the user if digging the rail is not allowed
+local function can_dig_callback(pos, player)
+ local ok, reason = advtrains.can_dig_or_modify_track(pos)
+ if not ok and player then
+ minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason)
+ end
+ return ok
+end
+
+local function append_statemap_suffix(state_map, nnpref, rot)
+ local t = {}
+ for state, nn in pairs(state_map) do
+ t[state] = nnpref .. "_" .. nn .. rot
+ end
+ return t
+end
+
+function advtrains.register_tracks(tracktype, def, preset)
+ if not preset.v25_format then
+ error("advtrains.register_tracks(): A track preset for pre-v2.5 is used with advtrains 2.5+. Mod probably defines own track preset instead of using it from the advtrains.ap table! Please check track mod compatibility!")
+ end
+
+ if preset.regtp then
+ local nnprefix = def.nodename_prefix
+ minetest.register_craftitem(":"..nnprefix.."_placer", {
+ description = def.description,
+ inventory_image = def.texture_prefix.."_placer.png",
+ wield_image = def.texture_prefix.."_placer.png",
+ groups={advtrains_trackplacer=1, digtron_on_place=1},
+ liquids_pointable = false,
+ on_place = function(itemstack, placer, pointed_thing)
+ local name = placer:get_player_name()
+ if not name then
+ return itemstack, false
+ end
+ if pointed_thing.type=="node" then
+ local pos=pointed_thing.above
+ local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
+ if not advtrains.check_track_protection(pos, name) then
+ return itemstack, false
+ end
+ if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then
+ local s = minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable
+ if s then
+ -- minetest.chat_send_all(nnprefix)
+ local yaw = placer:get_look_horizontal()
+ advtrains.trackplacer.place_track(pos, nnprefix, name, yaw)
+ if not advtrains.is_creative(name) then
+ itemstack:take_item()
+ end
+ end
+ end
+ end
+ return itemstack, true
+ end,
+ })
+
+ advtrains.trackplacer.set_default_place_candidate(def.nodename_prefix, def.nodename_prefix.."_"..preset.tpdefault)
+ end
+ if preset.regsp then
+ advtrains.slope.register_placer(def, preset)
+ end
+
+ for suffix, var in pairs(preset.variant) do
+ for rotid, rotation in ipairs(preset.rotation) do
+ if not def.formats[suffix] or def.formats[suffix][rotid] then
+ local img_suffix = suffix..rotation
+ local ndef = advtrains.merge_tables({
+ description=def.description.."("..(var.desc or "any")..rotation..")",
+ drawtype = "mesh",
+ paramtype="light",
+ paramtype2="facedir",
+ walkable = false,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
+ },
+
+ mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix),
+ tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png"), def.second_texture},
+
+ groups = {
+ attached_node = advtrains.IGNORE_WORLD and 0 or 1,
+ advtrains_track=1,
+ ["advtrains_track_"..tracktype]=1,
+ save_in_at_nodedb=1,
+ dig_immediate=2,
+ not_in_creative_inventory=1,
+ not_blocking_trains=1,
+ },
+
+ can_dig = advtrains.track_can_dig_callback,
+ after_dig_node = advtrains.track_update_callback,
+ after_place_node = advtrains.track_update_callback,
+
+ at_rail_y = var.rail_y
+ }, def.common or {})
+
+ if preset.regtp then
+ ndef.drop = def.nodename_prefix.."_placer"
+ end
+ if preset.regsp and var.slope then
+ ndef.drop = def.nodename_prefix.."_slopeplacer"
+ end
+
+ --connections
+ ndef.at_conns = advtrains.rotate_conn_by(var.conns, (rotid-1)*preset.regstep)
+ -- NEW since 2.5
+ ndef.at_conn_map = var.conn_map
+
+ local ndef_avt_table = {}
+
+ if var.switchalt and var.switchst then
+ -- NEW since 2.5
+ ndef.on_rightclick = advtrains.state_node_on_rightclick_callback
+ ndef_avt_table.node_state = var.switchst
+ ndef_avt_table.node_next_state = var.switchalt
+ -- obtain and build statemap
+ local state_map = preset.statemaps[var.stmref]
+ if not state_map then error("On registering "..def.nodename_prefix.."_"..suffix..rotation..", stmref of variant doesn't reference entry in preset.statemaps") end
+ ndef_avt_table.node_state_map = append_statemap_suffix(state_map, def.nodename_prefix, rotation)
+
+ if var.switchmc then
+ local vswitchalt = var.switchalt
+ ndef.mesecons = {effector = {
+ ["action_"..var.switchmc] = function(pos, node)
+ advtrains.setstate(pos, vswitchalt, node)
+ end,
+ rules=advtrains.meseconrules
+ }}
+ end
+ end
+
+ local adef={}
+ if def.get_additional_definiton then
+ adef=def.get_additional_definiton(def, preset, suffix, rotation)
+ end
+ ndef = advtrains.merge_tables(ndef, adef)
+
+ -- insert getstate/setstate functions after merging the additional definitions
+ if ndef_avt_table then
+ ndef.advtrains = advtrains.merge_tables(ndef.advtrains or {}, ndef_avt_table)
+ end
+
+ -- NEW since 2.5: add appropriate fields for trackworker rotation
+ -- get the next rotation step
+ local num_rots = #preset.rotation
+ if rotid >= num_rots then
+ ndef.advtrains.trackworker_next_rot = def.nodename_prefix.."_"..suffix..preset.rotation[1]
+ ndef.advtrains.trackworker_rot_incr_param2 = true
+ else
+ ndef.advtrains.trackworker_next_rot = def.nodename_prefix.."_"..suffix..preset.rotation[rotid+1]
+ end
+ if var.trackworker then
+ ndef.advtrains.trackworker_next_var = def.nodename_prefix.."_"..var.trackworker..rotation
+ end
+
+ local the_node_name = def.nodename_prefix.."_"..suffix..rotation
+
+ --trackplacer
+ if preset.regtp and (var.tpsingle or var.tpdouble) then
+ advtrains.trackplacer.register_candidate(
+ def.nodename_prefix,
+ the_node_name,
+ ndef,
+ var.tpsingle,
+ var.tpdouble,
+ true)
+ end
+
+ -- All set, go ahead and register node!
+ --atdebug("track_reg_helper: Registering ",the_node_name," as",ndef)
+ minetest.register_node(":"..the_node_name, ndef)
+
+ end
+ end
+ end
+end
+
+-- slope placer. Defined in register_tracks.
+--crafted with rail and gravel
+local sl={}
+function sl.register_placer(def, preset)
+ minetest.register_craftitem(":"..def.nodename_prefix.."_slopeplacer",{
+ description = attrans("@1 Slope", def.description),
+ inventory_image = def.texture_prefix.."_slopeplacer.png",
+ wield_image = def.texture_prefix.."_slopeplacer.png",
+ groups={},
+ on_place = sl.create_slopeplacer_on_place(def, preset)
+ })
+end
+--(itemstack, placer, pointed_thing)
+function sl.create_slopeplacer_on_place(def, preset)
+ return function(istack, player, pt)
+ if not pt.type=="node" then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ return istack
+ end
+ local pos=pt.above
+ if not pos then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node"))
+ return istack
+ end
+ local node=minetest.get_node(pos)
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!"))
+ return istack
+ end
+ if not advtrains.check_track_protection(pos, player:get_player_name()) then
+ minetest.record_protection_violation(pos, player:get_player_name())
+ return istack
+ end
+ --determine player orientation (only horizontal component)
+ --get_look_horizontal may not be available
+ local yaw=player.get_look_horizontal and player:get_look_horizontal() or (player:get_look_yaw() - math.pi/2)
+
+ --rounding unit vectors is a nice way for selecting 1 of 8 directions since sin(30°) is 0.5.
+ local dirvec={x=math.floor(math.sin(-yaw)+0.5), y=0, z=math.floor(math.cos(-yaw)+0.5)}
+ --translate to direction to look up inside the preset table
+ local param2, rot45=({
+ [-1]={
+ [-1]=2,
+ [0]=3,
+ [1]=3,
+ },
+ [0]={
+ [-1]=2,
+ [1]=0,
+ },
+ [1]={
+ [-1]=1,
+ [0]=1,
+ [1]=0,
+ },
+ })[dirvec.x][dirvec.z], dirvec.x~=0 and dirvec.z~=0
+ local lookup=preset.slopeplacer
+ if rot45 then lookup=preset.slopeplacer_45 end
+
+ --go unitvector forward and look how far the next node is
+ local step=1
+ while step<=lookup.max do
+ local node=minetest.get_node(vector.add(pos, dirvec))
+ --next node solid?
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to or advtrains.is_protected(pos, player:get_player_name()) then
+ --do slopes of this distance exist?
+ if lookup[step] then
+ if minetest.settings:get_bool("creative_mode") or istack:get_count()>=step then
+ --start placing
+ local placenodes=lookup[step]
+ while step>0 do
+ minetest.set_node(pos, {name=def.nodename_prefix.."_"..placenodes[step], param2=param2})
+ if not minetest.settings:get_bool("creative_mode") then
+ istack:take_item()
+ end
+ step=step-1
+ pos=vector.subtract(pos, dirvec)
+ end
+ else
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step))
+ end
+ else
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step))
+ end
+ return istack
+ end
+ step=step+1
+ pos=vector.add(pos, dirvec)
+ end
+ minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end."))
+ return itemstack
+ end
+end
+
+advtrains.slope=sl
diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua
index 71eb79c..e6111dc 100644
--- a/advtrains/trackplacer.lua
+++ b/advtrains/trackplacer.lua
@@ -27,21 +27,27 @@ end
-- Register a track node as candidate
-- tpg: the track place group to register the candidates for
+-- NOTE: This value is automatically added to the node definition (ndef) in field ndef.advtrains.track_place_group!
-- name, ndef: the node name and node definition table to register
-- as_single: whether the rail should be considered as candidate for one-endpoint connection
-- Typically only set for the straight rail variants
-- as_double: whether the rail should be considered as candidate for two-endpoint connection
-- Typically set for straights and curves
-function tp.register_candidate(tpg, name, ndef, as_single, as_double)
+-- ignore_2conn_for_legacy_xing: skips the 2-connection assertion - ONLY for compatibility with the legacy crossing nodes, DO NOT USE!
+function tp.register_candidate(tpg, name, ndef, as_single, as_double, ignore_2conn_for_legacy_xing)
+ --atdebug("TP Register candidate:",tpg, name, as_single, as_double)
--get or create TP group
if not tp.groups[tpg] then
tp.groups[tpg] = {double = {}, single1 = {}, single2 = {}, default = {name = name, param2 = 0} }
-- note: this causes the first candidate to ever be registered to be the default (which is typically what you want)
+ -- But it can be overwritten using tp.set_default_place_candidate
end
local g = tp.groups[tpg]
-- get conns
- assert(#ndef.at_conns == 2)
+ if not ignore_2conn_for_legacy_xing then
+ assert(#ndef.at_conns == 2)
+ end
local c1, c2 = ndef.at_conns[1].c, ndef.at_conns[2].c
local is_symmetrical = (rotate(c1, 8) == c2)
@@ -59,6 +65,21 @@ function tp.register_candidate(tpg, name, ndef, as_single, as_double)
g.single2[rotate(c2,i*4)] = {name=name, param2=i}
end
end
+
+ -- Set track place group on the node
+ if not ndef.advtrains then
+ ndef.advtrains = {}
+ end
+ ndef.advtrains.track_place_group = tpg
+end
+
+-- Sets the node that is placed by the track placer when there is no track nearby. param2 defaults to 0
+function tp.set_default_place_candidate(tpg, name, param2)
+ if not tp.groups[tpg] then
+ tp.groups[tpg] = {double = {}, single1 = {}, single2 = {}, default = {name = name, param2 = param2 or 0} }
+ else
+ tp.groups[tpg].default = {name = name, param2 = param2 or 0}
+ end
end
local function check_or_bend_rail(origin, dir, pname, commit)
@@ -87,7 +108,7 @@ local function check_or_bend_rail(origin, dir, pname, commit)
return false
end
-- now the track must be two-conn, else it wouldn't be allowed to have track_place_group set.
- assert(#conns == 2)
+ --assert(#conns == 2) -- cannot check here, because of legacy crossing hack
-- Is player and game allowed to do this?
if not advtrains.can_dig_or_modify_track(pos) then
return false
@@ -132,6 +153,7 @@ local function check_or_bend_rail(origin, dir, pname, commit)
end
local function track_place_node(pos, node, ndef)
+ --atdebug("track_place_node: ",pos, node)
advtrains.ndb.swap_node(pos, node)
local ndef = minetest.registered_nodes[node.name]
if ndef and ndef.after_place_node then
@@ -151,14 +173,20 @@ end
-- The function returns true on success.
function tp.place_track(pos, tpg, pname, yaw)
-- 1. collect neighboring tracks and whether they can be connected
+ --atdebug("tp.place_track(",pos, tpg, pname, yaw,")")
local cand = {}
for i=0,15 do
if check_or_bend_rail(pos, i, pname) then
cand[#cand+1] = i
end
end
+ --atdebug("Candidates: ",cand)
-- obtain the group table
local g = tp.groups[tpg]
+ if not g then
+ error("tp.place_track: for tpg="..tpg.." couldn't find the group table")
+ end
+ --atdebug("Group table:",g)
-- 2. try all possible two-endpoint connections
for k1, conn1 in ipairs(cand) do
for k2, conn2 in ipairs(cand) do
@@ -167,6 +195,7 @@ function tp.place_track(pos, tpg, pname, yaw)
-- the combination the other way round will be run through in a later loop iteration
if advtrains.yawToDirection(yaw, conn1, conn2) == conn2 then
-- does there exist a suitable double-connection rail?
+ --atdebug("Try double conn: ",conn1, conn2)
local node = g.double[conn1.."_"..conn2]
if node then
check_or_bend_rail(pos, conn1, pname, true)
@@ -187,6 +216,7 @@ function tp.place_track(pos, tpg, pname, yaw)
else
single = g.single2
end
+ --atdebug("Try single conn: ",conn1)
local node = single[conn1]
if node then
check_or_bend_rail(pos, conn1, pname, true)
diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua
index 46ceaf8..1abef59 100644
--- a/advtrains/tracks.lua
+++ b/advtrains/tracks.lua
@@ -222,19 +222,6 @@ function advtrains.register_node_4rot(ori_name, ori_ndef, definition_mangling_fu
end
end
-
--- Registers an item to place and automatically connect nearby tracks
-function advtrains.register_track_placer(...)
-
-end
-
--- Registers an item to place and adjust slope tracks
-function advtrains.register_slope_placer(...)
-
-end
-
-
-
-- track-related helper functions
function advtrains.is_track(nodename)
@@ -255,13 +242,10 @@ function advtrains.get_track_connections(name, param2)
if not param2 then noderot=0 end
if noderot > 3 then atprint(" get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end
- local tracktype
- for k,_ in pairs(nodedef.groups) do
- local tt=string.match(k, "^advtrains_track_(.+)$")
- if tt then
- tracktype=tt
- end
+ if not nodedef.at_conns then
+ return nil
end
+ --atdebug("Track connections of ",name,param2,":",nodedef.at_conns)
return advtrains.rotate_conn_by(nodedef.at_conns, noderot*AT_CMAX/4), (nodedef.at_rail_y or 0), tracktype
end
@@ -283,4 +267,4 @@ function advtrains.can_dig_or_modify_track(pos)
end
end
return true
-end \ No newline at end of file
+end
diff --git a/advtrains_interlocking/init.lua b/advtrains_interlocking/init.lua
index cc46b83..fe8b967 100644
--- a/advtrains_interlocking/init.lua
+++ b/advtrains_interlocking/init.lua
@@ -25,8 +25,7 @@ dofile(modpath.."tool.lua")
dofile(modpath.."approach.lua")
dofile(modpath.."ars.lua")
---TODO reenable tsr rail
---dofile(modpath.."tsr_rail.lua")
+dofile(modpath.."tsr_rail.lua")
minetest.register_privilege("interlocking", {description = "Can set up track sections, routes and signals.", give_to_singleplayer = true})
diff --git a/advtrains_line_automation/init.lua b/advtrains_line_automation/init.lua
index cc8df3c..e7d0ea6 100644
--- a/advtrains_line_automation/init.lua
+++ b/advtrains_line_automation/init.lua
@@ -21,8 +21,7 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELI
dofile(modpath.."railwaytime.lua")
dofile(modpath.."scheduler.lua")
---TODO reenable stop rail
---dofile(modpath.."stoprail.lua")
+dofile(modpath.."stoprail.lua")
function advtrains.lines.load(data)
diff --git a/advtrains_train_track/init.lua b/advtrains_train_track/init.lua
index 6195b5b..5065155 100755..100644
--- a/advtrains_train_track/init.lua
+++ b/advtrains_train_track/init.lua
@@ -1,185 +1,937 @@
--- advtrains_train_track
--- rewritten to work with advtrains 2.5 track system, but mimics the "old" template-based track registration
--- Also, since 2.5, all tracks are moved here, even the ATC, LuaATC and Interlocking special tracks
-
-local function conns(c1, c2, r1, r2) return {{c=c1, y=r1}, {c=c2, y=r2}} end
-local function conns3(c1, c2, c3, r1, r2, r3) return {{c=c1, y=r1}, {c=c2, y=r2}, {c=c3, y=r3}} end
-
-
-local function register(reg)
- for sgi, sgrp in ipairs(reg.sgroups) do
- -- prepare the state map if we need it later
- local state_map = {}
- if sgrp.turnout then
- for vn,var in pairs(sgrp.variants) do
- local name = reg.base .. "_" .. vn
- state_map[var.state] = name
- end
- end
- -- iterate through each of the variants
- for vn,var in pairs(sgrp.variants) do
- local name = reg.base .. "_" .. vn
- local ndef = {
- description = reg.description .. " " .. vn,
- drawtype = "mesh",
- paramtype = "light",
- paramtype2 = "facedir",
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
- },
-
- mesh_prefix=reg.mprefix.."_"..vn,
- mesh_suffix = ".b3d",
- tiles = { "advtrains_dtrack_shared.png" },
-
- groups = {
- advtrains_track=1,
- advtrains_track_default=1,
- dig_immediate=2,
- --not_in_creative_inventory=1,
- },
-
- at_conns = sgrp.conns,
- at_conn_map = var.conn_map,
-
- can_dig = advtrains.track_can_dig_callback,
- after_dig_node = advtrains.track_update_callback,
- after_place_node = advtrains.track_update_callback,
-
- advtrains = {
- trackworker_next_var = reg.base .. "_" .. var.next_var
- }
- }
- -- drop field
- if reg.register_placer then
- ndef.drop = reg.base.."_placer"
- else
- ndef.drop = reg.drop
- end
- -- if variant is suitable for autoplacing (trackplacer)
- if var.track_place then
- ndef.advtrains.track_place_group = reg.base
- ndef.advtrains.track_place_single = var.track_place_single
- end
- -- turnout handling
- -- if the containing group was a turnout group, the containing state_map will be used
- if sgrp.turnout then
- ndef.on_rightclick = advtrains.state_node_on_rightclick_callback
- ndef.advtrains.node_state = var.state
- ndef.advtrains.node_next_state = var.next_state
- ndef.advtrains.node_state_map = state_map
- end
- -- use advtrains-internal function to register the 4 rotations of the node, to make our life easier
- --atdebug("Registering: ",name, ndef) -- for debugging it can be useful to output what is being registered
- advtrains.register_node_4rot(name, ndef)
- end
- end
- if reg.register_placer then
- local tpgrp = reg.base
- minetest.register_craftitem(":advtrains:dtrack_placer", {
- description = reg.description,
- inventory_image = reg.mprefix.."_placer.png",
- wield_image = reg.mprefix.."_placer.png",
- groups={advtrains_trackplacer=1, digtron_on_place=1},
- liquids_pointable = false,
- on_place = function(itemstack, placer, pointed_thing)
- local name = placer:get_player_name()
- if not name then
- return itemstack, false
- end
- if pointed_thing.type=="node" then
- local pos=pointed_thing.above
- local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
- if not advtrains.check_track_protection(pos, name) then
- return itemstack, false
- end
- if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then
- local s = minetest.registered_nodes[minetest.get_node(upos).name] and minetest.registered_nodes[minetest.get_node(upos).name].walkable
- if s then
- -- minetest.chat_send_all(nnprefix)
- local yaw = placer:get_look_horizontal()
- advtrains.trackplacer.place_track(pos, tpgrp, name, yaw)
- if not advtrains.is_creative(name) then
- itemstack:take_item()
- end
- end
- end
- end
- return itemstack, true
- end,
- })
- end
-end
-
-
-
--- normal dtrack
-register({
- base = "advtrains:dtrack",
- mprefix = "advtrains_dtrack",
- description = attrans("Track"),
-
- sgroups = { -- integer-indexed table, we don't need a key here
- -- inside are "variant" tables
- {
- variants = {
- st = {
- next_var = "cr",
- track_place = true,
- track_place_single = true,
- },
- },
- conns = conns(0,8),
- },
- {
- variants = {
- cr = {
- next_var = "swlst",
- track_place = true,
- },
- },
- conns = conns(0,7),
- },
- {
- turnout = true,
- variants = {
- swlst = {
- next_var = "swrst",
- conn_map = {2,1,1},
- state = "st",
- next_state = "cr",
- },
- swlcr = {
- next_var = "swrcr",
- conn_map = {3,1,1},
- state = "cr",
- next_state = "st",
- },
- },
- conns = conns3(0,8,7),
- },
- {
- turnout = true,
- variants = {
- swrst = {
- next_var = "st",
- conn_map = {2,1,1},
- state = "st",
- next_state = "cr",
- },
- swrcr = {
- next_var = "st",
- conn_map = {3,1,1},
- state = "cr",
- next_state = "st",
- },
- },
- conns = conns3(0,8,9),
- },
- },
- register_placer = true,
-})
-
----------------------- \ No newline at end of file
+-- Default tracks for advtrains
+-- (c) orwell96 and contributors
+
+local default_boxen = {
+ ["st"] = {
+ [""] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
+ }
+ },
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
+ {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
+ {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
+ }
+ }
+ },
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ },
+
+ ["cr"] = {
+ [""] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.5000, 0.6875, -0.3750, 0.5000},
+ {-0.3750, -0.5000, -1.000, 1.000, -0.3750, 0.000}
+ }
+ }
+ },
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.5000, 0.7500, -0.3750, 0.8750},
+ {-0.3750, -0.5000, 0.8750, 0.2500, -0.3750, 1.188},
+ {0.7500, -0.5000, 0.2500, 1.063, -0.3750, 0.8750}
+ }
+ }
+ },
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.125, 0.5000, -0.3750, 0.6875},
+ {-0.8750, -0.5000, -0.9375, -0.5000, -0.3750, 0.06250},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}
+ }
+ }
+ },
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.8125, -0.5000, -0.5000, 1.188, -0.3750, 0.5000},
+ {-0.1875, -0.5000, 0.5000, 0.8750, -0.3125, 0.8750},
+ {-0.2500, -0.5000, -0.9375, 0.3125, -0.3125, -0.5000}
+ }
+ }
+ },
+ },
+
+ ["swlst"] = {
+ [""] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
+ {-0.3125, -0.5000, -1.000, 0.9375, -0.3125, -0.06250}
+ }
+ }
+ },
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
+ {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
+ {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.1875, 0.5000, -0.3750, 0.8750},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-0.8750, -0.5000, -0.8125, -0.5000, -0.3750, 0.5000}
+ }
+ }
+ },
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ },
+
+ ["swrst"] = {
+ [""] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
+ {-0.8125, -0.5000, -1.000, 0.4375, -0.3125, -0.06250}
+ }
+ }
+ },
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
+ {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
+ {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.1875, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-0.5000, -0.5000, 0.5000, 0.5000, -0.3750, 0.8750},
+ {-0.8125, -0.5000, -0.8750, 0.5000, -0.3750, -0.5000}
+ }
+ }
+ },
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ },
+}
+
+default_boxen["swlcr"] = default_boxen["swlst"]
+default_boxen["swrcr"] = default_boxen["swrst"]
+
+--flat
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack",
+ texture_prefix="advtrains_dtrack",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("Track"),
+ formats={},
+
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ if default_boxen[suffix] ~= nil and default_boxen[suffix][rotation] ~= nil then
+ return default_boxen[suffix][rotation]
+ else
+ return {}
+ end
+ end,
+}, advtrains.ap.t_30deg_flat)
+
+minetest.register_craft({
+ output = 'advtrains:dtrack_placer 50',
+ recipe = {
+ {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
+ {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
+ {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
+ },
+})
+
+local y3_boxen = {
+ [""] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.8750, -0.5000, -1.125, 0.8750, -0.3750, 0.4375}
+ }
+ }
+ },
+
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
+ {0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
+ }
+ }
+ },
+
+ --UX FIXME: - 3way - have to place straight route before l and r or the
+ --nodebox overlaps too much and can't place the straight track node.
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.1250, 0.5000, -0.3750, 0.8750},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-1.1250, -0.5000, -0.9375, -0.5000, -0.3750, 0.5000}
+ }
+ }
+ },
+
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ --{-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
+ {-0.875, -0.5000, -0.5, 1.0, -0.3750, 0.5},
+ --{-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
+ {-0.4375, -0.5000, -0.8750, 0.5625, -0.3750, -0.5000},
+ --{0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
+ {-0.2500, -0.5000, -0.2500, 1.0000, -0.3750, 0.8125},
+ }
+ }
+ },
+}
+
+
+local function y3_turnouts_addef(def, preset, suffix, rotation)
+ return y3_boxen[rotation] or {}
+end
+-- y-turnout
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_sy",
+ texture_prefix="advtrains_dtrack_sy",
+ models_prefix="advtrains_dtrack_sy",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("Y-turnout"),
+ formats = {},
+ get_additional_definiton = y3_turnouts_addef,
+}, advtrains.ap.t_yturnout)
+minetest.register_craft({
+ output = 'advtrains:dtrack_sy_placer 2',
+ recipe = {
+ {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
+ {'', 'advtrains:dtrack_placer', ''},
+ {'', 'advtrains:dtrack_placer', ''},
+ },
+})
+--3-way turnout
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_s3",
+ texture_prefix="advtrains_dtrack_s3",
+ models_prefix="advtrains_dtrack_s3",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("3-way turnout"),
+ formats = {},
+ get_additional_definiton = y3_turnouts_addef,
+}, advtrains.ap.t_s3way)
+minetest.register_craft({
+ output = 'advtrains:dtrack_s3_placer 1',
+ recipe = {
+ {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
+ {'', 'advtrains:dtrack_placer', ''},
+ {'', '', ''},
+ },
+})
+
+-- Diamond Crossings
+
+local perp_boxen = {
+ [""] = {}, --default size
+ ["_30"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
+ }
+ }
+ },
+ ["_45"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.8125, -0.5000, -0.8125, 0.8125, -0.3750, 0.8125}
+ }
+ }
+ },
+ ["_60"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
+ }
+ }
+ },
+}
+
+-- perpendicular
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_xing",
+ texture_prefix="advtrains_dtrack_xing",
+ models_prefix="advtrains_dtrack_xing",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("Perpendicular Diamond Crossing Track"),
+ formats = {},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return perp_boxen[rotation] or {}
+ end
+}, advtrains.ap.t_perpcrossing)
+
+minetest.register_craft({
+ output = 'advtrains:dtrack_xing_placer 3',
+ recipe = {
+ {'', 'advtrains:dtrack_placer', ''},
+ {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
+ {'', 'advtrains:dtrack_placer', ''}
+ }
+})
+
+local ninety_plus_boxen = {
+ ["30l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
+ {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
+ {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["30r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
+ {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
+ {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
+ {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["45l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
+ }
+ }
+ },
+ ["45r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
+ {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
+ {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
+ }
+ }
+ },
+ ["60l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ ["60r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
+ {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
+ {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
+ {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+}
+
+-- 90plusx
+-- When you face east and param2=0, then this set of rails has a rail at 90
+-- degrees to the viewer, plus another rail crossing at 30, 45 or 60 degrees.
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_xing90plusx",
+ texture_prefix="advtrains_dtrack_xing4590",
+ models_prefix="advtrains_dtrack_xing90plusx",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("90+Angle Diamond Crossing Track"),
+ formats = {},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return ninety_plus_boxen[suffix] or {}
+ end,
+}, advtrains.ap.t_90plusx_crossing)
+minetest.register_craft({
+ output = 'advtrains:dtrack_xing90plusx_placer 2',
+ recipe = {
+ {'advtrains:dtrack_placer', '', ''},
+ {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
+ {'', '', 'advtrains:dtrack_placer'}
+ }
+})
+
+-- Deprecate any rails using the old name scheme
+minetest.register_lbm({
+ label = "Upgrade legacy 4590 rails",
+ name = "advtrains_train_track:replace_legacy_4590",
+ nodenames = {"advtrains:dtrack_xing4590_st"},
+ run_at_every_load = true,
+ action = function(pos, node)
+ minetest.log("actionPos!: " .. pos.x .. "," .. pos.y .. "," .. pos.z)
+ minetest.log("node!: " .. node.name .. "," .. node.param1 .. "," .. node.param2)
+ advtrains.ndb.swap_node(pos,
+ {
+ name="advtrains:dtrack_xing90plusx_45l",
+ param1=node.param1,
+ param2=node.param2,
+ })
+ end
+})
+-- This will replace any items left in the inventory
+minetest.register_alias("advtrains:dtrack_xing4590_placer", "advtrains:dtrack_xing90plusx_placer")
+
+local diagonal_boxen = {
+ ["30r45l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
+ {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
+ {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
+ {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["60l30l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ ["60l60r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
+ }
+ }
+ },
+ ["60r30r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
+ {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
+ {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
+ {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ ["30l45r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
+ {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
+ {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
+ {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
+ }
+ }
+ },
+ ["60l45r"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
+ {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
+ {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
+ {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+ ["60r45l"] = {
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
+ {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
+ {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
+ {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
+ }
+ }
+ },
+}
+
+-- Diagonal
+-- This set of rail crossings is named based on the angle of each intersecting
+-- direction when facing east and param2=0. Rails with l/r swapped are mirror
+-- images. For example, 30r45l is the mirror image of 30l45r.
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_xingdiag",
+ texture_prefix="advtrains_dtrack_xingdiag",
+ models_prefix="advtrains_dtrack_xingdiag",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ description=attrans("Diagonal Diamond Crossing Track"),
+ formats = {},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return diagonal_boxen[suffix] or {}
+ end,
+}, advtrains.ap.t_diagonalcrossing)
+minetest.register_craft({
+ output = 'advtrains:dtrack_xingdiag_placer 2',
+ recipe = {
+ {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
+ {'', 'advtrains:dtrack_placer', ''},
+ {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'}
+ }
+})
+---- Not included: very shallow crossings like (30/60)+45.
+---- At an angle of only 18.4 degrees, the models would not
+---- translate well to a block game.
+-- END crossings
+
+--slopes
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack",
+ texture_prefix="advtrains_dtrack",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".obj",
+ shared_texture="advtrains_dtrack_shared.png",
+ second_texture="default_gravel.png",
+ description=attrans("Track"),
+ formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}},
+}, advtrains.ap.t_30deg_slope)
+
+minetest.register_craft({
+ type = "shapeless",
+ output = 'advtrains:dtrack_slopeplacer 2',
+ recipe = {
+ "advtrains:dtrack_placer",
+ "advtrains:dtrack_placer",
+ "default:gravel",
+ },
+})
+
+
+--bumpers
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_bumper",
+ texture_prefix="advtrains_dtrack_bumper",
+ models_prefix="advtrains_dtrack_bumper",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_rail.png",
+ --bumpers still use the old texture until the models are redone.
+ description=attrans("Bumper"),
+ formats={},
+}, advtrains.ap.t_30deg_straightonly)
+minetest.register_craft({
+ output = 'advtrains:dtrack_bumper_placer 2',
+ recipe = {
+ {'group:wood', 'dye:red'},
+ {'default:steel_ingot', 'default:steel_ingot'},
+ {'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
+ },
+})
+--legacy bumpers
+for _,rot in ipairs({"", "_30", "_45", "_60"}) do
+ minetest.register_alias("advtrains:dtrack_bumper"..rot, "advtrains:dtrack_bumper_st"..rot)
+end
+-- atc track
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_atc",
+ texture_prefix="advtrains_dtrack_atc",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_atc.png",
+ description=attrans("ATC controller"),
+ formats={},
+ get_additional_definiton = advtrains.atc_function
+}, advtrains.trackpresets.t_30deg_straightonly)
+
+
+-- Tracks for loading and unloading trains
+-- Copyright (C) 2017 Gabriel Pérez-Cerezo <gabriel@gpcf.eu>
+
+local function get_far_node(pos)
+ local node = minetest.get_node(pos)
+ if node.name == "ignore" then
+ minetest.get_voxel_manip():read_from_map(pos, pos)
+ node = minetest.get_node(pos)
+ end
+ return node
+end
+
+
+local function show_fc_formspec(pos,player)
+ local pname = player:get_player_name()
+ if minetest.is_protected(pos,pname) then
+ minetest.chat_send_player(pname, "Position is protected!")
+ return
+ end
+
+ local meta = minetest.get_meta(pos)
+ local fc = meta:get_string("fc") or ""
+
+ local form = 'formspec_version[4]'..
+ 'size[10,5]'..
+ 'label[0.5,0.4;Advtrains Loading/Unloading Track]'..
+ 'label[0.5,1.1;Set the code to match against the wagon\'s freight code]'..
+ 'label[0.5,1.6;A blank field matches all wagons (default)]'..
+ 'label[0.5,2.1;Use code # to disable the track section]'..
+ 'field[0.5,3;5.5,1;fc;FC;'..minetest.formspec_escape(fc)..']'..
+ 'button[6.5,3;3,1;save;Submit]'
+ minetest.show_formspec(pname, "at_load_unload_"..advtrains.encode_pos(pos), form)
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+ local pname = player:get_player_name()
+ local pe = string.match(formname, "^at_load_unload_(............)$")
+ local pos = advtrains.decode_pos(pe)
+ if pos then
+ if minetest.is_protected(pos, pname) then
+ minetest.chat_send_player(pname, "Position is protected!")
+ return
+ end
+
+ if fields.save then
+ minetest.get_meta(pos):set_string("fc",tostring(fields.fc))
+ minetest.chat_send_player(pname,"Freight code set: "..tostring(fields.fc))
+ show_fc_formspec(pos,player)
+ end
+ end
+end)
+
+
+local function train_load(pos, train_id, unload)
+ local train=advtrains.trains[train_id]
+ local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z})
+ if not string.match(below.name, "chest") then
+ atprint("this is not a chest! at "..minetest.pos_to_string(pos))
+ return
+ end
+
+ local node_fc = minetest.get_meta(pos):get_string("fc") or ""
+ if node_fc == "#" then
+ --track section is disabled
+ return
+ end
+
+ local inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}})
+ if inv and train.velocity < 2 then
+ for k, v in ipairs(train.trainparts) do
+ local i=minetest.get_inventory({type="detached", name="advtrains_wgn_"..v})
+ if i and i:get_list("box") then
+
+ local wagon_data = advtrains.wagons[v]
+ local wagon_fc
+ if wagon_data.fc then
+ if not wagon_data.fcind then wagon_data.fcind = 1 end
+ wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or ""
+ end
+
+ if node_fc == "" or wagon_fc == node_fc then
+ if not unload then
+ for _, item in ipairs(inv:get_list("main")) do
+ if i:get_list("box") and i:room_for_item("box", item) then
+ i:add_item("box", item)
+ inv:remove_item("main", item)
+ end
+ end
+ else
+ for _, item in ipairs(i:get_list("box")) do
+ if inv:get_list("main") and inv:room_for_item("main", item) then
+ i:remove_item("box", item)
+ inv:add_item("main", item)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+
+
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_unload",
+ texture_prefix="advtrains_dtrack_unload",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_unload.png",
+ description=attrans("Unloading Track"),
+ formats={},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return {
+ after_dig_node=function(pos)
+ advtrains.invalidate_all_paths()
+ advtrains.ndb.clear(pos)
+ end,
+ on_rightclick = function(pos, node, player)
+ show_fc_formspec(pos, player)
+ end,
+ advtrains = {
+ on_train_enter = function(pos, train_id)
+ train_load(pos, train_id, true)
+ end,
+ },
+ }
+ end
+ }, advtrains.trackpresets.t_30deg_straightonly)
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_load",
+ texture_prefix="advtrains_dtrack_load",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_load.png",
+ description=attrans("Loading Track"),
+ formats={},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return {
+ after_dig_node=function(pos)
+ advtrains.invalidate_all_paths()
+ advtrains.ndb.clear(pos)
+ end,
+ on_rightclick = function(pos, node, player)
+ show_fc_formspec(pos, player)
+ end,
+ advtrains = {
+ on_train_enter = function(pos, train_id)
+ train_load(pos, train_id, false)
+ end,
+ },
+ }
+ end
+ }, advtrains.trackpresets.t_30deg_straightonly)
+
+-- mod-dependent crafts
+local loader_core = "default:mese_crystal" --fallback
+if minetest.get_modpath("basic_materials") then
+ loader_core = "basic_materials:ic"
+elseif minetest.get_modpath("technic") then
+ loader_core = "technic:control_logic_unit"
+end
+--print("Loader Core: "..loader_core)
+
+minetest.register_craft({
+ type="shapeless",
+ output = 'advtrains:dtrack_load_placer',
+ recipe = {
+ "advtrains:dtrack_placer",
+ loader_core,
+ "default:chest"
+ },
+})
+loader_core = nil --nil the crafting variable
+
+--craft between load/unload tracks
+minetest.register_craft({
+ type="shapeless",
+ output = 'advtrains:dtrack_unload_placer',
+ recipe = {
+ "advtrains:dtrack_load_placer",
+ },
+})
+minetest.register_craft({
+ type="shapeless",
+ output = 'advtrains:dtrack_load_placer',
+ recipe = {
+ "advtrains:dtrack_unload_placer",
+ },
+})
+
+
+if mesecon then
+ advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_detector_off",
+ texture_prefix="advtrains_dtrack_detector",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_detector_off.png",
+ description=attrans("Detector Rail"),
+ formats={},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return {
+ mesecons = {
+ receptor = {
+ state = mesecon.state.off,
+ rules = advtrains.meseconrules
+ }
+ },
+ advtrains = {
+ on_updated_from_nodedb = function(pos, node)
+ mesecon.receptor_off(pos, advtrains.meseconrules)
+ end,
+ on_train_enter=function(pos, train_id)
+ advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
+ if advtrains.is_node_loaded(pos) then
+ mesecon.receptor_on(pos, advtrains.meseconrules)
+ end
+ end
+ }
+ }
+ end
+ }, advtrains.ap.t_30deg_straightonly)
+ advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack_detector_on",
+ texture_prefix="advtrains_dtrack",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_shared_detector_on.png",
+ description="Detector(on)(you hacker you)",
+ formats={},
+ get_additional_definiton = function(def, preset, suffix, rotation)
+ return {
+ mesecons = {
+ receptor = {
+ state = mesecon.state.on,
+ rules = advtrains.meseconrules
+ }
+ },
+ advtrains = {
+ on_updated_from_nodedb = function(pos, node)
+ mesecon.receptor_on(pos, advtrains.meseconrules)
+ end,
+ on_train_leave=function(pos, train_id)
+ advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
+ if advtrains.is_node_loaded(pos) then
+ mesecon.receptor_off(pos, advtrains.meseconrules)
+ end
+ end
+ }
+ }
+ end
+ }, advtrains.ap.t_30deg_straightonly_noplacer)
+minetest.register_craft({
+ type="shapeless",
+ output = 'advtrains:dtrack_detector_off_placer',
+ recipe = {
+ "advtrains:dtrack_placer",
+ "mesecons:wire_00000000_off"
+ },
+})
+end
+--TODO legacy
+--I know lbms are better for this purpose
+for name,rep in pairs({swl_st="swlst", swr_st="swrst", swl_cr="swlcr", swr_cr="swrcr", }) do
+ minetest.register_abm({
+ -- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_"..name},
+ interval = 1.0, -- Operation interval in seconds
+ chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep, param2=node.param2}) end,
+ })
+ minetest.register_abm({
+ -- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_"..name.."_45"},
+ interval = 1.0, -- Operation interval in seconds
+ chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep.."_45", param2=node.param2}) end,
+ })
+end
+
+if advtrains.register_replacement_lbms then
+minetest.register_lbm({
+ name = "advtrains:ramp_replacement_1",
+-- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_vert1"},
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst1", param2=(node.param2+2)%4}) end,
+})
+minetest.register_lbm({
+ name = "advtrains:ramp_replacement_1",
+-- -- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_vert2"},
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst2", param2=(node.param2+2)%4}) end,
+})
+ minetest.register_abm({
+ name = "advtrains:st_rep_1",
+ -- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_st"},
+ interval=1,
+ chance=1,
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st", param2=node.param2}) end,
+ })
+ minetest.register_lbm({
+ name = "advtrains:st_rep_1",
+ -- -- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_st_45"},
+ action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st_45", param2=node.param2}) end,
+ })
+end
diff --git a/advtrains_train_track/oldinit.lua b/advtrains_train_track/oldinit.lua
deleted file mode 100644
index 5065155..0000000
--- a/advtrains_train_track/oldinit.lua
+++ /dev/null
@@ -1,937 +0,0 @@
--- Default tracks for advtrains
--- (c) orwell96 and contributors
-
-local default_boxen = {
- ["st"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {-1/2-1/16, -1/2, -1/2, 1/2+1/16, -1/2+2/16, 1/2},
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-
- ["cr"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6875, -0.3750, 0.5000},
- {-0.3750, -0.5000, -1.000, 1.000, -0.3750, 0.000}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.7500, -0.3750, 0.8750},
- {-0.3750, -0.5000, 0.8750, 0.2500, -0.3750, 1.188},
- {0.7500, -0.5000, 0.2500, 1.063, -0.3750, 0.8750}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.125, 0.5000, -0.3750, 0.6875},
- {-0.8750, -0.5000, -0.9375, -0.5000, -0.3750, 0.06250},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8125, -0.5000, -0.5000, 1.188, -0.3750, 0.5000},
- {-0.1875, -0.5000, 0.5000, 0.8750, -0.3125, 0.8750},
- {-0.2500, -0.5000, -0.9375, 0.3125, -0.3125, -0.5000}
- }
- }
- },
- },
-
- ["swlst"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
- {-0.3125, -0.5000, -1.000, 0.9375, -0.3125, -0.06250}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.1875, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.8125, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-
- ["swrst"] = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.5000, 0.6250, -0.3750, 0.5000},
- {-0.8125, -0.5000, -1.000, 0.4375, -0.3125, -0.06250}
- }
- }
- },
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.1875, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.5000, -0.5000, 0.5000, 0.5000, -0.3750, 0.8750},
- {-0.8125, -0.5000, -0.8750, 0.5000, -0.3750, -0.5000}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- },
-}
-
-default_boxen["swlcr"] = default_boxen["swlst"]
-default_boxen["swrcr"] = default_boxen["swrst"]
-
---flat
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Track"),
- formats={},
-
- get_additional_definiton = function(def, preset, suffix, rotation)
- if default_boxen[suffix] ~= nil and default_boxen[suffix][rotation] ~= nil then
- return default_boxen[suffix][rotation]
- else
- return {}
- end
- end,
-}, advtrains.ap.t_30deg_flat)
-
-minetest.register_craft({
- output = 'advtrains:dtrack_placer 50',
- recipe = {
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- {'default:steel_ingot', 'group:stick', 'default:steel_ingot'},
- },
-})
-
-local y3_boxen = {
- [""] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8750, -0.5000, -1.125, 0.8750, -0.3750, 0.4375}
- }
- }
- },
-
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
- {0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
- }
- }
- },
-
- --UX FIXME: - 3way - have to place straight route before l and r or the
- --nodebox overlaps too much and can't place the straight track node.
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.1250, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-1.1250, -0.5000, -0.9375, -0.5000, -0.3750, 0.5000}
- }
- }
- },
-
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- --{-0.5000, -0.5000, -0.875, 0.5000, -0.3750, 1.000},
- {-0.875, -0.5000, -0.5, 1.0, -0.3750, 0.5},
- --{-0.8750, -0.5000, -0.4375, -0.5000, -0.3750, 0.5625},
- {-0.4375, -0.5000, -0.8750, 0.5625, -0.3750, -0.5000},
- --{0.5000, -0.5000, -0.2500, 0.8125, -0.3750, 1.000},
- {-0.2500, -0.5000, -0.2500, 1.0000, -0.3750, 0.8125},
- }
- }
- },
-}
-
-
-local function y3_turnouts_addef(def, preset, suffix, rotation)
- return y3_boxen[rotation] or {}
-end
--- y-turnout
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_sy",
- texture_prefix="advtrains_dtrack_sy",
- models_prefix="advtrains_dtrack_sy",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Y-turnout"),
- formats = {},
- get_additional_definiton = y3_turnouts_addef,
-}, advtrains.ap.t_yturnout)
-minetest.register_craft({
- output = 'advtrains:dtrack_sy_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'', 'advtrains:dtrack_placer', ''},
- },
-})
---3-way turnout
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_s3",
- texture_prefix="advtrains_dtrack_s3",
- models_prefix="advtrains_dtrack_s3",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("3-way turnout"),
- formats = {},
- get_additional_definiton = y3_turnouts_addef,
-}, advtrains.ap.t_s3way)
-minetest.register_craft({
- output = 'advtrains:dtrack_s3_placer 1',
- recipe = {
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'', '', ''},
- },
-})
-
--- Diamond Crossings
-
-local perp_boxen = {
- [""] = {}, --default size
- ["_30"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
- ["_45"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.8125, -0.5000, -0.8125, 0.8125, -0.3750, 0.8125}
- }
- }
- },
- ["_60"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
-}
-
--- perpendicular
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xing",
- texture_prefix="advtrains_dtrack_xing",
- models_prefix="advtrains_dtrack_xing",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Perpendicular Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return perp_boxen[rotation] or {}
- end
-}, advtrains.ap.t_perpcrossing)
-
-minetest.register_craft({
- output = 'advtrains:dtrack_xing_placer 3',
- recipe = {
- {'', 'advtrains:dtrack_placer', ''},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''}
- }
-})
-
-local ninety_plus_boxen = {
- ["30l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["30r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
- {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
- {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
- {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
- }
- }
- },
- ["45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -0.8750, 0.5000, -0.3750, 0.8750},
- {0.5000, -0.5000, -0.5000, 0.8750, -0.3750, 0.5000},
- {-0.8750, -0.5000, -0.5000, -0.5000, -0.3750, 0.5000}
- }
- }
- },
- ["60l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
-}
-
--- 90plusx
--- When you face east and param2=0, then this set of rails has a rail at 90
--- degrees to the viewer, plus another rail crossing at 30, 45 or 60 degrees.
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xing90plusx",
- texture_prefix="advtrains_dtrack_xing4590",
- models_prefix="advtrains_dtrack_xing90plusx",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("90+Angle Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return ninety_plus_boxen[suffix] or {}
- end,
-}, advtrains.ap.t_90plusx_crossing)
-minetest.register_craft({
- output = 'advtrains:dtrack_xing90plusx_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', ''},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- {'', '', 'advtrains:dtrack_placer'}
- }
-})
-
--- Deprecate any rails using the old name scheme
-minetest.register_lbm({
- label = "Upgrade legacy 4590 rails",
- name = "advtrains_train_track:replace_legacy_4590",
- nodenames = {"advtrains:dtrack_xing4590_st"},
- run_at_every_load = true,
- action = function(pos, node)
- minetest.log("actionPos!: " .. pos.x .. "," .. pos.y .. "," .. pos.z)
- minetest.log("node!: " .. node.name .. "," .. node.param1 .. "," .. node.param2)
- advtrains.ndb.swap_node(pos,
- {
- name="advtrains:dtrack_xing90plusx_45l",
- param1=node.param1,
- param2=node.param2,
- })
- end
-})
--- This will replace any items left in the inventory
-minetest.register_alias("advtrains:dtrack_xing4590_placer", "advtrains:dtrack_xing90plusx_placer")
-
-local diagonal_boxen = {
- ["30r45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {0.5000, -0.5000, -1.000, -0.5000, -0.3750, 1.000},
- {0.8750, -0.5000, -1.000, 0.5000, -0.3750, 0.2500},
- {-0.5000, -0.5000, -0.2500, -0.8750, -0.3750, 1.000},
- {0.1250, -0.5000, -1.375, -0.1875, -0.3750, -1.000}
- }
- }
- },
- ["60l30l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60l60r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -1.000, 1.000, -0.3750, 1.000}
- }
- }
- },
- ["60r30r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
- ["30l45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-0.5000, -0.5000, -1.000, 0.5000, -0.3750, 1.000},
- {-0.8750, -0.5000, -1.000, -0.5000, -0.3750, 0.2500},
- {0.5000, -0.5000, -0.2500, 0.8750, -0.3750, 1.000},
- {-0.1250, -0.5000, -1.375, 0.1875, -0.3750, -1.000}
- }
- }
- },
- ["60l45r"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {-1.000, -0.5000, -0.5000, 1.000, -0.3750, 0.5000},
- {-1.000, -0.5000, -0.8750, 0.2500, -0.3750, -0.5000},
- {-0.2500, -0.5000, 0.5000, 1.000, -0.3750, 0.8750},
- {-1.375, -0.5000, -0.1250, -1.000, -0.3750, 0.1875}
- }
- }
- },
- ["60r45l"] = {
- selection_box = {
- type = "fixed",
- fixed = {
- {1.000, -0.5000, -0.5000, -1.000, -0.3750, 0.5000},
- {1.000, -0.5000, -0.8750, -0.2500, -0.3750, -0.5000},
- {0.2500, -0.5000, 0.5000, -1.000, -0.3750, 0.8750},
- {1.375, -0.5000, -0.1250, 1.000, -0.3750, 0.1875}
- }
- }
- },
-}
-
--- Diagonal
--- This set of rail crossings is named based on the angle of each intersecting
--- direction when facing east and param2=0. Rails with l/r swapped are mirror
--- images. For example, 30r45l is the mirror image of 30l45r.
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_xingdiag",
- texture_prefix="advtrains_dtrack_xingdiag",
- models_prefix="advtrains_dtrack_xingdiag",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- description=attrans("Diagonal Diamond Crossing Track"),
- formats = {},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return diagonal_boxen[suffix] or {}
- end,
-}, advtrains.ap.t_diagonalcrossing)
-minetest.register_craft({
- output = 'advtrains:dtrack_xingdiag_placer 2',
- recipe = {
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'},
- {'', 'advtrains:dtrack_placer', ''},
- {'advtrains:dtrack_placer', '', 'advtrains:dtrack_placer'}
- }
-})
----- Not included: very shallow crossings like (30/60)+45.
----- At an angle of only 18.4 degrees, the models would not
----- translate well to a block game.
--- END crossings
-
---slopes
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".obj",
- shared_texture="advtrains_dtrack_shared.png",
- second_texture="default_gravel.png",
- description=attrans("Track"),
- formats={vst1={true, false, true}, vst2={true, false, true}, vst31={true}, vst32={true}, vst33={true}},
-}, advtrains.ap.t_30deg_slope)
-
-minetest.register_craft({
- type = "shapeless",
- output = 'advtrains:dtrack_slopeplacer 2',
- recipe = {
- "advtrains:dtrack_placer",
- "advtrains:dtrack_placer",
- "default:gravel",
- },
-})
-
-
---bumpers
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_bumper",
- texture_prefix="advtrains_dtrack_bumper",
- models_prefix="advtrains_dtrack_bumper",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_rail.png",
- --bumpers still use the old texture until the models are redone.
- description=attrans("Bumper"),
- formats={},
-}, advtrains.ap.t_30deg_straightonly)
-minetest.register_craft({
- output = 'advtrains:dtrack_bumper_placer 2',
- recipe = {
- {'group:wood', 'dye:red'},
- {'default:steel_ingot', 'default:steel_ingot'},
- {'advtrains:dtrack_placer', 'advtrains:dtrack_placer'},
- },
-})
---legacy bumpers
-for _,rot in ipairs({"", "_30", "_45", "_60"}) do
- minetest.register_alias("advtrains:dtrack_bumper"..rot, "advtrains:dtrack_bumper_st"..rot)
-end
--- atc track
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_atc",
- texture_prefix="advtrains_dtrack_atc",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_atc.png",
- description=attrans("ATC controller"),
- formats={},
- get_additional_definiton = advtrains.atc_function
-}, advtrains.trackpresets.t_30deg_straightonly)
-
-
--- Tracks for loading and unloading trains
--- Copyright (C) 2017 Gabriel Pérez-Cerezo <gabriel@gpcf.eu>
-
-local function get_far_node(pos)
- local node = minetest.get_node(pos)
- if node.name == "ignore" then
- minetest.get_voxel_manip():read_from_map(pos, pos)
- node = minetest.get_node(pos)
- end
- return node
-end
-
-
-local function show_fc_formspec(pos,player)
- local pname = player:get_player_name()
- if minetest.is_protected(pos,pname) then
- minetest.chat_send_player(pname, "Position is protected!")
- return
- end
-
- local meta = minetest.get_meta(pos)
- local fc = meta:get_string("fc") or ""
-
- local form = 'formspec_version[4]'..
- 'size[10,5]'..
- 'label[0.5,0.4;Advtrains Loading/Unloading Track]'..
- 'label[0.5,1.1;Set the code to match against the wagon\'s freight code]'..
- 'label[0.5,1.6;A blank field matches all wagons (default)]'..
- 'label[0.5,2.1;Use code # to disable the track section]'..
- 'field[0.5,3;5.5,1;fc;FC;'..minetest.formspec_escape(fc)..']'..
- 'button[6.5,3;3,1;save;Submit]'
- minetest.show_formspec(pname, "at_load_unload_"..advtrains.encode_pos(pos), form)
-end
-
-minetest.register_on_player_receive_fields(function(player, formname, fields)
- local pname = player:get_player_name()
- local pe = string.match(formname, "^at_load_unload_(............)$")
- local pos = advtrains.decode_pos(pe)
- if pos then
- if minetest.is_protected(pos, pname) then
- minetest.chat_send_player(pname, "Position is protected!")
- return
- end
-
- if fields.save then
- minetest.get_meta(pos):set_string("fc",tostring(fields.fc))
- minetest.chat_send_player(pname,"Freight code set: "..tostring(fields.fc))
- show_fc_formspec(pos,player)
- end
- end
-end)
-
-
-local function train_load(pos, train_id, unload)
- local train=advtrains.trains[train_id]
- local below = get_far_node({x=pos.x, y=pos.y-1, z=pos.z})
- if not string.match(below.name, "chest") then
- atprint("this is not a chest! at "..minetest.pos_to_string(pos))
- return
- end
-
- local node_fc = minetest.get_meta(pos):get_string("fc") or ""
- if node_fc == "#" then
- --track section is disabled
- return
- end
-
- local inv = minetest.get_inventory({type="node", pos={x=pos.x, y=pos.y-1, z=pos.z}})
- if inv and train.velocity < 2 then
- for k, v in ipairs(train.trainparts) do
- local i=minetest.get_inventory({type="detached", name="advtrains_wgn_"..v})
- if i and i:get_list("box") then
-
- local wagon_data = advtrains.wagons[v]
- local wagon_fc
- if wagon_data.fc then
- if not wagon_data.fcind then wagon_data.fcind = 1 end
- wagon_fc = tostring(wagon_data.fc[wagon_data.fcind]) or ""
- end
-
- if node_fc == "" or wagon_fc == node_fc then
- if not unload then
- for _, item in ipairs(inv:get_list("main")) do
- if i:get_list("box") and i:room_for_item("box", item) then
- i:add_item("box", item)
- inv:remove_item("main", item)
- end
- end
- else
- for _, item in ipairs(i:get_list("box")) do
- if inv:get_list("main") and inv:room_for_item("main", item) then
- i:remove_item("box", item)
- inv:add_item("main", item)
- end
- end
- end
- end
- end
- end
- end
-end
-
-
-
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_unload",
- texture_prefix="advtrains_dtrack_unload",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_unload.png",
- description=attrans("Unloading Track"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.ndb.clear(pos)
- end,
- on_rightclick = function(pos, node, player)
- show_fc_formspec(pos, player)
- end,
- advtrains = {
- on_train_enter = function(pos, train_id)
- train_load(pos, train_id, true)
- end,
- },
- }
- end
- }, advtrains.trackpresets.t_30deg_straightonly)
-advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_load",
- texture_prefix="advtrains_dtrack_load",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_load.png",
- description=attrans("Loading Track"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.ndb.clear(pos)
- end,
- on_rightclick = function(pos, node, player)
- show_fc_formspec(pos, player)
- end,
- advtrains = {
- on_train_enter = function(pos, train_id)
- train_load(pos, train_id, false)
- end,
- },
- }
- end
- }, advtrains.trackpresets.t_30deg_straightonly)
-
--- mod-dependent crafts
-local loader_core = "default:mese_crystal" --fallback
-if minetest.get_modpath("basic_materials") then
- loader_core = "basic_materials:ic"
-elseif minetest.get_modpath("technic") then
- loader_core = "technic:control_logic_unit"
-end
---print("Loader Core: "..loader_core)
-
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_load_placer',
- recipe = {
- "advtrains:dtrack_placer",
- loader_core,
- "default:chest"
- },
-})
-loader_core = nil --nil the crafting variable
-
---craft between load/unload tracks
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_unload_placer',
- recipe = {
- "advtrains:dtrack_load_placer",
- },
-})
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_load_placer',
- recipe = {
- "advtrains:dtrack_unload_placer",
- },
-})
-
-
-if mesecon then
- advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_detector_off",
- texture_prefix="advtrains_dtrack_detector",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_detector_off.png",
- description=attrans("Detector Rail"),
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- mesecons = {
- receptor = {
- state = mesecon.state.off,
- rules = advtrains.meseconrules
- }
- },
- advtrains = {
- on_updated_from_nodedb = function(pos, node)
- mesecon.receptor_off(pos, advtrains.meseconrules)
- end,
- on_train_enter=function(pos, train_id)
- advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_on".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
- if advtrains.is_node_loaded(pos) then
- mesecon.receptor_on(pos, advtrains.meseconrules)
- end
- end
- }
- }
- end
- }, advtrains.ap.t_30deg_straightonly)
- advtrains.register_tracks("default", {
- nodename_prefix="advtrains:dtrack_detector_on",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_shared_detector_on.png",
- description="Detector(on)(you hacker you)",
- formats={},
- get_additional_definiton = function(def, preset, suffix, rotation)
- return {
- mesecons = {
- receptor = {
- state = mesecon.state.on,
- rules = advtrains.meseconrules
- }
- },
- advtrains = {
- on_updated_from_nodedb = function(pos, node)
- mesecon.receptor_on(pos, advtrains.meseconrules)
- end,
- on_train_leave=function(pos, train_id)
- advtrains.ndb.swap_node(pos, {name="advtrains:dtrack_detector_off".."_"..suffix..rotation, param2=advtrains.ndb.get_node(pos).param2})
- if advtrains.is_node_loaded(pos) then
- mesecon.receptor_off(pos, advtrains.meseconrules)
- end
- end
- }
- }
- end
- }, advtrains.ap.t_30deg_straightonly_noplacer)
-minetest.register_craft({
- type="shapeless",
- output = 'advtrains:dtrack_detector_off_placer',
- recipe = {
- "advtrains:dtrack_placer",
- "mesecons:wire_00000000_off"
- },
-})
-end
---TODO legacy
---I know lbms are better for this purpose
-for name,rep in pairs({swl_st="swlst", swr_st="swrst", swl_cr="swlcr", swr_cr="swrcr", }) do
- minetest.register_abm({
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_"..name},
- interval = 1.0, -- Operation interval in seconds
- chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep, param2=node.param2}) end,
- })
- minetest.register_abm({
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_"..name.."_45"},
- interval = 1.0, -- Operation interval in seconds
- chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:track_"..rep.."_45", param2=node.param2}) end,
- })
-end
-
-if advtrains.register_replacement_lbms then
-minetest.register_lbm({
- name = "advtrains:ramp_replacement_1",
--- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_vert1"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst1", param2=(node.param2+2)%4}) end,
-})
-minetest.register_lbm({
- name = "advtrains:ramp_replacement_1",
--- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_vert2"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_vst2", param2=(node.param2+2)%4}) end,
-})
- minetest.register_abm({
- name = "advtrains:st_rep_1",
- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_st"},
- interval=1,
- chance=1,
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st", param2=node.param2}) end,
- })
- minetest.register_lbm({
- name = "advtrains:st_rep_1",
- -- -- In the following two fields, also group:groupname will work.
- nodenames = {"advtrains:track_st_45"},
- action = function(pos, node, active_object_count, active_object_count_wider) minetest.set_node(pos, {name="advtrains:dtrack_st_45", param2=node.param2}) end,
- })
-end