Break too long lines and simplify the code

- Add boost_cart:get_rail_groups to get the default rail groups
- Remove duplicated code
- Do not boost the cart backwards when the brake rail gets activated
- Attempt to fix the cart swing problem
- Trim tailings and tidy up code
- TODO: Document all the stuff
This commit is contained in:
SmallJoker 2016-07-22 11:06:28 +02:00
parent d166b7ea68
commit eb6a833b66
4 changed files with 79 additions and 45 deletions

View File

@ -15,7 +15,7 @@ function boost_cart:signal_detector_rail(pos)
if minetest.get_item_group(node.name, "detector_rail") ~= 1 then if minetest.get_item_group(node.name, "detector_rail") ~= 1 then
return return
end end
--minetest.log("action", "Signaling detector at " .. minetest.pos_to_string(pos))
if node.name == "boost_cart:detectorrail" then if node.name == "boost_cart:detectorrail" then
minetest.swap_node(pos, {name = "boost_cart:detectorrail_on", param2=node.param2}) minetest.swap_node(pos, {name = "boost_cart:detectorrail_on", param2=node.param2})
end end
@ -25,19 +25,27 @@ end
boost_cart:register_rail("boost_cart:detectorrail", { boost_cart:register_rail("boost_cart:detectorrail", {
description = "Detector rail", description = "Detector rail",
tiles = {"carts_rail_dtc.png", "carts_rail_curved_dtc.png", "carts_rail_t_junction_dtc.png", "carts_rail_crossing_dtc.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1, detector_rail = 1}, "carts_rail_dtc.png", "carts_rail_curved_dtc.png",
"carts_rail_t_junction_dtc.png", "carts_rail_crossing_dtc.png"
},
groups = boost_cart:get_rail_groups({detector_rail = 1}),
mesecons = {receptor = {state = "off", rules = mesecons_rules }}, mesecons = {receptor = {state = "off", rules = mesecons_rules}},
}) })
boost_cart:register_rail("boost_cart:detectorrail_on", { boost_cart:register_rail("boost_cart:detectorrail_on", {
description = "Detector rail ON (you hacker you)", description = "Detector rail ON (you hacker you)",
tiles = {"carts_rail_dtc_on.png", "carts_rail_curved_dtc_on.png", "carts_rail_t_junction_dtc_on.png", "carts_rail_crossing_dtc_on.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1, detector_rail = 1, not_in_creative_inventory = 1}, "carts_rail_dtc_on.png", "carts_rail_curved_dtc_on.png",
"carts_rail_t_junction_dtc_on.png", "carts_rail_crossing_dtc_on.png"
},
groups = boost_cart:get_rail_groups({
detector_rail = 1, not_in_creative_inventory = 1
}),
drop = "boost_cart:detectorrail", drop = "boost_cart:detectorrail",
mesecons = {receptor = {state = "on", rules = mesecons_rules }}, mesecons = {receptor = {state = "on", rules = mesecons_rules}},
}) })
minetest.register_craft({ minetest.register_craft({

View File

@ -213,3 +213,14 @@ function boost_cart:register_rail(name, def)
minetest.register_node(name, def) minetest.register_node(name, def)
end end
function boost_cart:get_rail_groups(additional_groups)
-- Get the default rail groups and add more when a table is given
local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}
if type(additional_groups) == "table" then
for k, v in pairs(additional_groups) do
groups[k] = v
end
end
return groups
end

View File

@ -194,7 +194,9 @@ function boost_cart.cart:on_step(dtime)
if self.old_pos then if self.old_pos then
-- Detection for "skipping" nodes -- Detection for "skipping" nodes
local expected_pos = vector.add(self.old_pos, self.old_dir) local expected_pos = vector.add(self.old_pos, self.old_dir)
local found_path = boost_cart:pathfinder(pos, expected_pos, self.old_dir, ctrl, self.old_switch, self.railtype) local found_path = boost_cart:pathfinder(
pos, expected_pos, self.old_dir, ctrl, self.old_switch, self.railtype
)
if not found_path then if not found_path then
-- No rail found: reset back to the expected position -- No rail found: reset back to the expected position
@ -203,20 +205,12 @@ function boost_cart.cart:on_step(dtime)
end end
end end
if vel.y == 0 then
-- Stop cart completely (do not swing)
for _,v in ipairs({"x", "z"}) do
if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then
vel[v] = 0
update.vel = true
end
end
end
local cart_dir = boost_cart:velocity_to_dir(vel) local cart_dir = boost_cart:velocity_to_dir(vel)
local max_vel = boost_cart.speed_max local max_vel = boost_cart.speed_max
if not dir then if not dir then
dir, last_switch = boost_cart:get_rail_direction(pos, cart_dir, ctrl, self.old_switch, self.railtype) dir, last_switch = boost_cart:get_rail_direction(
pos, cart_dir, ctrl, self.old_switch, self.railtype
)
end end
local new_acc = {x=0, y=0, z=0} local new_acc = {x=0, y=0, z=0}
@ -253,30 +247,35 @@ function boost_cart.cart:on_step(dtime)
local speed_mod = tonumber(speed_mod_string) local speed_mod = tonumber(speed_mod_string)
if speed_mod_string == "halt" then if speed_mod_string == "halt" then
vel = {x=0, y=0, z=0} vel = {x=0, y=0, z=0}
acc = {x=0, y=0, z=0} acc = 0
dir = {x=0, y=0, z=0}
pos = vector.round(pos) pos = vector.round(pos)
update.pos = true update.pos = true
update.vel = true update.vel = true
elseif speed_mod and speed_mod ~= 0 then elseif speed_mod and speed_mod ~= 0 then
if speed_mod > 0 then
for _,v in ipairs({"x","y","z"}) do
if math.abs(vel[v]) >= max_vel then
speed_mod = 0
break
end
end
end
-- Try to make it similar to the original carts mod -- Try to make it similar to the original carts mod
acc = acc + (speed_mod * 10) acc = acc + (speed_mod * 10)
else else
acc = acc - 0.4 acc = acc - 0.4
-- Handbrake -- Handbrake
if ctrl and ctrl.down and math.abs(vel.x + vel.z) > 1.2 then if ctrl and ctrl.down then
acc = acc - 1.2 acc = acc - 1.2
end end
end end
if self.old_dir.y == 0 and not self.punched then
-- Stop the cart swing between two rail parts (handbrake)
if vector.equals(vector.multiply(self.old_dir, -1), dir) then
vel = {x=0, y=0, z=0}
acc = 0
if self.old_pos then
pos = vector.new(self.old_pos)
update.pos = true
end
dir = vector.new(self.old_dir)
update.vel = true
end
end
new_acc = vector.multiply(dir, acc) new_acc = vector.multiply(dir, acc)
end end
@ -292,7 +291,7 @@ function boost_cart.cart:on_step(dtime)
update.vel = true update.vel = true
end end
end end
self.object:setacceleration(new_acc) self.object:setacceleration(new_acc)
self.old_pos = vector.new(pos) self.old_pos = vector.new(pos)
if not vector.equals(dir, {x=0, y=0, z=0}) then if not vector.equals(dir, {x=0, y=0, z=0}) then
@ -308,6 +307,7 @@ function boost_cart.cart:on_step(dtime)
obj_:get_luaentity() and obj_:get_luaentity() and
not obj_:get_luaentity().physical_state and not obj_:get_luaentity().physical_state and
obj_:get_luaentity().name == "__builtin:item" then obj_:get_luaentity().name == "__builtin:item" then
obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0})
self.attached_items[#self.attached_items + 1] = obj_ self.attached_items[#self.attached_items + 1] = obj_
end end

View File

@ -1,7 +1,10 @@
minetest.register_node(":default:rail", { minetest.register_node(":default:rail", {
description = "Rail", description = "Rail",
drawtype = "raillike", drawtype = "raillike",
tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, tiles = {
"default_rail.png", "default_rail_curved.png",
"default_rail_t_junction.png", "default_rail_crossing.png"
},
inventory_image = "default_rail.png", inventory_image = "default_rail.png",
wield_image = "default_rail.png", wield_image = "default_rail.png",
paramtype = "light", paramtype = "light",
@ -12,7 +15,7 @@ minetest.register_node(":default:rail", {
type = "fixed", type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
}, },
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}, groups = boost_cart:get_rail_groups(),
}) })
if minetest.get_modpath("moreores") then if minetest.get_modpath("moreores") then
@ -21,8 +24,11 @@ if minetest.get_modpath("moreores") then
else else
boost_cart:register_rail(":carts:copperrail", { boost_cart:register_rail(":carts:copperrail", {
description = "Copper rail", description = "Copper rail",
tiles = {"carts_rail_cp.png", "carts_rail_curved_cp.png", "carts_rail_t_junction_cp.png", "carts_rail_crossing_cp.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}, "carts_rail_cp.png", "carts_rail_curved_cp.png",
"carts_rail_t_junction_cp.png", "carts_rail_crossing_cp.png"
},
groups = boost_cart:get_rail_groups(),
}) })
minetest.register_craft({ minetest.register_craft({
@ -39,9 +45,12 @@ end
boost_cart:register_rail(":carts:powerrail", { boost_cart:register_rail(":carts:powerrail", {
description = "Powered rail", description = "Powered rail",
tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}, "carts_rail_pwr.png", "carts_rail_curved_pwr.png",
"carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"
},
groups = boost_cart:get_rail_groups(),
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
if not mesecon then if not mesecon then
minetest.get_meta(pos):set_string("cart_acceleration", "0.5") minetest.get_meta(pos):set_string("cart_acceleration", "0.5")
@ -72,19 +81,22 @@ minetest.register_craft({
boost_cart:register_rail(":carts:brakerail", { boost_cart:register_rail(":carts:brakerail", {
description = "Brake rail", description = "Brake rail",
tiles = {"carts_rail_brk.png", "carts_rail_curved_brk.png", "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}, "carts_rail_brk.png", "carts_rail_curved_brk.png",
"carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"
},
groups = boost_cart:get_rail_groups(),
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
if not mesecon then if not mesecon then
minetest.get_meta(pos):set_string("cart_acceleration", "-0.2") minetest.get_meta(pos):set_string("cart_acceleration", "-0.3")
end end
end, end,
mesecons = { mesecons = {
effector = { effector = {
action_on = function(pos, node) action_on = function(pos, node)
boost_cart:boost_rail(pos, -0.2) minetest.get_meta(pos):set_string("cart_acceleration", "-0.3")
end, end,
action_off = function(pos, node) action_off = function(pos, node)
@ -103,10 +115,13 @@ minetest.register_craft({
} }
}) })
boost_cart:register_rail(":boost_cart:startstoprail", { boost_cart:register_rail("boost_cart:startstoprail", {
description = "Start-stop rail", description = "Start-stop rail",
tiles = {"carts_rail_ss.png", "carts_rail_curved_ss.png", "carts_rail_t_junction_ss.png", "carts_rail_crossing_ss.png"}, tiles = {
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1}, "carts_rail_ss.png", "carts_rail_curved_ss.png",
"carts_rail_t_junction_ss.png", "carts_rail_crossing_ss.png"
},
groups = boost_cart:get_rail_groups(),
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
if not mesecon then if not mesecon then