From 81b34bde821b87f4fa2e95ebe0e7095684d63ee4 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Wed, 18 Oct 2017 16:40:50 +0100 Subject: [PATCH] use newer boost_cart features --- cart_entity.lua | 80 ++++++++++++++++++++++++------------------------- functions.lua | 4 ++- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/cart_entity.lua b/cart_entity.lua index ef91ca0..eceee34 100644 --- a/cart_entity.lua +++ b/cart_entity.lua @@ -1,4 +1,3 @@ - local HAVE_MESECONS_ENABLED = minetest.get_modpath("mesecons") if HAVE_MESECONS_ENABLED then dofile(minetest.get_modpath("carts") .. "/detector.lua") @@ -50,22 +49,19 @@ function cart_entity:on_activate(staticdata, dtime_s) if data.old_dir then self.old_dir = data.old_dir end - if data.old_vel then - self.old_vel = data.old_vel - end end function cart_entity:get_staticdata() return minetest.serialize({ railtype = self.railtype, - old_dir = self.old_dir, - old_vel = self.old_vel + old_dir = self.old_dir }) end function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:getpos() - if not self.railtype then + local pos = self.object:get_pos() + local vel = self.object:get_velocity() + if not self.railtype or vector.equals(vel, {x=0, y=0, z=0}) then local node = minetest.get_node(pos).name self.railtype = minetest.get_item_group(node, "connect_to_raillike") end @@ -87,7 +83,7 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, -- Detach driver and items if self.driver then if self.old_pos then - self.object:setpos(self.old_pos) + self.object:set_pos(self.old_pos) end local player = minetest.get_player_by_name(self.driver) carts:manage_attachment(player, nil) @@ -99,19 +95,19 @@ function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, end -- Pick up cart local inv = puncher:get_inventory() - if not minetest.setting_getbool("creative_mode") + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) or not inv:contains_item("main", "carts:cart") then local leftover = inv:add_item("main", "carts:cart") -- If no room in inventory add a replacement cart to the world if not leftover:is_empty() then - minetest.add_item(self.object:getpos(), leftover) + minetest.add_item(self.object:get_pos(), leftover) end end self.object:remove() return end -- Player punches cart to alter velocity - local vel = self.object:getvelocity() if puncher:get_player_name() == self.driver then if math.abs(vel.x + vel.z) > carts.punch_speed_max then return @@ -158,7 +154,7 @@ local function rail_sound(self, dtime) self.sound_handle = nil minetest.after(0.2, minetest.sound_stop, handle) end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() local speed = vector.length(vel) if speed > 0 then self.sound_handle = minetest.sound_play( @@ -175,6 +171,7 @@ local function get_railparams(pos) return carts.railparams[node.name] or {} end +local v3_len = vector.length local function rail_on_step(self, dtime) -- if cart contains nothing then drop as item after 10 seconds @@ -182,7 +179,7 @@ local function rail_on_step(self, dtime) self.count = (self.count or 0) + dtime if self.count > 10 then - minetest.add_item(self.object:getpos(), "carts:cart") + minetest.add_item(self.object:get_pos(), "carts:cart") self.object:remove() if self.sound_handle then minetest.sound_stop(self.sound_handle) @@ -194,31 +191,21 @@ local function rail_on_step(self, dtime) self.count = 0 end - local vel = self.object:getvelocity() + local vel = self.object:get_velocity() if self.punched then vel = vector.add(vel, self.velocity) - self.object:setvelocity(vel) + self.object:set_velocity(vel) self.old_dir.y = 0 elseif vector.equals(vel, {x=0, y=0, z=0}) then return end - local pos = self.object:getpos() + local pos = self.object:get_pos() + local cart_dir = carts:velocity_to_dir(vel) + local same_dir = vector.equals(cart_dir, self.old_dir) local update = {} - -- 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()) - rail_on_step_event(get_railparams(pos).on_step, self, dtime) - return - end - self.old_vel = vector.new(vel) - - if self.old_pos and not self.punched then + if self.old_pos and not self.punched and same_dir then local flo_pos = vector.round(pos) local flo_old = vector.round(self.old_pos) if vector.equals(flo_pos, flo_old) then @@ -237,7 +224,8 @@ local function rail_on_step(self, dtime) end end - if self.old_pos then + local stop_wiggle = false + if self.old_pos and same_dir then -- Detection for "skipping" nodes local found_path = carts:pathfinder( pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype @@ -248,9 +236,11 @@ local function rail_on_step(self, dtime) pos = vector.new(self.old_pos) update.pos = true end + elseif self.old_pos and cart_dir.y ~= -1 and not self.punched then + -- Stop wiggle + stop_wiggle = true end - local cart_dir = carts:velocity_to_dir(vel) local railparams -- dir: New moving direction of the cart @@ -260,9 +250,16 @@ local function rail_on_step(self, dtime) ) local new_acc = {x=0, y=0, z=0} - if vector.equals(dir, {x=0, y=0, z=0}) then + if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then vel = {x = 0, y = 0, z = 0} - pos = vector.round(pos) + local pos_r = vector.round(pos) + if not carts:is_rail(pos_r, self.railtype) then + pos = self.old_pos + elseif not stop_wiggle then + pos = pos_r + else + pos.y = math.floor(pos.y + 0.5) + end update.pos = true update.vel = true else @@ -297,7 +294,7 @@ local function rail_on_step(self, dtime) -- Try to make it similar to the original carts mod acc = acc + speed_mod else - -- Handbrake + -- Handbrake or coast if ctrl and ctrl.down then acc = acc - 3 else @@ -323,9 +320,9 @@ local function rail_on_step(self, dtime) end end - self.object:setacceleration(new_acc) + self.object:set_acceleration(new_acc) 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}) and not stop_wiggle then self.old_dir = vector.new(dir) end self.old_switch = switch_keys @@ -361,7 +358,7 @@ local function rail_on_step(self, dtime) elseif self.old_dir.z < 0 then yaw = 1 end - self.object:setyaw(yaw * math.pi) + self.object:set_yaw(yaw * math.pi) local anim = {x=0, y=0} if dir.y == -1 then @@ -371,9 +368,9 @@ local function rail_on_step(self, dtime) end self.object:set_animation(anim, 1, 0) - self.object:setvelocity(vel) + self.object:set_velocity(vel) if update.pos then - self.object:setpos(pos) + self.object:set_pos(pos) end -- call event handler @@ -415,7 +412,8 @@ minetest.register_craftitem("carts:cart", { minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, {pos = pointed_thing.above}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack diff --git a/functions.lua b/functions.lua index 618c10f..0ed754d 100644 --- a/functions.lua +++ b/functions.lua @@ -18,7 +18,9 @@ function carts:manage_attachment(player, obj) default.player_attached[player_name] = status if status then - player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + -- player_api came after the new model. Check for it. + local y_pos = player_api and -4.5 or 6 + 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()