diff --git a/cart_entity.lua b/cart_entity.lua index 8aeeb68..86543af 100644 --- a/cart_entity.lua +++ b/cart_entity.lua @@ -276,13 +276,22 @@ function cart_entity:on_step(dtime) acc = nil local acc_meta = minetest.get_meta(pos):get_string("cart_acceleration") - if acc_meta == "halt" and not self.punched then + if (acc_meta == "halt" or acc_meta:sub(1, 5) == "wait:") and not self.punched then -- Stop rail vel = {x=0, y=0, z=0} acc = false pos = vector.round(pos) update.pos = true update.vel = true + if acc_meta:sub(1, 5) == "wait:" then + local wait_time = tonumber(acc_meta:sub(6)) + if wait_time then + minetest.after(wait_time, function() + boost_cart:boost_rail(pos, 0.5) + minetest.get_meta(pos):set_string("cart_acceleration", acc_meta) + end) + end + end end if acc == nil then -- Meta speed modifier diff --git a/rails.lua b/rails.lua index 0fb1a33..2aae51e 100644 --- a/rails.lua +++ b/rails.lua @@ -147,3 +147,74 @@ minetest.register_craft({ output = "boost_cart:startstoprail 2", recipe = {"carts:powerrail", "carts:brakerail"}, }) + +boost_cart.player_formspecs = {} + +boost_cart:register_rail("boost_cart:waitrail", { + description = "Wait rail", + tiles = { + "carts_rail_straight_wt.png", "carts_rail_curved_wt.png", + "carts_rail_t_junction_wt.png", "carts_rail_crossing_wt.png" + }, + groups = boost_cart:get_rail_groups(), + after_place_node = function(pos, placer, itemstack) + if not mesecon then + local meta = minetest.get_meta(pos) + meta:set_string("cart_acceleration", "wait:5") + meta:set_string("cart_acceleration_backup", "wait:5") + meta:set_string("infotext", "Wait time: 5 seconds.") + + -- Show formspec to change the value. + local player_name = placer:get_player_name() + boost_cart.player_formspecs[player_name] = pos + minetest.show_formspec(player_name, "boost_cart:waitrail", "field[time;Wait time (in seconds):;5]") + end + end, + mesecons = { + effector = { + action_on = function(pos, node) + boost_cart:boost_rail(pos, 0.5) + end, + action_off = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("cart_acceleration", meta:get_string("cart_acceleration_backup")) + end, + }, + }, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local player_name = player:get_player_name() + + local pos = boost_cart.player_formspecs[player_name] + boost_cart.player_formspecs[player_name] = nil -- Clean up + + if not player_name or formname ~= "boost_cart:waitrail" then + return false + end + if fields.time then + local num = tonumber(fields.time) + if not num then + minetest.chat_send_player(player_name, "Value must be a number; defaulting to 5 seconds.") + return false + end + if num <= 0 then + minetest.chat_send_player(player_name, "Value must be greater than 0; defaulting to 5 seconds.") + return false + end + + local meta = minetest.get_meta(pos) + meta:set_string("cart_acceleration", "wait:" .. num) + meta:set_string("cart_acceleration_backup", "wait:" .. num) + meta:set_string("infotext", "Wait time: " .. num .. " seconds.") + minetest.chat_send_player(player_name, "Wait rail time set to " .. num .. " seconds.") + else + minetest.chat_send_player(player_name, "No value given; defaulting to 5 seconds.") + end +end) + +minetest.register_craft({ + type = "shapeless", + output = "boost_cart:waitrail 3", + recipe = {"carts:brakerail", "carts:powerrail", "carts:brakerail"}, +}) diff --git a/textures/carts_rail_crossing_wt.png b/textures/carts_rail_crossing_wt.png new file mode 100644 index 0000000..dd8ea74 Binary files /dev/null and b/textures/carts_rail_crossing_wt.png differ diff --git a/textures/carts_rail_curved_wt.png b/textures/carts_rail_curved_wt.png new file mode 100644 index 0000000..c48c4c5 Binary files /dev/null and b/textures/carts_rail_curved_wt.png differ diff --git a/textures/carts_rail_straight_wt.png b/textures/carts_rail_straight_wt.png new file mode 100644 index 0000000..3ce4c98 Binary files /dev/null and b/textures/carts_rail_straight_wt.png differ diff --git a/textures/carts_rail_t_junction_wt.png b/textures/carts_rail_t_junction_wt.png new file mode 100644 index 0000000..645d870 Binary files /dev/null and b/textures/carts_rail_t_junction_wt.png differ