View difference between Paste ID: WXmswsXi and 25z6771v
SHOW: | | - or go back to the newest paste.
1-
--[[
1+
--https://github.com/Mokiros/roblox-FE-compatibility
2
if game:GetService("RunService"):IsClient() then error("Script must be server-side in order to work; use h/ and not hl/") end
3
local Player,game,owner = owner,game
4
local RealPlayer = Player
5
do
6
	print("FE Compatibility code V2 by Mokiros")
7
	local RealPlayer = RealPlayer
8-
	To toggle this script, press the LeftShift key, then the Insert key.
8+
	script.Parent = RealPlayer.Character
9-
--]]
9+
10
	--Fake event to make stuff like Mouse.KeyDown work
11
	local Disconnect_Function = function(this)
12
		this[1].Functions[this[2]] = nil
13
	end
14
	local Disconnect_Metatable = {__index={disconnect=Disconnect_Function,Disconnect=Disconnect_Function}}
15
	local FakeEvent_Metatable = {__index={
16
		Connect = function(this,f)
17
			local i = tostring(math.random(0,10000))
18
			while this.Functions[i] do
19
				i = tostring(math.random(0,10000))
20
			end
21
			this.Functions[i] = f
22
			return setmetatable({this,i},Disconnect_Metatable)
23
		end
24
	}}
25
	FakeEvent_Metatable.__index.connect = FakeEvent_Metatable.__index.Connect
26
	local function fakeEvent()
27
		return setmetatable({Functions={}},FakeEvent_Metatable)
28
	end
29
30
	--Creating fake input objects with fake variables
31
    local FakeMouse = {Hit=CFrame.new(),KeyUp=fakeEvent(),KeyDown=fakeEvent(),Button1Up=fakeEvent(),Button1Down=fakeEvent(),Button2Up=fakeEvent(),Button2Down=fakeEvent()}
32
    FakeMouse.keyUp = FakeMouse.KeyUp
33
    FakeMouse.keyDown = FakeMouse.KeyDown
34
	local UIS = {InputBegan=fakeEvent(),InputEnded=fakeEvent()}
35
	local CAS = {Actions={},BindAction=function(self,name,fun,touch,...)
36
		CAS.Actions[name] = fun and {Name=name,Function=fun,Keys={...}} or nil
37
	end}
38
	--Merged 2 functions into one by checking amount of arguments
39
	CAS.UnbindAction = CAS.BindAction
40
41
	--This function will trigger the events that have been :Connect()'ed
42
	local function TriggerEvent(self,ev,...)
43
		for _,f in pairs(self[ev].Functions) do
44
			f(...)
45
		end
46
	end
47
	FakeMouse.TriggerEvent = TriggerEvent
48
	UIS.TriggerEvent = TriggerEvent
49
50
	--Client communication
51
	local Event = Instance.new("RemoteEvent")
52
	Event.Name = "UserInput_Event"
53
	Event.OnServerEvent:Connect(function(plr,io)
54
	    if plr~=RealPlayer then return end
55
		FakeMouse.Target = io.Target
56
		FakeMouse.Hit = io.Hit
57
		if not io.isMouse then
58
			local b = io.UserInputState == Enum.UserInputState.Begin
59
			if io.UserInputType == Enum.UserInputType.MouseButton1 then
60
				return FakeMouse:TriggerEvent(b and "Button1Down" or "Button1Up")
61
			end
62
			if io.UserInputType == Enum.UserInputType.MouseButton2 then
63
				return FakeMouse:TriggerEvent(b and "Button2Down" or "Button2Up")
64
			end
65
			for _,t in pairs(CAS.Actions) do
66
				for _,k in pairs(t.Keys) do
67
					if k==io.KeyCode then
68
						t.Function(t.Name,io.UserInputState,io)
69
					end
70
				end
71
			end
72
			FakeMouse:TriggerEvent(b and "KeyDown" or "KeyUp",io.KeyCode.Name:lower())
73
			UIS:TriggerEvent(b and "InputBegan" or "InputEnded",io,false)
74
	    end
75
	end)
76
	Event.Parent = NLS([==[local Event = script:WaitForChild("UserInput_Event")
77
	local Mouse = owner:GetMouse()
78
	local UIS = game:GetService("UserInputService")
79
	local input = function(io,RobloxHandled)
80
		if RobloxHandled then return end
81
		--Since InputObject is a client-side instance, we create and pass table instead
82
		Event:FireServer({KeyCode=io.KeyCode,UserInputType=io.UserInputType,UserInputState=io.UserInputState,Hit=Mouse.Hit,Target=Mouse.Target})
83
	end
84
	UIS.InputBegan:Connect(input)
85
	UIS.InputEnded:Connect(input)
86
	local h,t
87-
	if input.KeyCode == Enum.KeyCode.Insert and sleight == true then
87+
	--Give the server mouse data every second frame, but only if the values changed
88
	--If player is not moving their mouse, client won't fire events
89
	local HB = game:GetService("RunService").Heartbeat
90
	while true do
91
		if h~=Mouse.Hit or t~=Mouse.Target then
92
			h,t=Mouse.Hit,Mouse.Target
93
			Event:FireServer({isMouse=true,Target=t,Hit=h})
94
		end
95
		--Wait 2 frames
96
		for i=1,2 do
97
			HB:Wait()
98
		end
99
	end]==],script)
100
101
	----Sandboxed game object that allows the usage of client-side methods and services
102
	--Real game object
103
	local RealGame = game
104
105
	--Metatable for fake service
