From 28e7bab590448b17194f6923052595b56afcc4a9 Mon Sep 17 00:00:00 2001 From: cheapie Date: Wed, 1 Apr 2020 21:19:46 -0500 Subject: Add digilines rail --- README | 12 ++ init.lua | 198 +++++++++++++++++++++++++++++ mod.conf | 1 + textures/mesecons_carts_digi_crossing.png | Bin 0 -> 2681 bytes textures/mesecons_carts_digi_curve.png | Bin 0 -> 2503 bytes textures/mesecons_carts_digi_straight.png | Bin 0 -> 2652 bytes textures/mesecons_carts_digi_tjunction.png | Bin 0 -> 2683 bytes 7 files changed, 211 insertions(+) create mode 100644 textures/mesecons_carts_digi_crossing.png create mode 100644 textures/mesecons_carts_digi_curve.png create mode 100644 textures/mesecons_carts_digi_straight.png create mode 100644 textures/mesecons_carts_digi_tjunction.png diff --git a/README b/README index e2751ab..6b26c43 100644 --- a/README +++ b/README @@ -27,3 +27,15 @@ This mod adds several types of rails for use with the existing carts from minete -- When not powered, causes any carts passing over it to come to an immediate stop. -- When powered via mesecons while the cart is still stopped on it, causes the cart to resume moving with its previous speed. -- If left powered, acts as a normal rail. + +* Digilines Controlled Rail (available only if digilines is installed) +-- Sends a table on its set channel when passed over by a cart, including the following elements: +---- pos: Exact position of the cart +---- velocity: X and Z velocity of the cart +---- driver: Name of the player inside the cart (nil if none) +-- Responds to the following commands on its set channel: +---- "grab": Stops a cart traveling over the rail, same as the start-stop rail. Only does anything if a cart is present when the command is issued. +---- "release": Restarts a cart stopped via the "grab" command, causing it to resume moving with its previous speed. +---- "power1" through "power15": Causes the rail to act as a powered rail. The power of a normal powered rail is 5. +---- "brake1" through "brake15": Causes the rail to act as a brake rail. The power of a normal brake rail is 5. +---- "idle" (also "power0" or "brake0"): Causes the rail to act as a normal rail, applying no power or braking force. diff --git a/init.lua b/init.lua index 8e2549e..336b50f 100644 --- a/init.lua +++ b/init.lua @@ -360,3 +360,201 @@ minetest.register_craft({ {"carts:rail","default:sand","",}, }, }) + +if minetest.get_modpath("digilines") then + local digilines_rules = { + {x = 1,y = 0,z = 0,}, + {x = -1,y = 0,z = 0,}, + {x = 0,y = 0,z = 1,}, + {x = 0,y = 0,z = -1,}, + {x = 1,y = -1,z = 0,}, + {x = -1,y = -1,z = 0,}, + {x = 0,y = -1,z = 1,}, + {x = 0,y = -1,z = -1,}, + {x = 1,y = 1,z = 0,}, + {x = -1,y = 1,z = 0,}, + {x = 0,y = 1,z = 1,}, + {x = 0,y = 1,z = -1,}, + {x = 0,y = -1,z = 0,}, + {x = 0,y = 1,z = 0,}, + } + + local function digilinesrail_onstep(cart,dtime) + local cartpos = cart.object:get_pos() + local trackpos = {} + trackpos.x = math.floor(cartpos.x + 0.5) + trackpos.y = math.floor(cartpos.y + 0.5) + trackpos.z = math.floor(cartpos.z + 0.5) + local track = minetest.get_node(trackpos) + if not string.find(track.name,"mesecons_carts:digilines_rail") then return end + local trackmeta = minetest.get_meta(trackpos) + local response = {} + local velocity = cart.object:get_velocity() + response.pos = {x = cartpos.x,y = cartpos.y,z = cartpos.z,} + response.velocity = {x = velocity.x,z = velocity.z,} + response.driver = cart.driver + digiline:receptor_send(trackpos,digilines_rules,trackmeta:get_string("channel"),response) + end + + local function digilinesrail_handle_digilines(pos,node,channel,msg) + local trackmeta = minetest.get_meta(pos) + if channel ~= trackmeta:get_string("channel") then return end + if msg == "grab" then + local possible_carts = minetest.get_objects_inside_radius(pos,1) + for _,object in pairs(possible_carts) do + local cart = object:get_luaentity() + if cart and cart.name == "carts:cart" then + local velocity = cart.object:get_velocity() + trackmeta:set_string("velocity",minetest.serialize(velocity)) + cart.object:set_velocity(vector.new(0,0,0)) + cart.object:set_pos(pos) + end + end + elseif msg == "release" then + local velocity = trackmeta:get_string("velocity") + if velocity then velocity = minetest.deserialize(velocity) end + if not velocity then return end + local possible_carts = minetest.get_objects_inside_radius(pos,1) + for _,object in pairs(possible_carts) do + local cart = object:get_luaentity() + if cart and cart.name == "carts:cart" then + cart.object:set_velocity(velocity) + end + end + elseif msg == "idle" or msg == "power0" or msg == "brake0" then + minetest.swap_node(pos,{name = "mesecons_carts:digilines_rail_idle",}) + elseif type(msg) == "string" then + if string.sub(msg,1,5) == "power" then + local strength = string.sub(msg,6,-1) + if strength then strength = tonumber(strength) end + if not strength then return end + strength = math.min(15,math.max(1,math.floor(strength))) + local newnode = "mesecons_carts:digilines_rail_pwr_"..strength + minetest.swap_node(pos,{name = newnode,}) + elseif string.sub(msg,1,5) == "brake" then + local strength = string.sub(msg,6,-1) + if strength then strength = tonumber(strength) end + if not strength then return end + strength = math.min(15,math.max(1,math.floor(strength))) + local newnode = "mesecons_carts:digilines_rail_brk_"..strength + minetest.swap_node(pos,{name = newnode,}) + end + end + end + + carts:register_rail("mesecons_carts:digilines_rail_idle", { + description = "Digilines-Controlled Rail", + tiles = { + "mesecons_carts_digi_straight.png", + "mesecons_carts_digi_curve.png", + "mesecons_carts_digi_tjunction.png", + "mesecons_carts_digi_crossing.png", + }, + after_place_node = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec","field[channel;Channel;${channel}") + meta:set_string("channel","") + meta:set_string("velocity",minetest.serialize(vector.new(0,0,0))) + end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then return end + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then + minetest.record_protection_violation(pos,name) + return + end + minetest.get_meta(pos):set_string("channel",fields.channel) + end, + digiline = { + wire = { + rules = digilines_rules, + }, + receptor = {}, + effector = { + action = digilinesrail_handle_digilines, + }, + }, + groups = carts:get_rail_groups(), + }, {on_step = digilinesrail_onstep,}) + + for i=1,15,1 do + carts:register_rail("mesecons_carts:digilines_rail_pwr_"..i, { + description = string.format("Digilines-Controlled Rail (powered, strength %d - you hacker you!)",i), + tiles = { + "mesecons_carts_digi_straight.png", + "mesecons_carts_digi_curve.png", + "mesecons_carts_digi_tjunction.png", + "mesecons_carts_digi_crossing.png", + }, + drop = "mesecons_carts:digilines_rail_idle", + after_place_node = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec","field[channel;Channel;${channel}") + meta:set_string("channel","") + meta:set_string("velocity",minetest.serialize(vector.new(0,0,0))) + end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then return end + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then + minetest.record_protection_violation(pos,name) + return + end + minetest.get_meta(pos):set_string("channel",fields.channel) + end, + digiline = { + wire = { + rules = digilines_rules, + }, + receptor = {}, + effector = { + action = digilinesrail_handle_digilines, + }, + }, + groups = carts:get_rail_groups({not_in_creative_inventory = 1,}), + }, {on_step = digilinesrail_onstep,acceleration = i,}) + carts:register_rail("mesecons_carts:digilines_rail_brk_"..i, { + description = string.format("Digilines-Controlled Rail (brake, strength %d - you hacker you!)",i), + tiles = { + "mesecons_carts_digi_straight.png", + "mesecons_carts_digi_curve.png", + "mesecons_carts_digi_tjunction.png", + "mesecons_carts_digi_crossing.png", + }, + drop = "mesecons_carts:digilines_rail_idle", + after_place_node = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec","field[channel;Channel;${channel}") + meta:set_string("channel","") + meta:set_string("velocity",minetest.serialize(vector.new(0,0,0))) + end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then return end + local name = sender:get_player_name() + if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then + minetest.record_protection_violation(pos,name) + return + end + minetest.get_meta(pos):set_string("channel",fields.channel) + end, + digiline = { + wire = { + rules = digilines_rules, + }, + receptor = {}, + effector = { + action = digilinesrail_handle_digilines, + }, + }, + groups = carts:get_rail_groups({not_in_creative_inventory = 1,}), + }, {on_step = digilinesrail_onstep,acceleration = i*-1,}) + end + minetest.register_craft({ + output = "mesecons_carts:digilines_rail_idle 3", + recipe = { + {"carts:rail","basic_materials:motor","",}, + {"carts:rail","mesecons_luacontroller:luacontroller0000","digilines:wire_std_00000000",}, + {"carts:rail","default:sand","",}, + }, + }) +end diff --git a/mod.conf b/mod.conf index 0a5e017..61c3400 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,4 @@ name = mesecons_carts description = Mesecons Carts Integration depends = carts,mesecons +optional_depends = digilines diff --git a/textures/mesecons_carts_digi_crossing.png b/textures/mesecons_carts_digi_crossing.png new file mode 100644 index 0000000..6ccf5ee Binary files /dev/null and b/textures/mesecons_carts_digi_crossing.png differ diff --git a/textures/mesecons_carts_digi_curve.png b/textures/mesecons_carts_digi_curve.png new file mode 100644 index 0000000..499750f Binary files /dev/null and b/textures/mesecons_carts_digi_curve.png differ diff --git a/textures/mesecons_carts_digi_straight.png b/textures/mesecons_carts_digi_straight.png new file mode 100644 index 0000000..255b942 Binary files /dev/null and b/textures/mesecons_carts_digi_straight.png differ diff --git a/textures/mesecons_carts_digi_tjunction.png b/textures/mesecons_carts_digi_tjunction.png new file mode 100644 index 0000000..69fb8d6 Binary files /dev/null and b/textures/mesecons_carts_digi_tjunction.png differ -- cgit v1.2.3