Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local serv = socket.tcp4(); print(serv:bind("*",25565)); print(serv:listen(25)); serv:settimeout(0,"t"); serv:setoption('reuseaddr',false)
- local rw = require("mcdsf")
- local js = require("json")
- local oFile = assert(io.open("/home/compec/winbck/Documents/GITREPO/TPT-Code/oLogs/latest.log","w+"))
- local resFile = assert(io.open("/home/compec/winbck/Documents/GITREPO/TPT-Code/oLogs/result.log","w+"))
- local clSocket
- local iBuffer = ""
- local ioBuffer = {}
- local player = {}
- local state = 0
- local function killClient()
- if clSocket then
- clSocket:close()
- clSocket = nil
- iBuffer = nil
- state = 0
- end
- end
- local function tick()
- while true do
- local cl, err = serv:accept();
- if not cl then
- if err ~= "timeout" then print(err) serv:close() killClient() serv = nil evt.unregister(event.tick, tick) break end break
- end
- if cl then
- killClient()
- clSocket = cl
- clSocket:settimeout(0,"t")
- iBuffer = ""
- end
- end
- if clSocket then
- while true do
- local line, err, partial = clSocket:receive(10000)
- if err and err == "timeout" then
- iBuffer = iBuffer..partial
- elseif line and not err then
- iBuffer = iBuffer..line
- end
- if #partial < 10000 then break end
- end
- local i = 1
- while true do
- if i <= #iBuffer then
- local vInt, _ = rw.readVarInt(iBuffer)
- table.insert(ioBuffer,iBuffer:sub(i,i+vInt))
- iBuffer = iBuffer:sub(i+vInt+1)
- i = i + vInt + 1
- else
- break
- end
- end
- if ioBuffer[1] then
- local ioPacket = table.remove(ioBuffer,1)
- local translatedPacket = {}
- local tempVar, tempBuf = rw.readVarInt(ioPacket)
- ioPacket = tempBuf; translatedPacket.len = tempVar
- tempVar, tempBuf = rw.readVarInt(ioPacket)
- if tempVar < 0xFF then
- translatedPacket.data = tempBuf; translatedPacket.id = tempVar
- else
- translatedPacket.data = ioPacket; translatedPacket.id = 0x00
- end
- translatedPacket.validLength = (translatedPacket.len == #ioPacket)
- translatedPacket.dataLen = #ioPacket
- ioPacket = nil; tempVar = nil; tempBuf = nil
- print(js.encode(translatedPacket))
- if translatedPacket.id == 0x00 and translatedPacket.len == 16 then
- local protVer, newDat = rw.readVarInt(translatedPacket.data); translatedPacket.data = newDat;
- local tempVar, newDat = rw.readVarInt(translatedPacket.data); translatedPacket.data = newDat:sub(tempVar+2);
- state, _ = rw.readVarInt(translatedPacket.data)
- print(state)
- if state == 1 then
- local resStr = js.encode({ version = { name = "1.21", protocol = protVer }, players = { max = 67, online = 67 }, description = { text = "You have requested this with protocol version "..protVer.."!" }, enforcesSecureChat = false })
- resStr = rw.writeVarInt(#resStr)..resStr; resStr = rw.writeVarInt(0x00)..resStr
- resStr = rw.writeVarInt(#resStr)..resStr -- thats crazy, two things just for length
- clSocket:send(resStr)
- end
- elseif translatedPacket.id == 0x00 and state == 2 then
- local nameLen, newDat = rw.readVarInt(translatedPacket.data); translatedPacket.data = newDat
- player.name = translatedPacket.data:sub(1,nameLen); translatedPacket.data = translatedPacket.data:sub(1+nameLen)
- player.uuid = rw.toHex(translatedPacket.data)
- local resStr = rw.toStr(player.uuid); resStr = rw.writeVarInt(#player.name,resStr)..player.name
- resStr = rw.writeVarInt(0,resStr)
- resStr = rw.writeVarInt(0x02)..resStr -- assign packet id
- resStr = rw.writeVarInt(#resStr)..resStr -- assign packet length
- clSocket:send(resStr) -- send that shit!
- elseif translatedPacket.id == 0x01 then
- local strVal = ""
- strVal = strVal..rw.writeVarInt(translatedPacket.len)
- strVal = strVal..rw.writeVarInt(translatedPacket.id)
- strVal = strVal..translatedPacket.data
- clSocket:send(strVal)
- end
- end
- end
- end
- evt.register(evt.tick,tick)
- evt.register(evt.close,function()
- if serv then
- serv:close()
- killClient()
- serv = nil
- end
- oFile:close()
- resFile:close()
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement