How to add the enemies to the table just one time with the touched event?

What is the issue? so, when my hitbox touch a enemy he is added to a table just one time, which is the normal, however, if the hitbox touch 2 enemies for example, they are added 2 times in the table, and i want them to be added only once, not two, because i think this is causing some weird bugs in my game. I think the answer to this should be easy, so I won’t provide any code.

Could you share your code that connects to the Touched events and how it adds the values to your table? We can only take wild guesses at what might be wrong without seeing the code; it could be redundant connections, lack of checking if something’s already in the table, naive handling of Touched events (they fire continuously during part overlaps), etc.

Sorry, I’m new here and thought it wouldn’t be necessary to include the script. I would send it now, but it’s 10 PM here, and I’ll only be able to send it tomorrow. Thanks for the heads-up!

1 Like
local Part = workspace.Part1 -- Example
local MyTable = {}

Part.Touched:Connect(function(Hit)
	local Model = Hit:FindFirstAncestorOfClass("Model")
	if Model then
		if table.find(MyTable, Model) == nil then
			table.insert(MyTable, Model)
		end
	end
end)

just use table.find in an if statement to see if somethings already in the table

here is the entire code:

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.MaxAxesForce = Vector3.new(100000,0,100000)
	linearV.VectorVelocity = direction
	linearV.VelocityConstraintMode = Enum.VelocityConstraintMode.Vector
	linearV.Attachment0 = attach
	linearV.RelativeTo = Enum.ActuatorRelativeTo.Attachment0
	attach.WorldPosition = targetHumRP.AssemblyCenterOfMass
	linearV.ForceLimitsEnabled = true
	game.Debris:AddItem(linearV,0.2)
end

local function getTarget(hrp,enemy)
	closestDist = math.huge
	target = nil
	targetRP = nil
	
	if #hitedPeople > 0 then
		for i,enemyChar in pairs(hitedPeople) do
			local enemyRP = enemyChar.HumanoidRootPart
			local distance = (enemyRP.RootAttachment.Position - hrp.RootAttachment.Position).Magnitude

			if distance < closestDist then
				closestDist = distance
				target = enemyChar
				targetRP = target.HumanoidRootPart
				print(closestDist)
			end
		end	
	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=85032147152709"
    	local animationTrack = humanoid:LoadAnimation(animation)
	
    	local animationGrabing = Instance.new("Animation")
    	animationGrabing.AnimationId = "http://www.roblox.com/asset/?id=My_anim"
    	local animationTrackGrabing = humanoid:LoadAnimation(animationGrabing)
	
    	local hitbox = hitbox.new()
    	hitbox.Size = Vector3.new(14,14,14)
    	hitbox.CFrame = humanoidRootPart
    	hitbox.Offset = CFrame.new(0,0,-2)
    	hitbox.Visualizer = true
		
		hitbox.onTouch = function(enemyHum)
			if enemyHum ~= humanoid then				
				looping = true
				character:SetAttribute("Grab",true)
	        	enemy = enemyHum.Parent
				enemyHumRP = enemy.HumanoidRootPart
				
				if table.find(hitedPeople,enemy) == nil then
					table.insert(hitedPeople,enemy)
				end
				
				getTarget(humanoidRootPart,enemy)
				
				print(hitedPeople)
				
				for i,v in pairs(target:GetChildren()) do
					if v:IsA("BasePart") then
						v.Color = Color3.fromRGB(0,100,80)
					end
				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))
							
							hitedPeople = {}
													
							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			
			
			hitedPeople = {}
		end
		
	end	
end)

Using table.find didn’t work. I want that when two or more enemies are hit by the hitbox, they are added to the table correctly. However, they are being added in a strange way because of the touch, and I think that’s what’s causing issues when getting the closest enemy. It’s happening inconsistently.

here is the print of the table (example with two enemies):

{ [dummy 1] – the closest enemy
}

and them one more time because the hitbox touch two enemies

{ [dummy 1],

[dummy 2] – the most distant

And if it wasn’t clear, sometimes the farthest enemy becomes the target.

		hitbox.onTouch = function(enemyHum)
			if enemyHum ~= humanoid then				
				looping = true
				character:SetAttribute("Grab",true)
	        	enemy = enemyHum.Parent
				enemyHumRP = enemy.HumanoidRootPart
				
				if table.find(hitedPeople,enemy) == nil then
					table.insert(hitedPeople,enemy)
				else
					return -- u forgot
				end

now it is getting the two dummies

i cant read the script clearly cuz everything is gray, but maybe u forgot to reset the distance and target variables before u loop through them again checking which one is closer than the other

found it,

local distance = (enemyRP.RootAttachment.Position - hrp.RootAttachment.Position).Magnitude

its suppose to be

local distance = (enemyRP.RootAttachment.WorldPosition- hrp.RootAttachment.WorldPosition).Magnitude

Attachment’s Position is relative to its parent, not the world, thats why it wont give u real world vector3, thats why WorldPosition exists for that

ok, i’ll try and see if it works

didn’t work, its rappening the same thing

u mean its still targetting the farthest?

i’ll try to reset the target and the closestDist after set the target

yeah sometimes ssssssssssssssssss

try putting if #hitedPeople > 0 then return end

wait this is getting confusing, im replying to each of ur problem (the distance) and the (getting 2 dummies)

how it works? i think the return end reset the whole code didn’t?