Add bdMatchmaking

This commit is contained in:
momo5502 2022-10-19 21:06:37 +02:00
parent 301fcf5f76
commit 1b5c4234dd
3 changed files with 275 additions and 114 deletions

View File

@ -1,6 +1,7 @@
#pragma once
#include "byte_buffer.hpp"
#include "game/structs.hpp"
namespace demonware
{
@ -265,4 +266,225 @@ namespace demonware
buffer->read_string(&this->filename);
}
};
class bdPerformanceValue final : public bdTaskResult
{
public:
uint64_t user_id;
int64_t performance;
void serialize(byte_buffer* buffer) override
{
buffer->write_uint64(this->user_id);
buffer->write_int64(this->performance);
}
void deserialize(byte_buffer* buffer) override
{
buffer->read_uint64(&this->user_id);
buffer->read_int64(&this->performance);
}
};
struct bdSockAddr final
{
bdSockAddr() : in_un(), m_family(AF_INET)
{
}
union
{
struct
{
char m_b1;
char m_b2;
char m_b3;
char m_b4;
} m_caddr;
unsigned int m_iaddr;
struct
{
unsigned __int16 m_w1;
unsigned __int16 m_w2;
unsigned __int16 m_w3;
unsigned __int16 m_w4;
unsigned __int16 m_w5;
unsigned __int16 m_w6;
unsigned __int16 m_w7;
unsigned __int16 m_w8;
} m_caddr6;
char m_iaddr6[16];
char m_sockaddr_storage[128];
} in_un;
unsigned __int16 m_family;
};
struct bdInetAddr final : bdTaskResult
{
bdSockAddr m_addr;
bool is_valid() const
{
return (this->m_addr.m_family == AF_INET /*|| this->m_addr.m_family == AF_INET6*/);
}
void serialize(byte_buffer* buffer) override
{
const auto data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
if (this->m_addr.m_family == AF_INET)
{
buffer->write(4, &this->m_addr.in_un.m_caddr);
}
buffer->set_use_data_types(data_types);
}
void deserialize(byte_buffer* buffer) override
{
const auto data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
if (this->m_addr.m_family == AF_INET)
{
buffer->read(4, &this->m_addr.in_un.m_caddr);
}
buffer->set_use_data_types(data_types);
}
};
struct bdAddr final : bdTaskResult
{
bdInetAddr m_address;
unsigned __int16 m_port{};
void serialize(byte_buffer* buffer) override
{
const bool data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
this->m_address.serialize(buffer);
buffer->write_uint16(this->m_port);
buffer->set_use_data_types(data_types);
}
void deserialize(byte_buffer* buffer) override
{
const auto data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
this->m_address.deserialize(buffer);
buffer->read_uint16(&this->m_port);
buffer->set_use_data_types(data_types);
}
};
struct bdCommonAddr : bdTaskResult
{
bdAddr m_local_addrs[5];
bdAddr m_public_addr;
game::bdNATType m_nat_type;
unsigned int m_hash;
bool m_is_loopback;
void serialize(byte_buffer* buffer) override
{
const auto data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
auto valid = true;
for (uint32_t i = 0; i < 5 && i < ARRAYSIZE(this->m_local_addrs) && valid; ++i)
{
this->m_local_addrs[i].serialize(buffer);
valid = this->m_local_addrs[i].m_address.is_valid();
}
if (valid)
{
this->m_public_addr.serialize(buffer);
buffer->write_byte(this->m_nat_type);
}
buffer->set_use_data_types(data_types);
}
void deserialize(byte_buffer* buffer) override
{
const auto data_types = buffer->is_using_data_types();
buffer->set_use_data_types(false);
auto valid = true;
for (uint32_t i = 0; i < ARRAYSIZE(this->m_local_addrs) && valid; ++i)
{
bdAddr addr;
addr.deserialize(buffer);
this->m_local_addrs[i] = addr;
valid = this->m_local_addrs[i].m_address.is_valid();
}
if (valid)
{
this->m_public_addr.deserialize(buffer);
buffer->read_ubyte(reinterpret_cast<uint8_t*>(&this->m_nat_type));
}
buffer->set_use_data_types(data_types);
}
};
class bdSessionID final : public bdTaskResult
{
public:
uint64_t session_id;
void serialize(byte_buffer* buffer) override
{
buffer->write_blob(LPSTR(&this->session_id), sizeof this->session_id);
}
void deserialize(byte_buffer* buffer) override
{
int size{};
char* data{};
buffer->read_blob(&data, &size);
if (data && uint32_t(size) >= sizeof(this->session_id))
{
this->session_id = *reinterpret_cast<uint64_t*>(data);
}
}
};
class bdMatchMakingInfo final : bdTaskResult
{
bdSessionID m_sessionID;
std::string m_hostAddr;
uint32_t m_gameType;
uint32_t m_maxPlayers;
uint32_t m_numPlayers;
void serialize(byte_buffer* buffer) override
{
buffer->write_blob(this->m_hostAddr);
this->m_sessionID.serialize(buffer);
buffer->write_uint32(this->m_gameType);
buffer->write_uint32(this->m_maxPlayers);
buffer->write_uint32(this->m_numPlayers);
}
void deserialize(byte_buffer* buffer) override
{
buffer->read_blob(&this->m_hostAddr);
buffer->read_uint32(&this->m_gameType);
buffer->read_uint32(&this->m_maxPlayers);
}
};
}

View File

@ -1,129 +1,78 @@
#include <std_include.hpp>
#include "../services.hpp"
#include "steam/steam.hpp"
namespace demonware
{
bdMatchMaking::bdMatchMaking() : service(138, "bdMatchMaking")
bdMatchMaking::bdMatchMaking() : service(21, "bdMatchMaking")
{
this->register_task(1, &bdMatchMaking::createSession);
this->register_task(2, &bdMatchMaking::updateSession);
this->register_task(3, &bdMatchMaking::deleteSession);
this->register_task(4, &bdMatchMaking::findSessionFromID);
this->register_task(5, &bdMatchMaking::findSessions);
this->register_task(6, &bdMatchMaking::notifyJoin);
this->register_task(8, &bdMatchMaking::inviteToSession);
this->register_task(9, &bdMatchMaking::submitPerformance);
this->register_task(10, &bdMatchMaking::getPerformanceValues);
this->register_task(11, &bdMatchMaking::getSessionInvites);
this->register_task(12, &bdMatchMaking::updateSessionPlayers);
this->register_task(13, &bdMatchMaking::findSessionsPaged);
this->register_task(14, &bdMatchMaking::findSessionsByEntityIDs);
this->register_task(15, &bdMatchMaking::findSessionsFromIDs);
this->register_task(16, &bdMatchMaking::findSessionsTwoPass);
this->register_task(1, &bdMatchMaking::create_session);
this->register_task(2, &bdMatchMaking::update_session);
this->register_task(3, &bdMatchMaking::delete_session);
this->register_task(5, &bdMatchMaking::find_sessions);
this->register_task(10, &bdMatchMaking::get_performance);
}
void bdMatchMaking::createSession(service_server* server, byte_buffer* /*buffer*/) const
void bdMatchMaking::create_session(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto* id = new bdSessionID;
id->session_id = steam::SteamUser()->GetSteamID().bits;
auto reply = server->create_reply(this->task_id());
reply->add(id);
reply->send();
}
void bdMatchMaking::update_session(service_server* server, byte_buffer* buffer) const
{
/*MatchMakingInfo mmInfo;
mmInfo.session_id.deserialize(buffer);
mmInfo.deserialize(buffer);
byte_buffer out_data;
mmInfo.symmetric = true;
mmInfo.serialize(&out_data);
byte_buffer addr_buf(mmInfo.host_addr);
bdCommonAddr addr;
addr.deserialize(&addr_buf);*/
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::updateSession(service_server* server, byte_buffer* /*buffer*/) const
void bdMatchMaking::delete_session(service_server* server, byte_buffer* buffer) const
{
// TODO:
bdSessionID id;
id.deserialize(buffer);
byte_buffer out_data;
id.serialize(&out_data);
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::deleteSession(service_server* server, byte_buffer* /*buffer*/) const
void bdMatchMaking::get_performance(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto* result = new bdPerformanceValue;
result->user_id = steam::SteamUser()->GetSteamID().bits;
result->performance = 10;
auto reply = server->create_reply(this->task_id());
reply->add(result);
reply->send();
}
void bdMatchMaking::findSessionFromID(service_server* server, byte_buffer* /*buffer*/) const
void bdMatchMaking::find_sessions(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::findSessions(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
//for (auto& session : sessions)
{
//reply->add(session.second);
}
void bdMatchMaking::getPerformanceValues(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::getSessionInvites(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::updateSessionPlayers(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::submitPerformance(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::notifyJoin(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::inviteToSession(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::findSessionsPaged(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::findSessionsByEntityIDs(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::findSessionsFromIDs(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
void bdMatchMaking::findSessionsTwoPass(service_server* server, byte_buffer* /*buffer*/) const
{
// TODO:
auto reply = server->create_reply(this->task_id());
reply->send();
}
}

View File

@ -8,20 +8,10 @@ namespace demonware
bdMatchMaking();
private:
void createSession(service_server* server, byte_buffer* buffer) const;
void updateSession(service_server* server, byte_buffer* buffer) const;
void deleteSession(service_server* server, byte_buffer* buffer) const;
void findSessionFromID(service_server* server, byte_buffer* buffer) const;
void findSessions(service_server* server, byte_buffer* buffer) const;
void inviteToSession(service_server* server, byte_buffer* buffer) const;
void submitPerformance(service_server* server, byte_buffer* buffer) const;
void notifyJoin(service_server* server, byte_buffer* buffer) const;
void getPerformanceValues(service_server* server, byte_buffer* buffer) const;
void getSessionInvites(service_server* server, byte_buffer* buffer) const;
void updateSessionPlayers(service_server* server, byte_buffer* buffer) const;
void findSessionsPaged(service_server* server, byte_buffer* buffer) const;
void findSessionsByEntityIDs(service_server* server, byte_buffer* buffer) const;
void findSessionsFromIDs(service_server* server, byte_buffer* buffer) const;
void findSessionsTwoPass(service_server* server, byte_buffer* buffer) const;
void create_session(service_server* server, byte_buffer* buffer) const;
void update_session(service_server* server, byte_buffer* buffer) const;
void delete_session(service_server* server, byte_buffer* buffer) const;
void get_performance(service_server* server, byte_buffer* buffer) const;
void find_sessions(service_server* server, byte_buffer* buffer) const;
};
}