Well, I'm making a game and I'm currently working on the basic attacks, but I have a bit of a problem
wait(2) function tagHumanoid(humanoid, player, name) local creator_tag = Instance.new("ObjectValue") creator_tag.Value = player creator_tag.Name = name creator_tag.Parent = humanoid end function untagHumanoid(humanoid,name) if humanoid ~= nil then local tag = humanoid:findFirstChild(name) if tag ~= nil then tag:Destroy() end end end local function onKeyDown( key ) if string.lower(key) == "x" then print("R") print("E") print("S") print("E") print("T") wait(1) firing = false firstances = 0 end end canfire = true hitsound = script.HitSound print("Setting variables") local bin = script.Parent local user local player = game.Players.LocalPlayer local torso = player.Character.Torso local character = player.Character local mouse = player:GetMouse() local rays = character.Rays firing = 0 firstances = 0 mouse.KeyDown:connect(onKeyDown) function redfir() if firstances > 0 then firstances = firstances - 1 end end function castray(object) local start = object.Position local lookAt = Vector3.new((object.CFrame.lookVector.X*4),0,(object.CFrame.lookVector.Z*4)) local ray = Ray.new(start, (lookAt)) hit, position = workspace:FindPartOnRay(ray,character) end print("Set them, setting functions") function attack() -- problem is here, two "Instances" of this function start up on the Down value being changed, which causes two basic attacks to fire each time it loops, this is the problem wait() firstances = firstances + 1 delay(0.15, function() firstances = firstances - 1 end) if firing == false and firstances < 2 then firing = true wait() while bin.Down.Value == true and firstances <= 1 and firing == true do print("Attacking!") firstances = firstances + 1 print("Increasing") delay(0.5, function() firstances = firstances - 1 end) for i =1,3 do castray(rays[i]) if hit then break end --draw the debug rays for visualization local distance = (position - torso.CFrame.p).magnitude local rayPart = Instance.new("Part", user) rayPart.Name = "RayPart" rayPart.BrickColor = BrickColor.new("Bright red") rayPart.Transparency = 0.5 rayPart.Anchored = true rayPart.CanCollide = false rayPart.TopSurface = Enum.SurfaceType.Smooth rayPart.BottomSurface = Enum.SurfaceType.Smooth rayPart.formFactor = Enum.FormFactor.Custom rayPart.Size = Vector3.new(0.2, 0.2, distance) rayPart.CFrame = CFrame.new(position, torso.CFrame.p) * CFrame.new(0, 0, -distance/2) rayPart.Parent = workspace --add it to debris so it disappears after 0.1 seconds game.Debris:AddItem(rayPart, 0.05) end torso["Right Shoulder"].MaxVelocity = 10000 torso["Right Shoulder"].DesiredAngle = 3.2 hitsound:Play() --if firstances > 0 then delay(1, function() firstances = firstances - 1 end) if hit then print(hit.Name) local human = hit.Parent:FindFirstChild("Humanoid") if human then tagHumanoid(human, player,"Killer") human:TakeDamage(150) print("Nothin' hit") end wait(1) torso["Right Shoulder"].MaxVelocity = 0.1 torso["Right Shoulder"].DesiredAngle = 0 untagHumanoid(human,"Killer") end end end firing = false end bin.Down.Changed:connect(attack) print("Done") while true do wait(0.1) print (firstances, firing) end
That's the code, it goes along with a few other things, including another local script which handles the mouse and changes the "Down" value to achieve this. It creates two loops of the attack loop , which is my problem.