Add support for ExtInfo Packet

This commit is contained in:
NotAFile 2019-05-12 18:53:49 +02:00 committed by notafile
parent d857ef88f1
commit a3e4810a18
2 changed files with 49 additions and 3 deletions

View File

@ -92,6 +92,7 @@ namespace spades {
PacketTypeHandShakeReturn = 32, // C2S
PacketTypeVersionGet = 33, // S2C
PacketTypeVersionSend = 34, // C2S
PacketTypeExtensionInfo = 60,
};
@ -505,7 +506,7 @@ namespace spades {
auto &reader = readerOrNone.value();
try {
if (HandleHandshakePacket(reader)) {
if (HandleHandshakePackets(reader)) {
continue;
}
} catch (const std::exception &ex) {
@ -696,11 +697,12 @@ namespace spades {
}
}
bool NetClient::HandleHandshakePacket(spades::client::NetPacketReader &reader) {
bool NetClient::HandleHandshakePackets(spades::client::NetPacketReader &reader) {
SPADES_MARK_FUNCTION();
switch (reader.GetType()) {
case PacketTypeHandShakeInit: SendHandShakeValid(reader.ReadInt()); return true;
case PacketTypeExtensionInfo: HandleExtensionPacket(reader); return true;
case PacketTypeVersionGet: {
if (reader.GetNumRemainingBytes() > 0) {
// Enhanced variant
@ -719,6 +721,25 @@ namespace spades {
}
}
void NetClient::HandleExtensionPacket(spades::client::NetPacketReader& reader) {
std::unordered_map<uint8_t, uint8_t> implementedExtensions ( {{192, 1}, {120, 1}} );
int ext_count = reader.ReadByte();
for (int i = 0; i < ext_count; i++) {
int ext_id = reader.ReadByte();
int ext_version = reader.ReadByte();
auto got = implementedExtensions.find(ext_id);
if (got == implementedExtensions.end()) {
SPLog("Client does not support extension %d", ext_id);
} else {
SPLog("Client supports extension %d", ext_id);
extensions.emplace(got->first, got->second);
}
}
SendSupportedExtensions();
}
void NetClient::HandleGamePacket(spades::client::NetPacketReader &reader) {
SPADES_MARK_FUNCTION();
@ -1760,6 +1781,18 @@ namespace spades {
enet_peer_send(peer, 0, wri.CreatePacket());
}
void NetClient::SendSupportedExtensions() {
SPADES_MARK_FUNCTION();
NetPacketWriter wri(PacketTypeExtensionInfo);
wri.Write(static_cast<uint8_t>(extensions.size()));
for (auto& i: extensions) {
wri.Write(static_cast<uint8_t>(i.first)); // ext id
wri.Write(static_cast<uint8_t>(i.second)); // ext version
}
SPLog("Sending extension support.");
enet_peer_send(peer, 0, wri.CreatePacket());
}
void NetClient::MapLoaded() {
SPADES_MARK_FUNCTION();

View File

@ -26,6 +26,7 @@
#include <vector>
#include <set>
#include <cstdint>
#include <unordered_map>
#include "PhysicsConstants.h"
#include "Player.h"
@ -52,6 +53,12 @@ namespace spades {
NetClientStatusConnected
};
enum NetExtensionType {
ExtensionType128Player = 192,
ExtensionTypeMessageTypes = 193,
ExtensionTypeKickReason = 194,
};
class World;
class NetPacketReader;
struct PlayerInput;
@ -88,6 +95,10 @@ namespace spades {
std::shared_ptr<GameProperties> properties;
int protocolVersion;
std::unordered_map<uint8_t, uint8_t> extensions;
std::unordered_map<uint8_t, uint8_t> implementedExtensions {
{ExtensionType128Player, 1},
};
class BandwidthMonitor {
ENetHost *host;
@ -129,7 +140,8 @@ namespace spades {
// used for some scripts including Arena by Yourself
IntVector3 temporaryPlayerBlockColor;
bool HandleHandshakePacket(NetPacketReader &);
bool HandleHandshakePackets(NetPacketReader &);
void HandleExtensionPacket(NetPacketReader &);
void HandleGamePacket(NetPacketReader &);
World *GetWorld();
Player *GetPlayer(int);
@ -143,6 +155,7 @@ namespace spades {
void SendVersion();
void SendVersionEnhanced(const std::set<std::uint8_t> &propertyIds);
void SendSupportedExtensions();
public:
NetClient(Client *);