mirror of
				https://github.com/luanti-org/minetest_game.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Attachments: Proper data cleanup in callbacks (#2865)
This commit is contained in:
		@@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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})
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user