I have been failing for days to create a sword that works the way I need it too and also not do any team damage to players. I have resorted to searching around for a tool that has the features I need and I came really close. This script is the classic sword that was re written and it functions fairly well. The only problem is the lunge attack is broken. After lunging the script stops working until the sword if unequiped and reequiped.
But that’s alright. I dont need the lunge and dont even like the lunge. I have been trying to disable the lunge and still have the sword function. I have not been successful. If i disable what I think should be disabled it breaks the sword.
Can someone show me how to disable the lunge and still have the sword function? If so I can modify the rest by putting a new appearance on the handle and changing the animations.
--[[
Rewritten by ArceusInator
This script is the Sword module. This runs on either the server (when FilteringEnabled is on) or the client (when FilteringEnabled is off)
--]]
local Tool = script.Parent
local Handle = Tool.Handle
local Config = Tool:WaitForChild'Configurations'
local Sword = {
-- Advanced settings
DoubleClickMaxTime = 0.2,
LocalDoubleClickMaxTime = 0.2,
-- Variables
State = 'Idle', -- Idle, Slashing, Lunging
LocalState = 'Idle',
SlashingStartedAt = 0,
LocalSlashingStartedAt = 0,
AttackTicket = 0,
LocalAttackTicket = 0,
DestroyOnUnequip = {}
}
local GLib = require(Tool:WaitForChild'GLib') -- Library of useful functions
--
--
function Sword:Connect()
Handle.Touched:connect(function(hit)
local myPlayer = GLib.GetPlayerFromPart(Tool)
local character, player, humanoid = GLib.GetCharacterFromPart(hit)
if myPlayer~=nil and character~=nil and humanoid~=nil and myPlayer~=player then
local isTeammate = GLib.IsTeammate(myPlayer, player)
local myCharacter = myPlayer.Character
local myHumanoid = myCharacter and myCharacter:FindFirstChild'Humanoid'
if (Config.CanTeamkill.Value==true or isTeammate~=true) and (myHumanoid and myHumanoid:IsA'Humanoid' and myHumanoid.Health > 0) and (Config.CanKillWithForceField.Value or myCharacter:FindFirstChild'ForceField'==nil) then
local doDamage = Config.IdleDamage.Value
if Sword.State == 'Slashing' then
doDamage = Config.SlashDamage.Value
elseif Sword.State == 'Lunging' then
doDamage = Config.LungeDamage.Value
end
GLib.TagHumanoid(humanoid, myPlayer, 1)
humanoid:TakeDamage(doDamage)
end
end
end)
end
function Sword:Attack()
local myCharacter, myPlayer, myHumanoid = GLib.GetCharacterFromPart(Tool)
if myHumanoid~=nil and myHumanoid.Health > 0 then
if Config.CanKillWithForceField.Value or myCharacter:FindFirstChild'ForceField'==nil then
local now = tick()
if Sword.State == 'Slashing' and now-Sword.SlashingStartedAt < Sword.DoubleClickMaxTime then
Sword.AttackTicket = Sword.AttackTicket+1
Sword:Lunge(Sword.AttackTicket)
elseif Sword.State == 'Idle' then
Sword.AttackTicket = Sword.AttackTicket+1
Sword.SlashingStartedAt = now
Sword:Slash(Sword.AttackTicket)
end
end
end
end
function Sword:LocalAttack()
local myCharacter, myPlayer, myHumanoid = GLib.GetCharacterFromPart(Tool)
if myHumanoid~=nil and myHumanoid.Health > 0 then
if Config.CanKillWithForceField.Value or myCharacter:FindFirstChild'ForceField'==nil then
local now = tick()
if Sword.LocalState == 'Slashing' and now-Sword.LocalSlashingStartedAt < Sword.LocalDoubleClickMaxTime then
Sword.LocalAttackTicket = Sword.LocalAttackTicket+1
Sword:LocalLunge(Sword.LocalAttackTicket)
elseif Sword.LocalState == 'Idle' then
Sword.LocalAttackTicket = Sword.LocalAttackTicket+1
Sword.LocalSlashingStartedAt = now
Sword:LocalSlash(Sword.LocalAttackTicket)
end
end
end
end
function Sword:Slash(ticket)
Sword.State = 'Slashing'
Handle.SlashSound:Play()
Sword:Animate'Slash'
wait(0.5)
if Sword.AttackTicket == ticket then
Sword.State = 'Idle'
end
end
function Sword:LocalSlash(ticket)
Sword.LocalState = 'Slashing'
wait(0.5)
if Sword.LocalAttackTicket == ticket then
Sword.LocalState = 'Idle'
end
end
function Sword:Lunge(ticket)
Sword.State = 'Lunging'
Handle.LungeSound:Play()
Sword:Animate'Lunge'
local force = Instance.new'BodyVelocity'
force.velocity = Vector3.new(0, 10, 0)
force.maxForce = Vector3.new(0, 4000, 0)
force.Parent = Tool.Parent.Torso
Sword.DestroyOnUnequip[force] = true
wait(0.25)
Tool.Grip = CFrame.new(0, 0, -1.5, 0, -1, -0, -1, 0, -0, 0, 0, -1)
wait(0.25)
force:Destroy()
Sword.DestroyOnUnequip[force] = nil
wait(0.5)
Tool.Grip = CFrame.new(0, 0, -1.5, 0, 0, 1, 1, 0, 0, 0, 1, 0)
Sword.State = 'Idle'
end
function Sword:LocalLunge(ticket)
Sword.LocalState = 'Lunging'
wait(0.25)
wait(0.25)
wait(0.5)
Sword.LocalState = 'Idle'
end
function Sword:Animate(name)
local tag = Instance.new'StringValue'
tag.Name = 'toolanim'
tag.Value = name
tag.Parent = Tool -- Tag gets removed by the animation script
end
function Sword:Unequip()
for obj in next, Sword.DestroyOnUnequip do
obj:Destroy()
end
Sword.DestroyOnUnequip = {}
Tool.Grip = CFrame.new(0, 0, -1.5, 0, 0, 1, 1, 0, 0, 0, 1, 0)
Sword.State = 'Idle'
Sword.LocalState = 'Idle'
end
--
function Sword:Initialize()
Sword:Connect()
end
--
--
return Sword
This is the classic sword FE in the toolbox of the game studio if anyone was wondering.