Compare commits

...

95 Commits

Author SHA1 Message Date
Frederic Leger
3e89035de5 Merge branch 'master' into SQC-54_MenuBackGround 2023-10-30 16:21:16 -04:00
Louis-Charles Gaumond
0c8772edbf Changer l'image background du menu 2023-10-30 15:52:15 -04:00
MarcEricMartel
851d5f0c0b Merge pull request #20 from CegepSTH/SQC-18_Mecanique_de_combat
Sqc 18 mecanique de combat
2023-10-30 15:44:41 -04:00
MarcEricMartel
2a4a5e13cc Correction pour pr20 2023-10-30 15:42:02 -04:00
Jonathan Trottier
9b0c4dc594 modif des degats 2023-10-30 14:58:17 -04:00
Jonathan Trottier
602bb84428 fonctionnel 2023-10-30 14:56:04 -04:00
Jonathan Trottier
4df7cfbd5d Merge branch 'master' into SQC-18_Mecanique_de_combat 2023-10-30 14:37:58 -04:00
Jonathan Trottier
6e75bec25c degats dans bullet 2023-10-30 14:36:44 -04:00
Frederic Leger
bbfc98ff12 Merge pull request #19 from CegepSTH/SQC-15_paquets
Sqc 15 paquets
2023-10-30 14:08:48 -04:00
MarcEricMartel
3249d68e60 Correction pour l'entrée de données 2023-10-30 13:24:46 -04:00
Jonathan Trottier
ada9330588 Merge branch 'master' into SQC-18_Mecanique_de_combat 2023-10-30 12:38:42 -04:00
MarcEricMartel
3da8be6d52 Gestion pour que ça marche partout 2023-10-30 11:11:13 -04:00
MarcEricMartel
a95dd02896 Cleanup ioctl 2023-10-30 11:07:26 -04:00
MarcEricMartel
6ce7e62e05 pour être sûr 2023-10-29 16:45:57 -04:00
MarcEricMartel
e2dbf52b17 a tester sur Linux (rien change sur windows) 2023-10-29 16:43:09 -04:00
MarcEricMartel
53ed811936 Va falloir checker si Linux va être content ou pas. 2023-10-29 15:24:03 -04:00
MarcEricMartel
15b4dfefc0 That'll be good 'nough for now. 2023-10-29 15:20:19 -04:00
MarcEricMartel
b50a2f44e2 We are the wooooorld, we are the childreeen 2023-10-29 15:07:01 -04:00
MarcEricMartel
4f64be7e0a Feeeeeed the woooooooooorld 2023-10-29 14:59:29 -04:00
MarcEricMartel
b54f8c31e5 windoes 2023-10-29 14:54:36 -04:00
MarcEricMartel
0b07d46dba Merge branch 'master' into SQC-15_paquets 2023-10-28 14:44:43 -04:00
MarcEricMartel
c33e6f865c I believe in a thing called SOCK_NONBLOCK 2023-10-28 14:41:23 -04:00
Marc-Eric Martel
03be36ecda J'ai pu de messages de warning quand je build le client 2023-10-28 14:16:39 -04:00
Marc-Eric Martel
aab3301234 Client Linux qui re-marche 2023-10-28 14:11:01 -04:00
MarcEricMartel
d0c39e49b0 Update netprotocol.cpp 2023-10-28 12:59:19 -04:00
MarcEricMartel
10fcfed05a but I just had to laugh 2023-10-28 12:13:45 -04:00
MarcEricMartel
a69e716105 And though the news was rather sad 2023-10-28 12:06:01 -04:00
MarcEricMartel
3f8d860b93 About a lucky man who made the grade 2023-10-28 12:03:22 -04:00
MarcEricMartel
42d612ad33 I read the news today, oh boy. 2023-10-28 11:18:01 -04:00
MarcEricMartel
c23d1b2120 Surprise. 2023-10-27 16:20:05 -04:00
MarcEricMartel
76a7d0218d Who knows?! 2023-10-27 15:47:34 -04:00
MarcEricMartel
e2e66f3b6c à tester 2023-10-27 15:44:33 -04:00
MarcEricMartel
f0bf7d94ce pas trop loin 2023-10-27 15:19:44 -04:00
MarcEricMartel
49c9576757 Ser/deser Sync 2023-10-27 15:07:38 -04:00
Claudel-D-Roy
e2fa4fea7c Merge branch 'SQC_17_HUD' 2023-10-27 14:53:45 -04:00
MarcEricMartel
61629b3c8e RemotePlayer 2023-10-27 14:37:53 -04:00
MarcEricMartel
8970bc33a1 Répârâge 2023-10-27 14:08:06 -04:00
MarcEricMartel
c1faaca417 Merge branch 'sqc-14_classe_remoteplayer' into SQC-15_paquets 2023-10-27 13:59:26 -04:00
Claudel-D-Roy
889884490b push avant merge 2023-10-27 13:56:48 -04:00
MarcEricMartel
bd817f9f7d Merge branch 'sqc-14_classe_remoteplayer' of https://github.com/CegepSTH/SQCSim2023 into sqc-14_classe_remoteplayer 2023-10-27 13:55:25 -04:00
MarcEricMartel
57d60e02a7 getId() 2023-10-27 13:55:15 -04:00
Claudel-D-Roy
ae201846b1 push de correction 2023-10-27 13:54:37 -04:00
MarcEricMartel
1c7523558b Changé de port 2023-10-27 13:39:18 -04:00
MarcEricMartel
f7b7a7f14d Changements C++20 et retour audio 2023-10-27 13:27:00 -04:00
MarcEricMartel
102153a093 Merge pull request #18 from CegepSTH/L-CSplash
Créé branche_L_C
2023-10-27 12:38:40 -04:00
Marc-Eric Martel
da594fa3a2 correction client 2023-10-27 12:23:45 -04:00
Marc-Eric Martel
6a8a505167 Yeehaw. 2023-10-27 12:02:29 -04:00
Marc-Eric Martel
0dded0bc9b try câtch 2023-10-27 10:40:53 -04:00
Marc-Eric Martel
9ef44a3993 Ev'ryday I'm bufferin'. 2023-10-27 09:51:40 -04:00
Marc-Eric Martel
0bc7f29492 Gros refactoring sale. 2023-10-27 09:28:34 -04:00
Marc-Eric Martel
60cc69a407 Erratum VI: The Final Chapter 2023-10-26 17:57:42 -04:00
Marc-Eric Martel
05f9658f55 erratum V? 2023-10-26 17:18:30 -04:00
Marc-Eric Martel
2f2b49054f erratum IV 2023-10-26 11:17:13 -04:00
Marc-Eric Martel
397cf7f00d erratum III 2023-10-26 10:55:36 -04:00
Marc-Eric Martel
8e95899192 erratum II 2023-10-26 10:47:17 -04:00
Marc-Eric Martel
8870550512 erratum 2023-10-26 10:42:24 -04:00
Marc-Eric Martel
f5a1906877 Cleanup de srv 2023-10-26 10:39:08 -04:00
MarcEricMartel
9b4defba2a à tester 2023-10-25 12:16:14 -04:00
MarcEricMartel
dd2396e5e4 ajout LoginInfo dans le parseur de paquet. 2023-10-25 10:00:54 -04:00
MarcEricMartel
4964bc5394 ajouts dans netprot 2023-10-24 10:43:30 -04:00
MarcEricMartel
cf6e58cd95 erratas dans la sérialisation 2023-10-24 09:17:21 -04:00
MarcEricMartel
ffeb95d953 direction fonctionnelle! 2023-10-24 07:32:16 -04:00
MarcEricMartel
2c3abff96f et c'est un début! 2023-10-23 17:49:40 -04:00
Claudel-D-Roy
5e29c9be54 push menu image 2023-10-23 17:11:13 -04:00
Louis-Charles Gaumond
f8680a318a Changement dans le splachscreen 2023-10-23 16:57:19 -04:00
MarcEricMartel
fc4aa20005 Update server.cpp 2023-10-23 16:54:09 -04:00
MarcEricMartel
ecfe5b893b connection? 2023-10-23 16:44:34 -04:00
MarcEricMartel
eea6a30aa5 aaaaaaa 2023-10-23 16:23:57 -04:00
MarcEricMartel
9f615db929 erratum 2023-10-23 16:23:27 -04:00
MarcEricMartel
498fb7baf7 lol 2023-10-23 16:21:15 -04:00
MarcEricMartel
49240635b6 sendpack qui fonctionne avec le client 2023-10-23 16:20:52 -04:00
Louis-Charles Gaumond
f4d4f1eca0 Créé branche 2023-10-23 16:10:21 -04:00
Jonathan Trottier
b943a268ae barre de vie 2023-10-23 15:43:55 -04:00
MarcEricMartel
590220bc92 ajout d'adresse de serveur 2023-10-23 15:41:07 -04:00
Claudel-D-Roy
67a49a4cad push de remote player 2023-10-23 15:35:31 -04:00
MarcEricMartel
0e7b8973e7 setup louche en console 2023-10-18 09:59:34 -04:00
MarcEricMartel
2cb7d4c776 Début 2023-10-18 09:33:56 -04:00
MarcEricMartel
793da52871 Merge pull request #14 from CegepSTH/sqc-20_audiobullet
whoooosh!
2023-10-16 17:44:56 -04:00
MarcEricMartel
18a5d98c57 Merge branch 'master' into sqc-20_audiobullet 2023-10-16 17:43:32 -04:00
MarcEricMartel
81240c6f70 Merge pull request #11 from CegepSTH/linux
Serveur Linux
2023-10-16 17:38:59 -04:00
MarcEricMartel
f1ddd67655 Merge pull request #16 from CegepSTH/SQC-09
Sqc 09
2023-10-16 17:38:40 -04:00
MarcEricMartel
a054a7bff1 On l'a eu! 2023-10-16 17:36:04 -04:00
MarcEricMartel
b712c950c6 Merge branch 'master' into SQC-09 2023-10-16 16:35:26 -04:00
MarcEricMartel
9cbf20ba21 whoooosh! 2023-10-16 12:02:37 -04:00
Rynort
3f774d7c2e Réparation de la vitesse de la souris 2023-10-16 03:06:00 -04:00
Claudel-D-Roy
d7e55c8446 Début de la classe remoteplayer.cpp, à vérifier 2023-10-15 16:23:43 -04:00
MarcEricMartel
f2095f6e5b Merge branch 'linux' of https://github.com/CegepSTH/SQCSim2023 into linux 2023-10-07 11:43:55 -04:00
Marc-Eric Martel
93062e49e2 client linux fonctionnel 2023-10-04 15:01:48 -04:00
MarcEricMartel
183c5f186a Architecture générale 2023-10-03 12:43:54 -04:00
MarcEricMartel
c85f7df15e Merge branch 'master' into linux 2023-10-03 11:34:02 -04:00
Rynort
6668127f15 SQC-06 et une partie du SQC-09 2023-10-02 17:09:03 -04:00
Marc-Eric Martel
cddc59d6cf gitignore 2023-10-01 14:20:24 -04:00
Marc-Éric Martel
965e78309e Changements dans le CMakeLists du serveur pour la compatilité ARM 2023-10-01 14:17:42 -04:00
Marc-Eric Martel
0452920697 Enlevé l'erreur de narrowing 2023-10-01 14:02:43 -04:00
Marc-Eric Martel
8be8852596 Ajout CMakeLists.txt pour compiler le serveur en Linux 2023-10-01 11:52:07 -04:00
46 changed files with 1904 additions and 658 deletions

7
.gitignore vendored
View File

