Browse Source

Attachments: Proper data cleanup in callbacks (#2865)

SmallJoker 2 years ago
parent
commit
71ea0c65ea
3 changed files with 21 additions and 24 deletions
  1. 13 16
      mods/boats/init.lua
  2. 3 7
      mods/carts/cart_entity.lua
  3. 5 1
      mods/carts/functions.lua

+ 13 - 16
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
 
 

+ 3 - 7
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
 

+ 5 - 1
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})