Da ich ohnehin gerade da am herumexperimentieren bin, hier eine mögliche Lösung:
Das Bitwise kommt wohl nicht mit den 4stelligen unsigned integer klar.
Wenn ich den (so ists jedenfalls in unserem Java-Backend gewesen) Header als Unsigned Int hole, scheints zu klappen:
public static function DecodeHeader($data) {
$value = self::DecodeInt32($data);
$sequence = $value & 0x3FFFFFFF;
$isFromServer = ($value & 0x80000000) != 0;
$isResponse = ($value & 0x40000000) != 0;
var_dump(array(
'sequence' => $sequence,
'isFromServer' => $isFromServer,
'isResponse' => $isResponse
));
return array($isFromServer, $isResponse, $sequence);
}
Alles anzeigen
Jedenfalls kommt die Sequence-ID nun korrekt durch und die Boolischen Werte werden auch beim response korrekt zurückgeworfen:
ZitatAlles anzeigenInit 194.97.46.94_47200
[0] login.plainText ******************
[1] serverInfo
[2] admin.eventsEnabled true
Init 194.97.46.84_47200
[0] login.plainText ******************
[1] serverInfo
[2] admin.eventsEnabled true
[0] OK
[0] OK
[1] OK [ReCr] Mixed DM - Fast Respawn 0 32 SquadDeathMatch0 MP_Abandoned 0 2 0 0 true true false 38831 38822 194.97.46.84:25200 v1.894 | A1390 C2.343 true EU ams DE 0 IN_GAME
[1] OK [ReCr] 24/7 Siege of Shanghai 2000 Tickets 0 64 ConquestLarge0 MP_Siege 1 2 2 2000 2000 0 true true false 44471 3125 194.97.46.94:25200 v1.894 | A1390 C2.343 true EU ams DE 0 IN_GAME
[2] OK
[2] OK
[2686] punkBuster.onMessage 4Netplayers-PB Server: Player List: [Slot #] [GUID] [Address] [Status] [Power] [Auth Rate] [Recent SS] [O/S] [Name]
Hier mal einen Auszug aus dem Java-Backend:
int header = (int) reader.readUnsignedInt();
packet.setSequence(header & 0x3FFFFFFF);
packet.setType((header & 0x80000000) != 0 ? Packet.PacketType.CLIENT : Packet.PacketType.SERVER);
packet.setResponse((header & 0x40000000) != 0);
int size = (int) reader.readUnsignedInt();
int wordcount = (int) reader.readUnsignedInt();
Alles anzeigen