@@ -373,3 +373,10 @@ FodyWeavers.xsd
/x64/Release/SQCSim2023.exe /x64/Release/SQCSim2023.exe
/x64/Debug/SQCSim2023.exe /x64/Debug/SQCSim2023.exe
/x64/Debug/SQCSim2021.pdb /x64/Debug/SQCSim2021.pdb
/SQCSim-srv/cmake/*
!/SQCSim-srv/cmake/CMakeLists.txt
/SQCSim2021/cmake/*
!/SQCSim2021/cmake/CMakeLists.txt
/SQCSim2021/SQCSim-client
SQCSim2021/SQCSim2021.vcxproj.filters
SQCSim2021/SQCSim2021.vcxproj

View File

@@ -76,6 +76,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -90,6 +91,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -104,6 +106,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -118,7 +121,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>

View File

@@ -7,10 +7,19 @@ Bullet::Bullet(Vector3f pos, Vector3f dir, uint64_t tid): m_startpos(pos), m_cur
Bullet::~Bullet() {} Bullet::~Bullet() {}
bool Bullet::Update(World* world, float elapsedtime) { bool Bullet::Update(World* world, float elapsedtime, int perframe, std::map<uint64_t, Player*> mapPlayer) {
for (int x = 0; x < 1000; ++x) { int max = 100 / perframe;
float damage = 0.057f;
for (int x = 0; x < max; ++x) {
m_currentpos += m_velocity * elapsedtime; m_currentpos += m_velocity * elapsedtime;
for (auto& [key, player] : mapPlayer) {
if ((m_currentpos - player->GetPosition()).Length() < .4f) {
player->InflictDamage(damage);
return true;
}
}
if (!world->ChunkAt(m_currentpos)) if (!world->ChunkAt(m_currentpos))
return true; return true;
else if (world->BlockAt(m_currentpos) != BTYPE_AIR) { else if (world->BlockAt(m_currentpos) != BTYPE_AIR) {
@@ -30,10 +39,14 @@ void Bullet::Transpose(int& x, int& z) {
m_startpos.z -= z * CHUNK_SIZE_Z; m_startpos.z -= z * CHUNK_SIZE_Z;
} }
Vector3f Bullet::getPos() { Vector3f Bullet::getPos() const {
return m_currentpos; return m_currentpos;
} }
Vector3f Bullet::getVel() const {
return m_velocity;
}
uint64_t Bullet::getTeamID(){ uint64_t Bullet::getTeamID(){
return m_tid; return m_tid;
} }

View File

@@ -3,8 +3,12 @@
#include "define.h" #include "define.h"
#include "vector3.h" #include "vector3.h"
#include <map>
#include "player.h"
class World; class World;
class Player;
class Bullet { class Bullet {
public: public:
@@ -12,9 +16,10 @@ public:
Bullet(Vector3f pos, Vector3f dir, uint64_t tid); Bullet(Vector3f pos, Vector3f dir, uint64_t tid);
~Bullet(); ~Bullet();
bool Update(World* world, float elapsedtime); bool Update(World* world, float elapsedtime, int perframe, std::map<uint64_t, Player*> m_mapPlayer);
void Transpose(int& x, int& z); void Transpose(int& x, int& z);
Vector3f getPos(); Vector3f getPos() const;
Vector3f getVel() const;
uint64_t getTeamID(); uint64_t getTeamID();
private: private:
@@ -22,6 +27,8 @@ private:
m_currentpos, m_currentpos,
m_velocity; m_velocity;
uint64_t m_tid = 0; uint64_t m_tid = 0;
}; };
#endif // BULLET_H__ #endif // BULLET_H__

View File

@@ -4,8 +4,10 @@
#include <iostream> #include <iostream>
#include <chrono> #include <chrono>
#define SRV_PORT 1025 #define SRV_PORT 10000
#define CLI_PORT 1026 #define CLI_PORT 10001
#define BUFFER_LENGTH 150
#define CHUNK_SIZE_X 4 #define CHUNK_SIZE_X 4
#define CHUNK_SIZE_Y 64 #define CHUNK_SIZE_Y 64
@@ -29,6 +31,8 @@
#define TEXTURE_SIZE 512 #define TEXTURE_SIZE 512
#define MAX_BULLETS 512 #define MAX_BULLETS 512
#define BULLET_TIME .1
typedef uint8_t BlockType; typedef uint8_t BlockType;
enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_LAST }; enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_LAST };
typedef uint64_t Timestamp; typedef uint64_t Timestamp;
@@ -42,6 +46,11 @@ typedef uint64_t Timestamp;
#include <cstdio> #include <cstdio>
#include <ctime> #include <ctime>
#define flag_t u_long
#define addrlen_t int
#define ioctl ioctlsocket
#define SOCK_NONBLOCK FIONBIO
#define strcpy strcpy_s
#define popen _popen #define popen _popen
#define pclose _pclose #define pclose _pclose
@@ -51,9 +60,13 @@ typedef uint64_t Timestamp;
#include <time.h> #include <time.h>
#include <stdio.h> #include <stdio.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <cstring>
#define flag_t unsigned int
#define addrlen_t unsigned int
#define SOCKET int #define SOCKET int
#define INVALID_SOCKET -1 #define INVALID_SOCKET -1
#define closesocket close #define closesocket close

View File

@@ -1,29 +1,29 @@
#include "netprotocol.h" #include "netprotocol.h"
void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) { void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::INPUT; *buf[0] = (char)netprot::PACKET_TYPE::INPUT;
uint64_t time = in->timestamp; uint64_t time = in->timestamp;
uint8_t time8[sizeof(uint64_t)] = {(time >> 56) & 0xFF, uint8_t time8[sizeof(uint64_t)] = {(uint8_t)((time >> 56) & 0xFF),
(time >> 48) & 0xFF, (uint8_t)((time >> 48) & 0xFF),
(time >> 40) & 0xFF, (uint8_t)((time >> 40) & 0xFF),
(time >> 32) & 0xFF, (uint8_t)((time >> 32) & 0xFF),
(time >> 24) & 0xFF, (uint8_t)((time >> 24) & 0xFF),
(time >> 16) & 0xFF, (uint8_t)((time >> 16) & 0xFF),
(time >> 8 ) & 0xFF, (uint8_t)((time >> 8 ) & 0xFF),
time & 0xFF}; (uint8_t)(time & 0xFF)};
memcpy(*buf + 1, time8, sizeof(uint64_t)); memcpy(*buf + 1, time8, sizeof(uint64_t));
uint64_t sid = in->sid; uint64_t sid = in->sid;
uint8_t sid8[sizeof(uint64_t)] = {(sid >> 56) & 0xFF, uint8_t sid8[sizeof(uint64_t)] = {(uint8_t)((sid >> 56) & 0xFF),
(sid >> 48) & 0xFF, (uint8_t)((sid >> 48) & 0xFF),
(sid >> 40) & 0xFF, (uint8_t)((sid >> 40) & 0xFF),
(sid >> 32) & 0xFF, (uint8_t)((sid >> 32) & 0xFF),
(sid >> 24) & 0xFF, (uint8_t)((sid >> 24) & 0xFF),
(sid >> 16) & 0xFF, (uint8_t)((sid >> 16) & 0xFF),
(sid >> 8 ) & 0xFF, (uint8_t)((sid >> 8 ) & 0xFF),
sid & 0xFF}; (uint8_t)( sid & 0xFF)};
memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t)); memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t));
@@ -37,54 +37,140 @@ void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) {
keys.shoot & 0b00000100 | keys.shoot & 0b00000100 |
keys.block & 0b00000010 ; keys.block & 0b00000010 ;
memcpy(*buf + sizeof(uint64_t) + 2, &keys8, sizeof(uint8_t)); memcpy(*buf + sizeof(uint64_t) * 2 + 1, &keys8, sizeof(uint8_t));
uint32_t vec[3]; uint32_t vec[3];
memcpy(vec, &in->direction, sizeof(Vector3f)); // Pour d<>naturer les floats. memcpy(vec, &in->direction, sizeof(Vector3f)); // Pour d<>naturer les floats.
uint8_t vec8[3 * sizeof(uint32_t)] = { uint8_t vec8[3 * sizeof(uint32_t)] = {
(vec[0] >> 24) & 0xFF, (uint8_t)((vec[0] >> 24) & 0xFF),
(vec[0] >> 16) & 0xFF, (uint8_t)((vec[0] >> 16) & 0xFF),
(vec[0] >> 8) & 0xFF, (uint8_t)((vec[0] >> 8) & 0xFF),
vec[0] & 0xFF, (uint8_t)(vec[0] & 0xFF),
(vec[1] >> 24) & 0xFF, (uint8_t)((vec[1] >> 24) & 0xFF),
(vec[1] >> 16) & 0xFF, (uint8_t)((vec[1] >> 16) & 0xFF),
(vec[1] >> 8) & 0xFF, (uint8_t)((vec[1] >> 8) & 0xFF),
vec[1] & 0xFF, (uint8_t)(vec[1] & 0xFF),
(vec[2] >> 24) & 0xFF, (uint8_t)((vec[2] >> 24) & 0xFF),
(vec[2] >> 16) & 0xFF, (uint8_t)((vec[2] >> 16) & 0xFF),
(vec[2] >> 8) & 0xFF, (uint8_t)((vec[2] >> 8) & 0xFF),
vec[2] & 0xFF}; (uint8_t)(vec[2] & 0xFF)};
memcpy(*buf + sizeof(uint64_t) + 3, vec8, sizeof(uint32_t) * 3); memcpy(*buf + sizeof(uint64_t) * 2 + 2, vec8, sizeof(uint32_t) * 3);
*buflen = sizeof(uint64_t) + 3 + sizeof(uint32_t) * 3; *buflen = sizeof(uint64_t) * 2 + 2 + sizeof(uint32_t) * 3;
} }
void netprot::Serialize(Output* out, char* buf[], uint32_t* buflen) { void netprot::Serialize(Output* out, char* buf[], uint32_t* buflen) {
*buf[0] = (char)netprot::PACKET_TYPE::OUTPUT;
uint64_t time = out->timestamp;
uint8_t time8[sizeof(uint64_t)] = { (uint8_t)((time >> 56) & 0xFF),
(uint8_t)((time >> 48) & 0xFF),
(uint8_t)((time >> 40) & 0xFF),
(uint8_t)((time >> 32) & 0xFF),
(uint8_t)((time >> 24) & 0xFF),
(uint8_t)((time >> 16) & 0xFF),
(uint8_t)((time >> 8) & 0xFF),
(uint8_t)(time & 0xFF) };
memcpy(*buf + 1, time8, sizeof(uint64_t));
uint64_t sid = out->id;
uint8_t sid8[sizeof(uint64_t)] = { (uint8_t)((sid >> 56) & 0xFF),
(uint8_t)((sid >> 48) & 0xFF),
(uint8_t)((sid >> 40) & 0xFF),
(uint8_t)((sid >> 32) & 0xFF),
(uint8_t)((sid >> 24) & 0xFF),
(uint8_t)((sid >> 16) & 0xFF),
(uint8_t)((sid >> 8) & 0xFF),
(uint8_t)(sid & 0xFF) };
memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t));
// TODO: Finir ca.
} }
void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) { void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) {
*buf[0] = (char)netprot::PACKET_TYPE::SYNC;
uint64_t time = sync->timestamp;
uint8_t stamp8[sizeof(uint64_t)] = { (uint8_t)((time >> 56) & 0xFF),
(uint8_t)((time >> 48) & 0xFF),
(uint8_t)((time >> 40) & 0xFF),
(uint8_t)((time >> 32) & 0xFF),
(uint8_t)((time >> 24) & 0xFF),
(uint8_t)((time >> 16) & 0xFF),
(uint8_t)((time >> 8) & 0xFF),
(uint8_t)(time & 0xFF) };
memcpy(*buf + 1, stamp8, sizeof(uint64_t));
uint64_t sid = sync->sid;
uint8_t sid8[sizeof(uint64_t)] = { (uint8_t)((sid >> 56) & 0xFF),
(uint8_t)((sid >> 48) & 0xFF),
(uint8_t)((sid >> 40) & 0xFF),
(uint8_t)((sid >> 32) & 0xFF),
(uint8_t)((sid >> 24) & 0xFF),
(uint8_t)((sid >> 16) & 0xFF),
(uint8_t)((sid >> 8) & 0xFF),
(uint8_t)(sid & 0xFF) };
memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t));
uint32_t timer = sync->timer;
uint8_t time8[sizeof(uint32_t)] = {(uint8_t)((timer >> 24) & 0xFF),
(uint8_t)((timer >> 16) & 0xFF),
(uint8_t)((timer >> 8) & 0xFF),
(uint8_t)(timer & 0xFF) };
memcpy(*buf + sizeof(uint64_t) * 2 + 1, time8, sizeof(uint32_t));
uint16_t ammo = sync->ammo;
uint8_t ammo8[sizeof(uint16_t)] = { (uint8_t)((ammo >> 8) & 0xFF),
(uint8_t)(ammo & 0xFF) };
memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) + 1, ammo8, sizeof(uint16_t));
memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) + sizeof(uint16_t) + 1, &sync->hp, sizeof(uint8_t));
uint32_t vec[3];
memcpy(vec, &sync->position, sizeof(Vector3f)); // Pour d<>naturer les floats.
uint8_t vec8[3 * sizeof(uint32_t)] = {
(uint8_t)((vec[0] >> 24) & 0xFF),
(uint8_t)((vec[0] >> 16) & 0xFF),
(uint8_t)((vec[0] >> 8) & 0xFF),
(uint8_t)(vec[0] & 0xFF),
(uint8_t)((vec[1] >> 24) & 0xFF),
(uint8_t)((vec[1] >> 16) & 0xFF),
(uint8_t)((vec[1] >> 8) & 0xFF),
(uint8_t)(vec[1] & 0xFF),
(uint8_t)((vec[2] >> 24) & 0xFF),
(uint8_t)((vec[2] >> 16) & 0xFF),
(uint8_t)((vec[2] >> 8) & 0xFF),
(uint8_t)(vec[2] & 0xFF) };
memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) + sizeof(uint16_t) + 2, vec8, sizeof(uint32_t) * 3);
*buflen = sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + 2;
} }
void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) { void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::TEAMINF; *buf[0] = (char)netprot::PACKET_TYPE::TEAMINF;
size_t namesize = std::strlen(tinfo->name) + 1; size_t namesize = std::strlen(tinfo->name) + 1;
memcpy(*buf + 1, &tinfo->name, namesize); memcpy(*buf + 1, &tinfo->name, namesize);
uint64_t tid = tinfo->id; uint64_t tid = tinfo->id;
uint8_t tid8[sizeof(uint64_t)] = { uint8_t tid8[sizeof(uint64_t)] = {
(tid >> 56) & 0xFF, (uint8_t)((tid >> 56) & 0xFF),
(tid >> 48) & 0xFF, (uint8_t)((tid >> 48) & 0xFF),
(tid >> 40) & 0xFF, (uint8_t)((tid >> 40) & 0xFF),
(tid >> 32) & 0xFF, (uint8_t)((tid >> 32) & 0xFF),
(tid >> 24) & 0xFF, (uint8_t)((tid >> 24) & 0xFF),
(tid >> 16) & 0xFF, (uint8_t)((tid >> 16) & 0xFF),
(tid >> 8) & 0xFF, (uint8_t)((tid >> 8) & 0xFF),
tid & 0xFF (uint8_t)(tid & 0xFF)
}; };
memcpy(*buf + namesize + 2, tid8, sizeof(uint64_t)); memcpy(*buf + namesize + 2, tid8, sizeof(uint64_t));
@@ -93,35 +179,35 @@ void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) {
} }
void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) { void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::LOGINF; *buf[0] = (char)netprot::PACKET_TYPE::LOGINF;
size_t namesize = std::strlen(linfo->name) + 1; size_t namesize = std::strlen(linfo->name) + 1;
memcpy(*buf + 1, &linfo->name, namesize); memcpy(*buf + 1, &linfo->name, namesize);
uint64_t sid = linfo->sid; uint64_t sid = linfo->sid;
uint8_t sid8[sizeof(uint64_t)] = { uint8_t sid8[sizeof(uint64_t)] = {
(sid >> 56) & 0xFF, (uint8_t)((sid >> 56) & 0xFF),
(sid >> 48) & 0xFF, (uint8_t)((sid >> 48) & 0xFF),
(sid >> 40) & 0xFF, (uint8_t)((sid >> 40) & 0xFF),
(sid >> 32) & 0xFF, (uint8_t)((sid >> 32) & 0xFF),
(sid >> 24) & 0xFF, (uint8_t)((sid >> 24) & 0xFF),
(sid >> 16) & 0xFF, (uint8_t)((sid >> 16) & 0xFF),
(sid >> 8) & 0xFF, (uint8_t)((sid >> 8) & 0xFF),
sid & 0xFF (uint8_t)(sid & 0xFF)
}; };
memcpy(*buf + namesize + 2, sid8, sizeof(uint64_t)); memcpy(*buf + namesize + 2, sid8, sizeof(uint64_t));
uint64_t tid = linfo->tid; uint64_t tid = linfo->tid;
uint8_t tid8[sizeof(uint64_t)] = { uint8_t tid8[sizeof(uint64_t)] = {
(tid >> 56) & 0xFF, (uint8_t)((tid >> 56) & 0xFF),
(tid >> 48) & 0xFF, (uint8_t)((tid >> 48) & 0xFF),
(tid >> 40) & 0xFF, (uint8_t)((tid >> 40) & 0xFF),
(tid >> 32) & 0xFF, (uint8_t)((tid >> 32) & 0xFF),
(tid >> 24) & 0xFF, (uint8_t)((tid >> 24) & 0xFF),
(tid >> 16) & 0xFF, (uint8_t)((tid >> 16) & 0xFF),
(tid >> 8) & 0xFF, (uint8_t)((tid >> 8) & 0xFF),
tid & 0xFF (uint8_t)(tid & 0xFF)
}; };
memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t)); memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t));
@@ -130,35 +216,35 @@ void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) {
} }
void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) { void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::PLAYINF; *buf[0] = (char)netprot::PACKET_TYPE::PLAYINF;
size_t namesize = std::strlen(pinfo->name) + 1; size_t namesize = std::strlen(pinfo->name) + 1;
memcpy(*buf + 1, &pinfo->name, namesize); memcpy(*buf + 1, &pinfo->name, namesize);
uint64_t id = pinfo->id; uint64_t id = pinfo->id;
uint8_t id8[sizeof(uint64_t)] = { uint8_t id8[sizeof(uint64_t)] = {
(id >> 56) & 0xFF, (uint8_t)((id >> 56) & 0xFF),
(id >> 48) & 0xFF, (uint8_t)((id >> 48) & 0xFF),
(id >> 40) & 0xFF, (uint8_t)((id >> 40) & 0xFF),
(id >> 32) & 0xFF, (uint8_t)((id >> 32) & 0xFF),
(id >> 24) & 0xFF, (uint8_t)((id >> 24) & 0xFF),
(id >> 16) & 0xFF, (uint8_t)((id >> 16) & 0xFF),
(id >> 8) & 0xFF, (uint8_t)((id >> 8) & 0xFF),
id & 0xFF (uint8_t)(id & 0xFF)
}; };
memcpy(*buf + namesize + 2, id8, sizeof(uint64_t)); memcpy(*buf + namesize + 2, id8, sizeof(uint64_t));
uint64_t tid = pinfo->tid; uint64_t tid = pinfo->tid;
uint8_t tid8[sizeof(uint64_t)] = { uint8_t tid8[sizeof(uint64_t)] = {
(tid >> 56) & 0xFF, (uint8_t)((tid >> 56) & 0xFF),
(tid >> 48) & 0xFF, (uint8_t)((tid >> 48) & 0xFF),
(tid >> 40) & 0xFF, (uint8_t)((tid >> 40) & 0xFF),
(tid >> 32) & 0xFF, (uint8_t)((tid >> 32) & 0xFF),
(tid >> 24) & 0xFF, (uint8_t)((tid >> 24) & 0xFF),
(tid >> 16) & 0xFF, (uint8_t)((tid >> 16) & 0xFF),
(tid >> 8) & 0xFF, (uint8_t)((tid >> 8) & 0xFF),
tid & 0xFF (uint8_t)(tid & 0xFF)
}; };
memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t)); memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t));
@@ -167,46 +253,46 @@ void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) {
} }
void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) { void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::GAMEINFO; *buf[0] = (char)netprot::PACKET_TYPE::GAMEINFO;
uint64_t game = ginfo->seed; uint64_t game = ginfo->seed;
uint8_t seed8[sizeof(uint64_t)] = { uint8_t seed8[sizeof(uint64_t)] = {
(game >> 56) & 0xFF, (uint8_t)((game >> 56) & 0xFF),
(game >> 48) & 0xFF, (uint8_t)((game >> 48) & 0xFF),
(game >> 40) & 0xFF, (uint8_t)((game >> 40) & 0xFF),
(game >> 32) & 0xFF, (uint8_t)((game >> 32) & 0xFF),
(game >> 24) & 0xFF, (uint8_t)((game >> 24) & 0xFF),
(game >> 16) & 0xFF, (uint8_t)((game >> 16) & 0xFF),
(game >> 8) & 0xFF, (uint8_t)((game >> 8) & 0xFF),
game & 0xFF (uint8_t)(game & 0xFF)
}; };
memcpy(*buf + 1, seed8, sizeof(uint64_t)); memcpy(*buf + 1, seed8, sizeof(uint64_t));
game = ginfo->countdown; game = ginfo->countdown;
uint8_t count8[sizeof(uint64_t)] = { uint8_t count8[sizeof(uint64_t)] = {
(game >> 56) & 0xFF, (uint8_t)((game >> 56) & 0xFF),
(game >> 48) & 0xFF, (uint8_t)((game >> 48) & 0xFF),
(game >> 40) & 0xFF, (uint8_t)((game >> 40) & 0xFF),
(game >> 32) & 0xFF, (uint8_t)((game >> 32) & 0xFF),
(game >> 24) & 0xFF, (uint8_t)((game >> 24) & 0xFF),
(game >> 16) & 0xFF, (uint8_t)((game >> 16) & 0xFF),
(game >> 8) & 0xFF, (uint8_t)((game >> 8) & 0xFF),
game & 0xFF (uint8_t)(game & 0xFF)
}; };
memcpy(*buf + sizeof(uint64_t) + 1, count8, sizeof(uint64_t)); memcpy(*buf + sizeof(uint64_t) + 1, count8, sizeof(uint64_t));
game = ginfo->countdown; game = ginfo->countdown;
uint8_t gtype8[sizeof(uint64_t)] = { uint8_t gtype8[sizeof(uint64_t)] = {
(game >> 56) & 0xFF, (uint8_t)((game >> 56) & 0xFF),
(game >> 48) & 0xFF, (uint8_t)((game >> 48) & 0xFF),
(game >> 40) & 0xFF, (uint8_t)((game >> 40) & 0xFF),
(game >> 32) & 0xFF, (uint8_t)((game >> 32) & 0xFF),
(game >> 24) & 0xFF, (uint8_t)((game >> 24) & 0xFF),
(game >> 16) & 0xFF, (uint8_t)((game >> 16) & 0xFF),
(game >> 8) & 0xFF, (uint8_t)((game >> 8) & 0xFF),
game & 0xFF (uint8_t)(game & 0xFF)
}; };
memcpy(*buf + sizeof(uint64_t) + 1, gtype8, sizeof(uint64_t)); memcpy(*buf + sizeof(uint64_t) + 1, gtype8, sizeof(uint64_t));
@@ -215,46 +301,46 @@ void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) {
} }
void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) { void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::CHAT; *buf[0] = (char)netprot::PACKET_TYPE::CHAT;
uint64_t src = chat->src_id; uint64_t src = chat->src_id;
uint8_t src8[sizeof(uint64_t)] = { uint8_t src8[sizeof(uint64_t)] = {
(src >> 56) & 0xFF, (uint8_t)((src >> 56) & 0xFF),
(src >> 48) & 0xFF, (uint8_t)((src >> 48) & 0xFF),
(src >> 40) & 0xFF, (uint8_t)((src >> 40) & 0xFF),
(src >> 32) & 0xFF, (uint8_t)((src >> 32) & 0xFF),
(src >> 24) & 0xFF, (uint8_t)((src >> 24) & 0xFF),
(src >> 16) & 0xFF, (uint8_t)((src >> 16) & 0xFF),
(src >> 8) & 0xFF, (uint8_t)((src >> 8) & 0xFF),
src & 0xFF (uint8_t)(src & 0xFF)
}; };
memcpy(*buf + 1, src8, sizeof(uint64_t)); memcpy(*buf + 1, src8, sizeof(uint64_t));
uint64_t dst = chat->dest_id; uint64_t dst = chat->dest_id;
uint8_t dst8[sizeof(uint64_t)] = { uint8_t dst8[sizeof(uint64_t)] = {
(dst >> 56) & 0xFF, (uint8_t)((dst >> 56) & 0xFF),
(dst >> 48) & 0xFF, (uint8_t)((dst >> 48) & 0xFF),
(dst >> 40) & 0xFF, (uint8_t)((dst >> 40) & 0xFF),
(dst >> 32) & 0xFF, (uint8_t)((dst >> 32) & 0xFF),
(dst >> 24) & 0xFF, (uint8_t)((dst >> 24) & 0xFF),
(dst >> 16) & 0xFF, (uint8_t)((dst >> 16) & 0xFF),
(dst >> 8) & 0xFF, (uint8_t)((dst >> 8) & 0xFF),
dst & 0xFF (uint8_t)(dst & 0xFF)
}; };
memcpy(*buf + 1 + sizeof(uint64_t), dst8, sizeof(uint64_t)); memcpy(*buf + 1 + sizeof(uint64_t), dst8, sizeof(uint64_t));
uint64_t dstteam = chat->dest_id; uint64_t dstteam = chat->dest_id;
uint8_t dstt8[sizeof(uint64_t)] = { uint8_t dstt8[sizeof(uint64_t)] = {
(dstteam >> 56) & 0xFF, (uint8_t)((dstteam >> 56) & 0xFF),
(dstteam >> 48) & 0xFF, (uint8_t)((dstteam >> 48) & 0xFF),
(dstteam >> 40) & 0xFF, (uint8_t)((dstteam >> 40) & 0xFF),
(dstteam >> 32) & 0xFF, (uint8_t)((dstteam >> 32) & 0xFF),
(dstteam >> 24) & 0xFF, (uint8_t)((dstteam >> 24) & 0xFF),
(dstteam >> 16) & 0xFF, (uint8_t)((dstteam >> 16) & 0xFF),
(dstteam >> 8) & 0xFF, (uint8_t)((dstteam >> 8) & 0xFF),
dstteam & 0xFF (uint8_t)(dstteam & 0xFF)
}; };
memcpy(*buf + 1 + sizeof(uint64_t) * 2, dstt8, sizeof(uint64_t)); memcpy(*buf + 1 + sizeof(uint64_t) * 2, dstt8, sizeof(uint64_t));
@@ -267,7 +353,7 @@ void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) {
} }
void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) { void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) {
*buf[0] = netprot::PACKET_TYPE::ERRLOG; *buf[0] = (char)netprot::PACKET_TYPE::ERRLOG;
size_t messize = std::strlen(errlog->mess) + 1; size_t messize = std::strlen(errlog->mess) + 1;
@@ -281,7 +367,61 @@ void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) {
bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) { bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) {
if (buflen <= sizeof(Input))
return false; return false;
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
memcpy(diff, &buf[1], sizeof(uint64_t));
in->timestamp =
(uint64_t)diff[0] << 56 |
(uint64_t)diff[1] << 48 |
(uint64_t)diff[2] << 40 |
(uint64_t)diff[3] << 32 |
(uint64_t)diff[4] << 24 |
(uint64_t)diff[5] << 16 |
(uint64_t)diff[6] << 8 |
(uint64_t)diff[7];
memcpy(diff, &buf[1 + sizeof(uint64_t)], sizeof(uint64_t));
in->sid =
(uint64_t)diff[0] << 56 |
(uint64_t)diff[1] << 48 |
(uint64_t)diff[2] << 40 |
(uint64_t)diff[3] << 32 |
(uint64_t)diff[4] << 24 |
(uint64_t)diff[5] << 16 |
(uint64_t)diff[6] << 8 |
(uint64_t)diff[7];
uint8_t keys = 0;
memcpy(&keys, &buf[1 + sizeof(uint64_t) * 2], sizeof(uint8_t));
in->keys.forward = keys & 0b10000000;
in->keys.backward = keys & 0b01000000;
in->keys.left = keys & 0b00100000;
in->keys.right = keys & 0b00010000;
in->keys.jump = keys & 0b00001000;
in->keys.shoot = keys & 0b00000100;
in->keys.block = keys & 0b00000010;
uint8_t subvec[3 * sizeof(uint32_t)] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
memcpy(subvec, &buf[2 + sizeof(uint64_t) * 2], sizeof(uint8_t) * 12);
uint32_t vec[3] = {
(uint32_t)subvec[0] << 24 |
(uint32_t)subvec[1] << 16 |
(uint32_t)subvec[2] << 8 |
(uint32_t)subvec[3],
(uint32_t)subvec[4] << 24 |
(uint32_t)subvec[5] << 16 |
(uint32_t)subvec[6] << 8 |
(uint32_t)subvec[7],
(uint32_t)subvec[8] << 24 |
(uint32_t)subvec[9] << 16 |
(uint32_t)subvec[10] << 8 |
(uint32_t)subvec[11]};
memcpy(&in->direction, vec, sizeof(uint32_t) * 3);
return true;
} }
bool netprot::Deserialize(Output* out, char* buf, const uint32_t buflen) { bool netprot::Deserialize(Output* out, char* buf, const uint32_t buflen) {
@@ -289,7 +429,65 @@ bool netprot::Deserialize(Output* out, char* buf, const uint32_t buflen) {
} }
bool netprot::Deserialize(Sync* sync, char* buf, const uint32_t buflen) { bool netprot::Deserialize(Sync* sync, char* buf, const uint32_t buflen) {
if (buflen <= sizeof(Sync))
return false; return false;
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
memcpy(diff, &buf[1], sizeof(uint64_t));
sync->timestamp =
(uint64_t)diff[0] << 56 |
(uint64_t)diff[1] << 48 |
(uint64_t)diff[2] << 40 |
(uint64_t)diff[3] << 32 |
(uint64_t)diff[4] << 24 |
(uint64_t)diff[5] << 16 |
(uint64_t)diff[6] << 8 |
(uint64_t)diff[7];
memcpy(diff, &buf[1 + sizeof(uint64_t)], sizeof(uint64_t));
sync->sid =
(uint64_t)diff[0] << 56 |
(uint64_t)diff[1] << 48 |
(uint64_t)diff[2] << 40 |
(uint64_t)diff[3] << 32 |
(uint64_t)diff[4] << 24 |
(uint64_t)diff[5] << 16 |
(uint64_t)diff[6] << 8 |
(uint64_t)diff[7];
memcpy(diff, &buf[1 + sizeof(uint64_t) * 2], sizeof(uint32_t));
sync->timer =
(uint32_t)diff[0] << 24 |
(uint32_t)diff[1] << 16 |
(uint32_t)diff[2] << 8 |
(uint32_t)diff[3];
memcpy(diff, &buf[1 + sizeof(uint64_t) * 2 + sizeof(uint32_t)], sizeof(uint16_t));
sync->ammo =
(uint16_t)diff[0] << 8 |
(uint16_t)diff[1];
memcpy(&sync->hp, &buf[1 + sizeof(uint64_t) * 2 + sizeof(uint32_t) + sizeof(uint16_t)], sizeof(uint8_t));
uint8_t subvec[3 * sizeof(uint32_t)] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
memcpy(subvec, &buf[2 + sizeof(uint64_t) * 2 + sizeof(uint32_t) + sizeof(uint16_t)], sizeof(uint8_t) * 12);
uint32_t vec[3] = {
(uint32_t)subvec[0] << 24 |
(uint32_t)subvec[1] << 16 |
(uint32_t)subvec[2] << 8 |
(uint32_t)subvec[3],
(uint32_t)subvec[4] << 24 |
(uint32_t)subvec[5] << 16 |
(uint32_t)subvec[6] << 8 |
(uint32_t)subvec[7],
(uint32_t)subvec[8] << 24 |
(uint32_t)subvec[9] << 16 |
(uint32_t)subvec[10] << 8 |
(uint32_t)subvec[11] };
memcpy(&sync->position, vec, sizeof(uint32_t) * 3);
return true;
} }
bool netprot::Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen) { bool netprot::Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen) {
@@ -497,10 +695,246 @@ bool netprot::Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen) {
return true; return true;
} }
netprot::PacketType netprot::getType(char* buf, const uint32_t buflen) { netprot::PACKET_TYPE netprot::getType(char* buf, const uint32_t buflen) {
if (buflen < 1 || if (buflen < 1 ||
buf[0] >= netprot::PACKET_TYPE::LAST_PACK || buf[0] >= (char)netprot::PACKET_TYPE::LAST_PACK ||
buf[0] <= netprot::PACKET_TYPE::ERR) buf[0] <= (char)netprot::PACKET_TYPE::ERR)
return netprot::PACKET_TYPE::ERR; return netprot::PACKET_TYPE::ERR;
return buf[0]; return (netprot::PACKET_TYPE)buf[0];
}
netprot::Packet netprot::getPack(char* buf, uint32_t buflen) {
Packet pck = { nullptr, PACKET_TYPE::ERR };
Input* in = nullptr;
Output* out = nullptr;
Sync* sync = nullptr;
Chat* chat = nullptr;
GameInfo* ginfo = nullptr;
ErrorLog* errlog = nullptr;
LoginInfo* loginf = nullptr;
switch (getType(buf, buflen)) {
case PACKET_TYPE::INPUT:
in = new Input();
if (netprot::Deserialize(in, buf, buflen)) {
pck.type = PACKET_TYPE::INPUT;
pck.ptr = (void*)in;
}
break;
case PACKET_TYPE::OUTPUT:
out = new Output();
if (netprot::Deserialize(out, buf, buflen)) {
pck.type = PACKET_TYPE::OUTPUT;
pck.ptr = (void*)out;
}
break;
case PACKET_TYPE::SYNC:
sync = new Sync();
if (netprot::Deserialize(sync, buf, buflen)) {
pck.type = PACKET_TYPE::SYNC;
pck.ptr = (void*)sync;
}
break;
case PACKET_TYPE::CHAT:
chat = new Chat();
if (netprot::Deserialize(chat, buf, buflen)) {
pck.type = PACKET_TYPE::CHAT;
pck.ptr = (void*)chat;
}
break;
case PACKET_TYPE::GAMEINFO:
ginfo = new GameInfo();
if (netprot::Deserialize(ginfo, buf, buflen)) {
pck.type = PACKET_TYPE::GAMEINFO;
pck.ptr = (void*)ginfo;
}
break;
case PACKET_TYPE::ERRLOG:
errlog = new ErrorLog();
if (netprot::Deserialize(errlog, buf, buflen)) {
pck.type = PACKET_TYPE::ERRLOG;
pck.ptr = (void*)errlog;
}
break;
case PACKET_TYPE::LOGINF:
loginf = new LoginInfo();
if (netprot::Deserialize(loginf, buf, buflen)) {
pck.type = PACKET_TYPE::LOGINF;
pck.ptr = (void*)loginf;
}
break;
default:
break;
}
return pck;
}
netprot::Packet netprot::getPack(netprot::Buffer* buf) {
return netprot::getPack(buf->ptr, buf->len);
}
bool netprot::emptyPack(netprot::Packet pck) {
switch (pck.type) {
case PACKET_TYPE::INPUT:
delete (Input*)pck.ptr;
return true;
case PACKET_TYPE::OUTPUT:
delete (Output*)pck.ptr;
return true;
case PACKET_TYPE::SYNC:
delete (Sync*)pck.ptr;
return true;
case PACKET_TYPE::CHAT:
delete (Chat*)pck.ptr;
return true;
case PACKET_TYPE::GAMEINFO:
delete (GameInfo*)pck.ptr;
return true;
case PACKET_TYPE::ERRLOG:
delete (ErrorLog*)pck.ptr;
return true;
case PACKET_TYPE::LOGINF:
delete (LoginInfo*)pck.ptr;
return true;
default:
return false;
}
}
netprot::Packet netprot::makePack(void* ptr, PACKET_TYPE type) {
Packet pck;
pck.ptr = ptr;
pck.type = type;
return pck;
}
std::vector<netprot::Packet> netprot::recvPacks(SOCKET sock, Buffer* buf) {
std::vector<Packet> lsPck;
int len = 0, end = 0;
bool pck_received = false;
char* cursor = nullptr;
while (true) {
while (!pck_received) {
int bytes = recv(sock, &buf->ptr[len], buf->len - len, 0);
if (bytes < 0) // si recv() retourne -1; ça veut dire qu'il y a plus rien a lire.
return lsPck;
len += bytes;
// TODO: Voir si on trouve un footer (5 '\0' d'affilee).
// Si oui, mettre l'index du debut du footer dans
// la variable "end" et mettre pck_received a true.
}
cursor = &buf->ptr[end];
lsPck.push_back(getPack(buf));
while (*cursor == '\0') {
cursor++;
end++;
}
if (cursor) { // mettre le début du prochain paquet au début du buffer.
memcpy(buf->ptr, cursor, buf->len - end); // et voir s'il y a en un autre
len = 0;
pck_received = true;
}
}
}
template <>
void netprot::sendPack<netprot::Packet>(SOCKET sock, Packet* pack, char** buf, uint32_t* buflen) {
switch (pack->type) {
case PACKET_TYPE::INPUT:
sendPack<Input>(sock, (Input*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::OUTPUT:
sendPack<Output>(sock, (Output*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::SYNC:
sendPack<Sync>(sock, (Sync*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::TEAMINF:
sendPack<TeamInfo>(sock, (TeamInfo*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::PLAYINF:
sendPack<PlayerInfo>(sock, (PlayerInfo*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::LOGINF:
sendPack<LoginInfo>(sock, (LoginInfo*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::CHUNKMOD:
//sendPack<ChunkMod>(sock, (ChunkMod*)pack->ptr, buf, buflen);
case PACKET_TYPE::PLAYERMOD:
//sendPack<PlayerMod>(sock, (PlayerMod*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::PICKUPMOD:
//sendPack<PickupMod>(sock, (PickupMod*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::GAMEINFO:
sendPack<GameInfo>(sock, (GameInfo*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::ENDINFO:
//sendPack<EndInfo>(sock, (EndInfo*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::CHAT:
sendPack<Chat>(sock, (Chat*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::ERRLOG:
sendPack<ErrorLog>(sock, (ErrorLog*)pack->ptr, buf, buflen);
return;
case PACKET_TYPE::LAST_PACK: [[fallthrough]];
case PACKET_TYPE::ERR: [[fallthrough]];
default:
return;
}
}
template <>
void netprot::sendPackTo<netprot::Packet>(SOCKET sock, Packet* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad) {
switch (pack->type) {
case PACKET_TYPE::INPUT:
sendPackTo<Input>(sock, (Input*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::OUTPUT:
sendPackTo<Output>(sock, (Output*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::SYNC:
sendPackTo<Sync>(sock, (Sync*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::TEAMINF:
sendPackTo<TeamInfo>(sock, (TeamInfo*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::PLAYINF:
sendPackTo<PlayerInfo>(sock, (PlayerInfo*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::LOGINF:
sendPackTo<LoginInfo>(sock, (LoginInfo*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::CHUNKMOD:
//sendPackTo<ChunkMod>(sock, (ChunkMod*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::PLAYERMOD:
//sendPackTo<PlayerMod>(sock, (PlayerMod*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::PICKUPMOD:
//sendPackTo<PickupMod>(sock, (PickupMod*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::GAMEINFO:
sendPackTo<GameInfo>(sock, (GameInfo*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::ENDINFO:
//sendPackTo<EndInfo>(sock, (EndInfo*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::CHAT:
sendPackTo<Chat>(sock, (Chat*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::ERRLOG:
sendPackTo<ErrorLog>(sock, (ErrorLog*)pack->ptr, buf, buflen, sockad);
return;
case PACKET_TYPE::LAST_PACK: [[fallthrough]];
case PACKET_TYPE::ERR: [[fallthrough]];
default:
return;
}
} }

View File

@@ -1,17 +1,16 @@
#ifndef NETPROTOCOL_H__ #ifndef NETPROTOCOL_H__
#define NETPROTOCOL_H__ #define NETPROTOCOL_H__
#include "define.h"
#include <string> #include <string>
#include "define.h"
#include "vector3.h" #include "vector3.h"
/* Protocole Particulier de Partie <EFBFBD> Plusieurs Personnes (PPPPP) */ /* Protocole Particulier de Partie a Plusieurs Personnes (PPPPP) */
// Packet: packet[0] = PacketType, packet[1..n-1] = {packet} // Packet: packet[0] = PacketType, packet[1..n-1] = {packet}
namespace netprot { namespace netprot {
typedef uint8_t PacketType; enum class PACKET_TYPE: uint8_t {
enum PACKET_TYPE {
ERR, INPUT, OUTPUT, SYNC, ERR, INPUT, OUTPUT, SYNC,
TEAMINF, SELFINF, PLAYINF, LOGINF, TEAMINF, SELFINF, PLAYINF, LOGINF,
CHUNKMOD, PLAYERMOD, PICKUPMOD, CHUNKMOD, PLAYERMOD, PICKUPMOD,
@@ -19,6 +18,19 @@ namespace netprot {
LAST_PACK LAST_PACK
}; };
struct Buffer { // Pour pouvoir rendre l'utilisation des buffers plus clean.
char* ptr = new char[BUFFER_LENGTH];
uint32_t len = BUFFER_LENGTH;
~Buffer() { delete[] ptr; }
void rstLen() { len = BUFFER_LENGTH; }
};
struct Packet { // Pour pouvoir recevoir les paquets du recv() sans avoir à les aiguiller dans la même thread.
void* ptr = nullptr; // Notez que le pointeur doit être supprimé séparément lorsqu'il n'est plus utile.
PACKET_TYPE type = PACKET_TYPE::ERR;
};
struct Keys { struct Keys {
bool forward, bool forward,
backward, backward,
@@ -33,7 +45,11 @@ namespace netprot {
bool jumping, bool jumping,
shooting, shooting,
hit, hit,
powerup; powerup,
dead,
still,
jumpshot,
running;
}; };
struct Input { // cli -> srv UDP ~frame struct Input { // cli -> srv UDP ~frame
@@ -58,29 +74,39 @@ namespace netprot {
uint16_t ammo = 0; uint16_t ammo = 0;
uint8_t hp = 0; uint8_t hp = 0;
Vector3f position; Vector3f position;
Sync() {}
Sync(Sync* sync) : timestamp(sync->timestamp), sid(sync->sid), timer(sync->timer), ammo(sync->ammo), hp(sync->hp), position(sync->position) {}
}; };
struct TeamInfo { // cli <-> srv TCP once struct TeamInfo { // cli <-> srv TCP once
char name[32]; char name[32];
uint64_t id = 0; uint64_t id = 0;
TeamInfo() {}
TeamInfo(TeamInfo* tem) : id(tem->id) { strcpy(tem->name, name); }
}; };
struct LoginInfo { // cli <-> srv TCP once struct LoginInfo { // cli <-> srv TCP once
char name[32]; char name[32];
uint64_t sid = 0, uint64_t sid = 0,
tid = 0; tid = 0;
LoginInfo() {}
LoginInfo(LoginInfo* ply): sid(ply->sid), tid(ply->tid) { strcpy(ply->name, name); }
}; };
struct PlayerInfo { // cli <-> srv TCP once struct PlayerInfo { // cli <-> srv TCP once
char name[32]; char name[32];
uint64_t id = 0, uint64_t id = 0,
tid = 0; tid = 0;
PlayerInfo() {}
PlayerInfo(PlayerInfo* log) : id(log->id), tid(log->tid) { strcpy(log->name, name); }
}; };
struct GameInfo { // cli <-> srv TCP event (before game start)/ once struct GameInfo { // cli <-> srv TCP event (before game start)/ once
uint64_t seed; uint64_t seed;
uint32_t countdown; uint32_t countdown;
uint8_t gameType; // TOOD: enum. uint8_t gameType; // TODD: enum.
GameInfo() {}
GameInfo(GameInfo* gam) : seed(gam->seed), countdown(gam->countdown), gameType(gam->gameType) {}
}; };
struct Chat { // cli <-> srv TCP event struct Chat { // cli <-> srv TCP event
@@ -88,11 +114,15 @@ namespace netprot {
dest_id = 0, dest_id = 0,
dest_team_id = 0; dest_team_id = 0;
char mess[140]; // Good 'nough for twitr, good 'nough for me. char mess[140]; // Good 'nough for twitr, good 'nough for me.
Chat() {}
Chat(Chat* cha) : src_id(cha->src_id), dest_id(cha->dest_id), dest_team_id(cha->dest_team_id) { strcpy(cha->mess, mess); }
}; };
struct ErrorLog { // srv -> cli TCP event struct ErrorLog { // srv -> cli TCP event
char mess[140]; char mess[140];
bool is_fatal; bool is_fatal;
ErrorLog() {};
ErrorLog(ErrorLog* err) : is_fatal(err->is_fatal) { strcpy(err->mess, mess); }
}; };
void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli
@@ -115,6 +145,61 @@ namespace netprot {
bool Deserialize(Chat* chat, char* buf, const uint32_t buflen); // srv/cli bool Deserialize(Chat* chat, char* buf, const uint32_t buflen); // srv/cli
bool Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen); // srv bool Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen); // srv
PacketType getType(char* buf, uint32_t buflen); // srv/cli PACKET_TYPE getType(char* buf, uint32_t buflen);
}
Packet getPack(char* buf, uint32_t buflen);
Packet getPack(Buffer* buf);
bool emptyPack(Packet pck);
Packet makePack(void* ptr, PACKET_TYPE type); // Pour pouvoir faire une liste de stock a supprimer sans avoir a en faire une pour chaque type.
template <class T> void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen);
template <class T> void sendPackTo(SOCKET sock, T* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad);
template <class T> void sendPack(SOCKET sock, T* pack, Buffer* buf);
template <class T> void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad);
std::vector<Packet> recvPacks(SOCKET sock, Buffer* buf);
template <class T>
void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) {
netprot::Serialize(pack, buf, buflen);
memset(&buf[*buflen], '\0', sizeof(uint64_t) + sizeof(uint8_t));
buflen += (sizeof(uint64_t) + sizeof(uint8_t));
send(sock, *buf, *buflen, 0);
*buflen = BUFFER_LENGTH;
}
template <class T>
void sendPackTo(SOCKET sock, T* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad) {
sockaddr_in addr = *sockad;
netprot::Serialize(pack, buf, buflen);
memset(&buf[*buflen], '\0', sizeof(uint64_t) + sizeof(uint8_t));
buflen += (sizeof(uint64_t) + sizeof(uint8_t));
sendto(sock, *buf, *buflen, 0, (sockaddr*)&addr, sizeof(addr));
*buflen = BUFFER_LENGTH;
}
template <class T>
void sendPack(SOCKET sock, T* pack, Buffer* buf) {
netprot::Serialize(pack, &buf->ptr, &buf->len);
memset(&buf->ptr[buf->len], '\0', sizeof(uint64_t) + sizeof(uint8_t));
buf->len += sizeof(uint64_t) + sizeof(uint8_t);
send(sock, buf->ptr, buf->len, 0);
buf->rstLen();
}
template <class T>
void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad) {
sockaddr_in addr = *sockad;
netprot::Serialize(pack, &buf->ptr, &buf->len);
memset(&buf->ptr[buf->len], '\0', sizeof(uint64_t) + sizeof(uint8_t));
buf->len += sizeof(uint64_t) + sizeof(uint8_t);
sendto(sock, buf->ptr, buf->len, 0, (sockaddr*)&addr, sizeof(addr));
buf->rstLen();
}
};
#endif #endif

