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!
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?