From af6212170ed6d68c6210adfbc43982c304e7e15d Mon Sep 17 00:00:00 2001 From: orwell96 Date: Sun, 21 Aug 2016 16:30:36 +0200 Subject: Extending to 30deg rails, creating and adding the models --- models/advtrains_dtrack_cr.b3d | Bin 0 -> 27540 bytes models/advtrains_dtrack_cr_30.b3d | Bin 0 -> 27543 bytes models/advtrains_dtrack_cr_45.b3d | Bin 0 -> 23037 bytes models/advtrains_dtrack_cr_60.b3d | Bin 0 -> 23037 bytes models/advtrains_dtrack_st.b3d | Bin 0 -> 15828 bytes models/advtrains_dtrack_st_30.b3d | Bin 0 -> 31447 bytes models/advtrains_dtrack_st_45.b3d | Bin 0 -> 15831 bytes models/advtrains_dtrack_st_60.b3d | Bin 0 -> 31447 bytes models/gleis/rail_my.blend | Bin 0 -> 654772 bytes models/gleis/rail_my.blend1 | Bin 0 -> 674164 bytes models/gleis/rail_my_rt.blend | Bin 0 -> 847060 bytes models/gleis/rail_my_rt.blend1 | Bin 0 -> 767780 bytes models/gleis/rail_my_rt_final.blend | Bin 0 -> 843380 bytes models/gleis/rail_my_rt_final.blend1 | Bin 0 -> 843380 bytes textures/advtrains_dtrack_cr_22.png | Bin 317 -> 0 bytes textures/advtrains_dtrack_cr_30.png | Bin 0 -> 317 bytes textures/advtrains_dtrack_cr_60.png | Bin 0 -> 550 bytes textures/advtrains_dtrack_cr_67.png | Bin 550 -> 0 bytes textures/advtrains_dtrack_placer.png | Bin 0 -> 441 bytes textures/advtrains_dtrack_rail.png | Bin 0 -> 2616 bytes textures/advtrains_dtrack_st_22.png | Bin 406 -> 0 bytes textures/advtrains_dtrack_st_30.png | Bin 0 -> 406 bytes textures/advtrains_dtrack_st_60.png | Bin 0 -> 365 bytes textures/advtrains_dtrack_st_67.png | Bin 365 -> 0 bytes tracks.lua | 213 +++++++++++++----- tracks.lua~ | 377 ++++++++++++++++++++++++++++++++ wagons.lua | 2 +- wagons.lua~ | 406 +++++++++++++++++++++++++++++++++++ 28 files changed, 946 insertions(+), 52 deletions(-) create mode 100644 models/advtrains_dtrack_cr.b3d create mode 100644 models/advtrains_dtrack_cr_30.b3d create mode 100644 models/advtrains_dtrack_cr_45.b3d create mode 100644 models/advtrains_dtrack_cr_60.b3d create mode 100644 models/advtrains_dtrack_st.b3d create mode 100644 models/advtrains_dtrack_st_30.b3d create mode 100644 models/advtrains_dtrack_st_45.b3d create mode 100644 models/advtrains_dtrack_st_60.b3d create mode 100644 models/gleis/rail_my.blend create mode 100644 models/gleis/rail_my.blend1 create mode 100644 models/gleis/rail_my_rt.blend create mode 100644 models/gleis/rail_my_rt.blend1 create mode 100644 models/gleis/rail_my_rt_final.blend create mode 100644 models/gleis/rail_my_rt_final.blend1 delete mode 100644 textures/advtrains_dtrack_cr_22.png create mode 100644 textures/advtrains_dtrack_cr_30.png create mode 100644 textures/advtrains_dtrack_cr_60.png delete mode 100644 textures/advtrains_dtrack_cr_67.png create mode 100644 textures/advtrains_dtrack_placer.png create mode 100644 textures/advtrains_dtrack_rail.png delete mode 100644 textures/advtrains_dtrack_st_22.png create mode 100644 textures/advtrains_dtrack_st_30.png create mode 100644 textures/advtrains_dtrack_st_60.png delete mode 100644 textures/advtrains_dtrack_st_67.png create mode 100644 tracks.lua~ create mode 100644 wagons.lua~ diff --git a/models/advtrains_dtrack_cr.b3d b/models/advtrains_dtrack_cr.b3d new file mode 100644 index 0000000..e58a846 Binary files /dev/null and b/models/advtrains_dtrack_cr.b3d differ diff --git a/models/advtrains_dtrack_cr_30.b3d b/models/advtrains_dtrack_cr_30.b3d new file mode 100644 index 0000000..09cdb1f Binary files /dev/null and b/models/advtrains_dtrack_cr_30.b3d differ diff --git a/models/advtrains_dtrack_cr_45.b3d b/models/advtrains_dtrack_cr_45.b3d new file mode 100644 index 0000000..176da81 Binary files /dev/null and b/models/advtrains_dtrack_cr_45.b3d differ diff --git a/models/advtrains_dtrack_cr_60.b3d b/models/advtrains_dtrack_cr_60.b3d new file mode 100644 index 0000000..286c81e Binary files /dev/null and b/models/advtrains_dtrack_cr_60.b3d differ diff --git a/models/advtrains_dtrack_st.b3d b/models/advtrains_dtrack_st.b3d new file mode 100644 index 0000000..f3e2753 Binary files /dev/null and b/models/advtrains_dtrack_st.b3d differ diff --git a/models/advtrains_dtrack_st_30.b3d b/models/advtrains_dtrack_st_30.b3d new file mode 100644 index 0000000..7a35c8d Binary files /dev/null and b/models/advtrains_dtrack_st_30.b3d differ diff --git a/models/advtrains_dtrack_st_45.b3d b/models/advtrains_dtrack_st_45.b3d new file mode 100644 index 0000000..b2a1702 Binary files /dev/null and b/models/advtrains_dtrack_st_45.b3d differ diff --git a/models/advtrains_dtrack_st_60.b3d b/models/advtrains_dtrack_st_60.b3d new file mode 100644 index 0000000..0a59f77 Binary files /dev/null and b/models/advtrains_dtrack_st_60.b3d differ diff --git a/models/gleis/rail_my.blend b/models/gleis/rail_my.blend new file mode 100644 index 0000000..3c741bc Binary files /dev/null and b/models/gleis/rail_my.blend differ diff --git a/models/gleis/rail_my.blend1 b/models/gleis/rail_my.blend1 new file mode 100644 index 0000000..6322856 Binary files /dev/null and b/models/gleis/rail_my.blend1 differ diff --git a/models/gleis/rail_my_rt.blend b/models/gleis/rail_my_rt.blend new file mode 100644 index 0000000..8372a0c Binary files /dev/null and b/models/gleis/rail_my_rt.blend differ diff --git a/models/gleis/rail_my_rt.blend1 b/models/gleis/rail_my_rt.blend1 new file mode 100644 index 0000000..7d0978e Binary files /dev/null and b/models/gleis/rail_my_rt.blend1 differ diff --git a/models/gleis/rail_my_rt_final.blend b/models/gleis/rail_my_rt_final.blend new file mode 100644 index 0000000..12beed9 Binary files /dev/null and b/models/gleis/rail_my_rt_final.blend differ diff --git a/models/gleis/rail_my_rt_final.blend1 b/models/gleis/rail_my_rt_final.blend1 new file mode 100644 index 0000000..7372d51 Binary files /dev/null and b/models/gleis/rail_my_rt_final.blend1 differ diff --git a/textures/advtrains_dtrack_cr_22.png b/textures/advtrains_dtrack_cr_22.png deleted file mode 100644 index 510b4b6..0000000 Binary files a/textures/advtrains_dtrack_cr_22.png and /dev/null differ diff --git a/textures/advtrains_dtrack_cr_30.png b/textures/advtrains_dtrack_cr_30.png new file mode 100644 index 0000000..510b4b6 Binary files /dev/null and b/textures/advtrains_dtrack_cr_30.png differ diff --git a/textures/advtrains_dtrack_cr_60.png b/textures/advtrains_dtrack_cr_60.png new file mode 100644 index 0000000..14d05eb Binary files /dev/null and b/textures/advtrains_dtrack_cr_60.png differ diff --git a/textures/advtrains_dtrack_cr_67.png b/textures/advtrains_dtrack_cr_67.png deleted file mode 100644 index 14d05eb..0000000 Binary files a/textures/advtrains_dtrack_cr_67.png and /dev/null differ diff --git a/textures/advtrains_dtrack_placer.png b/textures/advtrains_dtrack_placer.png new file mode 100644 index 0000000..95e2460 Binary files /dev/null and b/textures/advtrains_dtrack_placer.png differ diff --git a/textures/advtrains_dtrack_rail.png b/textures/advtrains_dtrack_rail.png new file mode 100644 index 0000000..8478cf6 Binary files /dev/null and b/textures/advtrains_dtrack_rail.png differ diff --git a/textures/advtrains_dtrack_st_22.png b/textures/advtrains_dtrack_st_22.png deleted file mode 100644 index 1d52f22..0000000 Binary files a/textures/advtrains_dtrack_st_22.png and /dev/null differ diff --git a/textures/advtrains_dtrack_st_30.png b/textures/advtrains_dtrack_st_30.png new file mode 100644 index 0000000..1d52f22 Binary files /dev/null and b/textures/advtrains_dtrack_st_30.png differ diff --git a/textures/advtrains_dtrack_st_60.png b/textures/advtrains_dtrack_st_60.png new file mode 100644 index 0000000..f34180d Binary files /dev/null and b/textures/advtrains_dtrack_st_60.png differ diff --git a/textures/advtrains_dtrack_st_67.png b/textures/advtrains_dtrack_st_67.png deleted file mode 100644 index f34180d..0000000 Binary files a/textures/advtrains_dtrack_st_67.png and /dev/null differ diff --git a/tracks.lua b/tracks.lua index 80e5d39..6195b6e 100644 --- a/tracks.lua +++ b/tracks.lua @@ -124,66 +124,66 @@ 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) + 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 -end -local function make_overdef(img_suffix, conn1, conn2, switchfunc) - 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, - } -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) + local function make_overdef(img_suffix, conn1, conn2, switchfunc) + 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, + } + 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) + 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_22", advtrains.merge_tables(common_def, make_overdef("st_22", 1, 9), def.straight22 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_67", advtrains.merge_tables(common_def, make_overdef("st_67", 3, 11), def.straight67 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_22", advtrains.merge_tables(common_def, make_overdef("cr_22", 1, 8), def.curve45 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_67", advtrains.merge_tables(common_def, make_overdef("cr_67", 3, 10), 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 {})) --[[advtrains.trackplacer_register(def.nodename_prefix.."_st", 0, 8) advtrains.trackplacer_register(def.nodename_prefix.."_st_45", 2, 10) @@ -223,6 +223,108 @@ advtrains.reset_trackdb_position(pos) 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) + 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.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 {})) + + --[[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", @@ -230,11 +332,20 @@ advtrains.register_tracks("regular", { }) advtrains.register_tracks_finer("fineturns", { - nodename_prefix="advtrains:dtrack", + 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 return false diff --git a/tracks.lua~ b/tracks.lua~ new file mode 100644 index 0000000..879363a --- /dev/null +++ b/tracks.lua~ @@ -0,0 +1,377 @@ +--advtrains by orwell96, see readme.txt + +--[[TracksDefinition +nodename_prefix +texture_prefix +description +common={} +straight={} +straight45={} +curve={} +curve45={} +lswitchst={} +lswitchst45={} +rswitchst={} +rswitchst45={} +lswitchcr={} +lswitchcr45={} +rswitchcr={} +rswitchcr45={} +vert1={ + --you'll probably want to override mesh here +} +vert2={ + --you'll probably want to override mesh here +} +]]-- +advtrains.all_tracktypes={} + +function advtrains.register_tracks(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) + 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, + } + 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) + 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, + } + 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_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 {})) + + --[[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) + 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.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 {})) + + --[[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_finer("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 + return false + end + local nodedef=minetest.registered_nodes[nodename] + for k,v in ipairs(drives_on) do + if nodedef.groups["advtrains_track_"..v] then + return true + end + end + return false +end + +function advtrains.get_track_connections(name, param2) + local nodedef=minetest.registered_nodes[name] + if not nodedef then print("[advtrains] get_track_connections couldn't find nodedef for nodename "..(name or "nil")) return 0, 8, 0, 0, 0 end + local noderot=param2 + if not param2 then noderot=0 end + if noderot > 3 then print("[advtrains] get_track_connections: rail has invaild param2 of "..noderot) noderot=0 end + + return (nodedef.connect1 + 4 * noderot)%16, (nodedef.connect2 + 4 * noderot)%16, nodedef.rely1 or 0, nodedef.rely2 or 0, nodedef.railheight or 0 +end + + + + + + + diff --git a/wagons.lua b/wagons.lua index 2cb10d1..e6b6d71 100644 --- a/wagons.lua +++ b/wagons.lua @@ -347,7 +347,7 @@ function advtrains.register_wagon(sysname, traintype, prototype) end, }) end -advtrains.register_train_type("steam", {"regular", "fineturns"}) +advtrains.register_train_type("steam", {"regular", "fineturns", "default"}) --[[advtrains.register_wagon("blackwagon", "steam",{textures = {"black.png"}}) advtrains.register_wagon("bluewagon", "steam",{textures = {"blue.png"}}) diff --git a/wagons.lua~ b/wagons.lua~ new file mode 100644 index 0000000..c12d62d --- /dev/null +++ b/wagons.lua~ @@ -0,0 +1,406 @@ +--atan2 counts angles clockwise, minetest does counterclockwise +local print=function(t) minetest.log("action", t) minetest.chat_send_all(t) end + +local wagon={ + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + --physical = true, + visual = "mesh", + mesh = "wagon.b3d", + visual_size = {x=3, y=3}, + textures = {"black.png"}, + is_wagon=true, + wagon_span=1,--how many index units of space does this wagon consume + attach_offset={x=0, y=0, z=0}, + view_offset={x=0, y=0, z=0}, +} + + + +function wagon:on_rightclick(clicker) + print("[advtrains] wagon rightclick") + if not clicker or not clicker:is_player() then + return + end + if not self.initialized then + print("[advtrains] not initiaalized") + return + end + if clicker:get_player_control().sneak then + advtrains.split_train_at_wagon(self) + return + end + if clicker:get_player_control().aux1 then + --advtrains.dumppath(self:train().path) + --minetest.chat_send_all("at index "..(self:train().index or "nil")) + --advtrains.invert_train(self.train_id) + minetest.chat_send_all(dump(self:train())) + return + end + if self.driver and clicker == self.driver then + advtrains.player_to_wagon_mapping[self.driver:get_player_name()]=nil + advtrains.set_trainhud(self.driver:get_player_name(), "") + self.driver = nil + self.driver_name = nil + clicker:set_detach() + clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + elseif not self.driver then + self.driver = clicker + advtrains.player_to_wagon_mapping[clicker:get_player_name()]=self + clicker:set_attach(self.object, "", self.attach_offset, {x=0,y=0,z=0}) + clicker:set_eye_offset(self.view_offset, self.view_offset) + end +end + +function wagon:train() + return advtrains.trains[self.train_id] +end + +function wagon:on_activate(staticdata, dtime_s) + --print("[advtrains][wagon "..(self.unique_id or "no-id").."] activated") + self.object:set_armor_groups({immortal=1}) + if staticdata then + local tmp = minetest.deserialize(staticdata) + if tmp then + self.unique_id=tmp.unique_id + self.train_id=tmp.train_id + self.wagon_flipped=tmp.wagon_flipped + end + + end + self.old_pos = self.object:getpos() + self.old_velocity = self.velocity + self.initialized_pre=true + self.entity_name=self.name + + --same code is in on_step + --does this object already have an ID? + if not self.unique_id then + self.unique_id=os.time()..os.clock()--should be random enough. + else + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized and wagon.unique_id==self.unique_id then--i am a duplicate! + self.object:remove() + return + end + end + end + --is my train still here + if not self.train_id or not self:train() then + if self.initialized then + print("[advtrains][wagon "..self.unique_id.."] missing train_id, destroying") + self.object:remove() + return + end + print("[advtrains][wagon "..self.unique_id.."] missing train_id, but not yet initialized, returning") + return + elseif not self.initialized then + self.initialized=true + end + advtrains.update_trainpart_properties(self.train_id) +end + +function wagon:get_staticdata() + --save to table before being unloaded + advtrains.wagon_save[self.unique_id]=advtrains.merge_tables(self) + return minetest.serialize({ + unique_id=self.unique_id, + train_id=self.train_id, + wagon_flipped=self.wagon_flipped, + }) +end + +-- Remove the wagon +function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + if not puncher or not puncher:is_player() then + return + end + + self.object:remove() + if not self.initialized then return end + + local inv = puncher:get_inventory() + if minetest.setting_getbool("creative_mode") then + if not inv:contains_item("main", "advtrains:locomotive") then + inv:add_item("main", "advtrains:locomotive") + end + else + inv:add_item("main", "advtrains:locomotive") + end + + table.remove(self:train().trainparts, self.pos_in_trainparts) + advtrains.update_trainpart_properties(self.train_id) + advtrains.wagon_save[self.unique_id]=nil + if self.discouple then self.discouple.object:remove() end--will have no effect on unloaded objects + return + + +end + +function wagon:on_step(dtime) + local t=os.clock() + local pos = self.object:getpos() + if not self.initialized_pre then + print("[advtrains] wagon stepping while not yet initialized_pre, returning") + self.object:setvelocity({x=0,y=0,z=0}) + return + end + + self.entity_name=self.name + --does this object already have an ID? + if not self.unique_id then + self.unique_id=os.time()..os.clock()--should be random enough. + end + --is my train still here + if not self.train_id or not self:train() then + print("[advtrains][wagon "..self.unique_id.."] missing train_id, destroying") + self.object:remove() + return + elseif not self.initialized then + self.initialized=true + end + + --re-attach driver if he got lost + if not self.driver and self.driver_name then + local clicker=minetest.get_player_by_name(self.driver_name) + if clicker then + self.driver = clicker + advtrains.player_to_wagon_mapping[clicker:get_player_name()]=self + clicker:set_attach(self.object, "", self.attach_offset, {x=0,y=0,z=0}) + clicker:set_eye_offset(self.view_offset, self.view_offset) + end + end + + --driver control + if self.driver and self.is_locomotive then + if self.driver:get_player_control_bits()~=self.old_player_control_bits then + local pc=self.driver:get_player_control() + if pc.sneak then --stop + self:train().tarvelocity=0 + elseif (not self.wagon_flipped and pc.up) or (self.wagon_flipped and pc.down) then --faster + self:train().tarvelocity=math.min(self:train().tarvelocity+1, advtrains.all_traintypes[self:train().traintype].max_speed or 10) + elseif (not self.wagon_flipped and pc.down) or (self.wagon_flipped and pc.up) then --slower + self:train().tarvelocity=math.max(self:train().tarvelocity-1, -(advtrains.all_traintypes[self:train().traintype].max_speed or 10)) + elseif pc.aux1 then --slower + if true or math.abs(self:train().velocity)<=3 then--TODO debug + advtrains.player_to_wagon_mapping[self.driver:get_player_name()]=nil + self.driver:set_detach() + self.driver:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + advtrains.set_trainhud(self.driver:get_player_name(), "") + self.driver = nil + self.driver_name = nil + return--(don't let it crash because of statement below) + else + minetest.chat_send_player(self.driver:get_player_name(), "Can't get off driving train!") + end + end + self.old_player_control_bits=self.driver:get_player_control_bits() + end + advtrains.set_trainhud(self.driver:get_player_name(), advtrains.hud_train_format(self:train(), self.wagon_flipped)) + end + + local gp=self:train() + + --DisCouple + if self.pos_in_trainparts and self.pos_in_trainparts>1 then + if gp.velocity==0 then + if not self.discouple or not self.discouple.object:getyaw() then + local object=minetest.add_entity(pos, "advtrains:discouple") + if object then + local le=object:get_luaentity() + le.wagon=self + --box is hidden when attached, so unuseful. + --object:set_attach(self.object, "", {x=0, y=0, z=self.wagon_span*10}, {x=0, y=0, z=0}) + self.discouple=le + else + print("Couldn't spawn DisCouple") + end + end + else + if self.discouple and self.discouple.object:getyaw() then + self.discouple.object:remove() + end + end + end + --for path to be available. if not, skip step + if not advtrains.get_or_create_path(self.train_id, gp) then + self.object:setvelocity({x=0, y=0, z=0}) + return + end + + local index=advtrains.get_real_path_index(self:train(), self.pos_in_train) + --print("trainindex "..gp.index.." wagonindex "..index) + + --position recalculation + local first_pos=gp.path[math.floor(index)] + local second_pos=gp.path[math.floor(index)+1] + if not first_pos or not second_pos then + --print("[advtrains] object "..self.unique_id.." path end reached!") + self.object:setvelocity({x=0,y=0,z=0}) + return + end + + --checking for environment collisions(a 3x3 cube around the center) + if not gp.recently_collided_with_env then + local collides=false + for x=-1,1 do + for y=0,2 do + for z=-1,1 do + local node=minetest.get_node_or_nil(vector.add(first_pos, {x=x, y=y, z=z})) + if node and minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].walkable then + collides=true + end + end + end + end + if collides then + gp.recently_collided_with_env=true + gp.velocity=-0.5*gp.velocity + gp.tarvelocity=0 + end + end + + local velocity=gp.velocity/(gp.path_dist[math.floor(gp.index)] or 1) + local factor=index-math.floor(index) + local actual_pos={x=first_pos.x-(first_pos.x-second_pos.x)*factor, y=first_pos.y-(first_pos.y-second_pos.y)*factor, z=first_pos.z-(first_pos.z-second_pos.z)*factor,} + local velocityvec={x=(first_pos.x-second_pos.x)*velocity*-1, z=(first_pos.z-second_pos.z)*velocity*-1, y=(first_pos.y-second_pos.y)*velocity*-1} + + --some additional positions to determine orientation + local aposfwd=gp.path[math.floor(index+2)] + local aposbwd=gp.path[math.floor(index-1)] + + local yaw + if aposfwd and aposbwd then + yaw=advtrains.get_wagon_yaw(aposfwd, second_pos, first_pos, aposbwd, factor)+math.pi--TODO remove when cleaning up + else + yaw=math.atan2((first_pos.x-second_pos.x), (second_pos.z-first_pos.z)) + end + if self.wagon_flipped then + yaw=yaw+math.pi + end + + self.updatepct_timer=(self.updatepct_timer or 0)-dtime + if not self.old_velocity_vector or not vector.equals(velocityvec, self.old_velocity_vector) or self.old_yaw~=yaw or self.updatepct_timer<=0 then--only send update packet if something changed + self.object:setpos(actual_pos) + self.object:setvelocity(velocityvec) + self.object:setyaw(yaw) + self.updatepct_timer=2 + if self.update_animation then + self:update_animation(gp.velocity) + end + end + + self.old_velocity_vector=velocityvec + self.old_yaw=yaw + printbm("wagon step", t) +end + +function advtrains.get_real_path_index(train, pit) + local pos_in_train_left=pit + local index=train.index + if pos_in_train_left>(index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) then + pos_in_train_left=pos_in_train_left - (index-math.floor(index))*(train.path_dist[math.floor(index)] or 1) + index=math.floor(index) + while pos_in_train_left>(train.path_dist[index-1] or 1) do + pos_in_train_left=pos_in_train_left - (train.path_dist[index-1] or 1) + index=index-1 + end + index=index-(pos_in_train_left/(train.path_dist[index-1] or 1)) + else + index=index-(pos_in_train_left*(train.path_dist[math.floor(index-1)] or 1)) + end + return index +end + + +function advtrains.register_wagon(sysname, traintype, prototype) + setmetatable(prototype, {__index=wagon}) + minetest.register_entity("advtrains:"..sysname,prototype) + + minetest.register_craftitem("advtrains:"..sysname, { + description = sysname, + inventory_image = prototype.textures[1], + wield_image = prototype.textures[1], + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + local le=minetest.env:add_entity(pointed_thing.under, "advtrains:"..sysname):get_luaentity() + + local node=minetest.env:get_node_or_nil(pointed_thing.under) + if not node then print("[advtrains]Ignore at placer position") return itemstack end + local nodename=node.name + if(not advtrains.is_track_and_drives_on(nodename, advtrains.all_traintypes[traintype].drives_on)) then + print("[advtrains]no trck here, not placing.") + return itemstack + end + local conn1=advtrains.get_track_connections(node.name, node.param2) + local id=advtrains.create_new_train_at(pointed_thing.under, advtrains.dirCoordSet(pointed_thing.under, conn1), traintype) + advtrains.add_wagon_to_train(le, id) + print(dump(advtrains.trains)) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + + end, + }) +end +advtrains.register_train_type("steam", {"regular"}) + +--[[advtrains.register_wagon("blackwagon", "steam",{textures = {"black.png"}}) +advtrains.register_wagon("bluewagon", "steam",{textures = {"blue.png"}}) +advtrains.register_wagon("greenwagon", "steam",{textures = {"green.png"}}) +advtrains.register_wagon("redwagon", "steam",{textures = {"red.png"}}) +advtrains.register_wagon("yellowwagon", "steam",{textures = {"yellow.png"}}) +]] + +--[[ + wagons can define update_animation(self, velocity) if they have a speed-dependent animation + this function will be called when the velocity vector changes or every 2 seconds. +]] +advtrains.register_wagon("newlocomotive", "steam",{ + mesh="newlocomotive.b3d", + textures = {"advtrains_newlocomotive.png"}, + is_locomotive=true, + attach_offset={x=5, y=10, z=-10}, + view_offset={x=0, y=6, z=0}, + visual_size = {x=1, y=1}, + wagon_span=1.85, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, + update_animation=function(self, velocity) + if self.old_anim_velocity~=advtrains.abs_ceil(velocity) then + self.object:set_animation({x=1,y=60}, math.floor(velocity)) + self.old_anim_velocity=advtrains.abs_ceil(velocity) + end + end +}) +advtrains.register_wagon("wagon_default", "steam",{ + mesh="wagon.b3d", + textures = {"advtrains_wagon.png"}, + attach_offset={x=0, y=10, z=0}, + view_offset={x=0, y=6, z=0}, + visual_size = {x=1, y=1}, + wagon_span=1.8, + collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0}, +}) + +--[[ +advtrains.register_wagon("wagontype1",{on_rightclick=function(self, clicker) + if clicker:get_player_control().sneak then + advtrains.disconnect_train_before_wagon(self) + return + end + --just debugging. look for first active wagon and attach to it. + for _,v in pairs(minetest.luaentities) do + if v.is_wagon and v.unique_id and v.unique_id~=self.unique_id then + self.train_id=v.unique_id + end + end + if not self.train_id then minetest.chat_send_all("not found") return end + minetest.chat_send_all(self.train_id.." found and attached.") +end}) +]] + + -- cgit v1.2.3