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)
Closed as Not Constructive by Goulstem and adark
This question has been closed because it is not constructive to others or the asker. Most commonly, questions that are requests with no attempt from the asker to solve their problem will fall into this category.
Why was this question closed?