The target doesn't update

What is the issue? So, I’ve spent days trying to solve my problem, which is about making the closest enemy to my humanoid (who is detected by the hitbox) the target. This works perfectly, however, once I set an enemy as the target, it becomes the target forever. If this helps, here’s my script:

local RP = game:GetService("ReplicatedStorage")
local grabRemote = RP.remotes.grab
local ss = game:GetService("ServerStorage")
local modules = ss:WaitForChild("Modules")
local slow = require(modules:WaitForChild("slow"))
local runService = game:GetService("RunService")
local rockModule = require(modules:WaitForChild("RockModule"))
local utilities = require(modules:WaitForChild("particleEmitter"))
local hitbox = require(modules:WaitForChild("hitbox"))
local hitService = require(modules:WaitForChild("hitService"))

local hitedPeople = {}
local grabAnins = {}

local looping = false

local startTick
local weld
local enemy
local enemyHumRP
local closestDist = math.huge
local target = nil
local targetRP = nil

local function aplyVelocity(targetHumRP,direction)
	local linearV = Instance.new("LinearVelocity",targetHumRP)
	local attach = targetHumRP.RootAttachment
	linearV.MaxForce = 100000
	linearV.ForceLimitMode = Enum.ForceLimitMode.PerAxis
	linearV.VelocityConstraintMode = Enum.VelocityConstraintMode.Vector
	linearV.Attachment0 = attach
	linearV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
	attach.WorldPosition = targetHumRP.AssemblyCenterOfMass
	linearV.MaxAxesForce = Vector3.new(100000,0,100000)
	linearV.VectorVelocity = direction
	linearV.ForceLimitsEnabled = true
	game.Debris:AddItem(linearV,0.2)
end

local function getTarget(hrp,enemy)
	table.insert(hitedPeople,enemy)
	
	if #hitedPeople > 0 then
		for i,enemyChar in pairs(hitedPeople) do
			local enemyRP = enemyChar.HumanoidRootPart
			local distance = (enemyRP.Position - hrp.Position).Magnitude

			if distance < closestDist then
				closestDist = distance
				target = enemyChar
				targetRP = target.HumanoidRootPart
			end
		end	
	end
	
	if not table.find(hitedPeople,enemy) then
		table.insert(hitedPeople,enemy)
	end	
	
	return target,targetRP
end	

grabRemote.OnServerEvent:Connect(function(plr,grab,input)	
	local character = plr.Character
	local humanoid = character:WaitForChild("Humanoid")
	local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
	
	local grabing = character:GetAttribute("Grab")
	local attacking = character:GetAttribute("Attacking")
	local punching = character:GetAttribute("Punching")
	local blocking = character:GetAttribute("Blocking")
	local jumping = character:GetAttribute("Jumping")
	local slowed = character:GetAttribute("Slowed")
	local stunned = character:GetAttribute("Stunned")
	local dashing = character:GetAttribute("Dash")
	local dashing2 = character:GetAttribute("Dash2")
	
	if grab then
		if grabing or attacking or punching or blocking or stunned or dashing or dashing2 then return end
	
    	local animation = Instance.new("Animation")
    	animation.AnimationId = "http://www.roblox.com/asset/?id=MY_GRAB_ANIM"
    	local animationTrack = humanoid:LoadAnimation(animation)
	
    	local hitbox = hitbox.new()
    	hitbox.Size = Vector3.new(4,4,4)
    	hitbox.CFrame = humanoidRootPart
    	hitbox.Offset = CFrame.new(0,0,-4)
    	hitbox.Visualizer = true
		
		hitbox.onTouch = function(enemyHum)
			if enemyHum ~= humanoid then				
				looping = true
				character:SetAttribute("Grab",true)
	        	enemy = enemyHum.Parent
				enemyHumRP = enemy.HumanoidRootPart
				
				getTarget(humanoidRootPart,enemy)
				
				for i,v in pairs(target:GetChildren()) do
					if v:IsA("BasePart") then
						v.Color = Color3.fromRGB(0,100,80)
					end
				end
				
				if target then
					print(target)
				end
				
					weld = Instance.new("Weld")
					weld.C1 = CFrame.new(0,0,-2) * CFrame.Angles(0,math.rad(180),0)
					weld.Part0 = targetRP
					weld.Part1 = humanoidRootPart
					weld.Name = "wellwellwell"
				
					local knockback = nil
					local maxForce = nil
				
					startTick = tick()
				
					while looping do
						humanoid.WalkSpeed = 10
						humanoid.JumpPower = 0
				
						weld.Parent = targetRP
						target.Humanoid.PlatformStand = true
				
					
						if tick() - startTick > 3 then						
							character:SetAttribute("Grab",false)
							target.Humanoid.PlatformStand = false
							humanoid.WalkSpeed = 20
							humanoid.JumpPower = 50

							for i,v in pairs(targetRP:GetChildren()) do
								if v:IsA("Weld") and v.Name == "wellwellwell" then
									v.Parent = nil
								end
							end
							
						
							aplyVelocity(targetRP,Vector3.new(0,0,30))
													
							break
						end
				
						task.wait()
					end
				
					hitService.hit(enemyHum,nil,knockback,nil,character,nil,nil,maxForce,nil,nil)
					
			end	
		end
	
		animationTrack.KeyframeReached:Connect(function(kf)
			if kf == "grab" then
				hitbox:Start()
				task.wait(0.2)
				hitbox:Stop()
			end
		end)
	
		animationTrack:Play()
		grabAnins[plr] = animationTrack
	else
		if grabing then					
			looping = false
			character:SetAttribute("Grab",false)
			grabAnins[plr]:Stop()
			grabAnins[plr] = nil
			
			humanoid.WalkSpeed = 20
			humanoid.JumpPower = 50
			
			target.Humanoid.PlatformStand = false
			
			for i,v in pairs(targetRP:GetChildren()) do
				if v:IsA("Weld") and v.Name == "wellwellwell" then
					v.Enabled = false
				end
			end
			
			if tick() - startTick < 3 and input == Enum.KeyCode.T then
				aplyVelocity(targetRP,Vector3.new(0,0,30))
			elseif input == Enum.KeyCode.Y then
				aplyVelocity(targetRP,Vector3.new(30,0,0))
			elseif input == Enum.KeyCode.G then
				aplyVelocity(targetRP,Vector3.new(-30,0,0))
			end			
		end
		
	end	
end)

If someone have any idea of what is the problem, i would be greatfull.

1 Like

i didnt read all, but maybe ur problem is the same i used to have, maybe u forgot to put closestDist to math.huge whenever u try to find target again, make sure u always reset it to math.huge before trying to get new target, and reset the target to nil too

but if that was not the case, i might read the script sometime

2 Likes

sorry, the roblox didn’t notificate me about your reply. So, how do I reset the closest distance? I have no idea how to do it

oh, and thank for the reply, maybe this should work

u have function getTarget(hrp, enemy)

do this

local closestDist = math.huge
local target = nil
local targetRP = nil
local function getTarget(hrp, enemy)
	closestDist = math.huge
	target = nil
	targetRP = nil
	
	--Do ur stuff again
end

ok, i’ll try this and see if it works

ok, it works! but on the team test, if the player 1 turns the target and try to grab the player 2, he stills be the target, but i think its easy to fix

yea, just make a table and add the characters there that u dont want to be part of valid targets

thanks for the idea i’ll try it :pray:

here is the final solution for the people that has the same problem as me:

if tick() - startTick > 3 Them
    hitedPeople = {}
    --just reset the table