View File

@@ -4,10 +4,12 @@
Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(position), m_rotX(rotX), m_rotY(rotY) { Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(position), m_rotX(rotX), m_rotY(rotY) {
m_velocity = Vector3f(0, 0, 0); m_velocity = Vector3f(0, 0, 0);
m_airborne = true; m_airborne = true;
m_hp = 0.75f; //TODO: Remettre <20> 1.0f m_hp = 1.0f; //TODO: Remettre <20> 1.0f
m_username = "Zelda Bee-Bop56"; m_username = "Zelda Bee-Bop56";
} }
Player::~Player() {}
void Player::TurnLeftRight(float value) { void Player::TurnLeftRight(float value) {
m_rotY += value; m_rotY += value;
if (m_rotY > 360) m_rotY = 0; if (m_rotY > 360) m_rotY = 0;
@@ -165,7 +167,7 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi
m_position += m_velocity; m_position += m_velocity;
static float bobbingtime = 0; // Gestion de la cam<61>ra static float bobbingtime = 0; // Gestion de la cam<61>ra
static bool leftright = false; static bool leftright = false;
static bool isStep = false; static bool isStep = false;
if (bobbingtime <= 360.f) if (bobbingtime <= 360.f)
@@ -206,3 +208,29 @@ void Player::Teleport(int& x, int& z) {
m_position.x -= x * CHUNK_SIZE_X; m_position.x -= x * CHUNK_SIZE_X;
m_position.z -= z * CHUNK_SIZE_Z; m_position.z -= z * CHUNK_SIZE_Z;
} }
bool Player::AmIDead()
{
return m_hp <= 0;
}
void Player::InflictDamage(float hitPoints)
{
m_hp -= hitPoints;
if (AmIDead())
{ // Quand le joueur est mort.
}
}
uint64_t Player::getId() const { return id; }
Vector3f Player::InterpolatePosition(const Vector3f& vec1, const Vector3f& vec2, const Timestamp& tim1, const Timestamp& tim2, const Timestamp& now) {
return Vector3f();
}

View File

@@ -12,6 +12,8 @@ public:
enum Sound { NOSOUND, STEP, FALL }; enum Sound { NOSOUND, STEP, FALL };
Player(const Vector3f& position, float rotX = 0, float rotY = 0); Player(const Vector3f& position, float rotX = 0, float rotY = 0);
~Player();
void TurnLeftRight(float value); void TurnLeftRight(float value);
void TurnTopBottom(float value); void TurnTopBottom(float value);
Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime); Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime);
@@ -26,12 +28,19 @@ public:
float GetHP() const; float GetHP() const;
void Teleport(int& x, int& z); void Teleport(int& x, int& z);
bool AmIDead();
void InflictDamage(float hitPoints);
private: private:
uint64_t getId() const;
protected:
Vector3f m_position; Vector3f m_position;
Vector3f m_velocity; Vector3f m_velocity;
Vector3f m_direction; Vector3f m_direction;
std::string m_username; std::string m_username;
uint64_t id = 0;
float m_rotX = 0; float m_rotX = 0;
float m_rotY = 0; float m_rotY = 0;
@@ -40,6 +49,9 @@ private:
float m_hp; float m_hp;
bool m_airborne; bool m_airborne;
Vector3f InterpolatePosition(const Vector3f& vec1, const Vector3f& vec2, const Timestamp& tim1, const Timestamp& tim2, const Timestamp& now);
}; };
#endif //_PLAYER_H__ #endif //_PLAYER_H__

