Skip to content

File ClientInterface.hpp

File List > client > ClientInterface.hpp

Go to the documentation of this file



#pragma once

#include "Interfaces/NetWorth/NetworkInterface.hpp"
#include "Interfaces/TrashInterface.hpp"
#include "Interfaces/MainInterface.hpp"
#include "ClientManager.hpp"

namespace netWorth{
    using namespace sf;

    class ClientInterface : public NetworkingInterface, i_2D::MainInterface {
        private:
            netWorth::ClientManager *m_manager = nullptr;

        protected:

        public:
            ClientInterface(size_t id, const std::string & name) : cse491::InterfaceBase(id, name),
                                                                   NetworkingInterface(id, name),
                                                                   i_2D::MainInterface(id, name) {}

            bool Initialize() override {
                // resolve port and IP from entity properties
                m_ip = sf::IpAddress::resolve(NetworkingInterface::GetProperty<std::string>("server_ip"));
                m_port = NetworkingInterface::GetProperty<unsigned short>("server_port");
                m_manager = GetProperty<netWorth::ClientManager *>("manager");
                m_manager->setupSocket(&m_socket, m_ip);
                m_manager->setClientID(id);

                Packet sendPkt, recvPkt,twoPkt;
                setMInputWaitTime(0.25f);

                // send request message
                sendPkt << "New client requesting connection.";
                auto ip = m_ip.value();
                if (!sendPacket(sendPkt, ip, m_port)) return false;

                // receive from server
                if (!receivePacket(recvPkt, m_ip, m_port)) return false;
                // print received string (Connection established.)
                std::string msg;
                recvPkt >> msg;
                std::cout << msg << std::endl;

                // request map to start send/receive loop
                sendPkt.clear();
                sendPkt << "Requesting start";
                if (!sendPacket(sendPkt, m_ip.value(), m_port)) return false;


                // receive action map from server for previous agents
                receivePacket(recvPkt, m_ip, m_port);
                m_manager->packetToActionMap(recvPkt);

                return true;
            }

            size_t SelectAction(const cse491::WorldGrid & grid,
                                const cse491::type_options_t & typeOptions,
                                const cse491::item_map_t & itemMap,
                                const cse491::agent_map_t & agentMap) override
            {
                // Receive and draw map
                sf::Packet sendPkt, recvPkt;

                // grab action ID from MainInterface
                size_t actionID = i_2D::MainInterface::SelectAction(grid, typeOptions,
                            itemMap, agentMap);

                // Send instruction to server
                sendPkt << static_cast<uint64_t>(actionID);
                sendPacket(sendPkt, m_ip.value(), m_port);

                m_manager->clearActionMap();
                DrawGrid(grid, typeOptions, itemMap, agentMap);

                // await action map from server
                receivePacket(recvPkt, m_ip, m_port);
                m_manager->packetToActionMap(recvPkt);

                // Do the action!
                return actionID;
            }

    }; // End of ClientInterface
} // End of namespace NetWorth