Hey, so I want my script to do the holding animation if the player is holding the E key, but if the player lets go of it while the animation is playing then it will play the punch animation and finally do the ice summoning. If the player doesnt let go of it then it will do the holding animation and wait 5 seconds and then play the punch anim and do the ice spikes.
local uis = game:GetService("UserInputService")
local tool = script.Parent
local rs = game:GetService("ReplicatedStorage")
local modules = rs.Modules
local fruitmodules = modules.Fruit
local module = require(fruitmodules["Devil Fruits"])
local Player = game.Players.LocalPlayer
local ts = game:GetService("TweenService")
local tweeninfo = TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local Mouse = Player:GetMouse()
local function xmove(plr)
print(tostring(plr))
end
local function zmove()
script.Parent.SFX["Ice Spikes"].Summon:Play()
module.Hie.Spike(Player, 3)
wait(3)
script.Parent.SFX["Ice Spikes"].Disappear:Play()
print("z move is active")
end
local cooldown = false
local holding = false
uis.InputBegan:Connect(function(inp, processed)
if script.Parent.Equip.Value == true then
local gui = Player.PlayerGui[tool.Name .. " Moveset"]
if inp.KeyCode == Enum.KeyCode.E then
if cooldown == false then
if holding == false then
holding = true
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.HoldIceSpikes)
track:Play()
Player.Character.Humanoid.WalkSpeed = 0
if holding == true then
wait(5)
cooldown = true
local track1 = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track1:Play()
track:Stop()
track1:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
Player.Character.Humanoid.WalkSpeed = 18
holding = false
end
end
end
end
end
end)
uis.InputEnded:Connect(function(inp, processed)
if script.Parent.Equip.Value == true then
if inp.KeyCode == Enum.KeyCode.E then
if cooldown == false then
if holding == false then
holding = true
cooldown = true
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track:Play()
track:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
Player.Character.Humanoid.WalkSpeed = 0
zmove()
wait(3)
cooldown = false
end)
Player.Character.Humanoid.WalkSpeed = 18
holding = false
end
end
end
end
end)
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local HoldingTime = 0
local IsHolding = false
UserInputService.InputBegan:Connect(function(Input, IsChatting)
if not IsChatting and Input.KeyCode == Enum.KeyCode.E then
IsHolding = true
print("Holding")
end
end)
UserInputService.InputEnded:Connect(function(Input)
-- We dont need to detect the IsChatting method for this one
-- If im not wrong holding E and then pressing / and releasing E,
-- This function will not fire.
if Input.KeyCode == Enum.KeyCode.E then
IsHolding = false
print(HoldingTime)
HoldingTime = 0
end
end)
RunService.Heartbeat:Connect(function(TimeElapsed)
if IsHolding then
HoldingTime += TimeElapsed
end
end)
Maybe it’s not the best way, I find it reliable
You can adjust the scripts and mix them together to make it compatible. oK bye
local uis = game:GetService("UserInputService")
local tool = script.Parent
local rs = game:GetService("ReplicatedStorage")
local modules = rs.Modules
local fruitmodules = modules.Fruit
local module = require(fruitmodules["Devil Fruits"])
local Player = game.Players.LocalPlayer
local ts = game:GetService("TweenService")
local tweeninfo = TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local function xmove(plr)
print(tostring(plr))
end
local function zmove()
script.Parent.SFX["Ice Spikes"].Summon:Play()
module.Hie.Spike(Player, 3)
wait(3)
script.Parent.SFX["Ice Spikes"].Disappear:Play()
print("z move is active")
end
local cooldown = false
local HoldingTime = 0
local IsHolding = false
uis.InputBegan:Connect(function(Input, isHold)
if not isHold and Input.KeyCode == Enum.KeyCode.E then
if cooldown == false then
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.HoldIceSpikes)
track:Play()
IsHolding = true
wait(5)
cooldown = true
local track1 = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track1:Play()
track:Stop()
track1:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
print("Holding")
end
end
end)
uis.InputEnded:Connect(function(Input)
if Input.KeyCode == Enum.KeyCode.E then
if cooldown == false then
cooldown = true
IsHolding = false
print(HoldingTime)
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track:Play()
track:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
HoldingTime = 0
end
end
end)
the isHold is actually to tell if the game has processed the keycode or not (if it’s used for chatting etc.)
and what you’re doing right now is registering whenever the keycode is E.
Instead, if you want to register how long the player held the key and if the person is still holding it, you should do something like
local holdingTime = 0
local boolEndHold = false
uis.InputChanged:Connect(function(inputObject, gameProcessedBool)
if not gameProcessedBool and inputObject.KeyCode == Enum.KeyCode.E then
if inputObject.UserInputState == Enum.UserInputState.Begin then
task.spawn(function()
while not boolEndHold do
wait(1)
holdingTime += 1
end
end)
-- your code for when player starts holding key
elseif inputObject.UserInputState == Enum.UserInputState.End then
boolEndHold = false
print("Held key for "..tostring(holdingTime).." seconds!")
-- your code for when player stopped holding key
end
end
end)
You might also want to halt any other playing animations on the animator/humanoid before playing a new one
local uis = game:GetService("UserInputService")
local tool = script.Parent
local rs = game:GetService("ReplicatedStorage")
local modules = rs.Modules
local fruitmodules = modules.Fruit
local module = require(fruitmodules["Devil Fruits"])
local Player = game.Players.LocalPlayer
local ts = game:GetService("TweenService")
local tweeninfo = TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local RunService = game:GetService("RunService")
local function xmove(plr)
print(tostring(plr))
end
local function zmove()
script.Parent.SFX["Ice Spikes"].Summon:Play()
module.Hie.Spike(Player, 3)
wait(3)
script.Parent.SFX["Ice Spikes"].Disappear:Play()
print("z move is active")
end
local cooldown = false
local HoldingTime = 0
local IsHolding = false
uis.InputChanged:Connect(function(inputObject, gameProcessedBool)
if not gameProcessedBool and inputObject.KeyCode == Enum.KeyCode.E then
if inputObject.UserInputState == Enum.UserInputState.Begin then
task.spawn(function()
while not IsHolding do
wait(1)
HoldingTime += 1
end
end)
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.HoldIceSpikes)
track:Play()
wait(5)
cooldown = true
local track1 = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track1:Play()
track:Stop()
track1:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
print("Holding")
elseif inputObject.UserInputState == Enum.UserInputState.End then
IsHolding = false
print("Held key for "..tostring(HoldingTime).." seconds!")
if cooldown == false then
cooldown = true
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track:Play()
track:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
end
end
end
end)
uis.InputChanged:Connect(function(inputObject, gameProcessedBool)
if not gameProcessedBool and inputObject.KeyCode == Enum.KeyCode.E then
if inputObject.UserInputState == Enum.UserInputState.Begin then
task.spawn(function()
while not IsHolding do
wait(1)
HoldingTime += 1
end
end)
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.HoldIceSpikes)
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
track:Play()
wait(5)
cooldown = true
local track1 = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
track1:Play()
track:Stop()
track1:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
print("Holding")
elseif inputObject.UserInputState == Enum.UserInputState.End then
IsHolding = false
print("Held key for "..tostring(HoldingTime).." seconds!")
if cooldown == false then
cooldown = true
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
track:Play()
track:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
end
end
end
end)
local uis = game:GetService("UserInputService")
local tool = script.Parent
local rs = game:GetService("ReplicatedStorage")
local modules = rs.Modules
local fruitmodules = modules.Fruit
local module = require(fruitmodules["Devil Fruits"])
local Player = game.Players.LocalPlayer
local ts = game:GetService("TweenService")
local tweeninfo = TweenInfo.new(10, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local RunService = game:GetService("RunService")
local function xmove(plr)
print(tostring(plr))
end
local function zmove()
script.Parent.SFX["Ice Spikes"].Summon:Play()
module.Hie.Spike(Player, 3)
wait(3)
script.Parent.SFX["Ice Spikes"].Disappear:Play()
print("z move is active")
end
local cooldown = false
local HoldingTime = 0
local IsHolding = false
uis.InputChanged:Connect(function(inputObject, gameProcessedBool)
if script.Parent.Equip.Value == true then
if not gameProcessedBool and inputObject.KeyCode == Enum.KeyCode.E then
if inputObject.UserInputState == Enum.UserInputState.Begin then
task.spawn(function()
while not IsHolding do
wait(1)
HoldingTime += 1
end
end)
if cooldown == false then
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.HoldIceSpikes)
track:Play()
wait(5)
cooldown = true
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
local track1 = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track1:Play()
track:Stop()
track1:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
print("Holding")
end
elseif inputObject.UserInputState == Enum.UserInputState.End then
IsHolding = false
print("Held key for "..tostring(HoldingTime).." seconds!")
if cooldown == false then
cooldown = true
for _, animationTrack in pairs(Player.Character.Humanoid:GetPlayingAnimationTracks()) do
animationTrack:Stop()
end
local track = Player.Character.Humanoid:LoadAnimation(script.Parent.Animations.PunchIceSpikes)
track:Play()
track:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
wait(3)
cooldown = false
end)
end
end
end
end
end)
I did everything u said, it still doesn’t do anything at all, not even print, do I perhaps have to include the inputbegan?
local UIS = game:GetService("UserInputService")
local RS = game:GetService("ReplicatedStorage")
local Modules = RS:WaitForChild("Modules")
local Fruit = Modules:WaitForChild("Fruit")
local FM = Fruit:WaitForChild("Devil Fruits")
local FruitModule = require(FM)
local Tool = script.Parent
local ISSummon = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Summon")
local ISDisappear = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Disappear")
local Anims = Tool:WaitForChild("Animations")
local HIS = Anims:WaitForChild("HoldIceSpikes")
local PIS = Anims:WaitForChild("PunchIceSpikes")
local Player = game.Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local HISAnim = Humanoid:LoadAnimation(HIS)
local PISAnim = Humanoid:LoadAnimation(PIS)
local Cooldown = false
local Holding = false
local function zmove()
ISSummon:Play()
FruitModule.Hie.Spike(Player, 3)
task.wait(3)
ISDisappear:Play()
end
UIS.InputBegan:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
local Gui = PlayerGui[Tool.Name .. " Moveset"]
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown then
if not Holding then
Cooldown = true
Holding = true
HISAnim:Play()
Humanoid.WalkSpeed = 0
task.wait(5)
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
task.wait(3)
Cooldown = false
end)
Humanoid.WalkSpeed = 18
Holding = false
end
end
end
end
end)
UIS.InputEnded:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown then
if not Holding then
Cooldown = true
Holding = true
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
Humanoid.WalkSpeed = 0
zmove()
task.wait(3)
Cooldown = false
end)
Humanoid.WalkSpeed = 18
Holding = false
end
end
end
end
end)
Captain cleanup to the rescue. Load animations outside of event callbacks/loops to prevent reloading the same AnimationTrack instances repetitively. They only need to be loaded once, then they can be played as many times as you desire, I’ve also fixed up a few other things like stopping the HoldIceSpikes animation when the input ends.
it doesnt let me end the input and just forces me to do the hold animation then wait then punch animation, I cant end it midway and do the punch animation
local UIS = game:GetService("UserInputService")
local RS = game:GetService("ReplicatedStorage")
local Modules = RS:WaitForChild("Modules")
local Fruit = Modules:WaitForChild("Fruit")
local FM = Fruit:WaitForChild("Devil Fruits")
local FruitModule = require(FM)
local Tool = script.Parent
local ISSummon = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Summon")
local ISDisappear = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Disappear")
local Anims = Tool:WaitForChild("Animations")
local HIS = Anims:WaitForChild("HoldIceSpikes")
local PIS = Anims:WaitForChild("PunchIceSpikes")
local Player = game.Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local HISAnim = Humanoid:LoadAnimation(HIS)
local PISAnim = Humanoid:LoadAnimation(PIS)
local Cooldown1 = false
local Holding1 = false
local Cooldown2 = false
local Holding2 = false
local function zmove()
ISSummon:Play()
FruitModule.Hie.Spike(Player, 3)
task.wait(3)
ISDisappear:Play()
end
UIS.InputBegan:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
local Gui = PlayerGui[Tool.Name .. " Moveset"]
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown1 then
if not Holding1 then
Cooldown1 = true
Holding1 = true
HISAnim:Play()
Humanoid.WalkSpeed = 0
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
task.wait(3)
Cooldown1 = false
end)
task.wait(5)
Humanoid.WalkSpeed = 18
Holding1 = false
end
end
end
end
end)
UIS.InputEnded:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown2 then
if not Holding2 then
Cooldown2 = true
Holding2 = true
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
Humanoid.WalkSpeed = 0
zmove()
task.wait(3)
Cooldown2 = false
end)
Humanoid.WalkSpeed = 18
Holding2 = false
end
end
end
end
end)
I’ve moved the yielding function (wait) until after the animations are played and created 2 additional variables for the InputEnded event.
I want the ice spikes animation to activate when the player is holding the key for 5 seconds, I gtg, just post ur reply ill read it tmr and see if it solves it
local UIS = game:GetService("UserInputService")
local RS = game:GetService("ReplicatedStorage")
local Modules = RS:WaitForChild("Modules")
local Fruit = Modules:WaitForChild("Fruit")
local FM = Fruit:WaitForChild("Devil Fruits")
local FruitModule = require(FM)
local Tool = script.Parent
local ISSummon = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Summon")
local ISDisappear = Tool:WaitForChild("SFX"):WaitForChild("Ice Spikes"):WaitForChild("Disappear")
local Anims = Tool:WaitForChild("Animations")
local HIS = Anims:WaitForChild("HoldIceSpikes")
local PIS = Anims:WaitForChild("PunchIceSpikes")
local Player = game.Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local HISAnim = Humanoid:LoadAnimation(HIS)
local PISAnim = Humanoid:LoadAnimation(PIS)
local Cooldown1 = false
local Holding1 = false
local Cooldown2 = false
local Holding2 = false
local function zmove()
ISSummon:Play()
FruitModule.Hie.Spike(Player, 3)
task.wait(3)
ISDisappear:Play()
end
UIS.InputBegan:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
local Gui = PlayerGui[Tool.Name .. " Moveset"]
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown1 then
if not Holding1 then
Cooldown1 = true
Holding1 = true
HISAnim:Play()
Humanoid.WalkSpeed = 0
local startTime = tick()
repeat task.wait()
local currTime = tick() - startTime
local keysPressed = UIS:GetKeysPressed()
if not table.find(keysPressed, Enum.KeyCode.E) then
return
end
until currTime >= 5
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
zmove()
task.wait(3)
Cooldown1 = false
end)
Humanoid.WalkSpeed = 18
Holding1 = false
end
end
end
end
end)
UIS.InputEnded:Connect(function(Input, Processed)
if Processed then
return
end
if Tool.Equip.Value then
if Input.KeyCode == Enum.KeyCode.E then
if not Cooldown2 then
if not Holding2 then
Cooldown2 = true
Holding2 = true
HISAnim:Stop()
PISAnim:Play()
PISAnim:GetMarkerReachedSignal("Ice Spikes"):Connect(function()
Humanoid.WalkSpeed = 0
zmove()
task.wait(3)
Cooldown2 = false
end)
Humanoid.WalkSpeed = 18
Holding2 = false
end
end
end
end
end)
Didn’t realise that was the behavior you were trying to achieve, here you go (you may need to remove/modify the cooldowns slightly.