diff --git a/Jupiter b/Jupiter index 0530dbe..884357b 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 0530dbee7b4b3e5b0b93eef57884c4af839af384 +Subproject commit 884357b443381ac8034c7ec6ce30bc46a20c08e7 diff --git a/Jupiter Bot.sln b/Jupiter Bot.sln index ba2ecdd..0eea142 100644 --- a/Jupiter Bot.sln +++ b/Jupiter Bot.sln @@ -146,6 +146,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.NicknameUUID", "RenX.N EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.HybridUUID", "RenX.HybridUUID\RenX.HybridUUID.vcxproj", "{FF61361F-CB09-4C72-80E2-9CA2DA63910E}" + ProjectSection(ProjectDependencies) = postProject + {C188871B-5F32-4946-B301-24CA2EBB275D} = {C188871B-5F32-4946-B301-24CA2EBB275D} + {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} = {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Release/Bot.lib b/Release/Bot.lib index 320783a..8509c81 100644 Binary files a/Release/Bot.lib and b/Release/Bot.lib differ diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index cc305cc..04f4cb0 100644 Binary files a/Release/Plugins/RenX.Core.lib and b/Release/Plugins/RenX.Core.lib differ diff --git a/RenX.Commands/RenX_Commands.cpp b/RenX.Commands/RenX_Commands.cpp index 4051bd8..e9225f8 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -298,6 +298,7 @@ void PlayersIRCCommand::create() { this->addTrigger(STRING_LITERAL_AS_REFERENCE("players")); this->addTrigger(STRING_LITERAL_AS_REFERENCE("pl")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("playerlist")); } const size_t STRING_LENGTH = 240; @@ -451,6 +452,127 @@ const Jupiter::ReadableString &PlayersIRCCommand::getHelp(const Jupiter::Readabl IRC_COMMAND_INIT(PlayersIRCCommand) +// PlayerTable IRC Command +#include "Jupiter/SLList.h" +void PlayerTableIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("pt")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("playertable")); +} + +void PlayerTableIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &) +{ + int type = source->getChannel(channel)->getType(); + + // Team colors + const Jupiter::ReadableString &gTeamColor = RenX::getTeamColor(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeamColor = RenX::getTeamColor(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeamColor = RenX::getTeamColor(RenX::TeamType::Other); + + // Team names + const Jupiter::ReadableString &gTeam = RenX::getTeamName(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeam = RenX::getTeamName(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeam = RenX::getTeamName(RenX::TeamType::Other); + + bool noServers = true; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + noServers = false; + if (server->players.size() != 0) + { + Jupiter::SLList gPlayers; + Jupiter::SLList nPlayers; + Jupiter::SLList oPlayers; + + STRING_LITERAL_AS_NAMED_REFERENCE(NICK_COL_HEADER, "Nickname"); + size_t maxNickLen = 8; + int highID = 999; + float highScore = 99999.0; + float highCredits = 9999999.0; + + RenX::PlayerInfo *player; + for (Jupiter::DLList::Node *node = server->players.getNode(0); node != nullptr; node = node->next) + { + player = node->data; + if (player != nullptr && player->isBot == false) + { + if (player->name.size() > maxNickLen) + maxNickLen = player->name.size(); + + if (player->id > highID) + highID = player->id; + + if (player->score > highScore) + highScore = player->score; + + if (player->credits > highCredits) + highCredits = player->credits; + + switch (player->team) + { + case RenX::TeamType::GDI: + gPlayers.add(player); + break; + case RenX::TeamType::Nod: + nPlayers.add(player); + break; + default: + oPlayers.add(player); + break; + } + } + } + + size_t idColLen = 1, scoreColLen = 1, creditColLen = 1; + + while ((highID /= 10) > 0) + ++idColLen; + + while ((highScore /= 10) >= 1.0) + ++scoreColLen; + + while ((highCredits /= 10) >= 1.0) + ++creditColLen; + + source->sendMessage(channel, Jupiter::StringS::Format(IRCUNDERLINE IRCCOLOR "03%*.*s | %*s | %*s | %*s", maxNickLen, NICK_COL_HEADER.size(), NICK_COL_HEADER.ptr(), idColLen, "ID", scoreColLen, "Score", creditColLen, "Credits")); + + auto output_player = [source, &channel, maxNickLen, idColLen, scoreColLen, creditColLen](RenX::PlayerInfo *player, const Jupiter::ReadableString &color) + { + source->sendMessage(channel, Jupiter::StringS::Format(IRCCOLOR "%.*s%*.*s" IRCCOLOR " " IRCCOLOR "03|" IRCCOLOR " %*d " IRCCOLOR "03|" IRCCOLOR " %*.0f " IRCCOLOR "03|" IRCCOLOR " %*.0f", color.size(), color.ptr(), maxNickLen, player->name.size(), player->name.ptr(), idColLen, player->id, scoreColLen, player->score, creditColLen, player->credits)); + }; + + // Team colors + const Jupiter::ReadableString &gTeamColor = RenX::getTeamColor(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeamColor = RenX::getTeamColor(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeamColor = RenX::getTeamColor(RenX::TeamType::Other); + + for (Jupiter::SLList::Node *node = gPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, gTeamColor); + + for (Jupiter::SLList::Node *node = nPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, nTeamColor); + + for (Jupiter::SLList::Node *node = oPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, oTeamColor); + } + else source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("No players are in-game.")); + } + } + if (noServers) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); +} + +const Jupiter::ReadableString &PlayerTableIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Generates a table of all the players in-game. Syntax: PT"); + return defaultHelp; +} + +IRC_COMMAND_INIT(PlayerTableIRCCommand) + // PlayerInfo IRC Command void PlayerInfoIRCCommand::create() diff --git a/RenX.Commands/RenX_Commands.h b/RenX.Commands/RenX_Commands.h index bdaa060..604a06b 100644 --- a/RenX.Commands/RenX_Commands.h +++ b/RenX.Commands/RenX_Commands.h @@ -57,6 +57,7 @@ GENERIC_IRC_COMMAND(MsgIRCCommand) GENERIC_IRC_COMMAND(PMsgIRCCommand) GENERIC_IRC_COMMAND(HostMsgIRCCommand) GENERIC_IRC_COMMAND(PlayersIRCCommand) +GENERIC_IRC_COMMAND(PlayerTableIRCCommand) GENERIC_IRC_COMMAND(PlayerInfoIRCCommand) GENERIC_IRC_COMMAND(SteamIRCCommand) GENERIC_IRC_COMMAND(KillDeathRatioIRCCommand)