DOMO ARIGATO, MISUTA ROBOTO :trollface:
This commit is contained in:
parent
d49d5cdebc
commit
253e49b1cc
@ -1024,6 +1024,82 @@ std::vector<char*> netprot::recvPacks(SOCKET sock, Buffer* buf, Buffer* outbuf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<char*> netprot::recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* outbuf) {
|
||||||
|
std::vector<char*> lsPck;
|
||||||
|
int len = buf->tmp ? buf->tmp - buf->ptr : 0,
|
||||||
|
end = 0;
|
||||||
|
char* cursor = buf->tmp ? buf->tmp : nullptr,
|
||||||
|
* next = buf->tmp ? buf->tmp + 1 : buf->ptr,
|
||||||
|
* last = buf->tmp ? buf->tmp : buf->ptr;
|
||||||
|
bool ended = true;
|
||||||
|
struct pollfd fds[1];
|
||||||
|
sockaddr_in sockad = from;
|
||||||
|
addrlen_t socklen = sizeof(sockad);
|
||||||
|
|
||||||
|
fds[0].fd = sock;
|
||||||
|
fds[0].events = POLLIN;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (!poll(fds, 1, 0)) {
|
||||||
|
if (ended)
|
||||||
|
buf->tmp = nullptr;
|
||||||
|
return lsPck;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bytes = recvfrom(sock, &buf->ptr[len], buf->len - len, 0, (sockaddr*)&sockad, &socklen);
|
||||||
|
if (bytes <= 0) { // si recv() retourne -1 ou 0; ça veut dire qu'il y a plus rien a lire qui n'a pas déjà été traité.
|
||||||
|
if (ended)
|
||||||
|
buf->tmp = nullptr;
|
||||||
|
return lsPck;
|
||||||
|
}
|
||||||
|
len += bytes;
|
||||||
|
end = len;
|
||||||
|
|
||||||
|
ended = false;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
int cmp = 0;
|
||||||
|
|
||||||
|
if (cursor)
|
||||||
|
end -= (cursor - buf->ptr);
|
||||||
|
|
||||||
|
if (end < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
cursor = (char*)memchr(next, '\r', end);
|
||||||
|
|
||||||
|
if (cursor) {
|
||||||
|
next = cursor;
|
||||||
|
cursor--;
|
||||||
|
|
||||||
|
cmp = memcmp(cursor, Footer, sizeof(uint32_t));
|
||||||
|
if (cmp == 0) {
|
||||||
|
if (!outbuf) {
|
||||||
|
lsPck.push_back(last);
|
||||||
|
cursor += sizeof(uint32_t);
|
||||||
|
last = cursor;
|
||||||
|
next = cursor + 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
memcpy(&outbuf->ptr[cursor - last], last, cursor - last);
|
||||||
|
lsPck.push_back(&outbuf->ptr[cursor - last]);
|
||||||
|
cursor += sizeof(uint32_t);
|
||||||
|
last = cursor;
|
||||||
|
next = cursor + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!outbuf)
|
||||||
|
buf->tmp = last;
|
||||||
|
cursor = &buf->ptr[len];
|
||||||
|
next = cursor + 1;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
void netprot::sendPack<netprot::Packet>(SOCKET sock, Packet* pack, Buffer* buf) {
|
void netprot::sendPack<netprot::Packet>(SOCKET sock, Packet* pack, Buffer* buf) {
|
||||||
switch (pack->type) {
|
switch (pack->type) {
|
||||||
|
@ -173,6 +173,7 @@ namespace netprot {
|
|||||||
template <class T> void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad);
|
template <class T> void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad);
|
||||||
|
|
||||||
std::vector<char*> recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr);
|
std::vector<char*> recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr);
|
||||||
|
std::vector<char*> recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* oufbuf = nullptr);
|
||||||
|
|
||||||
/* Templates */
|
/* Templates */
|
||||||
|
|
||||||
|
@ -192,6 +192,8 @@ void Player::ApplyTransformation(Transformation& transformation, bool rel) const
|
|||||||
if (rel) transformation.ApplyTranslation(-GetPOV());
|
if (rel) transformation.ApplyTranslation(-GetPOV());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::SetDirection(Vector3f dir) { m_direction = dir; }
|
||||||
|
|
||||||
Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); }
|
Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); }
|
||||||
|
|
||||||
Vector3f Player::GetVelocity() const { return m_velocity; }
|
Vector3f Player::GetVelocity() const { return m_velocity; }
|
||||||
|
@ -20,6 +20,7 @@ public:
|
|||||||
Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime);
|
Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime);
|
||||||
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
||||||
|
|
||||||
|
void SetDirection(Vector3f dir);
|
||||||
Vector3f GetPosition() const;
|
Vector3f GetPosition() const;
|
||||||
Vector3f GetDirection() const;
|
Vector3f GetDirection() const;
|
||||||
Vector3f GetVelocity() const;
|
Vector3f GetVelocity() const;
|
||||||
|
@ -47,6 +47,50 @@ PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; }
|
|||||||
|
|
||||||
sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; }
|
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) {
|
void Connection::CleanInputManifest(Timestamp time) {
|
||||||
auto wat = m_input_manifest.find(time);
|
auto wat = m_input_manifest.find(time);
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "../SQCSim-common/player.h"
|
#include "../SQCSim-common/player.h"
|
||||||
#include "../SQCSim-common/vector3.h"
|
#include "../SQCSim-common/vector3.h"
|
||||||
#include "../SQCSim-common/netprotocol.h"
|
#include "../SQCSim-common/netprotocol.h"
|
||||||
|
#include "../SQCSim-common/world.h"
|
||||||
#include "define.h"
|
#include "define.h"
|
||||||
|
|
||||||
using namespace netprot;
|
using namespace netprot;
|
||||||
@ -32,6 +33,12 @@ public:
|
|||||||
PlayerInfo* getInfo() const;
|
PlayerInfo* getInfo() const;
|
||||||
sockaddr_in* getAddr() const;
|
sockaddr_in* getAddr() const;
|
||||||
|
|
||||||
|
void getPacks();
|
||||||
|
|
||||||
|
std::thread Start();
|
||||||
|
|
||||||
|
void Run(World* world);
|
||||||
|
|
||||||
void CleanInputManifest(Timestamp time);
|
void CleanInputManifest(Timestamp time);
|
||||||
private:
|
private:
|
||||||
std::unordered_map<Timestamp, Input> m_input_manifest;
|
std::unordered_map<Timestamp, Input> m_input_manifest;
|
||||||
@ -43,5 +50,6 @@ private:
|
|||||||
LoginInfo m_loginfo;
|
LoginInfo m_loginfo;
|
||||||
PlayerInfo m_playinfo;
|
PlayerInfo m_playinfo;
|
||||||
|
|
||||||
|
Buffer* m_buf;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -175,17 +175,24 @@ int Server::Ready() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::Run() {
|
void Server::Run() {
|
||||||
|
bool endgame = false;
|
||||||
Input in;
|
Input in;
|
||||||
sockaddr_in sockad;
|
sockaddr_in sockad;
|
||||||
addrlen_t socklen = sizeof(sockad);
|
addrlen_t socklen = sizeof(sockad);
|
||||||
|
|
||||||
Log("Debut de la partie...", false, false);
|
Log("Debut de la partie...", false, false);
|
||||||
|
|
||||||
|
int players = m_players.size();
|
||||||
|
std::thread* getPacksThreads = new std::thread[players];
|
||||||
|
|
||||||
m_world = std::make_unique<World>();
|
m_world = std::make_unique<World>();
|
||||||
m_world->SetSeed(m_game.seed);
|
m_world->SetSeed(m_game.seed);
|
||||||
m_world->GetChunks().Reset(nullptr);
|
m_world->GetChunks().Reset(nullptr);
|
||||||
m_world->BuildWorld();
|
m_world->BuildWorld();
|
||||||
|
|
||||||
|
for (int x = 0; x < players; ++x)
|
||||||
|
getPacksThreads[x] = m_players[x].get()->start();
|
||||||
|
|
||||||
for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync.
|
for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync.
|
||||||
conn->player = std::make_unique<Player>(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f));
|
conn->player = std::make_unique<Player>(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f));
|
||||||
Sync sync;
|
Sync sync;
|
||||||
@ -198,32 +205,39 @@ void Server::Run() {
|
|||||||
sendPack<Sync>(conn->getSock(), &sync, &m_buf);
|
sendPack<Sync>(conn->getSock(), &sync, &m_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (!endgame) {
|
||||||
if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) {
|
for (auto& [key, conn] : m_players) {
|
||||||
Packet pck = getPack(&m_buf);
|
conn->player->GetInput
|
||||||
switch (pck.type) {
|
|
||||||
using enum netprot::PACKET_TYPE;
|
|
||||||
case ERR: std::puts("ERROR!"); break;
|
|
||||||
case INPUT: std::puts("INPUT!"); break;
|
|
||||||
case OUTPUT: std::puts("OUTPUT!"); break;
|
|
||||||
case SYNC: std::puts("SYNC!"); break;
|
|
||||||
case TEAMINF: std::puts("TEAMINF!"); break;
|
|
||||||
case SELFINF: std::puts("SELFINF!"); break;
|
|
||||||
case PLAYINF: std::puts("PLAYINF!"); break;
|
|
||||||
case LOGINF: std::puts("LOGINF!"); break;
|
|
||||||
case CHUNKMOD: std::puts("CHUNKMOD!"); break;
|
|
||||||
case PLAYERMOD: std::puts("PLAYERMOD!"); break;
|
|
||||||
case PICKUPMOD: std::puts("PICKUPMOD!"); break;
|
|
||||||
case GAMEINFO: std::puts("GAMEINFO!"); break;
|
|
||||||
case ENDINFO: std::puts("ENDINFO!"); break;
|
|
||||||
case CHAT: std::puts("CHAT!"); break;
|
|
||||||
case ERRLOG: std::puts("ERRLOG!"); break;
|
|
||||||
case LAST_PACK: [[falltrough]];
|
|
||||||
default: std::puts("wtf?!"); break;
|
|
||||||
}
|
|
||||||
netprot::emptyPack(pck);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//while (true) {
|
||||||
|
// if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) {
|
||||||
|
// Packet pck = getPack(&m_buf);
|
||||||
|
// switch (pck.type) {
|
||||||
|
// using enum netprot::PACKET_TYPE;
|
||||||
|
// case ERR: std::puts("ERROR!"); break;
|
||||||
|
// case INPUT: std::puts("INPUT!"); break;
|
||||||
|
// case OUTPUT: std::puts("OUTPUT!"); break;
|
||||||
|
// case SYNC: std::puts("SYNC!"); break;
|
||||||
|
// case TEAMINF: std::puts("TEAMINF!"); break;
|
||||||
|
// case SELFINF: std::puts("SELFINF!"); break;
|
||||||
|
// case PLAYINF: std::puts("PLAYINF!"); break;
|
||||||
|
// case LOGINF: std::puts("LOGINF!"); break;
|
||||||
|
// case CHUNKMOD: std::puts("CHUNKMOD!"); break;
|
||||||
|
// case PLAYERMOD: std::puts("PLAYERMOD!"); break;
|
||||||
|
// case PICKUPMOD: std::puts("PICKUPMOD!"); break;
|
||||||
|
// case GAMEINFO: std::puts("GAMEINFO!"); break;
|
||||||
|
// case ENDINFO: std::puts("ENDINFO!"); break;
|
||||||
|
// case CHAT: std::puts("CHAT!"); break;
|
||||||
|
// case ERRLOG: std::puts("ERRLOG!"); break;
|
||||||
|
// case LAST_PACK: [[falltrough]];
|
||||||
|
// default: std::puts("wtf?!"); break;
|
||||||
|
// }
|
||||||
|
// netprot::emptyPack(pck);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string Server::LogTimestamp() {
|
inline std::string Server::LogTimestamp() {
|
||||||
|
@ -305,6 +305,10 @@ void Engine::Init() {
|
|||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glBlendEquation(GL_FUNC_SUBTRACT);
|
glBlendEquation(GL_FUNC_SUBTRACT);
|
||||||
|
|
||||||
|
if (m_istarted)
|
||||||
|
return;
|
||||||
|
else m_istarted = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Objet de skybox avec sa propre texture et son propre shader!
|
// Objet de skybox avec sa propre texture et son propre shader!
|
||||||
m_skybox.Init(0.2f);
|
m_skybox.Init(0.2f);
|
||||||
|
@ -9,7 +9,7 @@ Mesh::~Mesh() {
|
|||||||
void Mesh::FlushMeshToVBO() {
|
void Mesh::FlushMeshToVBO() {
|
||||||
m_vertexBuffer.SetMeshData(m_vd, m_vcount);
|
m_vertexBuffer.SetMeshData(m_vd, m_vcount);
|
||||||
m_vcount = 0;
|
m_vcount = 0;
|
||||||
//delete[] m_vd;
|
delete[] m_vd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::FlushVBO() {
|
void Mesh::FlushVBO() {
|
||||||
|
@ -52,6 +52,8 @@ protected:
|
|||||||
void HideCursor();
|
void HideCursor();
|
||||||
void ShowCrossCursor() const;
|
void ShowCrossCursor() const;
|
||||||
|
|
||||||
|
bool m_istarted = false;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitWindow(int width, int height);
|
void InitWindow(int width, int height);
|
||||||
MOUSE_BUTTON ConvertMouseButton(sf::Mouse::Button button) const;
|
MOUSE_BUTTON ConvertMouseButton(sf::Mouse::Button button) const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user