From 159d4ec603eb7b52b977ad51d7fbb773098e39ec Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 22 Mar 2015 10:52:48 +0100 Subject: [PATCH] Punch cart if mesecon signal is received --- functions.lua | 41 +++++++++++++++++++++++++++++++---------- init.lua | 23 +++++++++++++++-------- rails.lua | 4 ++-- 3 files changed, 48 insertions(+), 20 deletions(-) diff --git a/functions.lua b/functions.lua index 39534f8..bac355f 100644 --- a/functions.lua +++ b/functions.lua @@ -36,7 +36,8 @@ function boost_cart:is_rail(pos, railtype) return minetest.get_item_group(node, "connect_to_raillike") == railtype end -function boost_cart:check_front_up_down(pos, dir, onlyDown, railtype) +function boost_cart:check_front_up_down(pos, dir_, check_down, railtype) + local dir = vector.new(dir_) local cur = nil -- Front @@ -46,7 +47,7 @@ function boost_cart:check_front_up_down(pos, dir, onlyDown, railtype) return dir end -- Up - if not onlyDown then + if check_down then dir.y = 1 cur = vector.add(pos, dir) if boost_cart:is_rail(cur, railtype) then @@ -62,12 +63,10 @@ function boost_cart:check_front_up_down(pos, dir, onlyDown, railtype) return nil end -function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch, railtype) +function boost_cart:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) local pos = vector.round(pos_) - local dir = vector.new(dir_) local cur = nil local left_check, right_check = true, true - old_switch = old_switch or 0 -- Check left and right local left = {x=0, y=0, z=0} @@ -87,14 +86,14 @@ function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch, railtype) right_check = false end if ctrl.left and left_check then - cur = boost_cart:check_front_up_down(pos, left, true, railtype) + cur = boost_cart: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 = boost_cart:check_front_up_down(pos, right, true, railtype) + cur = boost_cart:check_front_up_down(pos, right, false, railtype) if cur then return cur, 2 end @@ -103,14 +102,14 @@ function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch, railtype) end -- Normal - cur = boost_cart:check_front_up_down(pos, dir, false, railtype) + cur = boost_cart:check_front_up_down(pos, dir, true, railtype) if cur then return cur end -- Left, if not already checked if left_check then - cur = boost_cart:check_front_up_down(pos, left, true, railtype) + cur = boost_cart:check_front_up_down(pos, left, false, railtype) if cur then return cur end @@ -118,7 +117,19 @@ function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch, railtype) -- Right, if not already checked if right_check then - cur = boost_cart:check_front_up_down(pos, right, true, railtype) + cur = boost_cart:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = boost_cart:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) if cur then return cur end @@ -127,3 +138,13 @@ function boost_cart:get_rail_direction(pos_, dir_, ctrl, old_switch, railtype) return {x=0, y=0, z=0} 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 \ No newline at end of file diff --git a/init.lua b/init.lua index c71fac3..7979df2 100644 --- a/init.lua +++ b/init.lua @@ -29,7 +29,7 @@ boost_cart.cart = { velocity = {x=0, y=0, z=0}, -- only used on punch old_dir = {x=0, y=0, z=0}, old_pos = nil, - old_switch = nil, + old_switch = 0, railtype = nil, attached_items = {} } @@ -54,7 +54,20 @@ function boost_cart.cart:on_activate(staticdata, dtime_s) end function boost_cart.cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(vector.floor(pos)).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + if not puncher or not puncher:is_player() then + local cart_dir = boost_cart:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 3) + self.old_pos = nil + self.punched = true return end @@ -80,12 +93,6 @@ function boost_cart.cart:on_punch(puncher, time_from_last_punch, tool_capabiliti return end - if not self.railtype then - local pos = vector.floor(self.object:getpos()) - local node = minetest.get_node(pos).name - self.railtype = minetest.get_item_group(node, "connect_to_raillike") - end - local vel = self.object:getvelocity() if puncher:get_player_name() == self.driver then if math.abs(vel.x + vel.z) > 7 then @@ -95,7 +102,7 @@ function boost_cart.cart:on_punch(puncher, time_from_last_punch, tool_capabiliti local punch_dir = boost_cart:velocity_to_dir(puncher:get_look_dir()) punch_dir.y = 0 - local cart_dir = boost_cart:get_rail_direction(self.object:getpos(), punch_dir, nil, self.railtype) + local cart_dir = boost_cart:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) if vector.equals(cart_dir, {x=0, y=0, z=0}) then return end diff --git a/rails.lua b/rails.lua index 9f6a742..cdfc198 100644 --- a/rails.lua +++ b/rails.lua @@ -73,7 +73,7 @@ minetest.register_node(":carts:powerrail", { mesecons = { effector = { action_on = function(pos, node) - minetest.get_meta(pos):set_string("cart_acceleration", "0.5") + boost_cart:boost_rail(pos, 0.5) end, action_off = function(pos, node) @@ -117,7 +117,7 @@ minetest.register_node(":carts:brakerail", { mesecons = { effector = { action_on = function(pos, node) - minetest.get_meta(pos):set_string("cart_acceleration", "-0.2") + boost_cart:boost_rail(pos, -0.2) end, action_off = function(pos, node)