Professional Documents
Culture Documents
Code
Code
--// 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