SHOW:
|
|
- or go back to the newest paste.
1 | -- | made by 0866!!!!!!! and abacaxl!!!!!!!! | |
2 | -- | tysm unverified | |
3 | -- | tutorial and info: https://docs.google.com/document/d/16gb1NGq-ajBO55EgPhFBVq1DrpMdpk2qVPMaCpWrI5c/edit?usp=sharing | |
4 | ||
5 | -- | should be functional for non-VR users, rightclick/leftclick = point right/left arm, may perform worse | |
6 | -- | things you can do: | |
7 | -- use tools and the likes (not functional with RagdollEnabled) | |
8 | -- move and interact with the luxury of a full body (no leg tracking, feet auto place) | |
9 | -- interact with things as a robloxian, accurate sizing and full body allows for full immersion | |
10 | -- play as your own roblox character by enabling RagdollEnabled (R6 only, RagdollHeadMovement adds an extra 10 seconds to script startup) | |
11 | -- move & teleport accurately by pointing your right hand and holding-releasing Y or B | |
12 | -- view nearby players chatting & view nearby characters including yourself in the bottom right, good for recording videos | |
13 | -- total customizability over what you appear as (Ragdoll disabled only) | |
14 | ||
15 | -- | this version will likely be patched by roblox soon, we will be rewriting it to be worth selling long after this release! | |
16 | ||
17 | --|| Controls: | |
18 | ||
19 | -- [ R2 ] - Sprint | |
20 | -- [ L2 ] - Crouch | |
21 | -- [ L2 TAP ] - Chat HUD | |
22 | ||
23 | -- [ Y ] - Point Walk -- movement joystick works -- may or may not be mixed up with the Teleport button | |
24 | -- [ B ] - Point Teleport -- may or may not be mixed up with the Walk button | |
25 | -- [ X ] - RagdollEnabled die | |
26 | ||
27 | -- [ C ] - Non-VR Teleport | |
28 | -- [ LSHIFT ] - Non-VR Sprint | |
29 | -- [ LCTRL ] - Non-VR Crouch | |
30 | ||
31 | -- Default Roblox VR controls are included | |
32 | ||
33 | --|| Settings: | |
34 | ||
35 | local StudsOffset = 0.1 -- Character height offset (make negative if you're too high) | |
36 | local Smoothness = 0.3 -- Character interpolation (0.1 - 1 = smooth - rigid) | |
37 | ||
38 | local AnchorCharacter = true -- Prevent physics from causing inconsistencies (Keep this on for accurate tool positioning) | |
39 | local HideCharacter = false -- Hide character on a faraway platform | |
40 | local NoCollision = true -- Disable collision with nearby players | |
41 | ||
42 | local ChatEnabled = true -- See chat on your left hand in-game (Toggle with the crouch button lol) | |
43 | local ChatLocalRange = 70 -- Local chat range | |
44 | ||
45 | local ViewportEnabled = true -- View yourself and nearby players in a frame | |
46 | local ViewportRange = 30 -- Maximum distance players are updated | |
47 | ||
48 | local RagdollEnabled = false -- Use your character instead of hats (NetworkOwner vulnerability) | |
49 | local RagdollHeadMovement = true -- Move your head separately from your body (+9 second wait) | |
50 | ||
51 | local AutoRun = false -- Rerun script on respawn | |
52 | local AutoRespawn = true -- Reset when your virtual body dies | |
53 | ||
54 | local WearAllAccessories = true -- Use all leftover hats for the head | |
55 | local AccurateHandPosition = false -- Position your Roblox hands according to your real hands | |
56 | ||
57 | local AccessorySettings = { | |
58 | LeftArm = "LavanderHair"; -- Name of hat used as this limb | |
59 | RightArm = "Pal Hair"; -- Name of hat used as this limb | |
60 | LeftLeg = "Kate Hair"; -- Name of hat used as this limb | |
61 | RightLeg = "Hat1"; -- Name of hat used as this limb | |
62 | Torso = "SeeMonkey"; -- Name of hat used as this limb | |
63 | Head = true; -- Are extra hats assumed to be worn? | |
64 | ||
65 | BlockArms = true; -- Remove accessory meshes of this limb | |
66 | BlockLegs = true; -- Remove accessory meshes of this limb | |
67 | BlockTorso = true; -- Remove accessory meshes of this limb | |
68 | ||
69 | LimbOffset = CFrame.Angles(math.rad(90), 0, 0); -- Don't touch | |
70 | } | |
71 | ||
72 | local FootPlacementSettings = { | |
73 | RightOffset = Vector3.new(.5, 0, 0), | |
74 | LeftOffset = Vector3.new(-.5, 0, 0), | |
75 | } | |
76 | ||
77 | --|| Script: | |
78 | ||
79 | local Script = nil; | |
80 | local Pointer = nil; | |
81 | ||
82 | -- My coding style changed throughout this a lot lol | |
83 | ||
84 | Script = function() | |
85 | ||
86 | --[[ | |
87 | Variables | |
88 | --]] | |
89 | ||
90 | local Players = game:GetService("Players") | |
91 | local Client = Players.LocalPlayer | |
92 | local Character = Client.Character or Client.CharacterAdded:Wait() | |
93 | local WeldBase = Character:WaitForChild("HumanoidRootPart") | |
94 | local ArmBase = Character:FindFirstChild("RightHand") or Character:FindFirstChild("Right Arm") or WeldBase | |
95 | local Backpack = Client:WaitForChild("Backpack") | |
96 | local Mouse = Client:GetMouse() | |
97 | ||
98 | local Camera = workspace.CurrentCamera | |
99 | ||
100 | local VRService = game:GetService("VRService") | |
101 | local VRReady = VRService.VREnabled | |
102 | ||
103 | local UserInputService = game:GetService("UserInputService") | |
104 | local RunService = game:GetService("RunService") | |
105 | local HttpService = game:GetService("HttpService") | |
106 | local StarterGui = game:GetService("StarterGui") | |
107 | ||
108 | local HeadAccessories = {}; | |
109 | local UsedAccessories = {}; | |
110 | ||
111 | local Pointer = false; | |
112 | local Point1 = false; | |
113 | local Point2 = false; | |
114 | ||
115 | - | local VirtualRig = game:GetObjects("rbxassetid://4468539481")[1] |
115 | + | local VirtualRig = game:GetObjects("rbxassetid://4751215545")[1] |
116 | - | local VirtualBody = game:GetObjects("rbxassetid://4464983829")[1] |
116 | + | local VirtualBody = game:GetObjects("rbxassetid://4751214267")[1] |
117 | ||
118 | local Anchor = Instance.new("Part") | |
119 | ||
120 | Anchor.Anchored = true | |
121 | Anchor.Transparency = 1 | |
122 | Anchor.CanCollide = false | |
123 | Anchor.Parent = workspace | |
124 | ||
125 | if RagdollEnabled then | |
126 | if script:FindFirstChild("Network") then | |
127 | Network = require(script.Network) | |
128 | else | |
129 | - | Network = loadstring(game:HttpGet("https://pastebin.com/raw/bJms9qqM", true))() |
129 | + | Network = loadstring(game:HttpGet("https://pastebin.com/raw/urW3UwJY", true))() |
130 | end | |
131 | Network:Claim(); | |
132 | end | |
133 | ||
134 | StarterGui:SetCore("VRLaserPointerMode", 3) | |
135 | ||
136 | --[[ | |
137 | Character Protection | |
138 | --]] | |
139 | ||
140 | local CharacterCFrame = WeldBase.CFrame | |
141 | ||
142 | if not RagdollEnabled then | |
143 | Character.Humanoid.AnimationPlayed:Connect(function(Animation) | |
144 | Animation:Stop() | |
145 | end) | |
146 | ||
147 | for _, Track in next, Character.Humanoid:GetPlayingAnimationTracks() do | |
148 | Track:Stop() | |
149 | end | |
150 | ||
151 | wait(.5) | |
152 | ||
153 | if HideCharacter then | |
154 | local Platform = Instance.new("Part") | |
155 | ||
156 | Platform.Anchored = true | |
157 | Platform.Size = Vector3.new(100, 5, 100) | |
158 | Platform.CFrame = CFrame.new(0, 10000, 0) | |
159 | Platform.Transparency = 1 | |
160 | Platform.Parent = workspace | |
161 | ||
162 | Character:MoveTo(Platform.Position + Vector3.new(0, 5, 0)) | |
163 | ||
164 | wait(.5) | |
165 | end | |
166 | ||
167 | if AnchorCharacter then | |
168 | for _, Part in pairs(Character:GetChildren()) do | |
169 | if Part:IsA("BasePart") then | |
170 | Part.Anchored = true | |
171 | end | |
172 | end | |
173 | end | |
174 | end | |
175 | ||
176 | --[[ | |
177 | Functions | |
178 | --]] | |
179 | ||
180 | function Tween(Object, Style, Direction, Time, Goal) | |
181 | local tweenInfo = TweenInfo.new(Time, Enum.EasingStyle[Style], Enum.EasingDirection[Direction]) | |
182 | local tween = game:GetService("TweenService"):Create(Object, tweenInfo, Goal) | |
183 | ||
184 | tween.Completed:Connect(function() | |
185 | tween:Destroy() | |
186 | end) | |
187 | ||
188 | tween:Play() | |
189 | ||
190 | return tween | |
191 | end | |
192 | ||
193 | local function GetMotorForLimb(Limb) | |
194 | for _, Motor in next, Character:GetDescendants() do | |
195 | if Motor:IsA("Motor6D") and Motor.Part1 == Limb then | |
196 | return Motor | |
197 | end | |
198 | end | |
199 | end | |
200 | ||
201 | local function CreateAlignment(Limb, Part0) | |
202 | local Attachment0 = Instance.new("Attachment", Part0 or Anchor) | |
203 | local Attachment1 = Instance.new("Attachment", Limb) | |
204 | ||
205 | local Orientation = Instance.new("AlignOrientation") | |
206 | local Position = Instance.new("AlignPosition") | |
207 | ||
208 | Orientation.Attachment0 = Attachment1 | |
209 | Orientation.Attachment1 = Attachment0 | |
210 | Orientation.RigidityEnabled = false | |
211 | Orientation.MaxTorque = 20000 | |
212 | Orientation.Responsiveness = 40 | |
213 | Orientation.Parent = Character.HumanoidRootPart | |
214 | ||
215 | Position.Attachment0 = Attachment1 | |
216 | Position.Attachment1 = Attachment0 | |
217 | Position.RigidityEnabled = false | |
218 | Position.MaxForce = 40000 | |
219 | Position.Responsiveness = 40 | |
220 | Position.Parent = Character.HumanoidRootPart | |
221 | ||
222 | Limb.Massless = false | |
223 | ||
224 | local Motor = GetMotorForLimb(Limb) | |
225 | if Motor then | |
226 | Motor:Destroy() | |
227 | end | |
228 | ||
229 | return function(CF, Local) | |
230 | if Local then | |
231 | Attachment0.CFrame = CF | |
232 | else | |
233 | Attachment0.WorldCFrame = CF | |
234 | end | |
235 | end; | |
236 | end | |
237 | ||
238 | local function GetExtraTool() | |
239 | for _, Tool in next, Character:GetChildren() do | |
240 | if Tool:IsA("Tool") and not Tool.Name:match("LIMB_TOOL") then | |
241 | return Tool | |
242 | end | |
243 | end | |
244 | end | |
245 | ||
246 | local function GetGripForHandle(Handle) | |
247 | for _, Weld in next, Character:GetDescendants() do | |
248 | if Weld:IsA("Weld") and (Weld.Part0 == Handle or Weld.Part1 == Handle) then | |
249 | return Weld | |
250 | end | |
251 | end | |
252 | ||
253 | wait(.2) | |
254 | ||
255 | for _, Weld in next, Character:GetDescendants() do | |
256 | if Weld:IsA("Weld") and (Weld.Part0 == Handle or Weld.Part1 == Handle) then | |
257 | return Weld | |
258 | end | |
259 | end | |
260 | end | |
261 | ||
262 | local function CreateRightGrip(Handle) | |
263 | local RightGrip = Instance.new("Weld") | |
264 | ||
265 | RightGrip.Name = "RightGrip" | |
266 | RightGrip.Part1 = Handle | |
267 | RightGrip.Part0 = WeldBase | |
268 | RightGrip.Parent = WeldBase | |
269 | ||
270 | return RightGrip | |
271 | end | |
272 | ||
273 | local function CreateAccessory(Accessory, DeleteMeshes) | |
274 | if not Accessory then | |
275 | return | |
276 | end | |
277 | ||
278 | local HatAttachment = Accessory.Handle:FindFirstChildWhichIsA("Attachment") | |
279 | local HeadAttachment = VirtualRig:FindFirstChild(HatAttachment.Name, true) | |
280 | local BasePart = HeadAttachment.Parent | |
281 | ||
282 | local HatAtt = HatAttachment.CFrame | |
283 | local HeadAtt = HeadAttachment.CFrame | |
284 | ||
285 | if DeleteMeshes then | |
286 | if Accessory.Handle:FindFirstChild("Mesh") then | |
287 | Accessory.Handle.Mesh:Destroy() | |
288 | end | |
289 | end | |
290 | ||
291 | wait() | |
292 | ||
293 | local Handle = Accessory:WaitForChild("Handle") | |
294 | ||
295 | if Handle:FindFirstChildWhichIsA("Weld", true) then | |
296 | Handle:FindFirstChildWhichIsA("Weld", true):Destroy() | |
297 | Handle:BreakJoints() | |
298 | else | |
299 | Handle:BreakJoints() | |
300 | end | |
301 | ||
302 | Handle.Massless = true | |
303 | Handle.Transparency = 0.5 | |
304 | ||
305 | UsedAccessories[Accessory] = true | |
306 | ||
307 | local RightGrip = CreateRightGrip(Handle) | |
308 | ||
309 | wait() | |
310 | ||
311 | for _, Object in pairs(Handle:GetDescendants()) do | |
312 | if not Object:IsA("BasePart") then | |
313 | pcall(function() | |
314 | Object.Transparency = 1 | |
315 | end) | |
316 | ||
317 | pcall(function() | |
318 | Object.Enabled = false | |
319 | end) | |
320 | end | |
321 | end | |
322 | ||
323 | return Handle, RightGrip, HatAtt, HeadAtt, BasePart; | |
324 | end | |
325 | ||
326 | local function GetHeadAccessories() | |
327 | for _, Accessory in next, Character:GetChildren() do | |
328 | if Accessory:IsA("Accessory") and not UsedAccessories[Accessory] then | |
329 | local Handle, RightGrip, HatAtt, HeadAtt, BasePart = CreateAccessory(Accessory) | |
330 | ||
331 | table.insert(HeadAccessories, {Handle, RightGrip, HatAtt, HeadAtt, BasePart}) | |
332 | ||
333 | do | |
334 | Handle.Transparency = 1 | |
335 | end | |
336 | ||
337 | if not WearAllAccessories then | |
338 | break | |
339 | end | |
340 | end | |
341 | end | |
342 | end | |
343 | ||
344 | --[[ | |
345 | VR Replication Setup | |
346 | --]] | |
347 | ||
348 | if not RagdollEnabled then | |
349 | LeftHandle, LeftHandGrip = CreateAccessory(Character:FindFirstChild(AccessorySettings.LeftArm), AccessorySettings.BlockArms) | |
350 | RightHandle, RightHandGrip = CreateAccessory(Character:FindFirstChild(AccessorySettings.RightArm), AccessorySettings.BlockArms) | |
351 | LeftHipHandle, LeftLegGrip = CreateAccessory(Character:FindFirstChild(AccessorySettings.LeftLeg), AccessorySettings.BlockLegs) | |
352 | RightHipHandle, RightLegGrip = CreateAccessory(Character:FindFirstChild(AccessorySettings.RightLeg), AccessorySettings.BlockLegs) | |
353 | TorsoHandle, TorsoGrip = CreateAccessory(Character:FindFirstChild(AccessorySettings.Torso), AccessorySettings.BlockTorso) | |
354 | GetHeadAccessories() | |
355 | ||
356 | elseif RagdollEnabled then | |
357 | if RagdollHeadMovement then | |
358 | Permadeath() | |
359 | MoveHead = CreateAlignment(Character["Head"]) | |
360 | end | |
361 | ||
362 | MoveRightArm = CreateAlignment(Character["Right Arm"]) | |
363 | MoveLeftArm = CreateAlignment(Character["Left Arm"]) | |
364 | MoveRightLeg = CreateAlignment(Character["Right Leg"]) | |
365 | MoveLeftLeg = CreateAlignment(Character["Left Leg"]) | |
366 | MoveTorso = CreateAlignment(Character["Torso"]) | |
367 | MoveRoot = CreateAlignment(Character.HumanoidRootPart) | |
368 | ||
369 | if RagdollHeadMovement then | |
370 | for _, Accessory in next, Character:GetChildren() do | |
371 | if Accessory:IsA("Accessory") and Accessory:FindFirstChild("Handle") then | |
372 | local Attachment1 = Accessory.Handle:FindFirstChildWhichIsA("Attachment") | |
373 | local Attachment0 = Character:FindFirstChild(tostring(Attachment1), true) | |
374 | ||
375 | local Orientation = Instance.new("AlignOrientation") | |
376 | local Position = Instance.new("AlignPosition") | |
377 | ||
378 | print(Attachment1, Attachment0, Accessory) | |
379 | ||
380 | Orientation.Attachment0 = Attachment1 | |
381 | Orientation.Attachment1 = Attachment0 | |
382 | Orientation.RigidityEnabled = false | |
383 | Orientation.ReactionTorqueEnabled = true | |
384 | Orientation.MaxTorque = 20000 | |
385 | Orientation.Responsiveness = 40 | |
386 | Orientation.Parent = Character.Head | |
387 | ||
388 | Position.Attachment0 = Attachment1 | |
389 | Position.Attachment1 = Attachment0 | |
390 | Position.RigidityEnabled = false | |
391 | Position.ReactionForceEnabled = true | |
392 | Position.MaxForce = 40000 | |
393 | Position.Responsiveness = 40 | |
394 | Position.Parent = Character.Head | |
395 | end | |
396 | end | |
397 | end | |
398 | end | |
399 | ||
400 | --[[ | |
401 | Movement | |
402 | --]] | |
403 | ||
404 | VirtualRig.Name = "VirtualRig" | |
405 | VirtualRig.RightFoot.BodyPosition.Position = CharacterCFrame.p | |
406 | VirtualRig.LeftFoot.BodyPosition.Position = CharacterCFrame.p | |
407 | VirtualRig.Parent = workspace | |
408 | VirtualRig:SetPrimaryPartCFrame(CharacterCFrame) | |
409 | ||
410 | VirtualRig.Humanoid.Health = 0 | |
411 | VirtualRig:BreakJoints() | |
412 | -- | |
413 | ||
414 | VirtualBody.Parent = workspace | |
415 | VirtualBody.Name = "VirtualBody" | |
416 | VirtualBody.Humanoid.WalkSpeed = 8 | |
417 | VirtualBody.Humanoid.CameraOffset = Vector3.new(0, StudsOffset, 0) | |
418 | VirtualBody:SetPrimaryPartCFrame(CharacterCFrame) | |
419 | ||
420 | VirtualBody.Humanoid.Died:Connect(function() | |
421 | print("Virtual death") | |
422 | if AutoRespawn then | |
423 | Character:BreakJoints() | |
424 | ||
425 | if RagdollHeadMovement and RagdollEnabled then | |
426 | Network:Unclaim() | |
427 | Respawn() | |
428 | end | |
429 | end | |
430 | end) | |
431 | -- | |
432 | ||
433 | Camera.CameraSubject = VirtualBody.Humanoid | |
434 | ||
435 | Character.Humanoid.WalkSpeed = 0 | |
436 | Character.Humanoid.JumpPower = 1 | |
437 | ||
438 | for _, Part in next, VirtualBody:GetChildren() do | |
439 | if Part:IsA("BasePart") then | |
440 | Part.Transparency = 1 | |
441 | end | |
442 | end | |
443 | ||
444 | for _, Part in next, VirtualRig:GetChildren() do | |
445 | if Part:IsA("BasePart") then | |
446 | Part.Transparency = 1 | |
447 | end | |
448 | end | |
449 | ||
450 | if not VRReady then | |
451 | VirtualRig.RightUpperArm.ShoulderConstraint.RigidityEnabled = true | |
452 | VirtualRig.LeftUpperArm.ShoulderConstraint.RigidityEnabled = true | |
453 | end | |
454 | ||
455 | ||
456 | local OnMoving = RunService.Stepped:Connect(function() | |
457 | local Direction = Character.Humanoid.MoveDirection | |
458 | local Start = VirtualBody.HumanoidRootPart.Position | |
459 | local Point = Start + Direction * 6 | |
460 | ||
461 | local Gyro = VirtualBody.HumanoidRootPart:FindFirstChild("BodyGyro") or Instance.new("BodyGyro", VirtualBody.HumanoidRootPart) | |
462 | ||
463 | Gyro.MaxTorque = Vector3.new(0, 100000, 0) | |
464 | Gyro.CFrame = Camera:GetRenderCFrame() + Direction | |
465 | ||
466 | if Pointer.Beam.Enabled then | |
467 | Point = Pointer.Target.WorldCFrame.p | |
468 | end | |
469 | ||
470 | VirtualBody.Humanoid:MoveTo(Point) | |
471 | end) | |
472 | ||
473 | Character.Humanoid.Jumping:Connect(function() | |
474 | VirtualBody.Humanoid.Jump = true | |
475 | end) | |
476 | ||
477 | UserInputService.JumpRequest:Connect(function() | |
478 | VirtualBody.Humanoid.Jump = true | |
479 | end) | |
480 | ||
481 | --[[ | |
482 | VR Replication | |
483 | --]] | |
484 | ||
485 | if RagdollEnabled then | |
486 | for _, Part in pairs(Character:GetDescendants()) do | |
487 | if Part:IsA("BasePart") and Part.Name == "Handle" and Part.Parent:IsA("Accessory") then | |
488 | Part.LocalTransparencyModifier = 1 | |
489 | elseif Part:IsA("BasePart") and Part.Transparency < 0.5 then | |
490 | Part.LocalTransparencyModifier = 0.5 | |
491 | end | |
492 | ||
493 | if not Part:IsA("BasePart") and not Part:IsA("AlignPosition") and not Part:IsA("AlignOrientation") then | |
494 | pcall(function() | |
495 | Part.Transparency = 1 | |
496 | end) | |
497 | ||
498 | pcall(function() | |
499 | Part.Enabled = false | |
500 | end) | |
501 | end | |
502 | end | |
503 | end | |
504 | ||
505 | local FootUpdateDebounce = tick() | |
506 | ||
507 | local function FloorRay(Part, Distance) | |
508 | local Position = Part.CFrame.p | |
509 | local Target = Position - Vector3.new(0, Distance, 0) | |
510 | local Line = Ray.new(Position, (Target - Position).Unit * Distance) | |
511 | ||
512 | local FloorPart, FloorPosition, FloorNormal = workspace:FindPartOnRayWithIgnoreList(Line, {VirtualRig, VirtualBody, Character}) | |
513 | ||
514 | if FloorPart then | |
515 | return FloorPart, FloorPosition, FloorNormal, (FloorPosition - Position).Magnitude | |
516 | else | |
517 | return nil, Target, Vector3.new(), Distance | |
518 | end | |
519 | end | |
520 | ||
521 | local function Flatten(CF) | |
522 | local X,Y,Z = CF.X,CF.Y,CF.Z | |
523 | local LX,LZ = CF.lookVector.X,CF.lookVector.Z | |
524 | ||
525 | return CFrame.new(X,Y,Z) * CFrame.Angles(0,math.atan2(LX,LZ),0) | |
526 | end | |
527 | ||
528 | local FootTurn = 1 | |
529 | ||
530 | local function FootReady(Foot, Target) | |
531 | local MaxDist | |
532 | ||
533 | if Character.Humanoid.MoveDirection.Magnitude > 0 then | |
534 | MaxDist = .5 | |
535 | else | |
536 | MaxDist = 1 | |
537 | end | |
538 | ||
539 | local PastThreshold = (Foot.Position - Target.Position).Magnitude > MaxDist | |
540 | local PastTick = tick() - FootUpdateDebounce >= 2 | |
541 | ||
542 | if PastThreshold or PastTick then | |
543 | FootUpdateDebounce = tick() | |
544 | end | |
545 | ||
546 | return | |
547 | PastThreshold | |
548 | or | |
549 | PastTick | |
550 | end | |
551 | ||
552 | local function FootYield() | |
553 | local RightFooting = VirtualRig.RightFoot.BodyPosition | |
554 | local LeftFooting = VirtualRig.LeftFoot.BodyPosition | |
555 | local LowerTorso = VirtualRig.LowerTorso | |
556 | local UpperTorso = VirtualRig.UpperTorso | |
557 | ||
558 | local Timer = 0.15 | |
559 | local Yield = tick() | |
560 | ||
561 | repeat | |
562 | RunService.RenderStepped:Wait() | |
563 | if | |
564 | math.abs(LowerTorso.Position.Y - RightFooting.Position.Y) > 4 | |
565 | or | |
566 | math.abs(LowerTorso.Position.Y - LeftFooting.Position.Y) > 4 | |
567 | or | |
568 | ((UpperTorso.Position - RightFooting.Position) * Vector3.new(1, 0, 1)).Magnitude > VirtualBody.Humanoid.WalkSpeed / 2.5 | |
569 | or | |
570 | ((UpperTorso.Position - LeftFooting.Position) * Vector3.new(1, 0, 1)).Magnitude > VirtualBody.Humanoid.WalkSpeed / 2.5 | |
571 | then | |
572 | break | |
573 | end | |
574 | until tick() - Yield >= Timer | |
575 | end | |
576 | ||
577 | local function UpdateFooting() | |
578 | if not VirtualRig:FindFirstChild("LowerTorso") then | |
579 | wait() | |
580 | return | |
581 | end | |
582 | ||
583 | local Floor, FloorPosition, FloorNormal, Dist = FloorRay(VirtualRig.LowerTorso, 3) | |
584 | ||
585 | Dist = math.clamp(Dist, 0, 5) | |
586 | ||
587 | local Humanoid = VirtualBody.Humanoid | |
588 | local MoveDirection = ((Pointer.Target.WorldPosition - VirtualRig.LowerTorso.Position) * Vector3.new(1, 0, 1)).Unit | |
589 | ||
590 | if not Pointer.Beam.Enabled and Humanoid.MoveDirection.Magnitude == 0 then | |
591 | MoveDirection = Vector3.new(0, 0, 0) | |
592 | end | |
593 | ||
594 | local FootTarget = | |
595 | VirtualRig.LowerTorso.CFrame * | |
596 | CFrame.new(FootPlacementSettings.RightOffset) - | |
597 | Vector3.new(0, Dist, 0) + | |
598 | MoveDirection * (VirtualBody.Humanoid.WalkSpeed / 4.2) | |
599 | ||
600 | if FootReady(VirtualRig.RightFoot, FootTarget) then | |
601 | VirtualRig.RightFoot.BodyPosition.Position = FootTarget.p | |
602 | VirtualRig.RightFoot.BodyGyro.CFrame = Flatten(VirtualRig.LowerTorso.CFrame) | |
603 | end | |
604 | ||
605 | FootYield() | |
606 | ||
607 | local FootTarget = | |
608 | VirtualRig.LowerTorso.CFrame * | |
609 | CFrame.new(FootPlacementSettings.LeftOffset) - | |
610 | Vector3.new(0, Dist, 0) + | |
611 | MoveDirection * (VirtualBody.Humanoid.WalkSpeed / 4.2) | |
612 | ||
613 | if FootReady(VirtualRig.LeftFoot, FootTarget) then | |
614 | VirtualRig.LeftFoot.BodyPosition.Position = FootTarget.p | |
615 | VirtualRig.LeftFoot.BodyGyro.CFrame = Flatten(VirtualRig.LowerTorso.CFrame) | |
616 | end | |
617 | end | |
618 | ||
619 | local function UpdateTorsoPosition() | |
620 | if not RagdollEnabled then | |
621 | if TorsoHandle then | |
622 | local Positioning = VirtualRig.UpperTorso.CFrame | |
623 | ||
624 | if not TorsoGrip or not TorsoGrip.Parent then | |
625 | TorsoGrip = CreateRightGrip(TorsoHandle) | |
626 | end | |
627 | ||
628 | local Parent = TorsoGrip.Parent | |
629 | ||
630 | TorsoGrip.C1 = CFrame.new() | |
631 | TorsoGrip.C0 = TorsoGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(Positioning * CFrame.new(0, -0.25, 0) * AccessorySettings.LimbOffset), Smoothness) | |
632 | TorsoGrip.Parent = nil | |
633 | TorsoGrip.Parent = Parent | |
634 | end | |
635 | else | |
636 | local Positioning = VirtualRig.UpperTorso.CFrame | |
637 | ||
638 | MoveTorso(Positioning * CFrame.new(0, -0.25, 0)) | |
639 | MoveRoot(Positioning * CFrame.new(0, -0.25, 0)) | |
640 | end | |
641 | end | |
642 | ||
643 | local function UpdateLegPosition() | |
644 | if not RagdollEnabled then | |
645 | if RightHipHandle then | |
646 | local Positioning = | |
647 | VirtualRig.RightLowerLeg.CFrame | |
648 | : Lerp(VirtualRig.RightFoot.CFrame, 0.5) | |
649 | + Vector3.new(0, 0.5, 0) | |
650 | ||
651 | if not RightHipHandle or not RightHipHandle.Parent then | |
652 | RightLegGrip = CreateRightGrip(RightHipHandle) | |
653 | end | |
654 | ||
655 | local Parent = RightLegGrip.Parent | |
656 | ||
657 | RightLegGrip.C1 = CFrame.new() | |
658 | RightLegGrip.C0 = RightLegGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(Positioning * AccessorySettings.LimbOffset), Smoothness) | |
659 | RightLegGrip.Parent = nil | |
660 | RightLegGrip.Parent = Parent | |
661 | end | |
662 | ||
663 | if LeftHipHandle then | |
664 | local Positioning = | |
665 | VirtualRig.LeftLowerLeg.CFrame | |
666 | : Lerp(VirtualRig.LeftFoot.CFrame, 0.5) | |
667 | + Vector3.new(0, 0.5, 0) | |
668 | ||
669 | if not LeftLegGrip or not LeftLegGrip.Parent then | |
670 | LeftLegGrip = CreateRightGrip(LeftHipHandle) | |
671 | end | |
672 | ||
673 | local Parent = LeftLegGrip.Parent | |
674 | ||
675 | LeftLegGrip.C1 = CFrame.new() | |
676 | LeftLegGrip.C0 = LeftLegGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(Positioning * AccessorySettings.LimbOffset), Smoothness) | |
677 | LeftLegGrip.Parent = nil | |
678 | LeftLegGrip.Parent = Parent | |
679 | end | |
680 | else | |
681 | do | |
682 | local Positioning = | |
683 | VirtualRig.RightLowerLeg.CFrame | |
684 | : Lerp(VirtualRig.RightFoot.CFrame, 0.5) | |
685 | * CFrame.Angles(0, math.rad(180), 0) | |
686 | + Vector3.new(0, 0.5, 0) | |
687 | ||
688 | MoveRightLeg(Positioning) | |
689 | end | |
690 | ||
691 | do | |
692 | local Positioning = | |
693 | VirtualRig.LeftLowerLeg.CFrame | |
694 | : Lerp(VirtualRig.LeftFoot.CFrame, 0.5) | |
695 | * CFrame.Angles(0, math.rad(180), 0) | |
696 | + Vector3.new(0, 0.5, 0) | |
697 | ||
698 | MoveLeftLeg(Positioning) | |
699 | end | |
700 | end | |
701 | end | |
702 | ||
703 | warn("VRReady is", VRReady) | |
704 | ||
705 | local function OnUserCFrameChanged(UserCFrame, Positioning, IgnoreTorso) | |
706 | local Positioning = Camera.CFrame * Positioning | |
707 | ||
708 | if ((VRReady and UserCFrame == Enum.UserCFrame.Head) or not VRReady) and not IgnoreTorso then | |
709 | UpdateTorsoPosition() | |
710 | UpdateLegPosition() | |
711 | end | |
712 | ||
713 | if not RagdollEnabled then | |
714 | if UserCFrame == Enum.UserCFrame.Head and AccessorySettings.Head then | |
715 | for _, Table in next, HeadAccessories do | |
716 | local Handle, RightGrip, HatAtt, HeadAtt, BasePart = unpack(Table) | |
717 | local LocalPositioning = Positioning | |
718 | ||
719 | if not RightGrip or not RightGrip.Parent then | |
720 | RightGrip = CreateRightGrip(Handle) | |
721 | Table[2] = RightGrip | |
722 | end | |
723 | ||
724 | local Parent = RightGrip.Parent | |
725 | ||
726 | if BasePart then | |
727 | LocalPositioning = BasePart.CFrame * HeadAtt | |
728 | end | |
729 | ||
730 | RightGrip.C1 = HatAtt | |
731 | RightGrip.C0 = RightGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(LocalPositioning), Smoothness) | |
732 | RightGrip.Parent = nil | |
733 | RightGrip.Parent = Parent | |
734 | end | |
735 | ||
736 | elseif RightHandle and UserCFrame == Enum.UserCFrame.RightHand and AccessorySettings.RightArm then | |
737 | local HandPosition = Positioning | |
738 | local LocalPositioning = Positioning | |
739 | ||
740 | if not RightHandGrip or not RightHandGrip.Parent then | |
741 | RightHandGrip = CreateRightGrip(RightHandle) | |
742 | end | |
743 | ||
744 | if AccurateHandPosition then | |
745 | HandPosition = HandPosition * CFrame.new(0, 0, 1) | |
746 | else | |
747 | HandPosition = HandPosition * CFrame.new(0, 0, .5) | |
748 | end | |
749 | ||
750 | if not VRReady then | |
751 | local HeadRotation = Camera.CFrame - Camera.CFrame.p | |
752 | ||
753 | HandPosition = VirtualRig.RightUpperArm.CFrame:Lerp(VirtualRig.RightLowerArm.CFrame, 0.5) * AccessorySettings.LimbOffset | |
754 | ||
755 | --LocalPositioning = (HeadRotation + (HandPosition * CFrame.new(0, 0, 1)).p) * CFrame.Angles(math.rad(-45), 0, 0) | |
756 | LocalPositioning = HandPosition * CFrame.new(0, 0, 1) * CFrame.Angles(math.rad(-180), 0, 0) | |
757 | ||
758 | if Point2 then | |
759 | VirtualRig.RightUpperArm.Aim.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) | |
760 | VirtualRig.RightUpperArm.Aim.CFrame = Camera.CFrame * AccessorySettings.LimbOffset | |
761 | elseif VirtualRig.RightUpperArm.Aim.MaxTorque ~= Vector3.new(0, 0, 0) then | |
762 | VirtualRig.RightUpperArm.Aim.MaxTorque = Vector3.new(0, 0, 0) | |
763 | end | |
764 | elseif not AccurateHandPosition then | |
765 | LocalPositioning = HandPosition * CFrame.new(0, 0, -1) | |
766 | end | |
767 | ||
768 | local Parent = RightHandGrip.Parent | |
769 | ||
770 | RightHandGrip.C1 = CFrame.new() | |
771 | RightHandGrip.C0 = RightHandGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(HandPosition), Smoothness) | |
772 | RightHandGrip.Parent = nil | |
773 | RightHandGrip.Parent = Parent | |
774 | ||
775 | -- | |
776 | ||
777 | local EquippedTool = GetExtraTool() | |
778 | ||
779 | if EquippedTool and EquippedTool:FindFirstChild("Handle") then | |
780 | local EquippedGrip = GetGripForHandle(EquippedTool.Handle) | |
781 | local Parent = EquippedGrip.Parent | |
782 | ||
783 | local ArmBaseCFrame = ArmBase.CFrame | |
784 | if ArmBase.Name == "Right Arm" then | |
785 | ArmBaseCFrame = ArmBaseCFrame | |
786 | end | |
787 | ||
788 | EquippedGrip.C1 = EquippedTool.Grip | |
789 | EquippedGrip.C0 = EquippedGrip.C0:Lerp(ArmBaseCFrame:ToObjectSpace(LocalPositioning), Smoothness) | |
790 | EquippedGrip.Parent = nil | |
791 | EquippedGrip.Parent = Parent | |
792 | end | |
793 | ||
794 | elseif LeftHandle and UserCFrame == Enum.UserCFrame.LeftHand and AccessorySettings.LeftArm then | |
795 | local HandPosition = Positioning | |
796 | ||
797 | if not LeftHandGrip or not LeftHandGrip.Parent then | |
798 | LeftHandGrip = CreateRightGrip(LeftHandle) | |
799 | end | |
800 | ||
801 | if AccurateHandPosition then | |
802 | HandPosition = HandPosition * CFrame.new(0, 0, 1) | |
803 | else | |
804 | HandPosition = HandPosition * CFrame.new(0, 0, .5) | |
805 | end | |
806 | ||
807 | if not VRReady then | |
808 | HandPosition = VirtualRig.LeftUpperArm.CFrame:Lerp(VirtualRig.LeftLowerArm.CFrame, 0.5) * AccessorySettings.LimbOffset | |
809 | --warn("Setting HandPosition to hands") | |
810 | if Point1 then | |
811 | VirtualRig.LeftUpperArm.Aim.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) | |
812 | VirtualRig.LeftUpperArm.Aim.CFrame = Camera.CFrame * AccessorySettings.LimbOffset | |
813 | elseif VirtualRig.LeftUpperArm.Aim.MaxTorque ~= Vector3.new(0, 0, 0) then | |
814 | VirtualRig.LeftUpperArm.Aim.MaxTorque = Vector3.new(0, 0, 0) | |
815 | end | |
816 | end | |
817 | ||
818 | local Parent = LeftHandGrip.Parent | |
819 | ||
820 | LeftHandGrip.C1 = CFrame.new() | |
821 | LeftHandGrip.C0 = LeftHandGrip.C0:Lerp(WeldBase.CFrame:ToObjectSpace(HandPosition), Smoothness) | |
822 | LeftHandGrip.Parent = nil | |
823 | LeftHandGrip.Parent = Parent | |
824 | ||
825 | end | |
826 | end | |
827 | ||
828 | if RagdollEnabled then | |
829 | if UserCFrame == Enum.UserCFrame.Head and RagdollHeadMovement then | |
830 | MoveHead(Positioning) | |
831 | elseif UserCFrame == Enum.UserCFrame.RightHand then | |
832 | local Positioning = Positioning | |
833 | ||
834 | if not VRReady then | |
835 | Positioning = VirtualRig.RightUpperArm.CFrame:Lerp(VirtualRig.RightLowerArm.CFrame, 0.5) | |
836 | elseif AccurateHandPosition then | |
837 | Positioning = Positioning * CFrame.new(0, 0, 1) | |
838 | end | |
839 | ||
840 | if VRReady then | |
841 | Positioning = Positioning * AccessorySettings.LimbOffset | |
842 | end | |
843 | ||
844 | MoveRightArm(Positioning) | |
845 | ||
846 | if Point2 then | |
847 | VirtualRig.RightUpperArm.Aim.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) | |
848 | VirtualRig.RightUpperArm.Aim.CFrame = Camera.CFrame * AccessorySettings.LimbOffset | |
849 | elseif VirtualRig.RightUpperArm.Aim.MaxTorque ~= Vector3.new(0, 0, 0) then | |
850 | VirtualRig.RightUpperArm.Aim.MaxTorque = Vector3.new(0, 0, 0) | |
851 | end | |
852 | elseif UserCFrame == Enum.UserCFrame.LeftHand then | |
853 | local Positioning = Positioning | |
854 | ||
855 | if not VRReady then | |
856 | Positioning = VirtualRig.LeftUpperArm.CFrame:Lerp(VirtualRig.LeftLowerArm.CFrame, 0.5) | |
857 | elseif AccurateHandPosition then | |
858 | Positioning = Positioning * CFrame.new(0, 0, 1) | |
859 | end | |
860 | ||
861 | if VRReady then | |
862 | Positioning = Positioning * AccessorySettings.LimbOffset | |
863 | end | |
864 | ||
865 | MoveLeftArm(Positioning) | |
866 | ||
867 | if Point1 then | |
868 | VirtualRig.LeftUpperArm.Aim.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) | |
869 | VirtualRig.LeftUpperArm.Aim.CFrame = Camera.CFrame * AccessorySettings.LimbOffset | |
870 | elseif VirtualRig.LeftUpperArm.Aim.MaxTorque ~= Vector3.new(0, 0, 0) then | |
871 | VirtualRig.LeftUpperArm.Aim.MaxTorque = Vector3.new(0, 0, 0) | |
872 | end | |
873 | end | |
874 | end | |
875 | ||
876 | if UserCFrame == Enum.UserCFrame.Head then | |
877 | VirtualRig.Head.CFrame = Positioning | |
878 | VirtualRig.HumanoidRootPart.CFrame = Positioning | |
879 | ||
880 | elseif UserCFrame == Enum.UserCFrame.RightHand and VRReady then | |
881 | VirtualRig.RightHand.CFrame = Positioning | |
882 | ||
883 | elseif UserCFrame == Enum.UserCFrame.LeftHand and VRReady then | |
884 | VirtualRig.LeftHand.CFrame = Positioning | |
885 | ||
886 | end | |
887 | ||
888 | if not VRReady and VirtualRig.LeftHand.Anchored then | |
889 | VirtualRig.RightHand.Anchored = false | |
890 | VirtualRig.LeftHand.Anchored = false | |
891 | elseif VRReady and not VirtualRig.LeftHand.Anchored then | |
892 | VirtualRig.RightHand.Anchored = true | |
893 | VirtualRig.LeftHand.Anchored = true | |
894 | end | |
895 | end | |
896 | ||
897 | local CFrameChanged = VRService.UserCFrameChanged:Connect(OnUserCFrameChanged) | |
898 | ||
899 | local OnStepped = RunService.Stepped:Connect(function() | |
900 | for _, Part in pairs(VirtualRig:GetChildren()) do | |
901 | if Part:IsA("BasePart") then | |
902 | Part.CanCollide = false | |
903 | end | |
904 | end | |
905 | ||
906 | if RagdollEnabled then | |
907 | for _, Part in pairs(Character:GetChildren()) do | |
908 | if Part:IsA("BasePart") then | |
909 | Part.CanCollide = false | |
910 | end | |
911 | end | |
912 | end | |
913 | ||
914 | if NoCollision then | |
915 | for _, Player in pairs(Players:GetPlayers()) do | |
916 | if Player ~= Client and Player.Character then | |
917 | local Char = Player.Character | |
918 | local Descendants = Player.Character:GetChildren() | |
919 | ||
920 | local IsClose, Part = false, Char.PrimaryPart or Char:FindFirstChild("Head") or Char:FindFirstChildWhichIsA("BasePart") | |
921 | if Part and (Camera.CFrame.Position - Part.Position).Magnitude < 30 then | |
922 | IsClose = true | |
923 | end | |
924 | ||
925 | if IsClose then | |
926 | for i = 1, #Descendants do | |
927 | local Part = Descendants[i] | |
928 | if Part:IsA("BasePart") then | |
929 | Part.CanCollide = false | |
930 | Part.Velocity = Vector3.new() | |
931 | Part.RotVelocity = Vector3.new() | |
932 | end | |
933 | end | |
934 | end | |
935 | end | |
936 | end | |
937 | end | |
938 | end) | |
939 | ||
940 | local OnRenderStepped = RunService.Stepped:Connect(function() | |
941 | Camera.CameraSubject = VirtualBody.Humanoid | |
942 | ||
943 | if RagdollEnabled then | |
944 | Character.HumanoidRootPart.CFrame = VirtualRig.UpperTorso.CFrame | |
945 | Character.HumanoidRootPart.Velocity = Vector3.new(0, 0, 0) | |
946 | end | |
947 | ||
948 | if not VRReady then | |
949 | OnUserCFrameChanged(Enum.UserCFrame.Head, CFrame.new(0, 0, 0)) | |
950 | ||
951 | OnUserCFrameChanged(Enum.UserCFrame.RightHand, CFrame.new(0, 0, 0), true) | |
952 | OnUserCFrameChanged(Enum.UserCFrame.LeftHand, CFrame.new(0, 0, 0), true) | |
953 | end | |
954 | end) | |
955 | ||
956 | spawn(function() | |
957 | while Character and Character.Parent do | |
958 | FootYield() | |
959 | UpdateFooting() | |
960 | end | |
961 | end) | |
962 | ||
963 | --[[ | |
964 | Non-VR Support + VR Mechanics | |
965 | --]] | |
966 | ||
967 | local OnInput = UserInputService.InputBegan:Connect(function(Input, Processed) | |
968 | if not Processed then | |
969 | if Input.KeyCode == Enum.KeyCode.LeftControl or Input.KeyCode == Enum.KeyCode.ButtonL2 then | |
970 | Tween(VirtualBody.Humanoid, "Elastic", "Out", 1, { | |
971 | CameraOffset = Vector3.new(0, StudsOffset - 1.5, 0) | |
972 | }) | |
973 | end | |
974 | ||
975 | if Input.KeyCode == Enum.KeyCode.X then | |
976 | if RagdollEnabled and RagdollHeadMovement then | |
977 | Network:Unclaim() | |
978 | Respawn() | |
979 | end | |
980 | end | |
981 | ||
982 | if Input.KeyCode == Enum.KeyCode.C or Input.KeyCode == Enum.KeyCode.ButtonB then | |
983 | Pointer.Beam.Enabled = true | |
984 | Pointer.Target.ParticleEmitter.Enabled = true | |
985 | elseif Input.KeyCode == Enum.KeyCode.ButtonY then | |
986 | VirtualBody.Humanoid:MoveTo(Pointer.Target.WorldCFrame.p) | |
987 | ||
988 | Pointer.Beam.Enabled = true | |
989 | Pointer.Target.ParticleEmitter.Enabled = true | |
990 | end | |
991 | end | |
992 | ||
993 | if Input.KeyCode == Enum.KeyCode.LeftShift or Input.KeyCode == Enum.KeyCode.ButtonR2 then | |
994 | Tween(VirtualBody.Humanoid, "Sine", "Out", 1, { | |
995 | WalkSpeed = 16 | |
996 | }) | |
997 | end | |
998 | ||
999 | if not VRReady and Input.UserInputType == Enum.UserInputType.MouseButton1 then | |
1000 | Point1 = true | |
1001 | end | |
1002 | ||
1003 | if not VRReady and Input.UserInputType == Enum.UserInputType.MouseButton2 then | |
1004 | Point2 = true | |
1005 | end | |
1006 | ||
1007 | if VRReady and Input.KeyCode == Enum.KeyCode.ButtonX then | |
1008 | --Character:BreakJoints() | |
1009 | ||
1010 | if RagdollEnabled and RagdollHeadMovement then | |
1011 | Character:BreakJoints() | |
1012 | Network:Unclaim() | |
1013 | Respawn() | |
1014 | end | |
1015 | end | |
1016 | end) | |
1017 | ||
1018 | local OnInputEnded = UserInputService.InputEnded:Connect(function(Input, Processed) | |
1019 | if not Processed then | |
1020 | if Input.KeyCode == Enum.KeyCode.LeftControl or Input.KeyCode == Enum.KeyCode.ButtonL2 then | |
1021 | Tween(VirtualBody.Humanoid, "Elastic", "Out", 1, { | |
1022 | CameraOffset = Vector3.new(0, StudsOffset, 0) | |
1023 | }) | |
1024 | elseif Input.KeyCode == Enum.KeyCode.ButtonB or Input.KeyCode == Enum.KeyCode.C then | |
1025 | if Mouse.Target and (Mouse.Hit.p - Camera.CFrame.p).Magnitude < 1000 then | |
1026 | VirtualBody:MoveTo(Pointer.Target.WorldCFrame.p) | |
1027 | VirtualRig:SetPrimaryPartCFrame(Pointer.Target.WorldCFrame) | |
1028 | VirtualRig.RightFoot.BodyPosition.Position = Pointer.Target.WorldCFrame.p | |
1029 | VirtualRig.LeftFoot.BodyPosition.Position = Pointer.Target.WorldCFrame.p | |
1030 | end | |
1031 | ||
1032 | Pointer.Beam.Enabled = false | |
1033 | Pointer.Target.ParticleEmitter.Enabled = false | |
1034 | elseif Input.KeyCode == Enum.KeyCode.ButtonY then | |
1035 | VirtualBody.Humanoid:MoveTo(Pointer.Target.WorldCFrame.p) | |
1036 | ||
1037 | Pointer.Beam.Enabled = false | |
1038 | Pointer.Target.ParticleEmitter.Enabled = false | |
1039 | end | |
1040 | end | |
1041 | ||
1042 | if Input.KeyCode == Enum.KeyCode.LeftShift or Input.KeyCode == Enum.KeyCode.ButtonR2 then | |
1043 | Tween(VirtualBody.Humanoid, "Sine", "Out", 1, { | |
1044 | WalkSpeed = 8 | |
1045 | }) | |
1046 | end | |
1047 | ||
1048 | if not VRReady and Input.UserInputType == Enum.UserInputType.MouseButton1 then | |
1049 | Point1 = false | |
1050 | end | |
1051 | ||
1052 | if not VRReady and Input.UserInputType == Enum.UserInputType.MouseButton2 then | |
1053 | Point2 = false | |
1054 | end | |
1055 | end) | |
1056 | ||
1057 | --[[ | |
1058 | Proper Cleanup | |
1059 | --]] | |
1060 | ||
1061 | local OnReset | |
1062 | ||
1063 | OnReset = Client.CharacterAdded:Connect(function() | |
1064 | OnReset:Disconnect(); | |
1065 | CFrameChanged:Disconnect(); | |
1066 | OnStepped:Disconnect(); | |
1067 | OnRenderStepped:Disconnect(); | |
1068 | OnMoving:Disconnect(); | |
1069 | OnInput:Disconnect(); | |
1070 | OnInputEnded:Disconnect(); | |
1071 | ||
1072 | VirtualRig:Destroy(); | |
1073 | VirtualBody:Destroy(); | |
1074 | ||
1075 | if RagdollEnabled then | |
1076 | Network:Unclaim(); | |
1077 | end | |
1078 | ||
1079 | if AutoRun then | |
1080 | delay(2, function() | |
1081 | Script() | |
1082 | end) | |
1083 | end | |
1084 | end) | |
1085 | ||
1086 | if ChatEnabled then | |
1087 | spawn(ChatHUDFunc) | |
1088 | end | |
1089 | ||
1090 | if ViewportEnabled then | |
1091 | spawn(ViewHUDFunc) | |
1092 | end | |
1093 | ||
1094 | do | |
1095 | --[[ | |
1096 | Functions | |
1097 | --]] | |
1098 | ||
1099 | local Players = game:GetService("Players") | |
1100 | local Client = Players.LocalPlayer | |
1101 | ||
1102 | local VRService = game:GetService("VRService") | |
1103 | local VRReady = VRService.VREnabled | |
1104 | ||
1105 | local UserInputService = game:GetService("UserInputService") | |
1106 | local RunService = game:GetService("RunService") | |
1107 | ||
1108 | local Camera = workspace.CurrentCamera | |
1109 | ||
1110 | --[[ | |
1111 | Code | |
1112 | --]] | |
1113 | ||
1114 | if VRReady or true then | |
1115 | - | Pointer = game:GetObjects("rbxassetid://4476173280")[1] |
1115 | + | Pointer = game:GetObjects("rbxassetid://4751218222")[1] |
1116 | ||
1117 | Pointer.Parent = workspace | |
1118 | Pointer.Beam.Enabled = false | |
1119 | Pointer.Target.ParticleEmitter.Enabled = false | |
1120 | ||
1121 | local RenderStepped = RunService.RenderStepped:Connect(function() | |
1122 | if Pointer.Beam.Enabled then | |
1123 | local RightHand = Camera.CFrame * VRService:GetUserCFrame(Enum.UserCFrame.RightHand) | |
1124 | local Target = RightHand * CFrame.new(0, 0, -10) | |
1125 | ||
1126 | local Line = Ray.new(RightHand.p, (Target.p - RightHand.p).Unit * 10000) | |
1127 | local Part, Position = workspace:FindPartOnRayWithIgnoreList(Line, {VirtualRig, VirtualBody, Character, Pointer}) | |
1128 | ||
1129 | local Distance = (Position - RightHand.p).Magnitude | |
1130 | ||
1131 | Pointer.Target.Position = Vector3.new(0, 0, -Distance) | |
1132 | Pointer.CFrame = RightHand | |
1133 | end | |
1134 | end) | |
1135 | ||
1136 | local Input = UserInputService.InputBegan:Connect(function(Input) | |
1137 | ||
1138 | end) | |
1139 | ||
1140 | -- | |
1141 | ||
1142 | local CharacterAdded | |
1143 | ||
1144 | CharacterAdded = Client.CharacterAdded:Connect(function() | |
1145 | RenderStepped:Disconnect() | |
1146 | Input:Disconnect() | |
1147 | CharacterAdded:Disconnect() | |
1148 | ||
1149 | Pointer:Destroy() | |
1150 | Pointer = nil | |
1151 | end) | |
1152 | else | |
1153 | return | |
1154 | end | |
1155 | end | |
1156 | ||
1157 | end; | |
1158 | ||
1159 | Permadeath = function() | |
1160 | local ch = game.Players.LocalPlayer.Character | |
1161 | local prt=Instance.new("Model", workspace) | |
1162 | local z1 = Instance.new("Part", prt) | |
1163 | z1.Name="Torso" | |
1164 | z1.CanCollide = false | |
1165 | z1.Anchored = true | |
1166 | local z2 =Instance.new("Part", prt) | |
1167 | z2.Name="Head" | |
1168 | z2.Anchored = true | |
1169 | z2.CanCollide = false | |
1170 | local z3 =Instance.new("Humanoid", prt) | |
1171 | z3.Name="Humanoid" | |
1172 | z1.Position = Vector3.new(0,9999,0) | |
1173 | z2.Position = Vector3.new(0,9991,0) | |
1174 | game.Players.LocalPlayer.Character=prt | |
1175 | wait(5) | |
1176 | warn("50%") | |
1177 | game.Players.LocalPlayer.Character=ch | |
1178 | wait(6) | |
1179 | warn("100%") | |
1180 | end; | |
1181 | ||
1182 | Respawn = function() | |
1183 | local ch = game.Players.LocalPlayer.Character | |
1184 | ||
1185 | local prt=Instance.new("Model", workspace) | |
1186 | local z1 = Instance.new("Part", prt) | |
1187 | z1.Name="Torso" | |
1188 | z1.CanCollide = false | |
1189 | z1.Anchored = true | |
1190 | local z2 =Instance.new("Part", prt) | |
1191 | z2.Name="Head" | |
1192 | z2.Anchored = true | |
1193 | z2.CanCollide = false | |
1194 | local z3 =Instance.new("Humanoid", prt) | |
1195 | z3.Name="Humanoid" | |
1196 | z1.Position = Vector3.new(0,9999,0) | |
1197 | z2.Position = Vector3.new(0,9991,0) | |
1198 | game.Players.LocalPlayer.Character=prt | |
1199 | wait(5) | |
1200 | game.Players.LocalPlayer.Character=ch | |
1201 | end; | |
1202 | ||
1203 | ChatHUDFunc = function() | |
1204 | --[[ | |
1205 | Variables | |
1206 | --]] | |
1207 | ||
1208 | local UserInputService = game:GetService("UserInputService") | |
1209 | local RunService = game:GetService("RunService") | |
1210 | ||
1211 | local VRService = game:GetService("VRService") | |
1212 | local VRReady = VRService.VREnabled | |
1213 | ||
1214 | local Players = game:GetService("Players") | |
1215 | local Client = Players.LocalPlayer | |
1216 | ||
1217 | - | local ChatHUD = game:GetObjects("rbxassetid://4476067885")[1] |
1217 | + | local ChatHUD = game:GetObjects("rbxassetid://4751221587")[1] |
1218 | local GlobalFrame = ChatHUD.GlobalFrame | |
1219 | local Template = GlobalFrame.Template | |
1220 | local LocalFrame = ChatHUD.LocalFrame | |
1221 | local Global = ChatHUD.Global | |
1222 | local Local = ChatHUD.Local | |
1223 | ||
1224 | local Camera = workspace.CurrentCamera | |
1225 | ||
1226 | Template.Parent = nil | |
1227 | ChatHUD.Parent = game:GetService("CoreGui") | |
1228 | ||
1229 | --[[ | |
1230 | Code | |
1231 | --]] | |
1232 | ||
1233 | local Highlight = Global.Frame.BackgroundColor3 | |
1234 | local Deselected = Local.Frame.BackgroundColor3 | |
1235 | ||
1236 | local OpenGlobalTab = function() | |
1237 | Global.Frame.BackgroundColor3 = Highlight | |
1238 | Local.Frame.BackgroundColor3 = Deselected | |
1239 | ||
1240 | Global.Font = Enum.Font.SourceSansBold | |
1241 | Local.Font = Enum.Font.SourceSans | |
1242 | ||
1243 | GlobalFrame.Visible = true | |
1244 | LocalFrame.Visible = false | |
1245 | end | |
1246 | ||
1247 | local OpenLocalTab = function() | |
1248 | Global.Frame.BackgroundColor3 = Deselected | |
1249 | Local.Frame.BackgroundColor3 = Highlight | |
1250 | ||
1251 | Global.Font = Enum.Font.SourceSans | |
1252 | Local.Font = Enum.Font.SourceSansBold | |
1253 | ||
1254 | GlobalFrame.Visible = false | |
1255 | LocalFrame.Visible = true | |
1256 | end | |
1257 | ||
1258 | Global.MouseButton1Down:Connect(OpenGlobalTab) | |
1259 | Local.MouseButton1Down:Connect(OpenLocalTab) | |
1260 | Global.MouseButton1Click:Connect(OpenGlobalTab) | |
1261 | Local.MouseButton1Click:Connect(OpenLocalTab) | |
1262 | ||
1263 | OpenLocalTab() | |
1264 | ||
1265 | -- | |
1266 | ||
1267 | local function GetPlayerDistance(Sender) | |
1268 | if Sender.Character and Sender.Character:FindFirstChild("Head") then | |
1269 | return math.floor((Sender.Character.Head.Position - Camera:GetRenderCFrame().p).Magnitude + 0.5) | |
1270 | end | |
1271 | end | |
1272 | ||
1273 | local function NewGlobal(Message, Sender, Color) | |
1274 | local Frame = Template:Clone() | |
1275 | ||
1276 | Frame.Text = ("[%s]: %s"):format(Sender.Name, Message) | |
1277 | Frame.User.Text = ("[%s]:"):format(Sender.Name) | |
1278 | Frame.User.TextColor3 = Color | |
1279 | Frame.BackgroundColor3 = Color | |
1280 | Frame.Parent = GlobalFrame | |
1281 | ||
1282 | delay(60, function() | |
1283 | Frame:Destroy() | |
1284 | end) | |
1285 | end | |
1286 | ||
1287 | local function NewLocal(Message, Sender, Color, Dist) | |
1288 | local Frame = Template:Clone() | |
1289 | ||
1290 | Frame.Text = ("(%s) [%s]: %s"):format(tostring(Dist), Sender.Name, Message) | |
1291 | Frame.User.Text = ("(%s) [%s]:"):format(tostring(Dist), Sender.Name) | |
1292 | Frame.User.TextColor3 = Color | |
1293 | Frame.BackgroundColor3 = Color | |
1294 | Frame.Parent = LocalFrame | |
1295 | ||
1296 | delay(60, function() | |
1297 | Frame:Destroy() | |
1298 | end) | |
1299 | end | |
1300 | ||
1301 | local function OnNewChat(Message, Sender, Color) | |
1302 | if not ChatHUD or not ChatHUD.Parent then return end | |
1303 | ||
1304 | NewGlobal(Message, Sender, Color) | |
1305 | ||
1306 | local Distance = GetPlayerDistance(Sender) | |
1307 | ||
1308 | if Distance and Distance <= ChatLocalRange then | |
1309 | NewLocal(Message, Sender, Color, Distance) | |
1310 | end | |
1311 | end | |
1312 | ||
1313 | local function OnPlayerAdded(Player) | |
1314 | if not ChatHUD or not ChatHUD.Parent then return end | |
1315 | ||
1316 | local Color = BrickColor.Random().Color | |
1317 | ||
1318 | Player.Chatted:Connect(function(Message) | |
1319 | OnNewChat(Message, Player, Color) | |
1320 | end) | |
1321 | end | |
1322 | ||
1323 | Players.PlayerAdded:Connect(OnPlayerAdded) | |
1324 | ||
1325 | for _, Player in pairs(Players:GetPlayers()) do | |
1326 | OnPlayerAdded(Player) | |
1327 | end | |
1328 | ||
1329 | -- | |
1330 | ||
1331 | local ChatPart = ChatHUD.Part | |
1332 | ||
1333 | ChatHUD.Adornee = ChatPart | |
1334 | ||
1335 | if VRReady then | |
1336 | ChatHUD.Parent = game:GetService("CoreGui") | |
1337 | ChatHUD.Enabled = true | |
1338 | ChatHUD.AlwaysOnTop = true | |
1339 | ||
1340 | local OnInput = UserInputService.InputBegan:Connect(function(Input, Processed) | |
1341 | if not Processed then | |
1342 | if Input.KeyCode == Enum.KeyCode.ButtonL2 then | |
1343 | ChatHUD.Enabled = not ChatHUD.Enabled | |
1344 | end | |
1345 | end | |
1346 | end) | |
1347 | ||
1348 | local RenderStepped = RunService.RenderStepped:Connect(function() | |
1349 | local LeftHand = VRService:GetUserCFrame(Enum.UserCFrame.LeftHand) | |
1350 | ||
1351 | ChatPart.CFrame = Camera.CFrame * LeftHand | |
1352 | end) | |
1353 | ||
1354 | local CharacterAdded | |
1355 | ||
1356 | CharacterAdded = Client.CharacterAdded:Connect(function() | |
1357 | OnInput:Disconnect() | |
1358 | RenderStepped:Disconnect() | |
1359 | CharacterAdded:Disconnect() | |
1360 | ||
1361 | ChatHUD:Destroy() | |
1362 | ChatHUD = nil | |
1363 | end) | |
1364 | end | |
1365 | ||
1366 | wait(9e9) | |
1367 | end; | |
1368 | ||
1369 | ViewHUDFunc = function() | |
1370 | --[[ | |
1371 | Variables | |
1372 | --]] | |
1373 | ||
1374 | local ViewportRange = ViewportRange or 32 | |
1375 | ||
1376 | local UserInputService = game:GetService("UserInputService") | |
1377 | local RunService = game:GetService("RunService") | |
1378 | ||
1379 | local VRService = game:GetService("VRService") | |
1380 | local VRReady = VRService.VREnabled | |
1381 | ||
1382 | local Players = game:GetService("Players") | |
1383 | local Client = Players.LocalPlayer | |
1384 | local Mouse = Client:GetMouse() | |
1385 | ||
1386 | local Camera = workspace.CurrentCamera | |
1387 | local CameraPort = Camera.CFrame | |
1388 | ||
1389 | - | local ViewHUD = script:FindFirstChild("ViewHUD") or game:GetObjects("rbxassetid://4480405425")[1] |
1389 | + | local ViewHUD = script:FindFirstChild("ViewHUD") or game:GetObjects("rbxassetid://4751223270")[1] |
1390 | local Viewport = ViewHUD.Viewport | |
1391 | local Viewcam = Instance.new("Camera") | |
1392 | local ViewPart = ViewHUD.Part | |
1393 | ||
1394 | ViewHUD.Parent = game:GetService("CoreGui") | |
1395 | ||
1396 | Viewcam.Parent = Viewport | |
1397 | Viewcam.CameraType = Enum.CameraType.Scriptable | |
1398 | Viewport.CurrentCamera = Viewcam | |
1399 | Viewport.BackgroundTransparency = 1 | |
1400 | ||
1401 | --[[ | |
1402 | Code | |
1403 | --]] | |
1404 | ||
1405 | local function Clone(Character) | |
1406 | local Arc = Character.Archivable | |
1407 | local Clone; | |
1408 | ||
1409 | Character.Archivable = true | |
1410 | Clone = Character:Clone() | |
1411 | Character.Archivable = Arc | |
1412 | ||
1413 | return Clone | |
1414 | end | |
1415 | ||
1416 | local function GetPart(Name, Parent, Descendants) | |
1417 | for i = 1, #Descendants do | |
1418 | local Part = Descendants[i] | |
1419 | ||
1420 | if Part.Name == Name and Part.Parent.Name == Parent then | |
1421 | return Part | |
1422 | end | |
1423 | end | |
1424 | end | |
1425 | ||
1426 | local function OnPlayerAdded(Player) | |
1427 | if not ViewHUD or not ViewHUD.Parent then return end | |
1428 | ||
1429 | local function CharacterAdded(Character) | |
1430 | if not ViewHUD or not ViewHUD.Parent then return end | |
1431 | ||
1432 | Character:WaitForChild("Head") | |
1433 | Character:WaitForChild("Humanoid") | |
1434 | ||
1435 | wait(3) | |
1436 | ||
1437 | local FakeChar = Clone(Character) | |
1438 | local TrueRoot = Character:FindFirstChild("HumanoidRootPart") or Character:FindFirstChild("Head") | |
1439 | local Root = FakeChar:FindFirstChild("HumanoidRootPart") or FakeChar:FindFirstChild("Head") | |
1440 | local RenderConnection; | |
1441 | ||
1442 | local Descendants = FakeChar:GetDescendants() | |
1443 | local RealDescendants = Character:GetDescendants() | |
1444 | local Correspondents = {}; | |
1445 | ||
1446 | FakeChar.Humanoid.DisplayDistanceType = "None" | |
1447 | ||
1448 | for i = 1, #Descendants do | |
1449 | local Part = Descendants[i] | |
1450 | local Real = Part:IsA("BasePart") and GetPart(Part.Name, Part.Parent.Name, RealDescendants) | |
1451 | ||
1452 | if Part:IsA("BasePart") and Real then | |
1453 | Part.Anchored = true | |
1454 | Part:BreakJoints() | |
1455 | ||
1456 | if Part.Parent:IsA("Accessory") then | |
1457 | Part.Transparency = 0 | |
1458 | end | |
1459 | ||
1460 | table.insert(Correspondents, {Part, Real}) | |
1461 | end | |
1462 | end | |
1463 | ||
1464 | RenderConnection = RunService.RenderStepped:Connect(function() | |
1465 | if not Character or not Character.Parent then | |
1466 | RenderConnection:Disconnect() | |
1467 | FakeChar:Destroy() | |
1468 | ||
1469 | return | |
1470 | end | |
1471 | ||
1472 | if (TrueRoot and (TrueRoot.Position - Camera.CFrame.p).Magnitude <= ViewportRange) or Player == Client or not TrueRoot then | |
1473 | for i = 1, #Correspondents do | |
1474 | local Part, Real = unpack(Correspondents[i]) | |
1475 | ||
1476 | if Part and Real and Part.Parent and Real.Parent then | |
1477 | Part.CFrame = Real.CFrame | |
1478 | elseif Part.Parent and not Real.Parent then | |
1479 | Part:Destroy() | |
1480 | end | |
1481 | end | |
1482 | end | |
1483 | end) | |
1484 | ||
1485 | FakeChar.Parent = Viewcam | |
1486 | end | |
1487 | ||
1488 | Player.CharacterAdded:Connect(CharacterAdded) | |
1489 | ||
1490 | if Player.Character then | |
1491 | spawn(function() | |
1492 | CharacterAdded(Player.Character) | |
1493 | end) | |
1494 | end | |
1495 | end | |
1496 | ||
1497 | local PlayerAdded = Players.PlayerAdded:Connect(OnPlayerAdded) | |
1498 | ||
1499 | for _, Player in pairs(Players:GetPlayers()) do | |
1500 | OnPlayerAdded(Player) | |
1501 | end | |
1502 | ||
1503 | ViewPart.Size = Vector3.new() | |
1504 | ||
1505 | if VRReady then | |
1506 | Viewport.Position = UDim2.new(.62, 0, .89, 0) | |
1507 | Viewport.Size = UDim2.new(.3, 0, .3, 0) | |
1508 | Viewport.AnchorPoint = Vector2.new(.5, 1) | |
1509 | else | |
1510 | Viewport.Size = UDim2.new(0.3, 0, 0.3, 0) | |
1511 | end | |
1512 | ||
1513 | local RenderStepped = RunService.RenderStepped:Connect(function() | |
1514 | local Render = Camera.CFrame | |
1515 | local Scale = Camera.ViewportSize | |
1516 | ||
1517 | if VRReady then | |
1518 | Render = Render * VRService:GetUserCFrame(Enum.UserCFrame.Head) | |
1519 | end | |
1520 | ||
1521 | CameraPort = CFrame.new(Render.p + Vector3.new(5, 2, 0), Render.p) | |
1522 | ||
1523 | Viewport.Camera.CFrame = CameraPort | |
1524 | ||
1525 | ViewPart.CFrame = Render * CFrame.new(0, 0, -16) | |
1526 | ||
1527 | ViewHUD.Size = UDim2.new(0, Scale.X - 6, 0, Scale.Y - 6) | |
1528 | end) | |
1529 | ||
1530 | -- | |
1531 | ||
1532 | local CharacterAdded | |
1533 | ||
1534 | CharacterAdded = Client.CharacterAdded:Connect(function() | |
1535 | RenderStepped:Disconnect() | |
1536 | CharacterAdded:Disconnect() | |
1537 | PlayerAdded:Disconnect() | |
1538 | ||
1539 | ViewHUD:Destroy() | |
1540 | ViewHUD = nil | |
1541 | end) | |
1542 | ||
1543 | wait(9e9) | |
1544 | end; | |
1545 | ||
1546 | Script() | |
1547 | ||
1548 | wait(9e9) |