View File

@@ -6,6 +6,12 @@ World::~World() {}
Array2d<Chunk*>& World::GetChunks() { return m_chunks; } Array2d<Chunk*>& World::GetChunks() { return m_chunks; }
void World::BuildWorld() {
for (int x = 0; x < WORLD_SIZE_X; ++x)
for (int y = 0; y < WORLD_SIZE_Y; ++y)
m_chunks.Set(x, y, new Chunk(x + m_center[0], y + m_center[1], m_seed));
}
void World::SetSeed(uint64_t seed) { void World::SetSeed(uint64_t seed) {
m_seed = seed; m_seed = seed;
} }
@@ -130,7 +136,7 @@ void World::GetScope(unsigned int& x, unsigned int& y) {
y = m_center[1]; y = m_center[1];
} }
void World::Update(Bullet* bullets[MAX_BULLETS], Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]) { void World::Update(Bullet* bullets[MAX_BULLETS], const Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]) {
UpdateWorld(player_pos, blockinfo); UpdateWorld(player_pos, blockinfo);
//TransposeWorld(player_pos, bullets); //TransposeWorld(player_pos, bullets);
} }

View File

@@ -21,6 +21,7 @@ public:
~World(); ~World();
Array2d<Chunk*>& GetChunks(); Array2d<Chunk*>& GetChunks();
void BuildWorld();
void SetSeed(uint64_t seed); void SetSeed(uint64_t seed);
@@ -30,7 +31,7 @@ public:
BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const; BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const;
BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const; BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const;
void Update(Bullet* bullets[MAX_BULLETS], Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]); void Update(Bullet* bullets[MAX_BULLETS], const Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]);
void GetScope(unsigned int& x, unsigned int& y); void GetScope(unsigned int& x, unsigned int& y);
@@ -45,7 +46,7 @@ private:
unsigned int m_center[2] = { UINT16_MAX / 2 - WORLD_SIZE_X, UINT16_MAX / 2 - WORLD_SIZE_Y }; unsigned int m_center[2] = { UINT16_MAX / 2 - WORLD_SIZE_X, UINT16_MAX / 2 - WORLD_SIZE_Y };
void UpdateChunk(int& updates, unsigned int chx, unsigned int chy, BlockInfo* blockinfo[BTYPE_LAST]); //void UpdateChunk(int& updates, unsigned int chx, unsigned int chy, BlockInfo* blockinfo[BTYPE_LAST]);
void UpdateWorld(const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]); void UpdateWorld(const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]);
void TransposeWorld(Vector3f& player, Bullet* bullets[MAX_BULLETS]); void TransposeWorld(Vector3f& player, Bullet* bullets[MAX_BULLETS]);

View File

@@ -76,6 +76,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -90,7 +91,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>Default</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -105,6 +106,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -119,6 +121,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>

View File

@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.18.4)
project(SQCSim-Server VERSION 0.1)
add_compile_options("-Wno-narrowing")
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_STANDARD_REQUIRED True)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../out")
set(SQCSIM_COMMON_DIR "../../SQCSim-common/")
add_library(SQCSim-common
"${SQCSIM_COMMON_DIR}blockinfo.cpp"
"${SQCSIM_COMMON_DIR}bullet.cpp"
"${SQCSIM_COMMON_DIR}chunk.cpp"
"${SQCSIM_COMMON_DIR}netprotocol.cpp"
"${SQCSIM_COMMON_DIR}opensimplex.cpp"
"${SQCSIM_COMMON_DIR}player.cpp"
"${SQCSIM_COMMON_DIR}transformation.cpp"
"${SQCSIM_COMMON_DIR}world.cpp"
)
add_executable(SQCSim-server
"../connection.cpp"
"../server.cpp"
"../main.cpp"
)
target_link_libraries(SQCSim-server PUBLIC SQCSim-common)

View File

