Basic powered rails implementation

This commit is contained in:
Wuzzy 2017-08-28 16:59:10 +02:00
parent 213edbe85c
commit 36319afbbe
16 changed files with 78 additions and 37 deletions

View file

@ -138,13 +138,3 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype)
return {x=0, y=0, z=0} return {x=0, y=0, z=0}
end end
function mcl_minecarts:boost_rail(pos, amount)
minetest.get_meta(pos):set_string("cart_acceleration", tostring(amount))
for _,obj_ in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do
if not obj_:is_player() and
obj_:get_luaentity() and
obj_:get_luaentity().name == "mcl_minecarts:minecart" then
obj_:get_luaentity():on_punch()
end
end
end

View file

@ -31,6 +31,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick)
_start_pos = nil, -- Used to calculate distance for “On A Rail” achievement _start_pos = nil, -- Used to calculate distance for “On A Rail” achievement
_old_dir = {x=0, y=0, z=0}, _old_dir = {x=0, y=0, z=0},
_old_pos = nil, _old_pos = nil,
_old_vel = {x=0, y=0, z=0},
_old_switch = 0, _old_switch = 0,
_railtype = nil, _railtype = nil,
} }
@ -128,6 +129,18 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick)
ctrl = player:get_player_control() ctrl = player:get_player_control()
end end
end end
-- Stop cart if velocity vector flips
if self._old_vel and self._old_vel.y == 0 and
(self._old_vel.x * vel.x < 0 or self._old_vel.z * vel.z < 0) then
self._old_vel = {x = 0, y = 0, z = 0}
self._old_pos = pos
self.object:setvelocity(vector.new())
self.object:setacceleration(vector.new())
return
end
self._old_vel = vector.new(vel)
if self._old_pos then if self._old_pos then
local diff = vector.subtract(self._old_pos, pos) local diff = vector.subtract(self._old_pos, pos)
for _,v in ipairs({"x","y","z"}) do for _,v in ipairs({"x","y","z"}) do
@ -187,17 +200,9 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick)
-- Slow down or speed up -- Slow down or speed up
local acc = dir.y * -1.8 local acc = dir.y * -1.8
local speed_mod = tonumber(minetest.get_meta(pos):get_string("cart_acceleration")) local speed_mod = minetest.registered_nodes[minetest.get_node(pos).name]._rail_acceleration
if speed_mod and speed_mod ~= 0 then if speed_mod and speed_mod ~= 0 then
if speed_mod > 0 then acc = acc + speed_mod
for _,v in ipairs({"x","y","z"}) do
if math.abs(vel[v]) >= max_vel then
speed_mod = 0
break
end
end
end
acc = acc + (speed_mod * 8)
else else
acc = acc - 0.4 acc = acc - 0.4
end end
@ -214,6 +219,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick)
for _,v in ipairs({"x","y","z"}) do for _,v in ipairs({"x","y","z"}) do
if math.abs(vel[v]) > max_vel then if math.abs(vel[v]) > max_vel then
vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel
new_acc[v] = 0
update.vel = true update.vel = true
end end
end end

View file

@ -33,11 +33,26 @@ minetest.register_craft({
} }
}) })
-- Rail to speed up -- Function that get the input/output rules of the powered rails
minetest.register_node("mcl_minecarts:golden_rail", { local get_input_rules = function()
return {
{x = -1, y = 0, z = 0},
{x = 1, y = 0, z = 0},
{x = 0, y = 0, z = -1},
{x = 0, y = 0, z = 1},
}
end
local get_output_rules = function()
return {}
end
-- Powered rail
local powered_rail_template = {
description = "Powered Rail", description = "Powered Rail",
_doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Powered rails will accelerate moving minecarts, up to a maximum speed.", _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.",
_doc_items_usagehelp = railuse, _doc_items_usagehelp = railuse .. "\n" .. "Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.",
drawtype = "raillike", drawtype = "raillike",
tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"},
inventory_image = "carts_rail_pwr.png", inventory_image = "carts_rail_pwr.png",
@ -47,31 +62,61 @@ minetest.register_node("mcl_minecarts:golden_rail", {
walkable = false, walkable = false,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
-- but how to specify the dimensions for curved and sideways rails?
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 = {handy=1,pickaxey=1, attached_node = 1, rail = 1, connect_to_raillike = 1, dig_by_water = 1,destroy_by_lava_flow=1, transport = 1}, groups = {handy=1,pickaxey=1, attached_node = 1, rail = 1, connect_to_raillike = 1, dig_by_water = 1,destroy_by_lava_flow=1, transport = 1},
after_place_node = function(pos, placer, itemstack)
if not mesecon then
minetest.get_meta(pos):set_string("cart_acceleration", "0.5")
end
end,
sounds = mcl_sounds.node_sound_metal_defaults(), sounds = mcl_sounds.node_sound_metal_defaults(),
mesecons = { mesecons = {
effector = { effector = {
action_on = function(pos, node) action_on = function(pos, node)
mcl_minecarts:boost_rail(pos, 0.5) minetest.swap_node(pos, {name = "mcl_minecarts:golden_rail_on", param2 = node.param2 })
mesecon:receptor_on(pos, get_input_rules())
end, end,
},
receptor = {
state = mesecon.state.off,
rules = get_output_rules,
},
},
action_off = function(pos, node) _rail_acceleration = -3,
minetest.get_meta(pos):set_string("cart_acceleration", "0")
end,
},
},
_mcl_blast_resistance = 3.5, _mcl_blast_resistance = 3.5,
_mcl_hardness = 0.7, _mcl_hardness = 0.7,
}) }
minetest.register_node("mcl_minecarts:golden_rail", powered_rail_template)
-- Powered rail (activated by redstone)
local powered_rail_on = table.copy(powered_rail_template)
powered_rail_on.description = nil
powered_rail_on._doc_items_create_entry = false
powered_rail_on._doc_items_longdesc = nil
powered_rail_on._doc_items_usagehelp = nil
powered_rail_on.tiles = {"mcl_minecarts_rail_golden_powered.png", "mcl_minecarts_rail_golden_curved_powered.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"}
powered_rail_on.inventory_image = "mcl_minecarts_rail_golden_powered.png"
powered_rail_on.wield_image = "mcl_minecarts_rail_golden_powered.png"
powered_rail_on.groups.not_in_creative_inventory = 1
powered_rail_on.groups.transport = nil
powered_rail_on.mesecons = {
effector = {
action_off = function(pos, node)
minetest.swap_node(pos, {name = "mcl_minecarts:golden_rail", param2 = node.param2 })
mesecon:receptor_off(pos, get_input_rules())
end,
},
receptor = {
state = mesecon.state.on,
rules = get_output_rules,
}
}
powered_rail_on._rail_acceleration = 4
minetest.register_node("mcl_minecarts:golden_rail_on", powered_rail_on)
if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", "mcl_minecarts:golden_rail", "nodes", "mcl_minecarts:golden_rail_on")
end
minetest.register_craft({ minetest.register_craft({
output = "mcl_minecarts:golden_rail 6", output = "mcl_minecarts:golden_rail 6",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 562 B

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 596 B

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 B

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 B