SHOW:
|
|
- or go back to the newest paste.
1 | - | ://www.roblox.com/library/105738562/Mad-Father-Alfred-Drevis--Converted with ttyyuu12345's model to script plugin v4 |
1 | + | --Converted with ttyyuu12345's model to script plugin v4 |
2 | function sandbox(var,funhttpsc) | |
3 | local env = getfenv(func) | |
4 | local newenv = setmetatable({},{ | |
5 | __index = function(self,k) | |
6 | if k=="script" then | |
7 | return var | |
8 | else | |
9 | return env[k] | |
10 | end | |
11 | end, | |
12 | }) | |
13 | setfenv(func,newenv) | |
14 | return func | |
15 | end | |
16 | cors = {} | |
17 | mas = Instance.new("Model",game:GetService("Lighting")) | |
18 | Model0 = Instance.new("Model") | |
19 | Part1 = Instance.new("Part") | |
20 | Sound2 = Instance.new("Sound") | |
21 | Sound3 = Instance.new("Sound") | |
22 | Sound4 = Instance.new("Sound") | |
23 | Decal5 = Instance.new("Decal") | |
24 | SpecialMesh6 = Instance.new("SpecialMesh") | |
25 | Weld7 = Instance.new("Weld") | |
26 | Part8 = Instance.new("Part") | |
27 | Decal9 = Instance.new("Decal") | |
28 | Motor6D10 = Instance.new("Motor6D") | |
29 | Motor6D11 = Instance.new("Motor6D") | |
30 | Motor6D12 = Instance.new("Motor6D") | |
31 | Motor6D13 = Instance.new("Motor6D") | |
32 | Motor6D14 = Instance.new("Motor6D") | |
33 | Part15 = Instance.new("Part") | |
34 | Part16 = Instance.new("Part") | |
35 | Part17 = Instance.new("Part") | |
36 | Part18 = Instance.new("Part") | |
37 | Humanoid19 = Instance.new("Humanoid") | |
38 | Part20 = Instance.new("Part") | |
39 | Motor6D21 = Instance.new("Motor6D") | |
40 | Script22 = Instance.new("Script") | |
41 | BodyColors23 = Instance.new("BodyColors") | |
42 | Script24 = Instance.new("Script") | |
43 | StringValue25 = Instance.new("StringValue") | |
44 | Animation26 = Instance.new("Animation") | |
45 | StringValue27 = Instance.new("StringValue") | |
46 | Animation28 = Instance.new("Animation") | |
47 | StringValue29 = Instance.new("StringValue") | |
48 | Animation30 = Instance.new("Animation") | |
49 | NumberValue31 = Instance.new("NumberValue") | |
50 | Animation32 = Instance.new("Animation") | |
51 | NumberValue33 = Instance.new("NumberValue") | |
52 | StringValue34 = Instance.new("StringValue") | |
53 | Animation35 = Instance.new("Animation") | |
54 | StringValue36 = Instance.new("StringValue") | |
55 | Animation37 = Instance.new("Animation") | |
56 | StringValue38 = Instance.new("StringValue") | |
57 | Animation39 = Instance.new("Animation") | |
58 | StringValue40 = Instance.new("StringValue") | |
59 | Animation41 = Instance.new("Animation") | |
60 | StringValue42 = Instance.new("StringValue") | |
61 | Animation43 = Instance.new("Animation") | |
62 | Sound44 = Instance.new("Sound") | |
63 | Script45 = Instance.new("Script") | |
64 | Animation46 = Instance.new("Animation") | |
65 | CharacterMesh47 = Instance.new("CharacterMesh") | |
66 | CharacterMesh48 = Instance.new("CharacterMesh") | |
67 | CharacterMesh49 = Instance.new("CharacterMesh") | |
68 | CharacterMesh50 = Instance.new("CharacterMesh") | |
69 | CharacterMesh51 = Instance.new("CharacterMesh") | |
70 | Shirt52 = Instance.new("Shirt") | |
71 | Pants53 = Instance.new("Pants") | |
72 | Hat54 = Instance.new("Hat") | |
73 | Part55 = Instance.new("Part") | |
74 | SpecialMesh56 = Instance.new("SpecialMesh") | |
75 | Script57 = Instance.new("Script") | |
76 | Animation58 = Instance.new("Animation") | |
77 | BindableFunction59 = Instance.new("BindableFunction") | |
78 | BindableEvent60 = Instance.new("BindableEvent") | |
79 | BindableEvent61 = Instance.new("BindableEvent") | |
80 | BindableEvent62 = Instance.new("BindableEvent") | |
81 | Configuration63 = Instance.new("Configuration") | |
82 | ObjectValue64 = Instance.new("ObjectValue") | |
83 | Configuration65 = Instance.new("Configuration") | |
84 | NumberValue66 = Instance.new("NumberValue") | |
85 | BoolValue67 = Instance.new("BoolValue") | |
86 | BoolValue68 = Instance.new("BoolValue") | |
87 | Vector3Value69 = Instance.new("Vector3Value") | |
88 | BoolValue70 = Instance.new("BoolValue") | |
89 | BrickColorValue71 = Instance.new("BrickColorValue") | |
90 | NumberValue72 = Instance.new("NumberValue") | |
91 | NumberValue73 = Instance.new("NumberValue") | |
92 | NumberValue74 = Instance.new("NumberValue") | |
93 | Model0.Name = "DrTrayBlox" | |
94 | Model0.Parent = mas | |
95 | Part1.Name = "Head" | |
96 | Part1.Parent = Model0 | |
97 | Part1.BrickColor = BrickColor.new("Pastel brown") | |
98 | Part1.Rotation = Vector3.new(0, -57.8199997, 0) | |
99 | Part1.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
100 | Part1.Locked = true | |
101 | Part1.FormFactor = Enum.FormFactor.Symmetric | |
102 | Part1.Size = Vector3.new(2, 1, 1) | |
103 | Part1.CFrame = CFrame.new(20.9954529, 4.50000906, 7.42480421, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
104 | Part1.TopSurface = Enum.SurfaceType.Smooth | |
105 | Part1.Color = Color3.new(1, 0.8, 0.6) | |
106 | Part1.Position = Vector3.new(20.9954529, 4.50000906, 7.42480421) | |
107 | Part1.Orientation = Vector3.new(0, -57.8199997, 0) | |
108 | Part1.Color = Color3.new(1, 0.8, 0.6) | |
109 | Sound2.Name = "StomedyHit" | |
110 | Sound2.Parent = Part1 | |
111 | Sound2.Pitch = 1.5 | |
112 | Sound2.SoundId = "rbxassetid://386946017" | |
113 | Sound2.Volume = 1 | |
114 | Sound3.Name = "StomedyMain" | |
115 | Sound3.Parent = Part1 | |
116 | Sound3.Volume = 1 | |
117 | Sound3.Looped = true | |
118 | Sound4.Name = "StomedyStep" | |
119 | Sound4.Parent = Part1 | |
120 | Sound4.Pitch = 2.0999999046326 | |
121 | Sound4.SoundId = "rbxassetid://379611235" | |
122 | Sound4.Volume = 1 | |
123 | Decal5.Name = "face" | |
124 | Decal5.Parent = Part1 | |
125 | Decal5.Texture = "rbxasset://textures/face.png" | |
126 | SpecialMesh6.Parent = Part1 | |
127 | SpecialMesh6.MeshId = "http://www.roblox.com/asset/?id=83001675" | |
128 | SpecialMesh6.Scale = Vector3.new(1.25, 1.25, 1.25) | |
129 | SpecialMesh6.MeshType = Enum.MeshType.FileMesh | |
130 | SpecialMesh6.Scale = Vector3.new(1.25, 1.25, 1.25) | |
131 | Weld7.Name = "HeadWeld" | |
132 | Weld7.Parent = Part1 | |
133 | Weld7.C0 = CFrame.new(0, 0.5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
134 | Weld7.C1 = CFrame.new(0, 0.200000003, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1) | |
135 | Weld7.Part0 = Part1 | |
136 | Weld7.Part1 = Part55 | |
137 | Part8.Name = "Torso" | |
138 | Part8.Parent = Model0 | |
139 | Part8.BrickColor = BrickColor.new("White") | |
140 | Part8.Rotation = Vector3.new(0, -57.8199997, 0) | |
141 | Part8.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
142 | Part8.Locked = true | |
143 | Part8.FormFactor = Enum.FormFactor.Symmetric | |
144 | Part8.Size = Vector3.new(2, 2, 1) | |
145 | Part8.CFrame = CFrame.new(20.9954529, 3.00000906, 7.42480421, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
146 | Part8.LeftSurface = Enum.SurfaceType.Weld | |
147 | Part8.RightSurface = Enum.SurfaceType.Weld | |
148 | Part8.Color = Color3.new(0.94902, 0.952941, 0.952941) | |
149 | Part8.Position = Vector3.new(20.9954529, 3.00000906, 7.42480421) | |
150 | Part8.Orientation = Vector3.new(0, -57.8199997, 0) | |
151 | Part8.Color = Color3.new(0.94902, 0.952941, 0.952941) | |
152 | Decal9.Name = "roblox" | |
153 | Decal9.Parent = Part8 | |
154 | Motor6D10.Name = "Right Shoulder" | |
155 | Motor6D10.Parent = Part8 | |
156 | Motor6D10.C0 = CFrame.new(1, 0.5, 0, 0, 0, 1, 0, 1, -0, -1, 0, 0) | |
157 | Motor6D10.C1 = CFrame.new(-0.5, 0.5, 0, 0, 0, 1, 0, 1, -0, -1, 0, 0) | |
158 | Motor6D10.Part0 = Part8 | |
159 | Motor6D10.Part1 = Part16 | |
160 | Motor6D10.MaxVelocity = 0.10000000149012 | |
161 | Motor6D11.Name = "Left Shoulder" | |
162 | Motor6D11.Parent = Part8 | |
163 | Motor6D11.C0 = CFrame.new(-1, 0.5, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0) | |
164 | Motor6D11.C1 = CFrame.new(0.5, 0.5, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0) | |
165 | Motor6D11.Part0 = Part8 | |
166 | Motor6D11.Part1 = Part15 | |
167 | Motor6D11.MaxVelocity = 0.10000000149012 | |
168 | Motor6D12.Name = "Right Hip" | |
169 | Motor6D12.Parent = Part8 | |
170 | Motor6D12.C0 = CFrame.new(1, -1, 0, 0, 0, 1, 0, 1, -0, -1, 0, 0) | |
171 | Motor6D12.C1 = CFrame.new(0.5, 1, 0, 0, 0, 1, 0, 1, -0, -1, 0, 0) | |
172 | Motor6D12.Part0 = Part8 | |
173 | Motor6D12.Part1 = Part18 | |
174 | Motor6D12.MaxVelocity = 0.10000000149012 | |
175 | Motor6D13.Name = "Left Hip" | |
176 | Motor6D13.Parent = Part8 | |
177 | Motor6D13.C0 = CFrame.new(-1, -1, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0) | |
178 | Motor6D13.C1 = CFrame.new(-0.5, 1, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0) | |
179 | Motor6D13.Part0 = Part8 | |
180 | Motor6D13.Part1 = Part17 | |
181 | Motor6D13.MaxVelocity = 0.10000000149012 | |
182 | Motor6D14.Name = "Neck" | |
183 | Motor6D14.Parent = Part8 | |
184 | Motor6D14.C0 = CFrame.new(0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, -0) | |
185 | Motor6D14.C1 = CFrame.new(0, -0.5, 0, -1, 0, 0, 0, 0, 1, 0, 1, -0) | |
186 | Motor6D14.Part0 = Part8 | |
187 | Motor6D14.Part1 = Part1 | |
188 | Motor6D14.MaxVelocity = 0.10000000149012 | |
189 | Part15.Name = "Left Arm" | |
190 | Part15.Parent = Model0 | |
191 | Part15.BrickColor = BrickColor.new("Pastel brown") | |
192 | Part15.Rotation = Vector3.new(0, -57.8199997, 0) | |
193 | Part15.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
194 | Part15.CanCollide = false | |
195 | Part15.Locked = true | |
196 | Part15.FormFactor = Enum.FormFactor.Symmetric | |
197 | Part15.Size = Vector3.new(1, 2, 1) | |
198 | Part15.CFrame = CFrame.new(20.1965046, 3.00000906, 6.1552844, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
199 | Part15.Color = Color3.new(1, 0.8, 0.6) | |
200 | Part15.Position = Vector3.new(20.1965046, 3.00000906, 6.1552844) | |
201 | Part15.Orientation = Vector3.new(0, -57.8199997, 0) | |
202 | Part15.Color = Color3.new(1, 0.8, 0.6) | |
203 | Part16.Name = "Right Arm" | |
204 | Part16.Parent = Model0 | |
205 | Part16.BrickColor = BrickColor.new("Pastel brown") | |
206 | Part16.Rotation = Vector3.new(0, -57.8199997, 0) | |
207 | Part16.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
208 | Part16.CanCollide = false | |
209 | Part16.Locked = true | |
210 | Part16.FormFactor = Enum.FormFactor.Symmetric | |
211 | Part16.Size = Vector3.new(1, 2, 1) | |
212 | Part16.CFrame = CFrame.new(21.7944012, 3.00000906, 8.69432449, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
213 | Part16.Color = Color3.new(1, 0.8, 0.6) | |
214 | Part16.Position = Vector3.new(21.7944012, 3.00000906, 8.69432449) | |
215 | Part16.Orientation = Vector3.new(0, -57.8199997, 0) | |
216 | Part16.Color = Color3.new(1, 0.8, 0.6) | |
217 | Part17.Name = "Left Leg" | |
218 | Part17.Parent = Model0 | |
219 | Part17.BrickColor = BrickColor.new("Medium blue") | |
220 | Part17.Rotation = Vector3.new(0, -57.8199997, 0) | |
221 | Part17.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
222 | Part17.CanCollide = false | |
223 | Part17.Locked = true | |
224 | Part17.FormFactor = Enum.FormFactor.Symmetric | |
225 | Part17.Size = Vector3.new(1, 2, 1) | |
226 | Part17.CFrame = CFrame.new(20.7291374, 1.00000906, 7.00163078, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
227 | Part17.BottomSurface = Enum.SurfaceType.Smooth | |
228 | Part17.Color = Color3.new(0.431373, 0.6, 0.792157) | |
229 | Part17.Position = Vector3.new(20.7291374, 1.00000906, 7.00163078) | |
230 | Part17.Orientation = Vector3.new(0, -57.8199997, 0) | |
231 | Part17.Color = Color3.new(0.431373, 0.6, 0.792157) | |
232 | Part18.Name = "Right Leg" | |
233 | Part18.Parent = Model0 | |
234 | Part18.BrickColor = BrickColor.new("Medium blue") | |
235 | Part18.Rotation = Vector3.new(0, -57.8199997, 0) | |
236 | Part18.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
237 | Part18.CanCollide = false | |
238 | Part18.Locked = true | |
239 | Part18.FormFactor = Enum.FormFactor.Symmetric | |
240 | Part18.Size = Vector3.new(1, 2, 1) | |
241 | Part18.CFrame = CFrame.new(21.2617683, 1.00000906, 7.84797764, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
242 | Part18.BottomSurface = Enum.SurfaceType.Smooth | |
243 | Part18.Color = Color3.new(0.431373, 0.6, 0.792157) | |
244 | Part18.Position = Vector3.new(21.2617683, 1.00000906, 7.84797764) | |
245 | Part18.Orientation = Vector3.new(0, -57.8199997, 0) | |
246 | Part18.Color = Color3.new(0.431373, 0.6, 0.792157) | |
247 | Humanoid19.Parent = Model0 | |
248 | Humanoid19.RightLeg = Part18 | |
249 | Humanoid19.LeftLeg = Part17 | |
250 | Humanoid19.Torso = Part20 | |
251 | Part20.Name = "HumanoidRootPart" | |
252 | Part20.Parent = Model0 | |
253 | Part20.Transparency = 1 | |
254 | Part20.Rotation = Vector3.new(0, -57.8199997, 0) | |
255 | Part20.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
256 | Part20.CanCollide = false | |
257 | Part20.Locked = true | |
258 | Part20.FormFactor = Enum.FormFactor.Symmetric | |
259 | Part20.Size = Vector3.new(2, 2, 1) | |
260 | Part20.CFrame = CFrame.new(20.9954529, 3.00000906, 7.42480421, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
261 | Part20.BottomSurface = Enum.SurfaceType.Smooth | |
262 | Part20.TopSurface = Enum.SurfaceType.Smooth | |
263 | Part20.Position = Vector3.new(20.9954529, 3.00000906, 7.42480421) | |
264 | Part20.Orientation = Vector3.new(0, -57.8199997, 0) | |
265 | Motor6D21.Name = "RootJoint" | |
266 | Motor6D21.Parent = Part20 | |
267 | Motor6D21.C0 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, -0) | |
268 | Motor6D21.C1 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, -0) | |
269 | Motor6D21.Part0 = Part20 | |
270 | Motor6D21.Part1 = Part8 | |
271 | Motor6D21.MaxVelocity = 0.10000000149012 | |
272 | Script22.Name = "Health" | |
273 | Script22.Parent = Model0 | |
274 | table.insert(cors,sandbox(Script22,function() | |
275 | --Responsible for regening a player's humanoid's health | |
276 | ||
277 | -- declarations | |
278 | local Figure = script.Parent | |
279 | local Head = Figure:WaitForChild("Head") | |
280 | local Humanoid = Figure:WaitForChild("Humanoid") | |
281 | local regening = false | |
282 | ||
283 | -- regeneration | |
284 | function regenHealth() | |
285 | if regening then return end | |
286 | regening = true | |
287 | ||
288 | while Humanoid.Health < Humanoid.MaxHealth do | |
289 | local s = wait(1) | |
290 | local health = Humanoid.Health | |
291 | if health > 0 and health < Humanoid.MaxHealth then | |
292 | local newHealthDelta = 250 * s * Humanoid.MaxHealth | |
293 | health = health + newHealthDelta | |
294 | Humanoid.Health = math.min(health,Humanoid.MaxHealth) | |
295 | end | |
296 | end | |
297 | ||
298 | if Humanoid.Health > Humanoid.MaxHealth then | |
299 | Humanoid.Health = Humanoid.MaxHealth | |
300 | end | |
301 | ||
302 | regening = false | |
303 | end | |
304 | ||
305 | Humanoid.HealthChanged:connect(regenHealth) | |
306 | ||
307 | end)) | |
308 | BodyColors23.Parent = Model0 | |
309 | BodyColors23.HeadColor = BrickColor.new("Pastel brown") | |
310 | BodyColors23.LeftArmColor = BrickColor.new("Pastel brown") | |
311 | BodyColors23.LeftLegColor = BrickColor.new("Medium blue") | |
312 | BodyColors23.RightArmColor = BrickColor.new("Pastel brown") | |
313 | BodyColors23.RightLegColor = BrickColor.new("Medium blue") | |
314 | BodyColors23.TorsoColor = BrickColor.new("White") | |
315 | Script24.Name = "AnimateSauce" | |
316 | Script24.Parent = Model0 | |
317 | table.insert(cors,sandbox(Script24,function() | |
318 | function waitForChild(parent, childName) | |
319 | local child = parent:findFirstChild(childName) | |
320 | if child then return child end | |
321 | while true do | |
322 | child = parent.ChildAdded:wait() | |
323 | if child.Name==childName then return child end | |
324 | end | |
325 | end | |
326 | local Figure = script.Parent | |
327 | local Torso = waitForChild(Figure, "Torso") | |
328 | local RightShoulder = waitForChild(Torso, "Right Shoulder") | |
329 | local LeftShoulder = waitForChild(Torso, "Left Shoulder") | |
330 | local RightHip = waitForChild(Torso, "Right Hip") | |
331 | local LeftHip = waitForChild(Torso, "Left Hip") | |
332 | local Neck = waitForChild(Torso, "Neck") | |
333 | local Humanoid; | |
334 | for _,Child in pairs(Figure:GetChildren())do | |
335 | if Child and Child.ClassName=="Humanoid"then | |
336 | Humanoid=Child; | |
337 | end; | |
338 | end; | |
339 | local pose = "Standing" | |
340 | local currentAnim = "" | |
341 | local currentAnimInstance = nil | |
342 | local currentAnimTrack = nil | |
343 | local currentAnimKeyframeHandler = nil | |
344 | local currentAnimSpeed = 1.0 | |
345 | local animTable = {} | |
346 | local animNames = { | |
347 | idle = { | |
348 | { id = "http://www.roblox.com/asset/?id=180435571", weight = 9 }, | |
349 | { id = "http://www.roblox.com/asset/?id=180435792", weight = 1 } | |
350 | }, | |
351 | walk = { | |
352 | { id = "http://www.roblox.com/asset/?id=180426354", weight = 10 } | |
353 | }, | |
354 | run = { | |
355 | { id = "http://www.roblox.com/asset/?id=252557606", weight = 20 } | |
356 | }, | |
357 | jump = { | |
358 | { id = "http://www.roblox.com/asset/?id=125750702", weight = 10 } | |
359 | }, | |
360 | fall = { | |
361 | { id = "http://www.roblox.com/asset/?id=180436148", weight = 10 } | |
362 | }, | |
363 | climb = { | |
364 | { id = "http://www.roblox.com/asset/?id=180436334", weight = 10 } | |
365 | }, | |
366 | sit = { | |
367 | { id = "http://www.roblox.com/asset/?id=178130996", weight = 10 } | |
368 | }, | |
369 | toolnone = { | |
370 | { id = "http://www.roblox.com/asset/?id=182393478", weight = 10 } | |
371 | }, | |
372 | toolslash = { | |
373 | { id = "http://www.roblox.com/asset/?id=129967390", weight = 10 } | |
374 | --{ id = "slash.xml", weight = 10 } | |
375 | }, | |
376 | toollunge = { | |
377 | { id = "http://www.roblox.com/asset/?id=129967478", weight = 10 } | |
378 | }, | |
379 | wave = { | |
380 | { id = "http://www.roblox.com/asset/?id=128777973", weight = 10 } | |
381 | }, | |
382 | point = { | |
383 | { id = "http://www.roblox.com/asset/?id=128853357", weight = 10 } | |
384 | }, | |
385 | dance1 = { | |
386 | { id = "http://www.roblox.com/asset/?id=182435998", weight = 10 }, | |
387 | { id = "http://www.roblox.com/asset/?id=182491037", weight = 10 }, | |
388 | { id = "http://www.roblox.com/asset/?id=182491065", weight = 10 } | |
389 | }, | |
390 | dance2 = { | |
391 | { id = "http://www.roblox.com/asset/?id=182436842", weight = 10 }, | |
392 | { id = "http://www.roblox.com/asset/?id=182491248", weight = 10 }, | |
393 | { id = "http://www.roblox.com/asset/?id=182491277", weight = 10 } | |
394 | }, | |
395 | dance3 = { | |
396 | { id = "http://www.roblox.com/asset/?id=182436935", weight = 10 }, | |
397 | { id = "http://www.roblox.com/asset/?id=182491368", weight = 10 }, | |
398 | { id = "http://www.roblox.com/asset/?id=182491423", weight = 10 } | |
399 | }, | |
400 | laugh = { | |
401 | { id = "http://www.roblox.com/asset/?id=129423131", weight = 10 } | |
402 | }, | |
403 | cheer = { | |
404 | { id = "http://www.roblox.com/asset/?id=129423030", weight = 10 } | |
405 | }, | |
406 | } | |
407 | local dances = {"dance1", "dance2", "dance3"} | |
408 | ||
409 | -- Existance in this list signifies that it is an emote, the value indicates if it is a looping emote | |
410 | local emoteNames = { wave = false, point = false, dance1 = true, dance2 = true, dance3 = true, laugh = false, cheer = false} | |
411 | ||
412 | function configureAnimationSet(name, fileList) | |
413 | if (animTable[name] ~= nil) then | |
414 | for _, connection in pairs(animTable[name].connections) do | |
415 | connection:disconnect() | |
416 | end | |
417 | end | |
418 | animTable[name] = {} | |
419 | animTable[name].count = 0 | |
420 | animTable[name].totalWeight = 0 | |
421 | animTable[name].connections = {} | |
422 | ||
423 | -- check for config values | |
424 | local config = script:FindFirstChild(name) | |
425 | if (config ~= nil) then | |
426 | --print("Loading anims " .. name) | |
427 | table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end)) | |
428 | table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end)) | |
429 | local idx = 1 | |
430 | for _, childPart in pairs(config:GetChildren()) do | |
431 | if (childPart:IsA("Animation")) then | |
432 | table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end)) | |
433 | animTable[name][idx] = {} | |
434 | animTable[name][idx].anim = childPart | |
435 | local weightObject = childPart:FindFirstChild("Weight") | |
436 | if (weightObject == nil) then | |
437 | animTable[name][idx].weight = 1 | |
438 | else | |
439 | animTable[name][idx].weight = weightObject.Value | |
440 | end | |
441 | animTable[name].count = animTable[name].count + 1 | |
442 | animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight | |
443 | --print(name .. " [" .. idx .. "] " .. animTable[name][idx].anim.AnimationId .. " (" .. animTable[name][idx].weight .. ")") | |
444 | idx = idx + 1 | |
445 | end | |
446 | end | |
447 | end | |
448 | ||
449 | -- fallback to defaults | |
450 | if (animTable[name].count <= 0) then | |
451 | for idx, anim in pairs(fileList) do | |
452 | animTable[name][idx] = {} | |
453 | animTable[name][idx].anim = Instance.new("Animation") | |
454 | animTable[name][idx].anim.Name = name | |
455 | animTable[name][idx].anim.AnimationId = anim.id | |
456 | animTable[name][idx].weight = anim.weight | |
457 | animTable[name].count = animTable[name].count + 1 | |
458 | animTable[name].totalWeight = animTable[name].totalWeight + anim.weight | |
459 | --print(name .. " [" .. idx .. "] " .. anim.id .. " (" .. anim.weight .. ")") | |
460 | end | |
461 | end | |
462 | end | |
463 | ||
464 | -- Setup animation objects | |
465 | function scriptChildModified(child) | |
466 | local fileList = animNames[child.Name] | |
467 | if (fileList ~= nil) then | |
468 | configureAnimationSet(child.Name, fileList) | |
469 | end | |
470 | end | |
471 | ||
472 | script.ChildAdded:connect(scriptChildModified) | |
473 | script.ChildRemoved:connect(scriptChildModified) | |
474 | ||
475 | ||
476 | for name, fileList in pairs(animNames) do | |
477 | configureAnimationSet(name, fileList) | |
478 | end | |
479 | ||
480 | -- ANIMATION | |
481 | ||
482 | -- declarations | |
483 | local toolAnim = "None" | |
484 | local toolAnimTime = 0 | |
485 | ||
486 | local jumpAnimTime = 0 | |
487 | local jumpAnimDuration = 0.3 | |
488 | ||
489 | local toolTransitionTime = 0.1 | |
490 | local fallTransitionTime = 0.3 | |
491 | local jumpMaxLimbVelocity = 0.75 | |
492 | ||
493 | -- functions | |
494 | ||
495 | function stopAllAnimations() | |
496 | local oldAnim = currentAnim | |
497 | ||
498 | -- return to idle if finishing an emote | |
499 | if (emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false) then | |
500 | oldAnim = "idle" | |
501 | end | |
502 | ||
503 | currentAnim = "" | |
504 | currentAnimInstance = nil | |
505 | if (currentAnimKeyframeHandler ~= nil) then | |
506 | currentAnimKeyframeHandler:disconnect() | |
507 | end | |
508 | ||
509 | if (currentAnimTrack ~= nil) then | |
510 | currentAnimTrack:Stop() | |
511 | currentAnimTrack:Destroy() | |
512 | currentAnimTrack = nil | |
513 | end | |
514 | return oldAnim | |
515 | end | |
516 | ||
517 | function setAnimationSpeed(speed) | |
518 | if speed ~= currentAnimSpeed then | |
519 | currentAnimSpeed = speed | |
520 | currentAnimTrack:AdjustSpeed(currentAnimSpeed) | |
521 | end | |
522 | end | |
523 | ||
524 | function keyFrameReachedFunc(frameName) | |
525 | if (frameName == "End") then | |
526 | ||
527 | local repeatAnim = currentAnim | |
528 | -- return to idle if finishing an emote | |
529 | if (emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false) then | |
530 | repeatAnim = "idle" | |
531 | end | |
532 | ||
533 | local animSpeed = currentAnimSpeed | |
534 | playAnimation(repeatAnim, 0.0, Humanoid) | |
535 | setAnimationSpeed(animSpeed) | |
536 | end | |
537 | end | |
538 | ||
539 | -- Preload animations | |
540 | function playAnimation(animName, transitionTime, humanoid) | |
541 | ||
542 | local roll = math.random(1, animTable[animName].totalWeight) | |
543 | local origRoll = roll | |
544 | local idx = 1 | |
545 | while (roll > animTable[animName][idx].weight) do | |
546 | roll = roll - animTable[animName][idx].weight | |
547 | idx = idx + 1 | |
548 | end | |
549 | --print(animName .. " " .. idx .. " [" .. origRoll .. "]") | |
550 | local anim = animTable[animName][idx].anim | |
551 | -- switch animation | |
552 | if (anim ~= currentAnimInstance) then | |
553 | if (currentAnimTrack ~= nil) then | |
554 | currentAnimTrack:Stop(transitionTime) | |
555 | currentAnimTrack:Destroy() | |
556 | end | |
557 | currentAnimSpeed = 1.0 | |
558 | -- load it to the humanoid; get AnimationTrack | |
559 | currentAnimTrack = humanoid:LoadAnimation(anim) | |
560 | -- play the animation | |
561 | currentAnimTrack:Play(transitionTime) | |
562 | currentAnim = animName | |
563 | currentAnimInstance = anim | |
564 | -- set up keyframe name triggers | |
565 | if (currentAnimKeyframeHandler ~= nil) then | |
566 | currentAnimKeyframeHandler:disconnect() | |
567 | end | |
568 | currentAnimKeyframeHandler = currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc) | |
569 | end | |
570 | end | |
571 | ------------------------------------------------------------------------------------------- | |
572 | ------------------------------------------------------------------------------------------- | |
573 | local toolAnimName = "" | |
574 | local toolAnimTrack = nil | |
575 | local toolAnimInstance = nil | |
576 | local currentToolAnimKeyframeHandler = nil | |
577 | function toolKeyFrameReachedFunc(frameName) | |
578 | if (frameName == "End") then | |
579 | --print("Keyframe : ".. frameName) | |
580 | playToolAnimation(toolAnimName, 0.0, Humanoid) | |
581 | end | |
582 | end | |
583 | function playToolAnimation(animName, transitionTime, humanoid) | |
584 | local roll = math.random(1, animTable[animName].totalWeight) | |
585 | local origRoll = roll | |
586 | local idx = 1 | |
587 | while (roll > animTable[animName][idx].weight) do | |
588 | roll = roll - animTable[animName][idx].weight | |
589 | idx = idx + 1 | |
590 | end | |
591 | --print(animName .. " * " .. idx .. " [" .. origRoll .. "]") | |
592 | local anim = animTable[animName][idx].anim | |
593 | if (toolAnimInstance ~= anim) then | |
594 | if (toolAnimTrack ~= nil) then | |
595 | toolAnimTrack:Stop() | |
596 | toolAnimTrack:Destroy() | |
597 | transitionTime = 0 | |
598 | end | |
599 | -- load it to the humanoid; get AnimationTrack | |
600 | toolAnimTrack = humanoid:LoadAnimation(anim) | |
601 | -- play the animation | |
602 | toolAnimTrack:Play(transitionTime) | |
603 | toolAnimName = animName | |
604 | toolAnimInstance = anim | |
605 | currentToolAnimKeyframeHandler = toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc) | |
606 | end | |
607 | end | |
608 | function stopToolAnimations() | |
609 | local oldAnim = toolAnimName | |
610 | if (currentToolAnimKeyframeHandler ~= nil) then | |
611 | currentToolAnimKeyframeHandler:disconnect() | |
612 | end | |
613 | toolAnimName = "" | |
614 | toolAnimInstance = nil | |
615 | if (toolAnimTrack ~= nil) then | |
616 | toolAnimTrack:Stop() | |
617 | toolAnimTrack:Destroy() | |
618 | toolAnimTrack = nil | |
619 | end | |
620 | return oldAnim | |
621 | end | |
622 | ------------------------------------------------------------------------------------------- | |
623 | ------------------------------------------------------------------------------------------- | |
624 | function onRunning(speed) | |
625 | if speed>0.01 then | |
626 | if Figure and Humanoid and Humanoid.WalkSpeed<17 then | |
627 | playAnimation("walk", 0.1, Humanoid); | |
628 | elseif Figure and Humanoid and Humanoid.WalkSpeed>17 then | |
629 | playAnimation("run", 0.1, Humanoid); | |
630 | end; | |
631 | if currentAnimInstance and currentAnimInstance.AnimationId == "http://www.roblox.com/asset/?id=180426354" then | |
632 | setAnimationSpeed(speed / 14.5) | |
633 | end | |
634 | pose = "Running" | |
635 | else | |
636 | playAnimation("idle", 0.1, Humanoid) | |
637 | pose = "Standing" | |
638 | end | |
639 | end | |
640 | function onDied() | |
641 | pose = "Dead" | |
642 | end | |
643 | function onJumping() | |
644 | playAnimation("jump", 0.1, Humanoid) | |
645 | jumpAnimTime = jumpAnimDuration | |
646 | pose = "Jumping" | |
647 | end | |
648 | function onClimbing(speed) | |
649 | playAnimation("climb", 0.1, Humanoid) | |
650 | setAnimationSpeed(speed / 12.0) | |
651 | pose = "Climbing" | |
652 | end | |
653 | function onGettingUp() | |
654 | pose = "GettingUp" | |
655 | end | |
656 | function onFreeFall() | |
657 | if (jumpAnimTime <= 0) then | |
658 | playAnimation("fall", fallTransitionTime, Humanoid) | |
659 | end | |
660 | pose = "FreeFall" | |
661 | end | |
662 | function onFallingDown() | |
663 | pose = "FallingDown" | |
664 | end | |
665 | function onSeated() | |
666 | pose = "Seated" | |
667 | end | |
668 | function onPlatformStanding() | |
669 | pose = "PlatformStanding" | |
670 | end | |
671 | function onSwimming(speed) | |
672 | if speed>0 then | |
673 | pose = "Running" | |
674 | else | |
675 | pose = "Standing" | |
676 | end | |
677 | end | |
678 | ||
679 | function getTool() | |
680 | for _, kid in ipairs(Figure:GetChildren()) do | |
681 | if kid.className == "Tool" then return kid end | |
682 | end | |
683 | return nil | |
684 | end | |
685 | ||
686 | function getToolAnim(tool) | |
687 | for _, c in ipairs(tool:GetChildren()) do | |
688 | if c.Name == "toolanim" and c.className == "StringValue" then | |
689 | return c | |
690 | end | |
691 | end | |
692 | return nil | |
693 | end | |
694 | ||
695 | function animateTool() | |
696 | ||
697 | if (toolAnim == "None") then | |
698 | playToolAnimation("toolnone", toolTransitionTime, Humanoid) | |
699 | return | |
700 | end | |
701 | ||
702 | if (toolAnim == "Slash") then | |
703 | playToolAnimation("toolslash", 0, Humanoid) | |
704 | return | |
705 | end | |
706 | ||
707 | if (toolAnim == "Lunge") then | |
708 | playToolAnimation("toollunge", 0, Humanoid) | |
709 | return | |
710 | end | |
711 | end | |
712 | ||
713 | function moveSit() | |
714 | RightShoulder.MaxVelocity = 0.15 | |
715 | LeftShoulder.MaxVelocity = 0.15 | |
716 | RightShoulder:SetDesiredAngle(3.14 /2) | |
717 | LeftShoulder:SetDesiredAngle(-3.14 /2) | |
718 | RightHip:SetDesiredAngle(3.14 /2) | |
719 | LeftHip:SetDesiredAngle(-3.14 /2) | |
720 | end | |
721 | ||
722 | local lastTick = 0 | |
723 | ||
724 | function move(time) | |
725 | local amplitude = 1 | |
726 | local frequency = 1 | |
727 | local deltaTime = time - lastTick | |
728 | lastTick = time | |
729 | ||
730 | local climbFudge = 0 | |
731 | local setAngles = false | |
732 | ||
733 | if (jumpAnimTime > 0) then | |
734 | jumpAnimTime = jumpAnimTime - deltaTime | |
735 | end | |
736 | ||
737 | if (pose == "FreeFall" and jumpAnimTime <= 0) then | |
738 | playAnimation("fall", fallTransitionTime, Humanoid) | |
739 | elseif (pose == "Seated") then | |
740 | playAnimation("sit", 0.5, Humanoid) | |
741 | return | |
742 | elseif (pose == "Running") then | |
743 | if Figure and Humanoid and Humanoid.WalkSpeed<17 then | |
744 | playAnimation("walk", 0.1, Humanoid); | |
745 | elseif Figure and Humanoid and Humanoid.WalkSpeed>17 then | |
746 | playAnimation("run", 0.1, Humanoid); | |
747 | end; | |
748 | elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then | |
749 | stopAllAnimations() | |
750 | amplitude = 0.1 | |
751 | frequency = 1 | |
752 | setAngles = true | |
753 | end | |
754 | if (setAngles) then | |
755 | local desiredAngle = amplitude * math.sin(time * frequency) | |
756 | RightShoulder:SetDesiredAngle(desiredAngle + climbFudge) | |
757 | LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge) | |
758 | RightHip:SetDesiredAngle(-desiredAngle) | |
759 | LeftHip:SetDesiredAngle(-desiredAngle) | |
760 | end | |
761 | -- Tool Animation handling | |
762 | local tool = getTool() | |
763 | if tool and tool:FindFirstChild("Handle") then | |
764 | local animStringValueObject = getToolAnim(tool) | |
765 | if animStringValueObject then | |
766 | toolAnim = animStringValueObject.Value | |
767 | -- message recieved, delete StringValue | |
768 | animStringValueObject.Parent = nil | |
769 | toolAnimTime = time + .3 | |
770 | end | |
771 | if time > toolAnimTime then | |
772 | toolAnimTime = 0 | |
773 | toolAnim = "None" | |
774 | end | |
775 | animateTool() | |
776 | else | |
777 | stopToolAnimations() | |
778 | toolAnim = "None" | |
779 | toolAnimInstance = nil | |
780 | toolAnimTime = 0 | |
781 | end | |
782 | end | |
783 | -- connect events | |
784 | Humanoid.Died:connect(onDied) | |
785 | Humanoid.Running:connect(onRunning) | |
786 | Humanoid.Jumping:connect(onJumping) | |
787 | Humanoid.Climbing:connect(onClimbing) | |
788 | Humanoid.GettingUp:connect(onGettingUp) | |
789 | Humanoid.FreeFalling:connect(onFreeFall) | |
790 | Humanoid.FallingDown:connect(onFallingDown) | |
791 | Humanoid.Seated:connect(onSeated) | |
792 | Humanoid.PlatformStanding:connect(onPlatformStanding) | |
793 | Humanoid.Swimming:connect(onSwimming) | |
794 | local runService = game:GetService("RunService"); | |
795 | playAnimation("idle", 0.1, Humanoid) | |
796 | pose = "Standing" | |
797 | while Wait(0)do | |
798 | local _,time=wait(0) | |
799 | move(time) | |
800 | end | |
801 | end)) | |
802 | StringValue25.Name = "climb" | |
803 | StringValue25.Parent = Script24 | |
804 | Animation26.Name = "ClimbAnim" | |
805 | Animation26.Parent = StringValue25 | |
806 | Animation26.AnimationId = "http://www.roblox.com/asset/?id=180436334" | |
807 | StringValue27.Name = "fall" | |
808 | StringValue27.Parent = Script24 | |
809 | Animation28.Name = "FallAnim" | |
810 | Animation28.Parent = StringValue27 | |
811 | Animation28.AnimationId = "http://www.roblox.com/asset/?id=180436148" | |
812 | StringValue29.Name = "idle" | |
813 | StringValue29.Parent = Script24 | |
814 | Animation30.Name = "Animation1" | |
815 | Animation30.Parent = StringValue29 | |
816 | Animation30.AnimationId = "http://www.roblox.com/asset/?id=180435571" | |
817 | NumberValue31.Name = "Weight" | |
818 | NumberValue31.Parent = Animation30 | |
819 | NumberValue31.Value = 9 | |
820 | Animation32.Name = "Animation2" | |
821 | Animation32.Parent = StringValue29 | |
822 | Animation32.AnimationId = "http://www.roblox.com/asset/?id=180435792" | |
823 | NumberValue33.Name = "Weight" | |
824 | NumberValue33.Parent = Animation32 | |
825 | NumberValue33.Value = 1 | |
826 | StringValue34.Name = "jump" | |
827 | StringValue34.Parent = Script24 | |
828 | Animation35.Name = "JumpAnim" | |
829 | Animation35.Parent = StringValue34 | |
830 | Animation35.AnimationId = "http://www.roblox.com/asset/?id=125750702" | |
831 | StringValue36.Name = "run" | |
832 | StringValue36.Parent = Script24 | |
833 | Animation37.Name = "RunAnim" | |
834 | Animation37.Parent = StringValue36 | |
835 | Animation37.AnimationId = "http://www.roblox.com/asset/?id=252557606" | |
836 | StringValue38.Name = "sit" | |
837 | StringValue38.Parent = Script24 | |
838 | Animation39.Name = "SitAnim" | |
839 | Animation39.Parent = StringValue38 | |
840 | Animation39.AnimationId = "http://www.roblox.com/asset/?id=178130996" | |
841 | StringValue40.Name = "toolnone" | |
842 | StringValue40.Parent = Script24 | |
843 | Animation41.Name = "ToolNoneAnim" | |
844 | Animation41.Parent = StringValue40 | |
845 | Animation41.AnimationId = "http://www.roblox.com/asset/?id=182393478" | |
846 | StringValue42.Name = "walk" | |
847 | StringValue42.Parent = Script24 | |
848 | Animation43.Name = "WalkAnim" | |
849 | Animation43.Parent = StringValue42 | |
850 | Animation43.AnimationId = "http://www.roblox.com/asset/?id=180426354" | |
851 | Sound44.Name = "Cardboard" | |
852 | Sound44.Parent = Model0 | |
853 | Sound44.SoundId = "rbxassetid://409476963" | |
854 | Sound44.Volume = 1 | |
855 | Sound44.Looped = true | |
856 | Script45.Name = "StomedyMain" | |
857 | Script45.Parent = Model0 | |
858 | table.insert(cors,sandbox(Script45,function() | |
859 | --[[ By: Brutez. ]]-- | |
860 | local StomedyScript=script; | |
861 | repeat Wait(0)until StomedyScript and StomedyScript.Parent and StomedyScript.Parent:IsA("Model")and StomedyScript.Parent:FindFirstChild("Head")and StomedyScript.Parent:FindFirstChild("Torso"); | |
862 | local Stomedy=StomedyScript.Parent; | |
863 | function raycast(Spos,vec,currentdist) | |
864 | local hit2,pos2=game.Workspace:FindPartOnRay(Ray.new(Spos+(vec*.05),vec*currentdist),Stomedy); | |
865 | if hit2~=nil and pos2 then | |
866 | if hit2.Name=="Handle" and not hit2.CanCollide or string.sub(hit2.Name,1,6)=="Effect"and not hit2.CanCollide then | |
867 | local currentdist=currentdist-(pos2-Spos).magnitude; | |
868 | return raycast(pos2,vec,currentdist); | |
869 | end; | |
870 | end; | |
871 | return hit2,pos2; | |
872 | end; | |
873 | function RayCast(Position,Direction,MaxDistance,IgnoreList) | |
874 | return Game:GetService("Workspace"):FindPartOnRayWithIgnoreList(Ray.new(Position,Direction.unit*(MaxDistance or 999.999)),IgnoreList); | |
875 | end; | |
876 | local StomedyHumanoid; | |
877 | for _,Child in pairs(Stomedy:GetChildren())do | |
878 | if Child~=nil and Child:IsA("Humanoid")and Child.Health~=0 then | |
879 | StomedyHumanoid=Child; | |
880 | end; | |
881 | end; | |
882 | local AttackDebounce=false; | |
883 | local StomedyHead=Stomedy:FindFirstChild("Head"); | |
884 | local StomedyHumanoidRootPart=Stomedy:FindFirstChild("HumanoidRootPart"); | |
885 | local WalkDebounce=false; | |
886 | local DynamicWander=true; | |
887 | local MusicDebounce=false; | |
888 | local OriginalC0; | |
889 | if StomedyScript~=nil and Stomedy~=nil and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck")then | |
890 | Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0=CFrame.new(0,1,0,-1,0,0,0,0,1,0,1,-0); | |
891 | OriginalC0=Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0; | |
892 | end; | |
893 | function FindNearestBae() | |
894 | local NoticeDistance=200; | |
895 | local TargetMain; | |
896 | for _,TargetModel in pairs(Game:GetService("Workspace"):GetChildren())do | |
897 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and TargetModel:IsA("Model")and TargetModel~=Stomedy and TargetModel.Name~=Stomedy.Name and TargetModel:FindFirstChild("Torso")and TargetModel:FindFirstChild("Head")then | |
898 | local TargetPart=TargetModel:FindFirstChild("Torso"); | |
899 | local FoundHumanoid; | |
900 | for _,Child in pairs(TargetModel:GetChildren())do | |
901 | if Child~=nil and Child:IsA("Humanoid")and Child.Health~=0 then | |
902 | FoundHumanoid=Child; | |
903 | end; | |
904 | end; | |
905 | if TargetModel~=nil and TargetPart~=nil and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(TargetPart.Position-StomedyHumanoidRootPart.Position).magnitude<NoticeDistance then | |
906 | TargetMain=TargetPart; | |
907 | NoticeDistance=(TargetPart.Position-StomedyHumanoidRootPart.Position).magnitude; | |
908 | end; | |
909 | end; | |
910 | end; | |
911 | return TargetMain; | |
912 | end; | |
913 | while Wait(0)do | |
914 | if StomedyScript~=nil and Stomedy~=nil and StomedyHead~=nil and StomedyHead:FindFirstChild("StomedyMain")and not StomedyHead:FindFirstChild("StomedyMain").IsPlaying then | |
915 | StomedyHead:FindFirstChild("StomedyMain"):Play(); | |
916 | end; | |
917 | local TargetPoint=StomedyHumanoid.TargetPoint; | |
918 | local Blockage,BlockagePos=RayCast((StomedyHumanoidRootPart.CFrame+CFrame.new(StomedyHumanoidRootPart.Position,Vector3.new(TargetPoint.X,StomedyHumanoidRootPart.Position.Y,TargetPoint.Z)).lookVector*(StomedyHumanoidRootPart.Size.Z/2)).p,StomedyHumanoidRootPart.CFrame.lookVector,(StomedyHumanoidRootPart.Size.Z*2.5),{Stomedy,Stomedy}) | |
919 | local Jumpable=false; | |
920 | local MainTarget=FindNearestBae(); | |
921 | local BlockageHumanoid; | |
922 | if Blockage~=nil then | |
923 | if Blockage~=nil and Blockage.Parent~=nil and Blockage.Parent:IsA("Model")then | |
924 | for _,Child in pairs(Blockage.Parent:GetChildren())do | |
925 | if Child~=nil and Child:IsA("Humanoid")and Child.Health~=0 then | |
926 | BlockageHumanoid=Child; | |
927 | end; | |
928 | end; | |
929 | end; | |
930 | Jumpable=true; | |
931 | if Blockage and Blockage:IsA("Terrain")then | |
932 | local CellPos=Blockage:WorldToCellPreferSolid((BlockagePos-Vector3.new(0,2,0))); | |
933 | local CellMaterial,CellShape,CellOrientation=Blockage:GetCell(CellPos.X,CellPos.Y,CellPos.Z); | |
934 | if CellMaterial==Enum.CellMaterial.Water or MainTarget and Blockage:IsDescendantOf(MainTarget.Parent)or BlockageHumanoid~=nil then | |
935 | Jumpable=false; | |
936 | end; | |
937 | elseif Blockage.ClassName=="TrussPart"or Blockage.ClassName=="WedgePart"or Blockage.Name=="Handle"and Blockage.Parent:IsA("Hat")or Blockage.Name=="Handle"and Blockage.Parent:IsA("Tool")or MainTarget and Blockage:IsDescendantOf(MainTarget.Parent)or BlockageHumanoid~=nil then | |
938 | Jumpable=false; | |
939 | end; | |
940 | end; | |
941 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and not StomedyHumanoid.Sit and Jumpable then | |
942 | StomedyHumanoid.Jump=true; | |
943 | end; | |
944 | if StomedyScript and Stomedy and StomedyHead and StomedyHumanoidRootPart and StomedyHead:FindFirstChild("StomedyStep")and (StomedyHumanoidRootPart.Velocity-Vector3.new(0,StomedyHumanoidRootPart.Velocity.y,0)).magnitude>=5 and not WalkDebounce and StomedyHumanoid and StomedyHumanoid.Health~=0 then | |
945 | Spawn(function() | |
946 | WalkDebounce=true; | |
947 | local FiredRay=Ray.new(StomedyHumanoidRootPart.Position,Vector3.new(0,-4,0)); | |
948 | local RayTarget,endPoint=Game:GetService("Workspace"):FindPartOnRay(FiredRay,Stomedy); | |
949 | if RayTarget then | |
950 | local StomedyHeadFootStepClone=StomedyHead:FindFirstChild("StomedyStep"):Clone(); | |
951 | StomedyHeadFootStepClone.Parent=StomedyHead; | |
952 | StomedyHeadFootStepClone:Play(); | |
953 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and StomedyHumanoid.WalkSpeed<17 then | |
954 | Wait(0.4); | |
955 | elseif StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and StomedyHumanoid.WalkSpeed>17 then | |
956 | Wait(0.15); | |
957 | end | |
958 | end; | |
959 | WalkDebounce=false; | |
960 | end); | |
961 | end; | |
962 | local MainTarget=FindNearestBae(); | |
963 | local FoundHumanoid; | |
964 | if MainTarget~=nil then | |
965 | for _,Child in pairs(MainTarget.Parent:GetChildren())do | |
966 | if Child~=nil and Child:IsA("Humanoid")and Child.Health~=0 then | |
967 | FoundHumanoid=Child; | |
968 | end; | |
969 | end; | |
970 | end; | |
971 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and MainTarget and MainTarget.Parent and FoundHumanoid~=nil and FoundHumanoid.Jump then | |
972 | StomedyHumanoid.Jump=true; | |
973 | end; | |
974 | if not AttackDebounce and StomedyScript~=nil and Stomedy~=nil and StomedyHumanoid~=nil and StomedyHumanoid.Health~=0 and StomedyHead~=nil and StomedyHead:FindFirstChild("StomedyHit")and MainTarget~=nil and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(MainTarget.Position-StomedyHumanoidRootPart.Position).magnitude<6 then | |
975 | local hit,pos=raycast(StomedyHumanoidRootPart.Position,(MainTarget.Position-StomedyHumanoidRootPart.Position).unit,500) | |
976 | if hit~=nil and hit:IsDescendantOf(MainTarget.Parent)then | |
977 | Spawn(function() | |
978 | AttackDebounce=true; | |
979 | local SwingAnimation=StomedyHumanoid:LoadAnimation(StomedyScript:FindFirstChild("Swing")); | |
980 | SwingAnimation:Play(); | |
981 | SwingAnimation:AdjustSpeed(2+math.random()*0.6) | |
982 | local HitSoundClone=StomedyHead:FindFirstChild("StomedyHit"):Clone(); | |
983 | HitSoundClone.Pitch=StomedyHead:FindFirstChild("StomedyHit").Pitch+math.random()*0.1; | |
984 | HitSoundClone.Parent=StomedyHead; | |
985 | HitSoundClone:Play(); | |
986 | FoundHumanoid:TakeDamage(10); | |
987 | Wait(0.2+math.random()*0.2); | |
988 | AttackDebounce=false; | |
989 | end); | |
990 | end; | |
991 | end; | |
992 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and MainTarget and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(MainTarget.Position-StomedyHumanoidRootPart.Position).magnitude<150 then | |
993 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")and not Stomedy:FindFirstChild("Cardboard").IsPlaying then | |
994 | Stomedy:FindFirstChild("Cardboard").Volume=1; | |
995 | Stomedy:FindFirstChild("Cardboard"):Play(); | |
996 | end; | |
997 | elseif StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 and MainTarget and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(MainTarget.Position-StomedyHumanoidRootPart.Position).magnitude>150 then | |
998 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")and Stomedy:FindFirstChild("Cardboard").IsPlaying then | |
999 | if not MusicDebounce then | |
1000 | Spawn(function() | |
1001 | MusicDebounce=true; | |
1002 | repeat Wait(0);if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")then Stomedy:FindFirstChild("Cardboard").Volume=Stomedy:FindFirstChild("Cardboard").Volume-0.01;else break;end;until Stomedy:FindFirstChild("Cardboard").Volume==0 or Stomedy:FindFirstChild("Cardboard").Volume<0; | |
1003 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")then | |
1004 | Stomedy:FindFirstChild("Cardboard").Volume=0; | |
1005 | Stomedy:FindFirstChild("Cardboard"):Stop(); | |
1006 | end; | |
1007 | MusicDebounce=false; | |
1008 | end); | |
1009 | end; | |
1010 | end; | |
1011 | end; | |
1012 | if not MainTarget and not MusicDebounce then | |
1013 | Spawn(function() | |
1014 | MusicDebounce=true; | |
1015 | repeat Wait(0);if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")then Stomedy:FindFirstChild("Cardboard").Volume=Stomedy:FindFirstChild("Cardboard").Volume-0.01;else break;end;until Stomedy:FindFirstChild("Cardboard").Volume==0 or Stomedy:FindFirstChild("Cardboard").Volume<0; | |
1016 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Cardboard")then | |
1017 | Stomedy:FindFirstChild("Cardboard").Volume=0; | |
1018 | Stomedy:FindFirstChild("Cardboard"):Stop(); | |
1019 | end; | |
1020 | MusicDebounce=false; | |
1021 | end); | |
1022 | end; | |
1023 | if MainTarget~=nil then | |
1024 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Health~=0 then | |
1025 | if MainTarget~=nil and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(MainTarget.Position-StomedyHumanoidRootPart.Position).magnitude>5 then | |
1026 | StomedyHumanoid.WalkSpeed=50; | |
1027 | elseif MainTarget~=nil and FoundHumanoid~=nil and FoundHumanoid.Health~=0 and(MainTarget.Position-StomedyHumanoidRootPart.Position).magnitude<5 then | |
1028 | StomedyHumanoid.WalkSpeed=10; | |
1029 | end; | |
1030 | end; | |
1031 | if StomedyScript~=nil and Stomedy~=nil and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck")then | |
1032 | local NeckRotation=(Stomedy:FindFirstChild("Torso").Position.Y-MainTarget.Parent:FindFirstChild("Head").Position.Y)/10; | |
1033 | if NeckRotation>-1.5 and NeckRotation<1.5 then | |
1034 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck")then | |
1035 | Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0=OriginalC0*CFrame.fromEulerAnglesXYZ(NeckRotation,0,0); | |
1036 | end; | |
1037 | end; | |
1038 | if NeckRotation<-1.5 then | |
1039 | Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0=CFrame.new(0,1,0,-1,0,0,0,-0.993636549,0.112633869,0,0.112633869,0.993636549); | |
1040 | elseif NeckRotation>1.5 then | |
1041 | if StomedyScript and Stomedy and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck")then | |
1042 | Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0=CFrame.new(0,1,0,-1,0,0,0,0.996671617,0.081521146,0,0.081521146,-0.996671617); | |
1043 | end; | |
1044 | end; | |
1045 | end; | |
1046 | else | |
1047 | if StomedyScript~=nil and Stomedy~=nil and Stomedy:FindFirstChild("Points")then | |
1048 | local PointsModel=Stomedy:FindFirstChild("Points"); | |
1049 | if PointsModel~=nil and #PointsModel:GetChildren()~=0 then | |
1050 | PointsModel:ClearAllChildren(); | |
1051 | end; | |
1052 | end; | |
1053 | if StomedyScript~=nil and Stomedy~=nil and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck")then | |
1054 | Stomedy:FindFirstChild("Torso"):FindFirstChild("Neck").C0=CFrame.new(0,1,0,-1,0,0,0,0,1,0,1,-0); | |
1055 | end; | |
1056 | if StomedyScript and Stomedy and StomedyHumanoid then | |
1057 | StomedyHumanoid.WalkSpeed=12; | |
1058 | end; | |
1059 | local SwitchWander=math.random(1,2000); | |
1060 | if SwitchWander==1 and not DynamicWander then | |
1061 | DynamicWander=true; | |
1062 | elseif SwitchWander==1 and DynamicWander then | |
1063 | DynamicWander=false; | |
1064 | end; | |
1065 | local WalkChance=math.random(1,40); | |
1066 | if WalkChance==1 and StomedyScript and Stomedy and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Head")and StomedyHumanoid and StomedyHumanoid.Health>0.001 and not DynamicWander then | |
1067 | elseif StomedyScript and Stomedy and Stomedy:FindFirstChild("Torso")and Stomedy:FindFirstChild("Head")and StomedyHumanoid and StomedyHumanoid.Health>0.001 and DynamicWander then | |
1068 | local WanderAngle=(math.random()-0.5)*1; | |
1069 | local RotatingLookVector=CFrame.Angles(0,WanderAngle,0)*script.Parent.Torso.CFrame.lookVector; | |
1070 | StomedyHumanoid:MoveTo(Stomedy:FindFirstChild("Torso").Position+6*RotatingLookVector,Stomedy:FindFirstChild("Torso")); | |
1071 | end; | |
1072 | end; | |
1073 | if StomedyScript and Stomedy and StomedyHumanoid then | |
1074 | StomedyHumanoid.DisplayDistanceType="None"; | |
1075 | StomedyHumanoid.HealthDisplayDistance=0; | |
1076 | StomedyHumanoid.NameDisplayDistance=0; | |
1077 | StomedyHumanoid.NameOcclusion="EnemyOcclusion"; | |
1078 | StomedyHumanoid.AutoJumpEnabled=true; | |
1079 | StomedyHumanoid.AutoRotate=true; | |
1080 | StomedyHumanoid.MaxHealth=99999e99999; | |
1081 | StomedyHumanoid.Health=99999e99999; | |
1082 | StomedyHumanoid.JumpPower=100; | |
1083 | StomedyHumanoid.MaxSlopeAngle=89.9; | |
1084 | end; | |
1085 | if StomedyScript and Stomedy and StomedyHumanoid and not StomedyHumanoid.AutoJumpEnabled then | |
1086 | StomedyHumanoid.AutoJumpEnabled=true; | |
1087 | end; | |
1088 | if StomedyScript and Stomedy and StomedyHumanoid and not StomedyHumanoid.AutoRotate then | |
1089 | StomedyHumanoid.AutoRotate=true; | |
1090 | end; | |
1091 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.PlatformStand then | |
1092 | StomedyHumanoid.PlatformStand=false; | |
1093 | end; | |
1094 | if StomedyScript and Stomedy and StomedyHumanoid and StomedyHumanoid.Sit then | |
1095 | StomedyHumanoid.Sit=false; | |
1096 | end; | |
1097 | end; | |
1098 | --[[ By: Brutez. ]]-- | |
1099 | end)) | |
1100 | Animation46.Name = "Swing" | |
1101 | Animation46.Parent = Script45 | |
1102 | Animation46.AnimationId = "rbxassetid://191123156" | |
1103 | CharacterMesh47.Name = "Roblox 3.0 Right Leg" | |
1104 | CharacterMesh47.Parent = Model0 | |
1105 | CharacterMesh47.MeshId = 81487710 | |
1106 | CharacterMesh47.BodyPart = Enum.BodyPart.RightLeg | |
1107 | CharacterMesh48.Name = "Roblox 3.0 torso" | |
1108 | CharacterMesh48.Parent = Model0 | |
1109 | CharacterMesh48.MeshId = 82907945 | |
1110 | CharacterMesh48.BodyPart = Enum.BodyPart.Torso | |
1111 | CharacterMesh49.Name = "Roblox 3.0 Left Arm" | |
1112 | CharacterMesh49.Parent = Model0 | |
1113 | CharacterMesh49.MeshId = 82907977 | |
1114 | CharacterMesh49.BodyPart = Enum.BodyPart.LeftArm | |
1115 | CharacterMesh50.Name = "Roblox 3.0 Left Leg" | |
1116 | CharacterMesh50.Parent = Model0 | |
1117 | CharacterMesh50.MeshId = 81487640 | |
1118 | CharacterMesh50.BodyPart = Enum.BodyPart.LeftLeg | |
1119 | CharacterMesh51.Name = "Roblox 3.0 Right Arm" | |
1120 | CharacterMesh51.Parent = Model0 | |
1121 | CharacterMesh51.MeshId = 82908019 | |
1122 | CharacterMesh51.BodyPart = Enum.BodyPart.RightArm | |
1123 | Shirt52.Name = "Shirt" | |
1124 | Shirt52.Parent = Model0 | |
1125 | Shirt52.ShirtTemplate = "http://www.roblox.com/asset/?id=359526867" | |
1126 | Pants53.Name = "Pants" | |
1127 | Pants53.Parent = Model0 | |
1128 | Pants53.PantsTemplate = "http://www.roblox.com/asset/?id=242081979" | |
1129 | Hat54.Name = "RoboKnitHat" | |
1130 | Hat54.Parent = Model0 | |
1131 | Hat54.AttachmentPos = Vector3.new(0, 0.200000003, 0) | |
1132 | Part55.Name = "Handle" | |
1133 | Part55.Parent = Hat54 | |
1134 | Part55.Rotation = Vector3.new(0, -57.8199997, 0) | |
1135 | Part55.Velocity = Vector3.new(1.40129846e-45, 0, 1.40129846e-45) | |
1136 | Part55.CanCollide = false | |
1137 | Part55.Locked = true | |
1138 | Part55.FormFactor = Enum.FormFactor.Custom | |
1139 | Part55.Size = Vector3.new(1.84000015, 1.79000008, 2.03999972) | |
1140 | Part55.CFrame = CFrame.new(20.9954529, 4.80000925, 7.42480421, 0.53263253, 0, -0.846346557, 0, 1, 0, 0.846346557, 0, 0.53263253) | |
1141 | Part55.BottomSurface = Enum.SurfaceType.Smooth | |
1142 | Part55.TopSurface = Enum.SurfaceType.Smooth | |
1143 | Part55.Position = Vector3.new(20.9954529, 4.80000925, 7.42480421) | |
1144 | Part55.Orientation = Vector3.new(0, -57.8199997, 0) | |
1145 | SpecialMesh56.Parent = Part55 | |
1146 | SpecialMesh56.MeshId = "http://www.roblox.com/asset/?id=215693829 " | |
1147 | SpecialMesh56.TextureId = "http://www.roblox.com/asset/?id=215694384 " | |
1148 | SpecialMesh56.MeshType = Enum.MeshType.FileMesh | |
1149 | Script57.Name = "MonsterScript" | |
1150 | Script57.Parent = Model0 | |
1151 | table.insert(cors,sandbox(Script57,function() | |
1152 | --[[ | |
1153 | Basic Monster by ArceusInator | |
1154 | ||
1155 | Information: | |
1156 | Configurations.MaximumDetectionDistance (default 200) | |
1157 | The monster will not detect players past this point. If you set it to a negative number then the monster will be able to chase from any distance. | |
1158 | ||
1159 | Configurations.CanGiveUp (default true) | |
1160 | If true, the monster will give up if its target goes past the MaximumDetectionDistance. This is a pretty good idea if you have people teleporting around. | |
1161 | ||
1162 | Configurations.CanRespawn (default true) | |
1163 | If true, the monster will respawn after it dies | |
1164 | ||
1165 | Configurations.AutoDetectSpawnPoint (default true) | |
1166 | If true, the spawn point will be auto detected based on where the monster is when it starts | |
1167 | ||
1168 | Configurations.SpawnPoint (default 0,0,0) | |
1169 | If Settings.AutoDetectSpawnPoint is disabled, this will be set to the monster's initial position. This value will be used when the monster auto respawns to tell it where to spawn next. | |
1170 | ||
1171 | Configurations.FriendlyTeam (default Really black) | |
1172 | The monster will not attack players on this team | |
1173 | ||
1174 | ||
1175 | ||
1176 | Mind.CurrentTargetHumanoid (Humanoid objects only) | |
1177 | You can force the monster to follow a certain humanoid by setting this to that humanoid | |
1178 | ||
1179 | ||
1180 | ||
1181 | Monster.Respawn (Function) | |
1182 | Arguments are: Vector3 point | |
1183 | Info: Respawns the monster at the given point, or at the SpawnPoint setting if none if provided | |
1184 | ||
1185 | Monster.Died (Event) | |
1186 | Info: Fired when the monster dies | |
1187 | ||
1188 | Monster.Respawned (Event) | |
1189 | Info: Fired when the monster respawns | |
1190 | --]] | |
1191 | ||
1192 | local Self = script.Parent | |
1193 | local Settings = Self:FindFirstChild'Configurations' -- Points to the settings. | |
1194 | local Mind = Self:FindFirstChild'Mind' -- Points to the monster's mind. You can edit parts of this from other scripts in-game to change the monster's behavior. Advanced users only. | |
1195 | ||
1196 | -- | |
1197 | -- Verify that everything is where it should be | |
1198 | assert(Self:FindFirstChild'Humanoid' ~= nil, 'Monster does not have a humanoid') | |
1199 | assert(Settings ~= nil, 'Monster does not have a Configurations object') | |
1200 | assert(Settings:FindFirstChild'MaximumDetectionDistance' ~= nil and Settings.MaximumDetectionDistance:IsA'NumberValue', 'Monster does not have a MaximumDetectionDistance (NumberValue) setting') | |
1201 | assert(Settings:FindFirstChild'CanGiveUp' ~= nil and Settings.CanGiveUp:IsA'BoolValue', 'Monster does not have a CanGiveUp (BoolValue) setting') | |
1202 | assert(Settings:FindFirstChild'CanRespawn' ~= nil and Settings.CanRespawn:IsA'BoolValue', 'Monster does not have a CanRespawn (BoolValue) setting') | |
1203 | assert(Settings:FindFirstChild'SpawnPoint' ~= nil and Settings.SpawnPoint:IsA'Vector3Value', 'Monster does not have a SpawnPoint (Vector3Value) setting') | |
1204 | assert(Settings:FindFirstChild'AutoDetectSpawnPoint' ~= nil and Settings.AutoDetectSpawnPoint:IsA'BoolValue', 'Monster does not have a AutoDetectSpawnPoint (BoolValue) setting') | |
1205 | assert(Settings:FindFirstChild'FriendlyTeam' ~= nil and Settings.FriendlyTeam:IsA'BrickColorValue', 'Monster does not have a FriendlyTeam (BrickColorValue) setting') | |
1206 | assert(Settings:FindFirstChild'AttackDamage' ~= nil and Settings.AttackDamage:IsA'NumberValue', 'Monster does not have a AttackDamage (NumberValue) setting') | |
1207 | assert(Settings:FindFirstChild'AttackFrequency' ~= nil and Settings.AttackFrequency:IsA'NumberValue', 'Monster does not have a AttackFrequency (NumberValue) setting') | |
1208 | assert(Settings:FindFirstChild'AttackRange' ~= nil and Settings.AttackRange:IsA'NumberValue', 'Monster does not have a AttackRange (NumberValue) setting') | |
1209 | assert(Mind ~= nil, 'Monster does not have a Mind object') | |
1210 | assert(Mind:FindFirstChild'CurrentTargetHumanoid' ~= nil and Mind.CurrentTargetHumanoid:IsA'ObjectValue', 'Monster does not have a CurrentTargetHumanoid (ObjectValue) mind setting') | |
1211 | assert(Self:FindFirstChild'Respawn' and Self.Respawn:IsA'BindableFunction', 'Monster does not have a Respawn BindableFunction') | |
1212 | assert(Self:FindFirstChild'Died' and Self.Died:IsA'BindableEvent', 'Monster does not have a Died BindableEvent') | |
1213 | assert(Self:FindFirstChild'Respawned' and Self.Died:IsA'BindableEvent', 'Monster does not have a Respawned BindableEvent') | |
1214 | assert(Self:FindFirstChild'Attacked' and Self.Died:IsA'BindableEvent', 'Monster does not have a Attacked BindableEvent') | |
1215 | assert(script:FindFirstChild'Attack' and script.Attack:IsA'Animation', 'Monster does not have a MonsterScript.Attack Animation') | |
1216 | ||
1217 | ||
1218 | -- | |
1219 | -- | |
1220 | local Info = { | |
1221 | -- These are constant values. Don't change them unless you know what you're doing. | |
1222 | ||
1223 | -- Services | |
1224 | Players = Game:GetService 'Players', | |
1225 | PathfindingService = Game:GetService 'PathfindingService', | |
1226 | ||
1227 | -- Advanced settings | |
1228 | RecomputePathFrequency = 1, -- The monster will recompute its path this many times per second | |
1229 | RespawnWaitTime = 5, -- How long to wait before the monster respawns | |
1230 | JumpCheckFrequency = 1, -- How many times per second it will do a jump check | |
1231 | } | |
1232 | local Data = { | |
1233 | -- These are variable values used internally by the script. Advanced users only. | |
1234 | ||
1235 | LastRecomputePath = 0, | |
1236 | Recomputing = false, -- Reocmputing occurs async, meaning this script will still run while it's happening. This variable will prevent the script from running two recomputes at once. | |
1237 | PathCoords = {}, | |
1238 | IsDead = false, | |
1239 | TimeOfDeath = 0, | |
1240 | CurrentNode = nil, | |
1241 | CurrentNodeIndex = 1, | |
1242 | AutoRecompute = true, | |
1243 | LastJumpCheck = 0, | |
1244 | LastAttack = 0, | |
1245 | ||
1246 | BaseMonster = Self:Clone(), | |
1247 | AttackTrack = nil, | |
1248 | } | |
1249 | ||
1250 | -- | |
1251 | -- | |
1252 | local Monster = {} -- Create the monster class | |
1253 | ||
1254 | ||
1255 | function Monster:GetCFrame() | |
1256 | -- Returns the CFrame of the monster's humanoidrootpart | |
1257 | ||
1258 | local humanoidRootPart = Self:FindFirstChild('HumanoidRootPart') | |
1259 | ||
1260 | if humanoidRootPart ~= nil and humanoidRootPart:IsA('BasePart') then | |
1261 | return humanoidRootPart.CFrame | |
1262 | else | |
1263 | return CFrame.new() | |
1264 | end | |
1265 | end | |
1266 | ||
1267 | function Monster:GetMaximumDetectionDistance() | |
1268 | -- Returns the maximum detection distance | |
1269 | ||
1270 | local setting = Settings.MaximumDetectionDistance.Value | |
1271 | ||
1272 | if setting < 0 then | |
1273 | return math.huge | |
1274 | else | |
1275 | return setting | |
1276 | end | |
1277 | end | |
1278 | ||
1279 | function Monster:SearchForTarget() | |
1280 | -- Finds the closest player and sets the target | |
1281 | ||
1282 | local players = Info.Players:GetPlayers() | |
1283 | local closestCharacter, closestCharacterDistance | |
1284 | ||
1285 | for i=1, #players do | |
1286 | local player = players[i] | |
1287 | ||
1288 | if player.Neutral or player.TeamColor ~= Settings.FriendlyTeam.Value then | |
1289 | local character = player.Character | |
1290 | ||
1291 | if character ~= nil and character:FindFirstChild('Humanoid') ~= nil and character.Humanoid:IsA('Humanoid') then | |
1292 | local distance = player:DistanceFromCharacter(Monster:GetCFrame().p) | |
1293 | ||
1294 | if distance < Monster:GetMaximumDetectionDistance() then | |
1295 | if closestCharacter == nil then | |
1296 | closestCharacter, closestCharacterDistance = character, distance | |
1297 | else | |
1298 | if closestCharacterDistance > distance then | |
1299 | closestCharacter, closestCharacterDistance = character, distance | |
1300 | end | |
1301 | end | |
1302 | end | |
1303 | end | |
1304 | end | |
1305 | end | |
1306 | ||
1307 | ||
1308 | if closestCharacter ~= nil then | |
1309 | Mind.CurrentTargetHumanoid.Value = closestCharacter.Humanoid | |
1310 | end | |
1311 | end | |
1312 | ||
1313 | function Monster:TryRecomputePath() | |
1314 | if Data.AutoRecompute or tick() - Data.LastRecomputePath > 1/Info.RecomputePathFrequency then | |
1315 | Monster:RecomputePath() | |
1316 | end | |
1317 | end | |
1318 | ||
1319 | function Monster:GetTargetCFrame() | |
1320 | local targetHumanoid = Mind.CurrentTargetHumanoid.Value | |
1321 | ||
1322 | if Monster:TargetIsValid() then | |
1323 | return targetHumanoid.Torso.CFrame | |
1324 | else | |
1325 | return CFrame.new() | |
1326 | end | |
1327 | end | |
1328 | ||
1329 | function Monster:IsAlive() | |
1330 | return Self.Humanoid.Health > 0 and Self.Humanoid.Torso ~= nil | |
1331 | end | |
1332 | ||
1333 | function Monster:TargetIsValid() | |
1334 | local targetHumanoid = Mind.CurrentTargetHumanoid.Value | |
1335 | ||
1336 | if targetHumanoid ~= nil and targetHumanoid:IsA 'Humanoid' and targetHumanoid.Torso ~= nil and targetHumanoid.Torso:IsA 'BasePart' then | |
1337 | return true | |
1338 | else | |
1339 | return false | |
1340 | end | |
1341 | end | |
1342 | ||
1343 | function Monster:HasClearLineOfSight() | |
1344 | -- Going to cast a ray to see if I can just see my target | |
1345 | local myPos, targetPos = Monster:GetCFrame().p, Monster:GetTargetCFrame().p | |
1346 | ||
1347 | local hit, pos = Workspace:FindPartOnRayWithIgnoreList( | |
1348 | Ray.new( | |
1349 | myPos, | |
1350 | targetPos - myPos | |
1351 | ), | |
1352 | { | |
1353 | Self, | |
1354 | Mind.CurrentTargetHumanoid.Value.Parent | |
1355 | } | |
1356 | ) | |
1357 | ||
1358 | ||
1359 | if hit == nil then | |
1360 | return true | |
1361 | else | |
1362 | return false | |
1363 | end | |
1364 | end | |
1365 | ||
1366 | function Monster:RecomputePath() | |
1367 | if not Data.Recomputing then | |
1368 | if Monster:IsAlive() and Monster:TargetIsValid() then | |
1369 | if Monster:HasClearLineOfSight() then | |
1370 | Data.AutoRecompute = true | |
1371 | Data.PathCoords = { | |
1372 | Monster:GetCFrame().p, | |
1373 | Monster:GetTargetCFrame().p | |
1374 | } | |
1375 | ||
1376 | Data.LastRecomputePath = tick() | |
1377 | Data.CurrentNode = nil | |
1378 | Data.CurrentNodeIndex = 2 -- Starts chasing the target without evaluating its current position | |
1379 | else | |
1380 | -- Do pathfinding since you can't walk straight | |
1381 | Data.Recomputing = true -- Basically a debounce. | |
1382 | Data.AutoRecompute = false | |
1383 | ||
1384 | ||
1385 | local path = Info.PathfindingService:ComputeSmoothPathAsync( | |
1386 | Monster:GetCFrame().p, | |
1387 | Monster:GetTargetCFrame().p, | |
1388 | 500 | |
1389 | ) | |
1390 | Data.PathCoords = path:GetPointCoordinates() | |
1391 | ||
1392 | ||
1393 | Data.Recomputing = false | |
1394 | Data.LastRecomputePath = tick() | |
1395 | Data.CurrentNode = nil | |
1396 | Data.CurrentNodeIndex = 1 | |
1397 | end | |
1398 | end | |
1399 | end | |
1400 | end | |
1401 | ||
1402 | function Monster:Update() | |
1403 | Monster:ReevaluateTarget() | |
1404 | Monster:SearchForTarget() | |
1405 | Monster:TryRecomputePath() | |
1406 | Monster:TravelPath() | |
1407 | end | |
1408 | ||
1409 | function Monster:TravelPath() | |
1410 | local closest, closestDistance, closestIndex | |
1411 | local myPosition = Monster:GetCFrame().p | |
1412 | local skipCurrentNode = Data.CurrentNode ~= nil and (Data.CurrentNode - myPosition).magnitude < 3 | |
1413 | ||
1414 | for i=Data.CurrentNodeIndex, #Data.PathCoords do | |
1415 | local coord = Data.PathCoords[i] | |
1416 | if not (skipCurrentNode and coord == Data.CurrentNode) then | |
1417 | local distance = (coord - myPosition).magnitude | |
1418 | ||
1419 | if closest == nil then | |
1420 | closest, closestDistance, closestIndex = coord, distance, i | |
1421 | else | |
1422 | if distance < closestDistance then | |
1423 | closest, closestDistance, closestIndex = coord, distance, i | |
1424 | else | |
1425 | break | |
1426 | end | |
1427 | end | |
1428 | end | |
1429 | end | |
1430 | ||
1431 | ||
1432 | -- | |
1433 | if closest ~= nil then | |
1434 | Data.CurrentNode = closest | |
1435 | Data.CurrentNodeIndex = closestIndex | |
1436 | ||
1437 | local humanoid = Self:FindFirstChild 'Humanoid' | |
1438 | ||
1439 | if humanoid ~= nil and humanoid:IsA'Humanoid' then | |
1440 | humanoid:MoveTo(closest) | |
1441 | end | |
1442 | ||
1443 | if Monster:IsAlive() and Monster:TargetIsValid() then | |
1444 | Monster:TryJumpCheck() | |
1445 | Monster:TryAttack() | |
1446 | end | |
1447 | ||
1448 | if closestIndex == #Data.PathCoords then | |
1449 | -- Reached the end of the path, force a new check | |
1450 | Data.AutoRecompute = true | |
1451 | end | |
1452 | end | |
1453 | end | |
1454 | ||
1455 | function Monster:TryJumpCheck() | |
1456 | if tick() - Data.LastJumpCheck > 1/Info.JumpCheckFrequency then | |
1457 | Monster:JumpCheck() | |
1458 | end | |
1459 | end | |
1460 | ||
1461 | function Monster:TryAttack() | |
1462 | if tick() - Data.LastAttack > 1/Settings.AttackFrequency.Value then | |
1463 | Monster:Attack() | |
1464 | end | |
1465 | end | |
1466 | ||
1467 | function Monster:Attack() | |
1468 | local myPos, targetPos = Monster:GetCFrame().p, Monster:GetTargetCFrame().p | |
1469 | ||
1470 | if (myPos - targetPos).magnitude <= Settings.AttackRange.Value then | |
1471 | Mind.CurrentTargetHumanoid.Value:TakeDamage(Settings.AttackDamage.Value) | |
1472 | Data.LastAttack = tick() | |
1473 | Data.AttackTrack:Play() | |
1474 | end | |
1475 | end | |
1476 | ||
1477 | function Monster:JumpCheck() | |
1478 | -- Do a raycast to check if we need to jump | |
1479 | local myCFrame = Monster:GetCFrame() | |
1480 | local checkVector = (Monster:GetTargetCFrame().p - myCFrame.p).unit*2 | |
1481 | ||
1482 | local hit, pos = Workspace:FindPartOnRay( | |
1483 | Ray.new( | |
1484 | myCFrame.p + Vector3.new(0, -2.4, 0), | |
1485 | checkVector | |
1486 | ), | |
1487 | Self | |
1488 | ) | |
1489 | ||
1490 | if hit ~= nil and not hit:IsDescendantOf(Mind.CurrentTargetHumanoid.Value.Parent) then | |
1491 | -- Do a slope check to make sure we're not walking up a ramp | |
1492 | ||
1493 | local hit2, pos2 = Workspace:FindPartOnRay( | |
1494 | Ray.new( | |
1495 | myCFrame.p + Vector3.new(0, -2.3, 0), | |
1496 | checkVector | |
1497 | ), | |
1498 | Self | |
1499 | ) | |
1500 | ||
1501 | if hit2 == hit then | |
1502 | if ((pos2 - pos)*Vector3.new(1,0,1)).magnitude < 0.05 then -- Will pass for any ramp with <2 slope | |
1503 | Self.Humanoid.Jump = true | |
1504 | end | |
1505 | end | |
1506 | end | |
1507 | ||
1508 | Data.LastJumpCheck = tick() | |
1509 | end | |
1510 | ||
1511 | function Monster:Connect() | |
1512 | Mind.CurrentTargetHumanoid.Changed:connect(function(humanoid) | |
1513 | if humanoid ~= nil then | |
1514 | assert(humanoid:IsA'Humanoid', 'Monster target must be a humanoid') | |
1515 | ||
1516 | Monster:RecomputePath() | |
1517 | end | |
1518 | end) | |
1519 | ||
1520 | Self.Respawn.OnInvoke = function(point) | |
1521 | Monster:Respawn(point) | |
1522 | end | |
1523 | end | |
1524 | ||
1525 | function Monster:Initialize() | |
1526 | Monster:Connect() | |
1527 | ||
1528 | if Settings.AutoDetectSpawnPoint.Value then | |
1529 | Settings.SpawnPoint.Value = Monster:GetCFrame().p | |
1530 | end | |
1531 | end | |
1532 | ||
1533 | function Monster:Respawn(point) | |
1534 | local point = point or Settings.SpawnPoint.Value | |
1535 | ||
1536 | for index, obj in next, Data.BaseMonster:Clone():GetChildren() do | |
1537 | if obj.Name == 'Configurations' or obj.Name == 'Mind' or obj.Name == 'Respawned' or obj.Name == 'Died' or obj.Name == 'MonsterScript' or obj.Name == 'Respawn' then | |
1538 | obj:Destroy() | |
1539 | else | |
1540 | Self[obj.Name]:Destroy() | |
1541 | obj.Parent = Self | |
1542 | end | |
1543 | end | |
1544 | ||
1545 | Monster:InitializeUnique() | |
1546 | ||
1547 | Self.Parent = Workspace | |
1548 | ||
1549 | Self.HumanoidRootPart.CFrame = CFrame.new(point) | |
1550 | Settings.SpawnPoint.Value = point | |
1551 | Self.Respawned:Fire() | |
1552 | end | |
1553 | ||
1554 | function Monster:InitializeUnique() | |
1555 | Data.AttackTrack = Self.Humanoid:LoadAnimation(script.Attack) | |
1556 | end | |
1557 | ||
1558 | function Monster:ReevaluateTarget() | |
1559 | local currentTarget = Mind.CurrentTargetHumanoid.Value | |
1560 | ||
1561 | if currentTarget ~= nil and currentTarget:IsA'Humanoid' then | |
1562 | local character = currentTarget.Parent | |
1563 | ||
1564 | if character ~= nil then | |
1565 | local player = Info.Players:GetPlayerFromCharacter(character) | |
1566 | ||
1567 | if player ~= nil then | |
1568 | if not player.Neutral and player.TeamColor == Settings.FriendlyTeam.Value then | |
1569 | Mind.CurrentTargetHumanoid.Value = nil | |
1570 | end | |
1571 | end | |
1572 | end | |
1573 | ||
1574 | ||
1575 | if currentTarget == Mind.CurrentTargetHumanoid.Value then | |
1576 | local torso = currentTarget.Torso | |
1577 | ||
1578 | if torso ~= nil and torso:IsA 'BasePart' then | |
1579 | if Settings.CanGiveUp.Value and (torso.Position - Monster:GetCFrame().p).magnitude > Monster:GetMaximumDetectionDistance() then | |
1580 | Mind.CurrentTargetHumanoid.Value = nil | |
1581 | end | |
1582 | end | |
1583 | end | |
1584 | end | |
1585 | end | |
1586 | ||
1587 | -- | |
1588 | -- | |
1589 | Monster:Initialize() | |
1590 | Monster:InitializeUnique() | |
1591 | ||
1592 | while true do | |
1593 | if not Monster:IsAlive() then | |
1594 | if Data.IsDead == false then | |
1595 | Data.IsDead = true | |
1596 | Data.TimeOfDeath = tick() | |
1597 | Self.Died:Fire() | |
1598 | end | |
1599 | if Data.IsDead == true then | |
1600 | if tick()-Data.TimeOfDeath > Info.RespawnWaitTime then | |
1601 | Monster:Respawn() | |
1602 | end | |
1603 | end | |
1604 | end | |
1605 | ||
1606 | if Monster:IsAlive() then | |
1607 | Monster:Update() | |
1608 | end | |
1609 | ||
1610 | wait() | |
1611 | end | |
1612 | end)) | |
1613 | Animation58.Name = "Attack" | |
1614 | Animation58.Parent = Script57 | |
1615 | Animation58.AnimationId = "rbxassetid://0" | |
1616 | BindableFunction59.Name = "Respawn" | |
1617 | BindableFunction59.Parent = Model0 | |
1618 | BindableEvent60.Name = "Attacked" | |
1619 | BindableEvent60.Parent = Model0 | |
1620 | BindableEvent61.Name = "Died" | |
1621 | BindableEvent61.Parent = Model0 | |
1622 | BindableEvent62.Name = "Respawned" | |
1623 | BindableEvent62.Parent = Model0 | |
1624 | Configuration63.Name = "Mind" | |
1625 | Configuration63.Parent = Model0 | |
1626 | ObjectValue64.Name = "CurrentTargetHumanoid" | |
1627 | ObjectValue64.Parent = Configuration63 | |
1628 | Configuration65.Name = "Configurations" | |
1629 | Configuration65.Parent = Model0 | |
1630 | NumberValue66.Name = "MaximumDetectionDistance" | |
1631 | NumberValue66.Parent = Configuration65 | |
1632 | NumberValue66.Value = 200 | |
1633 | BoolValue67.Name = "CanGiveUp" | |
1634 | BoolValue67.Parent = Configuration65 | |
1635 | BoolValue67.Value = true | |
1636 | BoolValue68.Name = "CanRespawn" | |
1637 | BoolValue68.Parent = Configuration65 | |
1638 | BoolValue68.Value = true | |
1639 | Vector3Value69.Name = "SpawnPoint" | |
1640 | Vector3Value69.Parent = Configuration65 | |
1641 | Vector3Value69.Value = Vector3.new(24.2997856, 5.00000095, -33.0201225) | |
1642 | BoolValue70.Name = "AutoDetectSpawnPoint" | |
1643 | BoolValue70.Parent = Configuration65 | |
1644 | BoolValue70.Value = true | |
1645 | BrickColorValue71.Name = "FriendlyTeam" | |
1646 | BrickColorValue71.Parent = Configuration65 | |
1647 | BrickColorValue71.Value = BrickColor.new("Really black") | |
1648 | NumberValue72.Name = "AttackDamage" | |
1649 | NumberValue72.Parent = Configuration65 | |
1650 | NumberValue73.Name = "AttackFrequency" | |
1651 | NumberValue73.Parent = Configuration65 | |
1652 | NumberValue73.Value = 2 | |
1653 | NumberValue74.Name = "AttackRange" | |
1654 | NumberValue74.Parent = Configuration65 | |
1655 | NumberValue74.Value = 3 | |
1656 | for i,v in pairs(mas:GetChildren()) do | |
1657 | v.Parent = workspace | |
1658 | pcall(function() v:MakeJoints() end) | |
1659 | end | |
1660 | mas:Destroy() | |
1661 | for i,v in pairs(cors) do | |
1662 | spawn(function() | |
1663 | pcall(v) | |
1664 | end) | |
1665 | end |