@@ -4,8 +4,8 @@
Connection::Connection(SOCKET sock, Connection::Connection(SOCKET sock,
sockaddr_in sockaddr, sockaddr_in sockaddr,
netprot::LoginInfo log, LoginInfo log,
netprot::PlayerInfo play): PlayerInfo play):
m_sock(sock), m_sock(sock),
m_addr(sockaddr), m_addr(sockaddr),
m_loginfo(log), m_loginfo(log),
@@ -13,9 +13,7 @@ Connection::Connection(SOCKET sock,
} }
Connection::~Connection() { Connection::~Connection() { closesocket(m_sock); }
closesocket(m_sock);
}
uint64_t Connection::GetHash(bool self) const { return self? m_loginfo.sid: m_playinfo.id; } uint64_t Connection::GetHash(bool self) const { return self? m_loginfo.sid: m_playinfo.id; }
@@ -23,19 +21,17 @@ uint64_t Connection::GetTeamHash() const { return m_loginfo.tid; }
std::string Connection::GetName() const { return m_loginfo.name; } std::string Connection::GetName() const { return m_loginfo.name; }
void Connection::AddInput(netprot::Input in) { void Connection::AddInput(Input in) { m_input_manifest.insert({ in.timestamp, in }); }
m_input_manifest.insert({ in.timestamp, in });
}
netprot::Output* Connection::getOutput(Timestamp time) { Output* Connection::getOutput(Timestamp time) {
auto out = m_output_manifest.find(time); auto out = m_output_manifest.find(time);
if (out != m_output_manifest.end()) if (out != m_output_manifest.end())
return &out->second; return &out->second;
return nullptr; return nullptr;
} }
netprot::Sync Connection::getSync(Timestamp time) { Sync Connection::getSync(Timestamp time) {
netprot::Sync sync; Sync sync;
auto out = m_output_manifest.find(time); auto out = m_output_manifest.find(time);
if (out != m_output_manifest.end()) { if (out != m_output_manifest.end()) {
sync.timestamp = out->second.timestamp; sync.timestamp = out->second.timestamp;
@@ -45,10 +41,15 @@ netprot::Sync Connection::getSync(Timestamp time) {
return sync; 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::CleanInputManifest(Timestamp time) { void Connection::CleanInputManifest(Timestamp time) {
auto wat = m_input_manifest.find(time); auto wat = m_input_manifest.find(time);
while (wat != m_input_manifest.begin()) while (wat != m_input_manifest.begin())
m_input_manifest.erase(wat--); m_input_manifest.erase(wat--);
} }

View File

@@ -8,35 +8,40 @@
#include "../SQCSim-common/netprotocol.h" #include "../SQCSim-common/netprotocol.h"
#include "define.h" #include "define.h"
using namespace netprot;
class Connection { class Connection {
public: public:
Connection( Connection(
SOCKET sock, SOCKET sock,
sockaddr_in sockaddr, sockaddr_in sockaddr,
netprot::LoginInfo log, LoginInfo log,
netprot::PlayerInfo play); PlayerInfo play);
~Connection(); ~Connection();
Player* player = nullptr; std::unique_ptr<Player> player = nullptr;
uint64_t GetHash(bool self = true) const; uint64_t GetHash(bool self = true) const;
uint64_t GetTeamHash() const; uint64_t GetTeamHash() const;
std::string GetName() const; std::string GetName() const;
void AddInput(netprot::Input in); void AddInput(Input in);
netprot::Output* getOutput(Timestamp time); Output* getOutput(Timestamp time);
netprot::Sync getSync(Timestamp time); Sync getSync(Timestamp time);
SOCKET getSock() const;
PlayerInfo* getInfo() const;
sockaddr_in* getAddr() const;
void CleanInputManifest(Timestamp time); void CleanInputManifest(Timestamp time);
private: private:
std::map<Timestamp, netprot::Input> m_input_manifest; std::map<Timestamp, Input> m_input_manifest;
std::map<Timestamp, netprot::Output> m_output_manifest; std::map<Timestamp, Output> m_output_manifest;
std::map<Timestamp, netprot::Chat> m_chatlog; std::map<Timestamp, Chat> m_chatlog;
SOCKET m_sock; SOCKET m_sock;
sockaddr_in m_addr; sockaddr_in m_addr;
netprot::LoginInfo m_loginfo; LoginInfo m_loginfo;
netprot::PlayerInfo m_playinfo; PlayerInfo m_playinfo;
}; };
#endif #endif

View File

@@ -9,9 +9,6 @@
#define MAX_CONNECTIONS 16 #define MAX_CONNECTIONS 16
#define ID_LIST_SIZE 127 #define ID_LIST_SIZE 127
#define BUFFER_LENGTH 150 #define SRV_MANUAL_SETUP true
typedef unsigned char LogDest;
enum LOG_DEST { CONSOLE, LOGFILE, LOG_LAST };
#endif #endif

View File

@@ -1,9 +1,8 @@
#include "server.h" #include "server.h"
int main() { int main() {
Server* server = new Server(); std::unique_ptr<Server> server = std::make_unique<Server>();
if (server->Init() == 0) if (server->Init() == 0)
if (server->Ready() == 0) if (server->Ready() == 0)
server->Run(); server->Run();
delete server;
} }

View File

@@ -1,6 +1,6 @@
#include "server.h" #include "server.h"
Server::Server(LogDest log) { Server::Server(LOG_DEST log) {
m_log = log; m_log = log;
if (log == LOG_DEST::LOGFILE) { if (log == LOG_DEST::LOGFILE) {
m_logfile = std::ofstream("server.log", std::ofstream::out); m_logfile = std::ofstream("server.log", std::ofstream::out);
@@ -18,6 +18,9 @@ Server::~Server() {
closesocket(m_sock_udp); closesocket(m_sock_udp);
if (m_sock_tcp) if (m_sock_tcp)
closesocket(m_sock_tcp); closesocket(m_sock_tcp);
for (const auto& [key, player] : m_players)
closesocket(player->getSock());
m_players.clear();
#ifdef _WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
#endif #endif
@@ -65,70 +68,105 @@ int Server::Init() {
} }
int Server::Ready() { int Server::Ready() {
int nbrjoueurs = 0,
nbrconn = 0;
bool readystart = false;
do {
Log("Entrez la duree de la partie: ", false, false);
std::cin.getline(m_buf.ptr, BUFFER_LENGTH);
try {
m_game.countdown = std::stoi(m_buf.ptr);
} catch(const std::exception& e) {
Log(e.what(), true, false);
m_game.countdown = 0;
}
} while (m_game.countdown < 1);
do {
Log("Entrez le seed de la partie: ", false, false);
std::cin.getline(m_buf.ptr, BUFFER_LENGTH);
try {
m_game.seed = std::stoi(m_buf.ptr);
} catch(const std::exception& e) {
Log(e.what(), true, false);
m_game.seed = 0;
}
} while (m_game.seed < 1);
do {
Log("Entrez le nombre de joueurs: ", false, false);
std::cin.getline(m_buf.ptr, BUFFER_LENGTH);
try {
nbrjoueurs = std::stoi(m_buf.ptr);
} catch(const std::exception& e) {
Log(e.what(), true, false);
nbrjoueurs = 0;
}
if (nbrjoueurs <= 0 || nbrjoueurs > MAX_CONNECTIONS)
Log("Nombre de joueurs invalide.", true, false);
} while (nbrjoueurs <= 0 || nbrjoueurs > MAX_CONNECTIONS);
m_game.gameType = 1;
if (listen(m_sock_tcp, MAX_CONNECTIONS) < 0) { if (listen(m_sock_tcp, MAX_CONNECTIONS) < 0) {
Log("<EFBFBD>coute sur le port TCP.", true, true); Log("Ecoute sur le port TCP.", true, true);
return 1; return 1;
} }
char* buf = new char[150];
uint32_t buflen = 150;
bool readystart = false;
srand(time(NULL));
Log("<EFBFBD> l'<27>coute sur le port: " + std::to_string(SRV_PORT), false, false);
buildIdList(ID_LIST_SIZE); buildIdList(ID_LIST_SIZE);
m_game.countdown = 360; Log("A l'ecoute sur le port: " + std::to_string(SRV_PORT), false, false);
m_game.gameType = 1;
m_game.seed = 9370707;
while (!readystart) { while (!readystart) {
sockaddr_in sockad; sockaddr_in sockad;
int addrlen = sizeof(sockad); addrlen_t addrlen = sizeof(sockad);
SOCKET sock = accept(m_sock_tcp, (sockaddr*)&sockad, &addrlen); SOCKET sock = accept(m_sock_tcp, (sockaddr*)&sockad, &addrlen);
if (sock < 0) if (sock < 0)
Log("Erreur de connexion", true, false); Log("Erreur de connexion", true, false);
else if (sock > 0) { else if (sock > 0) {
std::string str = "Nouvelle connection provenant de: "; std::string str = "Nouvelle connexion provenant de: ";
char* strbuf = new char[BUFFER_LENGTH]; str.append(inet_ntop(AF_INET, &sockad.sin_addr, m_buf.ptr, m_buf.len)).append(": ").append(std::to_string(sockad.sin_port));
uint32_t strbuflen = BUFFER_LENGTH;
str.append(inet_ntop(AF_INET, &sockad.sin_addr, strbuf, strbuflen)).append(": ").append(std::to_string(sockad.sin_port)); if (recv(sock, m_buf.ptr, m_buf.len, 0) > 0) {
PlayerInfo play;
if (recv(sock, buf, buflen, 0) > 0) { Packet pck = getPack(&m_buf);
netprot::LoginInfo log; if (pck.type != PACKET_TYPE::LOGINF) {
netprot::PlayerInfo play; Log("Paquet invalide.", true, false);
if (netprot::Deserialize(&log, buf, buflen)) { if (pck.type != PACKET_TYPE::ERR)
log.sid = getUniqueId(); netprot::emptyPack(pck);
continue; // Passer au prochain appel si c'est pas un LoginInfo ou un LoginInfo invalide qui rentre.
}
LoginInfo* log = (LoginInfo*)pck.ptr;
log.tid = 0; log->sid = getUniqueId();
log->tid = 0; // TODO: À changer si on implemente un mode en equipe.
str.append(" Nom: ").append(log.name); Log(str.append(" Nom: ").append(log->name), false, false);
Log(str, false, false); str.clear();
str = "";
str.append(log.name).append(" SID: [").append(std::to_string(log.sid).append("]")); Log(str.append(log->name).append(" SID: [").append(std::to_string(log->sid).append("]")), false, false);
Log(str, false, false);
//netprot::Serialize(&log, &buf, &buflen); sendPack<LoginInfo>(sock, log, &m_buf.ptr, &m_buf.len);
//send(sock, buf, buflen, 0);
//buflen = 150;
sendPack<netprot::LoginInfo>(sock, &log, &buf, &buflen);
play.id = getUniqueId(); play.id = getUniqueId();
memcpy(play.name, log.name, std::strlen(log.name) + 1); strcpy(play.name, log->name);
play.tid = log.tid;
//netprot::Serialize(&m_game, &buf, &buflen); play.tid = log->tid;
//send(sock, buf, buflen, 0);
sendPack<netprot::GameInfo>(sock, &m_game, &buf, &buflen);
Connection* conn = new Connection(sock, sockad, log, play);
m_players[log.sid] = conn; sendPack<GameInfo>(sock, &m_game, &m_buf.ptr, &m_buf.len);
readystart = true; std::unique_ptr<Connection> conn = std::make_unique<Connection>(sock, sockad, *log, play);
for (auto& [key, player] : m_players) {
sendPack<PlayerInfo>(player->getSock(), &play, &m_buf); // Envoyer les infos de joueur distant aux joueurs d<>j<EFBFBD> connect<63>s
sendPack<PlayerInfo>(sock, player->getInfo(), &m_buf); // et envoyer les infos des joueurs distants au nouveau joueur.
} }
m_players[log->sid] = std::move(conn);
delete log;
if (++nbrconn >= nbrjoueurs)
readystart = true;
} }
} }
} }
@@ -136,14 +174,61 @@ int Server::Ready() {
} }
void Server::Run() { void Server::Run() {
Input in;
sockaddr_in sockad;
addrlen_t socklen = sizeof(sockad);
Log("Partie en cours...", false, false); Log("Debut de la partie...", false, false);
m_world = std::make_unique<World>();
m_world->SetSeed(m_game.seed);
m_world->GetChunks().Reset(nullptr);
m_world->BuildWorld();
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));
Sync sync;
sync.position = conn->player->GetPosition();
sync.hp = conn->player->GetHP();
sync.sid = key;
sync.ammo = 0;
sync.timestamp = 0;
sync.timer = m_game.countdown;
sendPack<Sync>(conn->getSock(), &sync, &m_buf);
}
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::Timestamp() { inline std::string Server::LogTimestamp() {
time_t rawtime; time_t rawtime;
struct tm timeinfo; tm timeinfo;
char buffer[80]; char buffer[50];
time(&rawtime); time(&rawtime);
@@ -161,30 +246,39 @@ inline std::string Server::Timestamp() {
void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) { void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) {
switch (m_log) { switch (m_log) {
case LOG_DEST::LOGFILE: using enum LOG_DEST; // C++20!
m_logfile << Timestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; case LOGFILE:
m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
break; break;
case LOG_DEST::CONSOLE: case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!)
default: default:
std::cout << Timestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
break; break;
} }
if (is_fatal) { if (is_fatal) {
if (m_logfile.is_open())
m_logfile.close();
if (m_sock_udp) if (m_sock_udp)
closesocket(m_sock_udp); closesocket(m_sock_udp);
if (m_sock_tcp) if (m_sock_tcp)
closesocket(m_sock_tcp); closesocket(m_sock_tcp);
for (const auto& [key, player] : m_players) {
closesocket(player->getSock());
}
m_players.clear();
#ifdef _WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
#endif #endif
exit(-1);
} }
} }
void Server::buildIdList(size_t size) { void Server::buildIdList(size_t size) {
std::set<uint64_t> lst; std::set<uint64_t> lst;
do lst.insert(((uint64_t)rand() << 25) % 8675309); // EIGHT SIX SEVENFIVE THREE AUGHT NIIIIIIiIIiiIiINE! srand(time(NULL));
do lst.insert(((uint64_t)rand() << 32 | rand()));
while (lst.size() < size); while (lst.size() < size);
m_ids = std::vector<uint64_t>(lst.begin(), lst.end()); m_ids = std::vector<uint64_t>(lst.begin(), lst.end());
@@ -195,133 +289,3 @@ uint64_t Server::getUniqueId() {
m_ids.pop_back(); m_ids.pop_back();
return id; return id;
} }
// Test serialize/deserialize:
/*
netprot::LoginInfo log, log2;
std::cout << "Nom? ";
std::cin.getline(log.name, 32); // NO! STD::CIN >> VARIABLE;! EVEEEEEERRRR!!!
log.sid = 12345;
char* buf = new char[150];
uint32_t buflen = 150;
netprot::Serialize(&log, &buf, &buflen);
bool is_work = netprot::Deserialize(&log2, buf, buflen);
std::string str;
str.append(is_work ? "Y " : "N ").append(log2.name).append(": ").append(std::to_string(log2.sid));
Log(str, false, false);
*/
///* 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<72>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<63>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;
//}
//

View File

@@ -10,9 +10,13 @@
#include "define.h" #include "define.h"
#include "connection.h" #include "connection.h"
using namespace netprot;
class Server { class Server {
public: public:
Server(LogDest log = LOG_DEST::CONSOLE); enum LOG_DEST: unsigned char { CONSOLE, LOGFILE, LOG_LAST };
Server(LOG_DEST log = LOG_DEST::CONSOLE);
~Server(); ~Server();
int Init(); int Init();
@@ -20,35 +24,31 @@ public:
void Run(); void Run();
private: private:
#ifdef _WIN32 #ifdef _WIN32
WSADATA m_wsaData; WSADATA m_wsaData;
#endif #endif
SOCKET m_sock_udp = 0, SOCKET m_sock_udp = 0,
m_sock_tcp = 0; m_sock_tcp = 0;
LogDest m_log; LOG_DEST m_log;
std::ofstream m_logfile; std::ofstream m_logfile;
std::map<uint64_t, Connection*> m_players; Buffer m_buf;
std::map <Timestamp, netprot::Chat> m_chatlog;
std::map<uint64_t, std::unique_ptr<Connection>> m_players;
std::map <Timestamp, Chat> m_chatlog;
std::vector<uint64_t> m_ids; std::vector<uint64_t> m_ids;
netprot::GameInfo m_game; GameInfo m_game;
World* m_world = nullptr; std::unique_ptr<World> m_world = nullptr;
const bool m_manual_setup = SRV_MANUAL_SETUP;
std::string Timestamp(); std::string LogTimestamp();
void Log(std::string str, bool is_error, bool is_fatal); void Log(std::string str, bool is_error, bool is_fatal);
void buildIdList(size_t size); void buildIdList(size_t size);
uint64_t getUniqueId(); uint64_t getUniqueId();
template <class T> void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen);
}; };
template <class T>
void Server::sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) {
netprot::Serialize(pack, buf, buflen);
send(sock, *buf, *buflen, 0);
*buflen = BUFFER_LENGTH;
}
#endif #endif

View File

@@ -25,13 +25,14 @@
<ClInclude Include="engine.h" /> <ClInclude Include="engine.h" />
<ClInclude Include="mesh.h" /> <ClInclude Include="mesh.h" />
<ClInclude Include="openglcontext.h" /> <ClInclude Include="openglcontext.h" />
<ClInclude Include="remoteplayer.h" />
<ClInclude Include="shader.h" /> <ClInclude Include="shader.h" />
<ClInclude Include="skybox.h" /> <ClInclude Include="skybox.h" />
<ClInclude Include="texture.h" /> <ClInclude Include="texture.h" />
<ClInclude Include="textureatlas.h" /> <ClInclude Include="textureatlas.h" />
<ClInclude Include="tool.h" /> <ClInclude Include="tool.h" />
<ClInclude Include="vertexbuffer.h" /> <ClInclude Include="vertexbuffer.h" />
<ClInclude Include="worldrenderer.h" /> <ClInclude Include="renderer.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="audio.cpp" /> <ClCompile Include="audio.cpp" />
@@ -40,13 +41,14 @@
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="mesh.cpp" /> <ClCompile Include="mesh.cpp" />
<ClCompile Include="openglcontext.cpp" /> <ClCompile Include="openglcontext.cpp" />
<ClCompile Include="remoteplayer.cpp" />
<ClCompile Include="shader.cpp" /> <ClCompile Include="shader.cpp" />
<ClCompile Include="skybox.cpp" /> <ClCompile Include="skybox.cpp" />
<ClCompile Include="texture.cpp" /> <ClCompile Include="texture.cpp" />
<ClCompile Include="textureatlas.cpp" /> <ClCompile Include="textureatlas.cpp" />
<ClCompile Include="tool.cpp" /> <ClCompile Include="tool.cpp" />
<ClCompile Include="vertexbuffer.cpp" /> <ClCompile Include="vertexbuffer.cpp" />
<ClCompile Include="worldrenderer.cpp" /> <ClCompile Include="renderer.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\SQCSim-common\SQCSim-common.vcxproj"> <ProjectReference Include="..\SQCSim-common\SQCSim-common.vcxproj">
@@ -130,7 +132,7 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -145,7 +147,7 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
@@ -162,7 +164,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<FloatingPointModel>Fast</FloatingPointModel> <FloatingPointModel>Fast</FloatingPointModel>
@@ -184,7 +186,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp20</LanguageStandard>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<FloatingPointModel>Fast</FloatingPointModel> <FloatingPointModel>Fast</FloatingPointModel>

View File

@@ -47,7 +47,10 @@
<ClInclude Include="mesh.h"> <ClInclude Include="mesh.h">
<Filter>Fichiers d%27en-tête</Filter> <Filter>Fichiers d%27en-tête</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="worldrenderer.h"> <ClInclude Include="renderer.h">
<Filter>Fichiers d%27en-tête</Filter>
</ClInclude>
<ClInclude Include="remoteplayer.h">
<Filter>Fichiers d%27en-tête</Filter> <Filter>Fichiers d%27en-tête</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
@@ -88,7 +91,10 @@
<ClCompile Include="mesh.cpp"> <ClCompile Include="mesh.cpp">
<Filter>Fichiers sources</Filter> <Filter>Fichiers sources</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="worldrenderer.cpp"> <ClCompile Include="renderer.cpp">
<Filter>Fichiers sources</Filter>
</ClCompile>
<ClCompile Include="remoteplayer.cpp">
<Filter>Fichiers sources</Filter> <Filter>Fichiers sources</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>

View File

@@ -2,17 +2,17 @@
Audio::Audio() { Audio::Audio() {
m_engine = irrklang::createIrrKlangDevice(); m_engine = irrklang::createIrrKlangDevice();
m_engine->setDopplerEffectParameters(1); m_engine->setDopplerEffectParameters(10);
m_engine->setRolloffFactor(1); m_engine->setRolloffFactor(2);
m_engine->setDefault3DSoundMinDistance(1); m_engine->setDefault3DSoundMinDistance(.1);
m_engine->setDefault3DSoundMaxDistance(1000); m_engine->setDefault3DSoundMaxDistance(1000);
} }
Audio::Audio(const char * music) { Audio::Audio(const char * music) {
m_engine = irrklang::createIrrKlangDevice(); m_engine = irrklang::createIrrKlangDevice();
m_engine->setDopplerEffectParameters(1); m_engine->setDopplerEffectParameters(1);
m_engine->setRolloffFactor(1); m_engine->setRolloffFactor(2);
m_engine->setDefault3DSoundMinDistance(1); m_engine->setDefault3DSoundMinDistance(.1);
m_engine->setDefault3DSoundMaxDistance(1000); m_engine->setDefault3DSoundMaxDistance(1000);
m_music = m_engine->play2D(music, false, true, true, irrklang::ESM_STREAMING); m_music = m_engine->play2D(music, false, true, true, irrklang::ESM_STREAMING);
} }
@@ -28,10 +28,11 @@ void Audio::Update3DAudio(Vector3f pos, Vector3f dir, Vector3f vel) {
irrklang::vec3df(vel.x, vel.y, vel.z)); irrklang::vec3df(vel.x, vel.y, vel.z));
} }
void Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, float volume = 1) { irrklang::ISound* Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, bool is_looped = false, float volume = 1) {
sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), false, false, true, irrklang::ESM_NO_STREAMING, true); sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), is_looped, false, true, is_looped? irrklang::ESM_STREAMING: irrklang::ESM_NO_STREAMING, true);
sound->setVelocity(irrklang::vec3df(vel.x, vel.y, vel.z)); sound->setVelocity(irrklang::vec3df(vel.x, vel.y, vel.z));
sound->setVolume(volume); sound->setVolume(volume);
return sound;
} }
void Audio::Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume = 1) { void Audio::Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume = 1) {

View File

@@ -1,24 +1,30 @@
#ifndef AUDIO_H__ #ifndef AUDIO_H__
#define AUDIO_H__ #define AUDIO_H__
#ifdef _WIN32
#include <irrKlang.h> #include <irrKlang.h>
#include <ik_ISoundSource.h> #include <ik_ISoundSource.h>
#else
#include "./external/irrKlang-64bit-1.6.0/include/irrKlang.h"
#include "./external/irrKlang-64bit-1.6.0/include/ik_ISoundSource.h"
#endif
#include "../SQCSim-common/vector3.h" #include "../SQCSim-common/vector3.h"
#include "define.h" #include "define.h"
class Audio { class Audio {
private: private:
irrklang::ISoundEngine* m_engine;
irrklang::ISound* m_music; irrklang::ISound* m_music;
public: public:
Audio(); Audio();
Audio(const char* music); Audio(const char* music);
~Audio(); ~Audio();
irrklang::ISoundEngine* m_engine;
void Update3DAudio(Vector3f pos, Vector3f dir, Vector3f speed); void Update3DAudio(Vector3f pos, Vector3f dir, Vector3f speed);
void Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, float volume); irrklang::ISound* Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, bool is_looped, float volume);
void Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume); void Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume);

