This commit is contained in:
MarcEricMartel 2023-12-18 11:10:10 -05:00
parent 2c346139d5
commit 9a669acd9c
5 changed files with 140 additions and 45 deletions

View File

@ -12,7 +12,9 @@ Bullet::~Bullet() {}
bool Bullet::Update(World* world, float elapsedtime, int perframe, std::unordered_map<uint64_t, Player*> mapPlayer, netprot::ChunkMod** chunkmod) { bool Bullet::Update(World* world, float elapsedtime, int perframe, std::unordered_map<uint64_t, Player*> mapPlayer, netprot::ChunkMod** chunkmod) {
int max = 100 / perframe; int max = 100 / perframe;
float damage = 0.098f; Player* shooter = mapPlayer.at(m_shooter_id);
float damage = shooter->boostdamage? 0.123f: 0.098f;
for (int x = 0; x < max; ++x) { for (int x = 0; x < max; ++x) {
m_currentpos += m_velocity * elapsedtime; m_currentpos += m_velocity * elapsedtime;
@ -29,7 +31,7 @@ bool Bullet::Update(World* world, float elapsedtime, int perframe, std::unordere
hit = true; hit = true;
} }
if (hit && !player->AmIDead()) { if (hit && !player->AmIDead()) {
if (m_canhurt) if (m_canhurt && !player->boostinvincible)
player->InflictDamage(damage); player->InflictDamage(damage);
player->m_hit = true; player->m_hit = true;

View File

@ -212,7 +212,14 @@ void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) {
memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + 1, hp8, sizeof(float)); memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + 1, hp8, sizeof(float));
*buflen = sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + sizeof(float) + 1; Boosts boost = sync->boost;
uint8_t boost8 = // Reste 6 bits.
(boost.invincible ? 0b10000000 : 0) |
(boost.damage ? 0b01000000 : 0);
memcpy(*buf + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + 2, &boost8, sizeof(uint8_t));
*buflen = sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + sizeof(float) + 2;
} }
void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) { void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) {
@ -514,6 +521,53 @@ void netprot::Serialize(BulletAdd* bull, char* buf[], uint32_t* buflen) {
*buflen = 1 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 6; *buflen = 1 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 6;
} }
void netprot::Serialize(PickupMod* pmod, char* buf[], uint32_t* buflen) {
*buf[0] = (char)netprot::PACKET_TYPE::PICKUPMOD;
uint64_t id = pmod->id;
uint8_t id8[sizeof(uint64_t)] = { (uint8_t)((id >> 56) & 0xFF),
(uint8_t)((id >> 48) & 0xFF),
(uint8_t)((id >> 40) & 0xFF),
(uint8_t)((id >> 32) & 0xFF),
(uint8_t)((id >> 24) & 0xFF),
(uint8_t)((id >> 16) & 0xFF),
(uint8_t)((id >> 8) & 0xFF),
(uint8_t)(id & 0xFF) };
memcpy(*buf + 1, id8, sizeof(uint64_t));
uint32_t vec[3];
memcpy(vec, &pmod->pos, sizeof(Vector3f)); // Pour d<>naturer les floats.
uint8_t vec8[3 * sizeof(uint32_t)] = {
(uint8_t)((vec[0] >> 24) & 0xFF),
(uint8_t)((vec[0] >> 16) & 0xFF),
(uint8_t)((vec[0] >> 8) & 0xFF),
(uint8_t)(vec[0] & 0xFF),
(uint8_t)((vec[1] >> 24) & 0xFF),
(uint8_t)((vec[1] >> 16) & 0xFF),
(uint8_t)((vec[1] >> 8) & 0xFF),
(uint8_t)(vec[1] & 0xFF),
(uint8_t)((vec[2] >> 24) & 0xFF),
(uint8_t)((vec[2] >> 16) & 0xFF),
(uint8_t)((vec[2] >> 8) & 0xFF),
(uint8_t)(vec[2] & 0xFF) };
memcpy(*buf + sizeof(uint64_t) + 1, vec8, sizeof(uint32_t) * 3);
Boosts boost = pmod->boost;
uint8_t boost8 = // Reste 5 bits.
(boost.invincible ? 0b10000000 : 0) |
(boost.damage ? 0b01000000 : 0) |
(boost.hp ? 0b00100000 : 0);
memcpy(*buf + sizeof(uint64_t) + sizeof(uint32_t) * 3 + 1, &boost8, sizeof(uint8_t));
memcpy(*buf + 2 + sizeof(uint64_t) + sizeof(uint32_t) * 3, &pmod->available, sizeof(bool));
*buflen = 2 + sizeof(uint64_t) + sizeof(uint32_t) * 3 + 3;
}
void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) { void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) {
*buf[0] = (char)netprot::PACKET_TYPE::ERRLOG; *buf[0] = (char)netprot::PACKET_TYPE::ERRLOG;
@ -528,6 +582,7 @@ void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) {
bool netprot::Deserialize(Input* in, char* buf, uint32_t* buflen) { bool netprot::Deserialize(Input* in, char* buf, uint32_t* buflen) {
if (*buflen <= sizeof(Input)) if (*buflen <= sizeof(Input))
return false; return false;
@ -736,7 +791,12 @@ bool netprot::Deserialize(Sync* sync, char* buf, uint32_t* buflen) {
memcpy(&sync->hp, &hp, sizeof(float)); memcpy(&sync->hp, &hp, sizeof(float));
*buflen = 1 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + sizeof(float); uint8_t boost = 0;
memcpy(&boost, &buf[2 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t)], sizeof(uint8_t));
sync->boost.invincible = boost & 0b10000000;
sync->boost.damage = boost & 0b01000000;
*buflen = 2 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + sizeof(float);
return true; return true;
} }
@ -1059,6 +1119,53 @@ bool netprot::Deserialize(ErrorLog* errlog, char* buf, uint32_t* buflen) {
return true; return true;
} }
bool netprot::Deserialize(PickupMod* pmod, char* buf, uint32_t* buflen) {
if (*buflen <= sizeof(PickupMod))
return false;
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
memcpy(diff, &buf[1], sizeof(uint64_t));
pmod->id =
(uint64_t)diff[0] << 56 |
(uint64_t)diff[1] << 48 |
(uint64_t)diff[2] << 40 |
(uint64_t)diff[3] << 32 |
(uint64_t)diff[4] << 24 |
(uint64_t)diff[5] << 16 |
(uint64_t)diff[6] << 8 |
(uint64_t)diff[7];
uint8_t subvec[3 * sizeof(uint32_t)] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
memcpy(subvec, &buf[2 + sizeof(uint64_t)], sizeof(uint8_t) * 12);
uint32_t vec[3] = {
(uint32_t)subvec[0] << 24 |
(uint32_t)subvec[1] << 16 |
(uint32_t)subvec[2] << 8 |
(uint32_t)subvec[3],
(uint32_t)subvec[4] << 24 |
(uint32_t)subvec[5] << 16 |
(uint32_t)subvec[6] << 8 |
(uint32_t)subvec[7],
(uint32_t)subvec[8] << 24 |
(uint32_t)subvec[9] << 16 |
(uint32_t)subvec[10] << 8 |
(uint32_t)subvec[11] };
memcpy(&pmod->pos, vec, sizeof(uint32_t) * 3);
uint8_t boosts = 0;
memcpy(&boosts, &buf[1 + sizeof(uint64_t) + sizeof(uint32_t) * 3], sizeof(uint8_t));
pmod->boost.invincible = boosts & 0b10000000;
pmod->boost.damage = boosts & 0b01000000;
pmod->boost.hp = boosts & 0b00100000;
memcpy(&pmod->available, &buf[2 + sizeof(uint64_t) + sizeof(uint32_t) * 3], sizeof(bool));
*buflen = 3 + sizeof(uint64_t) + sizeof(uint32_t) * 3;
return true;
}
netprot::PACKET_TYPE netprot::getType(char* buf, const uint32_t buflen) { netprot::PACKET_TYPE netprot::getType(char* buf, const uint32_t buflen) {

View File

@ -58,6 +58,12 @@ namespace netprot {
running = false; running = false;
}; };
struct Boosts {
bool invincible = false,
damage = false,
hp = false;
};
/* Structures de paquets */ /* Structures de paquets */
struct Input { // cli -> srv UDP ~frame struct Input { // cli -> srv UDP ~frame
@ -80,10 +86,11 @@ namespace netprot {
uint64_t sid = 0; uint64_t sid = 0;
uint32_t timer = 0; uint32_t timer = 0;
uint16_t ammo = 0; uint16_t ammo = 0;
Boosts boost;
float hp = 0; float hp = 0;
Vector3f position; Vector3f position;
Sync() {} Sync() {}
Sync(Sync* sync) : timestamp(sync->timestamp), sid(sync->sid), timer(sync->timer), ammo(sync->ammo), hp(sync->hp), position(sync->position) {} Sync(Sync* sync) : timestamp(sync->timestamp), sid(sync->sid), timer(sync->timer), ammo(sync->ammo), hp(sync->hp), position(sync->position), boost(sync->boost) {}
}; };
struct TeamInfo { // cli <-> srv TCP once struct TeamInfo { // cli <-> srv TCP once
@ -121,6 +128,15 @@ namespace netprot {
GameInfo(GameInfo* gam) : seed(gam->seed), countdown(gam->countdown), gameType(gam->gameType) {} GameInfo(GameInfo* gam) : seed(gam->seed), countdown(gam->countdown), gameType(gam->gameType) {}
}; };
struct PickupMod {
uint64_t id;
Vector3f pos;
Boosts boost;
bool available = true;
PickupMod();
PickupMod(PickupMod* pmod) : id(pmod->id), pos(pmod->pos), boost(pmod->boost), available(pmod->available) {}
};
struct Chat { // cli <-> srv TCP event struct Chat { // cli <-> srv TCP event
uint64_t src_id = 0, uint64_t src_id = 0,
dest_id = 0, dest_id = 0,
@ -161,6 +177,7 @@ namespace netprot {
void Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen); // cli/srv void Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen); // cli/srv
void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv
void Serialize(ChunkMod* chmod, char* buf[], uint32_t* buflen); // srv void Serialize(ChunkMod* chmod, char* buf[], uint32_t* buflen); // srv
void Serialize(PickupMod* chmod, char* buf[], uint32_t* buflen); // srv
void Serialize(BulletAdd* bull, char* buf[], uint32_t* buflen); // srv void Serialize(BulletAdd* bull, char* buf[], uint32_t* buflen); // srv
void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv
@ -173,6 +190,7 @@ namespace netprot {
bool Deserialize(GameInfo* ginfo, char* buf, uint32_t* buflen); // cli bool Deserialize(GameInfo* ginfo, char* buf, uint32_t* buflen); // cli
bool Deserialize(Chat* chat, char* buf, uint32_t* buflen); // srv/cli bool Deserialize(Chat* chat, char* buf, uint32_t* buflen); // srv/cli
bool Deserialize(ChunkMod* chmod, char* buf, uint32_t* buflen); // cli bool Deserialize(ChunkMod* chmod, char* buf, uint32_t* buflen); // cli
bool Deserialize(PickupMod* chmod, char* buf, uint32_t* buflen); // cli
bool Deserialize(BulletAdd* bull, char* buf, uint32_t* buflen); // cli bool Deserialize(BulletAdd* bull, char* buf, uint32_t* buflen); // cli
bool Deserialize(ErrorLog* errlog, char* buf, uint32_t* buflen); // srv bool Deserialize(ErrorLog* errlog, char* buf, uint32_t* buflen); // srv

View File

@ -124,7 +124,6 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi
bt2 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z); bt2 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z);
bt3 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z); bt3 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z);
if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
//input.x = m_velocity.x = 0;
m_velocity.y += .04f; m_velocity.y += .04f;
m_velocity.z *= .5f; m_velocity.z *= .5f;
m_velocity.x *= .5f; m_velocity.x *= .5f;
@ -134,50 +133,17 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi
bt2 = world->BlockAt(GetPosition().x, GetPosition().y - 0.9f, GetPosition().z + input.z); bt2 = world->BlockAt(GetPosition().x, GetPosition().y - 0.9f, GetPosition().z + input.z);
bt3 = world->BlockAt(GetPosition().x, GetPosition().y - 1.7f, GetPosition().z + input.z); bt3 = world->BlockAt(GetPosition().x, GetPosition().y - 1.7f, GetPosition().z + input.z);
if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) { if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
//input.z = m_velocity.z = 0;
m_velocity.y += .04f; m_velocity.y += .04f;
m_velocity.z *= .5f; m_velocity.z *= .5f;
m_velocity.x *= .5f; m_velocity.x *= .5f;
} }
//bt1 = world->BlockAt(GetPosition().x + input.x, GetPosition().y, GetPosition().z);
//bt2 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 0.9f, GetPosition().z);
//bt3 = world->BlockAt(GetPosition().x + input.x, GetPosition().y - 1.7f, GetPosition().z);
//if (bt1 == BTYPE_AIR && bt2 != BTYPE_AIR && bt3 != BTYPE_AIR) {
// if (input.x > 0)
// input.x = m_velocity.x = 0.5f;
// else
// input.x = m_velocity.x = -0.5f;
// m_velocity.y = 0.3;
// m_velocity.z *= .5f;
//}
//else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
// input.x = m_velocity.x = 0;
// m_velocity.z *= .5f;
//}
//bt1 = world->BlockAt(GetPosition().x, GetPosition().y, GetPosition().z + input.z);
//bt2 = world->BlockAt(GetPosition().x, GetPosition().y - 0.9f, GetPosition().z + input.z);
//bt3 = world->BlockAt(GetPosition().x, GetPosition().y - 1.7f, GetPosition().z + input.z);
//if (bt1 == BTYPE_AIR && bt2 != BTYPE_AIR && bt3 != BTYPE_AIR) {
// if (input.z > 0)
// input.z = m_velocity.z = 0.5f;
// else
// input.z = m_velocity.z = -0.5f;
// m_velocity.y = 0.3;
// m_velocity.x *= .5f;
//}
//else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
// input.z = m_velocity.z = 0;
// m_velocity.x *= .5f;
//}
/* Fin gestion de collisions */ /* Fin gestion de collisions */
/* Gestion de la friction */ /* Gestion de la friction */
if (!m_airborne) { if (!m_airborne) {
m_velocity.x += input.x * 2.f * elapsedTime; m_velocity.x += input.x * (boostspeed ? 2.5f : 2.f) * elapsedTime;
m_velocity.z += input.z * 2.f * elapsedTime; m_velocity.z += input.z * (boostspeed ? 2.5f : 2.f) * elapsedTime;
if (input.x == 0.f) if (input.x == 0.f)
m_velocity.x *= .8f; m_velocity.x *= .8f;
@ -195,7 +161,7 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi
/* Fin gestion de la friction */ /* Fin gestion de la friction */
float vy = m_velocity.y; float vy = m_velocity.y;
m_velocity.y = 1.f; // Padding pour limiter le x et z lors du Normalize(). m_velocity.y = boostspeed ? 0.f: 1.f; // Padding pour limiter le x et z lors du Normalize().
if (m_velocity.Length() >= 1.f) m_velocity.Normalize(); // Limiteur de vitesse en x/z. if (m_velocity.Length() >= 1.f) m_velocity.Normalize(); // Limiteur de vitesse en x/z.
m_velocity.y = 0; m_velocity.y = 0;
if (m_velocity.Length() < .005f) m_velocity.Zero(); // Threshold en x/z. if (m_velocity.Length() < .005f) m_velocity.Zero(); // Threshold en x/z.

View File

@ -50,6 +50,10 @@ public:
bool Eulogy = false; bool Eulogy = false;
bool boostspeed;
bool boostdamage;
bool boostinvincible;
private: private:
uint64_t getId() const; uint64_t getId() const;
@ -72,9 +76,7 @@ protected:
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); Vector3f InterpolatePosition(const Vector3f& vec1, const Vector3f& vec2, const Timestamp& tim1, const Timestamp& tim2, const Timestamp& now);
}; };