hello. so, put simply, i have no idea what is wrong with this script. if the Equipped event is put before the Unequipped event, the equipped event works normally, but as a result the Unequipped event never fires. but, if the Unequipped event is before the equipped event, the function the Equipped event calls breaks, as a result of the function called in the Unequipped event being called before it for... some reason? i tried reproducing the effect in another tool, but it works perfectly fine there no matter the position of the equipped and unequipped events.
here is the offending code (sorry for the semi-wall):
function EndAnimation()
local p = weapon_parts[1]:GetChildren()
for i = 1, #p do
if p[i].className == "Sound" then
p[i]:Destroy()
end
end
if motors[1] then
motors[1].Part1 = character:findFirstChild("Left Arm")
end
if motors[2] then
motors[2].Part1 = character:findFirstChild("Right Arm")
end
if welds[1] then
welds[1]:remove()
welds[1] = nil
end
if welds[2] then
welds[2]:remove()
welds[2] = nil
end
weapon_parts[1].Parent = nil
if weapon_model then
weapon_model.Parent = nil
end
coroutine.resume(coroutine.create(function()
if weapon_model then
local swm = weapon_model
wait()
swm.Parent = nil
wait(0.1)
swm.Parent = nil
wait(0.5)
swm.Parent = nil
end
end))
end
--WeaponAnimation is the viewmodel reference
--WeaponObject is the world model (object that the character holds)
function StartAnimation()
if humanoid.Health <= 0 then return end
local check = {torso:findFirstChild("LeftWeld"), torso:findFirstChild("RightWeld")}
if check[1] then check[1]:remove() end
if check[2] then check[2]:remove() end
local check2 = {character:findFirstChild("WeaponObject")}
if check2[1] then check2[1].Parent = nil end
if motors[1] then
motors[1].Part1 = nil
end
welds = {Instance.new(conn_type), Instance.new(conn_type)}
welds[1].Part0 = torso
welds[2].Part0 = torso
welds[1].Part1 = character:findFirstChild("Left Arm")
welds[2].Part1 = character:findFirstChild("Right Arm")
welds[1].Name = "LeftWeld"
welds[2].Name = "RightWeld"
welds[1].C0 = CFrame.new(-1.5, 0, 0)
welds[2].C0 = CFrame.new(1.5, 0, 0)
welds[1].Parent = torso
welds[2].Parent = torso
weapon_parts[1].Parent = character
local wep_weld = Instance.new(conn_type)
wep_weld.Part0 = character:findFirstChild("Right Arm")
wep_weld.Part1 = weapon_parts[1]
wep_weld.C0 = CFrame.new()
wep_weld.Parent = weapon_parts[1]
local weld1 = welds[1]
local weld2 = welds[2]
local r_serv = game:GetService("RunService")
local move_anim_speed = 3
local last_p = Vector3.new()
local move_amm = 0
coroutine.resume(coroutine.create(function()
while weld1.Parent ~= nil do
local delta = wait()
local cur_p = torso.Position
if (cur_p - last_p).magnitude >= 0.1 and humanoid.Jump == false then
move_amm = math.min(1, move_amm + delta * move_anim_speed)
else
move_amm = math.max(0, move_amm - delta * move_anim_speed)
end
last_p = cur_p
end
end))
local last_va = 0
local last_va2 = 0
local view_velocity = {0, 0}
coroutine.resume(coroutine.create(function()
wait()
local last_time = tick()
while weld1.Parent ~= nil do
r_serv.Heartbeat:wait() ------------------------------------------------
if humanoid.Health <= 0 then return end
local delta = tick() - last_time
last_time = tick()
local breathe_amp = 3
local breathe_freq = 1
local breathe = math.sin(math.rad(tick() * 40 * breathe_freq)) * breathe_amp
local shake_freq = 10
local shake_amp = {0.15, 0.15}
local arm_shake = CFrame.new(
math.sin(math.rad(tick() * 45 * shake_freq)) * move_amm * shake_amp[1],
0,
math.abs(math.cos(math.rad(tick() * 45 * shake_freq)) * move_amm * shake_amp[2]))
local anmtp = _G.AnimType
local anmst = _G.AnimState
local view_angle = 0
if anmst == nil then
anmst = 0
end
if anmtp ~= nil then
if Animations[anmtp] == nil then
anmtp = "Default"
end
else
anmtp = "Default"
end
local curr_anim = PlayAnimation(anmtp, anmst) --left, right, weapon, wep trans
local chestCF = CFrame.new(0, 0.5, 0) * CFrame.Angles(math.rad(math.max(-rot_amplitude_chest, math.min(rot_amplitude_chest, view_angle)) + 90 + breathe), 0, 0)
weld1.C1 = (chestCF * curr_anim[1] * CFrame.new(0, -0.5, 0)):inverse()
weld2.C1 = (chestCF * curr_anim[2] * CFrame.new(0, -0.5, 0)):inverse()
wep_weld.C1 = (curr_anim[3] * CFrame.new(0,0,-0)):inverse()
end
end))
end
local last_st = 0
local eq = false
tool.Unequipped:connect(function()
eq = false
EndAnimation()
end)
tool.Equipped:connect(function()
if eq then return end
eq = true
StartAnimation()
end)

1 comment
maybe use :Connect() instead of :connect() as that's deprecated?