View File

@@ -0,0 +1,69 @@
cmake_minimum_required(VERSION 3.18.4)
project(SQCSim-Client VERSION 0.8)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_STANDARD_REQUIRED True)
set(CMAKE_BUILD_DIRECTORY "./build")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../")
set(SQCSIM_COMMON_DIR "../../SQCSim-common/")
set(SQCSIM_EXTERN_DIR "../external/")
find_package(SFML COMPONENTS system window graphics REQUIRED)
find_package(DevIL REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_library(IRRKLANG_LIBRARY
NAMES libIrrKlang.so
PATHS "${SQCSIM_EXTERN_DIR}/irrKlang-64bit-1.6.0/lib/linux-gcc-64/")
include_directories(
${SQCSIM_EXTERN_DIR}/irrKlang-64bit-1.6.0/include/
${SFML_INCLUDE_DIRS}
${IL_INCLUDE_DIR}
)
add_library(SQCSim-common
"${SQCSIM_COMMON_DIR}blockinfo.cpp"
"${SQCSIM_COMMON_DIR}bullet.cpp"
"${SQCSIM_COMMON_DIR}chunk.cpp"
"${SQCSIM_COMMON_DIR}netprotocol.cpp"
"${SQCSIM_COMMON_DIR}opensimplex.cpp"
"${SQCSIM_COMMON_DIR}player.cpp"
"${SQCSIM_COMMON_DIR}transformation.cpp"
"${SQCSIM_COMMON_DIR}world.cpp"
)
add_executable(SQCSim-client
"../audio.cpp"
"../connector.cpp"
"../engine.cpp"
"../mesh.cpp"
"../openglcontext.cpp"
"../shader.cpp"
"../skybox.cpp"
"../texture.cpp"
"../textureatlas.cpp"
"../tool.cpp"
"../vertexbuffer.cpp"
"../renderer.cpp"
"../remoteplayer.cpp"
"../main.cpp"
)
target_link_libraries(SQCSim-client PUBLIC SQCSim-common
${IRRKLANG_LIBRARY}
sfml-system
sfml-window
sfml-graphics
GL
GLU
GLEW
${IL_LIBRARIES}
${ILU_LIBRARIES}
)

View File

@@ -42,7 +42,7 @@ int Connector::Init() {
return 0; return 0;
} }
int Connector::Connect(char* srv_addr, std::string name) { int Connector::Connect(const char* srv_addr, std::string name) {
sockaddr_in add; sockaddr_in add;
m_srvsockaddr.sin_family = AF_INET; m_srvsockaddr.sin_family = AF_INET;
m_srvsockaddr.sin_port = htons(SRV_PORT); m_srvsockaddr.sin_port = htons(SRV_PORT);
@@ -54,44 +54,60 @@ int Connector::Connect(char* srv_addr, std::string name) {
if (connect(m_sock_tcp, (sockaddr*)&m_srvsockaddr, sizeof(m_srvsockaddr)) < 0) { if (connect(m_sock_tcp, (sockaddr*)&m_srvsockaddr, sizeof(m_srvsockaddr)) < 0) {
std::cout << "<EFBFBD>chec de la connexion." << std::endl; std::cout << "<EFBFBD>chec de la connexion." << std::endl;
}
char* buf = new char[150];
uint32_t buflen = 150;
netprot::LoginInfo log;
memcpy(&log.name, name.c_str(), name.size() + 1);
netprot::Serialize(&log, &buf, &buflen);
int se = send(m_sock_tcp, buf, buflen, 0);
delete[] buf;
buf = new char[150] {0};
buflen = 150;
int rpack = 0;
while (rpack < 2) {
recv(m_sock_tcp, buf, buflen, 0);
switch (netprot::getType(buf, buflen)) {
case netprot::PACKET_TYPE::LOGINF:
if (!netprot::Deserialize(&m_loginfo, buf, buflen)) {
std::cout << "Packet LoginInfo invalide." << std::endl;
return 2; return 2;
} }
++rpack;
break; flag_t flag = 1;
case netprot::PACKET_TYPE::GAMEINFO: if (ioctl(m_sock_tcp, SOCK_NONBLOCK, &flag) < 0) {
if (!netprot::Deserialize(&m_gameinfo, buf, buflen)) { std::cout << "Impossible de mettre le socket en mode non-bloquant." << std::endl;
std::cout << "Packet GameInfo invalide." << std::endl;
return 3; return 3;
} }
++rpack;
netprot::Buffer bf;
netprot::LoginInfo log;
strcpy(log.name, name.c_str());
netprot::sendPack(m_sock_tcp, &log, &bf);
bool ready = false;
int errors = 0;
std::vector<netprot::Packet> lsPck;
while (!ready) {
lsPck = netprot::recvPacks(m_sock_tcp, &bf);
for (auto& pck : lsPck) {
bool bypass_delete = false;
netprot::PlayerInfo* pl = nullptr;
switch (pck.type) {
using enum netprot::PACKET_TYPE;
case LOGINF:
m_loginfo = netprot::LoginInfo((netprot::LoginInfo*)pck.ptr);
break;
case GAMEINFO:
m_gameinfo = netprot::GameInfo((netprot::GameInfo*)pck.ptr);
break;
case PLAYINF:
pl = (netprot::PlayerInfo*)pck.ptr;
m_players[pl->id] = pl;
bypass_delete = true;
break;
case TEAMINF:
// TODO: Faire dequoi avec TeamInfo si on fini par avoir des teams.
break;
case SYNC:
m_origin = netprot::Sync((netprot::Sync*)pck.ptr);
ready = true;
break; break;
default: default:
std::cout << "Packet invalide." << std::endl; errors++;
break; break;
} }
if (!bypass_delete)
netprot::emptyPack(pck);
}
lsPck.clear();
if (errors > 100)
return 4;
} }
return 0; return 0;
} }
@@ -99,3 +115,5 @@ int Connector::Connect(char* srv_addr, std::string name) {
uint64_t Connector::getId() const { return m_loginfo.sid; } uint64_t Connector::getId() const { return m_loginfo.sid; }
unsigned int Connector::getSeed() const { return m_gameinfo.seed; } unsigned int Connector::getSeed() const { return m_gameinfo.seed; }
netprot::Sync Connector::getOrigin() const { return m_origin; }

View File

@@ -11,26 +11,32 @@ public:
~Connector(); ~Connector();
int Init(); int Init();
int Connect(char* srv_addr, std::string name); int Connect(const char* srv_addr, std::string name);
uint64_t getId() const; uint64_t getId() const;
unsigned int getSeed() const; unsigned int getSeed() const;
netprot::Sync getOrigin() const;
//void SendInput(); //void SendInput();
//int Sync(); //int Sync();
SOCKET m_sock_udp = 0,
m_sock_tcp = 0;
sockaddr_in m_srvsockaddr;
// void updateRemotePlayers(std::map<RemotePlayers> rplayers);
std::map<uint64_t, netprot::PlayerInfo> m_players;
private: private:
#ifdef _WIN32 #ifdef _WIN32
WSADATA m_wsaData; WSADATA m_wsaData;
#endif #endif
std::map<Timestamp, netprot::Input> m_inputmanifest; std::map<Timestamp, netprot::Input> m_inputmanifest;
std::map<uint64_t, netprot::PlayerInfo> m_players;
std::map<uint64_t, netprot::TeamInfo> m_teams; std::map<uint64_t, netprot::TeamInfo> m_teams;
netprot::LoginInfo m_loginfo; netprot::LoginInfo m_loginfo;
netprot::GameInfo m_gameinfo; netprot::GameInfo m_gameinfo;
netprot::Sync m_origin;
sockaddr_in m_srvsockaddr;
SOCKET m_sock_udp = 0,
m_sock_tcp = 0;
}; };
#endif #endif

View File

@@ -6,26 +6,33 @@
#include <iostream> #include <iostream>
#include <chrono> #include <chrono>
#include <iomanip> #include <iomanip>
#include <GL/glew.h>
#include <SFML/Window.hpp> #include <SFML/Window.hpp>
#include <SFML/Graphics.hpp> #include <SFML/Graphics.hpp>
#include "../SQCSim-common/define.h" #include "../SQCSim-common/define.h"
#ifdef _WIN32 #ifdef _WIN32
#include <GL/glew.h>
#include <gl/GL.h> #include <gl/GL.h>
#include <gl/GLU.h> #include <gl/GLU.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <climits>
#endif #endif
#define NETWORK_TEST false
#define SRV_ADDR "127.0.0.1" #define SRV_ADDR "127.0.0.1"
#define COUNTDOWN 300 #define COUNTDOWN 300
#define BASE_WIDTH 1600 #define BULLET_UPDATES_PER_FRAME 20
#define BASE_HEIGHT 900
#define BASE_WIDTH 640
#define BASE_HEIGHT 480
#define TEXTURE_PATH "./media/textures/" #define TEXTURE_PATH "./media/textures/"
#define SHADER_PATH "./media/shaders/" #define SHADER_PATH "./media/shaders/"
#define AUDIO_PATH "./media/audio/" #define AUDIO_PATH "./media/audio/"
#define CHUNK_PATH "./media/chunks/" #define CHUNK_PATH "./media/chunks/"
#define MENU_ITEM_PATH "./media/menu_items/"
#endif // DEFINE_H__ #endif // DEFINE_H__

View File

View File

@@ -0,0 +1 @@

View File