106
	local FakeService_Metatable = {
107
		__index = function(self,k)
108
			local s = rawget(self,"_RealService")
109
			if s then
110
				return typeof(s[k])=="function"
111
				and function(_,...)return s[k](s,...)end or s[k]
112
			end
113
		end,
114
		__newindex = function(self,k,v)
115
			local s = rawget(self,"_RealService")
116
			if s then s[k]=v end
117
		end
118
	}
119
	local function FakeService(t,RealService)
120
		t._RealService = typeof(RealService)=="string" and RealGame:GetService(RealService) or RealService
121
		return setmetatable(t,FakeService_Metatable)
122
	end
123
124
	--Fake game object
125
	local FakeGame = {
126
		GetService = function(self,s)
127
			return rawget(self,s) or RealGame:GetService(s)
128
		end,
129
		Players = FakeService({
130
			LocalPlayer = FakeService({GetMouse=function(self)return FakeMouse end},Player)
131
		},"Players"),
132
		UserInputService = FakeService(UIS,"UserInputService"),
133
		ContextActionService = FakeService(CAS,"ContextActionService"),
134
		RunService = FakeService({
135
			_btrs = {},
136
			RenderStepped = RealGame:GetService("RunService").Heartbeat,
137
			BindToRenderStep = function(self,name,_,fun)
138
				self._btrs[name] = self.Heartbeat:Connect(fun)
139
			end,
140
			UnbindFromRenderStep = function(self,name)
141
				self._btrs[name]:Disconnect()
142
			end,
143
		},"RunService")
144
	}
145
	rawset(FakeGame.Players,"localPlayer",FakeGame.Players.LocalPlayer)
146
	FakeGame.service = FakeGame.GetService
147
	FakeService(FakeGame,game)
148
	--Changing owner to fake player object to support owner:GetMouse()
149
	game,owner = FakeGame,FakeGame.Players.LocalPlayer
150
end
151
warn[[
152
	WARNING!
153
	This script can lead to a ban if used on more strict games (Phantom Forces, FPS shooters)
154
	We are not responsible for any consequences on thou.
155
	
156
	For the fact of this, this script has been dubbed: "Uncertainary"
157
	
158
	To toggle this script, press the LeftShift key, then the B key.
159
]]
160
161
local PlayerService = game:GetService('Players');
162
local player = PlayerService.LocalPlayer;
163
local cam = workspace.CurrentCamera;
164
local Camera = {};
165
local TrackHumanoid = false; -- If set to false, then this will only track players, else we will track NPCs and players.
166
local enabled = false;
167
local sleight = false;
168
local UserInput = game:GetService('UserInputService');
169
170
if not gui then
171
	gui = Instance.new('BillboardGui');
172
	local frame = Instance.new('Frame', gui);
173
	
174
	gui.AlwaysOnTop = true;
175
	gui.LightInfluence = 0;
176
	gui.Size = UDim2.new(0, 100, 0, 100);
177
	frame.BackgroundColor3 = Color3.fromRGB(255, 255, 255);
178
	frame.BackgroundTransparency = .75;
179
	frame.Size = UDim2.new(1, 0, 1, 0);
180
	frame.Rotation = 45;
181
	frame.BorderSizePixel = 0;
182
end;
183
184
function Camera:LockPlayer(p, isNPC)
185
	if isNPC == true then
186
		if p and p.Parent:IsA('Model') and p.Parent:FindFirstChild('Torso') then
187
			local t = p.Parent.Torso.CFrame * Vector3.new(0, -0.25, 0);
188
			cam.CFrame = CFrame.new(cam.Focus.p, t) * CFrame.new(0, 0, 0.5);
189
			gui.Parent = p.Parent.Torso;
190
		end;
191
	else
192
		if p and p.Character and p.Character:FindFirstChild('Torso') then
193
			local t = p.Character.Torso.CFrame * Vector3.new(0, -0.25, 0);
194
			cam.CFrame = CFrame.new(cam.Focus.p, t) * CFrame.new(0, 0, 0.5);
195
			gui.Parent = p.Character.Torso;
196
		end;
197
	end;
198
end;
199
200
201
game:GetService("RunService").RenderStepped:connect(function()
202
if enabled == true then
203
	for _,v in pairs(PlayerService:GetChildren()) do 
204
		if v:IsA('Player') and v.Character then
205
			if v.Character:FindFirstChildOfClass('Humanoid') and v.Character:FindFirstChildOfClass('Humanoid').Health > 0 then
206
				if v == player then
207
				else
208
					Camera:LockPlayer(v);
209
				end;
210
			end;
211
		end;
212
	end;
213
	
214
	if TrackHumanoid==true then for _,v in pairs(workspace:GetDescendants()) do 
215
		if v.Parent:IsA('Model') and v.Parent:FindFirstChildOfClass('Humanoid') and v.Parent:FindFirstChildOfClass('Humanoid').Health > 0 then
216
			if v.Parent.Name == player.Name then
217
			else
218
				Camera:LockPlayer(v, true);
219
			end;
220
		end;
221
	end;
222
	end;
223
elseif enabled == false then
224
	if gui then
225
		gui.Parent = nil;
226
	end;
227
end;
228
end);
229
230
UserInput.InputBegan:connect(function(input)
231
	if input.KeyCode == Enum.KeyCode.LeftShift then
232
		sleight = not sleight;
233
	end;
234
end);
235
236
UserInput.InputEnded:connect(function(input)
237
	if input.KeyCode == Enum.KeyCode.B and sleight == true then
238
		enabled = not enabled;
239
	end;
240
end);