Compare commits
187 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a26929fe66 | ||
|
9bb8b1c9e5 | ||
|
83e438583f | ||
|
3600e597e6 | ||
|
38a6c26407 | ||
|
e2ff55603d | ||
|
49b90509b9 | ||
|
14be450f09 | ||
|
279ea6072f | ||
|
488fe55410 | ||
|
f7bfa8a81e | ||
|
3118f71b9c | ||
|
6855e50144 | ||
|
75a32270b5 | ||
|
3a38753d8e | ||
|
8769aa9e38 | ||
|
547772b2f9 | ||
|
a91e5dcf5e | ||
|
02fafea45c | ||
|
85b8f4b94b | ||
|
225c815da4 | ||
|
4751b2350a | ||
|
8860593740 | ||
|
82cfc2d1b1 | ||
|
dc0d2d8148 | ||
|
86536fbb99 | ||
|
9426af39e7 | ||
|
3ca941f0ce | ||
|
e011e2f1fc | ||
|
bb810ba1c1 | ||
|
71852738c1 | ||
|
fedd150461 | ||
|
cfb9b56ee8 | ||
|
c98625a610 | ||
|
dfd2ddc8af | ||
|
4c695fbe47 | ||
|
a4a99ed425 | ||
|
80a5bf90b4 | ||
|
e5e3c19137 | ||
|
8bd46ba831 | ||
|
bc1f4f750b | ||
|
253e49b1cc | ||
|
cd921b3ab3 | ||
|
ef7851bebf | ||
|
d49d5cdebc | ||
|
9b9e2b3f1f | ||
|
ac9174f793 | ||
|
f51305bd11 | ||
|
13ba82d09e | ||
|
2753e41d34 | ||
|
408679433b | ||
|
5cf5eb132a | ||
|
ab84e42c72 | ||
|
0ef437600d | ||
|
6e47bdc8a4 | ||
|
79013fe5d1 | ||
|
88acc268b8 | ||
|
e5d9eb2fa6 | ||
|
ccad131370 | ||
|
11e8684ee0 | ||
|
6570ce1302 | ||
|
88a8553608 | ||
|
48078182a1 | ||
|
3db59a876c | ||
|
78f7974f1c | ||
|
553ef01765 | ||
|
54307b7c17 | ||
|
9dd2e1b821 | ||
|
eb7116bac8 | ||
|
f44b6cd7dc | ||
|
3e89035de5 | ||
|
0c8772edbf | ||
|
e5189f437c | ||
|
851d5f0c0b | ||
|
2a4a5e13cc | ||
|
35c2a5be31 | ||
|
9b0c4dc594 | ||
|
602bb84428 | ||
|
4df7cfbd5d | ||
|
6e75bec25c | ||
|
2d52abab07 | ||
|
559a8efc19 | ||
|
a82f994d49 | ||
|
5f3b5b3777 | ||
|
b67d7c647f | ||
|
bbfc98ff12 | ||
|
9fa4f2829b | ||
|
3249d68e60 | ||
|
ada9330588 | ||
|
3da8be6d52 | ||
|
a95dd02896 | ||
|
6ce7e62e05 | ||
|
e2dbf52b17 | ||
|
eed8f5f04a | ||
|
53ed811936 | ||
|
15b4dfefc0 | ||
|
b50a2f44e2 | ||
|
4f64be7e0a | ||
|
b54f8c31e5 | ||
|
0b07d46dba | ||
|
c33e6f865c | ||
|
03be36ecda | ||
|
aab3301234 | ||
|
d0c39e49b0 | ||
|
10fcfed05a | ||
|
a69e716105 | ||
|
3f8d860b93 | ||
|
42d612ad33 | ||
|
c23d1b2120 | ||
|
76a7d0218d | ||
|
e2e66f3b6c | ||
|
f0bf7d94ce | ||
|
49c9576757 | ||
|
e2fa4fea7c | ||
|
61629b3c8e | ||
|
8970bc33a1 | ||
|
c1faaca417 | ||
|
889884490b | ||
|
bd817f9f7d | ||
|
57d60e02a7 | ||
|
ae201846b1 | ||
|
1c7523558b | ||
|
fc4a22e844 | ||
|
f7b7a7f14d | ||
|
102153a093 | ||
|
da594fa3a2 | ||
|
6a8a505167 | ||
|
0dded0bc9b | ||
|
9ef44a3993 | ||
|
0bc7f29492 | ||
|
60cc69a407 | ||
|
05f9658f55 | ||
|
2f2b49054f | ||
|
397cf7f00d | ||
|
8e95899192 | ||
|
8870550512 | ||
|
f5a1906877 | ||
|
9b4defba2a | ||
|
dd2396e5e4 | ||
|
c7271f6217 | ||
|
8ebe7b95fc | ||
|
4964bc5394 | ||
|
cf6e58cd95 | ||
|
ffeb95d953 | ||
|
85f4f82660 | ||
|
2c3abff96f | ||
|
5e29c9be54 | ||
|
f8680a318a | ||
|
fc4aa20005 | ||
|
ecfe5b893b | ||
|
eea6a30aa5 | ||
|
9f615db929 | ||
|
498fb7baf7 | ||
|
49240635b6 | ||
|
df5b7960b2 | ||
|
f4d4f1eca0 | ||
|
b943a268ae | ||
|
590220bc92 | ||
|
67a49a4cad | ||
|
dd851a17e1 | ||
|
0e7b8973e7 | ||
|
2cb7d4c776 | ||
|
793da52871 | ||
|
18a5d98c57 | ||
|
81240c6f70 | ||
|
f1ddd67655 | ||
|
a054a7bff1 | ||
|
b712c950c6 | ||
|
9cbf20ba21 | ||
|
3f774d7c2e | ||
|
db0a39f64a | ||
|
d7e55c8446 | ||
|
f2095f6e5b | ||
|
183c5f186a | ||
|
c85f7df15e | ||
|
6668127f15 | ||
|
54c25e6f78 | ||
|
bf164af23b | ||
|
0d948e3a28 | ||
|
b97890fff3 | ||
|
432b8545a7 | ||
|
54e2f32aba | ||
|
90fdc8ed1b | ||
|
47906776c8 | ||
|
fa9f0a3a8a | ||
|
43f3ce1428 | ||
|
8b3baa9063 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -378,3 +378,5 @@ FodyWeavers.xsd
|
|||||||
/SQCSim2021/cmake/*
|
/SQCSim2021/cmake/*
|
||||||
!/SQCSim2021/cmake/CMakeLists.txt
|
!/SQCSim2021/cmake/CMakeLists.txt
|
||||||
/SQCSim2021/SQCSim-client
|
/SQCSim2021/SQCSim-client
|
||||||
|
SQCSim2021/SQCSim2021.vcxproj.filters
|
||||||
|
SQCSim2021/SQCSim2021.vcxproj
|
||||||
|
BIN
Debug/glew32.dll
BIN
Debug/glew32.dll
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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>
|
||||||
@@ -131,6 +134,7 @@
|
|||||||
<ClInclude Include="array2d.h" />
|
<ClInclude Include="array2d.h" />
|
||||||
<ClInclude Include="array3d.h" />
|
<ClInclude Include="array3d.h" />
|
||||||
<ClInclude Include="blockinfo.h" />
|
<ClInclude Include="blockinfo.h" />
|
||||||
|
<ClInclude Include="boostinfo.h" />
|
||||||
<ClInclude Include="bullet.h" />
|
<ClInclude Include="bullet.h" />
|
||||||
<ClInclude Include="chunk.h" />
|
<ClInclude Include="chunk.h" />
|
||||||
<ClInclude Include="define.h" />
|
<ClInclude Include="define.h" />
|
||||||
@@ -144,6 +148,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="blockinfo.cpp" />
|
<ClCompile Include="blockinfo.cpp" />
|
||||||
|
<ClCompile Include="boostinfo.cpp" />
|
||||||
<ClCompile Include="bullet.cpp" />
|
<ClCompile Include="bullet.cpp" />
|
||||||
<ClCompile Include="chunk.cpp" />
|
<ClCompile Include="chunk.cpp" />
|
||||||
<ClCompile Include="netprotocol.cpp" />
|
<ClCompile Include="netprotocol.cpp" />
|
||||||
|
@@ -54,6 +54,9 @@
|
|||||||
<ClInclude Include="transformation.h">
|
<ClInclude Include="transformation.h">
|
||||||
<Filter>Fichiers d%27en-tête</Filter>
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="boostinfo.h">
|
||||||
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="world.cpp">
|
<ClCompile Include="world.cpp">
|
||||||
@@ -80,5 +83,8 @@
|
|||||||
<ClCompile Include="transformation.cpp">
|
<ClCompile Include="transformation.cpp">
|
||||||
<Filter>Fichiers sources</Filter>
|
<Filter>Fichiers sources</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="boostinfo.cpp">
|
||||||
|
<Filter>Fichiers sources</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
32
SQCSim-common/boostinfo.cpp
Normal file
32
SQCSim-common/boostinfo.cpp
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#include "boostinfo.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
BoostInfo::BoostInfo(BoostType type, const std::string& name, float u, float v, float s, int dur) : m_type(type), m_name(name), m_u(u), m_v(v), m_s(s), m_durability(dur)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BoostInfo::~BoostInfo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BoostType BoostInfo::GetType() const
|
||||||
|
{
|
||||||
|
return m_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoostInfo::GetTexture(float& u, float& v, float& s)
|
||||||
|
{
|
||||||
|
u = m_u;
|
||||||
|
v = m_v;
|
||||||
|
s = m_s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoostInfo::Show() const
|
||||||
|
{
|
||||||
|
std::cout << "Type: " << m_type << std::endl;
|
||||||
|
std::cout << "Nom: " << m_name << std::endl;
|
||||||
|
std::cout << "Durabilite: " << m_durability << std::endl;
|
||||||
|
std::cout << "Coordonnees Texture: " << m_u << ", " << m_v << ", " << m_s << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
29
SQCSim-common/boostinfo.h
Normal file
29
SQCSim-common/boostinfo.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef BOOSTINFO_H__
|
||||||
|
#define BOOSTINFO_H__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "define.h"
|
||||||
|
|
||||||
|
class BoostInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BoostInfo(BoostType type, const std::string& name, float u, float v, float s, int dur);
|
||||||
|
~BoostInfo();
|
||||||
|
|
||||||
|
BoostType GetType() const;
|
||||||
|
|
||||||
|
void GetTexture(float& u, float& v, float& s);
|
||||||
|
|
||||||
|
void Show() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
BoostType m_type;
|
||||||
|
float m_u;
|
||||||
|
float m_v;
|
||||||
|
float m_s;
|
||||||
|
std::string m_name;
|
||||||
|
int m_durability;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BOOSTINFO_H__
|
@@ -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::unordered_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;
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
#ifndef BULLET_H__
|
#ifndef BULLET_H__
|
||||||
#define BULLET_H__
|
#define BULLET_H__
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
#include "define.h"
|
#include "define.h"
|
||||||
#include "vector3.h"
|
#include "vector3.h"
|
||||||
|
#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::unordered_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__
|
||||||
|
@@ -2,132 +2,163 @@
|
|||||||
#include "world.h"
|
#include "world.h"
|
||||||
|
|
||||||
Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y) {
|
Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y) {
|
||||||
//std::ostringstream pos; // V<>rifie l'existence d'un fichier .chunk avec sa position.
|
//std::ostringstream pos; // V<>rifie l'existence d'un fichier .chunk avec sa position.
|
||||||
//pos << CHUNK_PATH << x << '_' << y << ".chunk";
|
//pos << CHUNK_PATH << x << '_' << y << ".chunk";
|
||||||
//std::ifstream input(pos.str(), std::fstream::binary);
|
//std::ifstream input(pos.str(), std::fstream::binary);
|
||||||
|
|
||||||
//if (input.fail()) {
|
//if (input.fail()) {
|
||||||
OpenSimplexNoise::Noise simplex = OpenSimplexNoise::Noise(seed);
|
OpenSimplexNoise::Noise simplex = OpenSimplexNoise::Noise(seed);
|
||||||
m_blocks.Reset(BTYPE_AIR);
|
m_blocks.Reset(BTYPE_AIR);
|
||||||
|
|
||||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Montagnes
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Montagnes
|
||||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
float xnoiz, ynoiz;
|
float xnoiz, ynoiz;
|
||||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 4096.;
|
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 4096.;
|
||||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 4096.;
|
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 4096.;
|
||||||
double height = 0;
|
double height = 0;
|
||||||
for (int x = 0; x < 39; ++x) {
|
for (int x = 0; x < 39; ++x) {
|
||||||
height += simplex.eval(xnoiz, ynoiz);
|
height += simplex.eval(xnoiz, ynoiz);
|
||||||
height *= .79;
|
height *= .79;
|
||||||
xnoiz *= 1.139;
|
xnoiz *= 1.139;
|
||||||
ynoiz *= 1.139;
|
ynoiz *= 1.139;
|
||||||
}
|
}
|
||||||
height = height * 2000. * simplex.eval((double)(ix + x * CHUNK_SIZE_X) / 512., (double)(iz + y * CHUNK_SIZE_Z) / 512.);
|
height = height * 2000. * simplex.eval((double)(ix + x * CHUNK_SIZE_X) / 512., (double)(iz + y * CHUNK_SIZE_Z) / 512.);
|
||||||
height /= (CHUNK_SIZE_Y / 1.9);
|
height /= (CHUNK_SIZE_Y / 1.9);
|
||||||
height += 15.;
|
height += 15.;
|
||||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy)
|
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy)
|
||||||
SetBlock(ix, iy, iz, BTYPE_METAL, nullptr);
|
SetBlock(ix, iy, iz, BTYPE_METAL, nullptr);
|
||||||
}
|
}
|
||||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Collines
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Collines
|
||||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
float xnoiz, ynoiz;
|
float xnoiz, ynoiz;
|
||||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 512.;
|
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 512.;
|
||||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 512.;
|
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 512.;
|
||||||
float height = simplex.eval(xnoiz, ynoiz) * 50.f;// +1.f;
|
float height = simplex.eval(xnoiz, ynoiz) * 50.f;// +1.f;
|
||||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy) {
|
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy) {
|
||||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
SetBlock(ix, iy, iz, BTYPE_GRASS, nullptr);
|
SetBlock(ix, iy, iz, BTYPE_GREENGRASS, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Lacs"
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Lacs"
|
||||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
for (int iy = 0; iy < 13; ++iy) {
|
for (int iy = 0; iy < 13; ++iy) {
|
||||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
SetBlock(ix, iy, iz, BTYPE_ICE, nullptr);
|
SetBlock(ix, iy, iz, BTYPE_ICE, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Arbres"
|
|
||||||
// for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
|
||||||
// float xnoiz, ynoiz;
|
|
||||||
// xnoiz = (double)(iz * CHUNK_SIZE_Y + x * CHUNK_SIZE_X) / 256.;
|
|
||||||
// ynoiz = (double)(ix * CHUNK_SIZE_Y + y * CHUNK_SIZE_Z) / 256.;
|
|
||||||
// bool tree = (int)(abs(simplex.eval(xnoiz, ynoiz)) * 17933.f) % CHUNK_SIZE_Y > 126 ? true : false;
|
|
||||||
// for (int iy = 0; iy < CHUNK_SIZE_Y - 10; ++iy)
|
|
||||||
// if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
|
||||||
// if (GetBlock(ix, iy - 1, iz) == BTYPE_GRASS)
|
|
||||||
// if (tree) {
|
|
||||||
// for (int i = 0; i < (int)(abs(simplex.eval(xnoiz, ynoiz) * 4)) % 42 + 1; ++i)
|
|
||||||
// SetBlock(ix, iy + i, iz, BTYPE_DIRT, nullptr);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
/* }
|
|
||||||
else {
|
|
||||||
input.seekg(0, std::ios_base::end);
|
|
||||||
int size = input.tellg();
|
|
||||||
input.seekg(0, std::ios_base::beg);
|
|
||||||
|
|
||||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
int rnd = rand() % 15;
|
||||||
input.read(data, size);
|
if (rnd == 4)
|
||||||
input.close();
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // structure
|
||||||
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
|
for (int iy = 0; iy < 14; ++iy) {
|
||||||
|
if (ix == 3)
|
||||||
|
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
|
Structure(ix, iy, iz, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rnd == 3)
|
||||||
|
for (int ix = 0; ix < CHUNK_SIZE_Z; ++ix) // structure
|
||||||
|
for (int iz = 0; iz < CHUNK_SIZE_X; ++iz) {
|
||||||
|
for (int iy = 0; iy < 14; ++iy) {
|
||||||
|
if (iz == 4)
|
||||||
|
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
|
Structure(ix, iy, iz, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rnd == 6)
|
||||||
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // structure
|
||||||
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
|
for (int iy = 0; iy < 14; ++iy) {
|
||||||
|
if (ix == 3)
|
||||||
|
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
|
Structure(ix, iy, iz, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix)
|
|
||||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz)
|
//for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Arbres"
|
||||||
for (int iy = 0; iy < CHUNK_SIZE_Y; ++iy)
|
// for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||||
m_blocks.Set(ix, iy, iz, data[ix + (iz * CHUNK_SIZE_X) + (iy * CHUNK_SIZE_Z * CHUNK_SIZE_X)]);
|
// float xnoiz, ynoiz;
|
||||||
}*/
|
// xnoiz = (double)(iz * CHUNK_SIZE_Y + x * CHUNK_SIZE_X) / 256.;
|
||||||
|
// ynoiz = (double)(ix * CHUNK_SIZE_Y + y * CHUNK_SIZE_Z) / 256.;
|
||||||
|
// bool tree = (int)(abs(simplex.eval(xnoiz, ynoiz)) * 17933.f) % CHUNK_SIZE_Y > 126 ? true : false;
|
||||||
|
// for (int iy = 0; iy < CHUNK_SIZE_Y - 10; ++iy)
|
||||||
|
// if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||||
|
// if (GetBlock(ix, iy - 1, iz) == BTYPE_GRASS)
|
||||||
|
// if (tree) {
|
||||||
|
// for (int i = 0; i < (int)(abs(simplex.eval(xnoiz, ynoiz) * 4)) % 42 + 1; ++i)
|
||||||
|
// SetBlock(ix, iy + i, iz, BTYPE_DIRT, nullptr);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
/* }
|
||||||
|
else {
|
||||||
|
input.seekg(0, std::ios_base::end);
|
||||||
|
int size = input.tellg();
|
||||||
|
input.seekg(0, std::ios_base::beg);
|
||||||
|
|
||||||
|
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||||
|
input.read(data, size);
|
||||||
|
input.close();
|
||||||
|
|
||||||
|
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix)
|
||||||
|
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz)
|
||||||
|
for (int iy = 0; iy < CHUNK_SIZE_Y; ++iy)
|
||||||
|
m_blocks.Set(ix, iy, iz, data[ix + (iz * CHUNK_SIZE_X) + (iy * CHUNK_SIZE_Z * CHUNK_SIZE_X)]);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
Chunk::~Chunk() {
|
Chunk::~Chunk() {
|
||||||
/*if (m_isModified) {
|
/*if (m_isModified) {
|
||||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||||
|
|
||||||
for (int x = 0; x < CHUNK_SIZE_X; ++x)
|
for (int x = 0; x < CHUNK_SIZE_X; ++x)
|
||||||
for (int z = 0; z < CHUNK_SIZE_Z; ++z)
|
for (int z = 0; z < CHUNK_SIZE_Z; ++z)
|
||||||
for (int y = 0; y < CHUNK_SIZE_Y; ++y)
|
for (int y = 0; y < CHUNK_SIZE_Y; ++y)
|
||||||
data[x + (z * CHUNK_SIZE_X) + (y * CHUNK_SIZE_Z * CHUNK_SIZE_X)] = (char)GetBlock(x, y, z);
|
data[x + (z * CHUNK_SIZE_X) + (y * CHUNK_SIZE_Z * CHUNK_SIZE_X)] = (char)GetBlock(x, y, z);
|
||||||
|
|
||||||
std::ostringstream pos;
|
std::ostringstream pos;
|
||||||
pos << CHUNK_PATH << m_posX << '_' << m_posY << ".chunk";
|
pos << CHUNK_PATH << m_posX << '_' << m_posY << ".chunk";
|
||||||
|
|
||||||
std::ofstream output(pos.str(), std::fstream::binary);
|
std::ofstream output(pos.str(), std::fstream::binary);
|
||||||
output.write(data, sizeof(data));
|
output.write(data, sizeof(data));
|
||||||
output.close();
|
output.close();
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Chunk::RemoveBlock(int x, int y, int z, World* world) {
|
void Chunk::RemoveBlock(int x, int y, int z, World* world) {
|
||||||
m_blocks.Set(x, y, z, BTYPE_AIR);
|
m_blocks.Set(x, y, z, BTYPE_AIR);
|
||||||
CheckNeighbors(x, y, world);
|
CheckNeighbors(x, y, world);
|
||||||
m_isDirty = true;
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
|
void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
|
||||||
m_blocks.Set(x, y, z, type);
|
m_blocks.Set(x, y, z, type);
|
||||||
if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas v<>rifier les chunks voisines.
|
if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas v<>rifier les chunks voisines.
|
||||||
m_isDirty = true;
|
m_isDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockType Chunk::GetBlock(int x, int y, int z) { return m_blocks.Get(x, y, z); }
|
BlockType Chunk::GetBlock(int x, int y, int z) { return m_blocks.Get(x, y, z); }
|
||||||
|
|
||||||
void Chunk::CheckNeighbors(unsigned int x, unsigned int z, World* world) {
|
void Chunk::CheckNeighbors(unsigned int x, unsigned int z, World* world) {
|
||||||
unsigned int cx, cy;
|
unsigned int cx, cy;
|
||||||
|
|
||||||
world->GetScope(cx, cy);
|
world->GetScope(cx, cy);
|
||||||
|
|
||||||
if (x == 0 && m_posX - cx >= 0 &&
|
if (x == 0 && m_posX - cx >= 0 &&
|
||||||
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
||||||
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||||
else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X &&
|
else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X &&
|
||||||
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
||||||
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||||
|
|
||||||
if (z == 0 && m_posY - cy >= 0 &&
|
if (z == 0 && m_posY - cy >= 0 &&
|
||||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z))
|
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z))
|
||||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)->MakeDirty();
|
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||||
else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y &&
|
else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y &&
|
||||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z))
|
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z))
|
||||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)->MakeDirty();
|
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Chunk::GetPosition(unsigned int& x, unsigned int& y) const { x = m_posX; y = m_posY; }
|
void Chunk::GetPosition(unsigned int& x, unsigned int& y) const { x = m_posX; y = m_posY; }
|
||||||
@@ -140,3 +171,31 @@ void Chunk::MakeClean() { m_isDirty = false; }
|
|||||||
|
|
||||||
void Chunk::MakeModified() { m_isModified = true; }
|
void Chunk::MakeModified() { m_isModified = true; }
|
||||||
|
|
||||||
|
|
||||||
|
void Chunk::Structure(int x, int y, int z,int height)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
SetBlock(x, i + y, z, BTYPE_GRASS, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -28,6 +28,7 @@ class Chunk {
|
|||||||
void CheckNeighbors(unsigned int x, unsigned int z, World* world);
|
void CheckNeighbors(unsigned int x, unsigned int z, World* world);
|
||||||
void GetPosition(unsigned int& x, unsigned int& y) const;
|
void GetPosition(unsigned int& x, unsigned int& y) const;
|
||||||
|
|
||||||
|
void Structure(int x, int y, int z, int height);
|
||||||
bool IsDirty() const;
|
bool IsDirty() const;
|
||||||
void MakeDirty();
|
void MakeDirty();
|
||||||
void MakeClean();
|
void MakeClean();
|
||||||
|
@@ -4,12 +4,14 @@
|
|||||||
#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 CHUNK_SIZE_X 4
|
#define BUFFER_LENGTH 1500
|
||||||
|
|
||||||
|
#define CHUNK_SIZE_X 6
|
||||||
#define CHUNK_SIZE_Y 64
|
#define CHUNK_SIZE_Y 64
|
||||||
#define CHUNK_SIZE_Z 4
|
#define CHUNK_SIZE_Z 6
|
||||||
#define MAX_SELECTION_DISTANCE 5
|
#define MAX_SELECTION_DISTANCE 5
|
||||||
#define SEED 0
|
#define SEED 0
|
||||||
#define COUNTDOWN 300
|
#define COUNTDOWN 300
|
||||||
@@ -22,15 +24,25 @@
|
|||||||
#define FRAMES_DELETE_CHUNKS 1
|
#define FRAMES_DELETE_CHUNKS 1
|
||||||
|
|
||||||
#define THREADS_GENERATE_CHUNKS 8
|
#define THREADS_GENERATE_CHUNKS 8
|
||||||
#define THREADS_UPDATE_CHUNKS 3
|
#define THREADS_UPDATE_CHUNKS 6
|
||||||
#define THREADS_DELETE_CHUNKS 3
|
#define THREADS_DELETE_CHUNKS 3
|
||||||
|
|
||||||
#define VIEW_DISTANCE 512 // Si les chunks arr<72>tent de s'afficher pendant une game et qu'il y a un access violation quand tu quitte, il faut augmenter ce chiffre.
|
#define VIEW_DISTANCE 512 // Si les chunks arr<72>tent de s'afficher pendant une game et qu'il y a un access violation quand tu quitte, il faut augmenter ce chiffre.
|
||||||
#define TEXTURE_SIZE 512
|
#define TEXTURE_SIZE 512
|
||||||
#define MAX_BULLETS 512
|
#define MAX_BULLETS 512
|
||||||
|
|
||||||
|
#define TIME_SPEED_BOOST 10 //secondes
|
||||||
|
#define TIME_DAMAGE_BOOST 10 //secondes
|
||||||
|
#define TIME_INVINCIBLE_BOOST 4 //secondes
|
||||||
|
#define STRENGTH_SPEED_BOOST 10 //Pourcentage
|
||||||
|
#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_GREENGRASS, BTYPE_LAST };
|
||||||
|
typedef uint8_t BoostType;
|
||||||
|
enum BOOST_TYPE { BTYPE_SPEED, BTYPE_HEAL, BTYPE_DAMAGE, BTYPE_INVINCIBLE, BTYPE_BOOST_LAST };
|
||||||
|
enum ANIM_TYPE { STILL = 0, SHOOTING = 8, JUMPING = 16, JUMPINGSHOOTING = 24, DEAD = 32, TYPE_LAST = 40};
|
||||||
|
enum ANIM_POS {FRONT, QUARTER_FRONT_LEFT, QUATER_FRONT_RIGHT, PROFIL_LEFT, PROFIL_RIGHT, QUARTER_BACK_LEFT, QUARTER_BACK_RIGHT, BACK , POS_LAST};
|
||||||
typedef uint64_t Timestamp;
|
typedef uint64_t Timestamp;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -42,6 +54,12 @@ typedef uint64_t Timestamp;
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
#define poll WSAPoll
|
||||||
|
#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,10 +69,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>
|
#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
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,14 @@
|
|||||||
#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}
|
|
||||||
|
|
||||||
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 +16,27 @@ namespace netprot {
|
|||||||
LAST_PACK
|
LAST_PACK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Structures */
|
||||||
|
|
||||||
|
struct Buffer { // Pour pouvoir rendre l'utilisation des buffers plus clean.
|
||||||
|
char* ptr = new char[BUFFER_LENGTH] { 1 }, * tmp = nullptr;
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Constantes */
|
||||||
|
|
||||||
|
inline const char Footer[sizeof(uint32_t)] = { '\0', '\r', '\0', '\n' }; // constante de footer qui est ajoutée à chaque paquet envoyé.
|
||||||
|
|
||||||
|
/* Sous-structures */
|
||||||
|
|
||||||
struct Keys {
|
struct Keys {
|
||||||
bool forward,
|
bool forward,
|
||||||
backward,
|
backward,
|
||||||
@@ -33,9 +51,15 @@ namespace netprot {
|
|||||||
bool jumping,
|
bool jumping,
|
||||||
shooting,
|
shooting,
|
||||||
hit,
|
hit,
|
||||||
powerup;
|
powerup,
|
||||||
|
dead,
|
||||||
|
still,
|
||||||
|
jumpshot,
|
||||||
|
running;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Structures de paquets */
|
||||||
|
|
||||||
struct Input { // cli -> srv UDP ~frame
|
struct Input { // cli -> srv UDP ~frame
|
||||||
Timestamp timestamp;
|
Timestamp timestamp;
|
||||||
uint64_t sid = 0;
|
uint64_t sid = 0;
|
||||||
@@ -51,36 +75,50 @@ namespace netprot {
|
|||||||
States states; // 0bJSH_____ bit-packing de bool.
|
States states; // 0bJSH_____ bit-packing de bool.
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Sync { // srv -> cli TCP ~second
|
struct Sync { // srv -> cli TCP ~second - un premier sync démarre la partie.
|
||||||
Timestamp timestamp;
|
Timestamp timestamp;
|
||||||
uint64_t sid = 0;
|
uint64_t sid = 0;
|
||||||
uint32_t timer = 0;
|
uint32_t timer = 0;
|
||||||
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);
|
||||||
|
};
|
||||||
|
PlayerInfo(int id, int tid, std::string strname) : id(id), tid(tid) { memcpy((void*)strname.c_str(), name, strname.length());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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,13 +126,19 @@ 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); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Fonctions */
|
||||||
|
|
||||||
void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli
|
void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli
|
||||||
void Serialize(Output* out, char* buf[], uint32_t* buflen); // srv
|
void Serialize(Output* out, char* buf[], uint32_t* buflen); // srv
|
||||||
void Serialize(Sync* sync, char* buf[], uint32_t* buflen); // srv
|
void Serialize(Sync* sync, char* buf[], uint32_t* buflen); // srv
|
||||||
@@ -105,16 +149,78 @@ namespace netprot {
|
|||||||
void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv
|
void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv
|
||||||
void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv
|
void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv
|
||||||
|
|
||||||
bool Deserialize(Input* in, char* buf, const uint32_t buflen); // srv
|
bool Deserialize(Input* in, char* buf, uint32_t* buflen); // srv
|
||||||
bool Deserialize(Output* out, char* buf, const uint32_t buflen); // cli
|
bool Deserialize(Output* out, char* buf, uint32_t* buflen); // cli
|
||||||
bool Deserialize(Sync* sync, char* buf, const uint32_t buflen); // cli
|
bool Deserialize(Sync* sync, char* buf, uint32_t* buflen); // cli
|
||||||
bool Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen); // cli/srv
|
bool Deserialize(TeamInfo* tinfo, char* buf, uint32_t* buflen); // cli/srv
|
||||||
bool Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen); // cli/srv
|
bool Deserialize(LoginInfo* linfo, char* buf, uint32_t* buflen); // cli/srv
|
||||||
bool Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen); // cli
|
bool Deserialize(PlayerInfo* pinfo, char* buf, uint32_t* buflen); // cli
|
||||||
bool Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen); // cli
|
bool Deserialize(GameInfo* ginfo, char* buf, uint32_t* buflen); // cli
|
||||||
bool Deserialize(Chat* chat, char* buf, const uint32_t buflen); // srv/cli
|
bool Deserialize(Chat* chat, char* buf, uint32_t* buflen); // srv/cli
|
||||||
bool Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen); // srv
|
bool Deserialize(ErrorLog* errlog, char* buf, 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> T copyPack(Packet* pck);
|
||||||
|
|
||||||
|
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<char*> recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr);
|
||||||
|
std::vector<char*> recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* oufbuf = nullptr);
|
||||||
|
|
||||||
|
/* Templates */
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T copyPack(Packet* pck) { return T((T*)pck->ptr); }
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) {
|
||||||
|
netprot::Serialize(pack, buf, buflen);
|
||||||
|
memcpy(*buf + *buflen, Footer, sizeof(uint32_t));
|
||||||
|
*buflen += sizeof(Footer);
|
||||||
|
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) {
|
||||||
|
const sockaddr_in addr = *sockad;
|
||||||
|
netprot::Serialize(pack, buf, buflen);
|
||||||
|
memcpy(*buf + *buflen, Footer, sizeof(uint32_t));
|
||||||
|
*buflen += sizeof(Footer);
|
||||||
|
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);
|
||||||
|
memcpy(&buf->ptr[buf->len], Footer, sizeof(uint32_t));
|
||||||
|
buf->len += sizeof(Footer);
|
||||||
|
send(sock, buf->ptr, buf->len, 0);
|
||||||
|
buf->rstLen();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad) {
|
||||||
|
const sockaddr_in addr = *sockad;
|
||||||
|
netprot::Serialize(pack, &buf->ptr, &buf->len);
|
||||||
|
memcpy(&buf->ptr[buf->len], Footer, sizeof(uint32_t));
|
||||||
|
buf->len += sizeof(Footer);
|
||||||
|
sendto(sock, buf->ptr, buf->len, 0, (sockaddr*)&addr, sizeof(addr));
|
||||||
|
buf->rstLen();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -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-Bop";
|
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;
|
||||||
@@ -59,6 +61,11 @@ Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jum
|
|||||||
delta.y += jump? .32f: shoot? .1f : 0.f;
|
delta.y += jump? .32f: shoot? .1f : 0.f;
|
||||||
m_airborne = true;
|
m_airborne = true;
|
||||||
}
|
}
|
||||||
|
if (boostspeed)
|
||||||
|
{
|
||||||
|
delta.x += STRENGTH_SPEED_BOOST / 100 * delta.x;
|
||||||
|
delta.z += STRENGTH_SPEED_BOOST / 100 * delta.z;
|
||||||
|
}
|
||||||
|
|
||||||
if (shoot) // Recoil!
|
if (shoot) // Recoil!
|
||||||
TurnTopBottom(-1);
|
TurnTopBottom(-1);
|
||||||
@@ -165,7 +172,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)
|
||||||
@@ -180,16 +187,65 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi
|
|||||||
else isStep = false;
|
else isStep = false;
|
||||||
m_POV = m_position.y;
|
m_POV = m_position.y;
|
||||||
m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f;
|
m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f;
|
||||||
|
RemoveBooster(elapsedTime);
|
||||||
return snd;
|
return snd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::ApplyTransformation(Transformation& transformation, bool rel) const {
|
void Player::ApplyTransformation(Transformation& transformation, bool rel, bool rot) const {
|
||||||
transformation.ApplyRotation(-m_rotX, 1, 0, 0);
|
transformation.ApplyRotation(-m_rotX, 1, 0, 0);
|
||||||
transformation.ApplyRotation(-m_rotY, 0, 1, 0);
|
transformation.ApplyRotation(-m_rotY, 0, 1, 0);
|
||||||
if (rel) transformation.ApplyTranslation(-GetPOV());
|
if (rel) transformation.ApplyTranslation(-GetPOV());
|
||||||
|
if (!rot) {
|
||||||
|
transformation.ApplyRotation(-m_rotX, 1, 0, 0);
|
||||||
|
transformation.ApplyRotation(-m_rotY, 0, 1, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::GetBooster(Booster boosttype)
|
||||||
|
{
|
||||||
|
if (boosttype == SPEED)
|
||||||
|
{
|
||||||
|
boostspeed = true;
|
||||||
|
timeboostspeed = 0;
|
||||||
|
}
|
||||||
|
if (boosttype == HEAL)
|
||||||
|
{
|
||||||
|
m_hp = 100;
|
||||||
|
}
|
||||||
|
if (boosttype == DAMAGE)
|
||||||
|
{
|
||||||
|
boostdamage = true;
|
||||||
|
timeboostdamage = 0;
|
||||||
|
}
|
||||||
|
if (boosttype == INVINCIBLE)
|
||||||
|
{
|
||||||
|
boostinvincible = true;
|
||||||
|
boostinvincible = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Player::RemoveBooster(float elapsedtime)
|
||||||
|
{
|
||||||
|
if (boostspeed)
|
||||||
|
{
|
||||||
|
timeboostspeed += elapsedtime;
|
||||||
|
if (timeboostspeed >= TIME_SPEED_BOOST)
|
||||||
|
boostspeed = false;
|
||||||
|
}
|
||||||
|
if (boostdamage)
|
||||||
|
{
|
||||||
|
timeboostdamage += elapsedtime;
|
||||||
|
if (timeboostdamage >= TIME_DAMAGE_BOOST)
|
||||||
|
boostdamage = false;
|
||||||
|
}
|
||||||
|
if (boostinvincible)
|
||||||
|
{
|
||||||
|
timeboostinvincible += elapsedtime;
|
||||||
|
if (timeboostinvincible >= TIME_INVINCIBLE_BOOST)
|
||||||
|
boostinvincible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Player::SetDirection(Vector3f dir) { m_direction = dir; }
|
||||||
|
|
||||||
Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); }
|
Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); }
|
||||||
|
|
||||||
Vector3f Player::GetVelocity() const { return m_velocity; }
|
Vector3f Player::GetVelocity() const { return m_velocity; }
|
||||||
@@ -206,3 +262,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();
|
||||||
|
}
|
||||||
|
@@ -5,19 +5,26 @@
|
|||||||
#include "transformation.h"
|
#include "transformation.h"
|
||||||
#include "vector3.h"
|
#include "vector3.h"
|
||||||
|
|
||||||
|
|
||||||
class World;
|
class World;
|
||||||
|
|
||||||
class Player {
|
class Player {
|
||||||
public:
|
public:
|
||||||
enum Sound { NOSOUND, STEP, FALL };
|
enum Sound { NOSOUND, STEP, FALL };
|
||||||
|
enum Booster { SPEED, HEAL, DAMAGE, INVINCIBLE };
|
||||||
|
|
||||||
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);
|
||||||
Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime);
|
Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime);
|
||||||
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
void GetBooster(Booster boosttype);
|
||||||
|
void RemoveBooster(float elapsedtime);
|
||||||
|
void ApplyTransformation(Transformation& transformation, bool rel = true, bool rot = true) const;
|
||||||
|
|
||||||
|
void SetDirection(Vector3f dir);
|
||||||
Vector3f GetPosition() const;
|
Vector3f GetPosition() const;
|
||||||
Vector3f GetDirection() const;
|
Vector3f GetDirection() const;
|
||||||
Vector3f GetVelocity() const;
|
Vector3f GetVelocity() const;
|
||||||
@@ -26,20 +33,37 @@ 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;
|
||||||
float m_POV;
|
float m_POV;
|
||||||
|
float timeboostspeed;
|
||||||
|
float timeboostdamage;
|
||||||
|
float timeboostinvincible;
|
||||||
|
|
||||||
float m_hp;
|
float m_hp;
|
||||||
|
|
||||||
bool m_airborne;
|
bool m_airborne;
|
||||||
|
bool boostspeed;
|
||||||
|
bool boostdamage;
|
||||||
|
bool boostinvincible;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Vector3f InterpolatePosition(const Vector3f& vec1, const Vector3f& vec2, const Timestamp& tim1, const Timestamp& tim2, const Timestamp& now);
|
||||||
};
|
};
|
||||||
#endif //_PLAYER_H__
|
#endif //_PLAYER_H__
|
||||||
|
|
||||||
|
@@ -6,10 +6,19 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Chunk* World::ChunkAt(float x, float y, float z) const {
|
Chunk* World::ChunkAt(float x, float y, float z) const {
|
||||||
int cx = (int)x / CHUNK_SIZE_X;
|
int cx = (int)x / CHUNK_SIZE_X;
|
||||||
int cz = (int)z / CHUNK_SIZE_Z;
|
int cz = (int)z / CHUNK_SIZE_Z;
|
||||||
@@ -25,6 +34,32 @@ Chunk* World::ChunkAt(float x, float y, float z) const {
|
|||||||
|
|
||||||
Chunk* World::ChunkAt(const Vector3f& pos) const { return ChunkAt(pos.x, pos.y, pos.z); }
|
Chunk* World::ChunkAt(const Vector3f& pos) const { return ChunkAt(pos.x, pos.y, pos.z); }
|
||||||
|
|
||||||
|
void World::RemoveChunk(int nbReduit)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < WORLD_SIZE_X; ++x)
|
||||||
|
for (int y = 0; y < WORLD_SIZE_Y; ++y)
|
||||||
|
{
|
||||||
|
Chunk* chk = nullptr;
|
||||||
|
if (x < nbReduit)
|
||||||
|
chk = m_chunks.Remove(x, y);
|
||||||
|
if (y < nbReduit)
|
||||||
|
chk = m_chunks.Remove(x, y);
|
||||||
|
if (y > WORLD_SIZE_Y - nbReduit)
|
||||||
|
chk = m_chunks.Remove(x, y);
|
||||||
|
if (x > WORLD_SIZE_X - nbReduit)
|
||||||
|
chk = m_chunks.Remove(x, y);
|
||||||
|
|
||||||
|
// TODO: MakeDirty() les voisins pour qu'ils se redessinent.
|
||||||
|
|
||||||
|
if (!chk)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_tbDeleted.emplace_back(chk);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
BlockType World::BlockAt(float x, float y, float z, BlockType defaultBlockType) const {
|
BlockType World::BlockAt(float x, float y, float z, BlockType defaultBlockType) const {
|
||||||
Chunk* c = ChunkAt(x, y, z);
|
Chunk* c = ChunkAt(x, y, z);
|
||||||
|
|
||||||
|
@@ -21,12 +21,15 @@ public:
|
|||||||
~World();
|
~World();
|
||||||
|
|
||||||
Array2d<Chunk*>& GetChunks();
|
Array2d<Chunk*>& GetChunks();
|
||||||
|
void BuildWorld();
|
||||||
|
|
||||||
void SetSeed(uint64_t seed);
|
void SetSeed(uint64_t seed);
|
||||||
|
|
||||||
Chunk* ChunkAt(float x, float y, float z) const;
|
Chunk* ChunkAt(float x, float y, float z) const;
|
||||||
Chunk* ChunkAt(const Vector3f& pos) const;
|
Chunk* ChunkAt(const Vector3f& pos) const;
|
||||||
|
|
||||||
|
void RemoveChunk(int nbReduit);
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@@ -45,7 +48,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]);
|
||||||
|
|
||||||
|
@@ -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>
|
||||||
|
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.18.4)
|
|||||||
project(SQCSim-Server VERSION 0.1)
|
project(SQCSim-Server VERSION 0.1)
|
||||||
|
|
||||||
add_compile_options("-Wno-narrowing")
|
add_compile_options("-Wno-narrowing")
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_STANDARD_REQUIRED True)
|
set(CMAKE_STANDARD_REQUIRED True)
|
||||||
|
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../out")
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../out")
|
||||||
|
@@ -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,79 @@ 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::getPacks(SOCKET sock) {
|
||||||
|
std::vector<char*> lsPck;
|
||||||
|
Input in;
|
||||||
|
while (true) {
|
||||||
|
lsPck = recvPacksFrom(sock, &m_buf, m_addr);
|
||||||
|
|
||||||
|
for (auto& pck : lsPck) {
|
||||||
|
uint32_t bsize = m_buf.len - (pck - m_buf.ptr);
|
||||||
|
switch (netprot::getType(pck, 1)) {
|
||||||
|
using enum netprot::PACKET_TYPE;
|
||||||
|
case INPUT:
|
||||||
|
if (Deserialize(&in, pck, &bsize))
|
||||||
|
m_input_manifest[in.timestamp] = in;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lsPck.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::sendPacks(SOCKET sock, std::unordered_map<uint64_t, Connection*> conns) {
|
||||||
|
while (m_last_out < m_output_manifest.size()) {
|
||||||
|
Output out = m_output_manifest.at(m_last_out++);
|
||||||
|
|
||||||
|
for (auto& [key, conn] : conns) {
|
||||||
|
if (m_playinfo.id == conn->GetHash(true))
|
||||||
|
continue;
|
||||||
|
sendPackTo<Output>(sock, &out, &m_bufout, conn->getAddr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connection::Run(World* world) {
|
||||||
|
Input in, last;
|
||||||
|
Output out;
|
||||||
|
float el;
|
||||||
|
|
||||||
|
if (m_input_manifest.size() < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (m_last_in < m_input_manifest.size()) {
|
||||||
|
in = m_input_manifest.at(m_last_in + 1);
|
||||||
|
last = m_input_manifest.at(m_last_in);
|
||||||
|
|
||||||
|
el = (float)(in.timestamp - last.timestamp) / 1000.;
|
||||||
|
player.get()->SetDirection(in.direction);
|
||||||
|
player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward,
|
||||||
|
in.keys.backward,
|
||||||
|
in.keys.left,
|
||||||
|
in.keys.right,
|
||||||
|
in.keys.jump, false, el), world, el);
|
||||||
|
|
||||||
|
out.position = player.get()->GetPosition();
|
||||||
|
out.direction = in.direction;
|
||||||
|
out.timestamp = in.timestamp;
|
||||||
|
out.id = m_playinfo.id;
|
||||||
|
|
||||||
|
m_output_manifest[out.timestamp] = out;
|
||||||
|
|
||||||
|
++m_last_in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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--);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -2,41 +2,58 @@
|
|||||||
#define CONNECTION_H__
|
#define CONNECTION_H__
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <map>
|
#include <unordered_map>
|
||||||
#include "../SQCSim-common/player.h"
|
#include "../SQCSim-common/player.h"
|
||||||
#include "../SQCSim-common/vector3.h"
|
#include "../SQCSim-common/vector3.h"
|
||||||
#include "../SQCSim-common/netprotocol.h"
|
#include "../SQCSim-common/netprotocol.h"
|
||||||
|
#include "../SQCSim-common/world.h"
|
||||||
#include "define.h"
|
#include "define.h"
|
||||||
|
|
||||||
|
using namespace netprot;
|
||||||
|
|
||||||
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 getPacks(SOCKET sock);
|
||||||
|
void sendPacks(SOCKET sock, std::unordered_map<uint64_t, Connection*> conns);
|
||||||
|
|
||||||
|
void Run(World* world);
|
||||||
|
|
||||||
void CleanInputManifest(Timestamp time);
|
void CleanInputManifest(Timestamp time);
|
||||||
private:
|
private:
|
||||||
std::map<Timestamp, netprot::Input> m_input_manifest;
|
std::unordered_map<Timestamp, Input> m_input_manifest;
|
||||||
std::map<Timestamp, netprot::Output> m_output_manifest;
|
std::unordered_map<Timestamp, Output> m_output_manifest;
|
||||||
std::map<Timestamp, netprot::Chat> m_chatlog;
|
std::unordered_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;
|
||||||
|
|
||||||
|
Timestamp m_startsync;
|
||||||
|
|
||||||
|
uint64_t m_last_in = 0,
|
||||||
|
m_last_out = 0;
|
||||||
|
Buffer m_buf,
|
||||||
|
m_bufout;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
@@ -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
|
||||||
|
@@ -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;
|
|
||||||
}
|
}
|
@@ -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,106 @@ 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;
|
||||||
unsigned 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) {
|
m_buf.len = BUFFER_LENGTH;
|
||||||
netprot::LoginInfo log;
|
Packet pck = getPack(&m_buf);
|
||||||
netprot::PlayerInfo play;
|
if (pck.type != PACKET_TYPE::LOGINF) {
|
||||||
if (netprot::Deserialize(&log, buf, buflen)) {
|
Log("Paquet invalide.", true, false);
|
||||||
log.sid = getUniqueId();
|
if (pck.type != PACKET_TYPE::ERR)
|
||||||
|
netprot::emptyPack(pck);
|
||||||
log.tid = 0;
|
continue; // Passer au prochain appel si c'est pas un LoginInfo ou un LoginInfo invalide qui rentre.
|
||||||
|
|
||||||
str.append(" Nom: ").append(log.name);
|
|
||||||
Log(str, false, false);
|
|
||||||
str = "";
|
|
||||||
|
|
||||||
str.append(log.name).append(" SID: [").append(std::to_string(log.sid).append("]"));
|
|
||||||
Log(str, false, false);
|
|
||||||
|
|
||||||
//netprot::Serialize(&log, &buf, &buflen);
|
|
||||||
//send(sock, buf, buflen, 0);
|
|
||||||
//buflen = 150;
|
|
||||||
sendPack<netprot::LoginInfo>(sock, &log, &buf, &buflen);
|
|
||||||
|
|
||||||
play.id = getUniqueId();
|
|
||||||
memcpy(play.name, log.name, std::strlen(log.name) + 1);
|
|
||||||
play.tid = log.tid;
|
|
||||||
|
|
||||||
//netprot::Serialize(&m_game, &buf, &buflen);
|
|
||||||
//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;
|
|
||||||
readystart = true;
|
|
||||||
}
|
}
|
||||||
|
LoginInfo* log = (LoginInfo*)pck.ptr;
|
||||||
|
|
||||||
|
log->sid = getUniqueId();
|
||||||
|
log->tid = 1145389380; // TODO: À changer si on implemente un mode en equipe.
|
||||||
|
|
||||||
|
Log(str.append(" Nom: ").append(log->name), false, false);
|
||||||
|
str.clear();
|
||||||
|
|
||||||
|
Log(str.append(log->name).append(" SID: [").append(std::to_string(log->sid).append("]")), false, false);
|
||||||
|
|
||||||
|
sendPack<LoginInfo>(sock, log, &m_buf);
|
||||||
|
|
||||||
|
play.id = getUniqueId();
|
||||||
|
strcpy(play.name, log->name);
|
||||||
|
|
||||||
|
play.tid = log->tid;
|
||||||
|
|
||||||
|
sendPack<GameInfo>(sock, &m_game, &m_buf);
|
||||||
|
Connection* conn = new 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 +175,73 @@ int Server::Ready() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Server::Run() {
|
void Server::Run() {
|
||||||
|
bool endgame = false;
|
||||||
|
Input in;
|
||||||
|
sockaddr_in sockad;
|
||||||
|
addrlen_t socklen = sizeof(sockad);
|
||||||
|
|
||||||
|
Log("Debut de la partie...", false, false);
|
||||||
|
|
||||||
|
int players = m_players.size();
|
||||||
|
|
||||||
|
m_world = new 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 (!endgame) {
|
||||||
|
for (auto& [key, conn] : m_players) {
|
||||||
|
conn->getPacks(m_sock_udp);
|
||||||
|
conn->Run(m_world);
|
||||||
|
conn->sendPacks(m_sock_udp, m_players);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//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);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
Log("Partie en cours...", false, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string Server::LogTimestamp() {
|
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 +259,39 @@ inline std::string Server::LogTimestamp() {
|
|||||||
|
|
||||||
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 << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
case LOGFILE:
|
||||||
break;
|
m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
||||||
case LOG_DEST::CONSOLE:
|
break;
|
||||||
default:
|
case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!)
|
||||||
std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
default:
|
||||||
break;
|
std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
||||||
|
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 +302,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;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
|
@@ -5,14 +5,19 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
#include "../SQCSim-common/world.h"
|
#include "../SQCSim-common/world.h"
|
||||||
#include "../SQCSim-common/netprotocol.h"
|
#include "../SQCSim-common/netprotocol.h"
|
||||||
#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 +25,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::unordered_map<uint64_t, Connection*> m_players;
|
||||||
|
std::unordered_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;
|
World* m_world = nullptr;
|
||||||
|
const bool m_manual_setup = SRV_MANUAL_SETUP;
|
||||||
|
|
||||||
std::string LogTimestamp();
|
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
|
||||||
|
@@ -20,33 +20,37 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="audio.h" />
|
<ClInclude Include="audio.h" />
|
||||||
|
<ClInclude Include="booster.h" />
|
||||||
<ClInclude Include="connector.h" />
|
<ClInclude Include="connector.h" />
|
||||||
<ClInclude Include="define.h" />
|
<ClInclude Include="define.h" />
|
||||||
<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" />
|
||||||
|
<ClCompile Include="booster.cpp" />
|
||||||
<ClCompile Include="connector.cpp" />
|
<ClCompile Include="connector.cpp" />
|
||||||
<ClCompile Include="engine.cpp" />
|
<ClCompile Include="engine.cpp" />
|
||||||
<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">
|
||||||
@@ -105,8 +109,8 @@
|
|||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
<IncludePath>external\irrKlang-1.6.0\include;external\glew210\include;external\devil178\include;external\sfml251\include;$(IncludePath)</IncludePath>
|
<IncludePath>external\irrKlang-1.6.0\include;external\glew210\include;external\devil180\include;external\sfml251-32\include;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>external\glew210\lib;external\sfml251\lib;external\devil178\lib;external\irrKlang-1.6.0\lib\Win32-visualStudio;$(LibraryPath)</LibraryPath>
|
<LibraryPath>external\glew210\lib\Release\Win32;external\sfml251-32\lib;external\devil180\lib\x86\Release;external\irrKlang-1.6.0\lib\Win32-visualStudio;$(LibraryPath)</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
@@ -115,8 +119,8 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
<IncludePath>external\devil180\include;external\irrKlang-1.6.0\include;external\sfml251\include;external\glew210\include;$(IncludePath)</IncludePath>
|
<IncludePath>external\devil180\include;external\irrKlang-1.6.0\include;external\sfml251-32\include;external\glew210\include;$(IncludePath)</IncludePath>
|
||||||
<LibraryPath>external\sfml251\lib;external\devil180\lib\x86\Release;external\glew210\lib\Release\Win32;$(LibraryPath);external\irrKlang-1.6.0\lib\Win32-visualStudio</LibraryPath>
|
<LibraryPath>external\sfml251-32\lib;external\devil180\lib\x86\Release;external\glew210\lib\Release\Win32;$(LibraryPath);external\irrKlang-1.6.0\lib\Win32-visualStudio</LibraryPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
@@ -130,7 +134,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 +149,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,13 +166,13 @@
|
|||||||
<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>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
@@ -184,13 +188,13 @@
|
|||||||
<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>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
@@ -47,7 +47,13 @@
|
|||||||
<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>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="booster.h">
|
||||||
<Filter>Fichiers d%27en-tête</Filter>
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -88,7 +94,13 @@
|
|||||||
<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>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="booster.cpp">
|
||||||
<Filter>Fichiers sources</Filter>
|
<Filter>Fichiers sources</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@@ -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) {
|
||||||
|
@@ -14,17 +14,17 @@
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
46
SQCSim2021/booster.cpp
Normal file
46
SQCSim2021/booster.cpp
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#include "booster.h";
|
||||||
|
|
||||||
|
void Booster::RenderBillboard(const Vector3f pos, TextureAtlas& textureAtlas, Shader& shader, Transformation tran)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
//Vector3f playerToQuad = m_player.GetPosition() - m_position;
|
||||||
|
//playerToQuad.Normalize();
|
||||||
|
//Vector3f targetPosition = m_player.GetPosition() + playerToQuad * 10.0f;
|
||||||
|
//Matrix4f rotationMatrix;
|
||||||
|
//rotationMatrix.SetLookAt(m_position, targetPosition, Vector3f(0, 1, 0));
|
||||||
|
//glMultMatrixf(rotationMatrix.GetInternalValues());
|
||||||
|
float x = pos.x;
|
||||||
|
float y = pos.y;
|
||||||
|
float z = pos.z;
|
||||||
|
float width = 1.0f;
|
||||||
|
float height = 1.0f;
|
||||||
|
//Pt override les collisions.. a ce point la je sais pas quoi faire
|
||||||
|
|
||||||
|
//Matrix4 mat4 = tran.GetMatrix();
|
||||||
|
//mat4 VP = pMatrix * vMatrix;
|
||||||
|
//Vector3f CameraRight = Vector3f(mat4.Get11(), mat4.Get21(), mat4.Get31());
|
||||||
|
//Vector3f CameraUp = Vector3f(mat4.Get12(), mat4.Get22(), mat4.Get32());
|
||||||
|
|
||||||
|
//Vector3f v1 = (m_position + CameraRight * 0.5 * width + CameraUp * -0.5 * width);
|
||||||
|
//Vector3f v2 = (m_position + CameraRight * 0.5 * width + CameraUp * 0.5 * width);
|
||||||
|
//Vector3f v4 = (m_position + CameraRight * -0.5 * width + CameraUp * -0.5 * width);
|
||||||
|
//Vector3f v3 = (m_position + CameraRight * -0.5 * width + CameraUp * 0.5 * width);
|
||||||
|
|
||||||
|
//tran.ApplyTranslation(m_position);
|
||||||
|
float u, v, w, h;
|
||||||
|
//glDisable(GL_DEPTH_TEST);
|
||||||
|
shader.Use();
|
||||||
|
textureAtlas.Bind();
|
||||||
|
textureAtlas.TextureIndexToCoord(8, u, v, w, h);
|
||||||
|
//glLoadIdentity();
|
||||||
|
glLoadMatrixf(tran.GetMatrix().GetInternalValues());
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glTexCoord2f(u, v); glVertex3f(x - width / 2., y - height, z); //glVertex3f(v4.x, v4.y, v4.z);//glVertex3f(0, 50, 0);
|
||||||
|
glTexCoord2f(u + w, v); glVertex3f(x + width / 2., y - height, z); //glVertex3f(v3.x, v3.y, v3.z); //glVertex3f(50,50, 0);
|
||||||
|
glTexCoord2f(u + w, v + h); glVertex3f(x + width / 2., y, z); //glVertex3f(v2.x, v2.y, v2.z); //glVertex3f(50, 0, 0);
|
||||||
|
glTexCoord2f(u, v + h); glVertex3f(x - width / 2., y, z); //glVertex3f(v1.x, v1.y, v1.z);// glVertex3f(0, 0, 0);
|
||||||
|
glEnd();
|
||||||
|
shader.Disable();
|
||||||
|
//tran.ApplyTranslation(-m_position);
|
||||||
|
//glEnable(GL_DEPTH_TEST);
|
||||||
|
}
|
14
SQCSim2021/booster.h
Normal file
14
SQCSim2021/booster.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef BOOSTER_H__
|
||||||
|
#define BOOSTER_H__
|
||||||
|
#include "define.h"
|
||||||
|
#include "textureatlas.h"
|
||||||
|
#include "shader.h"
|
||||||
|
#include "../SQCSim-common/vector3.h"
|
||||||
|
#include "../SQCSim-common/transformation.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Booster {
|
||||||
|
public:
|
||||||
|
void RenderBillboard(const Vector3f pos, TextureAtlas& textureAtlas, Shader& shader, Transformation tran);
|
||||||
|
};
|
||||||
|
#endif
|
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.18.4)
|
|||||||
|
|
||||||
project(SQCSim-Client VERSION 0.8)
|
project(SQCSim-Client VERSION 0.8)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_STANDARD_REQUIRED True)
|
set(CMAKE_STANDARD_REQUIRED True)
|
||||||
|
|
||||||
set(CMAKE_BUILD_DIRECTORY "./build")
|
set(CMAKE_BUILD_DIRECTORY "./build")
|
||||||
@@ -50,7 +50,8 @@ add_executable(SQCSim-client
|
|||||||
"../textureatlas.cpp"
|
"../textureatlas.cpp"
|
||||||
"../tool.cpp"
|
"../tool.cpp"
|
||||||
"../vertexbuffer.cpp"
|
"../vertexbuffer.cpp"
|
||||||
"../worldrenderer.cpp"
|
"../renderer.cpp"
|
||||||
|
"../remoteplayer.cpp"
|
||||||
"../main.cpp"
|
"../main.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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,67 @@ 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;
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buf = new char[150];
|
flag_t flag = 1;
|
||||||
uint32_t buflen = 150;
|
if (ioctl(m_sock_tcp, SOCK_NONBLOCK, &flag) < 0) {
|
||||||
|
std::cout << "Impossible de mettre le socket en mode non-bloquant." << std::endl;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
netprot::Buffer bf;
|
||||||
netprot::LoginInfo log;
|
netprot::LoginInfo log;
|
||||||
memcpy(&log.name, name.c_str(), name.size() + 1);
|
strcpy(log.name, name.c_str());
|
||||||
|
|
||||||
netprot::Serialize(&log, &buf, &buflen);
|
netprot::sendPack(m_sock_tcp, &log, &bf);
|
||||||
|
|
||||||
int se = send(m_sock_tcp, buf, buflen, 0);
|
//using namespace std::chrono_literals;
|
||||||
|
//std::this_thread::sleep_for(100ms);
|
||||||
|
|
||||||
delete[] buf;
|
memset(bf.ptr, '\0', BUFFER_LENGTH);
|
||||||
buf = new char[150] {0};
|
|
||||||
buflen = 150;
|
|
||||||
int rpack = 0;
|
|
||||||
|
|
||||||
while (rpack < 2) {
|
bool ready = false;
|
||||||
recv(m_sock_tcp, buf, buflen, 0);
|
int errors = 0;
|
||||||
|
std::vector<char*> lsPck;
|
||||||
|
while (!ready) {
|
||||||
|
lsPck = netprot::recvPacks(m_sock_tcp, &bf);
|
||||||
|
|
||||||
switch (netprot::getType(buf, buflen)) {
|
for (auto& pck : lsPck) {
|
||||||
case netprot::PACKET_TYPE::LOGINF:
|
uint32_t bsize = bf.len - (pck - bf.ptr);
|
||||||
if (!netprot::Deserialize(&m_loginfo, buf, buflen)) {
|
netprot::PlayerInfo* pl = nullptr;
|
||||||
std::cout << "Packet LoginInfo invalide." << std::endl;
|
switch (netprot::getType(pck, 1)) {
|
||||||
return 2;
|
using enum netprot::PACKET_TYPE;
|
||||||
|
case LOGINF:
|
||||||
|
if (!netprot::Deserialize(&m_loginfo, pck, &bsize))
|
||||||
|
++errors;
|
||||||
|
break;
|
||||||
|
case GAMEINFO:
|
||||||
|
if (!netprot::Deserialize(&m_gameinfo, pck, &bsize))
|
||||||
|
++errors;
|
||||||
|
break;
|
||||||
|
case PLAYINF:
|
||||||
|
pl = new netprot::PlayerInfo();
|
||||||
|
if (!netprot::Deserialize(pl, pck, &bsize))
|
||||||
|
++errors;
|
||||||
|
else m_players[pl->id] = pl;
|
||||||
|
break;
|
||||||
|
case TEAMINF:
|
||||||
|
// TODO: Faire dequoi avec TeamInfo si on fini par avoir des teams.
|
||||||
|
break;
|
||||||
|
case SYNC:
|
||||||
|
if (!netprot::Deserialize(&m_origin, pck, &bsize))
|
||||||
|
++errors;
|
||||||
|
ready = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errors++;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
++rpack;
|
|
||||||
break;
|
|
||||||
case netprot::PACKET_TYPE::GAMEINFO:
|
|
||||||
if (!netprot::Deserialize(&m_gameinfo, buf, buflen)) {
|
|
||||||
std::cout << "Packet GameInfo invalide." << std::endl;
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
++rpack;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
std::cout << "Packet invalide." << std::endl;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
lsPck.clear();
|
||||||
|
if (errors > 1000)
|
||||||
|
return 4;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -99,3 +122,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; }
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
#define CONNECTOR_H__
|
#define CONNECTOR_H__
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unordered_map>
|
||||||
#include "../SQCSim-common/netprotocol.h"
|
#include "../SQCSim-common/netprotocol.h"
|
||||||
#include "define.h"
|
#include "define.h"
|
||||||
|
|
||||||
@@ -11,26 +12,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::unordered_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::unordered_map<Timestamp, netprot::Input> m_inputmanifest;
|
||||||
std::map<uint64_t, netprot::PlayerInfo> m_players;
|
std::unordered_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
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
#ifndef CLI_DEFINE_H__
|
#ifndef CLI_DEFINE_H__
|
||||||
#define CLI_DEFINE_H__
|
#define CLI_DEFINE_H__
|
||||||
|
|
||||||
|
//#define SFML_STATIC true
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
@@ -18,16 +20,21 @@
|
|||||||
#include <climits>
|
#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 BULLET_UPDATES_PER_FRAME 20
|
||||||
|
|
||||||
#define BASE_WIDTH 640
|
#define BASE_WIDTH 640
|
||||||
#define BASE_HEIGHT 480
|
#define BASE_HEIGHT 480
|
||||||
|
|
||||||
|
#define ANIME_PATH_JUMP "./media/textures/AssetOtherPlayer/FinalPNGJumping/"
|
||||||
|
#define ANIME_PATH_STILL "./media/textures/AssetOtherPlayer/FinalPNGStanding/"
|
||||||
#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/"
|
||||||
|
#define BOOSTER_TEXTURE_PATH "./media/textures/Booster/"
|
||||||
|
|
||||||
#endif // DEFINE_H__
|
#endif // DEFINE_H__
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -2,9 +2,12 @@
|
|||||||
#define ENGINE_H__
|
#define ENGINE_H__
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <unordered_map>
|
||||||
#include "../SQCSim-common/array2d.h"
|
#include "../SQCSim-common/array2d.h"
|
||||||
#include "../SQCSim-common/blockinfo.h"
|
#include "../SQCSim-common/blockinfo.h"
|
||||||
|
#include "../SQCSim-common/boostinfo.h"
|
||||||
#include "../SQCSim-common/bullet.h"
|
#include "../SQCSim-common/bullet.h"
|
||||||
#include "../SQCSim-common/chunk.h"
|
#include "../SQCSim-common/chunk.h"
|
||||||
#include "../SQCSim-common/world.h"
|
#include "../SQCSim-common/world.h"
|
||||||
@@ -18,12 +21,18 @@
|
|||||||
#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"
|
||||||
|
#include "booster.h"
|
||||||
|
|
||||||
|
|
||||||
class Engine : public OpenglContext {
|
class Engine : public OpenglContext {
|
||||||
public:
|
public:
|
||||||
Engine();
|
Engine();
|
||||||
virtual ~Engine();
|
virtual ~Engine();
|
||||||
|
virtual void DrawMenu();
|
||||||
|
virtual void DrawOption();
|
||||||
|
virtual void DrawSplachScreen();
|
||||||
virtual void Init();
|
virtual void Init();
|
||||||
virtual void DeInit();
|
virtual void DeInit();
|
||||||
virtual void LoadResource();
|
virtual void LoadResource();
|
||||||
@@ -36,48 +45,98 @@ public:
|
|||||||
virtual void MouseReleaseEvent(const MOUSE_BUTTON &button, int x, int y);
|
virtual void MouseReleaseEvent(const MOUSE_BUTTON &button, int x, int y);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float GetScale() const;
|
|
||||||
|
|
||||||
int GetFps(float elapsedTime) const;
|
int GetFps(float elapsedTime) const;
|
||||||
int GetCountdown(float elapsedTime);
|
int GetCountdown(float elapsedTime);
|
||||||
|
|
||||||
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 KillNotification(Player killer, Player killed);
|
||||||
|
void DisplayNotification(std::string message);
|
||||||
|
void ProcessNotificationQueue();
|
||||||
void DisplayCrosshair();
|
void DisplayCrosshair();
|
||||||
|
void DisplayPovGun();
|
||||||
void DisplayCurrentItem();
|
void DisplayCurrentItem();
|
||||||
void DisplayHud(int timer);
|
void DisplayHud(int timer);
|
||||||
void DisplayInfo(float elapsedTime, BlockType bloc);
|
void DisplayInfo(float elapsedTime, BlockType bloc);
|
||||||
|
void DisplaySingleOrMultiplayerMenu();
|
||||||
void DrawHud(float elapsedTime, BlockType bloc);
|
void DrawHud(float elapsedTime, BlockType bloc);
|
||||||
void PrintText(float x, float y, float scale, const std::string& t);
|
void PrintText(float x, float y, const std::string& t, float charSizeMultiplier = 1.0f);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Connector m_conn;
|
Connector m_conn;
|
||||||
Shader m_shader01;
|
Shader m_shader01;
|
||||||
BlockInfo* m_blockinfo[BTYPE_LAST];
|
BlockInfo* m_blockinfo[BTYPE_LAST];
|
||||||
|
BoostInfo* m_boostinfo[BTYPE_BOOST_LAST];
|
||||||
TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST);
|
TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST);
|
||||||
|
TextureAtlas m_animeAtlas = TextureAtlas(TYPE_LAST + POS_LAST);
|
||||||
|
|
||||||
World m_world = World();
|
World m_world = World();
|
||||||
WorldRenderer m_wrenderer = WorldRenderer();
|
Renderer m_renderer = Renderer();
|
||||||
|
Booster m_booster = Booster();
|
||||||
|
|
||||||
Texture m_textureSkybox;
|
|
||||||
Texture m_textureFont;
|
|
||||||
Texture m_textureCrosshair;
|
Texture m_textureCrosshair;
|
||||||
|
Texture m_textureFont;
|
||||||
Texture m_textureGun;
|
Texture m_textureGun;
|
||||||
|
Texture m_texturePovGun;
|
||||||
|
Texture m_textureSkybox;
|
||||||
|
Texture m_textureSoloMultiMenu;
|
||||||
|
Texture m_textureSoloText;
|
||||||
|
Texture m_textureMultiText;
|
||||||
|
Texture m_textureTitle;
|
||||||
|
|
||||||
|
TextureAtlas::TextureIndex texBoostHeal;
|
||||||
|
|
||||||
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::unordered_map<uint64_t, Player*> m_players;
|
||||||
|
netprot::Buffer m_buf, m_bufout;
|
||||||
|
std::chrono::high_resolution_clock::time_point m_startTime;
|
||||||
|
|
||||||
|
//Menu
|
||||||
|
enum class GameState: uint8_t { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY,SINGLEMULTI };
|
||||||
|
|
||||||
|
GameState m_gamestate = GameState::MAIN_MENU;
|
||||||
|
Texture MenuTitleTexture;
|
||||||
|
Texture MenuBGTexture;
|
||||||
|
Texture MenuBGOptionTexture;
|
||||||
|
Texture MenuStartTexture;
|
||||||
|
Texture MenuQuitTexture;
|
||||||
|
Texture MenuOptionsTexture;
|
||||||
|
Texture PauseBGTexture;
|
||||||
|
Texture SplachScreenTexture;
|
||||||
|
Texture MusicTexture; //TODO
|
||||||
|
Texture OnOffBtnTexture;//TODO
|
||||||
|
Texture BackBtnTexture;//TODO
|
||||||
|
|
||||||
|
|
||||||
float m_scale;
|
float m_scale;
|
||||||
float m_time = 0;
|
float m_time = 0;
|
||||||
|
float m_time_SplashScreen = 0;
|
||||||
|
float m_titleX = 0;
|
||||||
|
float m_titleY = 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;
|
||||||
|
int m_nbReductionChunk = 4;
|
||||||
|
int m_timerReductionChunk = 30;
|
||||||
|
|
||||||
|
bool m_damage = false;
|
||||||
|
|
||||||
bool m_wireframe = false;
|
bool m_wireframe = false;
|
||||||
bool m_isSkybox = true;
|
bool m_isSkybox = true;
|
||||||
@@ -85,10 +144,16 @@ private:
|
|||||||
bool m_flash = true;
|
bool m_flash = true;
|
||||||
bool m_displayCrosshair = true;
|
bool m_displayCrosshair = true;
|
||||||
bool m_displayHud = true;
|
bool m_displayHud = true;
|
||||||
bool m_displayInfo = false;
|
bool m_displayInfo = true;
|
||||||
bool m_resetcountdown = false;
|
bool m_resetcountdown = false;
|
||||||
|
bool m_soloMultiChoiceMade = false;
|
||||||
bool m_stopcountdown = false;
|
bool m_stopcountdown = false;
|
||||||
|
|
||||||
|
bool m_key1 = false;
|
||||||
|
bool m_key2 = false;
|
||||||
|
|
||||||
|
bool m_keyK = false;
|
||||||
|
bool m_keyL = false;
|
||||||
bool m_keyW = false;
|
bool m_keyW = false;
|
||||||
bool m_keyA = false;
|
bool m_keyA = false;
|
||||||
bool m_keyS = false;
|
bool m_keyS = false;
|
||||||
@@ -99,6 +164,14 @@ 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;
|
||||||
|
netprot::PlayerInfo m_pinfo;
|
||||||
|
RemotePlayer m_remotePlayer = RemotePlayer(netprot::PlayerInfo(),Vector3f(5.5f, CHUNK_SIZE_Y + 1.8f, 5.5f));
|
||||||
|
std::string m_messageNotification = "";
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ENGINE_H__
|
#endif // ENGINE_H__
|
||||||
|
58
SQCSim2021/external/sfml251-32/doc/html/AlResource_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/AlResource_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Audio_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Audio_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Audio_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Audio_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
77
SQCSim2021/external/sfml251-32/doc/html/BlendMode_8hpp_source.html
vendored
Normal file
77
SQCSim2021/external/sfml251-32/doc/html/BlendMode_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/CircleShape_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/CircleShape_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Clipboard_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Clipboard_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Clock_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Clock_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Color_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Color_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
57
SQCSim2021/external/sfml251-32/doc/html/Config_8hpp_source.html
vendored
Normal file
57
SQCSim2021/external/sfml251-32/doc/html/Config_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/ContextSettings_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/ContextSettings_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
61
SQCSim2021/external/sfml251-32/doc/html/Context_8hpp_source.html
vendored
Normal file
61
SQCSim2021/external/sfml251-32/doc/html/Context_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/ConvexShape_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/ConvexShape_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
74
SQCSim2021/external/sfml251-32/doc/html/Cursor_8hpp_source.html
vendored
Normal file
74
SQCSim2021/external/sfml251-32/doc/html/Cursor_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
61
SQCSim2021/external/sfml251-32/doc/html/Drawable_8hpp_source.html
vendored
Normal file
61
SQCSim2021/external/sfml251-32/doc/html/Drawable_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
58
SQCSim2021/external/sfml251-32/doc/html/Err_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/Err_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
146
SQCSim2021/external/sfml251-32/doc/html/Event_8hpp_source.html
vendored
Normal file
146
SQCSim2021/external/sfml251-32/doc/html/Event_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/FileInputStream_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/FileInputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
63
SQCSim2021/external/sfml251-32/doc/html/Font_8hpp_source.html
vendored
Normal file
63
SQCSim2021/external/sfml251-32/doc/html/Font_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/Ftp_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/Ftp_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/GlResource_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/GlResource_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/Glsl_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/Glsl_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
63
SQCSim2021/external/sfml251-32/doc/html/Glyph_8hpp_source.html
vendored
Normal file
63
SQCSim2021/external/sfml251-32/doc/html/Glyph_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
98
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp.html
vendored
Normal file
98
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp.html
vendored
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>SFML - Simple and Fast Multimedia Library</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;"/>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<!--<link rel='stylesheet' type='text/css' href="https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>-->
|
||||||
|
<link rel="stylesheet" type="text/css" href="doxygen.css" title="default" media="screen,print" />
|
||||||
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="banner-container">
|
||||||
|
<div id="banner">
|
||||||
|
<span id="sfml">SFML 2.5.1</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<!-- Generated by Doxygen 1.8.14 -->
|
||||||
|
<div id="navrow1" class="tabs">
|
||||||
|
<ul class="tablist">
|
||||||
|
<li><a href="index.html"><span>Main Page</span></a></li>
|
||||||
|
<li><a href="pages.html"><span>Related Pages</span></a></li>
|
||||||
|
<li><a href="modules.html"><span>Modules</span></a></li>
|
||||||
|
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
||||||
|
<li><a href="annotated.html"><span>Classes</span></a></li>
|
||||||
|
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="navrow2" class="tabs2">
|
||||||
|
<ul class="tablist">
|
||||||
|
<li><a href="files.html"><span>File List</span></a></li>
|
||||||
|
<li><a href="globals.html"><span>File Members</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="nav-path" class="navpath">
|
||||||
|
<ul>
|
||||||
|
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_c0a853e81d6f1c1f0a3eb7a27dc24256.html">SFML</a></li> </ul>
|
||||||
|
</div>
|
||||||
|
</div><!-- top -->
|
||||||
|
<div class="header">
|
||||||
|
<div class="summary">
|
||||||
|
<a href="#define-members">Macros</a> </div>
|
||||||
|
<div class="headertitle">
|
||||||
|
<div class="title">GpuPreference.hpp File Reference</div> </div>
|
||||||
|
</div><!--header-->
|
||||||
|
<div class="contents">
|
||||||
|
|
||||||
|
<p>Headers.
|
||||||
|
<a href="#details">More...</a></p>
|
||||||
|
<div class="textblock"><code>#include <SFML/Config.hpp></code><br />
|
||||||
|
</div>
|
||||||
|
<p><a href="GpuPreference_8hpp_source.html">Go to the source code of this file.</a></p>
|
||||||
|
<table class="memberdecls">
|
||||||
|
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
|
||||||
|
Macros</h2></td></tr>
|
||||||
|
<tr class="memitem:ab0233c2d867cbd561036ed2440a4fec0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="GpuPreference_8hpp.html#ab0233c2d867cbd561036ed2440a4fec0">SFML_DEFINE_DISCRETE_GPU_PREFERENCE</a></td></tr>
|
||||||
|
<tr class="memdesc:ab0233c2d867cbd561036ed2440a4fec0"><td class="mdescLeft"> </td><td class="mdescRight">A macro to encourage usage of the discrete GPU. <a href="#ab0233c2d867cbd561036ed2440a4fec0">More...</a><br /></td></tr>
|
||||||
|
<tr class="separator:ab0233c2d867cbd561036ed2440a4fec0"><td class="memSeparator" colspan="2"> </td></tr>
|
||||||
|
</table>
|
||||||
|
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
||||||
|
<div class="textblock"><p>Headers. </p>
|
||||||
|
<p>File containing SFML_DEFINE_DISCRETE_GPU_PREFERENCE </p>
|
||||||
|
|
||||||
|
<p class="definition">Definition in file <a class="el" href="GpuPreference_8hpp_source.html">GpuPreference.hpp</a>.</p>
|
||||||
|
</div><h2 class="groupheader">Macro Definition Documentation</h2>
|
||||||
|
<a id="ab0233c2d867cbd561036ed2440a4fec0"></a>
|
||||||
|
<h2 class="memtitle"><span class="permalink"><a href="#ab0233c2d867cbd561036ed2440a4fec0">◆ </a></span>SFML_DEFINE_DISCRETE_GPU_PREFERENCE</h2>
|
||||||
|
|
||||||
|
<div class="memitem">
|
||||||
|
<div class="memproto">
|
||||||
|
<table class="memname">
|
||||||
|
<tr>
|
||||||
|
<td class="memname">#define SFML_DEFINE_DISCRETE_GPU_PREFERENCE</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div><div class="memdoc">
|
||||||
|
|
||||||
|
<p>A macro to encourage usage of the discrete GPU. </p>
|
||||||
|
<p>In order to inform the Nvidia/AMD driver that an SFML application could benefit from using the more powerful discrete GPU, special symbols have to be publicly exported from the final executable.</p>
|
||||||
|
<p>SFML defines a helper macro to easily do this.</p>
|
||||||
|
<p>Place SFML_DEFINE_DISCRETE_GPU_PREFERENCE in the global scope of a source file that will be linked into the final executable. Typically it is best to place it where the main function is also defined. </p>
|
||||||
|
|
||||||
|
<p class="definition">Definition at line <a class="el" href="GpuPreference_8hpp_source.html#l00069">69</a> of file <a class="el" href="GpuPreference_8hpp_source.html">GpuPreference.hpp</a>.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- contents -->
|
||||||
|
</div>
|
||||||
|
<div id="footer-container">
|
||||||
|
<div id="footer">
|
||||||
|
SFML is licensed under the terms and conditions of the <a href="https://www.sfml-dev.org/license.php">zlib/png license</a>.<br>
|
||||||
|
Copyright © Laurent Gomila ::
|
||||||
|
Documentation generated by <a href="http://www.doxygen.org/" title="doxygen website">doxygen</a> ::
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
56
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Http_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Http_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
62
SQCSim2021/external/sfml251-32/doc/html/Image_8hpp_source.html
vendored
Normal file
62
SQCSim2021/external/sfml251-32/doc/html/Image_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
62
SQCSim2021/external/sfml251-32/doc/html/InputSoundFile_8hpp_source.html
vendored
Normal file
62
SQCSim2021/external/sfml251-32/doc/html/InputSoundFile_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/InputStream_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/InputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
64
SQCSim2021/external/sfml251-32/doc/html/IpAddress_8hpp_source.html
vendored
Normal file
64
SQCSim2021/external/sfml251-32/doc/html/IpAddress_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Joystick_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Joystick_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
160
SQCSim2021/external/sfml251-32/doc/html/Keyboard_8hpp_source.html
vendored
Normal file
160
SQCSim2021/external/sfml251-32/doc/html/Keyboard_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Listener_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Listener_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/Lock_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/Lock_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Main_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Main_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/MemoryInputStream_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/MemoryInputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
68
SQCSim2021/external/sfml251-32/doc/html/Mouse_8hpp_source.html
vendored
Normal file
68
SQCSim2021/external/sfml251-32/doc/html/Mouse_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
69
SQCSim2021/external/sfml251-32/doc/html/Music_8hpp_source.html
vendored
Normal file
69
SQCSim2021/external/sfml251-32/doc/html/Music_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Mutex_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Mutex_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
58
SQCSim2021/external/sfml251-32/doc/html/NativeActivity_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/NativeActivity_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Network_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Network_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Network_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Network_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/NonCopyable_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/NonCopyable_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/OpenGL_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/OpenGL_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/OutputSoundFile_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/OutputSoundFile_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
61
SQCSim2021/external/sfml251-32/doc/html/Packet_8hpp_source.html
vendored
Normal file
61
SQCSim2021/external/sfml251-32/doc/html/Packet_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
68
SQCSim2021/external/sfml251-32/doc/html/PrimitiveType_8hpp_source.html
vendored
Normal file
68
SQCSim2021/external/sfml251-32/doc/html/PrimitiveType_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
66
SQCSim2021/external/sfml251-32/doc/html/Rect_8hpp_source.html
vendored
Normal file
66
SQCSim2021/external/sfml251-32/doc/html/Rect_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/RectangleShape_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/RectangleShape_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
67
SQCSim2021/external/sfml251-32/doc/html/RenderStates_8hpp_source.html
vendored
Normal file
67
SQCSim2021/external/sfml251-32/doc/html/RenderStates_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
73
SQCSim2021/external/sfml251-32/doc/html/RenderTarget_8hpp_source.html
vendored
Normal file
73
SQCSim2021/external/sfml251-32/doc/html/RenderTarget_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
62
SQCSim2021/external/sfml251-32/doc/html/RenderTexture_8hpp_source.html
vendored
Normal file
62
SQCSim2021/external/sfml251-32/doc/html/RenderTexture_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
67
SQCSim2021/external/sfml251-32/doc/html/RenderWindow_8hpp_source.html
vendored
Normal file
67
SQCSim2021/external/sfml251-32/doc/html/RenderWindow_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
66
SQCSim2021/external/sfml251-32/doc/html/Sensor_8hpp_source.html
vendored
Normal file
66
SQCSim2021/external/sfml251-32/doc/html/Sensor_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
76
SQCSim2021/external/sfml251-32/doc/html/Shader_8hpp_source.html
vendored
Normal file
76
SQCSim2021/external/sfml251-32/doc/html/Shader_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user