@@ -26,13 +26,265 @@ Engine::~Engine() {
m_world.GetChunks().Get(x, y)->~Chunk(); m_world.GetChunks().Get(x, y)->~Chunk();
} }
void Engine::DrawSplachScreen()
{
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
// Définir la matrice de projection en mode orthographique
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(-Width() / 2, Width() / 2, -Height() / 2, Height() / 2, -1, 1);
// Définir la matrice de modèle-vue
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// L'image sera centrée autour de l'origine (0, 0, 0)
int imageWidth = Width(); // Remplacez par la largeur de votre image
int imageHeight = Height(); // Remplacez par la hauteur de votre image
// Texture
SplachScreenTexture.Bind();
// Dessiner un quadrilatère centré
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(-imageWidth / 2, -imageHeight / 2);
glTexCoord2f(1, 0);
glVertex2i(imageWidth / 2, -imageHeight / 2);
glTexCoord2f(1, 1);
glVertex2i(imageWidth / 2, imageHeight / 2);
glTexCoord2f(0, 1);
glVertex2i(-imageWidth / 2, imageHeight / 2);
glEnd();
// Activer la transparence
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
glEnable(GL_BLEND);
// Restaurer les matrices précédentes
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
void Engine::DrawMenu()
{
static const int sTitle = 400;
static const int sButton = 225;
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, Width(), 0, Height(), -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
MenuBGTexture.Bind();
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 0);
glTexCoord2f(1, 0);
glVertex2i(Width(), 0); //
glTexCoord2f(1, 1);
glVertex2i(Width(), Height());
glTexCoord2f(0, 1);
glVertex2i(0, Height());
glEnd();
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
glEnable(GL_BLEND);
if (m_gamestate != GameState::OPTIONS)
{
MenuTitleTexture.Bind();
glTranslated(200, 300, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 200);
glTexCoord2f(1, 0);
glVertex2i(sTitle, 200);
glTexCoord2f(1, 1);
glVertex2i(sTitle, 300);
glTexCoord2f(0, 1);
glVertex2i(0, 300);
glEnd();
MenuStartTexture.Bind();
glTranslated(80, -225, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 100);
glTexCoord2f(1, 0);
glVertex2i(sButton , 100);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
/*MenuResumeTexture.Bind();
glTranslated(0, -100, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
//glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();*/
/*MenuOptionsTexture.Bind();
glTranslated(0, -100, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();*/
MenuQuitTexture.Bind();
glTranslated(0, -100, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 100);
glTexCoord2f(1, 0);
glVertex2i(sButton, 100);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
}
else
{
/*MenuOptionsTexture.Bind();
glTranslated(200, 0, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 0);
glTexCoord2f(1, 0);
glVertex2i(sTitle, 0);
glTexCoord2f(1, 1);
glVertex2i(sTitle, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
WireFrameTexture.Bind();
glTranslated(0, 300, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
OnOffBtnTexture.Bind();
glTranslated(200, 0, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
glTranslated(-400, -300, 0);
MusicTexture.Bind();
glTranslated(200, 200, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
OnOffBtnTexture.Bind();
glTranslated(200, 0, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 125);
glTexCoord2f(1, 0);
glVertex2i(sButton, 125);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();
BackBtnTexture.Bind();
glTranslated(-375, 175, 0);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2i(0, 140);
glTexCoord2f(1, 0);
glVertex2i(sButton, 140);
glTexCoord2f(1, 1);
glVertex2i(sButton, 200);
glTexCoord2f(0, 1);
glVertex2i(0, 200);
glEnd();*/
}
//glEnable(GL_LIGHTING);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
ShowCursor();
}
void Engine::Init() { void Engine::Init() {
GLenum glewErr = glewInit(); GLenum glewErr = glewInit();
if (glewErr != GLEW_OK) { if (glewErr != GLEW_OK) {
std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl; std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl;
abort(); abort();
} }
uint64_t seed = SEED;
char ch;
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
@@ -51,6 +303,7 @@ void Engine::Init() {
glDisable(GL_BLEND); glDisable(GL_BLEND);
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);
// //
// 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);
@@ -59,22 +312,54 @@ void Engine::Init() {
//m_audio.ToggleMusicState(); //m_audio.ToggleMusicState();
// Array pour les balles. // Array pour les balles.
for (int x = 0; x < MAX_BULLETS; ++x) for (int x = 0; x < MAX_BULLETS; ++x) {
m_bullets[x] = nullptr; m_bullets[x] = nullptr;
m_whoosh[x] = nullptr;
}
std::cout << "Jouer en ligne? [o/N] ";
std::cin >> ch;
std::cout << std::endl;
if (ch == 'o' || ch == 'O') {
char* input = new char[32];
std::string playname, srvname;
while (playname.size() < 1) {
std::cout << "Veuillez entrer un nom de joueur: ";
std::cin.ignore();
std::cin.getline(input, 32);
std::cout << std::endl;
playname = input;
if (playname.size() < 1 || playname.size() > 32)
std::puts("Nom invalide.");
}
while (srvname.size() < 1) {
std::cout << "Veuillez entrer une adresse de serveur: ";
std::cin.getline(input, 32);
std::cout << std::endl;
srvname = input;
if (srvname.size() < 1 || srvname.size() > 32)
std::puts("Adresse serveur invalide.");
}
delete[] input;
uint64_t seed = SEED;
std::string playname = "La Chienne <20> Jacques";
if (NETWORK_TEST) { // Test connexion r<>seau.
if (!m_conn.Init()) { if (!m_conn.Init()) {
if (!m_conn.Connect(SRV_ADDR, playname)) { if (!m_conn.Connect(srvname.c_str(), playname)) {
// setup jeu en r<EFBFBD>seau. // setup jeu en reseau.
std::cout << "ID re<EFBFBD>u du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl;
std::cout << "Seed re<EFBFBD>u du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl;
m_player = Player(m_conn.getOrigin().position);
for (auto& [key, player] : m_conn.m_players)
m_players[key] = new RemotePlayer(player);
seed = m_conn.getSeed(); seed = m_conn.getSeed();
m_networkgame = true;
} }
else std::cout << "Erreur de connexion." << std::endl; else std::cout << "Erreur de connexion." << std::endl;
} }
else std::cout << "Erreur de cr<EFBFBD>ation de socket." << std::endl; else std::cout << "Erreur de creation de socket." << std::endl;
} }
m_world.SetSeed(seed); m_world.SetSeed(seed);
@@ -98,6 +383,12 @@ void Engine::LoadResource() {
LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false);
LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false); LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false);
LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png");
LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png");
LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png");
LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png");
LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png");
LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png");
TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png"); TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png");
TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png"); TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png");
TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png"); TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png");
@@ -132,6 +423,12 @@ void Engine::LoadResource() {
void Engine::UnloadResource() {} void Engine::UnloadResource() {}
void Engine::InstantDamage()
{
m_player.InflictDamage(0.10f);
m_damage = false;
}
void Engine::SystemNotification(std::string systemLog) { void Engine::SystemNotification(std::string systemLog) {
std::string message = ""; std::string message = "";
@@ -289,6 +586,7 @@ void Engine::DisplayPovGun() {
void Engine::DisplayCurrentItem() { void Engine::DisplayCurrentItem() {
} }
void Engine::DisplayHud(int timer) { void Engine::DisplayHud(int timer) {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glLoadIdentity(); glLoadIdentity();
@@ -326,7 +624,9 @@ void Engine::DisplayHud(int timer) {
glVertex2f(fPosX, fBarPosY); glVertex2f(fPosX, fBarPosY);
glEnd(); glEnd();
// Current HP //TODO: Associer avec mechanique de vie du joueur
// Barre HP
glColor3f(0.0f * facteurOmbrage, 1.0f * facteurOmbrage, 0.0f * facteurOmbrage); glColor3f(0.0f * facteurOmbrage, 1.0f * facteurOmbrage, 0.0f * facteurOmbrage);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glVertex2f(fPosX, fBarPosY - fBarHeight); glVertex2f(fPosX, fBarPosY - fBarHeight);
@@ -354,7 +654,7 @@ void Engine::DisplayHud(int timer) {
glTexCoord2f(0, 1); glVertex2i(0, fEquipHeight); glTexCoord2f(0, 1); glVertex2i(0, fEquipHeight);
glEnd(); glEnd();
glDisable(GL_BLEND); //glDisable(GL_BLEND);
// Username // Username
glEnable(GL_BLEND); glEnable(GL_BLEND);
@@ -523,6 +823,7 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) {
glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBlendEquation(GL_FUNC_ADD); glBlendEquation(GL_FUNC_ADD);
glEnable(GL_BLEND);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
@@ -603,6 +904,7 @@ std::pair<float, float> Engine::GetScale() const {
} }
int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; } int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; }
int Engine::GetCountdown(float elapsedTime) { int Engine::GetCountdown(float elapsedTime) {
if (m_resetcountdown) if (m_resetcountdown)
{ {
@@ -617,6 +919,16 @@ int Engine::GetCountdown(float elapsedTime) {
} }
void Engine::Render(float elapsedTime) { void Engine::Render(float elapsedTime) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
m_time_SplashScreen += elapsedTime;
if(m_time_SplashScreen < 2)
DrawSplachScreen();
else if (m_gamestate == GameState::PLAY)
{
HideCursor();
CenterMouse(); //D<>placement de centermouse dans l'action de jouer
//static float gameTime = elapsedTime; //static float gameTime = elapsedTime;
static irrklang::ISound* step; // Pour les sons de pas. static irrklang::ISound* step; // Pour les sons de pas.
static float pollTime = 0; static float pollTime = 0;
@@ -631,7 +943,6 @@ void Engine::Render(float elapsedTime) {
Transformation all; Transformation all;
Transformation skybox; Transformation skybox;
Vector3f vstep; Vector3f vstep;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Transformations initiales // Transformations initiales
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
@@ -648,16 +959,16 @@ void Engine::Render(float elapsedTime) {
if (leftright) if (leftright)
vstep = Vector3f(m_player.GetPosition().x + m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z + m_player.GetDirection().x); vstep = Vector3f(m_player.GetPosition().x + m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z + m_player.GetDirection().x);
else vstep = Vector3f(m_player.GetPosition().x - m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z - m_player.GetDirection().x); else vstep = Vector3f(m_player.GetPosition().x - m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z - m_player.GetDirection().x);
m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), .8f); m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), false,.8f);
leftright = !leftright; leftright = !leftright;
break; break;
case Player::Sound::FALL: case Player::Sound::FALL:
m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), 1.f); m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), false,1.f);
break; break;
default: break; default: break;
} }
m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonn<EFBFBD>es du joueur et m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonnees du joueur et
// son vecteur de v<EFBFBD>locit<EFBFBD> (pour l'effet Doppler) // son vecteur de velocite (pour l'effet Doppler)
pollTime = 0; pollTime = 0;
} }
@@ -669,7 +980,7 @@ void Engine::Render(float elapsedTime) {
if (m_mouseWU) bloc++; if (m_mouseWU) bloc++;
else if (m_mouseWD) bloc--; else if (m_mouseWD) bloc--;
if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1; if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1;
else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST <20>quipe l'arme. else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST <20>quipe l'arme.
m_mouseWU = m_mouseWD = false; m_mouseWU = m_mouseWD = false;
if (m_mouseL) { if (m_mouseL) {
@@ -681,12 +992,12 @@ void Engine::Render(float elapsedTime) {
m_bullets[x] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection()); m_bullets[x] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection());
break; break;
} }
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<EFBFBD>re balle de l'array. else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la première balle de l'array.
m_bullets[0]->~Bullet(); m_bullets[0]->~Bullet();
m_bullets[0] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection()); m_bullets[0] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection());
} }
bulletTime = .1f; bulletTime = BULLET_TIME;
m_audio.Create3DAudioObj(m_powpow, AUDIO_PATH "windowsaccount.wav", m_player.GetPOV(), m_player.GetDirection() * 10, .5f); m_audio.Create3DAudioObj(m_powpow, AUDIO_PATH "pow.wav", m_player.GetPOV(), m_player.GetDirection() * 10, false, .5f);
if (m_flash) { // Coupe le rendering et affiche un frame blanc, pour simuler un flash. if (m_flash) { // Coupe le rendering et affiche un frame blanc, pour simuler un flash.
glClearColor(.8f, .8f, .8f, 1.f); glClearColor(.8f, .8f, .8f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@@ -698,37 +1009,80 @@ void Engine::Render(float elapsedTime) {
else if (m_mouseR) else if (m_mouseR)
m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player.GetPosition(), m_player.GetDirection(), m_block); m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player.GetPosition(), m_player.GetDirection(), m_block);
for (int x = 0; x < MAX_BULLETS; ++x) // Array de bullets en jeu. for (int x = 0; x < MAX_BULLETS; ++x) { // Array de bullets en jeu.
if (m_bullets[x]) if (m_bullets[x]) {
if (m_bullets[x]->Update(&m_world, elapsedTime)) { for (int b = 0; b < BULLET_UPDATES_PER_FRAME; ++b) {
if (m_bullets[x]->Update(&m_world, elapsedTime, BULLET_UPDATES_PER_FRAME, m_players)) {
m_bullets[x]->~Bullet(); m_bullets[x]->~Bullet();
if (m_whoosh[x])
m_whoosh[x]->drop();
m_bullets[x] = nullptr; m_bullets[x] = nullptr;
m_whoosh[x] = nullptr;
break;
}
else if (!m_whoosh[x]) {
m_whoosh[x] = m_audio.Create3DAudioObj(m_whoosh[x], AUDIO_PATH "noise.wav", m_bullets[x]->getPos(), m_bullets[x]->getVel(), true, (m_bullets[x]->getPos() - m_player.GetPosition()).Length());
}
else {
Vector3f pos = m_bullets[x]->getPos(), vel = m_bullets[x]->getVel();
m_audio.Render3DAudioObj(m_whoosh[x], pos, vel, 5 - (m_bullets[x]->getPos() - m_player.GetPosition()).Length());
}
}
}
} }
m_wrenderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas);
m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo); m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo);
m_wrenderer.UpdateWorld(&m_world, m_player.GetPosition(), m_blockinfo); m_renderer.UpdateMesh(&m_world, m_player.GetPosition(), m_blockinfo);
if (m_isSkybox) m_skybox.Render(skybox); if (m_isSkybox) m_skybox.Render(skybox);
DrawHud(elapsedTime, bloc); DrawHud(elapsedTime, bloc);
DisplayPovGun(); DisplayPovGun();
ProcessNotificationQueue(); ProcessNotificationQueue();
if (m_damage)
/*if (m_soloMultiChoiceMade) { {
DisplaySingleOrMultiplayerMenu(); InstantDamage();
}*/ }
static bool fell = false; static bool fell = false;
if (m_player.GetPosition().y < 1.7f && !fell) { if (m_player.GetPosition().y < 1.7f && !fell) {
m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f); m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), false,1.f);
fell = true; fell = true;
} }
else if (m_player.GetPosition().y < -20.f) { else if (m_player.GetPosition().y < -20.f) {
m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); // Respawn si le bonho- joueur tombe en bas du monde. m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); // Respawn si le bonho- joueur tombe en bas du monde.
fell = false; fell = false;
} }
if (m_networkgame) {
static char* buf = new char[BUFFER_LENGTH];
uint32_t buflen = BUFFER_LENGTH;
netprot::Input input;
//sockaddr_in addr = m_conn.m_srvsockaddr;
input.direction = m_player.GetDirection();
input.sid = m_conn.getId();
input.timestamp = 12345;
input.keys.forward = m_keyW;
input.keys.backward = m_keyS;
input.keys.left = m_keyA;
input.keys.right = m_keyD;
input.keys.jump = m_keySpace;
input.keys.block = m_mouseR;
input.keys.shoot = m_mouseL;
//netprot::Serialize(&input, &buf, &buflen);
//sendto(m_conn.m_sock_udp, buf, buflen, 0, (sockaddr*)&addr, sizeof(addr));
netprot::sendPackTo<netprot::Input>(m_conn.m_sock_udp, &input, &buf, &buflen, &m_conn.m_srvsockaddr);
}
}
else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS)
{
DrawMenu();
}
else if (m_gamestate == GameState::QUIT)
Stop();
} }
void Engine::KeyPressEvent(unsigned char key) { void Engine::KeyPressEvent(unsigned char key) {
@@ -754,14 +1108,15 @@ void Engine::KeyPressEvent(unsigned char key) {
} }
break; break;
case 36: // ESC - Quitter case 36: // ESC - Quitter
Stop(); m_gamestate = GameState::MAIN_MENU;
//Stop();
break; break;
case 57: // Space - Sauter case 57: // Space - Sauter
if (!m_keySpace) { if (!m_keySpace) {
m_keySpace = true; m_keySpace = true;
} }
break; break;
case 94: // F10 - Plein <20>cran case 94: // F10 - Plein <20>cran
IsFullscreen() ? SetFullscreen(false) : SetFullscreen(true); IsFullscreen() ? SetFullscreen(false) : SetFullscreen(true);
//SetFullscreen(!IsFullscreen()); //SetFullscreen(!IsFullscreen());
break; break;
@@ -771,7 +1126,7 @@ void Engine::KeyPressEvent(unsigned char key) {
break; break;
case 10: // K - Debugging DisplayNotification() case 10: // K - Debugging DisplayNotification()
m_keyK = true; m_keyK = true;
m_messageNotification = "notifications systeme peuvent <EFBFBD>tre affich<EFBFBD>"; m_messageNotification = "notifications systeme peuvent etre affichees";
break; break;
case 11: // L - Debugging DisplayNotification() case 11: // L - Debugging DisplayNotification()
m_keyL = true; m_keyL = true;
@@ -784,6 +1139,10 @@ void Engine::KeyPressEvent(unsigned char key) {
break; break;
case 8: // I - Ignorer case 8: // I - Ignorer
break; break;
case 9: // J - InstantDamage
m_damage = true;
case 15: // P - Ignorer
break;
case 17: // R - Ignorer case 17: // R - Ignorer
break; break;
case 19: // T - Ignorer case 19: // T - Ignorer
@@ -833,6 +1192,17 @@ void Engine::KeyReleaseEvent(unsigned char key) {
case 12: // M - Toggle music case 12: // M - Toggle music
m_audio.ToggleMusicState(); m_audio.ToggleMusicState();
break; break;
case 15:
for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow").
if (!m_bullets[x]) {
m_bullets[x] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f,0.f,1.f));
break;
}
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<6D>re balle de l'array.
m_bullets[0]->~Bullet();
m_bullets[0] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f, 0.f, 1.f));
}
break;
case 17: // R - Toggle skybox case 17: // R - Toggle skybox
m_isSkybox = !m_isSkybox; m_isSkybox = !m_isSkybox;
break; break;
@@ -863,18 +1233,22 @@ void Engine::MouseMoveEvent(int x, int y) {
m_player.TurnLeftRight(x - (Width() / 2)); m_player.TurnLeftRight(x - (Width() / 2));
m_player.TurnTopBottom(y - (Height() / 2)); m_player.TurnTopBottom(y - (Height() / 2));
// Centrer la souris seulement si elle n'est pas d<>j<EFBFBD> centr<74>e // Centrer la souris seulement si elle n'est pas d<>j<EFBFBD> centr<74>e
// Il est n<>cessaire de faire la v<>rification pour <20>viter de tomber // Il est n<>cessaire de faire la v<>rification pour <20>viter de tomber
// dans une boucle infinie o<> l'appel <20> CenterMouse g<>n<EFBFBD>re un // dans une boucle infinie o<> l'appel <20> CenterMouse g<>n<EFBFBD>re un
// MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre // MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre
// MouseMoveEvent, etc // MouseMoveEvent, etc
if (x == (Width() / 2) && y == (Height() / 2)) if (x == (Width() / 2) && y == (Height() / 2))
return; return;
CenterMouse();
} }
void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) {
m_mousemx = x;
m_mousemy = y;
if (m_gamestate == GameState::PLAY)
{
switch (button) { switch (button) {
case MOUSE_BUTTON_LEFT: case MOUSE_BUTTON_LEFT:
m_mouseL = true; m_mouseL = true;
@@ -893,6 +1267,14 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) {
break; break;
case MOUSE_BUTTON_NONE: break; case MOUSE_BUTTON_NONE: break;
} }
}
else if (m_gamestate == GameState::MAIN_MENU)
{
if ((m_mousemx >= 285 && m_mousemx <= 490) && (m_mousemy >= 150 && m_mousemy <= 250))
m_gamestate = GameState::PLAY;
if ((m_mousemx >= 305 && m_mousemx <= 450) && (m_mousemy >= 300 && m_mousemy <= 400))
m_gamestate = GameState::QUIT;
}
} }
void Engine::MouseReleaseEvent(const MOUSE_BUTTON& button, int x, int y) { void Engine::MouseReleaseEvent(const MOUSE_BUTTON& button, int x, int y) {

View File

@@ -18,12 +18,15 @@
#include "audio.h" #include "audio.h"
#include "textureatlas.h" #include "textureatlas.h"
#include "connector.h" #include "connector.h"
#include "worldrenderer.h" #include "renderer.h"
#include "remoteplayer.h"
class Engine : public OpenglContext { class Engine : public OpenglContext {
public: public:
Engine(); Engine();
virtual ~Engine(); virtual ~Engine();
virtual void DrawMenu();
virtual void DrawSplachScreen();
virtual void Init(); virtual void Init();
virtual void DeInit(); virtual void DeInit();
virtual void LoadResource(); virtual void LoadResource();
@@ -43,6 +46,7 @@ private:
bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps = true, bool stopOnError = true); bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps = true, bool stopOnError = true);
void InstantDamage();
void SystemNotification(std::string systemLog); void SystemNotification(std::string systemLog);
void KillNotification(Player killer, Player killed); void KillNotification(Player killer, Player killed);
void DisplayNotification(std::string message); void DisplayNotification(std::string message);
@@ -62,7 +66,7 @@ private:
TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST); TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST);
World m_world = World(); World m_world = World();
WorldRenderer m_wrenderer = WorldRenderer(); Renderer m_renderer = Renderer();
Texture m_textureCrosshair; Texture m_textureCrosshair;
Texture m_textureFont; Texture m_textureFont;
@@ -75,19 +79,37 @@ private:
Skybox m_skybox; Skybox m_skybox;
Audio m_audio = Audio(AUDIO_PATH "start.wav"); Audio m_audio = Audio(AUDIO_PATH "start.wav");
irrklang::ISound* m_powpow; irrklang::ISound* m_powpow,
irrklang::ISound* m_scream; * m_scream;
irrklang::ISound *m_whoosh[MAX_BULLETS];
Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f));
Bullet* m_bullets[MAX_BULLETS]; Bullet* m_bullets[MAX_BULLETS];
std::map<uint64_t, Player*> m_players;
//Menu
enum class GameState: uint8_t { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY };
GameState m_gamestate = GameState::MAIN_MENU;
Texture MenuTitleTexture;
Texture MenuBGTexture;
Texture MenuStartTexture;
Texture MenuQuitTexture;
Texture MenuOptionsTexture;
Texture SplachScreenTexture;
float m_scale; float m_scale;
float m_time = 0; float m_time = 0;
float m_time_SplashScreen = 0;
float m_Width = 0;
float m_Height = 0;
int m_renderCount = 0; int m_renderCount = 0;
int m_countdown = COUNTDOWN; int m_countdown = COUNTDOWN;
bool m_damage = false;
bool m_wireframe = false; bool m_wireframe = false;
bool m_isSkybox = true; bool m_isSkybox = true;
bool m_block = false; bool m_block = false;
@@ -111,6 +133,11 @@ private:
bool m_mouseC = false; bool m_mouseC = false;
bool m_mouseWU = false; bool m_mouseWU = false;
bool m_mouseWD = false; bool m_mouseWD = false;
//Pour trouver ou est la souris
float m_mousemx = 0;
float m_mousemy = 0;
bool m_networkgame = false;
std::string m_messageNotification = ""; std::string m_messageNotification = "";
}; };

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

