You are on page 1of 3

1.

--// Services
2. local ReplicatedStorage = game:GetService('ReplicatedStorage')
3.  
4. --// Vars
5. local Util = ReplicatedStorage:WaitForChild('Util')
6.  
7. --// Util
8. local Signal = require(Util.Signal)
9.  
10. --// Class
11. local NPC = {}
12. NPC.__index = NPC
13.  
14. setmetatable(NPC, {
15.     __call = function(class, ...)
16.         local self = setmetatable({}, class)
17.         class:_init(...)
18.         return self
19.     end,
20. })
21.  
22. --// Setup
23. function NPC:_init(name, isFriendly, _model)
24.     self.Name = name or 'John Doe'
25.     self.Id = math.random(999, 9999)
26.    
27.     self.Health = 100
28.     self.MaxHelth = 100
29.    
30.     self.HealthPercent = (self.Health / self.MaxHelth) * 100
31.    
32.     self.Status = 'Alive'
33.     self.StatusChanged =  Signal.new()
34.    
35.     self.Speed = 16
36.     self.JumpPower = 50
37.    
38.     self.IsFriendly = isFriendly or true
39.    
40.     self.SpawnedAt = tick()
41.    
42.     self.SpeedChanged = Signal.new()
43.     self.JumpPowerChanged = Signal.new()
44.    
45.     self._model = _model:Clone()
46.     self._humanoid = self._model:FindFirstChild('Humanoid')
47.    
48.     self._defaultSpeed = self.Speed
49.     self._defaultJumpPower = self.JumpPower
50.    
51.     --// Setting up
52.     self._model.Parent =  workspace
53.    
54.     self.JumpPowerChanged:Connect(function(_old, newJumpPower)
55.         self._humanoid.JumpPower = newJumpPower
56.     end)
57.    
58.     self.SpeedChanged:Connect(function(_old, newSpeed)
59.         self._humanoid.WalkSpeed = newSpeed
60.     end)
61. end
62.  
63. --// Methods
64. function NPC:_changeStatus(newStatus)
65.     self.Status = newStatus
66.     self.StatusChanged:Fire(newStatus)
67. end
68.  
69. function NPC:ChangeSpeed(newSpeed)
70.     assert(newSpeed and typeof(newSpeed) == 'number', '#1 Agurment \"newSpeed", is nil or is not a number')
71.    
72.     local oldSpeed = self.WalkSpeed
73.     self.Speed = newSpeed
74.     self.SpeedChanged:Fire(oldSpeed, newSpeed)
75. end
76.  
77. function NPC:ChangeJumpPower(newJumpPower)
78.     assert(newJumpPower and typeof(newJumpPower) == 'number', '#1 Agurment \"newJumpPower", is nil or is not a number')
79.  
80.     local oldJumpPower = self.JumpPower
81.     self.JumpPower = newJumpPower
82.     self.JumpPowerChanged:Fire(oldJumpPower, newJumpPower)
83. end
84.  
85. function NPC:Freeze()
86.     self:ChangeSpeed(0)
87.     self:ChangeJumpPower(0)
88.    
89.     self:_changeStatus('Freezed')
90. end
91.  
92. function NPC:Unfreeze()
93.     self:ChangeSpeed(self._defaultSpeed)
94.     self:ChangeJumpPower(self._defaultJumpPower)
95.  
96.     self:_changeStatus('Alive')
97. end
98.  
99. function NPC.Is(object)
100.     return typeof(object) == 'table' and getmetatable(object) == NPC
101. end
102.  
103. --// End
104. return NPC

You might also like