Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

I have a sword, but it only hits 1 enemy at a time, how do I hit several enemies at once?

Asked by 3 years ago
Tool = script.Parent
Handle = Tool:WaitForChild("Handle")
Player = game.Players.LocalPlayer
Players = game:GetService("Players")
Debris = game:GetService("Debris")
RunService = game:GetService("RunService")

Create = Instance.new

DamageValues = {
    BaseDamage = 0,
    SlashDamage = 20, -- Damage
}

Damage = DamageValues.BaseDamage

BaseUrl = "http://www.roblox.com/asset/?id="

BasePart = Instance.new("Part")
BasePart.Shape = Enum.PartType.Block
BasePart.Material = Enum.Material.Plastic
BasePart.TopSurface = Enum.SurfaceType.Smooth
BasePart.BottomSurface = Enum.SurfaceType.Smooth
BasePart.FormFactor = Enum.FormFactor.Custom
BasePart.Size = Vector3.new(0.2, 0.2, 0.2)
BasePart.CanCollide = true
BasePart.Locked = true
BasePart.Anchored = false

Rate = (1 / 60)

AnimationsBin = Tool:WaitForChild("Animations")
R6Anims = AnimationsBin:WaitForChild("R6")
R15Anims = AnimationsBin:WaitForChild("R15")

Animations = {
    R6LeftSlash = {Animation = R6Anims:WaitForChild("LeftSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5},
    R6RightSlash = {Animation = R6Anims:WaitForChild("RightSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5},
    R6SideSwipe = {Animation = R6Anims:WaitForChild("SideSwipe"), FadeTime = nil, Weight = nil, Speed = 0.8, Duration = 0.5},
    R15LeftSlash = {Animation = R15Anims:WaitForChild("LeftSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5},
    R15RightSlash = {Animation = R15Anims:WaitForChild("RightSlash"), FadeTime = nil, Weight = nil, Speed = 1.5, Duration = 0.5},
    R15SideSwipe = {Animation = R15Anims:WaitForChild("SideSwipe"), FadeTime = nil, Weight = nil, Speed = 0.8, Duration = 0.5},

}

Sounds = {
    Unsheath = Handle:WaitForChild("Unsheath"),
    Slash = Handle:WaitForChild("Slash"),
    Lunge = Handle:WaitForChild("Lunge"),
}

ToolEquipped = false

Remotes = (Tool:FindFirstChild("Remotes") or Create("Folder"){
    Name = "Remotes",
    Parent = Tool,
})
ServerControl = (Remotes:FindFirstChild("ServerControl") or Create("RemoteFunction"){
    Name = "ServerControl",
    Parent = Remotes,
})
ClientControl = (Remotes:FindFirstChild("ClientControl") or Create("RemoteFunction"){
    Name = "ClientControl",
    Parent = Remotes,
})

Handle.Transparency = 0
Tool.Enabled = true

function IsTeamMate(Player1, Player2)
    return (Player1 and Player2 and not Player1.Neutral and not Player2.Neutral and Player1.TeamColor == Player2.TeamColor)
end

function TagHumanoid(humanoid, player)
    local creator_tag = Instance.new("ObjectValue")
    creator_tag.Value = player
    creator_tag.Name = "creator"
    creator_tag.Parent = humanoid
end

function UntagHumanoid(humanoid)
    if humanoid ~= nil then
        local tag = humanoid:findFirstChild("creator")
        if tag ~= nil then
            tag.Parent = nil
        end
    end
end
function CheckTableForInstance(Table, Instance)
    for i, v in pairs(Table) do
        if v == Instance then
            return true
        end
    end
    return false
end

function DealDamage(character, damage)
    if not CheckIfAlive() or not character then
        return
    end
    local damage = (damage or 0)
    local humanoid = character:FindFirstChild("Humanoid") or character:FindFirstChild("Enemy")
    local rootpart = character:FindFirstChild("HumanoidRootPart") or character:FindFirstChild("Torso")
    if not humanoid or humanoid.Health == 0 or not rootpart then
        return
    end
    UntagHumanoid(humanoid)
    TagHumanoid(humanoid, Player)
    humanoid:TakeDamage(damage)
end

function CheckIfAlive()
    return (((Character and Character.Parent and Humanoid and Humanoid.Parent and Humanoid.Health > 0) and true) or false)
end

function Blow(Part)
    local PartTouched
    local HitDelay = false
    PartTouched = Part.Touched:connect(function(Hit)
        if not Hit or not Hit.Parent or not CheckIfAlive() or not ToolEquipped or HitDelay then
            return
        end
        local RightArm = (Character:FindFirstChild("Right Arm") or Character:FindFirstChild("RightHand"))
        if not RightArm then
            return
        end
        local RightGrip = RightArm:FindFirstChild("RightGrip")
        if not RightGrip or (RightGrip.Part0 ~= Handle and RightGrip.Part1 ~= Handle) then
            return
        end
        local character = Hit.Parent
        if character == Character then
            return
        end
        local humanoid = character:FindFirstChild("Humanoid") or character:FindFirstChild("Enemy")
        if not humanoid or humanoid.Health == 0 then
            return
        end
        local player = Players:GetPlayerFromCharacter(character)
        if player and (player == Player or IsTeamMate(Player, player)) then
            return
        end
        HitDelay = true
        local TotalDamage = Damage
        DealDamage(character, TotalDamage)
        local Now = tick()
        wait(1)
        HitDelay = false
    end)
end

function Attack()
    Damage = DamageValues.SlashDamage + Player.Data.Sword.Value
    Sounds.Slash:Play()
    local SwingAnimations = ((Humanoid.RigType == Enum.HumanoidRigType.R6 and {Animations.R6LeftSlash, Animations.R6RightSlash, Animations.R6SideSwipe})
    or (Humanoid.RigType == Enum.HumanoidRigType.R15 and {Animations.R15LeftSlash, --[[Animations.R15RightSlash,]] Animations.R15SideSwipe}))
    local Animation = SwingAnimations[math.random(1, #SwingAnimations)]
    Spawn(function()
        InvokeClient("PlayAnimation", Animation)
    end)
    wait(1)
end

function Activated()
    if not Tool.Enabled or not ToolEquipped or not CheckIfAlive() then
        return
    end
    Tool.Enabled = false
    Attack()
    Damage = DamageValues.BaseDamage
    Tool.Enabled = true
end

function CheckIfAlive()
    return (((Player and Player.Parent and Character and Character.Parent and Humanoid and Humanoid.Parent and Humanoid.Health > 0 and RootPart and RootPart.Parent) and true) or false)
end

function Equipped()
    Character = Tool.Parent
    Player = Players:GetPlayerFromCharacter(Character)
    Humanoid = Character:FindFirstChild("Humanoid")
    RootPart = Character:FindFirstChild("HumanoidRootPart")
    if not CheckIfAlive() then
        return
    end
    Humanoid.WalkSpeed = (14)
    Sounds.Unsheath:Play()
    ToolEquipped = true
end

function Unequipped()
    if CheckIfAlive() then
        Humanoid.WalkSpeed = 16
    end
    ToolEquipped = false
end

function OnServerInvoke(player, mode, value)
    if player ~= Player or not ToolEquipped or not value or not CheckIfAlive() then
        return
    end
end

function InvokeClient(Mode, Value)
    local ClientReturn = nil
    pcall(function()
        ClientReturn = ClientControl:InvokeClient(Player, Mode, Value)
    end)
    return ClientReturn
end

ServerControl.OnServerInvoke = OnServerInvoke

Tool.Activated:connect(Activated)
Tool.Equipped:connect(Equipped)
Tool.Unequipped:connect(Unequipped)

Blow(Handle)

Answer this question