Using carts:cart, add copper/brk/pwr rails
@ -1 +1,2 @@
|
|||||||
default
|
default
|
||||||
|
mesecons?
|
62
init.lua
@ -1,12 +1,10 @@
|
|||||||
-- TODO:
|
-- TODO:
|
||||||
-- Fix way-up
|
|
||||||
-- Add rail-cross switching
|
-- Add rail-cross switching
|
||||||
-- Prevent from floating carts
|
-- Prevent from floating carts
|
||||||
-- Speed up and brake rails
|
|
||||||
|
|
||||||
boost_cart = {}
|
boost_cart = {}
|
||||||
boost_cart.modpath = minetest.get_modpath("boost_cart")
|
boost_cart.modpath = minetest.get_modpath("boost_cart")
|
||||||
boost_cart.speed_max = 20
|
boost_cart.speed_max = 10
|
||||||
|
|
||||||
function vector.floor(v)
|
function vector.floor(v)
|
||||||
return {
|
return {
|
||||||
@ -65,16 +63,16 @@ function boost_cart.cart:on_punch(puncher, time_from_last_punch, tool_capabiliti
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
puncher:get_inventory():add_item("main", "boost_cart:cart")
|
puncher:get_inventory():add_item("main", "carts:cart")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local vel = self.velocity
|
local vel = self.velocity
|
||||||
--[[if puncher:get_player_name() == self.driver then
|
if puncher:get_player_name() == self.driver then
|
||||||
if math.abs(vel.x) + math.abs(vel.z) > 6 then
|
if math.abs(vel.x) + math.abs(vel.z) > 6 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end]]
|
end
|
||||||
|
|
||||||
local cart_dir = boost_cart:velocity_to_dir(direction)
|
local cart_dir = boost_cart:velocity_to_dir(direction)
|
||||||
if cart_dir.x == 0 and cart_dir.z == 0 then
|
if cart_dir.x == 0 and cart_dir.z == 0 then
|
||||||
@ -120,29 +118,24 @@ function boost_cart.cart:on_step(dtime)
|
|||||||
if vector.equals(flo_pos, flo_old) then
|
if vector.equals(flo_pos, flo_old) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local expected_pos = vector.add(self.old_pos, self.old_dir)
|
local diff = vector.subtract(self.old_pos, pos)
|
||||||
local diff = vector.subtract(expected_pos, pos)
|
|
||||||
diff = {
|
|
||||||
x = math.abs(diff.x),
|
|
||||||
y = math.abs(diff.y),
|
|
||||||
z = math.abs(diff.z)
|
|
||||||
}
|
|
||||||
|
|
||||||
if diff.x > math.abs(self.old_dir.x) or
|
for _,v in ipairs({"x","y","z"}) do
|
||||||
diff.y > math.abs(self.old_dir.y) or
|
if math.abs(diff[v]) > 1.4 then
|
||||||
diff.z > math.abs(self.old_dir.z) then
|
pos = vector.add(self.old_pos, self.old_dir)
|
||||||
pos = vector.new(expected_pos)
|
|
||||||
--minetest.log("action", "Cart moving too fast at "..minetest.pos_to_string(pos))
|
|
||||||
self.punch = true
|
self.punch = true
|
||||||
|
--minetest.log("action", "Cart moving too fast at "..minetest.pos_to_string(pos))
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local ro_vel = vector.round(vel)
|
local ro_vel = vector.round(vel)
|
||||||
local cart_dir = {
|
local cart_dir = {
|
||||||
x = boost_cart:get_sign(ro_vel.x),
|
x = boost_cart:get_sign(ro_vel.x),
|
||||||
y = boost_cart:get_sign(ro_vel.y),
|
y = boost_cart:get_sign(ro_vel.y),
|
||||||
z = boost_cart:get_sign(ro_vel.z)
|
z = boost_cart:get_sign(ro_vel.z)
|
||||||
}
|
}
|
||||||
|
local max_vel = boost_cart.speed_max
|
||||||
local dir = boost_cart:get_rail_direction(pos, cart_dir)
|
local dir = boost_cart:get_rail_direction(pos, cart_dir)
|
||||||
if vector.equals(dir, {x=0, y=0, z=0}) then
|
if vector.equals(dir, {x=0, y=0, z=0}) then
|
||||||
vel = {x=0, y=0, z=0}
|
vel = {x=0, y=0, z=0}
|
||||||
@ -170,7 +163,24 @@ function boost_cart.cart:on_step(dtime)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Slow down or speed up..
|
-- Slow down or speed up..
|
||||||
local acc = (dir.y * -2) - 0.4
|
local acc = dir.y * -2
|
||||||
|
|
||||||
|
local speed_mod = tonumber(minetest.get_meta(pos):get_string("cart_acceleration"))
|
||||||
|
if speed_mod and speed_mod ~= 0 then
|
||||||
|
if speed_mod > 0 then
|
||||||
|
local is_limit = false
|
||||||
|
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 * 6)
|
||||||
|
else
|
||||||
|
acc = acc - 0.4
|
||||||
|
end
|
||||||
|
|
||||||
local new_acc = {
|
local new_acc = {
|
||||||
x = dir.x * acc,
|
x = dir.x * acc,
|
||||||
y = dir.y * acc,
|
y = dir.y * acc,
|
||||||
@ -185,8 +195,8 @@ function boost_cart.cart:on_step(dtime)
|
|||||||
|
|
||||||
-- Limits
|
-- Limits
|
||||||
for _,v in ipairs({"x","y","z"}) do
|
for _,v in ipairs({"x","y","z"}) do
|
||||||
if math.abs(vel[v]) > boost_cart.speed_max then
|
if math.abs(vel[v]) > max_vel then
|
||||||
vel[v] = boost_cart:get_sign(vel[v]) * boost_cart.speed_max
|
vel[v] = boost_cart:get_sign(vel[v]) * max_vel
|
||||||
self.punch = true
|
self.punch = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -215,8 +225,8 @@ function boost_cart.cart:on_step(dtime)
|
|||||||
self.punch = false
|
self.punch = false
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_entity("boost_cart:cart", boost_cart.cart)
|
minetest.register_entity(":carts:cart", boost_cart.cart)
|
||||||
minetest.register_craftitem("boost_cart:cart", {
|
minetest.register_craftitem(":carts:cart", {
|
||||||
description = "Cart",
|
description = "Cart",
|
||||||
inventory_image = minetest.inventorycube("cart_top.png", "cart_side.png", "cart_side.png"),
|
inventory_image = minetest.inventorycube("cart_top.png", "cart_side.png", "cart_side.png"),
|
||||||
wield_image = "cart_side.png",
|
wield_image = "cart_side.png",
|
||||||
@ -225,9 +235,9 @@ minetest.register_craftitem("boost_cart:cart", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
if boost_cart:is_rail(pointed_thing.under) then
|
if boost_cart:is_rail(pointed_thing.under) then
|
||||||
minetest.add_entity(pointed_thing.under, "boost_cart:cart")
|
minetest.add_entity(pointed_thing.under, "carts:cart")
|
||||||
elseif boost_cart:is_rail(pointed_thing.above) then
|
elseif boost_cart:is_rail(pointed_thing.above) then
|
||||||
minetest.add_entity(pointed_thing.above, "boost_cart:cart")
|
minetest.add_entity(pointed_thing.above, "carts:cart")
|
||||||
else return end
|
else return end
|
||||||
|
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
|
117
rails.lua
@ -14,3 +14,120 @@ minetest.register_node(":default:rail", {
|
|||||||
},
|
},
|
||||||
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1},
|
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Copper rail
|
||||||
|
minetest.register_node(":carts:copperrail", {
|
||||||
|
description = "Copper rail",
|
||||||
|
drawtype = "raillike",
|
||||||
|
tiles = {"carts_rail_cp.png", "carts_rail_curved_cp.png", "carts_rail_t_junction_cp.png", "carts_rail_crossing_cp.png"},
|
||||||
|
inventory_image = "carts_rail_cp.png",
|
||||||
|
wield_image = "carts_rail_cp.png",
|
||||||
|
paramtype = "light",
|
||||||
|
is_ground_content = true,
|
||||||
|
walkable = false,
|
||||||
|
selection_box = {
|
||||||
|
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},
|
||||||
|
},
|
||||||
|
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "carts:copperrail 12",
|
||||||
|
recipe = {
|
||||||
|
{"default:copper_ingot", "group:stick", "default:copper_ingot"},
|
||||||
|
{"default:copper_ingot", "group:stick", "default:copper_ingot"},
|
||||||
|
{"default:copper_ingot", "group:stick", "default:copper_ingot"},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Speed up
|
||||||
|
|
||||||
|
minetest.register_node(":carts:powerrail", {
|
||||||
|
description = "Powered rail",
|
||||||
|
drawtype = "raillike",
|
||||||
|
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",
|
||||||
|
wield_image = "carts_rail_pwr.png",
|
||||||
|
paramtype = "light",
|
||||||
|
is_ground_content = true,
|
||||||
|
walkable = false,
|
||||||
|
selection_box = {
|
||||||
|
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},
|
||||||
|
},
|
||||||
|
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1},
|
||||||
|
|
||||||
|
after_place_node = function(pos, placer, itemstack)
|
||||||
|
if not mesecon then
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "0.5")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
mesecons = {
|
||||||
|
effector = {
|
||||||
|
action_on = function(pos, node)
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "0.5")
|
||||||
|
end,
|
||||||
|
|
||||||
|
action_off = function(pos, node)
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "0")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "carts:powerrail 6",
|
||||||
|
recipe = {
|
||||||
|
{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"},
|
||||||
|
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
|
||||||
|
{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node(":carts:brakerail", {
|
||||||
|
description = "Brake rail",
|
||||||
|
drawtype = "raillike",
|
||||||
|
tiles = {"carts_rail_brk.png", "carts_rail_curved_brk.png", "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"},
|
||||||
|
inventory_image = "carts_rail_brk.png",
|
||||||
|
wield_image = "carts_rail_brk.png",
|
||||||
|
paramtype = "light",
|
||||||
|
is_ground_content = true,
|
||||||
|
walkable = false,
|
||||||
|
selection_box = {
|
||||||
|
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},
|
||||||
|
},
|
||||||
|
groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1},
|
||||||
|
|
||||||
|
after_place_node = function(pos, placer, itemstack)
|
||||||
|
if not mesecon then
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "-0.2")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
mesecons = {
|
||||||
|
effector = {
|
||||||
|
action_on = function(pos, node)
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "-0.2")
|
||||||
|
end,
|
||||||
|
|
||||||
|
action_off = function(pos, node)
|
||||||
|
minetest.get_meta(pos):set_string("cart_acceleration", "0")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "carts:brakerail 6",
|
||||||
|
recipe = {
|
||||||
|
{"default:steel_ingot", "default:coal_lump", "default:steel_ingot"},
|
||||||
|
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
|
||||||
|
{"default:steel_ingot", "default:coal_lump", "default:steel_ingot"},
|
||||||
|
}
|
||||||
|
})
|
BIN
textures/carts_rail_brk.png
Normal file
After Width: | Height: | Size: 524 B |
BIN
textures/carts_rail_cp.png
Normal file
After Width: | Height: | Size: 521 B |
BIN
textures/carts_rail_crossing_brk.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
textures/carts_rail_crossing_cp.png
Normal file
After Width: | Height: | Size: 496 B |
BIN
textures/carts_rail_crossing_pwr.png
Normal file
After Width: | Height: | Size: 604 B |
BIN
textures/carts_rail_curved_brk.png
Normal file
After Width: | Height: | Size: 555 B |
BIN
textures/carts_rail_curved_cp.png
Normal file
After Width: | Height: | Size: 487 B |
BIN
textures/carts_rail_curved_pwr.png
Normal file
After Width: | Height: | Size: 577 B |
BIN
textures/carts_rail_pwr.png
Normal file
After Width: | Height: | Size: 533 B |
BIN
textures/carts_rail_t_junction_brk.png
Normal file
After Width: | Height: | Size: 548 B |
BIN
textures/carts_rail_t_junction_cp.png
Normal file
After Width: | Height: | Size: 506 B |
BIN
textures/carts_rail_t_junction_pwr.png
Normal file
After Width: | Height: | Size: 584 B |