Axolotleless

ServerMovement

Jan 3rd, 2026 (edited)
1,512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.27 KB | None | 0 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 unlockAfterSeat(player, data)
  64.     -- When unseated, instantly unlock & recalc state
  65.     data.SpecialStateLock = false
  66.    
  67.     local human = data.Humanoid
  68.    
  69.     if human.MoveDirection.Magnitude > MOVEMENT_THRESHOLD then
  70.         fireState(player, data, "Walk")
  71.     else
  72.         fireState(player, data, "Idle")
  73.     end
  74. end
  75.  
  76. local function handleCharacterAdded(character)
  77.     local player = Players:GetPlayerFromCharacter(character)
  78.     if not player then return end
  79.    
  80.     local humanoid = character:WaitForChild("Humanoid")
  81.     local rootPart = character:WaitForChild("HumanoidRootPart")
  82.    
  83.     humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, true)
  84.    
  85.     local data = {
  86.     Character = character,
  87.     Humanoid = humanoid,
  88.     RootPart = rootPart,
  89.     CurrentState = "Idle",
  90.     SpecialStateLock = false
  91.     }
  92.     CharacterData[player] = data
  93.    
  94.     PlayAnimationState:FireClient(player, player, "Idle")
  95.    
  96.     -- Detect entering & leaving seat
  97.     humanoid:GetPropertyChangedSignal("Sit"):Connect(function()
  98.         if humanoid.Sit == true then
  99.             -- Player sits
  100.             data.SpecialStateLock = true
  101.             fireState(player, data, "Sit")
  102.         else
  103.             -- Player leaves the seat
  104.             unlockAfterSeat(player, data)
  105.         end
  106.     end)
  107.    
  108.     humanoid.StateChanged:Connect(function(_, newState)
  109.         local specialState = getSpecialState(newState)
  110.        
  111.         if specialState == "Sit" then
  112.             data.SpecialStateLock = true
  113.             fireState(player, data, "Sit")
  114.             return
  115.         end
  116.        
  117.         -- Leaving seated state
  118.         if newState ~= Enum.HumanoidStateType.Seated and data.SpecialStateLock and humanoid.Sit == false then
  119.             unlockAfterSeat(player, data)
  120.             return
  121.         end
  122.        
  123.         if specialState then
  124.             data.SpecialStateLock = true
  125.             fireState(player, data, specialState)
  126.         else
  127.             data.SpecialStateLock = false
  128.         end
  129.     end)
  130. end
  131.  
  132. local function onPlayerAdded(player)
  133.     player.CharacterAdded:Connect(handleCharacterAdded)
  134.     player.CharacterRemoving:Connect(function()
  135.         CharacterData[player] = nil
  136.     end)
  137.     if player.Character then
  138.         handleCharacterAdded(player.Character)
  139.     end
  140. end
  141.  
  142. local function onPlayerRemoving(player)
  143.     CharacterData[player] = nil
  144. end
  145.  
  146. Players.PlayerAdded:Connect(onPlayerAdded)
  147. Players.PlayerRemoving:Connect(onPlayerRemoving)
  148.  
  149. for _, player in ipairs(Players:GetPlayers()) do
  150.     onPlayerAdded(player)
  151. end
  152.  
  153. RunSvc.Heartbeat:Connect(function()
  154.     for player, data in pairs(CharacterData) do
  155.         if data.Character
  156.             and data.Humanoid.Health > 0
  157.             and data.RootPart
  158.             and not data.SpecialStateLock then
  159.            
  160.             local moveMag = data.Humanoid.MoveDirection.Magnitude
  161.             local nextState = (moveMag > MOVEMENT_THRESHOLD
  162.             and data.Humanoid.FloorMaterial ~= Enum.Material.Air)
  163.             and "Walk"
  164.             or "Idle"
  165.            
  166.             if data.CurrentState ~= nextState then
  167.                 fireState(player, data, nextState)
  168.             end
  169.         end
  170.     end
  171. end)
  172.  
Advertisement
Add Comment
Please, Sign In to add comment