I have a throwable knife in my game. But, when you click and hold, it starts to move up. I want it to stay up (Like Twisted Murder) until the player releases the left click button. When the player releases the knife will throw.
Here is the knife script:
--------------------- TEMPLATE BLADE WEAPON --------------------------- -- Waits for the child of the specified parent local function WaitForChild(parent, childName) while not parent:FindFirstChild(childName) do parent.ChildAdded:wait() end return parent[childName] end
local SLASH_DAMAGE = 100 local DOWNSTAB_DAMAGE = 100 local THROWING_DAMAGE = 100 local HOLD_TO_THROW_TIME = 0.35
local Damage = 100
local MyHumanoid = nil local MyTorso = nil local MyCharacter = nil local MyPlayer = nil
local Tool = script.Parent local Handle = WaitForChild(Tool, 'Handle')
local BlowConnection local Button1DownConnection local Button1UpConnection
local PlayStabPunch local PlayDownStab local PlayThrow local PlayThrowCharge
local IconUrl = Tool.TextureId -- URL to the weapon knife icon asset
local DebrisService = game:GetService('Debris') local PlayersService = game:GetService('Players')
local SlashSound
local HitPlayers = {}
local LeftButtonDownTime = nil
local Attacking = false
function Blow(hit) if Attacking then BlowDamage(hit, Damage) end end
function BlowDamage(hit, damage) local humanoid = hit.Parent:FindFirstChild('Humanoid') local player = PlayersService:GetPlayerFromCharacter(hit.Parent) if humanoid ~= nil and MyHumanoid ~= nil and humanoid ~= MyHumanoid then if not MyPlayer.Neutral then -- Ignore teammates hit if player and player ~= MyPlayer and player.TeamColor == MyPlayer.TeamColor then return end end -- final check, make sure weapon is in-hand local rightArm = MyCharacter:FindFirstChild('Right Arm') if (rightArm ~= nil) then -- Check if the weld exists between the hand and the weapon local joint = rightArm:FindFirstChild('RightGrip') if (joint ~= nil and (joint.Part0 == Handle or joint.Part1 == Handle)) then -- Make sure you only hit them once per swing TagHumanoid(humanoid, MyPlayer) print("Sending " .. damage)
local checksound = humanoid.Parent:findFirstChild("Sound")
if checksound == nil then
local givesound = script.Parent.Sound:clone()
givesound.Parent = humanoid.Parent
givesound.Disabled = false
else
checksound:remove()
local givesound = script.Parent.Sound:clone()
givesound.Parent = humanoid.Parent
givesound.Disabled = false
end
wait()
humanoid:TakeDamage(humanoid.MaxHealth)
if humanoid.Health == math.huge or humanoid.MaxHealth == math.huge then
humanoid.Parent:BreakJoints()
end
end
end
end
end
function TagHumanoid(humanoid, player) -- Add more tags here to customize what tags are available. while humanoid:FindFirstChild('creator') do humanoid:FindFirstChild('creator'):Destroy() end
local creatorTag = Instance.new('ObjectValue')
creatorTag.Value = player
creatorTag.Name = 'creator'
creatorTag.Parent = humanoid
DebrisService:AddItem(creatorTag, 1.5)
local weaponIconTag = Instance.new('StringValue')
weaponIconTag.Value = IconUrl
weaponIconTag.Name = 'icon'
weaponIconTag.Parent = creatorTag
DebrisService:AddItem(weaponIconTag, 1.5)
end
function HardAttack() Damage = SLASH_DAMAGE HitSound:play() if PlayStabPunch then PlayStabPunch.Value = true wait(1.0) PlayStabPunch.Value = false end end
function NormalAttack() Damage = DOWNSTAB_DAMAGE KnifeDown() HitSound:play() if PlayDownStab then PlayDownStab.Value = true wait(1.0) PlayDownStab.Value = false end KnifeUp() end
function ThrowAttack() KnifeOut() if PlayThrow then PlayThrow.Value = true wait() if not Handle then return end local throwingHandle = Handle:Clone() DebrisService:AddItem(throwingHandle, 5) throwingHandle.Parent = game.Workspace if MyCharacter and MyHumanoid then throwingHandle.Velocity = (MyHumanoid.TargetPoint - throwingHandle.CFrame.p).unit * 100 -- set the orientation to the direction it is being thrown in throwingHandle.CFrame = CFrame.new(throwingHandle.CFrame.p, throwingHandle.CFrame.p + throwingHandle.Velocity) * CFrame.Angles(0, 0, math.rad(-90)) local floatingForce = Instance.new('BodyForce', throwingHandle) floatingForce.force = Vector3.new(0, 196.2 * throwingHandle:GetMass() * 0.98, 0) local spin = Instance.new('BodyAngularVelocity', throwingHandle) spin.angularvelocity = throwingHandle.CFrame:vectorToWorldSpace(Vector3.new(0, -400, 0)) end Handle.Transparency = 1 -- Wait so that the knife has left the thrower's general area wait() if throwingHandle then local Throwevent = script.Parent.ThrowHandleHitWeld:Clone() Throwevent.Parent = throwingHandle Throwevent.Disabled = false local touchedConn = throwingHandle.Touched:connect(function(hit) print("hit throw") BlowDamage(hit, THROWING_DAMAGE) end) end -- must check if it still exists since we waited if throwingHandle then throwingHandle.CanCollide = true end wait(0.6) if Handle and PlayThrow then Handle.Transparency = 0 PlayThrow.Value = false end end KnifeUp() end
function KnifeUp() Tool.GripForward = Vector3.new(0,0,-1) Tool.GripRight = Vector3.new(1,0,0) Tool.GripUp = Vector3.new(0,1,0) end
function KnifeDown() Tool.GripForward = Vector3.new(0,0,-1) Tool.GripRight = Vector3.new(1,0,0) Tool.GripUp = Vector3.new(0,-1,0) end
function KnifeOut() Tool.GripForward = Vector3.new(0,0,-1) Tool.GripRight = Vector3.new(1,0,0) Tool.GripUp = Vector3.new(0,1,0) end
Tool.Enabled = true
function OnLeftButtonDown() LeftButtonDownTime = time() if PlayThrowCharge then PlayThrowCharge.Value = true end end
function OnLeftButtonUp() if not Tool.Enabled then return end -- Reset the list of hit players every time we start a new attack HitPlayers = {} if PlayThrowCharge then PlayThrowCharge.Value = false end if Tool.Enabled and MyHumanoid and MyHumanoid.Health > 0 then Tool.Enabled = false local currTime = time() if LeftButtonDownTime and currTime - LeftButtonDownTime > HOLD_TO_THROW_TIME and currTime - LeftButtonDownTime < 1.15 then ThrowAttack() else Attacking = true if math.random(1, 2) == 1 then HardAttack() else NormalAttack() end Attacking = false end Tool.Enabled = true end end
function OnEquipped(mouse) PlayStabPunch = WaitForChild(Tool, 'PlayStabPunch') PlayDownStab = WaitForChild(Tool, 'PlayDownStab') PlayThrow = WaitForChild(Tool, 'PlayThrow') PlayThrowCharge = WaitForChild(Tool, 'PlayThrowCharge') SlashSound = WaitForChild(Handle, 'Swoosh1') HitSound = WaitForChild(Handle, 'Ting') SlashSound:play() BlowConnection = Handle.Touched:connect(Blow) MyCharacter = Tool.Parent MyTorso = MyCharacter:FindFirstChild('Torso') MyHumanoid = MyCharacter:FindFirstChild('Humanoid') MyPlayer = PlayersService.LocalPlayer if mouse then Button1DownConnection = mouse.Button1Down:connect(OnLeftButtonDown) Button1UpConnection = mouse.Button1Up:connect(OnLeftButtonUp) end KnifeUp() end
function OnUnequipped() -- Unequip logic here if BlowConnection then BlowConnection:disconnect() BlowConnection = nil end if Button1DownConnection then Button1DownConnection:disconnect() Button1DownConnection = nil end if Button1UpConnection then Button1UpConnection:disconnect() Button1UpConnection = nil end MyHumanoid = nil end
Tool.Equipped:connect(OnEquipped) Tool.Unequipped:connect(OnUnequipped)

4 comments
Please post your code so we can actually help you.
Show us what you have done so far and a part of the knife script.
Guessing it's Roblox's Knife in their CTF Template
There, I posted the script the knife is equipped with.