Hello. I’ve been trying to create a scp game, and ive come across this. The animations do not show on the other player. Specifically the run animation.
heres the animate script that is added to the person when they spawn
--// modules
local require = require(game:GetService('ReplicatedStorage'):WaitForChild('library'))
local index = require('index')
local service = require('service')
--// remotes
local footstep_ev = require.events.footstep
local run_ev = require.events.run
local run_track_con, crouch_track_con
local site = workspace:WaitForChild('site')
local Character = script.Parent
local Humanoid = Character:WaitForChild("Humanoid")
local pose = "Standing"
local userNoUpdateOnLoopSuccess, userNoUpdateOnLoopValue = pcall(function() return UserSettings():IsUserFeatureEnabled("UserNoUpdateOnLoop") end)
local userNoUpdateOnLoop = userNoUpdateOnLoopSuccess and userNoUpdateOnLoopValue
local userAnimationSpeedDampeningSuccess, userAnimationSpeedDampeningValue = pcall(function() return UserSettings():IsUserFeatureEnabled("UserAnimationSpeedDampening") end)
local userAnimationSpeedDampening = userAnimationSpeedDampeningSuccess and userAnimationSpeedDampeningValue
local adjustHumanoidRootPartFlagExists, adjustHumanoidRootPartFlagEnabled = pcall(function()
return UserSettings():IsUserFeatureEnabled("UserAdjustHumanoidRootPartToHipPosition")
end)
local FFlagUserAdjustHumanoidRootPartToHipPosition = adjustHumanoidRootPartFlagExists and adjustHumanoidRootPartFlagEnabled
local animateScriptEmoteHookFlagExists, animateScriptEmoteHookFlagEnabled = pcall(function()
return UserSettings():IsUserFeatureEnabled("UserAnimateScriptEmoteHook")
end)
local FFlagAnimateScriptEmoteHook = animateScriptEmoteHookFlagExists and animateScriptEmoteHookFlagEnabled
local AnimationSpeedDampeningObject = script:FindFirstChild("ScaleDampeningPercent")
local HumanoidHipHeight = FFlagUserAdjustHumanoidRootPartToHipPosition and 2 or 1.35
local EMOTE_TRANSITION_TIME = 0.1
local cam = workspace.CurrentCamera
local gun_event = nil
local currentAnim = ""
local currentAnimInstance = nil
local currentAnimTrack = nil
local currentAnimKeyframeHandler = nil
local currentAnimSpeed = 1.0
local can_sprint = true
local runAnimTrack = nil
local runAnimKeyframeHandler = nil
local crouching, sprinting, proned = false, false, false
local last_ws = Humanoid.WalkSpeed
local last_offset = Humanoid.CameraOffset
local last_fov = cam.FieldOfView
local animTable = {}
local animNames = {
idle = {
{ id = "http://www.roblox.com/asset/?id=507766666", weight = 1 },
{ id = "http://www.roblox.com/asset/?id=507766951", weight = 1 },
{ id = "http://www.roblox.com/asset/?id=507766388", weight = 9 }
},
walk = {
{ id = "http://www.roblox.com/asset/?id=6962171620", weight = 10 }
},
run2 = {
{ id = "http://www.roblox.com/asset/?id=6962172120", weight = 10 }
},
crouchidle = {
{ id = "http://www.roblox.com/asset/?id=6962172847", weight = 10 }
},
crouchmove = {
{ id = "http://www.roblox.com/asset/?id=6962174000", weight = 10 }
},
proneidle = {
{ id = "http://www.roblox.com/asset/?id=6962174588", weight = 10 }
},
pronemove = {
{ id = "http://www.roblox.com/asset/?id=6962175071", weight = 10 }
},
swim = {
{ id = "http://www.roblox.com/asset/?id=507784897", weight = 10 }
},
swimidle = {
{ id = "http://www.roblox.com/asset/?id=507785072", weight = 10 }
},
jump = {
{ id = "http://www.roblox.com/asset/?id=507765000", weight = 10 }
},
fall = {
{ id = "http://www.roblox.com/asset/?id=507767968", weight = 10 }
},
climb = {
{ id = "http://www.roblox.com/asset/?id=507765644", weight = 10 }
},
sit = {
{ id = "http://www.roblox.com/asset/?id=2506281703", weight = 10 }
},
toolnone = {
{ id = "http://www.roblox.com/asset/?id=507768375", weight = 10 }
},
toolslash = {
{ id = "http://www.roblox.com/asset/?id=522635514", weight = 10 }
},
toollunge = {
{ id = "http://www.roblox.com/asset/?id=522638767", weight = 10 }
},
wave = {
{ id = "http://www.roblox.com/asset/?id=507770239", weight = 10 }
},
point = {
{ id = "http://www.roblox.com/asset/?id=507770453", weight = 10 }
},
dance = {
{ id = "http://www.roblox.com/asset/?id=507771019", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507771955", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507772104", weight = 10 }
},
dance2 = {
{ id = "http://www.roblox.com/asset/?id=507776043", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507776720", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507776879", weight = 10 }
},
dance3 = {
{ id = "http://www.roblox.com/asset/?id=507777268", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507777451", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507777623", weight = 10 }
},
laugh = {
{ id = "http://www.roblox.com/asset/?id=507770818", weight = 10 }
},
cheer = {
{ id = "http://www.roblox.com/asset/?id=507770677", weight = 10 }
},
}
--[[local animNames = {
idle = {
{ id = "http://www.roblox.com/asset/?id=507766951", weight = 1 }
},
walk = {
{ id = "http://www.roblox.com/asset/?id=4340927249", weight = 10 }
},
run = {
{ id = "http://www.roblox.com/asset/?id=4341272544", weight = 10 }
},
crouchidle = {
{ id = "http://www.roblox.com/asset/?id=4348674644", weight = 10 }
},
crouchmove = {
{ id = "http://www.roblox.com/asset/?id=4348681702", weight = 10 }
},
proneidle = {
{ id = "http://www.roblox.com/asset/?id=4348670338", weight = 10 }
},
pronemove = {
{ id = "http://www.roblox.com/asset/?id=4348678591", weight = 10 }
},
swim = {
{ id = "http://www.roblox.com/asset/?id=507784897", weight = 10 }
},
swimidle = {
{ id = "http://www.roblox.com/asset/?id=507785072", weight = 10 }
},
jump = {
{ id = "http://www.roblox.com/asset/?id=507765000", weight = 10 }
},
fall = {
{ id = "http://www.roblox.com/asset/?id=507767968", weight = 10 }
},
climb = {
{ id = "http://www.roblox.com/asset/?id=507765644", weight = 10 }
},
sit = {
{ id = "http://www.roblox.com/asset/?id=2506281703", weight = 10 }
},
toolnone = {
{ id = "http://www.roblox.com/asset/?id=4299957469", weight = 10 }
},
toolslash = {
{ id = "http://www.roblox.com/asset/?id=522635514", weight = 10 }
},
toollunge = {
{ id = "http://www.roblox.com/asset/?id=522638767", weight = 10 }
},
wave = {
{ id = "http://www.roblox.com/asset/?id=507770239", weight = 10 }
},
point = {
{ id = "http://www.roblox.com/asset/?id=507770453", weight = 10 }
},
dance = {
{ id = "http://www.roblox.com/asset/?id=507771019", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507771955", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507772104", weight = 10 }
},
dance2 = {
{ id = "http://www.roblox.com/asset/?id=507776043", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507776720", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507776879", weight = 10 }
},
dance3 = {
{ id = "http://www.roblox.com/asset/?id=507777268", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507777451", weight = 10 },
{ id = "http://www.roblox.com/asset/?id=507777623", weight = 10 }
},
laugh = {
{ id = "http://www.roblox.com/asset/?id=507770818", weight = 10 }
},
cheer = {
{ id = "http://www.roblox.com/asset/?id=507770677", weight = 10 }
},
}]]
-- Existance in this list signifies that it is an emote, the value indicates if it is a looping emote
local emoteNames = { wave = false, point = false, dance = true, dance2 = true, dance3 = true, laugh = false, cheer = false}
local PreloadAnimsUserFlag = false
local PreloadedAnims = {}
local successPreloadAnim, msgPreloadAnim = pcall(function()
PreloadAnimsUserFlag = UserSettings():IsUserFeatureEnabled("UserPreloadAnimations")
end)
if not successPreloadAnim then
PreloadAnimsUserFlag = false
end
local stepped = false
local vegetation = site.veg
local ignore = {Character, vegetation}
function get_fss()
local current = (not stepped and Character.LeftUpperLeg or Character.RightUpperLeg)
if current then
return workspace:FindPartOnRayWithIgnoreList(Ray.new(current.Position, Vector3.new(0, -3.5, 0)), ignore)
end
end
local function lerp(a, b, t) --// linear interpolation
return a * (1 - t) + (b * t)
end
math.randomseed(tick())
function findExistingAnimationInSet(set, anim)
if set == nil or anim == nil then
return 0
end
for idx = 1, set.count, 1 do
if set[idx].anim.AnimationId == anim.AnimationId then
return idx
end
end
return 0
end
function configureAnimationSet(name, fileList)
if (animTable[name] ~= nil) then
for _, connection in pairs(animTable[name].connections) do
connection:disconnect()
end
end
animTable[name] = {}
animTable[name].count = 0
animTable[name].totalWeight = 0
animTable[name].connections = {}
local allowCustomAnimations = true
local AllowDisableCustomAnimsUserFlag = false
local success, msg = pcall(function()
AllowDisableCustomAnimsUserFlag = UserSettings():IsUserFeatureEnabled("UserAllowDisableCustomAnims2")
end)
if (AllowDisableCustomAnimsUserFlag) then
local success, msg = pcall(function() allowCustomAnimations = game:GetService("StarterPlayer").AllowCustomAnimations end)
if not success then
allowCustomAnimations = true
end
end
-- check for config values
local config = script:FindFirstChild(name)
if (allowCustomAnimations and config ~= nil) then
table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end))
table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end))
local idx = 0
for _, childPart in pairs(config:GetChildren()) do
if (childPart:IsA("Animation")) then
local newWeight = 1
local weightObject = childPart:FindFirstChild("Weight")
if (weightObject ~= nil) then
newWeight = weightObject.Value
end
animTable[name].count = animTable[name].count + 1
idx = animTable[name].count
animTable[name][idx] = {}
animTable[name][idx].anim = childPart
animTable[name][idx].weight = newWeight
animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end))
table.insert(animTable[name].connections, childPart.ChildAdded:connect(function(property) configureAnimationSet(name, fileList) end))
table.insert(animTable[name].connections, childPart.ChildRemoved:connect(function(property) configureAnimationSet(name, fileList) end))
end
end
end
-- fallback to defaults
if (animTable[name].count <= 0) then
for idx, anim in pairs(fileList) do
animTable[name][idx] = {}
animTable[name][idx].anim = Instance.new("Animation")
animTable[name][idx].anim.Name = name
animTable[name][idx].anim.AnimationId = anim.id
animTable[name][idx].weight = anim.weight
animTable[name].count = animTable[name].count + 1
animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
end
end
-- preload anims
if PreloadAnimsUserFlag then
for i, animType in pairs(animTable) do
for idx = 1, animType.count, 1 do
if PreloadedAnims[animType[idx].anim.AnimationId] == nil then
Humanoid:LoadAnimation(animType[idx].anim)
PreloadedAnims[animType[idx].anim.AnimationId] = true
end
end
end
end
end
------------------------------------------------------------------------------------------------------------
function configureAnimationSetOld(name, fileList)
if (animTable[name] ~= nil) then
for _, connection in pairs(animTable[name].connections) do
connection:disconnect()
end
end
animTable[name] = {}
animTable[name].count = 0
animTable[name].totalWeight = 0
animTable[name].connections = {}
local allowCustomAnimations = true
local AllowDisableCustomAnimsUserFlag = false
local success, msg = pcall(function()
AllowDisableCustomAnimsUserFlag = UserSettings():IsUserFeatureEnabled("UserAllowDisableCustomAnims2")
end)
if (AllowDisableCustomAnimsUserFlag) then
local success, msg = pcall(function() allowCustomAnimations = game:GetService("StarterPlayer").AllowCustomAnimations end)
if not success then
allowCustomAnimations = true
end
end
-- check for config values
local config = script:FindFirstChild(name)
if (allowCustomAnimations and config ~= nil) then
table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end))
table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end))
local idx = 1
for _, childPart in pairs(config:GetChildren()) do
if (childPart:IsA("Animation")) then
table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end))
animTable[name][idx] = {}
animTable[name][idx].anim = childPart
local weightObject = childPart:FindFirstChild("Weight")
if (weightObject == nil) then
animTable[name][idx].weight = 1
else
animTable[name][idx].weight = weightObject.Value
end
animTable[name].count = animTable[name].count + 1
animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight
idx = idx + 1
end
end
end
-- fallback to defaults
if (animTable[name].count <= 0) then
for idx, anim in pairs(fileList) do
animTable[name][idx] = {}
animTable[name][idx].anim = Instance.new("Animation")
animTable[name][idx].anim.Name = name
animTable[name][idx].anim.AnimationId = anim.id
animTable[name][idx].weight = anim.weight
animTable[name].count = animTable[name].count + 1
animTable[name].totalWeight = animTable[name].totalWeight + anim.weight
end
end
-- preload anims
if PreloadAnimsUserFlag then
for i, animType in pairs(animTable) do
for idx = 1, animType.count, 1 do
Humanoid:LoadAnimation(animType[idx].anim)
end
end
end
end
-- Setup animation objects
function scriptChildModified(child)
local fileList = animNames[child.Name]
if (fileList ~= nil) then
configureAnimationSet(child.Name, fileList)
end
end
script.ChildAdded:connect(scriptChildModified)
script.ChildRemoved:connect(scriptChildModified)
for name, fileList in pairs(animNames) do
configureAnimationSet(name, fileList)
end
-- ANIMATION
-- declarations
local toolAnim = "None"
local toolAnimTime = 0
local jumpAnimTime = 0
local jumpAnimDuration = 0.31
local toolTransitionTime = 0.1
local fallTransitionTime = 0.2
local currentlyPlayingEmote = false
-- functions
function stopAllAnimations()
local oldAnim = currentAnim
-- return to idle if finishing an emote
if (emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false) then
oldAnim = "idle"
end
if FFlagAnimateScriptEmoteHook and currentlyPlayingEmote then
oldAnim = "idle"
currentlyPlayingEmote = false
end
currentAnim = ""
currentAnimInstance = nil
if (currentAnimKeyframeHandler ~= nil) then
currentAnimKeyframeHandler:disconnect()
end
if (currentAnimTrack ~= nil) then
currentAnimTrack:Stop()
delay(0.1,function()
currentAnimTrack:Destroy()
currentAnimTrack = nil
end)
end
-- clean up walk if there is one
if (runAnimKeyframeHandler ~= nil) then
runAnimKeyframeHandler:disconnect()
end
if (runAnimTrack ~= nil) then
runAnimTrack:Stop()
game:GetService('Debris'):AddItem(runAnimTrack,0.1)
end
return oldAnim
end
function getHeightScale()
if Humanoid then
if FFlagUserAdjustHumanoidRootPartToHipPosition then
if not Humanoid.AutomaticScalingEnabled then
return 1
end
end
local scale = Humanoid.HipHeight / HumanoidHipHeight
if userAnimationSpeedDampening then
if AnimationSpeedDampeningObject == nil then
AnimationSpeedDampeningObject = script:FindFirstChild("ScaleDampeningPercent")
end
if AnimationSpeedDampeningObject ~= nil then
scale = 1 + (Humanoid.HipHeight - HumanoidHipHeight) * AnimationSpeedDampeningObject.Value / HumanoidHipHeight
end
end
return scale
end
return 1
end
local smallButNotZero = 0.0001
function setRunSpeed(speed)
local heightScale = getHeightScale()
local speedScaled
if currentAnim == "walk" then
speedScaled = 1
else
speedScaled = 1.25
end
local runSpeed = speedScaled / heightScale
if runSpeed ~= currentAnimSpeed then
if runSpeed < 0.33 then
currentAnimTrack:AdjustWeight(1.0)
runAnimTrack:AdjustWeight(smallButNotZero)
elseif runSpeed < 0.66 then
local weight = ((runSpeed - 0.33) / 0.33)
currentAnimTrack:AdjustWeight(1.0 - weight + smallButNotZero)
runAnimTrack:AdjustWeight(weight + smallButNotZero)
else
currentAnimTrack:AdjustWeight(smallButNotZero)
runAnimTrack:AdjustWeight(1.0)
end
currentAnimSpeed = runSpeed
runAnimTrack:AdjustSpeed(runSpeed)
currentAnimTrack:AdjustSpeed(runSpeed)
end
end
function setAnimationSpeed(speed)
if currentAnim == "walk" or currentAnim == "run2" then
setRunSpeed(speed)
else
if speed ~= currentAnimSpeed then
currentAnimSpeed = speed
currentAnimTrack:AdjustSpeed(currentAnimSpeed)
end
end
end
--[[function keyFrameReachedFunc(frameName)
if (frameName == "End") then
if currentAnim == "walk" or currentAnim == "run" then
if userNoUpdateOnLoop == true then
if runAnimTrack.Looped ~= true then
runAnimTrack.TimePosition = 0.0
end
if currentAnimTrack.Looped ~= true then
currentAnimTrack.TimePosition = 0.0
end
else
runAnimTrack.TimePosition = 0.0
currentAnimTrack.TimePosition = 0.0
end
else
local repeatAnim = currentAnim
if (emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false) then
repeatAnim = "idle"
end
if FFlagAnimateScriptEmoteHook and currentlyPlayingEmote then
if currentAnimTrack.Looped then
return
end
repeatAnim = "idle"
currentlyPlayingEmote = false
end
local animSpeed = currentAnimSpeed
playAnimation(repeatAnim, 0.15, Humanoid)
setAnimationSpeed(animSpeed)
end
end
end]]
function rollAnimation(animName)
local roll = math.random(1, animTable[animName].totalWeight)
local origRoll = roll
local idx = 1
while (roll > animTable[animName][idx].weight) do
roll = roll - animTable[animName][idx].weight
idx = idx + 1
end
return idx
end
local function switchToAnim(anim, animName, transitionTime, humanoid)
if (anim ~= currentAnimInstance) then
if (currentAnimTrack ~= nil) then
currentAnimTrack:Stop(transitionTime)
game:GetService('Debris'):AddItem(currentAnimTrack,0.1)
end
if (runAnimTrack ~= nil) then
runAnimTrack:Stop(transitionTime)
game:GetService('Debris'):AddItem(currentAnimTrack,0.1)
end
currentAnimSpeed = 1.0
-- load it to the humanoid; get AnimationTrack
currentAnimTrack = humanoid:LoadAnimation(anim)
-- play the animation
currentAnimTrack:Play(transitionTime)
currentAnim = animName
currentAnimInstance = anim
-- set up keyframe name triggers
if (currentAnimKeyframeHandler ~= nil) then
currentAnimKeyframeHandler:disconnect()
end
if animName == 'crouchmove' then
if crouch_track_con then
crouch_track_con:disconnect()
end
local runAnimName = 'crouchmove'
local runIdx = rollAnimation(runAnimName)
crouch_track_con = currentAnimTrack:GetMarkerReachedSignal('footstep'):connect(function()
stepped = not stepped do
local hit, pos, norm, mat = get_fss()
if (hit and mat) then
footstep_ev:FireServer('{\n\ \ \ \ \\ \\}', hit, pos, norm, mat, true)
end
end
end)
end
-- check to see if we need to blend a walk/run animation
if animName == "run2" or animName == "walk" then
local runIdx = rollAnimation(animName)
runAnimTrack = humanoid:LoadAnimation(anim)
runAnimTrack:Play(transitionTime)
if (runAnimKeyframeHandler ~= nil) then
runAnimKeyframeHandler:disconnect()
end
do --// footstep
if run_track_con then
run_track_con:disconnect()
end
run_track_con = runAnimTrack:GetMarkerReachedSignal('footstep'):connect(function()
stepped = not stepped do
local hit, pos, norm, mat = get_fss()
if mat then
footstep_ev:FireServer('{\n\ \ \ \ \\ \\}', hit, pos, norm, mat, false)
end
end
end)
end
end
end
end
function playAnimation(animName, transitionTime, humanoid)
local idx = rollAnimation(animName)
local anim = animTable[animName][idx].anim
switchToAnim(anim, animName, transitionTime, humanoid)
end
function playEmote(emoteAnim, transitionTime, humanoid)
switchToAnim(emoteAnim, emoteAnim.Name, transitionTime, humanoid)
currentlyPlayingEmote = true
end
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
local toolAnimName = ""
local toolAnimTrack = nil
local toolAnimInstance = nil
function playToolAnimation(animName, transitionTime, humanoid)
local idx = rollAnimation(animName)
local anim = animTable[animName][idx].anim
if (toolAnimInstance ~= anim) then
if (toolAnimTrack ~= nil) then
toolAnimTrack:Stop()
game:GetService('Debris'):AddItem(toolAnimTrack,0.1)
transitionTime = 0
end
-- load it to the humanoid; get AnimationTrack
toolAnimTrack = humanoid:LoadAnimation(anim)
-- play the animation
toolAnimTrack:Play(transitionTime)
toolAnimName = animName
toolAnimInstance = anim
end
end
function stopToolAnimations()
local oldAnim = toolAnimName
toolAnimName = ""
toolAnimInstance = nil
if (toolAnimTrack ~= nil) then
toolAnimTrack:Stop()
game:GetService('Debris'):AddItem(toolAnimTrack,0.1)
end
return oldAnim
end
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-- STATE CHANGE HANDLERS
function onRunning(speed)
if speed > 0.5 then
local scale = 12 --// 16
if pose ~= 'Crouching' and pose ~= 'Prone' then
if not sprinting then
playAnimation("walk", 0.2, Humanoid)
setAnimationSpeed(speed / scale)
pose = "Walking"
if cam.FieldOfView == 80 and not sprinting then
last_fov = 70
game:GetService("TweenService"):Create(cam,TweenInfo.new(0.5,Enum.EasingStyle.Quad,Enum.EasingDirection.InOut),{FieldOfView = last_fov}):Play()
end
elseif sprinting then
playAnimation("run2", 0.2, Humanoid)
setAnimationSpeed(speed / scale)
pose = "Running2"
if cam.FieldOfView == 70 then
last_fov = 80
game:GetService("TweenService"):Create(cam,TweenInfo.new(0.5,Enum.EasingStyle.Quad,Enum.EasingDirection.InOut),{FieldOfView = last_fov}):Play()
end
end
else
if pose == 'Crouching' then
playAnimation("crouchmove", 0.2, Humanoid)
setAnimationSpeed(speed / scale * 2)
elseif pose == 'Prone' then
playAnimation("pronemove", 0.2, Humanoid)
setAnimationSpeed(speed / scale * 2)
end
end
else
if emoteNames[currentAnim] == nil then
if pose ~= 'Crouching' and pose ~= 'Prone' then
playAnimation("idle", 0.2, Humanoid)
pose = "Standing"
else
if pose == 'Crouching' then
playAnimation('crouchidle', 0.2, Humanoid)
elseif pose == 'Prone' then
playAnimation('proneidle', 0.2, Humanoid)
end
end
end
end
end
function onDied()
pose = "Dead"
end
function onJumping()
playAnimation("jump", 0.1, Humanoid)
jumpAnimTime = jumpAnimDuration
pose = "Jumping"
end
function onClimbing(speed)
if pose == 'Prone' then return end
local scale = 5
playAnimation("climb", 0.1, Humanoid)
setAnimationSpeed(speed / scale)
pose = "Climbing"
end
function onGettingUp()
pose = "GettingUp"
end
function onFreeFall()
if (jumpAnimTime <= 0) then
playAnimation("fall", fallTransitionTime, Humanoid)
end
pose = "FreeFall"
end
function onFallingDown()
pose = "FallingDown"
end
function onSeated()
pose = "Seated"
end
function onPlatformStanding()
pose = "PlatformStanding"
end
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
function onSwimming(speed)
if speed > 1.00 then
local scale = 10
playAnimation("swim", 0.4, Humanoid)
setAnimationSpeed(speed / scale)
pose = "Swimming"
else
playAnimation("swimidle", 0.4, Humanoid)
pose = "Standing"
end
end
function animateTool()
if (toolAnim == "None") then
if not gun_event or gun_event.Parent.Parent.Parent ~= Character then
playToolAnimation("toolnone", toolTransitionTime, Humanoid)
return
end
end
if (toolAnim == "Slash") then
playToolAnimation("toolslash", 0, Humanoid)
return
end
if (toolAnim == "Lunge") then
playToolAnimation("toollunge", 0, Humanoid)
return
end
end
function getToolAnim(tool)
for _, c in ipairs(tool:GetChildren()) do
if c.Name == "toolanim" and c.className == "StringValue" then
return c
end
end
return nil
end
local lastTick = 0
local function has_morph(char)
for i,v in pairs(char:GetChildren()) do
if v:IsA('Model') and v.Name == 'armor' and v:FindFirstChild('Middle') then
return true
end
end
end
function stepAnimate(currentTime)
local amplitude = 1
local frequency = 1
local deltaTime = currentTime - lastTick
lastTick = currentTime
local climbFudge = 0
local setAngles = false
if (jumpAnimTime > 0) then
jumpAnimTime = jumpAnimTime - deltaTime
end
if (pose == "FreeFall" and jumpAnimTime <= 0) then
playAnimation("fall", fallTransitionTime, Humanoid)
elseif (pose == "Seated") then
playAnimation("sit", 0.5, Humanoid)
return
elseif (pose == "Walking") then
playAnimation("walk", 0.2, Humanoid)
elseif (pose == "Running2") and sprinting then
playAnimation("run2", 0.2, Humanoid)
elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then
stopAllAnimations()
amplitude = 0.1
frequency = 1
setAngles = true
end
-- Tool Animation handling
local tool = Character:FindFirstChildOfClass("Tool")
if tool and tool:FindFirstChild("Handle") then
local animStringValueObject = getToolAnim(tool)
if animStringValueObject then
toolAnim = animStringValueObject.Value
-- message recieved, delete StringValue
animStringValueObject.Parent = nil
toolAnimTime = currentTime + .3
end
if currentTime > toolAnimTime then
toolAnimTime = 0
toolAnim = "None"
end
animateTool()
else
stopToolAnimations()
toolAnim = "None"
toolAnimInstance = nil
toolAnimTime = 0
end
end
-- connect events
Humanoid.Died:connect(onDied)
Humanoid.Running:connect(onRunning)
Humanoid.Jumping:connect(onJumping)
Humanoid.Climbing:connect(onClimbing)
Humanoid.GettingUp:connect(onGettingUp)
Humanoid.FreeFalling:connect(onFreeFall)
Humanoid.FallingDown:connect(onFallingDown)
Humanoid.Seated:connect(onSeated)
Humanoid.PlatformStanding:connect(onPlatformStanding)
Humanoid.Swimming:connect(onSwimming)
do --// crouching / sprinting
local jump_limit = .5
local last_jump = tick() - jump_limit
local prop = Humanoid.GetPropertyChangedSignal
Humanoid.StateChanged:connect(function(_, new)
if new == Enum.HumanoidStateType.Freefall then
last_jump = tick()
end
end)
prop(Humanoid, 'Jump'):connect(function()
local up_ray = Ray.new(index.WaitForChild(Character, 'HumanoidRootPart').Position, Vector3.new(0, 7.5, 0))
local hit = workspace:FindPartOnRayWithIgnoreList(up_ray, {Character, vegetation})
if hit then
Humanoid.Jump = false
end
end)
index.WaitForChild(Character, 'HumanoidRootPart').CanCollide = false
service.UserInputService.InputBegan:connect(function(key, processed)
if key.KeyCode == Enum.KeyCode.C and not processed and not sprinting then
local up_ray = Ray.new(index.WaitForChild(Character, 'HumanoidRootPart').Position, Vector3.new(0, 3, 0))
local hit = workspace:FindPartOnRayWithIgnoreList(up_ray, {Character, vegetation})
if crouching and hit or pose == 'Seated' or pose == 'Swimming' or pose == 'FreeFall' or pose == 'Dead' then return end
crouching = not crouching do
pose = crouching and 'Crouching' or 'Standing'
playAnimation(crouching and 'crouchidle' or 'idle', .25, Humanoid)
if gun_event then
gun_event:Fire('crouching',crouching)
end
end
end
if key.KeyCode == Enum.KeyCode.Z and not processed and not sprinting then
local up_ray = Ray.new(index.WaitForChild(Character, 'HumanoidRootPart').Position, Vector3.new(0, 3, 0))
local hit = workspace:FindPartOnRayWithIgnoreList(up_ray, {Character, vegetation})
if hit then print(hit.Name) end
if proned and hit or pose == 'Seated' or pose == 'Swimming' or pose == 'FreeFall' or pose == 'Dead' then return end
proned = not proned do
pose = proned and 'Prone' or 'Standing'
playAnimation(proned and 'proneidle' or 'idle', .25, Humanoid)
end
end
if key.KeyCode == Enum.KeyCode.LeftShift and can_sprint and not crouching and not proned then
sprinting = true
run_ev:FireServer(sprinting)
if gun_event then
gun_event:Fire('sprinting',sprinting)
end
end
end)
service.UserInputService.InputEnded:connect(function(key, processed)
if key.KeyCode == Enum.KeyCode.LeftShift and sprinting then
sprinting = false
run_ev:FireServer(sprinting)
if gun_event then
gun_event:Fire('sprinting',sprinting)
end
end
end)
service.RunService.RenderStepped:connect(function()
local neutral = service.Players.LocalPlayer.Team and (service.Players.LocalPlayer.Team.Name ~= 'Neutral') or false
--// set local states
--sprinting = (not crouching and not proned) and service.UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) or false
crouching = pose == 'Crouching'
proned = pose == 'Prone'
service.StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, pose ~= 'Dead' and (neutral and not proned) or false)
--// check states
if proned then
Humanoid:UnequipTools()
end
if not can_sprint and sprinting then
sprinting = false
end
--// humanoid
Humanoid.CameraOffset = pose ~= 'Dead' and Humanoid.CameraOffset:lerp(
proned and (Vector3.new(0, -3, -2)) or
crouching and (Vector3.new(0, -.65, 0)) or
last_offset, .075
) or Vector3.new()
Humanoid.WalkSpeed = sprinting and last_ws * 1.5 or crouching and (last_ws / 2) or proned and (last_ws / 3.25) or last_ws
end)
end
-- setup emote chat hook
game:GetService("Players").LocalPlayer.Chatted:connect(function(msg)
local emote = ""
if (string.sub(msg, 1, 3) == "/e ") then
emote = string.sub(msg, 4)
elseif (string.sub(msg, 1, 7) == "/emote ") then
emote = string.sub(msg, 8)
end
if (pose == "Standing" and emoteNames[emote] ~= nil) then
playAnimation(emote, EMOTE_TRANSITION_TIME, Humanoid)
end
end)
Character.ChildAdded:Connect(function(child)
if child:IsA('Tool') and child:FindFirstChild('gunClient') then
local event = child:WaitForChild('gunClient').event
gun_event = event
gun_event:Fire('sprinting',sprinting)
gun_event:Fire('crouching',crouching)
gun_event.Event:Connect(function(arg)
if arg == 'enable' and not can_sprint then
can_sprint = true
elseif arg == 'disable' and can_sprint then
can_sprint = false
end
end)
end
end)
-- emote bindable hook
if FFlagAnimateScriptEmoteHook then
script:WaitForChild("PlayEmote").OnInvoke = function(emote)
-- Only play emotes when idling
if pose ~= "Standing" then
return
end
if emoteNames[emote] ~= nil then
-- Default emotes
playAnimation(emote, EMOTE_TRANSITION_TIME, Humanoid)
return true
elseif typeof(emote) == "Instance" and emote:IsA("Animation") then
-- Non-default emotes
playEmote(emote, EMOTE_TRANSITION_TIME, Humanoid)
return true
end
-- Return false to indicate that the emote could not be played
return false
end
end
-- initialize to idle
playAnimation("idle", 0.1, Humanoid)
pose = "Standing"
-- loop to handle timed state transitions and tool animations
while Character.Parent ~= nil do
local _, currentGameTime = wait(0.1)
stepAnimate(currentGameTime)
end
pretty long. Heres what I mean by it doesnt show on the other perosn. All other animations work.
https://gyazo.com/2e4074aae77b67dbf084ac79857aa29e