Axolotleless

MovementStateServer

Nov 29th, 2025
809
1
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.20 KB | None | 1 0
  1. local RunSvc = game:GetService("RunService")
  2. local Players = game:GetService("Players")
  3. local RepStorage = game:GetService("ReplicatedStorage")
  4.  
  5. local PlayAnimationState = RepStorage:FindFirstChild("PlayAnimation")
  6. if not PlayAnimationState then
  7.     PlayAnimationState = Instance.new("RemoteEvent")
  8.     PlayAnimationState.Name = "PlayAnimationState"
  9.     PlayAnimationState.Parent = RepStorage
  10. end
  11.  
  12. local MOVEMENT_THRESHOLD = 0.01
  13. local CharacterData = {}
  14.  
  15. local function getSpecialState(currentHumState)
  16.     if currentHumState == Enum.HumanoidStateType.Jumping then
  17.         return "Jump"
  18.     elseif currentHumState == Enum.HumanoidStateType.Freefall then
  19.         return "Jump"
  20.     elseif currentHumState == Enum.HumanoidStateType.Swimming then
  21.         return "Swim"
  22.     elseif currentHumState == Enum.HumanoidStateType.Climbing then
  23.         return "Climb"
  24.     elseif currentHumState == Enum.HumanoidStateType.Seated then
  25.         return "Sit"
  26.     end
  27.     return nil
  28. end
  29.  
  30. local function isStateValid(data, newState)
  31.     if not data.Humanoid or not data.RootPart then return false end
  32.    
  33.     if newState == "Walk" then
  34.         return data.Humanoid.MoveDirection.Magnitude > MOVEMENT_THRESHOLD
  35.         and data.Humanoid.FloorMaterial ~= Enum.Material.Air
  36.        
  37.     elseif newState == "Idle" then
  38.         return data.Humanoid.MoveDirection.Magnitude <= MOVEMENT_THRESHOLD
  39.         and data.Humanoid.FloorMaterial ~= Enum.Material.Air
  40.     end
  41.    
  42.     return true
  43. end
  44.  
  45. local function FireToAllExceptOwner(playerToExclude, newState)
  46.     for _, player in ipairs(Players:GetPlayers()) do
  47.         if player ~= playerToExclude then
  48.             PlayAnimationState:FireClient(player, playerToExclude, newState)
  49.         end
  50.     end
  51. end
  52.  
  53. local function fireState(player, data, newState)
  54.     if not isStateValid(data, newState) then return end
  55.     if data.CurrentState == newState then return end
  56.    
  57.     data.CurrentState = newState
  58.    
  59.     PlayAnimationState:FireClient(player, player, newState)
  60.     FireToAllExceptOwner(player, newState)
  61. end
  62.  
  63. local function handleCharacterAdded(character)
  64.     local player = Players:GetPlayerFromCharacter(character)
  65.     if not player then return end
  66.    
  67.     local humanoid = character:WaitForChild("Humanoid")
  68.     local rootPart = character:WaitForChild("HumanoidRootPart")
  69.    
  70.     -- ALLOW Seated state (IMPORTANT)
  71.     humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, true)
  72.    
  73.     local data = {
  74.     Character = character,
  75.     Humanoid = humanoid,
  76.     RootPart = rootPart,
  77.     CurrentState = "Idle",
  78.     SpecialStateLock = false
  79.     }
  80.     CharacterData[player] = data
  81.    
  82.     PlayAnimationState:FireClient(player, player, "Idle")
  83.    
  84.     humanoid.StateChanged:Connect(function(oldState, newState)
  85.         local specialState = getSpecialState(newState)
  86.        
  87.         if specialState then
  88.             data.SpecialStateLock = true
  89.             fireState(player, data, specialState)
  90.         else
  91.             data.SpecialStateLock = false
  92.         end
  93.     end)
  94. end
  95.  
  96. local function onPlayerRemoving(player)
  97.     CharacterData[player] = nil
  98. end
  99.  
  100. local function onPlayerAdded(player)
  101.     player.CharacterAdded:Connect(handleCharacterAdded)
  102.     player.CharacterRemoving:Connect(function()
  103.         CharacterData[player] = nil
  104.     end)
  105.     if player.Character then
  106.         handleCharacterAdded(player.Character)
  107.     end
  108. end
  109.  
  110. Players.PlayerAdded:Connect(onPlayerAdded)
  111. Players.PlayerRemoving:Connect(onPlayerRemoving)
  112.  
  113. for _, player in pairs(Players:GetPlayers()) do
  114.     onPlayerAdded(player)
  115. end
  116.  
  117. RunSvc.Heartbeat:Connect(function()
  118.     for player, data in pairs(CharacterData) do
  119.         if data.Character and data.Humanoid.Health > 0 and data.RootPart and not data.SpecialStateLock then
  120.            
  121.             local moveMag = data.Humanoid.MoveDirection.Magnitude
  122.             local nextState = "Idle"
  123.            
  124.             if moveMag > MOVEMENT_THRESHOLD and data.Humanoid.FloorMaterial ~= Enum.Material.Air then
  125.                 nextState = "Walk"
  126.             end
  127.            
  128.             if data.CurrentState ~= nextState then
  129.                 fireState(player, data, nextState)
  130.             end
  131.         end
  132.     end
  133. end)
  134.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment