Files
SQCSimulator2023/SQCSim-srv/connection.cpp
2023-11-06 16:43:52 -05:00

100 lines
2.5 KiB
C++

#include "connection.h"
Connection::Connection(SOCKET sock,
sockaddr_in sockaddr,
LoginInfo log,
PlayerInfo play):
m_sock(sock),
m_addr(sockaddr),
m_loginfo(log),
m_playinfo(play) {
}
Connection::~Connection() { closesocket(m_sock); }
uint64_t Connection::GetHash(bool self) const { return self? m_loginfo.sid: m_playinfo.id; }
uint64_t Connection::GetTeamHash() const { return m_loginfo.tid; }
std::string Connection::GetName() const { return m_loginfo.name; }
void Connection::AddInput(Input in) { m_input_manifest.insert({ in.timestamp, in }); }
Output* Connection::getOutput(Timestamp time) {
auto out = m_output_manifest.find(time);
if (out != m_output_manifest.end())
return &out->second;
return nullptr;
}
Sync Connection::getSync(Timestamp time) {
Sync sync;
auto out = m_output_manifest.find(time);
if (out != m_output_manifest.end()) {
sync.timestamp = out->second.timestamp;
sync.position = out->second.position;
sync.sid = m_loginfo.sid;
}
return sync;
}
SOCKET Connection::getSock() const { return m_sock; }
PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; }
sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; }
void Connection::getPacks() {
std::vector<char*> lsPck;
Input in;
while (true) {
lsPck = recvPacksFrom(m_sock, m_buf, m_addr);
for (auto& pck : lsPck) {
uint32_t bsize = m_buf->len - (pck - m_buf->ptr);
switch (netprot::getType(pck, 1)) {
using enum netprot::PACKET_TYPE;
case INPUT:
if (Deserialize(&in, pck, &bsize))
m_input_manifest.insert({ in.timestamp, in });
break;
default: break;
}
}
lsPck.clear();
}
}
std::thread Connection::Start(){ return std::thread(getPacks); }
void Connection::Run(World* world) {
Input in, last;
Output out;
float el;
if (m_input_manifest.size() < 2)
return;
in = m_input_manifest.at(m_input_manifest.size());
last = m_input_manifest.at(m_input_manifest.size() - 1);
el = (float)(in.timestamp - last.timestamp) / 1000.;
player.get()->SetDirection(in.direction);
player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, in.keys.backward, in.keys.left, in.keys.right, in.keys.jump, false, el), world, el);
out.position = player.get()->GetPosition();
out.direction = in.direction;
out.timestamp = in.timestamp;
}
void Connection::CleanInputManifest(Timestamp time) {
auto wat = m_input_manifest.find(time);
while (wat != m_input_manifest.begin())
m_input_manifest.erase(wat--);
}