Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Server.hpp"
- #include "Debug.hpp"
- #include "Player.hpp"
- #include "Packet.hpp"
- #include "TuningFromString.hpp"
- #include "amx/amx.h"
- #pragma comment(lib, "steam_api.lib")
- #define DEBUG_NOSTEAM
- using boost::asio::ip::tcp;
- Server::Server(json::value cfg) : m_acceptor(m_io)
- {
- m_authEnabled = SteamGameServer_Init(INADDR_ANY, 1552, 1550, 1551, eServerModeAuthenticationAndSecure, "1.0.0.0");
- if(!m_authEnabled)
- Debug::LogWrite("WARNING: Can't create a Steam game server; authorization disabled");
- else
- {
- SteamGameServer()->SetMaxPlayerCount(4);
- SteamGameServer()->SetPasswordProtected(false);
- SteamGameServer()->SetModDir("plakmp");
- SteamGameServer()->SetProduct("Plak1");
- SteamGameServer()->SetGameDescription("PlakMP Server");
- SteamGameServer()->LogOnAnonymous();
- SteamGameServer()->EnableHeartbeats(true);
- while(!SteamGameServer()->BLoggedOn())
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- //SteamGameServer()->SetGameData("PlakMPServer"); // we use the generic sourcesdk app: use this to distinguish from other servers
- SteamGameServer()->SetMapName("Rockport");
- SteamGameServer()->SetServerName("PlakMPServer");
- Debug::LogWrite("Steam Public IP: 0x%08X Logged on: %d SteamID: %lu", SteamGameServer()->GetPublicIP(), (int) SteamGameServer()->BLoggedOn(), SteamGameServer()->GetSteamID());
- }
- m_port = uint16_t(cfg["serverPort"].as_int());
- Debug::LogWrite("Server name: %s", cfg["serverName"].as_string().c_str());
- Debug::LogWrite("Max Players: %d", cfg["maxPlayers"].as_int());
- ReadStockCars(cfg["stockCarsPath"].as_string().c_str());
- m_delay = uint32_t(cfg["delay"].as_int());
- m_connectionTimeout = uint32_t(cfg["connectionTimeout"].as_int());
- m_pSocketUDP = new boost::asio::ip::udp::socket(m_io);
- m_pSocketUDP->non_blocking(true);
- m_pRecvBufferUDP = (char*)malloc(65535);
- InitPlugins();
- m_stop = false;
- }
- Server::~Server()
- {
- if (m_authEnabled)
- SteamGameServer_Shutdown();
- for (StockVehicle* pSV : m_stockCars)
- delete pSV;
- if (m_acceptor.is_open())
- m_acceptor.close();
- }
- void Server::AddPlayer(Player * pPlayer)
- {
- m_playerPtrs.push_back(pPlayer);
- }
- void Server::DeletePlayer(Player * pPlayer)
- {
- ScOnPlayerDisconnect(pPlayer->m_uid);
- if (m_authEnabled) // Steam authorization
- {
- SteamGameServer()->EndAuthSession(pPlayer->m_steamID);
- }
- if (!pPlayer->m_pending)
- BroadcastPlayerLeave(pPlayer);
- m_playerPtrs.erase(std::find(m_playerPtrs.begin(), m_playerPtrs.end(), pPlayer));
- delete pPlayer;
- }
- void Server::Accept(Player * pPlayer)
- {
- pPlayer->m_pending = false; // player accepted!
- Debug::LogWrite("Player %s joined the game", pPlayer->m_name.c_str());
- m_packet.Reset(DN_PLAYER_ACCEPTED);
- m_packet.WriteInt(pPlayer->m_uid);
- m_packet.WriteInt((uint32_t)pPlayer->m_pPlayerInfo->level);
- m_packet.WriteInt(pPlayer->m_pPlayerInfo->money);
- CSteamID id = SteamGameServer()->GetSteamID();
- m_packet.WriteData(&id, 8);
- if (!pPlayer->SendPacket(&m_packet))
- {
- Debug::LogWrite("Can`t send accept packet to %s", pPlayer->m_name.c_str());
- pPlayer->m_destroy = true;
- }
- ScOnPlayerConnect(pPlayer->m_uid);
- }
- void Server::Kick(Player * pPlayer, const std::string& reason)
- {
- pPlayer->m_disconnectReason = "Kicked: " + reason;
- //Debug::LogWrite("Player %s kicked for '%s'", pPlayer->m_name.c_str(), reason.c_str());
- pPlayer->m_destroy = true;
- m_packet.Reset(DN_DISCONNECT);
- m_packet.WriteString(reason);
- pPlayer->SendPacket(&m_packet);
- }
- void Server::Run()
- {
- try
- {
- tcp::endpoint ep(tcp::v4(), m_port);
- m_acceptor.open(ep.protocol());
- m_acceptor.bind(ep);
- m_acceptor.listen();
- m_acceptor.non_blocking(true);
- }
- catch (const std::exception& ex)
- {
- Debug::LogWrite("PlakMP Server %s can't run on port %u, ex: ", SERVER_VERSION, m_port, ex.what());
- return;
- }
- udp::socket socket(m_io, udp::endpoint(udp::v4(), m_port));
- Debug::LogWrite("PlakMP Server %s running on port %u", SERVER_VERSION, m_port);
- std::vector<Player*> badGuys;
- tcp::socket* pSocket = new tcp::socket(m_io);
- while (!m_stop)
- {
- boost::system::error_code ec;
- m_acceptor.accept(*pSocket, ec);
- if (!ec)
- {
- Player* pPlayer = new Player(0, "CONNECTING", pSocket);
- AddPlayer(pPlayer);
- pSocket = new tcp::socket(m_io);
- }
- size_t playerCount = m_playerPtrs.size();
- for (size_t i = 0; i < playerCount; i++)
- {
- Player* pPlayer = m_playerPtrs[i];
- Packet* pPacket;
- uint32_t result = pPlayer->RecvPacket(&pPacket);
- if (result == 2) // disconnected
- {
- //Debug::LogWrite("Disconnected %s", pPlayer->m_name.c_str());
- Debug::LogWrite("Technical disconnection of %s", pPlayer->m_name.c_str());
- badGuys.push_back(pPlayer);
- continue;
- }
- else if (result == 1) // no packets
- {
- if (pPlayer->m_lastPacketTime && time(nullptr) - pPlayer->m_lastPacketTime > m_connectionTimeout)
- {
- Debug::LogWrite("Timeout of %s", pPlayer->m_name.c_str());
- pPlayer->m_disconnectReason = "Timeout/Crash";
- badGuys.push_back(pPlayer);
- }
- continue;
- }
- pPlayer->m_lastPacketTime = time(nullptr);
- if (pPlayer->m_pending)
- {
- if (pPacket->Type() == UP_LOGIN_PLAYER)
- {
- LoginHandler(pPlayer, pPacket);
- }
- else
- {
- Debug::LogWrite("Invalid login packet from %s", pPlayer->GetAddress().c_str());
- badGuys.push_back(pPlayer);
- continue;
- }
- }
- else
- {
- //Debug::LogWrite("Received packet %d from %s", pPacket->Type(), pPlayer->m_name.c_str());
- switch (pPacket->Type())
- {
- case UP_DISCONNECT:
- Debug::LogWrite("Received disconncet from %s", pPlayer->m_name.c_str());
- pPlayer->m_destroy = true;
- break;
- case UP_CHAT:
- ChatHandler(pPlayer, pPacket);
- break;
- case UP_CAR_BUY:
- BuyCarHandler(pPlayer, pPacket);
- break;
- case UP_MAP_JOIN:
- MapJoinHandler(pPlayer);
- break;
- case UP_MAP_QUIT:
- MapQuitHandler(pPlayer);
- break;
- case UP_CAR_SELECT:
- CarSelectHandler(pPlayer, pPacket);
- break;
- case UP_NPC_SPAWN:
- NpcSpawnHandler(pPlayer, pPacket);
- break;
- case UP_NPC_DESPAWN:
- NpcDespawnHandler(pPlayer, pPacket);
- break;
- case UP_NPC_SYNC:
- NpcSyncHandler(pPlayer, pPacket);
- break;
- case UP_KEEPALIVE:
- break;
- case UP_OK:
- break;
- default:
- Kick(pPlayer, std::string("Invalid packet ") + std::to_string(pPacket->Type()));
- break;
- }
- }
- if (pPlayer->m_destroy)
- {
- badGuys.push_back(pPlayer);
- continue;
- }
- }
- for (Player* pBadGuy : badGuys)
- DeletePlayer(pBadGuy);
- badGuys.clear();
- if (m_authEnabled)
- SteamGameServer_RunCallbacks();
- udp::endpoint remote_endpoint;
- boost::system::error_code error;
- size_t size = socket.receive_from(boost::asio::buffer(m_pRecvBufferUDP, 65535),
- remote_endpoint, 0, error);
- if (error && error != boost::asio::error::message_size)
- {
- Debug::LogWrite("error: %s", error.message().c_str());
- }
- if (size > 4)
- {
- uint32_t packetSize = *(uint32_t*)m_pRecvBufferUDP;
- if (packetSize == size)
- {
- m_packetUDP.Update(m_pRecvBufferUDP, packetSize);
- switch (m_packetUDP.Type())
- {
- case UP_SYNC:
- SyncHandler(&m_packetUDP);
- break;
- }
- }
- }
- if (m_delay > 0)
- std::this_thread::sleep_for(std::chrono::milliseconds(m_delay));
- }
- // destroy all clients and kill their threads
- Debug::LogWrite("The server is stopping");
- for (Player* pPlayer : m_playerPtrs)
- pPlayer->m_destroy = true;
- }
- void Server::PlayerWorkerThread(Server * pServer) { pServer->PlayerWorker(); }
- void Server::PlayerWorker()
- {
- std::vector<Player*> badGuys;
- while (true)
- {
- size_t playerCount = m_playerPtrs.size();
- if (playerCount == 0)
- break;
- for (size_t i = 0; i < playerCount; i++)
- {
- Player* pPlayer = m_playerPtrs[i];
- Packet* pPacket;
- uint32_t result = pPlayer->RecvPacket(&pPacket);
- if (result == 2) // disconnected
- {
- //Debug::LogWrite("Disconnected %s", pPlayer->m_name.c_str());
- badGuys.push_back(pPlayer);
- continue;
- }
- else if (result == 1) // no packets
- {
- if (pPlayer->m_lastPacketTime && time(nullptr) - pPlayer->m_lastPacketTime > m_connectionTimeout)
- {
- pPlayer->m_disconnectReason = "Timeout/Crash";
- badGuys.push_back(pPlayer);
- }
- continue;
- }
- pPlayer->m_lastPacketTime = time(nullptr);
- if (pPlayer->m_pending)
- {
- if (pPacket->Type() == UP_LOGIN_PLAYER)
- {
- LoginHandler(pPlayer, pPacket);
- }
- else
- {
- Debug::LogWrite("Invalid login packet from %s", pPlayer->GetAddress().c_str());
- badGuys.push_back(pPlayer);
- continue;
- }
- }
- else
- {
- switch (pPacket->Type())
- {
- case UP_DISCONNECT:
- pPlayer->m_destroy = true;
- break;
- case UP_CHAT:
- ChatHandler(pPlayer, pPacket);
- break;
- case UP_CAR_BUY:
- BuyCarHandler(pPlayer, pPacket);
- break;
- case UP_MAP_JOIN:
- MapJoinHandler(pPlayer);
- break;
- case UP_MAP_QUIT:
- MapQuitHandler(pPlayer);
- break;
- case UP_CAR_SELECT:
- CarSelectHandler(pPlayer, pPacket);
- break;
- case UP_SYNC:
- SyncHandler(pPacket);
- break;
- case UP_NPC_SPAWN:
- NpcSpawnHandler(pPlayer, pPacket);
- break;
- case UP_NPC_DESPAWN:
- NpcDespawnHandler(pPlayer, pPacket);
- break;
- case UP_NPC_SYNC:
- NpcSyncHandler(pPlayer, pPacket);
- break;
- case UP_KEEPALIVE:
- break;
- case UP_OK:
- break;
- default:
- Kick(pPlayer, std::string("Invalid packet ") + std::to_string(pPacket->Type()));
- break;
- }
- }
- if (pPlayer->m_destroy)
- {
- badGuys.push_back(pPlayer);
- continue;
- }
- }
- for (Player* pBadGuy : badGuys)
- DeletePlayer(pBadGuy);
- badGuys.clear();
- if (m_authEnabled)
- SteamGameServer_RunCallbacks();
- if (m_delay > 0)
- std::this_thread::sleep_for(std::chrono::milliseconds(m_delay));
- }
- }
- void Server::LoginHandler(Player* pPlayer, Packet* pPacket)
- {
- if (!pPlayer->m_pending)
- Kick(pPlayer, "Are you already login");
- static uint32_t lastPlayerID = 1;
- if (pPacket->ReadString() != "FULL_PLAK_FULL_PLAK_FULL_PLAK_FULL_PLAK")
- {
- Debug::LogWrite("Incorrect connecting keyword.");
- return;
- }
- if (pPacket->ReadInt() != CSPVERSION)
- {
- Debug::LogWrite("Invalid protocol version");
- return;
- }
- pPlayer->m_name = pPacket->ReadString();
- pPlayer->m_uid = lastPlayerID;
- #ifndef DEBUG_NOSTEAM
- if (m_authEnabled)
- {
- // steam auth
- try {
- uint64_t userID;
- pPacket->ReadData(&userID, sizeof(userID));
- pPlayer->m_steamID = userID;
- CSteamID steamID(userID);
- uint32_t ticketSize = pPacket->ReadInt();
- void* pTicket = malloc(ticketSize);
- pPacket->ReadData(pTicket, ticketSize);
- EBeginAuthSessionResult result = SteamGameServer()->BeginAuthSession(pTicket, ticketSize, steamID);
- if (result != EBeginAuthSessionResult::k_EBeginAuthSessionResultOK)
- {
- Kick(pPlayer, "Invalid Steam ticket");
- return;
- }
- }
- catch(const Packet::Exception &e)
- {
- Kick(pPlayer, "Can't auth using Steam");
- return;
- }
- }
- #endif
- // const char* szAccessToken = pPacket->ReadStringInside();
- pPlayer->AcquirePlayerInfo();
- if (!pPlayer->m_pPlayerInfo)
- {
- Kick(pPlayer, "Can't read player info");
- return;
- }
- if (pPlayer->m_pPlayerInfo->isBanned)
- {
- Kick(pPlayer, "You have been banned from this server!");
- return;
- }
- lastPlayerID++;
- Accept(pPlayer);
- if (pPlayer->m_destroy)
- return;
- SendPlayers(pPlayer);
- SendStockCars(pPlayer);
- SendCars(pPlayer);
- if (pPlayer->m_destroy)
- return;
- BroadcastPlayerJoin(pPlayer);
- }
- void Server::BroadcastPacket(Packet * pPacket, Player* pIgnore)
- {
- //LOCK();
- for (Player* pPlayer : m_playerPtrs)
- {
- if (!pPlayer->m_pending && pPlayer != pIgnore)
- {
- if (!pPlayer->SendPacket(pPacket))
- {
- pPlayer->m_destroy = true;
- }
- }
- }
- //UNLOCK();
- }
- void Server::BroadcastPacketUDP(Packet * pPacket, Player* pIgnore)
- {
- //LOCK();
- for (Player* pPlayer : m_playerPtrs)
- {
- if (!pPlayer->m_pending && pPlayer != pIgnore)
- {
- try
- {
- m_pSocketUDP->send_to(pPacket->RawData(), pPlayer->m_endpoint);
- }
- catch (...)
- {
- }
- }
- }
- //UNLOCK();
- }
- void Server::ChatHandler(Player* pSender, Packet* pPacket)
- {
- const char* szMessage;
- try
- {
- szMessage = pPacket->ReadStringInside();
- }
- catch (const Packet::Exception)
- {
- Debug::LogWrite("Invalid packet in " __FUNCTION__ " from %s", pSender->m_name.c_str());
- pSender->m_destroy = true;
- return;
- }
- if (szMessage[0] == '/')
- ScOnPlayerCommandText(pSender->m_uid, szMessage);
- else
- {
- Debug::LogWrite("[%s]: %s", pSender->m_name.c_str(), szMessage);
- BroadcastChatMessage(pSender->m_uid, szMessage);
- }
- }
- void Server::BuyCarHandler(Player * pSender, Packet * pPacket)
- {
- uint32_t stockCID;
- try
- {
- stockCID = pPacket->ReadInt();
- }
- catch (const Packet::Exception)
- {
- Debug::LogWrite("Invalid packet in " __FUNCTION__ " from %s", pSender->m_name.c_str());
- pSender->m_destroy = true;
- return;
- }
- Debug::LogWrite("Player %s bought car %d", pSender->m_name.c_str(), stockCID);
- for (StockVehicle* pStockVeh : m_stockCars)
- {
- if (pStockVeh->veh.carID == stockCID)
- {
- if (pSender->m_pPlayerInfo->money >= pStockVeh->price)
- {
- pSender->m_pPlayerInfo->money -= pStockVeh->price;
- // adding the car
- PlayableVehicle* pVeh = new PlayableVehicle;
- pVeh->carHash = pStockVeh->veh.carHash;
- memcpy(pVeh->customization, pStockVeh->veh.customization, kCustomizationSize);
- pVeh->carID = 1000 + pSender->m_pPlayerInfo->playerCars.size(); // guarantees the id to be unique
- pSender->m_pPlayerInfo->selectedCID = pVeh->carID;
- pSender->m_pPlayerInfo->playerCars.push_back(pVeh);
- SendCars(pSender);
- if (pSender->m_destroy)
- return;
- m_packet.Reset(DN_PLAYER_CARSELECT);
- m_packet.WriteInt(pSender->m_uid);
- m_packet.WriteInt(pVeh->carHash);
- m_packet.WriteData(pVeh->customization, kCustomizationSize);
- BroadcastPacket(&m_packet, pSender);
- if (!pSender->WritePlayerInfo())
- pSender->m_destroy = true;
- if (pSender->m_destroy)
- return;
- }
- return;
- }
- }
- }
- void Server::MapJoinHandler(Player * pSender)
- {
- pSender->m_spawned = true;
- ScOnPlayerSpawn(pSender->m_uid);
- m_packet.Reset(DN_MAP_JOIN);
- m_packet.WriteInt(pSender->m_uid);
- BroadcastPacket(&m_packet, pSender);
- }
- void Server::MapQuitHandler(Player * pSender)
- {
- pSender->m_spawned = false;
- ScOnPlayerDespawn(pSender->m_uid);
- m_packet.Reset(DN_MAP_QUIT);
- m_packet.WriteInt(pSender->m_uid);
- BroadcastPacket(&m_packet, pSender);
- }
- void Server::CarSelectHandler(Player * pSender, Packet* pPacket)
- {
- uint32_t cid;
- try
- {
- cid = pPacket->ReadInt();
- }
- catch (const Packet::Exception)
- {
- Debug::LogWrite("Invalid packet in " __FUNCTION__ " from %s", pSender->m_name.c_str());
- pSender->m_destroy = true;
- return;
- }
- if (pSender->m_pPlayerInfo)
- {
- for (PlayableVehicle* pVeh : pSender->m_pPlayerInfo->playerCars)
- {
- if (pVeh->carID == cid)
- {
- pSender->m_pPlayerInfo->selectedCID = cid;
- m_packet.Reset(DN_PLAYER_CARSELECT);
- m_packet.WriteInt(pSender->m_uid);
- m_packet.WriteInt(pVeh->carHash);
- m_packet.WriteData(pVeh->customization, kCustomizationSize);
- BroadcastPacket(&m_packet, pSender);
- return;
- }
- }
- }
- }
- void Server::SyncHandler(Packet* pPacket)
- {
- SyncPlayerData spd;
- try
- {
- pPacket->ReadData(&spd, sizeof(spd));
- }
- catch (const Packet::Exception)
- {
- Debug::LogWrite("Invalid packet in " __FUNCTION__ "");
- return;
- }
- Player* pSender = 0;
- for (Player* pPlayer : m_playerPtrs)
- {
- if (pPlayer->m_uid == spd.uid)
- {
- pSender = pPlayer;
- }
- }
- if (pSender == 0)
- {
- Debug::LogWrite("pSender == 0");
- }
- pSender->m_rbData = spd.rbd;
- m_packet.Reset(DN_MULTISYNC);
- m_packet.WriteData(&spd, sizeof(spd));
- BroadcastPacketUDP(&m_packet, pSender);
- }
- void Server::NpcSpawnHandler(Player * pSender, Packet * pPacket)
- {
- m_packet.Reset(DN_NPC_SPAWN);
- uint32_t npcid = pPacket->ReadInt();
- uint32_t hash = pPacket->ReadInt();
- m_packet.WriteInt(pSender->m_uid);
- m_packet.WriteInt(npcid);
- m_packet.WriteInt(hash);
- BroadcastPacket(&m_packet, pSender);
- }
- void Server::NpcDespawnHandler(Player * pSender, Packet * pPacket)
- {
- m_packet.Reset(DN_NPC_DESPAWN);
- uint32_t npcid = pPacket->ReadInt();
- m_packet.WriteInt(pSender->m_uid);
- m_packet.WriteInt(npcid);
- BroadcastPacket(&m_packet, pSender);
- }
- void Server::NpcSyncHandler(Player * pSender, Packet * pPacket)
- {
- m_packet.Reset(DN_NPC_SYNC);
- uint32_t npcid = pPacket->ReadInt();
- SyncPlayerData spd;
- try
- {
- pPacket->ReadData(&spd, sizeof(spd));
- }
- catch (const Packet::Exception)
- {
- Debug::LogWrite("Invalid packet in " __FUNCTION__ " from %s", pSender->m_name.c_str());
- pSender->m_destroy = true;
- return;
- }
- m_packet.WriteInt(pSender->m_uid);
- m_packet.WriteInt(npcid);
- m_packet.WriteData(&spd, sizeof(spd));
- BroadcastPacket(&m_packet, pSender);
- }
- void Server::SendCars(Player * pPlayer)
- {
- if (!pPlayer->m_pPlayerInfo)
- Kick(pPlayer, "Invalid player info");
- m_packet.Reset(DN_CARLIST);
- m_packet.WriteInt(pPlayer->m_pPlayerInfo->selectedCID);
- m_packet.WriteInt(pPlayer->m_pPlayerInfo->playerCars.size());
- for (PlayableVehicle* pVeh : pPlayer->m_pPlayerInfo->playerCars)
- {
- m_packet.WriteInt(pVeh->carID);
- m_packet.WriteInt(pVeh->carHash);
- m_packet.WriteData(pVeh->customization, kCustomizationSize);
- m_packet.WriteInt(0);
- m_packet.WriteInt(0);
- }
- if (!pPlayer->SendPacket(&m_packet))
- pPlayer->m_destroy = true;
- }
- void Server::SendStockCars(Player * pPlayer)
- {
- m_packet.Reset(DN_STOCK_CARS);
- m_packet.WriteInt(m_stockCars.size()); // car count
- for (StockVehicle* pVeh : m_stockCars)
- {
- m_packet.WriteInt(pVeh->veh.carID);
- m_packet.WriteInt(pVeh->veh.carHash);
- m_packet.WriteData(pVeh->veh.customization, kCustomizationSize);
- m_packet.WriteInt(pVeh->price); // price (unused)
- m_packet.WriteInt(0); // arrests (unused)
- }
- if (!pPlayer->SendPacket(&m_packet))
- pPlayer->m_destroy = true;
- }
- void Server::SendPlayers(Player * pPlayer)
- {
- m_packet.Reset(DN_PLAYERS);
- m_packet.WriteInt(m_playerPtrs.size());
- for (Player* pl : m_playerPtrs)
- {
- if (pl->m_pending || pl->m_uid == pPlayer->m_uid)
- {
- m_packet.WriteInt(0);
- continue;
- }
- m_packet.WriteInt(pl->m_uid);
- m_packet.WriteInt(pl->m_pPlayerInfo->level);
- m_packet.WriteInt(0);
- m_packet.WriteInt(pl->m_name.size() + 1);
- m_packet.WriteString(pl->m_name);
- if (pl->m_pPlayerInfo->selectedCID)
- {
- for (PlayableVehicle* pVeh : pl->m_pPlayerInfo->playerCars)
- {
- if (pVeh->carID == pl->m_pPlayerInfo->selectedCID)
- {
- m_packet.WriteInt(pVeh->carHash);
- m_packet.WriteData(pVeh->customization, kCustomizationSize);
- break;
- }
- }
- m_packet.WriteChar(pl->m_spawned);
- }
- else
- m_packet.WriteInt(0);
- }
- if (!pPlayer->SendPacket(&m_packet))
- pPlayer->m_destroy = true;
- }
- void Server::BroadcastPlayerJoin(Player * pPlayer)
- {
- //BroadcastChatMessage(0, pPlayer->m_name + " joined the game");
- m_packet.Reset(DN_PLAYER_CONNECTED);
- m_packet.WriteInt(pPlayer->m_uid);
- m_packet.WriteInt(pPlayer->m_pPlayerInfo->level);
- m_packet.WriteInt(0);
- m_packet.WriteInt(pPlayer->m_name.size() + 1);
- m_packet.WriteString(pPlayer->m_name);
- if (pPlayer->m_pPlayerInfo->selectedCID)
- {
- for (PlayableVehicle* pVeh : pPlayer->m_pPlayerInfo->playerCars)
- {
- if (pVeh->carID == pPlayer->m_pPlayerInfo->selectedCID)
- {
- m_packet.WriteInt(pVeh->carHash);
- m_packet.WriteData(pVeh->customization, kCustomizationSize);
- m_packet.WriteChar(pPlayer->m_spawned);
- break;
- }
- }
- }
- else
- m_packet.WriteInt(0);
- BroadcastPacket(&m_packet, pPlayer);
- }
- void Server::BroadcastPlayerLeave(Player * pPlayer)
- {
- //BroadcastChatMessage(0, pPlayer->m_name + " left the game (" + pPlayer->m_disconnectReason + ")");
- m_packet.Reset(DN_PLAYER_DISCONNECTED);
- m_packet.WriteInt(pPlayer->m_uid);
- BroadcastPacket(&m_packet, pPlayer);
- }
- void Server::BroadcastChatMessage(uint32_t uid, const std::string& message)
- {
- m_packet.Reset(DN_CHAT);
- m_packet.WriteInt(uid);
- m_packet.WriteString(message.c_str());
- BroadcastPacket(&m_packet);
- }
- void Server::ReadStockCars(const char* pszFilePath)
- {
- // Reading stock cars
- json::value cars = json::from_file(pszFilePath);
- if (cars.is_null())
- {
- Debug::LogWrite("Can`t read stock cars");
- return;
- }
- size_t carsCount = cars.array_size();
- for (uint32_t i = 0; i < carsCount; i++)
- {
- json::value car = cars[i];
- StockVehicle* pVeh = new StockVehicle;
- pVeh->veh.carID = car["cid"].as_int();
- pVeh->veh.carHash = car["carHash"].as_int();
- pVeh->price = car["price"].as_int();
- TuningFromString(car["tuning"].as_string(), pVeh->veh.customization);
- m_stockCars.push_back(pVeh);
- }
- json::release(cars);
- Debug::LogWrite("%d stock cars", m_stockCars.size());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement