From fef7c1e30f34084a1cb756c1e9d0df4a3b5a0a39 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sun, 2 Aug 2015 02:48:20 -0400 Subject: [PATCH] RenX.Core: * Core: Added hasServer() * Functions: ** Added getServerTime() ** Removed getGameTime() ** Removed getKillsPerSecond() * Server: ** Replaced isFirstGame() with hasSeenStart(). ** Added getCurrentRCONCommand(), getCurrentRCONCommandParameters(), and getGameTime(). RenX.Medals: * Fixed "best" rewards not being awarded. * Added "best score" reward. General: * Changed some time_t variables/functions to various chrono durations. * Changed some floats to doubles. * Cleaned up code --- Release/Plugins/RenX.Core.lib | Bin 130270 -> 132726 bytes RenX.Commands/RenX_Commands.cpp | 6 +- RenX.Core/RenX_Core.cpp | 14 ++++- RenX.Core/RenX_Core.h | 8 +++ RenX.Core/RenX_Functions.cpp | 11 +--- RenX.Core/RenX_Functions.h | 14 +---- RenX.Core/RenX_PlayerInfo.h | 7 ++- RenX.Core/RenX_Server.cpp | 43 ++++++++++---- RenX.Core/RenX_Server.h | 40 +++++++++++-- RenX.Core/RenX_Tags.cpp | 4 +- .../ExcessiveHeadshots.cpp | 10 ++-- RenX.ExcessiveHeadshots/ExcessiveHeadshots.h | 5 +- RenX.Medals/RenX_Medals.cpp | 53 +++++++++++++----- 13 files changed, 150 insertions(+), 65 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 5efde41c13309dbd3539f412746e4f6b871779b3..ccebe6c1174376daa5a785b6b73a2bffdb16b407 100644 GIT binary patch delta 14507 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 noUTT171=CGqPHRErTuP;+1j4OD_@k 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 K>RrUA{Qm%xUvzx{ diff --git a/RenX.Commands/RenX_Commands.cpp b/RenX.Commands/RenX_Commands.cpp index 620c1b8..f9d76f3 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -501,8 +501,8 @@ void PlayerTableIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableStri STRING_LITERAL_AS_NAMED_REFERENCE(NICK_COL_HEADER, "Nickname"); size_t maxNickLen = 8; int highID = 999; - float highScore = 99999.0; - float highCredits = 9999999.0; + double highScore = 99999.0; + double highCredits = 9999999.0; RenX::PlayerInfo *player; for (Jupiter::DLList::Node *node = server->players.getNode(0); node != nullptr; node = node->next) @@ -836,7 +836,7 @@ void KillDeathRatioIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableS if (player->name.findi(parameters) != Jupiter::INVALID_INDEX) { Jupiter::String &playerName = RenX::getFormattedPlayerName(player); - msg.format(IRCBOLD "%.*s" IRCBOLD IRCCOLOR ": Kills: %u - Deaths: %u - KDR: %.2f", playerName.size(), playerName.ptr(), player->kills, player->deaths, ((float)player->kills) / (player->deaths == 0 ? 1.0 : (float)player->deaths)); + msg.format(IRCBOLD "%.*s" IRCBOLD IRCCOLOR ": Kills: %u - Deaths: %u - KDR: %.2f", playerName.size(), playerName.ptr(), player->kills, player->deaths, static_cast(player->kills) / (player->deaths == 0 ? 1.0f : static_cast(player->deaths))); source->sendMessage(channel, msg); } } diff --git a/RenX.Core/RenX_Core.cpp b/RenX.Core/RenX_Core.cpp index 9de547d..7dc2214 100644 --- a/RenX.Core/RenX_Core.cpp +++ b/RenX.Core/RenX_Core.cpp @@ -81,8 +81,9 @@ void RenX::Core::addServer(RenX::Server *server) int RenX::Core::getServerIndex(RenX::Server *server) { - for (size_t i = 0; i != RenX::Core::servers.size(); i++) - if (server == RenX::Core::servers.get(i)) + size_t i = RenX::Core::servers.size(); + while (i != 0) + if (server == RenX::Core::servers.get(--i)) return i; return -1; } @@ -117,6 +118,15 @@ int RenX::Core::removeServer(RenX::Server *server) return i; } +bool RenX::Core::hasServer(RenX::Server *server) +{ + size_t i = RenX::Core::servers.size(); + while (i != 0) + if (server == RenX::Core::servers.get(--i)) + return true; + return false; +} + unsigned int RenX::Core::getServerCount() { return RenX::Core::servers.size(); diff --git a/RenX.Core/RenX_Core.h b/RenX.Core/RenX_Core.h index 21be70d..2a4cad4 100644 --- a/RenX.Core/RenX_Core.h +++ b/RenX.Core/RenX_Core.h @@ -120,6 +120,14 @@ namespace RenX */ int removeServer(RenX::Server *server); + /** + * @brief Checks is a server is in the server list. + * + * @param server Pointer to the server to look for. + * @return True if the server is in the list, false otherwise. + */ + bool hasServer(RenX::Server *server); + /** * @brief Fetches the number of servers. * diff --git a/RenX.Core/RenX_Functions.cpp b/RenX.Core/RenX_Functions.cpp index 79ed045..0a63a7d 100644 --- a/RenX.Core/RenX_Functions.cpp +++ b/RenX.Core/RenX_Functions.cpp @@ -867,11 +867,9 @@ void RenX::sanitizeString(Jupiter::StringType &str) } } -time_t RenX::getGameTime(const RenX::PlayerInfo *player) +std::chrono::milliseconds RenX::getServerTime(const RenX::PlayerInfo *player) { - time_t currentTime = time(0); - if (player->joinTime == currentTime) currentTime++; - return currentTime - player->joinTime; + return std::chrono::duration_cast(std::chrono::steady_clock::now() - player->joinTime); } Jupiter::StringS RenX::default_uuid_func(RenX::PlayerInfo *player) @@ -891,9 +889,4 @@ double RenX::getHeadshotKillRatio(const RenX::PlayerInfo *player) { if (player->kills == 0) return 0; return ((double)player->headshots) / ((double)player->kills); -} - -double RenX::getKillsPerSecond(const RenX::PlayerInfo *player) -{ - return ((double)player->kills) / ((double)RenX::getGameTime(player)); } \ No newline at end of file diff --git a/RenX.Core/RenX_Functions.h b/RenX.Core/RenX_Functions.h index 8d38bac..83c1b09 100644 --- a/RenX.Core/RenX_Functions.h +++ b/RenX.Core/RenX_Functions.h @@ -23,6 +23,7 @@ * @brief Provides some functions to be used at your convenience. */ +#include #include "Jupiter/INIFile.h" #include "Jupiter/String.h" #include "RenX.h" @@ -144,13 +145,12 @@ namespace RenX RENX_API void sanitizeString(Jupiter::StringType &str); /** - * @brief Calculates for how many seconds a player has been in-game. - * Note: This will always be at least 1. + * @brief Calculates for how many seconds a player has been in the server. * * @param player A player's data. * @return Number of seconds a player has been in-game. */ - RENX_API time_t getGameTime(const RenX::PlayerInfo *player); + RENX_API std::chrono::milliseconds getServerTime(const RenX::PlayerInfo *player); /** * @brief Calculates a player's UUID, based on their steam ID. @@ -180,14 +180,6 @@ namespace RenX */ RENX_API double getHeadshotKillRatio(const RenX::PlayerInfo *player); - /** - * @brief Calculates a player's kills-per-second since joining. - * - * @param player A player's data. - * @return Player's Kill-Death ratio. - */ - RENX_API double getKillsPerSecond(const RenX::PlayerInfo *player); - /** Constant variables */ RENX_API extern const char DelimC; /** RCON message deliminator */ } diff --git a/RenX.Core/RenX_PlayerInfo.h b/RenX.Core/RenX_PlayerInfo.h index b3c01f7..6575b41 100644 --- a/RenX.Core/RenX_PlayerInfo.h +++ b/RenX.Core/RenX_PlayerInfo.h @@ -23,6 +23,7 @@ * @brief Defines the PlayerInfo structure. */ +#include #include "Jupiter/String.h" #include "Jupiter/INIFile.h" #include "RenX.h" @@ -53,11 +54,11 @@ namespace RenX TeamType team = TeamType::Other; int id = 0; bool isBot = false; - time_t joinTime = 0; + std::chrono::steady_clock::time_point joinTime = std::chrono::steady_clock::now(); unsigned short ping = 0; - float score = 0.0f; - float credits = 0.0f; + double score = 0.0f; + double credits = 0.0f; unsigned int kills = 0; unsigned int deaths = 0; unsigned int suicides = 0; diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 0dcff13..cd7efd7 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -144,9 +144,9 @@ bool RenX::Server::isConnected() const return RenX::Server::connected; } -bool RenX::Server::isFirstGame() const +bool RenX::Server::hasSeenStart() const { - return RenX::Server::firstGame; + return RenX::Server::seenStart; } bool RenX::Server::isFirstKill() const @@ -243,6 +243,28 @@ RenX::BuildingInfo *RenX::Server::getBuildingByName(const Jupiter::ReadableStrin return nullptr; } +const Jupiter::ReadableString &RenX::Server::getCurrentRCONCommand() const +{ + return RenX::Server::lastCommand; +} + +const Jupiter::ReadableString &RenX::Server::getCurrentRCONCommandParameters() const +{ + return RenX::Server::lastCommandParams; +} + +std::chrono::milliseconds RenX::Server::getGameTime() const +{ + return std::chrono::duration_cast(std::chrono::steady_clock::now() - RenX::Server::gameStart); +} + +std::chrono::milliseconds RenX::Server::getGameTime(const RenX::PlayerInfo *player) const +{ + if (player->joinTime < RenX::Server::gameStart) + return RenX::Server::getGameTime(); + return std::chrono::duration_cast(std::chrono::steady_clock::now() - player->joinTime); +} + RenX::PlayerInfo *RenX::Server::getPlayer(int id) const { if (RenX::Server::players.size() == 0) return nullptr; @@ -904,7 +926,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; auto onPostGameOver = [this](RenX::WinType winType, RenX::TeamType team, int gScore, int nScore) { - this->firstGame = false; this->firstAction = false; this->firstKill = false; this->firstDeath = false; @@ -1026,7 +1047,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) r->steamid = steamid; if (r->isBot = isBot) r->formatNamePrefix = IRCCOLOR "05[B]"; - r->joinTime = time(nullptr); + r->joinTime = std::chrono::steady_clock::now(); if (id != 0) this->players.add(r); @@ -1139,11 +1160,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Score")); if (pair != nullptr) - player->score = static_cast(pair->getValue().asDouble()); + player->score = pair->getValue().asDouble(); pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Credits")); if (pair != nullptr) - player->credits = static_cast(pair->getValue().asDouble()); + player->credits = pair->getValue().asDouble(); pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Character")); if (pair != nullptr) @@ -1292,11 +1313,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Score")); if (pair != nullptr) - player->score = static_cast(pair->getValue().asDouble()); + player->score = pair->getValue().asDouble(); pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Credits")); if (pair != nullptr) - player->credits = static_cast(pair->getValue().asDouble()); + player->credits = pair->getValue().asDouble(); pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Character")); if (pair != nullptr) @@ -1996,7 +2017,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (buff.getToken(5, RenX::DelimC).equals("steamid")) steamid = buff.getToken(6, RenX::DelimC).asUnsignedLongLong(); RenX::PlayerInfo *player = getPlayerOrAdd(name, id, team, isBot, steamid, buff.getToken(4, RenX::DelimC)); - player->joinTime = time(0); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnJoin(this, player); } @@ -2357,6 +2377,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) else if (subHeader.equals("Start;")) { // Map + this->seenStart = true; + this->gameStart = std::chrono::steady_clock::now(); Jupiter::ReferenceString map = buff.getToken(2, RenX::DelimC); this->map = map; for (size_t i = 0; i < xPlugins.size(); i++) @@ -2448,7 +2470,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) RenX::Server::fetchClientList(); RenX::Server::updateBuildingList(); - this->firstGame = true; + RenX::Server::gameStart = std::chrono::steady_clock::now(); + this->seenStart = false; this->seamless = true; for (size_t i = 0; i < xPlugins.size(); i++) diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 18e1faf..9c0415d 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -95,11 +95,11 @@ namespace RenX bool isConnected() const; /** - * @brief Checks if the game in progress is the first game. + * @brief Checks if a map start event has fired. * - * @return True if this is the first game, false otherwise. + * @return True if a map start event has fired, false otherwise. */ - bool isFirstGame() const; + bool hasSeenStart() const; /** * @brief Checks if the first kill has already been processed. @@ -208,6 +208,37 @@ namespace RenX */ RenX::BuildingInfo *getBuildingByName(const Jupiter::ReadableString &name) const; + /** + * @brief Fetches the RCON command currently being processed. + * + * @return RCON command last executed. + */ + const Jupiter::ReadableString &getCurrentRCONCommand() const; + + /** + * @brief Fetches the parameters of the RCON command currently being processed. + * + * @return Parameters of last RCON command last executed. + */ + const Jupiter::ReadableString &getCurrentRCONCommandParameters() const; + + /** + * @brief Calculates the time since match start. + * Note: if hasSeenStart() is false, this is the time since the connection was established. + * + * @return Time since match start. + */ + std::chrono::milliseconds getGameTime() const; + + /** + * @brief Calculates the time the player has been playing. + * Note: This will never be greater than getGameTime(void) + * + * @param player Player to calculate game-time of. + * @return Time player has been playing. + */ + std::chrono::milliseconds getGameTime(const RenX::PlayerInfo *player) const; + /** * @brief Fetches a player's data based on their ID number. * @@ -829,7 +860,7 @@ namespace RenX bool needsCList = false; bool silenceParts = false; bool silenceJoins = false; - bool firstGame = true; + bool seenStart = true; bool firstKill = false; bool firstDeath = false; bool firstAction = false; @@ -837,6 +868,7 @@ namespace RenX unsigned int rconVersion = 0; time_t lastAttempt = 0; int attempts = 0; + std::chrono::steady_clock::time_point gameStart = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastClientListUpdate = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastBuildingListUpdate = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point lastActivity = std::chrono::steady_clock::now(); diff --git a/RenX.Core/RenX_Tags.cpp b/RenX.Core/RenX_Tags.cpp index 17dcab3..04332a3 100644 --- a/RenX.Core/RenX_Tags.cpp +++ b/RenX.Core/RenX_Tags.cpp @@ -366,7 +366,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_CREDITS_TAG, Jupiter::StringS::Format("%.0f", player->credits)); PROCESS_TAG(this->INTERNAL_KILLS_TAG, Jupiter::StringS::Format("%u", player->kills)); PROCESS_TAG(this->INTERNAL_DEATHS_TAG, Jupiter::StringS::Format("%u", player->deaths)); - PROCESS_TAG(this->INTERNAL_KDR_TAG, Jupiter::StringS::Format("%.2f", static_cast(player->kills) / (player->deaths == 0 ? 1.0f : static_cast(player->deaths)))); + PROCESS_TAG(this->INTERNAL_KDR_TAG, Jupiter::StringS::Format("%.2f", static_cast(player->kills) / (player->deaths == 0 ? 1.0f : static_cast(player->deaths)))); PROCESS_TAG(this->INTERNAL_SUICIDES_TAG, Jupiter::StringS::Format("%u", player->suicides)); PROCESS_TAG(this->INTERNAL_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", player->headshots)); PROCESS_TAG(this->INTERNAL_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", player->vehicleKills)); @@ -401,7 +401,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_VICTIM_CREDITS_TAG, Jupiter::StringS::Format("%.0f", victim->credits)); PROCESS_TAG(this->INTERNAL_VICTIM_KILLS_TAG, Jupiter::StringS::Format("%u", victim->kills)); PROCESS_TAG(this->INTERNAL_VICTIM_DEATHS_TAG, Jupiter::StringS::Format("%u", victim->deaths)); - PROCESS_TAG(this->INTERNAL_VICTIM_KDR_TAG, Jupiter::StringS::Format("%.2f", static_cast(victim->kills) / (victim->deaths == 0 ? 1.0f : static_cast(victim->deaths)))); + PROCESS_TAG(this->INTERNAL_VICTIM_KDR_TAG, Jupiter::StringS::Format("%.2f", static_cast(victim->kills) / (victim->deaths == 0 ? 1.0f : static_cast(victim->deaths)))); PROCESS_TAG(this->INTERNAL_VICTIM_SUICIDES_TAG, Jupiter::StringS::Format("%u", victim->suicides)); PROCESS_TAG(this->INTERNAL_VICTIM_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", victim->headshots)); PROCESS_TAG(this->INTERNAL_VICTIM_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", victim->vehicleKills)); diff --git a/RenX.ExcessiveHeadshots/ExcessiveHeadshots.cpp b/RenX.ExcessiveHeadshots/ExcessiveHeadshots.cpp index e766023..36e9ccb 100644 --- a/RenX.ExcessiveHeadshots/ExcessiveHeadshots.cpp +++ b/RenX.ExcessiveHeadshots/ExcessiveHeadshots.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014 Justin James. + * Copyright (C) 2014-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any @@ -44,12 +44,14 @@ void RenX_ExcessiveHeadshotsPlugin::RenX_OnKill(RenX::Server *server, const RenX if (damageType.equals("Rx_DmgType_Headshot")) { unsigned int flags = 0; + std::chrono::milliseconds game_time = server->getGameTime(player); + double kps = game_time == std::chrono::milliseconds(0) ? static_cast(player->kills) : static_cast(player->kills) / static_cast(game_time.count()); if (player->kills >= RenX_ExcessiveHeadshotsPlugin::minKills) flags++; if (RenX::getHeadshotKillRatio(player) >= RenX_ExcessiveHeadshotsPlugin::ratio) flags++; if (RenX::getKillDeathRatio(player) >= RenX_ExcessiveHeadshotsPlugin::minKD) flags++; - if (RenX::getKillsPerSecond(player) >= RenX_ExcessiveHeadshotsPlugin::minKPS) flags++; - if (RenX::getKillsPerSecond(player) >= RenX_ExcessiveHeadshotsPlugin::minKPS * 2) flags++; - if (RenX::getGameTime(player) <= RenX_ExcessiveHeadshotsPlugin::maxGameTime) flags++; + if (kps >= RenX_ExcessiveHeadshotsPlugin::minKPS) flags++; + if (kps >= RenX_ExcessiveHeadshotsPlugin::minKPS * 2) flags++; + if (game_time <= RenX_ExcessiveHeadshotsPlugin::maxGameTime) flags++; if (flags >= RenX_ExcessiveHeadshotsPlugin::minFlags) { diff --git a/RenX.ExcessiveHeadshots/ExcessiveHeadshots.h b/RenX.ExcessiveHeadshots/ExcessiveHeadshots.h index d0a2610..78eb7fa 100644 --- a/RenX.ExcessiveHeadshots/ExcessiveHeadshots.h +++ b/RenX.ExcessiveHeadshots/ExcessiveHeadshots.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014 Justin James. + * Copyright (C) 2014-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any @@ -18,6 +18,7 @@ #if !defined _EXCESSIVEHEADSHOTS_H_HEADER #define _EXCESSIVEHEADSHOTS_H_HEADER +#include #include "Jupiter/Plugin.h" #include "RenX_Plugin.h" @@ -38,7 +39,7 @@ private: double minKD = 5.0; double minKPS = 0.1; unsigned int minKills = 10; - time_t maxGameTime = 180; + std::chrono::seconds maxGameTime = std::chrono::seconds(180); }; #endif // _EXCESSIVEHEADSHOTS_H_HEADER \ No newline at end of file diff --git a/RenX.Medals/RenX_Medals.cpp b/RenX.Medals/RenX_Medals.cpp index 0a286f3..65af24c 100644 --- a/RenX.Medals/RenX_Medals.cpp +++ b/RenX.Medals/RenX_Medals.cpp @@ -26,6 +26,8 @@ #include "RenX_Core.h" #include "RenX_Tags.h" +using namespace Jupiter::literals; + RenX_MedalsPlugin::RenX_MedalsPlugin() { this->INTERNAL_RECS_TAG = RenX::getUniqueInternalTag(); @@ -68,21 +70,27 @@ struct CongratPlayerData void congratPlayer(unsigned int, void *params) { - CongratPlayerData *congratPlayerData = (CongratPlayerData *) params; + CongratPlayerData *congratPlayerData = reinterpret_cast(params); - switch (congratPlayerData->type) + if (RenX::getCore()->hasServer(congratPlayerData->server) && congratPlayerData->server->isConnected()) { - case 1: - congratPlayerData->server->sendMessage(Jupiter::StringS::Format("%.*s has been recommended for having the most kills last game!", congratPlayerData->playerName.size(), congratPlayerData->playerName.ptr())); - break; - case 2: - congratPlayerData->server->sendMessage(Jupiter::StringS::Format("%.*s has been recommended for having the most vehicle kills last game!", congratPlayerData->playerName.size(), congratPlayerData->playerName.ptr())); - break; - case 3: - congratPlayerData->server->sendMessage(Jupiter::StringS::Format("%.*s has been recommended for having the highest Kill-Death ratio last game!", congratPlayerData->playerName.size(), congratPlayerData->playerName.ptr())); - break; - default: - break; + switch (congratPlayerData->type) + { + case 0: + congratPlayerData->server->sendMessage(congratPlayerData->playerName + " has been recommended for having the highest score last game!"_jrs); + break; + case 1: + congratPlayerData->server->sendMessage(congratPlayerData->playerName + " has been recommended for having the most kills last game!"_jrs); + break; + case 2: + congratPlayerData->server->sendMessage(congratPlayerData->playerName + " has been recommended for having the most vehicle kills last game!"_jrs); + break; + case 3: + congratPlayerData->server->sendMessage(congratPlayerData->playerName + " has been recommended for having the highest Kill-Death ratio last game!"_jrs); + break; + default: + break; + } } delete congratPlayerData; } @@ -159,11 +167,11 @@ void RenX_MedalsPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo void RenX_MedalsPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) { - if (server->isFirstGame() == false) // No unfair medals for the first game! :D + if (server->hasSeenStart() && server->players.size() != 0) // No unfair medals for the first game! :D { - if (server->players.size() == 0) return; Jupiter::DLList::Node *n = server->players.getNode(0); RenX::PlayerInfo *pInfo = n->data; + RenX::PlayerInfo *bestScore = pInfo; RenX::PlayerInfo *mostKills = pInfo; RenX::PlayerInfo *mostVehicleKills = pInfo; RenX::PlayerInfo *bestKD = pInfo; @@ -171,6 +179,9 @@ void RenX_MedalsPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winT while (n != nullptr) { pInfo = n->data; + if (pInfo->score > bestScore->score) + bestScore = pInfo; + if (pInfo->kills > mostKills->kills) mostKills = pInfo; @@ -185,6 +196,18 @@ void RenX_MedalsPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winT CongratPlayerData *congratPlayerData; + /** +1 for best score */ + if (bestScore->uuid.isNotEmpty() && bestScore->isBot == false && bestScore->score > 0) + { + addRec(bestScore); + + congratPlayerData = new CongratPlayerData(); + congratPlayerData->server = server; + congratPlayerData->playerName = bestScore->name; + congratPlayerData->type = 0; + new Jupiter::Timer(1, killCongratDelay, congratPlayer, congratPlayerData, false); + } + /** +1 for most kills */ if (mostKills->uuid.isNotEmpty() && mostKills->isBot == false && mostKills->kills > 0) {