From fcee9637aa188439caf9af9faf3251a02d00611f Mon Sep 17 00:00:00 2001 From: CREAsTIVE Date: Sat, 23 Jul 2022 00:52:54 +0500 Subject: [PATCH] chat test 0.5 --- CMakeLists.txt | 5 +++-- Shooter.cpp | 37 +++++++++++++++++++++++++++++++++---- Shooter.h | 4 ++++ network/Chat.cpp | 26 ++++++++++++++++++++++++++ network/Chat.h | 20 ++++++++++++++++++++ network/ShooterClient.cpp | 18 ++++++++++++++++-- network/ShooterClient.h | 9 +++++++++ network/ShooterMsgType.h | 3 ++- network/ShooterServer.cpp | 11 +++++++++++ 9 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 network/Chat.cpp create mode 100644 network/Chat.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c0e34d1..17d251e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,8 @@ add_executable(${CMAKE_PROJECT_NAME} ShooterConsts.h network/ShooterMsgType.h network/ShooterMsgType.cpp + network/Chat.cpp + network/Chat.h # 3d engine: engine/Consts.h engine/math/Vec4D.h @@ -109,8 +111,7 @@ add_executable(${CMAKE_PROJECT_NAME} engine/network/UDPConnection.cpp engine/network/UDPConnection.h engine/network/UDPSocket.cpp - engine/network/UDPSocket.h - ) + engine/network/UDPSocket.h) if(APPLE OR UNIX) include_directories(/usr/local/include) diff --git a/Shooter.cpp b/Shooter.cpp index a16b13e..a168489 100644 --- a/Shooter.cpp +++ b/Shooter.cpp @@ -8,9 +8,8 @@ #include "engine/animation/Animations.h" #include "ShooterConsts.h" #include "engine/io/SoundController.h" - +#include "network/Chat.h" using namespace std; - // Read server/client settings and start both. // If client doesn't connect to the localhost - server doesn't start. void Shooter::initNetwork() { @@ -64,6 +63,7 @@ void Shooter::initNetwork() { client->setRemoveBonusCallBack([this](const ObjectNameTag &bonusName) { removeBonus(bonusName); }); client->setChangeEnemyWeaponCallBack( [this](const std::string &weaponName, sf::Uint16 id) { changeEnemyWeapon(weaponName, id); }); + } void Shooter::start() { @@ -128,11 +128,11 @@ void Shooter::start() { server->stop(); this->exit(); }, "Exit", 5, 5, ShooterConsts::MAIN_MENU_GUI, {0, 66}, {0, 86}, {0, 46}, Consts::MEDIUM_FONT, {255, 255, 255}); + client->setChatManager(chat); } void Shooter::update() { // This code executed every time step: - server->update(); client->update(); @@ -162,9 +162,31 @@ void Shooter::update() { screen->stopRender(); } + if (keyboard->isKeyTapped(sf::Keyboard::Enter)) { + if (isTypingMessage) { + client->sendMessage(message); + message = ""; + } + isTypingMessage = !isTypingMessage; + } + if (inGame) { screen->setTitle(ShooterConsts::PROJECT_NAME); - playerController->update(); + if (isTypingMessage) { + string msg; + cin >> msg; + message += msg; + + client->sendMessage(message); + message = ""; + isTypingMessage = false; + + Log::log(chat->getChat()); + } + else { + playerController->update(); + } + } else { mainMenu.update(); } @@ -175,6 +197,13 @@ void Shooter::update() { if (SoundController::getStatus(SoundTag("background")) != sf::Sound::Status::Playing) { SoundController::loadAndPlay(SoundTag("background"), ShooterConsts::BACK_NOISE); } + drawChat(); +} + +void Shooter::drawChat() { + sf::Color chatColor = sf::Color(0, 0, 0, chat->update(Time::deltaTime())); + string chatText = chat->getChat(); + screen->drawText(chatText, Vec2D{ 0, 0 }, 10, chatColor); } void Shooter::gui() { diff --git a/Shooter.h b/Shooter.h index a145ee4..9628784 100644 --- a/Shooter.h +++ b/Shooter.h @@ -26,6 +26,9 @@ private: std::shared_ptr server = std::make_shared(); std::shared_ptr client = std::make_shared(player); + std::shared_ptr chat = std::make_shared(); + bool isTypingMessage = false; + string message = ""; bool inGame = false; int fireTraces = 0; @@ -33,6 +36,7 @@ private: void start() override; void update() override; void gui() override; + void drawChat(); void play(); void drawPlayerStats(); void drawStatsTable(); diff --git a/network/Chat.cpp b/network/Chat.cpp new file mode 100644 index 0000000..89f406c --- /dev/null +++ b/network/Chat.cpp @@ -0,0 +1,26 @@ +#include "Chat.h" +#include +#include +void ChatManager::addNewMessage(std::string author, std::string message) { + hide = 3.0; + messages.push_back(message); + authors.push_back(author); + isChatUpdate = true; +} +int ChatManager::update(double delta) { + hide = std::max(hide-delta, 0.0); + return std::min((int)(hide * 255.0), 255); + +} +std::string ChatManager::getChat() { + if (isChatUpdate) { + isChatUpdate = false; + int size = messages.size(); + chatStr = ""; + for (int messageIndex = messages.size()-1; messageIndex > 0 && chatStr.size() < 100; messageIndex--) + { + chatStr += authors[messageIndex] + ": " + messages[messageIndex] + ";\n"; + } + } + return chatStr; +} diff --git a/network/Chat.h b/network/Chat.h new file mode 100644 index 0000000..f48854f --- /dev/null +++ b/network/Chat.h @@ -0,0 +1,20 @@ +//#ifndef SHOOTER_SHOOTERSERVER_H +#ifndef CHAT_H +#define CHAT_H +#include +#include +using namespace std; + +class ChatManager final { +private: + std::vector messages; + std::vector authors; + bool isChatUpdate = false; + std::string chatStr = "A: b\nC: D"; + double hide = 0.0; +public: + void addNewMessage(std::string author, std::string message); + int update(double delta); + std::string getChat(); +}; +#endif \ No newline at end of file diff --git a/network/ShooterClient.cpp b/network/ShooterClient.cpp index a4dc480..be6833d 100644 --- a/network/ShooterClient.cpp +++ b/network/ShooterClient.cpp @@ -27,7 +27,6 @@ void ShooterClient::processInit(sf::Packet &packet) { if (_spawnPlayerCallBack != nullptr) { _spawnPlayerCallBack(targetId); } - _players[targetId]->translateToPoint(Vec3D{x, y, z}); _players[targetId]->setHealth(health); _players[targetId]->setKills(kills); @@ -44,7 +43,7 @@ void ShooterClient::processUpdate(sf::Packet &packet) { while (packet >> targetId >> x >> y >> z >> health >> bodyAngle >> headAngle >> playerName) { if (_players.count(targetId)) { std::string name = "Enemy_" + std::to_string(targetId); - + Vec3D newPosition = Vec3D{x, y, z}; bool isAnimate = (_players[targetId]->position() - newPosition).sqrAbs() > 0.2; @@ -121,6 +120,15 @@ void ShooterClient::processDisconnect(sf::Uint16 targetId) { } } +void ShooterClient::sendMessage(string message){ + chatManager->addNewMessage(_player->playerNickName(), message); + sf::Packet packet; + packet << MsgType::Custom << ShooterMsgType::newMessage << message; + _socket.send(packet, _socket.serverId()); +} +void ShooterClient::newMessage(string message, string name) { + chatManager->addNewMessage(name, message); +} void ShooterClient::processCustomPacket(sf::Packet &packet) { sf::Uint16 buffId[2]; @@ -129,6 +137,7 @@ void ShooterClient::processCustomPacket(sf::Packet &packet) { ShooterMsgType type; packet >> type; + string name, message; switch (type) { case ShooterMsgType::Kill: @@ -225,6 +234,11 @@ void ShooterClient::processCustomPacket(sf::Packet &packet) { _changeEnemyWeaponCallBack(tmp, buffId[0]); } break; + case ShooterMsgType::newMessage: + + packet >> name >> message; + newMessage(name, message); + break; default: Log::log("ShooterClient::processCustomPacket: unknown message type " + std::to_string(static_cast(type))); diff --git a/network/ShooterClient.h b/network/ShooterClient.h index b622469..1b1934c 100644 --- a/network/ShooterClient.h +++ b/network/ShooterClient.h @@ -7,6 +7,7 @@ #include "../engine/network/ClientUDP.h" #include "../player/Player.h" +#include "Chat.h" class ShooterClient final : public ClientUDP { private: @@ -21,9 +22,15 @@ private: std::function _addBonusCallBack; std::function _removeBonusCallBack; std::function _changeEnemyWeaponCallBack; + + std::shared_ptr chatManager; public: explicit ShooterClient(std::shared_ptr player) : _player(player) {}; + void sendMessage(std::string message); + + void newMessage(std::string message, std::string name); + void updatePacket() override; void setSpawnPlayerCallBack(std::function spawn); @@ -58,6 +65,8 @@ public: void changeWeapon(const std::string &weaponName); + void setChatManager(std::shared_ptr chat) { chatManager = chat; }; + void addPlayer(sf::Uint16 id, std::shared_ptr player); [[nodiscard]] std::map> const &players() const { return _players; } diff --git a/network/ShooterMsgType.h b/network/ShooterMsgType.h index 91290e8..a49e079 100644 --- a/network/ShooterMsgType.h +++ b/network/ShooterMsgType.h @@ -14,7 +14,8 @@ enum class ShooterMsgType { InitBonuses, AddBonus, RemoveBonus, - ChangeWeapon + ChangeWeapon, + newMessage }; sf::Packet &operator<<(sf::Packet &packet, ShooterMsgType type); diff --git a/network/ShooterServer.cpp b/network/ShooterServer.cpp index a3955ff..243f46c 100644 --- a/network/ShooterServer.cpp +++ b/network/ShooterServer.cpp @@ -79,6 +79,7 @@ void ShooterServer::processCustomPacket(sf::Packet &packet, sf::Uint16 senderId) double damage; std::string tmp; double newHealth; + std::string message; ShooterMsgType type; packet >> type; @@ -140,6 +141,16 @@ void ShooterServer::processCustomPacket(sf::Packet &packet, sf::Uint16 senderId) } } + break; + case ShooterMsgType::newMessage: + + packet >> message; + sendPacket << MsgType::Custom << ShooterMsgType::ChangeWeapon << _players[senderId]->playerNickName() << message; + for (auto& player : _players) { + if (player.first != senderId) { + _socket.send(sendPacket, player.first); + } + } break; default: Log::log("ShooterServer::processCustomPacket: unknown message type " +