X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2Fnet.cpp;h=20b6f5c22660d8c27b474d0d8e652369dd650bcc;hb=104592aabdc70b21065c35fe4d092fc6cdaa1f49;hp=73ed73c2d006b06480bdef3c53310dd8501d4698;hpb=dbfcb12348b80e2582f710acb1e4ed0011889ba2;p=blank.git diff --git a/src/net/net.cpp b/src/net/net.cpp index 73ed73c..20b6f5c 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -5,6 +5,7 @@ #include "Server.hpp" #include "../app/init.hpp" +#include "../world/World.hpp" #include #include @@ -42,7 +43,7 @@ Client::Client(const Config &conf, World &world) client_pack.data = new Uint8[sizeof(Packet)]; client_pack.maxlen = sizeof(Packet); // establish connection - conn.SendPing(client_pack, client_sock); + SendPing(); } Client::~Client() { @@ -83,10 +84,20 @@ void Client::Update(int dt) { if (conn.TimedOut()) { cout << "connection timed out :(" << endl; } else if (conn.ShouldPing()) { - conn.SendPing(client_pack, client_sock); + SendPing(); } } +void Client::SendPing() { + conn.SendPing(client_pack, client_sock); +} + +void Client::SendLogin(const string &name) { + Packet &pack = *reinterpret_cast(client_pack.data); + client_pack.len = pack.Login(name); + conn.Send(client_pack, client_sock); +} + Connection::Connection(const IPaddress &addr) : addr(addr) @@ -160,6 +171,20 @@ size_t Packet::Ping() noexcept { return sizeof(Header); } +size_t Packet::Login(const string &name) noexcept { + constexpr size_t maxname = 32; + + Tag(); + header.type = LOGIN; + if (name.size() < maxname) { + memset(payload, '\0', maxname); + memcpy(payload, name.c_str(), name.size()); + } else { + memcpy(payload, name.c_str(), maxname); + } + return sizeof(Header) + maxname; +} + Server::Server(const Config &conf, World &world) : serv_sock(nullptr) @@ -206,6 +231,18 @@ void Server::HandlePacket(const UDPpacket &udp_pack) { Connection &client = GetClient(udp_pack.address); client.FlagRecv(); + + switch (pack.header.type) { + case Packet::PING: + // already done all that's supposed to do + break; + case Packet::LOGIN: + HandleLogin(client, udp_pack); + break; + default: + // just drop packets of unknown type + break; + } } Connection &Server::GetClient(const IPaddress &addr) { @@ -244,4 +281,25 @@ void Server::OnDisconnect(Connection &client) { cout << "connection timeout from " << client.Address() << endl; } + +void Server::HandleLogin(Connection &client, const UDPpacket &udp_pack) { + const Packet &pack = *reinterpret_cast(udp_pack.data); + size_t maxlen = min(udp_pack.len - int(sizeof(Packet::Header)), 32); + string name; + name.reserve(maxlen); + for (size_t i = 0; i < maxlen && pack.payload[i] != '\0'; ++i) { + name.push_back(pack.payload[i]); + } + cout << "got login request from player \"" << name << '"' << endl; + + Entity *player = world.AddPlayer(name); + if (player) { + // success! + cout << "\taccepted" << endl; + } else { + // aw no :( + cout << "\trejected" << endl; + } +} + }