Advertisement
TaylorsRus

Untitled

Aug 26th, 2023
1,157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.50 KB | None | 0 0
  1. -- StateManager.lua
  2. local Knit = require(game:GetService("ReplicatedStorage").Packages.Knit)
  3. local StateManager = Knit.CreateService {
  4.     Name = "StateManager",
  5. }
  6.  
  7. local Players = game:GetService("Players")
  8.  
  9. local StateClass = require(script.StateClass)
  10.  
  11. local LastChange = nil
  12. local AlreadyCounting = false
  13.  
  14. local StateMachines = {
  15.     HumanoidStateMachine = {},
  16.     CombatStateMachine = {}
  17. }
  18.  
  19. local IDLE_REVERT_TIME = 5
  20. local ITERATION_INTERVAL = 1
  21.  
  22. local function ConfigureStates(Character)
  23.     local Humanoid = Character:WaitForChild("Humanoid")
  24.     local HumanoidStateMachine = StateMachines.HumanoidStateMachine
  25.    
  26.     Humanoid.StateChanged:Connect(function(_, NewState)
  27.         if NewState ~= Enum.HumanoidStateType.Running then
  28.             HumanoidStateMachine:ChangeState(NewState.Name)
  29.         end
  30.         LastChange = os.clock()
  31.        
  32.         if AlreadyCounting then return end
  33.         AlreadyCounting = true
  34.        
  35.         while true do
  36.             task.wait(ITERATION_INTERVAL)
  37.             local DeltaTime = os.clock() - LastChange
  38.             if DeltaTime >= IDLE_REVERT_TIME then
  39.                 break
  40.             end
  41.         end
  42.        
  43.         HumanoidStateMachine:ChangeState("Idle")
  44.         AlreadyCounting = false
  45.     end)
  46.    
  47.     HumanoidStateMachine:ChangeState("Idle")
  48. end
  49.  
  50. function StateManager.KnitInit()
  51.     for StateMachine,_ in StateMachines do
  52.         StateMachines[StateMachine] = StateClass.new(StateMachine)
  53.     end
  54.    
  55.     Players.PlayerAdded:Connect(function(Player)
  56.         if Player.Character then ConfigureStates(Player.Character) end
  57.         Player.CharacterAdded:Connect(ConfigureStates)
  58.     end)
  59. end
  60.  
  61. return StateManager
  62.  
  63. StateClass.lua
  64. local StateClass = {}
  65. StateClass.__index = StateClass
  66.  
  67.  
  68. function StateClass.new(StateMachine)
  69.     local self = setmetatable({}, StateClass)
  70.     self.Name = StateMachine.."StateMachine"
  71.     self.States = {}   
  72.     for _,State in ipairs(script[StateMachine]:GetChildren()) do
  73.         self.States[State.Name] = require(State)
  74.     end
  75.  
  76.     self.State = self.States["None"]
  77.     return self
  78. end
  79.  
  80. function StateClass:ChangeState(State)
  81.     local ValidState = false
  82.    
  83.     for StateName, Other in self.States do
  84.         if StateName == State then
  85.             ValidState = true
  86.             break
  87.         end
  88.     end
  89.     if not ValidState then
  90.         error("Attempted to change state to invalid state enum: "..tostring(State))
  91.     end
  92.  
  93.     local OldState = self.State
  94.     local NewState = self.States[State]
  95.    
  96.     if OldState.Exit then OldState.Exit() end
  97.     if NewState.Enter then NewState.Enter() end
  98.  
  99.     self.State = NewState
  100.     print("State Change:",self.State.Name)
  101. end
  102.  
  103. function StateClass:FetchState(State)
  104.     return self.State
  105. end
  106.  
  107.  
  108. return StateClass
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement