vectozavr-shooter/Client.cpp

235 lines
7.8 KiB
C++
Raw Normal View History

2021-09-13 15:53:43 +03:00
//
// Created by Иван Ильин on 25.05.2021.
//
#include "Client.h"
2021-10-02 20:36:07 +03:00
#include <utility>
2021-10-09 13:41:12 +03:00
#include "engine/utils/Log.h"
2021-10-25 22:32:55 +03:00
#include "engine/animation/Timeline.h"
#include "engine/animation/ATranslateToPoint.h"
2021-10-28 16:58:02 +03:00
#include "ShooterMsgType.h"
2021-09-13 15:53:43 +03:00
void Client::updatePacket() {
sf::Packet packet;
2021-10-28 16:58:02 +03:00
packet << MsgType::ClientUpdate << _player->position().x() << _player->position().y() << _player->position().z() << _player->angle().y() << _player->headAngle() << _player->playerNickName();
2021-09-13 15:53:43 +03:00
_socket.send(packet, _socket.serverId());
}
void Client::processInit(sf::Packet& packet) {
sf::Uint16 targetId;
double buf[4];
2021-10-26 10:08:41 +03:00
int kills, deaths;
2021-09-13 15:53:43 +03:00
2021-10-26 10:08:41 +03:00
while (packet >> targetId >> buf[0] >> buf[1] >> buf[2] >> buf[3] >> kills >> deaths)
2021-09-13 15:53:43 +03:00
{
if(targetId != _socket.ownId()) {
2021-10-28 16:58:02 +03:00
if(_spawnPlayerCallBack != nullptr) {
_spawnPlayerCallBack(targetId);
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
_players[targetId]->translateToPoint(Vec3D{ buf[0], buf[1], buf[2]});
2021-09-13 15:53:43 +03:00
_players[targetId]->setHealth(buf[3]);
2021-10-26 10:08:41 +03:00
_players[targetId]->setKills(kills);
_players[targetId]->setDeaths(deaths);
2021-09-13 15:53:43 +03:00
}
}
}
void Client::processUpdate(sf::Packet& packet) {
sf::Uint16 targetId;
double buf[6];
2021-10-26 09:40:35 +03:00
std::string playerName;
2021-09-13 15:53:43 +03:00
2021-10-26 09:40:35 +03:00
while (packet >> targetId >> buf[0] >> buf[1] >> buf[2] >> buf[3] >> buf[4] >> buf[5] >> playerName) {
2021-09-13 15:53:43 +03:00
if (_players.count(targetId)) {
2021-10-28 16:58:02 +03:00
std::string name = "Enemy_" + std::to_string(targetId);
2021-10-25 22:32:55 +03:00
2021-10-28 16:58:02 +03:00
_players[targetId]->translateToPoint(Vec3D{buf[0], buf[1], buf[2]});
2021-10-25 22:32:55 +03:00
2021-09-13 15:53:43 +03:00
_players[targetId]->setHealth(buf[3]);
_players[targetId]->rotateToAngle(Vec3D{0, buf[4], 0});
2021-10-28 16:58:02 +03:00
_players[targetId]->setPlayerNickName(playerName);
2021-10-28 16:58:02 +03:00
auto head = _players[targetId]->attached(ObjectNameTag(name + "_head"));
auto weapon = _players[targetId]->attached(ObjectNameTag("Enemy_" + std::to_string(targetId) + "_weapon"));
2021-10-28 16:58:02 +03:00
if(head != nullptr) {
head->rotateLeft(buf[5] - _players[targetId]->headAngle());
}
if(weapon != nullptr) {
weapon->rotateLeft(-(buf[5] - _players[targetId]->headAngle()));
}
2021-10-02 20:36:07 +03:00
2021-09-13 15:53:43 +03:00
_players[targetId]->setHeadAngle(buf[5]);
} else if (targetId == _socket.ownId()) {
_player->setHealth(buf[3]);
}
}
}
void Client::processNewClient(sf::Packet& packet) {
sf::Uint16 targetId;
packet >> targetId;
2021-10-28 16:58:02 +03:00
if(_spawnPlayerCallBack != nullptr) {
_spawnPlayerCallBack(targetId);
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
}
void Client::processDisconnect(sf::Uint16 targetId) {
if (targetId != _socket.ownId() && _players.count(targetId)) {
_players.erase(targetId);
2021-10-02 20:36:07 +03:00
_removePlayerCallBack(targetId);
2021-09-13 15:53:43 +03:00
}
}
2021-10-28 16:58:02 +03:00
void Client::processCustomPacket(sf::Packet& packet) {
2021-09-13 15:53:43 +03:00
sf::Uint16 buffId[2];
double dbuff[10];
std::string tmp, tmp2;
2021-10-28 16:58:02 +03:00
ShooterMsgType type;
packet >> type;
2021-09-13 15:53:43 +03:00
switch (type) {
2021-10-28 16:58:02 +03:00
case ShooterMsgType::Kill:
2021-09-13 15:53:43 +03:00
packet >> buffId[0] >> buffId[1];
2021-10-26 09:50:59 +03:00
_lastEvent = "";
if(buffId[1] == _socket.ownId()) {
_player->addKill();
SoundController::playSound(SoundTag("kill"), ShooterConsts::KILL_SOUND);
2021-10-28 16:58:02 +03:00
_lastEvent += _player->playerNickName();
2021-10-26 09:50:59 +03:00
}
else {
_players[buffId[1]]->addKill();
2021-10-28 16:58:02 +03:00
_lastEvent += _players[buffId[1]]->playerNickName();
2021-10-26 09:50:59 +03:00
}
2021-10-26 14:51:14 +03:00
_lastEvent += " ~> ";
2021-10-26 09:50:59 +03:00
2021-09-13 15:53:43 +03:00
if(buffId[0] == _socket.ownId()) {
_player->addDeath();
// respawn
_player->translateToPoint(Vec3D{50.0*(-1 + 2.0*(double)rand()/RAND_MAX),30.0*(double)rand()/RAND_MAX,50.0*(-1 + 2.0*(double)rand()/RAND_MAX)});
2021-09-13 15:53:43 +03:00
_player->initWeapons();
_player->setFullAbility();
2021-10-17 19:38:16 +03:00
SoundController::playSound(SoundTag("death"), ShooterConsts::DEATH_SOUND);
2021-10-28 16:58:02 +03:00
_lastEvent += _player->playerNickName();
2021-09-13 15:53:43 +03:00
}
2021-10-26 09:50:59 +03:00
else {
2021-09-13 15:53:43 +03:00
_players[buffId[0]]->addDeath();
2021-10-28 16:58:02 +03:00
_lastEvent += _players[buffId[0]]->playerNickName();
2021-09-13 15:53:43 +03:00
}
break;
2021-10-28 16:58:02 +03:00
case ShooterMsgType::FireTrace:
2021-09-13 15:53:43 +03:00
packet >> dbuff[0] >> dbuff[1] >> dbuff[2] >> dbuff[3] >> dbuff[4] >> dbuff[5];
2021-10-28 16:58:02 +03:00
if(_addFireTraceCallBack != nullptr) {
_addFireTraceCallBack(Vec3D(dbuff[0], dbuff[1], dbuff[2]), Vec3D(dbuff[3], dbuff[4], dbuff[5]));
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
break;
2021-10-28 16:58:02 +03:00
case ShooterMsgType::InitBonuses:
2021-09-13 15:53:43 +03:00
while (packet >> tmp >> dbuff[0] >> dbuff[1] >> dbuff[2]) {
2021-10-28 16:58:02 +03:00
if(_addBonusCallBack != nullptr) {
_addBonusCallBack(tmp, Vec3D(dbuff[0], dbuff[1], dbuff[2]));
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
}
break;
2021-10-28 16:58:02 +03:00
case ShooterMsgType::AddBonus:
2021-09-13 15:53:43 +03:00
packet >> tmp >> dbuff[0] >> dbuff[1] >> dbuff[2];
2021-10-28 16:58:02 +03:00
if(_addBonusCallBack != nullptr) {
_addBonusCallBack(tmp, Vec3D(dbuff[0], dbuff[1], dbuff[2]));
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
break;
2021-10-28 16:58:02 +03:00
case ShooterMsgType::RemoveBonus:
2021-09-13 15:53:43 +03:00
packet >> tmp;
2021-10-28 16:58:02 +03:00
if(_removeBonusCallBack != nullptr) {
2021-10-17 10:21:10 +03:00
_removeBonusCallBack(ObjectNameTag(tmp));
2021-10-28 16:58:02 +03:00
}
2021-09-13 15:53:43 +03:00
break;
2021-10-28 16:58:02 +03:00
case ShooterMsgType::ChangeWeapon:
packet >> buffId[0] >> tmp;
2021-10-28 16:58:02 +03:00
if(_changeEnemyWeaponCallBack != nullptr) {
_changeEnemyWeaponCallBack(tmp, buffId[0]);
2021-10-28 16:58:02 +03:00
}
break;
2021-10-17 10:21:10 +03:00
default:
2021-10-28 16:58:02 +03:00
Log::log("Client::processCustomPacket: unknown message type " + std::to_string(static_cast<int>(type)));
2021-10-17 10:44:17 +03:00
return;
2021-09-13 15:53:43 +03:00
}
}
void Client::processDisconnected() {
for (auto it = _players.begin(); it != _players.end();) {
2021-10-02 20:36:07 +03:00
processDisconnect(it++->first);
2021-09-13 15:53:43 +03:00
}
}
void Client::damagePlayer(sf::Uint16 targetId, double damage) {
sf::Packet packet;
2021-10-28 16:58:02 +03:00
packet << MsgType::Custom << ShooterMsgType::Damage << targetId << damage;
_socket.sendRely(packet, _socket.serverId());
2021-09-13 15:53:43 +03:00
Log::log("Client: damagePlayer " + std::to_string(targetId) + " ( -" + std::to_string(damage) + "hp )");
}
void Client::addTrace(const Vec3D& from, const Vec3D& to) {
2021-09-13 15:53:43 +03:00
sf::Packet packet;
2021-10-28 16:58:02 +03:00
packet << MsgType::Custom << ShooterMsgType::FireTrace << from.x() << from.y() << from.z() << to.x() << to.y() << to.z();
2021-09-13 15:53:43 +03:00
_socket.send(packet, _socket.serverId());
}
void Client::takeBonus(const std::string& bonusName) {
sf::Packet packet;
2021-10-28 16:58:02 +03:00
packet << MsgType::Custom << ShooterMsgType::RemoveBonus << bonusName;
_socket.sendRely(packet, _socket.serverId());
2021-10-02 20:36:07 +03:00
2021-10-28 16:58:02 +03:00
if(_removeBonusCallBack != nullptr) {
2021-10-17 10:21:10 +03:00
_removeBonusCallBack(ObjectNameTag(bonusName));
2021-10-28 16:58:02 +03:00
}
2021-10-02 20:36:07 +03:00
}
void Client::changeWeapon(const std::string &weaponName) {
sf::Packet packet;
2021-10-28 16:58:02 +03:00
packet << MsgType::Custom << ShooterMsgType::ChangeWeapon << weaponName;
_socket.sendRely(packet, _socket.serverId());
}
2021-10-02 20:36:07 +03:00
void Client::addPlayer(sf::Uint16 id, std::shared_ptr<Player> player) {
_players.insert({ id, player });
}
void Client::setSpawnPlayerCallBack(std::function<void(sf::Uint16)> spawn) {
_spawnPlayerCallBack = std::move(spawn);
}
void Client::setRemovePlayerCallBack(std::function<void(sf::Uint16)> remove) {
_removePlayerCallBack = std::move(remove);
}
void Client::setAddFireTraceCallBack(std::function<void(const Vec3D &, const Vec3D &)> addTrace) {
2021-10-02 20:36:07 +03:00
_addFireTraceCallBack = std::move(addTrace);
}
void Client::setAddBonusCallBack(std::function<void(const std::string &, const Vec3D &)> addBonus) {
2021-10-02 20:36:07 +03:00
_addBonusCallBack = std::move(addBonus);
}
2021-10-17 10:21:10 +03:00
void Client::setRemoveBonusCallBack(std::function<void(const ObjectNameTag &)> removeBonus) {
2021-10-02 20:36:07 +03:00
_removeBonusCallBack = std::move(removeBonus);
2021-09-13 15:53:43 +03:00
}
void Client::setChangeEnemyWeaponCallBack(std::function<void(const std::string&, sf::Uint16)> changeEnemyWeapon) {
_changeEnemyWeaponCallBack = std::move(changeEnemyWeapon);
}