diff options
-rw-r--r-- | models/gleis/rail_my_rt_final_sw.blend1 | bin | 0 -> 824996 bytes | |||
-rw-r--r-- | models/gleis/rail_my_rt_final_sw.blend11 | bin | 0 -> 843380 bytes | |||
-rw-r--r-- | textures/advtrains_track_swlcr.png (renamed from textures/advtrains_track_swl_cr.png) | bin | 33378 -> 33378 bytes | |||
-rw-r--r-- | textures/advtrains_track_swlcr_45.png (renamed from textures/advtrains_track_swl_cr_45.png) | bin | 45772 -> 45772 bytes | |||
-rw-r--r-- | textures/advtrains_track_swlst.png (renamed from textures/advtrains_track_swl_st.png) | bin | 32321 -> 32321 bytes | |||
-rw-r--r-- | textures/advtrains_track_swlst_45.png (renamed from textures/advtrains_track_swl_st_45.png) | bin | 46408 -> 46408 bytes | |||
-rw-r--r-- | textures/advtrains_track_swrcr.png (renamed from textures/advtrains_track_swr_cr.png) | bin | 33670 -> 33670 bytes | |||
-rw-r--r-- | textures/advtrains_track_swrcr_45.png (renamed from textures/advtrains_track_swr_cr_45.png) | bin | 46865 -> 46865 bytes | |||
-rw-r--r-- | textures/advtrains_track_swrst.png (renamed from textures/advtrains_track_swr_st.png) | bin | 32654 -> 32654 bytes | |||
-rw-r--r-- | textures/advtrains_track_swrst_45.png (renamed from textures/advtrains_track_swr_st_45.png) | bin | 47636 -> 47636 bytes | |||
-rw-r--r-- | trackplacer.lua | 213 | ||||
-rw-r--r-- | tracks.lua | 504 |
12 files changed, 336 insertions, 381 deletions
diff --git a/models/gleis/rail_my_rt_final_sw.blend1 b/models/gleis/rail_my_rt_final_sw.blend1 Binary files differnew file mode 100644 index 0000000..1d37fa7 --- /dev/null +++ b/models/gleis/rail_my_rt_final_sw.blend1 diff --git a/models/gleis/rail_my_rt_final_sw.blend11 b/models/gleis/rail_my_rt_final_sw.blend11 Binary files differnew file mode 100644 index 0000000..7372d51 --- /dev/null +++ b/models/gleis/rail_my_rt_final_sw.blend11 diff --git a/textures/advtrains_track_swl_cr.png b/textures/advtrains_track_swlcr.png Binary files differindex d9b5c0b..d9b5c0b 100644 --- a/textures/advtrains_track_swl_cr.png +++ b/textures/advtrains_track_swlcr.png diff --git a/textures/advtrains_track_swl_cr_45.png b/textures/advtrains_track_swlcr_45.png Binary files differindex f098fc9..f098fc9 100644 --- a/textures/advtrains_track_swl_cr_45.png +++ b/textures/advtrains_track_swlcr_45.png diff --git a/textures/advtrains_track_swl_st.png b/textures/advtrains_track_swlst.png Binary files differindex 314bd2d..314bd2d 100644 --- a/textures/advtrains_track_swl_st.png +++ b/textures/advtrains_track_swlst.png diff --git a/textures/advtrains_track_swl_st_45.png b/textures/advtrains_track_swlst_45.png Binary files differindex 765d0ec..765d0ec 100644 --- a/textures/advtrains_track_swl_st_45.png +++ b/textures/advtrains_track_swlst_45.png diff --git a/textures/advtrains_track_swr_cr.png b/textures/advtrains_track_swrcr.png Binary files differindex f74e1bc..f74e1bc 100644 --- a/textures/advtrains_track_swr_cr.png +++ b/textures/advtrains_track_swrcr.png diff --git a/textures/advtrains_track_swr_cr_45.png b/textures/advtrains_track_swrcr_45.png Binary files differindex fa432aa..fa432aa 100644 --- a/textures/advtrains_track_swr_cr_45.png +++ b/textures/advtrains_track_swrcr_45.png diff --git a/textures/advtrains_track_swr_st.png b/textures/advtrains_track_swrst.png Binary files differindex 06ea29e..06ea29e 100644 --- a/textures/advtrains_track_swr_st.png +++ b/textures/advtrains_track_swrst.png diff --git a/textures/advtrains_track_swr_st_45.png b/textures/advtrains_track_swrst_45.png Binary files differindex be477b7..be477b7 100644 --- a/textures/advtrains_track_swr_st_45.png +++ b/textures/advtrains_track_swrst_45.png diff --git a/trackplacer.lua b/trackplacer.lua index e5b3f84..7f04f93 100644 --- a/trackplacer.lua +++ b/trackplacer.lua @@ -3,20 +3,47 @@ local print=function(t, ...) minetest.log("action", table.concat({t, ...}, " ")) minetest.chat_send_all(table.concat({t, ...}, " ")) end ---keys:conn1_conn2 (example:1_4) ---values:{name=x, param2=x} -advtrains.trackplacer_dir_to_node_mapping={} ---keys are nodenames! -advtrains.trackplacer_modified_rails={} +--all new trackplacer code +local tp={ + tracks={} +} -function advtrains.trackplacer_register(nodename, conn1, conn2) +function tp.register_tracktype(nnprefix, n_suffix) + tp.tracks[nnprefix]={ + default=n_suffix, + single_conn={}, + double_conn={}, + --keys:conn1_conn2 (example:1_4) + --values:{name=x, param2=x} + twcycle={}, + twrotate={},--indexed by suffix, list, tells order of rotations + modify={} + } +end +function tp.add_double_conn(nnprefix, suffix, rotation, conns) + local nodename=nnprefix.."_"..suffix..rotation + for i=0,3 do + tp.tracks[nnprefix].double_conn[((conns.conn1+4*i)%16).."_"..((conns.conn2+4*i)%16)]={name=nodename, param2=i} + tp.tracks[nnprefix].double_conn[((conns.conn2+4*i)%16).."_"..((conns.conn1+4*i)%16)]={name=nodename, param2=i} + end + tp.tracks[nnprefix].modify[nodename]=true +end +function tp.add_single_conn(nnprefix, suffix, rotation, conns) + local nodename=nnprefix.."_"..suffix..rotation for i=0,3 do - advtrains.trackplacer_dir_to_node_mapping[((conn1+2*i)%8).."_"..((conn2+2*i)%8)]={name=nodename, param2=i} - advtrains.trackplacer_dir_to_node_mapping[((conn2+2*i)%8).."_"..((conn1+2*i)%8)]={name=nodename, param2=i} + tp.tracks[nnprefix].single_conn[((conns.conn1+4*i)%16)]={name=nodename, param2=i} + tp.tracks[nnprefix].single_conn[((conns.conn2+4*i)%16)]={name=nodename, param2=i} end - advtrains.trackplacer_modified_rails[nodename]=true + tp.tracks[nnprefix].modify[nodename]=true end -function advtrains.find_adjacent_tracks(pos)--TODO vertical calculations(check node below) + +function tp.add_worked(nnprefix, suffix, rotation, cycle_follows) + tp.tracks[nnprefix].twcycle[suffix]=cycle_follows + if not tp.tracks[nnprefix].twrotate[suffix] then tp.tracks[nnprefix].twrotate[suffix]={} end + table.insert(tp.tracks[nnprefix].twrotate[suffix], rotation) +end + +function tp.find_adjacent_tracks(pos)--TODO vertical calculations(check node below) local conn1=0 while conn1<16 and not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, conn1)).name, advtrains.all_tracktypes) do conn1=conn1+1 @@ -33,89 +60,86 @@ function advtrains.find_adjacent_tracks(pos)--TODO vertical calculations(check n end return conn1, conn2 end +function tp.find_already_connected(pos)--TODO vertical calculations(check node below) + local function istrackandbc(pos, conn) + local cnode=minetest.get_node(advtrains.dirCoordSet(pos, conn)) + local bconn=(conn+8)%16 + if advtrains.is_track_and_drives_on(cnode.name, advtrains.all_tracktypes) then + local cconn1, cconn2=advtrains.get_track_connections(cnode.name, cnode.param2) + return cconn1==bconn or cconn2==bconn + end + return false + end + local conn1=0 + while conn1<16 and not istrackandbc(pos, conn1) do + conn1=conn1+1 + end + if conn1>=16 then + return nil, nil + end + local conn2=0 + while conn2<16 and not istrackandbc(pos, conn2) or conn2==conn1 do + conn2=conn2+1 + end + if conn2>=16 then + return conn1, nil + end + return conn1, conn2 +end -local modext={[0]="", "_30", "_45", "_60"} - -function advtrains.placetrack(pos, nnpref) - local conn1, conn2=advtrains.find_adjacent_tracks(pos) - +function tp.placetrack(pos, nnpref) + local conn1, conn2=tp.find_adjacent_tracks(pos) + local tr=tp.tracks[nnpref] if not conn1 and not conn2 then - minetest.set_node(pos, {name=nnpref.."_st"}) + minetest.set_node(pos, {name=nnpref.."_"..tr.default}) elseif conn1 and not conn2 then - local node1=minetest.get_node(advtrains.dirCoordSet(pos, conn1)) - local node1_conn1, node1_conn2=advtrains.get_track_connections(node1.name, node1.param2) - local node1_backconnects=(conn1+8)%16==node1_conn1 or (conn1+8)%16==node1_conn2 - - if not node1_backconnects and advtrains.trackplacer_modified_rails[node1.name] then - --check if this rail has a dangling connection - --TODO possible problems on |- situation - if not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node1_conn1)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node1_conn1.."_"..((conn1+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn1), advtrains.trackplacer_dir_to_node_mapping[node1_conn1.."_"..((conn1+8)%16)]) - end - elseif not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node1_conn2)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node1_conn2.."_"..((conn1+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn1), advtrains.trackplacer_dir_to_node_mapping[node1_conn2.."_"..((conn1+8)%16)]) - end - end + if tr.single_conn[conn1] then + tp.try_adjust_rail(tr, advtrains.dirCoordSet(pos, conn1), (conn1+8)%16) + minetest.set_node(pos, tr.single_conn[conn1]) + else + minetest.set_node(pos, {name=nnpref.."_"..tr.default}) end - --second end will be free. place standard rail - local modulo=conn1%4 - minetest.set_node(pos, {name=nnpref.."_st"..modext[modulo], param2=(conn1-modulo)/4}) - elseif conn1 and conn2 then - if not advtrains.trackplacer_dir_to_node_mapping[conn1.."_"..conn2] then - minetest.set_node(pos, {name=nnpref.."_st"}) - return + if tr.double_conn[conn1.."_"..conn2] then + tp.try_adjust_rail(tr, advtrains.dirCoordSet(pos, conn1), (conn1+8)%16) + tp.try_adjust_rail(tr, advtrains.dirCoordSet(pos, conn2), (conn1+8)%16) + minetest.set_node(pos, tr.double_conn[conn1.."_"..conn2]) + elseif tr.single_conn[conn1] then --try at least one side + tp.try_adjust_rail(tr, advtrains.dirCoordSet(pos, conn1), (conn1+8)%16) + minetest.set_node(pos, tr.single_conn[conn1]) + else + minetest.set_node(pos, {name=nnpref.."_"..tr.default}) end - local node1=minetest.get_node(advtrains.dirCoordSet(pos, conn1)) - local node1_conn1, node1_conn2=advtrains.get_track_connections(node1.name, node1.param2) - local node1_backconnects=(conn1+8)%16==node1_conn1 or (conn1+8)%16==node1_conn2 - if not node1_backconnects and advtrains.trackplacer_modified_rails[node1.name] then - --check if this rail has a dangling connection - --TODO possible problems on |- situation - if not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node1_conn1)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node1_conn1.."_"..((conn1+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn1), advtrains.trackplacer_dir_to_node_mapping[node1_conn1.."_"..((conn1+8)%16)]) - end - elseif not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node1_conn2)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node1_conn2.."_"..((conn1+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn1), advtrains.trackplacer_dir_to_node_mapping[node1_conn2.."_"..((conn1+8)%16)]) - end - end + end +end +function tp.try_adjust_rail(tr, pos, newdir) + --is rail already connected? + local node=minetest.get_node(pos) + local conn1, conn2=advtrains.get_track_connections(node.name, node.param2) + if newdir==conn1 or newdir==conn2 then + return + end + --rail at other end? + local adj1, adj2=tp.find_already_connected(pos) + if adj1 and adj2 then + return false--dont destroy existing track + elseif adj1 and not adj2 then + if tr.double_conn[adj1.."_"..newdir] then + minetest.set_node(pos, tr.double_conn[adj1.."_"..newdir]) + return true--if exists, connect new rail and old end end - - local node2=minetest.get_node(advtrains.dirCoordSet(pos, conn2)) - local node2_conn1, node2_conn2=advtrains.get_track_connections(node2.name, node2.param2) - local node2_backconnects=(conn2+8)%16==node2_conn1 or (conn2+8)%16==node2_conn2 - if not node2_backconnects and advtrains.trackplacer_modified_rails[node2.name] then - --check if this rail has a dangling connection - --TODO possible problems on |- situation - if not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node2_conn1)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node2_conn1.."_"..((conn2+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn2), advtrains.trackplacer_dir_to_node_mapping[node2_conn1.."_"..((conn2+8)%16)]) - end - elseif not advtrains.is_track_and_drives_on(minetest.get_node(advtrains.dirCoordSet(pos, node2_conn2)).name, advtrains.all_tracktypes) then - if advtrains.trackplacer_dir_to_node_mapping[node2_conn2.."_"..((conn1+8)%16)] then - minetest.set_node(advtrains.dirCoordSet(pos, conn2), advtrains.trackplacer_dir_to_node_mapping[node2_conn2.."_"..((conn2+8)%16)]) - end - end + return false + else + if tr.single_conn[newdir] then--just rotate old rail to right orientation + minetest.set_node(pos, tr.single_conn[newdir]) + return true end - minetest.set_node(pos, advtrains.trackplacer_dir_to_node_mapping[conn1.."_"..conn2]) + return false end end -advtrains.trackworker_cycle_nodes={ - ["swr_cr"]="st", - ["swr_st"]="st", - ["st"]="cr", - ["cr"]="swl_st", - ["swl_cr"]="swr_cr", - ["swl_st"]="swr_st", -} - -function advtrains.register_track_placer(nnprefix, imgprefix, dispname) +function tp.register_track_placer(nnprefix, imgprefix, dispname) minetest.register_craftitem(nnprefix.."_placer",{ description = dispname, inventory_image = imgprefix.."_placer.png", @@ -124,7 +148,7 @@ function advtrains.register_track_placer(nnprefix, imgprefix, dispname) if pointed_thing.type=="node" then local pos=pointed_thing.above if minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then - advtrains.placetrack(pos, nnprefix) + tp.placetrack(pos, nnprefix) if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end @@ -150,14 +174,17 @@ minetest.register_craftitem("advtrains:trackworker",{ if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end if advtrains.is_train_at_pos(pos) then return end - local nodeprefix, railtype, rotation=string.match(node.name, "^([^_]+)_([^_]+)(_?.*)$") + + local nnprefix, suffix, rotation=string.match(node.name, "^([^_]+)_([^_]+)(_?.*)$") --print(node.name.."\npattern recognizes:"..nodeprefix.." / "..railtype.." / "..rotation) - if not advtrains.trackworker_cycle_nodes[railtype] then - print("[advtrains]rail not workable by trackworker") + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then + print("[advtrains]railtype not workable by trackworker") return end + local modext=tp.tracks[nnprefix].twrotate[suffix] + if rotation==modext[#modext] then --increase param2 - minetest.set_node(pos, {name=nodeprefix.."_"..railtype..modext[0], param2=(node.param2+1)%4}) + minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[1], param2=(node.param2+1)%4}) return else local modpos @@ -166,7 +193,7 @@ minetest.register_craftitem("advtrains:trackworker",{ print("[advtrains]rail not workable by trackworker") return end - minetest.set_node(pos, {name=nodeprefix.."_"..railtype..modext[modpos+1], param2=node.param2}) + minetest.set_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) end advtrains.invalidate_all_paths() end @@ -178,15 +205,19 @@ minetest.register_craftitem("advtrains:trackworker",{ if not advtrains.is_track_and_drives_on(minetest.get_node(pos).name, advtrains.all_tracktypes) then return end if advtrains.is_train_at_pos(pos) then return end - local nodeprefix, railtype, rotation=string.match(node.name, "^([^_]+)_([^_]+)(_?.*)$") + local nnprefix, suffix, rotation=string.match(node.name, "^([^_]+)_([^_]+)(_?.*)$") - if not advtrains.trackworker_cycle_nodes[railtype] then - print("[advtrains]trackworker does not know what to set here...") + if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then + print("[advtrains]railtype not workable by trackworker") return end - minetest.set_node(pos, {name=nodeprefix.."_"..advtrains.trackworker_cycle_nodes[railtype]..rotation, param2=node.param2}) + local nextsuffix=tp.tracks[nnprefix].twcycle[suffix] + minetest.set_node(pos, {name=nnprefix.."_"..nextsuffix..rotation, param2=node.param2}) --invalidate trains advtrains.invalidate_all_paths() end end, }) + +--putting into right place +advtrains.trackplacer=tp @@ -26,7 +26,99 @@ vert2={ ]]--
advtrains.all_tracktypes={}
-function advtrains.register_tracks(tracktype, def)
+--definition preparation
+local function conns(c1, c2, r1, r2, rh, rots) return {conn1=c1, conn2=c2, rely1=r1, rely2=r2, railheight=rh} end
+
+local t_30deg={
+ regstep=1,
+ variant={
+ st=conns(0,8),
+ cr=conns(0,7),
+ swlst=conns(0,8),
+ swlcr=conns(0,7),
+ swrst=conns(0,8),
+ swrcr=conns(0,9),
+ vst1=conns(8,0,0,0.5,0.25),
+ vst2=conns(8,0,0.5,1,0.75),
+ },
+ switch={
+ swlst="swlcr",
+ swlcr="swlst",
+ swrst="swrcr",
+ swrcr="swrst",
+ },
+ trackplacer={
+ st=true,
+ cr=true,
+ },
+ tpsingle={
+ st=true,
+ },
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["st"]="cr",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_30", "_45", "_60"},
+ increativeinv={vst1=true, vst2=true}
+}
+local t_45deg={
+ regstep=2,
+ variant={
+ st=conns(0,8),
+ cr=conns(0,6),
+ swlst=conns(0,8),
+ swlcr=conns(0,6),
+ swrst=conns(0,8),
+ swrcr=conns(0,10),
+ vst1=conns(8,0,0,0.5,0.25),
+ vst2=conns(8,0,0.5,1,0.75),
+ },
+ switch={
+ swlst="swlcr",
+ swlcr="swlst",
+ swrst="swrcr",
+ swrcr="swrst",
+ },
+ trackplacer={
+ st=true,
+ cr=true,
+ },
+ tpsingle={
+ st=true,
+ },
+ tpdefault="st",
+ trackworker={
+ ["swrcr"]="st",
+ ["swrst"]="st",
+ ["st"]="cr",
+ ["cr"]="swlst",
+ ["swlcr"]="swrcr",
+ ["swlst"]="swrst",
+ },
+ rotation={"", "_45"},
+ increativeinv={vst1=true, vst2=true}
+}
+
+--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
+}]]
+function advtrains.register_tracks(tracktype, def, preset)
local function make_switchfunc(suffix_target)
return function(pos, node)
if advtrains.is_train_at_pos(pos) then return end
@@ -35,115 +127,33 @@ function advtrains.register_tracks(tracktype, def) advtrains.reset_trackdb_position(pos)
end
end
- local function make_overdef(img_suffix, conn1, conn2, switchfunc)
+ local function make_overdef(img_suffix, conns, switchfunc)
return {
- tiles = {def.texture_prefix.."_"..img_suffix..".png"},
+ mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix),
+ tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png")},
inventory_image = def.texture_prefix.."_"..img_suffix..".png",
wield_image = def.texture_prefix.."_"..img_suffix..".png",
- connect1=conn1,
- connect2=conn2,
+ connect1=conns.conn1,
+ connect2=conns.conn2,
+ rely1=conns.rely1 or 0,
+ rely2=conns.rely2 or 0,
+ railheight=conns.railheight or 0,
on_rightclick=switchfunc,
}
end
- local common_def=advtrains.merge_tables({
- description = def.description,
- drawtype = "mesh",
- mesh = "trackplane.b3d",
- paramtype="light",
- paramtype2="facedir",
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
- },
- groups = {
- attached_node=1,
- ["advtrains_track_"..tracktype]=1,
- dig_immediate=2,
- not_in_creative_inventory=1,
- },
- rely1=0,
- rely2=0,
- railheight=0,
- drop="advtrains:placetrack_"..tracktype,
- --on_rightclick=function(pos, node, clicker)
- -- minetest.set_node(pos, {name=node.name, param2=(node.param2+1)%4})
- --end
- can_dig=function(pos)
- return not advtrains.is_train_at_pos(pos)
- end,
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.reset_trackdb_position(pos)
- end,
- after_place_node=function(pos)
- advtrains.reset_trackdb_position(pos)
- end,
- }, def.common or {})
- minetest.register_node(def.nodename_prefix.."_st", advtrains.merge_tables(common_def, make_overdef("st", 0, 8), def.straight or {}))
- minetest.register_node(def.nodename_prefix.."_st_45", advtrains.merge_tables(common_def, make_overdef("st_45", 2, 10), def.straight45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_cr", advtrains.merge_tables(common_def, make_overdef("cr", 0, 6), def.curve or {}))
- minetest.register_node(def.nodename_prefix.."_cr_45", advtrains.merge_tables(common_def, make_overdef("cr_45", 2, 8), def.curve45 or {}))
-
- advtrains.trackplacer_register(def.nodename_prefix.."_st", 0, 8)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_45", 2, 10)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr", 0, 6)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_45", 2, 8)
-
-
- minetest.register_node(def.nodename_prefix.."_swl_st", advtrains.merge_tables(common_def, make_overdef("swl_st", 0, 8, make_switchfunc("swl_cr")), def.lswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swl_st_45", advtrains.merge_tables(common_def, make_overdef("swl_st_45", 2, 10, make_switchfunc("swl_cr_45")), def.lswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr", advtrains.merge_tables(common_def, make_overdef("swl_cr", 0, 6, make_switchfunc("swl_st")), def.lswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr_45", advtrains.merge_tables(common_def, make_overdef("swl_cr_45", 2, 8, make_switchfunc("swl_st_45")), def.lswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_swr_st", advtrains.merge_tables(common_def, make_overdef("swr_st", 0, 8, make_switchfunc("swr_cr")), def.rswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swr_st_45", advtrains.merge_tables(common_def, make_overdef("swr_st_45", 2, 10, make_switchfunc("swr_cr_45")), def.rswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr", advtrains.merge_tables(common_def, make_overdef("swr_cr", 0, 10, make_switchfunc("swr_st")), def.rswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr_45", advtrains.merge_tables(common_def, make_overdef("swr_cr_45", 2, 12, make_switchfunc("swr_st_45")), def.rswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_vert1", advtrains.merge_tables(common_def, make_overdef("vert1", 0, 8), {
- mesh = "trackvertical1.b3d",
- rely1=0,
- rely2=0.5,
- railheight=0.25,
- description = def.description.." (vertical track lower node)",
- }, def.vert1 or {}))
- minetest.register_node(def.nodename_prefix.."_vert2", advtrains.merge_tables(common_def, make_overdef("vert2", 0, 8), {
- mesh = "trackvertical2.b3d",
- rely1=0.5,
- rely2=1,
- railheight=0.75,
- description = def.description.." (vertical track upper node)",
- },def.vert2 or {}))
-
- advtrains.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description)
- table.insert(advtrains.all_tracktypes, tracktype)
-end
-
-function advtrains.register_tracks_finer(tracktype, def)
- local function make_switchfunc(suffix_target)
- return function(pos, node)
- if advtrains.is_train_at_pos(pos) then return end
- advtrains.invalidate_all_paths()
- minetest.set_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2})
- advtrains.reset_trackdb_position(pos)
- end
- end
- local function make_overdef(img_suffix, conn1, conn2, switchfunc)
+ local function cycle_conns(conns, rotid)
+ local add=(rotid-1)*preset.regstep
return {
- tiles = {def.texture_prefix.."_"..img_suffix..".png"},
- inventory_image = def.texture_prefix.."_"..img_suffix..".png",
- wield_image = def.texture_prefix.."_"..img_suffix..".png",
- connect1=conn1,
- connect2=conn2,
- on_rightclick=switchfunc,
+ conn1=(conns.conn1+add)%16,
+ conn2=(conns.conn2+add)%16,
+ rely1=conns.rely1 or 0,
+ rely2=conns.rely2 or 0,
+ railheight=conns.railheight or 0,
}
end
local common_def=advtrains.merge_tables({
description = def.description,
drawtype = "mesh",
- mesh = "trackplane.b3d",
paramtype="light",
paramtype2="facedir",
walkable = false,
@@ -155,15 +165,12 @@ function advtrains.register_tracks_finer(tracktype, def) attached_node=1,
["advtrains_track_"..tracktype]=1,
dig_immediate=2,
- --not_in_creative_inventory=1,
+ not_in_creative_inventory=1,--NOTE see below when changing groups
},
rely1=0,
rely2=0,
railheight=0,
drop="advtrains:placetrack_"..tracktype,
- --on_rightclick=function(pos, node, clicker)
- -- minetest.set_node(pos, {name=node.name, param2=(node.param2+1)%4})
- --end
can_dig=function(pos)
return not advtrains.is_train_at_pos(pos)
end,
@@ -175,200 +182,47 @@ function advtrains.register_tracks_finer(tracktype, def) advtrains.reset_trackdb_position(pos)
end,
}, def.common or {})
- minetest.register_node(def.nodename_prefix.."_st", advtrains.merge_tables(common_def, make_overdef("st", 0, 8), def.straight or {}))
- minetest.register_node(def.nodename_prefix.."_st_30", advtrains.merge_tables(common_def, make_overdef("st_30", 1, 9), def.straight30 or {}))
- minetest.register_node(def.nodename_prefix.."_st_45", advtrains.merge_tables(common_def, make_overdef("st_45", 2, 10), def.straight45 or {}))
- minetest.register_node(def.nodename_prefix.."_st_60", advtrains.merge_tables(common_def, make_overdef("st_60", 3, 11), def.straight60 or {}))
-
- minetest.register_node(def.nodename_prefix.."_cr", advtrains.merge_tables(common_def, make_overdef("cr", 0, 7), def.curve or {}))
- minetest.register_node(def.nodename_prefix.."_cr_30", advtrains.merge_tables(common_def, make_overdef("cr_30", 1, 8), def.curve45 or {}))
- minetest.register_node(def.nodename_prefix.."_cr_45", advtrains.merge_tables(common_def, make_overdef("cr_45", 2, 9), def.curve45 or {}))
- minetest.register_node(def.nodename_prefix.."_cr_60", advtrains.merge_tables(common_def, make_overdef("cr_60", 3, 10), def.curve45 or {}))
+ --make trackplacer base def
+ advtrains.trackplacer.register_tracktype(def.nodename_prefix, preset.tpdefault)
+ advtrains.trackplacer.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description)
- --[[advtrains.trackplacer_register(def.nodename_prefix.."_st", 0, 8)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_45", 2, 10)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr", 0, 6)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_45", 2, 8)
- --]]
- --[[
- minetest.register_node(def.nodename_prefix.."_swl_st", advtrains.merge_tables(common_def, make_overdef("swl_st", 0, 8, make_switchfunc("swl_cr")), def.lswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swl_st_45", advtrains.merge_tables(common_def, make_overdef("swl_st_45", 2, 10, make_switchfunc("swl_cr_45")), def.lswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr", advtrains.merge_tables(common_def, make_overdef("swl_cr", 0, 6, make_switchfunc("swl_st")), def.lswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr_45", advtrains.merge_tables(common_def, make_overdef("swl_cr_45", 2, 8, make_switchfunc("swl_st_45")), def.lswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_swr_st", advtrains.merge_tables(common_def, make_overdef("swr_st", 0, 8, make_switchfunc("swr_cr")), def.rswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swr_st_45", advtrains.merge_tables(common_def, make_overdef("swr_st_45", 2, 10, make_switchfunc("swr_cr_45")), def.rswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr", advtrains.merge_tables(common_def, make_overdef("swr_cr", 0, 10, make_switchfunc("swr_st")), def.rswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr_45", advtrains.merge_tables(common_def, make_overdef("swr_cr_45", 2, 12, make_switchfunc("swr_st_45")), def.rswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_vert1", advtrains.merge_tables(common_def, make_overdef("vert1", 0, 8), {
- mesh = "trackvertical1.b3d",
- rely1=0,
- rely2=0.5,
- railheight=0.25,
- description = def.description.." (vertical track lower node)",
- }, def.vert1 or {}))
- minetest.register_node(def.nodename_prefix.."_vert2", advtrains.merge_tables(common_def, make_overdef("vert2", 0, 8), {
- mesh = "trackvertical2.b3d",
- rely1=0.5,
- rely2=1,
- railheight=0.75,
- description = def.description.." (vertical track upper node)",
- },def.vert2 or {}))
- ]]
-
- --we don't have texures yet
-
- advtrains.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description)
- table.insert(advtrains.all_tracktypes, tracktype)
-end
-
---def must include: models_prefix, models_suffix(with dot)
--- def.shared_texture="full_name.png" if shared texture for all models is wanted
-function advtrains.register_tracks_modeled(tracktype, def)
- local function make_switchfunc(suffix_target)
- return function(pos, node)
- if advtrains.is_train_at_pos(pos) then return end
- advtrains.invalidate_all_paths()
- minetest.set_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2})
- advtrains.reset_trackdb_position(pos)
+ for suffix, conns 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 switchfunc
+ if preset.switch[suffix] then
+ switchfunc=make_switchfunc(preset.switch[suffix]..rotation)
+ end
+ minetest.register_node(def.nodename_prefix.."_"..suffix..rotation, advtrains.merge_tables(
+ common_def,
+ make_overdef(
+ suffix..rotation,
+ cycle_conns(conns, rotid),
+ switchfunc
+ )
+ ),
+ preset.increativeinv[suffix] and {
+ groups = {--NOTE change groups here too
+ attached_node=1,
+ ["advtrains_track_"..tracktype]=1,
+ dig_immediate=2,
+ },
+ } or {}
+ )
+ --trackplacer
+ if preset.trackplacer[suffix] then
+ advtrains.trackplacer.add_double_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid))
+ end
+ if preset.tpsingle[suffix] then
+ advtrains.trackplacer.add_single_conn(def.nodename_prefix, suffix, rotation, cycle_conns(conns, rotid))
+ end
+ advtrains.trackplacer.add_worked(def.nodename_prefix, suffix, rotation, preset.trackworker[suffix])
+ end
end
end
- local function make_overdef(img_suffix, conn1, conn2, switchfunc)
- return {
- mesh = def.models_prefix.."_"..img_suffix..def.models_suffix,
- tiles = {def.shared_texture or (def.texture_prefix.."_"..img_suffix..".png")},
- inventory_image = def.texture_prefix.."_"..img_suffix..".png",
- wield_image = def.texture_prefix.."_"..img_suffix..".png",
- connect1=conn1,
- connect2=conn2,
- on_rightclick=switchfunc,
- }
- end
- local common_def=advtrains.merge_tables({
- description = def.description,
- drawtype = "mesh",
- paramtype="light",
- paramtype2="facedir",
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
- },
- groups = {
- attached_node=1,
- ["advtrains_track_"..tracktype]=1,
- dig_immediate=2,
- not_in_creative_inventory=1,
- },
- rely1=0,
- rely2=0,
- railheight=0,
- drop="advtrains:placetrack_"..tracktype,
- --on_rightclick=function(pos, node, clicker)
- -- minetest.set_node(pos, {name=node.name, param2=(node.param2+1)%4})
- --end
- can_dig=function(pos)
- return not advtrains.is_train_at_pos(pos)
- end,
- after_dig_node=function(pos)
- advtrains.invalidate_all_paths()
- advtrains.reset_trackdb_position(pos)
- end,
- after_place_node=function(pos)
- advtrains.reset_trackdb_position(pos)
- end,
- }, def.common or {})
- minetest.register_node(def.nodename_prefix.."_st", advtrains.merge_tables(common_def, make_overdef("st", 0, 8), def.straight or {}))
- minetest.register_node(def.nodename_prefix.."_st_30", advtrains.merge_tables(common_def, make_overdef("st_30", 1, 9), def.straight30 or {}))
- minetest.register_node(def.nodename_prefix.."_st_45", advtrains.merge_tables(common_def, make_overdef("st_45", 2, 10), def.straight45 or {}))
- minetest.register_node(def.nodename_prefix.."_st_60", advtrains.merge_tables(common_def, make_overdef("st_60", 3, 11), def.straight60 or {}))
-
- minetest.register_node(def.nodename_prefix.."_cr", advtrains.merge_tables(common_def, make_overdef("cr", 0, 7), def.curve or {}))
- minetest.register_node(def.nodename_prefix.."_cr_30", advtrains.merge_tables(common_def, make_overdef("cr_30", 1, 8), def.curve30 or {}))
- minetest.register_node(def.nodename_prefix.."_cr_45", advtrains.merge_tables(common_def, make_overdef("cr_45", 2, 9), def.curve45 or {}))
- minetest.register_node(def.nodename_prefix.."_cr_60", advtrains.merge_tables(common_def, make_overdef("cr_60", 3, 10), def.curve60 or {}))
-
- minetest.register_node(def.nodename_prefix.."_vst1", advtrains.merge_tables(common_def, make_overdef("vst1", 8, 0),
- {
- rely1=0,
- rely2=0.5,
- railheight=0.25,
- },
- def.vst1 or {}))
- minetest.register_node(def.nodename_prefix.."_vst2", advtrains.merge_tables(common_def, make_overdef("vst2", 8, 0),
- {
- rely1=0.5,
- rely2=1,
- railheight=0.75,
- },
- def.vst2 or {}))
-
- advtrains.trackplacer_register(def.nodename_prefix.."_st", 0, 8)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_30", 1, 9)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_45", 2, 10)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_60", 3, 11)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr", 0, 7)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_30", 1, 8)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_45", 2, 9)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_60", 3, 10)
-
- --[[advtrains.trackplacer_register(def.nodename_prefix.."_st", 0, 8)
- advtrains.trackplacer_register(def.nodename_prefix.."_st_45", 2, 10)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr", 0, 6)
- advtrains.trackplacer_register(def.nodename_prefix.."_cr_45", 2, 8)
- --]]
- --[[
- minetest.register_node(def.nodename_prefix.."_swl_st", advtrains.merge_tables(common_def, make_overdef("swl_st", 0, 8, make_switchfunc("swl_cr")), def.lswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swl_st_45", advtrains.merge_tables(common_def, make_overdef("swl_st_45", 2, 10, make_switchfunc("swl_cr_45")), def.lswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr", advtrains.merge_tables(common_def, make_overdef("swl_cr", 0, 6, make_switchfunc("swl_st")), def.lswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swl_cr_45", advtrains.merge_tables(common_def, make_overdef("swl_cr_45", 2, 8, make_switchfunc("swl_st_45")), def.lswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_swr_st", advtrains.merge_tables(common_def, make_overdef("swr_st", 0, 8, make_switchfunc("swr_cr")), def.rswitchst or {}))
- minetest.register_node(def.nodename_prefix.."_swr_st_45", advtrains.merge_tables(common_def, make_overdef("swr_st_45", 2, 10, make_switchfunc("swr_cr_45")), def.rswitchst45 or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr", advtrains.merge_tables(common_def, make_overdef("swr_cr", 0, 10, make_switchfunc("swr_st")), def.rswitchcr or {}))
- minetest.register_node(def.nodename_prefix.."_swr_cr_45", advtrains.merge_tables(common_def, make_overdef("swr_cr_45", 2, 12, make_switchfunc("swr_st_45")), def.rswitchcr45 or {}))
-
- minetest.register_node(def.nodename_prefix.."_vert1", advtrains.merge_tables(common_def, make_overdef("vert1", 0, 8), {
- mesh = "trackvertical1.b3d",
- rely1=0,
- rely2=0.5,
- railheight=0.25,
- description = def.description.." (vertical track lower node)",
- }, def.vert1 or {}))
- minetest.register_node(def.nodename_prefix.."_vert2", advtrains.merge_tables(common_def, make_overdef("vert2", 0, 8), {
- mesh = "trackvertical2.b3d",
- rely1=0.5,
- rely2=1,
- railheight=0.75,
- description = def.description.." (vertical track upper node)",
- },def.vert2 or {}))
- ]]
-
- advtrains.register_track_placer(def.nodename_prefix, def.texture_prefix, def.description)
table.insert(advtrains.all_tracktypes, tracktype)
end
-advtrains.register_tracks("regular", {
- nodename_prefix="advtrains:track",
- texture_prefix="advtrains_track",
- description="Regular Train Track",
-})
-
-advtrains.register_tracks_finer("fineturns", {
- nodename_prefix="advtrains:olddtrack",
- texture_prefix="advtrains_dtrack",
- description="Fine Turn Train Track",
-})
-
-advtrains.register_tracks_modeled("default", {
- nodename_prefix="advtrains:dtrack",
- texture_prefix="advtrains_dtrack",
- models_prefix="advtrains_dtrack",
- models_suffix=".b3d",
- shared_texture="advtrains_dtrack_rail.png",
- description="New Default Train Track",
-})
function advtrains.is_track_and_drives_on(nodename, drives_on)
if not minetest.registered_nodes[nodename] then
@@ -393,6 +247,76 @@ function advtrains.get_track_connections(name, param2) return (nodedef.connect1 + 4 * noderot)%16, (nodedef.connect2 + 4 * noderot)%16, nodedef.rely1 or 0, nodedef.rely2 or 0, nodedef.railheight or 0
end
+--END code, BEGIN definition
+--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
+}]]
+
+advtrains.register_tracks("regular", {
+ nodename_prefix="advtrains:track",
+ texture_prefix="advtrains_track",
+ shared_model="trackplane.b3d",
+ description="Regular Train Track",
+ formats={vst1={}, vst2={}},
+}, t_45deg)
+
+
+advtrains.register_tracks("default", {
+ nodename_prefix="advtrains:dtrack",
+ texture_prefix="advtrains_dtrack",
+ models_prefix="advtrains_dtrack",
+ models_suffix=".b3d",
+ shared_texture="advtrains_dtrack_rail.png",
+ description="New Default Train Track",
+ formats={vst1={true}, vst2={true}, swlcr={}, swlst={}, swrcr={}, swrst={}},
+}, t_30deg)
+
+--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
+
+minetest.register_abm({
+-- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_vert1"},
+ 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:dtrack_vst1", param2=(node.param2+2)%4}) end,
+})
+minetest.register_abm({
+-- In the following two fields, also group:groupname will work.
+ nodenames = {"advtrains:track_vert2"},
+ 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:dtrack_vst2", param2=(node.param2+2)%4}) end,
+})
+
+
|