Hello! I am currently making a murder mystery game on Roblox and I am having issues with the throwing. Simply when I press E (the throw knife button) the throwing animation plays on every other part except the arm with the knife and the knife doesn't release or throw it just stays in the hand. I don't know what I am doing wrong, and that is why I am here. Please help! Code listed below:
-- Basic settings local ALLOWED_DISTANCE = 8 local XP_PER_KILL = script.Parent.KillXP.Value local tool = script.Parent local debounce = false local throwCooldown = false local allowedToHit = false local throwType = 0 local lastMouseHitPos = nil local toolPlr local animDraw = nil local animStab = { nil, nil, nil } local animThrow = nil function enableEffects() -- Enable em for _, i in pairs(tool.Handle:GetChildren()) do if i.Name == "Effect" then i.Enabled = true end end end function disableEffects() -- Disable em for _, i in pairs(tool.Handle:GetChildren()) do if i.Name == "Effect" then i.Enabled = false i:Clear() end end end script.HitPlayer.OnServerEvent:connect(function(plr, hit) -- Make sure the hit is valid if hit == nil or hit.Parent == nil then return end -- Check if player (and not this player) if hit.Parent:FindFirstChild("Humanoid") and allowedToHit and plr == toolPlr then local chr = hit.Parent if chr ~= tool.Parent and chr.Humanoid.Health > 0 then -- Check if not on same team local okay = true local otherPlr = game.Players:GetPlayerFromCharacter(chr) if chr:FindFirstChild("Knife") then if chr.Knife.TeamColor.Value == tool.TeamColor.Value then okay = false end end if chr:FindFirstChild("Revolver") then if chr.Revolver.TeamColor.Value == tool.TeamColor.Value then okay = false end end if otherPlr.Backpack:FindFirstChild("Knife") then if otherPlr.Backpack.Knife.TeamColor.Value == tool.TeamColor.Value then okay = false end end if otherPlr.Backpack:FindFirstChild("Revolver") then if otherPlr.Backpack.Revolver.TeamColor.Value == tool.TeamColor.Value then okay = false end end -- Tell server to hit if okay and math.abs((hit.Position - tool.Handle.Position).Magnitude) <= ALLOWED_DISTANCE then -- Kill the player local chr = hit.Parent chr.Humanoid.Health = 0 game.ServerScriptService.Functions.GameDeath:Fire(chr, (chr.Torso.Position - tool.Parent.Torso.Position).Unit, tool.Effect.Value) -- Award XP if XP_PER_KILL > 0 then local plr = game.Players:GetPlayerFromCharacter(tool.Parent) game.ServerScriptService.Functions.GiveXP:Fire(plr, XP_PER_KILL, 0) end plr.Achievements.StabKills.Value = plr.Achievements.StabKills.Value + 1 -- Play hit sound and effect game.ReplicatedStorage.Interactions.Client.PlaySound:FireAllClients(tool.Handle.Hit) game.ReplicatedStorage.Interactions.Client.RunKillFlash:FireClient(toolPlr) end end end end) script.ClientStab.OnServerEvent:connect(function(plr) -- Make sure correct player if plr ~= toolPlr then return end -- See if should if not debounce then debounce = true -- Allow hitting other players allowedToHit = true -- Play the stab animation animStab[math.random(1, #animStab)]:Play() wait(0.2) game.ReplicatedStorage.Interactions.Client.PlaySound:FireAllClients(tool.Handle.Swing) end end) script.ClientThrow.OnServerEvent:connect(function(plr) -- Make sure correct player if plr ~= toolPlr then return end -- See if should if not debounce and not throwCooldown then debounce = true -- Play the throw animation animThrow:Play() throwType = 0 end end) script.ClientThrowStart.OnServerEvent:connect(function(plr) -- Make sure correct player if plr ~= toolPlr then return end -- See if should if not debounce and not throwCooldown and not animThrow.IsPlaying then debounce = true -- Play the throw animation animThrow:Play() throwType = 1 end end) script.ClientThrowEnd.OnServerEvent:connect(function(plr, hitPos) -- Make sure correct player if plr ~= toolPlr then return end -- See if should if animThrow.IsPlaying and animThrow.Speed == 0 then -- Finish the throw animation lastMouseHitPos = hitPos animThrow:AdjustSpeed(1) end end) tool.Equipped:connect(function() -- Set player toolPlr = game.Players:GetPlayerFromCharacter(tool.Parent) -- Load anim draw animDraw = tool.Parent.Humanoid:LoadAnimation(script.KnifeDraw) animDraw.Stopped:connect(function() tool.Handle.Transparency = 0 debounce = false end) -- Load anim stabs animStab[1] = tool.Parent.Humanoid:LoadAnimation(script.KnifeStab1) animStab[1].Stopped:connect(function() allowedToHit = false debounce = false tool.Handle.Transparency = 0 end) animStab[2] = tool.Parent.Humanoid:LoadAnimation(script.KnifeStab2) animStab[2].KeyframeReached:connect(function(name) if name == "Beginning" then tool.Grip = tool.NormalGrip.Value * CFrame.Angles(0, 0, math.pi) end end) animStab[2].Stopped:connect(function() tool.Grip = tool.NormalGrip.Value allowedToHit = false debounce = false tool.Handle.Transparency = 0 end) animStab[3] = tool.Parent.Humanoid:LoadAnimation(script.KnifeStab3) animStab[3].Stopped:connect(function() allowedToHit = false debounce = false tool.Handle.Transparency = 0 end) -- Load anim throw animThrow = tool.Parent.Humanoid:LoadAnimation(script.KnifeThrow) animThrow.KeyframeReached:connect(function(name) if name == "Peak" and tool.Parent.ClassName ~= "Backpack" and throwType == 1 then -- Pause the animation animThrow:AdjustSpeed(0) elseif name == "Throw" and tool.Parent.ClassName ~= "Backpack" then -- Set up the knife projectile local copy = tool.Handle:clone() copy.Name = "KnifeProjectile" copy.Transparency = 0 copy.Anchored = true local scr = script.KnifeProjectileScript:clone() scr.Owner.Value = tool.Parent scr.TeamColor.Value = tool.TeamColor.Value local hitPos = nil if throwType == 0 then hitPos = script.ServerGetMouseHitPosition:InvokeClient(toolPlr) elseif throwType == 1 then hitPos = lastMouseHitPos end scr.Velocity.Value = (hitPos - copy.Position).Unit * script.KnifeThrowSpeed.Value scr.Effect.Value = tool.Effect.Value scr.RotateAxis.Value = tool.RotateAxis.Value scr.GripCFrame.Value = (tool.NormalGrip.Value - tool.NormalGrip.Value.p):inverse() scr.Parent = copy -- Place in workspace copy.Parent = workspace scr.Disabled = false -- Make normal knife invisible tool.Handle.Transparency = 1 disableEffects() -- Activate cooldown throwCooldown = true spawn(function() wait(0.5) tool.Handle.Transparency = 0 debounce = false wait(script.KnifeThrowCooldown.Value - 0.5) throwCooldown = false end) end end) animThrow.Stopped:connect(function() if tool.Parent.ClassName ~= "Backpack" and tool.Handle.Transparency >= 1 then tool.Handle.Transparency = 0 animDraw:Play() enableEffects() game.ReplicatedStorage.Interactions.Client.PlaySound:FireAllClients(tool.Handle.Draw) else tool.Handle.Transparency = 0 enableEffects() debounce = false end end) -- Draw the knife debounce = false animDraw:Play() enableEffects() game.ReplicatedStorage.Interactions.Client.PlaySound:FireAllClients(tool.Handle.Draw) tool.Handle.Transparency = 0 -- Make display knife invisible if tool.Parent:FindFirstChild("DisplayKnife") then tool.Parent.DisplayKnife.Transparency = 1 for _, i in pairs(tool.Parent.DisplayKnife:GetChildren()) do if i.ClassName ~= "SpecialMesh" and i.ClassName ~= "Weld" then i.Enabled = false end end end end) tool.Unequipped:connect(function() -- Destroy animation tracks animThrow:Stop() animThrow:destroy() animDraw:Stop() animDraw:destroy() for i=1, 3 do animStab[i]:Stop() animStab[i]:destroy() end -- Make display knife visible local chr = tool.Parent if tool.Parent ~= nil and tool.Parent.ClassName == "Backpack" then chr = tool.Parent.Parent.Character end if chr ~= nil then if chr:FindFirstChild("DisplayKnife") then chr.DisplayKnife.Transparency = 0 for _, i in pairs(chr.DisplayKnife:GetChildren()) do if i.ClassName ~= "SpecialMesh" and i.ClassName ~= "Weld" then i.Enabled = true end end end end end)
hey you! have you ever heard of enes? if you are in trouble, better call enes!