View difference between Paste ID: biceP48C and MGWtQVga
SHOW: | | - or go back to the newest paste.
1
if game:GetService("RunService"):IsClient() then error("Script must be server-side in order to work; use h/ and not hl/") end
2
local Player,game,owner = owner,game
3
local RealPlayer = Player
4
do
5
	local rp = RealPlayer
6
	script.Parent = rp.Character
7
	
8
	--RemoteEvent for communicating
9
	local Event = Instance.new("RemoteEvent")
10
	Event.Name = "UserInput_Event"
11
12
	--Fake event to make stuff like Mouse.KeyDown work
13
	local function fakeEvent()
14
		local t = {_fakeEvent=true,Functions={},Connect=function(self,f)table.insert(self.Functions,f) end}
15
		t.connect = t.Connect
16
		return t
17
	end
18
19
	--Creating fake input objects with fake variables
20
    local m = {Target=nil,Hit=CFrame.new(),KeyUp=fakeEvent(),KeyDown=fakeEvent(),Button1Up=fakeEvent(),Button1Down=fakeEvent()}
21
	local UIS = {InputBegan=fakeEvent(),InputEnded=fakeEvent()}
22
	local CAS = {Actions={},BindAction=function(self,name,fun,touch,...)
23
		CAS.Actions[name] = fun and {Name=name,Function=fun,Keys={...}} or nil
24
	end}
25
	--Merged 2 functions into one by checking amount of arguments
26
	CAS.UnbindAction = CAS.BindAction
27
28
	--This function will trigger the events that have been :Connect()'ed
29
	local function te(self,ev,...)
30
		local t = m[ev]
31
		if t and t._fakeEvent then
32
			for _,f in pairs(t.Functions) do
33
				f(...)
34
			end
35
		end
36
	end
37
	m.TrigEvent = te
38
	UIS.TrigEvent = te
39
40
	Event.OnServerEvent:Connect(function(plr,io)
41
	    if plr~=rp then return end
42
		m.Target = io.Target
43
		m.Hit = io.Hit
44
		if not io.isMouse then
45
			local b = io.UserInputState == Enum.UserInputState.Begin
46
			if io.UserInputType == Enum.UserInputType.MouseButton1 then
47
				return m:TrigEvent(b and "Button1Down" or "Button1Up")
48
			end
49
			for _,t in pairs(CAS.Actions) do
50
				for _,k in pairs(t.Keys) do
51
					if k==io.KeyCode then
52
						t.Function(t.Name,io.UserInputState,io)
53
					end
54
				end
55
			end
56
			m:TrigEvent(b and "KeyDown" or "KeyUp",io.KeyCode.Name:lower())
57
			UIS:TrigEvent(b and "InputBegan" or "InputEnded",io,false)
58
	    end
59
	end)
60
	Event.Parent = NLS([==[
61
	local Player = game:GetService("Players").LocalPlayer
62
	local Event = script:WaitForChild("UserInput_Event")
63
64
	local Mouse = Player:GetMouse()
65
	local UIS = game:GetService("UserInputService")
66
	local input = function(io,a)
67
		if a then return end
68
		--Since InputObject is a client-side instance, we create and pass table instead
69
		Event:FireServer({KeyCode=io.KeyCode,UserInputType=io.UserInputType,UserInputState=io.UserInputState,Hit=Mouse.Hit,Target=Mouse.Target})
70
	end
71
	UIS.InputBegan:Connect(input)
72
	UIS.InputEnded:Connect(input)
73
74
	local h,t
75
	--Give the server mouse data 30 times every second, but only if the values changed
76
	--If player is not moving their mouse, client won't fire events
77
	while wait(1/30) do
78
		if h~=Mouse.Hit or t~=Mouse.Target then
79
			h,t=Mouse.Hit,Mouse.Target
80
			Event:FireServer({isMouse=true,Target=t,Hit=h})
81
		end
82
	end]==],Player.Character)
83
84
	----Sandboxed game object that allows the usage of client-side methods and services
85
	--Real game object
86
	local _rg = game
87
88
	--Metatable for fake service
89
	local fsmt = {
90
		__index = function(self,k)
91
			local s = rawget(self,"_RealService")
92
			if s then return s[k] end
93
		end,
94
		__newindex = function(self,k,v)
95
			local s = rawget(self,"_RealService")
96
			if s then s[k]=v end
97
		end,
98
		__call = function(self,...)
99
			local s = rawget(self,"_RealService")
100
			if s then return s(...) end
101
		end
102
	}
103
	local function FakeService(t,RealService)
104
		t._RealService = typeof(RealService)=="string" and _rg:GetService(RealService) or RealService
105
		return setmetatable(t,fsmt)
106
	end
107
108
	--Fake game object
109
	local g = {
110
		GetService = function(self,s)
111
			return self[s]
112
		end,
113
		Players = FakeService({
114
			LocalPlayer = FakeService({GetMouse=function(self)return m end},Player)
115
		},"Players"),
116
		UserInputService = FakeService(UIS,"UserInputService"),
117
		ContextActionService = FakeService(CAS,"ContextActionService"),
118
	}
119
	rawset(g.Players,"localPlayer",g.Players.LocalPlayer)
120
	g.service = g.GetService
121
	
122
	g.RunService = FakeService({
123
		RenderStepped = _rg:GetService("RunService").Heartbeat,
124
		BindToRenderStep = function(self,name,_,fun)
125
			self._btrs[name] = self.Heartbeat:Connect(fun)
126
		end,
127
		UnbindFromRenderStep = function(self,name)
128
			self._btrs[name]:Disconnect()
129
		end,
130
	},"RunService")
131
132
	setmetatable(g,{
133
		__index=function(self,s)
134
			return _rg:GetService(s) or typeof(_rg[s])=="function"
135
			and function(_,...)return _rg[s](_rg,...)end or _rg[s]
136
		end,
137
		__newindex = fsmt.__newindex,
138
		__call = fsmt.__call
139
	})
140
	--Changing owner to fake player object to support owner:GetMouse()
141
	game,owner = g,g.Players.LocalPlayer
142
end
143
144
145
for i,v in next, game:GetService('Players').LocalPlayer.Character:GetChildren() do
146
   if v:IsA('Accessory') then
147
       v:Destroy()
148
   end
149
end