summaryrefslogtreecommitdiff
path: root/boost_cart/functions.lua
diff options
context:
space:
mode:
Diffstat (limited to 'boost_cart/functions.lua')
-rw-r--r--boost_cart/functions.lua248
1 files changed, 0 insertions, 248 deletions
diff --git a/boost_cart/functions.lua b/boost_cart/functions.lua
deleted file mode 100644
index ec04bb7..0000000
--- a/boost_cart/functions.lua
+++ /dev/null
@@ -1,248 +0,0 @@
-function boost_cart:get_sign(z)
- if z == 0 then
- return 0
- else
- return z / math.abs(z)
- end
-end
-
-function boost_cart:manage_attachment(player, obj)
- if not player then
- return
- end
- local status = obj ~= nil
- local player_name = player:get_player_name()
- if default.player_attached[player_name] == status then
- return
- end
- default.player_attached[player_name] = status
-
- if status then
- local y_pos = self.old_player_model and 6 or -4.2
- player:set_attach(obj, "", {x=0, y=y_pos, z=0}, {x=0, y=0, z=0})
- player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
- else
- player:set_detach()
- player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0})
- end
-end
-
-function boost_cart:velocity_to_dir(v)
- if math.abs(v.x) > math.abs(v.z) then
- return {x=self:get_sign(v.x), y=self:get_sign(v.y), z=0}
- else
- return {x=0, y=self:get_sign(v.y), z=self:get_sign(v.z)}
- end
-end
-
-local get_node = minetest.get_node
-local get_item_group = minetest.get_item_group
-function boost_cart:is_rail(pos, railtype)
- local node = get_node(pos).name
- if node == "ignore" then
- local vm = minetest.get_voxel_manip()
- local emin, emax = vm:read_from_map(pos, pos)
- local area = VoxelArea:new{
- MinEdge = emin,
- MaxEdge = emax,
- }
- local data = vm:get_data()
- local vi = area:indexp(pos)
- node = minetest.get_name_from_content_id(data[vi])
- end
- if get_item_group(node, "rail") == 0 then
- return false
- end
- if not railtype then
- return true
- end
- return get_item_group(node, "connect_to_raillike") == railtype
-end
-
-function boost_cart:check_front_up_down(pos, dir_, check_up, railtype)
- local dir = vector.new(dir_)
- local cur = nil
-
- -- Front
- dir.y = 0
- cur = vector.add(pos, dir)
- if self:is_rail(cur, railtype) then
- return dir
- end
- -- Up
- if check_up then
- dir.y = 1
- cur = vector.add(pos, dir)
- if self:is_rail(cur, railtype) then
- return dir
- end
- end
- -- Down
- dir.y = -1
- cur = vector.add(pos, dir)
- if self:is_rail(cur, railtype) then
- return dir
- end
- return nil
-end
-
-function boost_cart:get_rail_direction(pos_, dir, ctrl, old_switch, railtype)
- local pos = vector.round(pos_)
- local cur = nil
- local left_check, right_check = true, true
-
- -- Check left and right
- local left = {x=0, y=0, z=0}
- local right = {x=0, y=0, z=0}
- if dir.z ~= 0 and dir.x == 0 then
- left.x = -dir.z
- right.x = dir.z
- elseif dir.x ~= 0 and dir.z == 0 then
- left.z = dir.x
- right.z = -dir.x
- end
-
- if ctrl then
- if old_switch == 1 then
- left_check = false
- elseif old_switch == 2 then
- right_check = false
- end
- if ctrl.left and left_check then
- cur = self:check_front_up_down(pos, left, false, railtype)
- if cur then
- return cur, 1
- end
- left_check = false
- end
- if ctrl.right and right_check then
- cur = self:check_front_up_down(pos, right, false, railtype)
- if cur then
- return cur, 2
- end
- right_check = true
- end
- end
-
- -- Normal
- cur = self:check_front_up_down(pos, dir, true, railtype)
- if cur then
- return cur
- end
-
- -- Left, if not already checked
- if left_check then
- cur = self:check_front_up_down(pos, left, false, railtype)
- if cur then
- return cur
- end
- end
-
- -- Right, if not already checked
- if right_check then
- cur = self:check_front_up_down(pos, right, false, railtype)
- if cur then
- return cur
- end
- end
-
- -- Backwards
- if not old_switch then
- cur = self:check_front_up_down(pos, {
- x = -dir.x,
- y = dir.y,
- z = -dir.z
- }, true, railtype)
- if cur then
- return cur
- end
- end
-
- return {x=0, y=0, z=0}
-end
-
-function boost_cart:pathfinder(pos_, old_pos, old_dir, distance, ctrl,
- pf_switch, railtype)
-
- local pos = vector.round(pos_)
- if vector.equals(old_pos, pos) then
- return
- end
-
- local pf_pos = vector.round(old_pos)
- local pf_dir = vector.new(old_dir)
- distance = math.min(boost_cart.path_distance_max,
- math.floor(distance + 1))
-
- for i = 1, distance do
- pf_dir, pf_switch = self:get_rail_direction(
- pf_pos, pf_dir, ctrl, pf_switch or 0, railtype)
-
- if vector.equals(pf_dir, {x=0, y=0, z=0}) then
- -- No way forwards
- return pf_pos, pf_dir
- end
-
- pf_pos = vector.add(pf_pos, pf_dir)
-
- if vector.equals(pf_pos, pos) then
- -- Success! Cart moved on correctly
- return
- end
- end
- -- Not found. Put cart to predicted position
- return pf_pos, pf_dir
-end
-
-function boost_cart: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 == "carts:cart" then
- obj_:get_luaentity():on_punch()
- end
- end
-end
-
-function boost_cart:register_rail(name, def_overwrite)
- local def = {
- drawtype = "raillike",
- paramtype = "light",
- sunlight_propagates = true,
- is_ground_content = false,
- walkable = false,
- selection_box = {
- type = "fixed",
- fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
- }
- }
- for k, v in pairs(def_overwrite) do
- def[k] = v
- end
- if not def.inventory_image then
- def.wield_image = def.tiles[1]
- def.inventory_image = def.tiles[1]
- end
-
- minetest.register_node(name, def)
-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 minetest.raillike_group then
- groups.connect_to_raillike = minetest.raillike_group("rail")
- end
- if type(additional_groups) == "table" then
- for k, v in pairs(additional_groups) do
- groups[k] = v
- end
- end
- return groups
-end