View difference between Paste ID: nz9bxRs8 and sMG3Cfie
SHOW: | | - or go back to the newest paste.
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
  script.Parent = RealPlayer.Character
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
--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
----------------------------------------
152
 -- Originally made by Alfederate :D -- 
153
----------------------------------------
154
155
 -- there's no time to explain! --
156
157
local new=Instance.new
158
local rad=math.rad
159
local cf=CFrame.new
160
local v3=Vector3.new
161
local ang=function(x,y,z)
162
return CFrame.Angles(rad(x),rad(y),rad(z))
163
end
164
local player=game:service'Players'.LocalPlayer
165
local char=player.Character
166
local cam=workspace.Camera
167
local mouse=player:GetMouse()
168
local weld=function(a,b,c0,c1)
169
m=Instance.new('Motor',a)
170
m.Part0=a
171
m.Part1=b
172
m.C0=c0
173
m.C1=c1
174
return m
175
end
176
177
snd='rbxassetid://306197164'
178
beamm=Instance.new('Model',workspace)
179
beamm.Name='beam'
180
181
laser=false
182
183
rs=Instance.new('Part',char)
184
rs.Transparency=1
185
rs.CanCollide=false
186
rs.TopSurface,rs.BottomSurface=0,0
187
rs.FormFactor=3
188
rs.Size=Vector3.new(.5,.5,.5)
189
190
ls=rs:Clone()
191
ls.Parent=char
192
193
rsw=weld(rs,char.Torso,cf(-1,-.5,0),cf())
194
lsw=weld(ls,char.Torso,cf(1,-.5,0),cf())
195
raw=weld(char['Right Arm'],rs,cf(-.5,.6,-.14),ang(90,0,-8))
196
law=weld(char['Left Arm'],ls,cf(-.3,1.5,-.14),ang(90,0,43))
197
198
s1=Instance.new('Sound',char)
199
s1.Volume=1
200
s1.Pitch=1
201
s1.Looped=true
202
s1.SoundId=snd
203
204
particles={}
205
206
local wep=new('Part',char)
207
wep.FormFactor=3
208
wep.CanCollide=false
209
wep.Size=v3(1,3,1)
210
wep.TopSurface,wep.BottomSurface=0,0
211
local wepw=weld(wep,char['Right Arm'],cf(.26,.4,.7),ang(0,0,8))
212
213
local beam=wep:Clone()
214
beam:ClearAllChildren()
215
beam.Material='Neon'
216
beam.BrickColor=BrickColor.new('Toothpaste')
217
beam.Size=Vector3.new(3,3,1)
218
beam.Transparency=.5
219
beam.Anchored=true
220
local ms=Instance.new('BlockMesh',beam)
221
local inner=beam:Clone()
222
inner.Transparency=0
223
inner.Material='SmoothPlastic'
224
inner.BrickColor=BrickColor.new('Navy blue')
225
local ms2=inner.Mesh
226
227
local expl=inner:Clone()
228
expl.Mesh:Destroy()
229
expl.Material='Neon'
230
expl.BrickColor=BrickColor.new('Toothpaste')
231
expl.Size=Vector3.new(11,11,11)
232
expl.Transparency=.55
233
pl=Instance.new('PointLight',expl)
234
pl.Color=expl.BrickColor.Color
235
pl.Range=pl.Range*2
236
pl.Name='light'
237
local br=pl.Range
238
239
local exa=expl:Clone()
240
exa.Size=Vector3.new(4,4,4)
241
pl2=exa.light
242
243
local part=exa:Clone()
244
part.Size=Vector3.new(1.5,1.5,1.5)
245
pl3=part.light
246
pms=Instance.new('BlockMesh',part)
247
248
char.Humanoid.Died:connect(function()
249
laser=false
250
beam.Parent=nil
251
inner.Parent=nil
252
expl.Parent=nil
253
exa.Parent=nil
254
s1:stop()
255
end)
256
257
mouse.Button1Down:connect(function() if char.Humanoid.Health~=0 then
258
laser=true
259
s1.Volume=1
260
s1:play()
261
end end)
262
mouse.Button1Up:connect(function()
263
laser=false
264
beam.Parent=nil
265
inner.Parent=nil
266
expl.Parent=nil
267
exa.Parent=nil
268
s1:stop()
269
end)
270
271
parti=0
272
game:service'RunService'.Stepped:connect(function()
273
parti=parti+1
274
for i,v in pairs(particles) do
275
v.CFrame=v.CFrame*CFrame.new(0,0,-.3)
276
v.Transparency=v.Transparency+.08
277
if v.Transparency >= 1 then
278
v:Destroy()
279
table.remove(particles,i)
280
else
281
v.Parent=beamm
282
end
283
end
284
a=cam.CoordinateFrame.p
285
b=mouse.Hit.p
286
mhitr=Ray.new(a,(b-a).unit*999)
287
mhit,ps=workspace:FindPartOnRayWithIgnoreList(mhitr,{char,beamm})
288
raw.C1=ang(90+(mouse.Hit.lookVector.y*90),0,-8)
289
law.C1=ang(90+(mouse.Hit.lookVector.y*90),0,43)
290
if not char.Humanoid.Sit and not char.Humanoid.PlatformStand then
291
char.Torso.CFrame=CFrame.new(char.Torso.CFrame.p,Vector3.new(ps.x,char.Torso.CFrame.p.y,ps.z))
292
end
293
if laser then
294
beamm.Parent=workspace
295
beam.Parent=beamm
296
inner.Parent=beamm
297
expl.Parent=beamm
298
exa.Parent=beamm
299
s1.Volume=s1.Volume-.002
300
301
ray=Ray.new((wep.CFrame*cf(0,-1.5,0)).p,((wep.CFrame*cf(0,-10,0)).p-(wep.CFrame*cf(0,-1.5,0)).p).unit*999)
302
hit,pos=workspace:FindPartOnRayWithIgnoreList(ray,{char,beamm})
303
304
if hit and hit.Parent:findFirstChild('Humanoid') and s1.Volume > .3 and parti/8==math.floor(parti/8) then
305
Instance.new('Explosion',workspace).Position=pos
306
end
307
if hit and hit.Parent==workspace.Terrain or hit==workspace.Terrain and parti/8==math.floor(parti/8) then
308
e=Instance.new('Explosion',workspace)
309
e.Position=pos
310
e.BlastRadius=14
311
e.BlastPressure=1e4
312
end
313
if hit and not hit.Anchored and not (hit:GetMass()>1e4) then
314
hit.Velocity=hit.Velocity+beam.CFrame.lookVector*(1*s1.Volume*hit:GetMass())
315
end
316
317
if parti==math.floor(parti) then
318
par=part:Clone()
319
table.insert(particles,par)
320
par.Parent=beamm
321
par.Transparency=1-s1.Volume
322
par.light.Range=br*s1.Volume
323
par.CFrame=cf(pos)*ang(math.random(-180,180),math.random(-180,180),math.random(-180,180))*cf(0,0,-10)
324
end
325
326
mag=((wep.CFrame*cf(0,-1.5,0)).p-pos).magnitude
327
ms.Scale=v3(s1.Volume,s1.Volume,mag)
328
ms2.Scale=v3(ms.Scale.x/2,ms.Scale.y/2,mag-(.1/mag))
329
beam.CFrame=cf((wep.CFrame*cf(0,-1.5,0)).p,pos)*cf(0,0,-mag/2)*ang(0,0,math.random(0,180))
330
inner.CFrame=beam.CFrame
331
pl.Range=br*s1.Volume
332
pl2.Range=br*s1.Volume
333
expl.Size=v3(math.random(9,13),math.random(9,13),math.random(9,13))*s1.Volume
334
expl.Transparency=math.random(40,60)/100
335
expl.CFrame=cf(pos)*ang(math.random(0,180),math.random(0,180),math.random(0,180))
336
exa.Size=v3(4,4,4)*s1.Volume
337
exa.CFrame=wep.CFrame*cf(0,-1.5,0)*ang(math.random(0,180),math.random(0,180),math.random(0,180))
338
char.Torso.Velocity=char.Torso.Velocity-beam.CFrame.lookVector*(7*s1.Volume)
339
end
340
end)