· 4 years ago · Jul 29, 2021, 06:02 AM
1local capturing = false
2local screenshotRequested = false
3local screenshotFailed = false
4local stopScreenGrab = false
5local inFrame = false
6local screenshotRequestedLastFrame = false
7
8local function UploadScreenGrab( data )
9 HTTP( {
10 url = "https://api.imgur.com/3/image",
11 method = "post",
12 headers = {
13 [ "Authorization" ] = "put your imgur api key here"
14 },
15 success = function( _, body )
16 if screenshotFailed then
17 screenshotFailed = false
18 return
19 end
20
21 body = util.JSONToTable( body )
22
23 if istable( body ) then
24 if not body.data.link and body.data.error then
25 net.Start( "bScreenGrabFailed" )
26 net.WriteString( body.data.error )
27 net.SendToServer()
28
29 return
30 end
31
32 net.Start( "bScreenGrabSuccess" )
33 net.WriteString( body.data.link )
34 net.SendToServer()
35 end
36 end,
37 failed = function()
38 net.Start( "bScreenGrabFailed" )
39 net.WriteString( "Couldn't connect to imgur" )
40 net.SendToServer()
41 end,
42 parameters = {
43 image = data
44 }
45 } )
46end
47
48hook.Add( "PreRender", "ScreenGrab", function()
49 inFrame = true
50 stopScreenGrab = false
51 render.SetRenderTarget()
52end )
53
54local screengrabRT = GetRenderTarget( "ScreengrabRT" .. ScrW() .. "_" .. ScrH(), ScrW(), ScrH() )
55
56hook.Add( "PostRender", "ScreenGrab", function( vOrigin, vAngle, vFOV )
57 if stopScreenGrab then return end
58 inFrame = false
59
60 if screenshotRequestedLastFrame then
61 render.PushRenderTarget( screengrabRT )
62 else
63 render.CopyRenderTargetToTexture( screengrabRT )
64 render.SetRenderTarget( screengrabRT )
65 end
66
67 if screenshotRequested or screenshotRequestedLastFrame then
68 screenshotRequested = false
69
70 if jit.version == "LuaJIT 2.1.0-beta3" then
71 if screenshotRequestedLastFrame then
72 screenshotRequestedLastFrame = false
73 else
74 screenshotRequestedLastFrame = true
75 return end
76 end
77
78 cam.Start2D()
79 surface.SetFont( "Trebuchet24" )
80 local text = LocalPlayer():SteamID64()
81 local x, y = ScrW() * 0.5, ScrH() * 0.5
82 local w, h = surface.GetTextSize( text )
83
84 surface.SetDrawColor( 0, 0, 0, 100 )
85 surface.DrawRect( x - w * 0.5 - 5, y - h * 0.5 - 5, w + 10, h + 10 )
86
87 surface.SetTextPos( math.ceil( x - w * 0.5 ), math.ceil( y - h * 0.5 ) )
88 surface.SetTextColor( 255, 255, 255 )
89 surface.DrawText( text )
90
91 surface.SetDrawColor( 255, 255, 255 )
92 surface.DrawRect( 0, 0, 1, 1 )
93 cam.End2D()
94
95 render.CapturePixels()
96 local r, g, b = render.ReadPixel( 0, 0 )
97 if r != 255 or g != 255 or b != 255 then
98 net.Start( "bScreenGrabFailed" )
99 net.WriteString( "Tampered with screenshot. (1)" )
100 net.SendToServer()
101
102 return
103 end
104
105 capturing = true
106 local frame1 = FrameNumber()
107 local data = render.Capture( {
108 format = "jpeg",
109 quality = 60,
110 x = 0,
111 y = 0,
112 w = ScrW(),
113 h = ScrH()
114 } )
115 local frame2 = FrameNumber()
116 capturing = false
117
118 if frame1 != frame2 then
119 net.Start( "bScreenGrabFailed" )
120 net.WriteString( "Tampered with screenshot. (2)" )
121 net.SendToServer()
122
123 return
124 end
125
126 UploadScreenGrab( util.Base64Encode( data ) )
127 end
128
129 if screenshotRequestedLastFrame then
130 render.PopRenderTarget()
131 render.CopyRenderTargetToTexture( screengrabRT )
132 render.SetRenderTarget( screengrabRT )
133 end
134end )
135
136hook.Add( "PreDrawViewModel", "ScreenGrab", function()
137 if capturing then
138 net.Start( "bScreenGrabFailed" )
139 net.WriteString( "Tampered with screenshot. (3)" )
140 net.SendToServer()
141
142 screenshotFailed = true
143 end
144end )
145
146net.Receive( "bScreenGrabStart", function()
147 screenshotRequested = true
148end )
149
150net.Receive( "bScreenGrabSuccess", function()
151 gui.OpenURL( net.ReadString() )
152end )
153
154hook.Add( "ShutDown", "bScreenGrabStop", function()
155 stopScreenGrab = true
156 render.SetRenderTarget()
157end )
158
159hook.Add( "DrawOverlay", "ScreenGrab", function()
160 if not inFrame then
161 stopScreenGrab = true
162 render.SetRenderTarget()
163 end
164end )