From 71ea0c65ea115dc79894b835b2286247fb48e25b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 11 May 2021 21:15:47 +0200 Subject: [PATCH] Attachments: Proper data cleanup in callbacks (#2865) --- mods/boats/init.lua | 29 +++++++++++++---------------- mods/carts/cart_entity.lua | 10 +++------- mods/carts/functions.lua | 6 +++++- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index 2f305415..52360be4 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -53,31 +53,24 @@ function boat.on_rightclick(self, clicker) end local name = clicker:get_player_name() if self.driver and name == self.driver then - self.driver = nil - self.auto = false + -- Cleanup happens in boat.on_detach_child clicker:set_detach() - player_api.player_attached[name] = false - player_api.set_animation(clicker, "stand" , 30) + + player_api.set_animation(clicker, "stand", 30) local pos = clicker:get_pos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} minetest.after(0.1, function() clicker:set_pos(pos) end) elseif not self.driver then - local attach = clicker:get_attach() - if attach and attach:get_luaentity() then - local luaentity = attach:get_luaentity() - if luaentity.driver then - luaentity.driver = nil - end - clicker:set_detach() - end - self.driver = name clicker:set_attach(self.object, "", {x = 0.5, y = 1, z = -3}, {x = 0, y = 0, z = 0}) + + self.driver = name player_api.player_attached[name] = true + minetest.after(0.2, function() - player_api.set_animation(clicker, "sit" , 30) + player_api.set_animation(clicker, "sit", 30) end) clicker:set_look_horizontal(self.object:get_yaw()) end @@ -86,8 +79,12 @@ end -- If driver leaves server while driving boat function boat.on_detach_child(self, child) - self.driver = nil - self.auto = false + if child and child:get_player_name() == self.driver then + player_api.player_attached[child:get_player_name()] = false + + self.driver = nil + self.auto = false + end end diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua index 908ef556..8008bcfb 100644 --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -29,15 +29,10 @@ function cart_entity:on_rightclick(clicker) end local player_name = clicker:get_player_name() if self.driver and player_name == self.driver then - self.driver = nil carts:manage_attachment(clicker, nil) elseif not self.driver then - self.driver = player_name carts:manage_attachment(clicker, self.object) - - -- player_api does not update the animation - -- when the player is attached, reset to default animation - player_api.set_animation(clicker, "stand") + self.driver = player_name end end @@ -66,8 +61,9 @@ end -- 0.5.x and later: When the driver leaves function cart_entity:on_detach_child(child) if child and child:get_player_name() == self.driver then - self.driver = nil + -- Clean up eye height carts:manage_attachment(child, nil) + self.driver = nil end end diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua index a54b5948..36b7e129 100644 --- a/mods/carts/functions.lua +++ b/mods/carts/functions.lua @@ -12,7 +12,7 @@ function carts:manage_attachment(player, obj) end local status = obj ~= nil local player_name = player:get_player_name() - if player_api.player_attached[player_name] == status then + if obj and player:get_attach() == obj then return end player_api.player_attached[player_name] = status @@ -20,6 +20,10 @@ function carts:manage_attachment(player, obj) if status then player:set_attach(obj, "", {x=0, y=-4.5, z=0}, {x=0, y=0, z=0}) player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + + -- player_api does not update the animation + -- when the player is attached, reset to default animation + player_api.set_animation(player, "stand") else player:set_detach() player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0})