diff --git a/SQCSim-common/define.h b/SQCSim-common/define.h index aea5ea2..3501dd6 100644 --- a/SQCSim-common/define.h +++ b/SQCSim-common/define.h @@ -9,6 +9,9 @@ #define MAX_SELECTION_DISTANCE 5 #define SEED 12345 +#define SRV_PORT 1025 +#define CLI_PORT 1026 + #ifdef _DEBUG #define WORLD_SIZE_X 64 #define WORLD_SIZE_Y 64 diff --git a/SQCSim-common/player.cpp b/SQCSim-common/player.cpp index 080fc2d..b42968a 100644 --- a/SQCSim-common/player.cpp +++ b/SQCSim-common/player.cpp @@ -101,7 +101,15 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime) { bt1 = world->BlockAt(GetPosition().x + input.x, GetPosition().y, GetPosition().z); bt2 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z); bt3 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z); - if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { + if (bt1 == BTYPE_AIR && bt2 != BTYPE_AIR && bt3 != BTYPE_AIR) { + if (input.x > 0) + input.x = m_velocity.x = 0.5f; + else + input.x = m_velocity.x = -0.5f; + m_velocity.y = 0.3; + m_velocity.z *= .5f; + } + else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { input.x = m_velocity.x = 0; m_velocity.z *= .5f; } @@ -109,7 +117,15 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime) { bt1 = world->BlockAt(GetPosition().x, GetPosition().y, GetPosition().z + input.z); bt2 = world->BlockAt(GetPosition().x, GetPosition().y - 0.9f, GetPosition().z + input.z); bt3 = world->BlockAt(GetPosition().x, GetPosition().y - 1.7f, GetPosition().z + input.z); - if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { + if (bt1 == BTYPE_AIR && bt2 != BTYPE_AIR && bt3 != BTYPE_AIR) { + if (input.z > 0) + input.z = m_velocity.z = 0.5f; + else + input.z = m_velocity.z = -0.5f; + m_velocity.y = 0.3; + m_velocity.x *= .5f; + } + else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { input.z = m_velocity.z = 0; m_velocity.x *= .5f; } diff --git a/SQCSim-srv/SQCSim-srv.vcxproj b/SQCSim-srv/SQCSim-srv.vcxproj index ae7b24f..525fc03 100644 --- a/SQCSim-srv/SQCSim-srv.vcxproj +++ b/SQCSim-srv/SQCSim-srv.vcxproj @@ -17,7 +17,6 @@ Release x64 - 17.0 @@ -53,27 +52,24 @@ true Unicode - - + + + + + + + + + + + + + - - - - - - - - - - - - - - Level3 @@ -94,6 +90,7 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + Default Console @@ -130,9 +127,22 @@ true - - + + + + + + + + + + + + + {ee91ab12-4225-4a4d-931d-69d72f6d91fb} + + - + \ No newline at end of file diff --git a/SQCSim-srv/SQCSim-srv.vcxproj.filters b/SQCSim-srv/SQCSim-srv.vcxproj.filters index 1e51e38..67c9660 100644 --- a/SQCSim-srv/SQCSim-srv.vcxproj.filters +++ b/SQCSim-srv/SQCSim-srv.vcxproj.filters @@ -14,4 +14,26 @@ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + Fichiers sources + + + Fichiers sources + + + Fichiers sources + + + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + \ No newline at end of file diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp new file mode 100644 index 0000000..964cc07 --- /dev/null +++ b/SQCSim-srv/connection.cpp @@ -0,0 +1,31 @@ +#include "connection.h" + +Connection::Connection(in_addr addr, + std::string name, + UINT64 hash, + UINT64 self_hash, + UINT64 team_hash): + m_addr(addr), + m_hash(hash), + m_shash(self_hash), + m_thash(team_hash), + m_name(name) { + +} + +Connection::~Connection() { + +} + +in_addr Connection::GetAddr() const { return m_addr; } + +UINT64 Connection::GetHash(bool self) const { return self? m_shash: m_hash; } + +UINT64 Connection::GetTeamHash() const { return m_thash; } + +std::string Connection::GetName() const { return m_name; } + +void Connection::Clean(std::chrono::system_clock::time_point time) { + while (m_input_manifest.front().timestamp < time || !m_input_manifest.empty()) + m_input_manifest.pop_front(); +} diff --git a/SQCSim-srv/connection.h b/SQCSim-srv/connection.h new file mode 100644 index 0000000..198a39f --- /dev/null +++ b/SQCSim-srv/connection.h @@ -0,0 +1,42 @@ +#ifndef _CONNECTION_H__ +#define _CONNECTION_H__ +#include +#include +#include "../SQCSim-common/player.h" +#include "../SQCSim-common/vector3.h" +#include "define.h" + +struct Input { + std::chrono::system_clock::time_point timestamp; + UINT8 keys; // 0bFBLRJS__ + Vector3f direction; +}; + +class Connection { +public: + Connection( + in_addr addr, + std::string name, + UINT64 hash, + UINT64 self_hash, + UINT64 team_hash); + ~Connection(); + + Player* player = nullptr; + + in_addr GetAddr() const; + UINT64 GetHash(bool self = true) const; + UINT64 GetTeamHash() const; + std::string GetName() const; + + void Clean(std::chrono::system_clock::time_point time); +private: + std::deque m_input_manifest; + in_addr m_addr; + UINT64 m_hash, + m_shash, + m_thash; + std::string m_name; + +}; +#endif \ No newline at end of file diff --git a/SQCSim-srv/define.h b/SQCSim-srv/define.h new file mode 100644 index 0000000..3a37bd4 --- /dev/null +++ b/SQCSim-srv/define.h @@ -0,0 +1,38 @@ +#ifndef _SRV_DEFINE_H__ +#define _SRV_DEFINE_H__ + +#include "../SQCSim-common/define.h" +#include +#include +#include +#include + +enum LogDest { CONSOLE, LOGFILE, LOG_LAST }; + +#ifdef _WIN32 + +#pragma comment(lib,"wsock32.lib") // Pour pouvoir faire fonctionner le linker sans le vcxproject + +#include +#include +#include + +#define popen _popen +#define pclose _pclose + +#else // Pas _WIN32 + +#include +#include +#include +#include +#include +#include + +#define SOCKET int +#define INVALID_SOCKET -1 +#define closesocket close + +#endif // _WIN32 + +#endif \ No newline at end of file diff --git a/SQCSim-srv/main.cpp b/SQCSim-srv/main.cpp new file mode 100644 index 0000000..d67d836 --- /dev/null +++ b/SQCSim-srv/main.cpp @@ -0,0 +1,10 @@ +#include "define.h" +#include "server.h" + +int main() { + Server* server = new Server(); + if (server->Init() == 0) + if (server->Ready() == 0) + server->Run(); + delete server; +} \ No newline at end of file diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp new file mode 100644 index 0000000..afe262d --- /dev/null +++ b/SQCSim-srv/server.cpp @@ -0,0 +1,224 @@ +#include "server.h" + +Server::Server(LogDest log) : m_log(log) { + if (log == LogDest::LOGFILE) { + m_logfile = std::ofstream("server.log", std::ofstream::out); + if (!m_logfile.is_open()) { + m_log = LogDest::CONSOLE; // Fallback console. + Log("Ouverture fichier log: repli vers console.", true, false); + } + } +} + +Server::~Server() { + if (m_logfile.is_open()) + m_logfile.close(); + if (m_sock_udp) + closesocket(m_sock_udp); + if (m_sock_tcp) + closesocket(m_sock_tcp); +#ifdef _WIN32 + WSACleanup(); +#endif +} + +int Server::Init() { + Log("Initialisation du serveur...", false, false); + +#ifdef _WIN32 + if (WSAStartup(MAKEWORD(2, 2), &m_wsaData) != 0) { /* Initialisation de l'environnement reseau (Windows only) */ + Log("Initialisation WinSock.", true, true); + return 1; + } +#endif + + m_sock_udp = socket(AF_INET, SOCK_DGRAM, 0); + if (m_sock_udp == INVALID_SOCKET) { /* Creation du socket UDP */ + Log("Creation Socket UDP.", true, true); + return 2; + } + + m_sock_tcp = socket(AF_INET, SOCK_STREAM, 0); + if (m_sock_tcp == INVALID_SOCKET) { /* Creation du socket TCP */ + Log("Creation Socket TCP.", true, true); + return 3; + } + + /* Creation structure donnes descripteur du socket serveur */ + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(SRV_PORT); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(m_sock_udp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket UDP au port */ + Log("Association Socket UDP.", true, true); + return 4; + } + + if (bind(m_sock_tcp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket TCP au port */ + Log("Association Socket TCP.", true, true); + return 5; + } + + return 0; +} + +int Server::Ready() { + Log("Prêt à démarrer...", false, false); + return 0; +} + +void Server::Run() { + Log("Partie en cours...", false, false); +} + +inline std::string Server::Timestamp() { + time_t rawtime; + struct tm timeinfo; + char buffer[80]; + + time(&rawtime); + +#ifdef _WIN32 + localtime_s(&timeinfo, &rawtime); +#else + localtime_r(&rawtime, &timeinfo); +#endif + + strftime(buffer, sizeof(buffer), "%d-%m-%Y %H:%M:%S", &timeinfo); + std::string str(buffer); + + return "[" + str + "] "; +} + +void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) { + switch (m_log) { + case LogDest::LOGFILE: + m_logfile << Timestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; + break; + case LogDest::CONSOLE: + default: + std::cout << Timestamp() << (is_fatal? "FATAL ": "") << (is_error ? "ERROR ": "") << str << std::endl; + break; + } + + if (is_fatal) { + if (m_sock_udp) + closesocket(m_sock_udp); + if (m_sock_tcp) + closesocket(m_sock_tcp); +#ifdef _WIN32 + WSACleanup(); +#endif + } +} + +///* Recevoir paquet */ +//while (true) { +// char buffer[2048]; +// sockaddr_in client; +// +//#ifdef _WIN32 // Mais pourquoi? +// int clen = sizeof(client); +//#else +// unsigned int clen = sizeof(client); +//#endif +// +// int count = recvfrom(socket_udp, buffer, sizeof(buffer) - 1, 0, (sockaddr*)&client, &clen); +// +// if (count < 0) { +// Log("Erreur de reception de paquet.", socket_udp); +// return 4; +// } +// +// buffer[count] = '\0'; +// +// /* Gérer le paquet reçu */ +// std::string commande(buffer); +// +// if (commande.find("echo ") == 0) { /* ECHO */ +// std::string::size_type pos = commande.find(' '); +// std::string parametres = commande.substr(pos + 1); +// +// sendto(socket_udp, parametres.c_str(), parametres.length(), 0, (const sockaddr*)&client, sizeof(client)); +// } +// else if (commande.find("date ") == 0) { /* DATE */ +// time_t rawtime; +// struct tm* timeinfo = new tm(); +// char tbuffer[80]; +// +// time(&rawtime); +// +//#ifdef _WIN32 +// localtime_s(timeinfo, &rawtime); +//#else +// localtime_r(&rawtime, timeinfo); +//#endif +// +// strftime(tbuffer, 80, "%a %b %e %T %G", timeinfo); +// +// sendto(socket_udp, tbuffer, sizeof(tbuffer), 0, (const sockaddr*)&client, sizeof(client)); +// delete timeinfo; +// } +// else if (commande.find("ping ") == 0) { /* PING */ +// sendto(socket_udp, "pong", sizeof("pong"), 0, (const sockaddr*)&client, sizeof(client)); +// } +// else if (commande.find("usager ") == 0) { /* USAGER */ +// std::string user; +// +//#ifdef _WIN32 +// wchar_t userbuf[30]; +// DWORD usersize = 30; +// +// GetUserNameW(userbuf, &usersize); +// +// std::wstring wuser = userbuf; +// user = std::string(wuser.begin(), wuser.end()); +//#else +// char ptr[30]; +// getlogin_r(ptr, sizeof(ptr) - 1); +// user = std::string(ptr); +//#endif +// +// sendto(socket_udp, user.c_str(), user.length(), 0, (const sockaddr*)&client, sizeof(client)); +// } +// else if (commande.find("exec ") == 0) { /* EXEC */ +// std::string::size_type pos = commande.find(' '); +// std::string parametres = commande.substr(pos + 1); +// +// FILE* pipe = nullptr; +// char buffer[301]; // 300 caractères + '\0' +// std::string reponse; +// +// pipe = popen(parametres.c_str(), "r"); +// +// if (!pipe) +// reponse = "Erreur de commande!"; +// else while (!feof(pipe)) { +// if (fgets(buffer, sizeof(buffer) - 1, pipe)) +// reponse += buffer; +// } +// +// if (pipe) +// pclose(pipe); +// +// if (reponse.length() > 300) +// reponse = reponse.substr(0, 300); +// else if (reponse.length() < 1) +// reponse = "OK!"; +// +// sendto(socket_udp, reponse.c_str(), reponse.length(), 0, (const sockaddr*)&client, sizeof(client)); +// } +// else if (commande.find("bye ") == 0) { /* BYE */ +// Log("", 0); // Message d'erreur pas de message d'erreur! +// return 0; +// } +// else sendto(socket_udp, "huh?", sizeof("huh?"), 0, (const sockaddr*)&client, sizeof(client)); /* DEFAULT */ +//} +// +///* Ce bout de code ne devrait theoriquement jamais etre atteint, mais au cas. */ +//Log("", 0); +//return 0; +//return false; +//} +// diff --git a/SQCSim-srv/server.h b/SQCSim-srv/server.h new file mode 100644 index 0000000..246ad16 --- /dev/null +++ b/SQCSim-srv/server.h @@ -0,0 +1,34 @@ +#ifndef _SERVER_H__ +#define _SERVER_H__ + +#include +#include +#include +#include "../SQCSim-common/world.h" +#include "define.h" + +class Server { +public: + Server(LogDest log = LogDest::CONSOLE); + ~Server(); + + int Init(); + int Ready(); + void Run(); + +private: +#ifdef _WIN32 + WSADATA m_wsaData; +#endif + SOCKET m_sock_udp = 0, + m_sock_tcp = 0; + LogDest m_log; + + std::ofstream m_logfile; + World* m_world = nullptr; + std::vector m_players; + + std::string Timestamp(); + void Log(std::string str, bool is_error, bool is_fatal); +}; +#endif diff --git a/SQCSim2021/define.h b/SQCSim2021/define.h index 68e94b1..660b62e 100644 --- a/SQCSim2021/define.h +++ b/SQCSim2021/define.h @@ -16,29 +16,10 @@ #define CHUNK_SIZE_Y 64 #define CHUNK_SIZE_Z 4 #define MAX_SELECTION_DISTANCE 5 -#define SEED 12345 - -#ifdef _DEBUG -#define WORLD_SIZE_X 64 -#define WORLD_SIZE_Y 64 - -#define FRAMES_RENDER_CHUNKS 4 -#define FRAMES_UPDATE_CHUNKS 4 -#define FRAMES_DELETE_CHUNKS 4 - -#define THREADS_GENERATE_CHUNKS 1 -#define THREADS_UPDATE_CHUNKS 1 -#define THREADS_DELETE_CHUNKS 1 - -#define VIEW_DISTANCE 256 -#define TEXTURE_SIZE 128 -#define MAX_BULLETS 64 - #define BASE_WIDTH 640 #define BASE_HEIGHT 480 -#endif +#define SEED 12345 -#ifdef NDEBUG #define WORLD_SIZE_X 64 #define WORLD_SIZE_Y 64 @@ -46,14 +27,13 @@ #define FRAMES_UPDATE_CHUNKS 1 #define FRAMES_DELETE_CHUNKS 1 -#define THREADS_GENERATE_CHUNKS 6 +#define THREADS_GENERATE_CHUNKS 8 #define THREADS_UPDATE_CHUNKS 3 -#define THREADS_DELETE_CHUNKS 2 +#define THREADS_DELETE_CHUNKS 3 #define VIEW_DISTANCE 512 #define TEXTURE_SIZE 512 #define MAX_BULLETS 512 -#endif typedef uint8_t BlockType;