View File

@@ -7,7 +7,7 @@ void main()
texel = texture2D(tex,gl_TexCoord[0].st); texel = texture2D(tex,gl_TexCoord[0].st);
texel *= light; texel *= light;
texel.a = 255; texel.a = 255.;
gl_FragColor = texel; gl_FragColor = texel;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -9,6 +9,7 @@ OpenglContext::~OpenglContext()
{ {
} }
bool OpenglContext::Start(const std::string& title, int width, int height, bool fullscreen) bool OpenglContext::Start(const std::string& title, int width, int height, bool fullscreen)
{ {
m_title = title; m_title = title;
@@ -22,12 +23,13 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool
while (m_app.isOpen()) while (m_app.isOpen())
{ {
clock.restart(); clock.restart();
sf::Event Event; sf::Event Event;
while (m_app.pollEvent(Event)) while (m_app.pollEvent(Event))
{ {
switch(Event.type) switch (Event.type)
{ {
case sf::Event::Closed: case sf::Event::Closed:
m_app.close(); m_app.close();
@@ -51,7 +53,7 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool
MouseReleaseEvent(ConvertMouseButton(Event.mouseButton.button), Event.mouseButton.x, Event.mouseButton.y); MouseReleaseEvent(ConvertMouseButton(Event.mouseButton.button), Event.mouseButton.x, Event.mouseButton.y);
break; break;
case sf::Event::MouseWheelMoved: case sf::Event::MouseWheelMoved:
if(Event.mouseWheel.delta > 0) if (Event.mouseWheel.delta > 0)
MousePressEvent(MOUSE_BUTTON_WHEEL_UP, Event.mouseButton.x, Event.mouseButton.y); MousePressEvent(MOUSE_BUTTON_WHEEL_UP, Event.mouseButton.x, Event.mouseButton.y);
else else
MousePressEvent(MOUSE_BUTTON_WHEEL_DOWN, Event.mouseButton.x, Event.mouseButton.y); MousePressEvent(MOUSE_BUTTON_WHEEL_DOWN, Event.mouseButton.x, Event.mouseButton.y);
@@ -68,7 +70,7 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool
// Handle ourself frame rate limit, sf::Window::setFramerateLimit doesn't seems to work // Handle ourself frame rate limit, sf::Window::setFramerateLimit doesn't seems to work
float waitTime = (1.f / m_maxFps) - m_lastFrameTime; float waitTime = (1.f / m_maxFps) - m_lastFrameTime;
if(waitTime > 0) if (waitTime > 0)
{ {
sf::sleep(sf::seconds(waitTime)); sf::sleep(sf::seconds(waitTime));

View File

@@ -4,6 +4,7 @@
#include <string> #include <string>
#include <SFML/Window.hpp> #include <SFML/Window.hpp>
#include "define.h" #include "define.h"
#include "texture.h"
// Documentation de SFML: http://www.sfml-dev.org/documentation/index-fr.php // Documentation de SFML: http://www.sfml-dev.org/documentation/index-fr.php
class OpenglContext class OpenglContext
@@ -31,7 +32,6 @@ public:
virtual void MousePressEvent(const MOUSE_BUTTON &button, int x, int y) = 0; virtual void MousePressEvent(const MOUSE_BUTTON &button, int x, int y) = 0;
virtual void MouseReleaseEvent(const MOUSE_BUTTON &button, int x, int y) = 0; virtual void MouseReleaseEvent(const MOUSE_BUTTON &button, int x, int y) = 0;
bool Start(const std::string& title, int width, int height, bool fullscreen); bool Start(const std::string& title, int width, int height, bool fullscreen);
bool Stop(); bool Stop();

View File

@@ -0,0 +1,70 @@
#include "remoteplayer.h"
#include <iostream>
#include <cstring>
RemotePlayer::RemotePlayer(netprot::PlayerInfo pinfo) : Player(Vector3f(0, 0, 0), 0, 0), m_pinfo(pinfo), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous() {
}
void RemotePlayer::Init() {
}
void RemotePlayer::Feed(const netprot::Output out) {
current.position = out.position;
current.direction = out.direction;
current.states = out.states;
current.id = out.id;
//a revoir pour le jump et le shoot en meme temps lorsque les test seront possible
if (current.position != previous.position)
{
Vector3f positionDelta = current.position - previous.position;
m_position = current.position + positionDelta;
m_direction = current.direction;
}
if(current.direction != previous.direction)
{
m_direction = current.direction;
current.direction = current.direction;
}
if (current.states.shooting) {
//true;
m_animstate = Anim::SHOOTING;
}
else if (current.states.jumping) {
//true;
m_animstate = Anim::JUMPING;
}
else if (current.states.dead) {
//true;
m_animstate = Anim::DEAD;
}
else if(current.states.powerup){
//true;
m_animstate = Anim::POWERUP;
}
else if (current.states.still) {
//true;
m_animstate = Anim::STILL;
}
else if (current.states.running) {
//true;
m_animstate = Anim::RUNNING;
}
previous.direction = current.direction;
previous.position = current.position;
previous.states = current.states;
previous.id = current.id;
}

26
SQCSim2021/remoteplayer.h Normal file
View File

@@ -0,0 +1,26 @@
#ifndef REMOTEPLAYER_H__
#define REMOTEPLAYER_H__
#include "../SQCSim-common/player.h"
#include "../SQCSim-common/netprotocol.h"
#include "define.h"
#include "textureatlas.h"
#include "shader.h"
class RemotePlayer : public Player {
public:
enum Anim { STILL = 1, RUNNING = 2, JUMPING = 4, SHOOTING = 8, POWERUP = 16, DEAD = 32 };
RemotePlayer(netprot::PlayerInfo pinfo);
void Init();
void Feed(const netprot::Output out);
private:
netprot::Output current, previous;
netprot::PlayerInfo m_pinfo;
float m_aminacc;
Anim m_animstate;
uint64_t m_team_id;
};
#endif

View File

@@ -1,13 +1,13 @@
#include "worldrenderer.h" #include "renderer.h"
WorldRenderer::WorldRenderer() { Renderer::Renderer() {
m_meshes.Reset(nullptr); m_meshes.Reset(nullptr);
} }
WorldRenderer::~WorldRenderer() { Renderer::~Renderer() {
} }
void WorldRenderer::RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) { void Renderer::RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const {
rendercount = 0; rendercount = 0;
Vector3f angle; Vector3f angle;
Vector3f cursor; Vector3f cursor;
@@ -18,7 +18,7 @@ void WorldRenderer::RenderWorld(World* origin, int& rendercount, const Vector3f&
direct.Normalize(); direct.Normalize();
pos.y = 1; pos.y = 1;
static Vector3<unsigned int> renderManifest[VIEW_DISTANCE * 8]; // Nombre de Chunks maximal à être rendus. static Vector3<unsigned int> renderManifest[VIEW_DISTANCE * 8]; // Nombre de Chunks maximal <EFBFBD> <20>tre rendus.
//for (int dist = VIEW_DISTANCE; dist >= 0; dist -= CHUNK_SIZE_X) { //for (int dist = VIEW_DISTANCE; dist >= 0; dist -= CHUNK_SIZE_X) {
for (int dist = 0; dist <= VIEW_DISTANCE; dist += CHUNK_SIZE_X) { for (int dist = 0; dist <= VIEW_DISTANCE; dist += CHUNK_SIZE_X) {
@@ -27,18 +27,18 @@ void WorldRenderer::RenderWorld(World* origin, int& rendercount, const Vector3f&
int echantillons; int echantillons;
if (dist > VIEW_DISTANCE * .1f) { if (dist > VIEW_DISTANCE * .1f) {
sinus = .00872653549f; // sin(1/2 degré) sinus = .00872653549f; // sin(1/2 degr<EFBFBD>)
cosinus = .99996192306; // cos(1/2 degré) cosinus = .99996192306; // cos(1/2 degr<EFBFBD>)
echantillons = 180; echantillons = 180;
} }
//else {//if (dist > VIEW_DISTANCE * .3f) { //else {//if (dist > VIEW_DISTANCE * .3f) {
// sinus = .01151891831f; // sin(2/3 degré) // sinus = .01151891831f; // sin(2/3 degr<EFBFBD>)
// cosinus = .99993365506; // cos(2/3 degré) // cosinus = .99993365506; // cos(2/3 degr<EFBFBD>)
// echantillons = 120; // echantillons = 120;
//} //}
//else if (dist > VIEW_DISTANCE * .2f) { //else if (dist > VIEW_DISTANCE * .2f) {
// sinus = .01745240643; // sin(1 degré) // sinus = .01745240643; // sin(1 degr<EFBFBD>)
// cosinus = .99984769515; // cos(1 degré) // cosinus = .99984769515; // cos(1 degr<EFBFBD>)
// echantillons = 90; // echantillons = 90;
//} //}
//else if (dist > VIEW_DISTANCE * .1f) { //else if (dist > VIEW_DISTANCE * .1f) {
@@ -72,7 +72,7 @@ void WorldRenderer::RenderWorld(World* origin, int& rendercount, const Vector3f&
bool valide = true; bool valide = true;
unsigned int chx, chy; unsigned int chx, chy;
origin->ChunkAt(cursor)->GetPosition(chx, chy); origin->ChunkAt(cursor)->GetPosition(chx, chy);
for (int index = 0; index < rendercount; ++index) // Permet de vérifier seulement contre celles ajoutées dans la frame, et ne pas avoir à refaire l'array à chaque frame. for (int index = 0; index < rendercount; ++index) // Permet de v<EFBFBD>rifier seulement contre celles ajout<EFBFBD>es dans la frame, et ne pas avoir <EFBFBD> refaire l'array <EFBFBD> chaque frame.
if (renderManifest[index].x == chx && renderManifest[index].z == chy) if (renderManifest[index].x == chx && renderManifest[index].z == chy)
valide = false; valide = false;
@@ -107,7 +107,7 @@ void WorldRenderer::RenderWorld(World* origin, int& rendercount, const Vector3f&
glStencilFunc(GL_GREATER, 1, 0xFF); glStencilFunc(GL_GREATER, 1, 0xFF);
}; };
void WorldRenderer::UpdateWorld(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]) { void Renderer::UpdateMesh(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]) {
int cx = player.x; int cx = player.x;
int cy = player.z; int cy = player.z;
static int frameUpdate = 2; static int frameUpdate = 2;
@@ -211,3 +211,11 @@ void WorldRenderer::UpdateWorld(World* origin, const Vector3f& player, BlockInfo
} }
} }
} }
void Renderer::RenderPlayer(Player* player, Transformation tran) const {
}
void Renderer::RenderPlayer(RemotePlayer* rplayer, const Vector3f& player_pos, const Vector3f& player_dir) const {
}

30
SQCSim2021/renderer.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef RENDERER_H__
#define RENDERER_H__
#include <future>
#include <thread>
#include "../SQCSim-common/world.h"
#include "../SQCSim-common/transformation.h"
#include "define.h"
#include "mesh.h"
#include "textureatlas.h"
#include "shader.h"
#include "remoteplayer.h"
class Renderer {
private:
Array2d<Mesh*> m_meshes = Array2d<Mesh*>(WORLD_SIZE_X, WORLD_SIZE_Y);
TextureAtlas* m_playertext = nullptr;
Shader* m_playershader = nullptr;
public:
Renderer();
~Renderer();
void UpdateMesh(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]);
void RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const;
void RenderPlayer(Player* player, Transformation tran) const;
void RenderPlayer(RemotePlayer* rplayer, const Vector3f& player_pos, const Vector3f& player_dir) const;
};
#endif

View File

@@ -1,23 +0,0 @@
#ifndef WORLDRENDERER_H__
#define WORLDRENDERER_H__
#include <future>
#include <thread>
#include "../SQCSim-common/world.h"
#include "../SQCSim-common/transformation.h"
#include "define.h"
#include "mesh.h"
#include "textureatlas.h"
#include "shader.h"
class WorldRenderer {
private:
Array2d<Mesh*> m_meshes = Array2d<Mesh*>(WORLD_SIZE_X, WORLD_SIZE_Y);
public:
WorldRenderer();
~WorldRenderer();
void RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas);
void UpdateWorld(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]);
};
#endif