From 2c373c2ebba3ab05f4c17677b50429acaa84dba1 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Thu, 5 Feb 2015 19:57:02 -0500 Subject: [PATCH] Fixed eXtended RCON client list and ping/score/credit list parsing; Added changeTeam() and setTeam() functions. --- Release/Plugins/RenX.Core.lib | Bin 78228 -> 79548 bytes RenX.Core/RenX_Server.cpp | 34 +++++++++++++++++++++++------- RenX.Core/RenX_Server.h | 38 ++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index e82fada0a5acb13b0a70750d18853a0cb546d860..a99e233b0899bad4fa835f9dabcba24471b18239 100644 GIT binary patch delta 9175 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 Im?Pr;7r>MQivR!s delta 8549 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, credits); } +bool RenX::Server::changeTeam(int id, unsigned char options) +{ + return RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x07%d%c%c\n", id, RenX::DelimC, options)) > 0; +} + +bool RenX::Server::changeTeam(RenX::PlayerInfo *player, unsigned char options) +{ + return RenX::Server::changeTeam(player->id, options); +} + +bool RenX::Server::setTeam(int id, int team, unsigned char options) +{ + return RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x07%d%c%c%c%d\n", id, RenX::DelimC, options, RenX::DelimC, team)) > 0; +} + +bool RenX::Server::setTeam(RenX::PlayerInfo *player, int team, unsigned char options) +{ + return RenX::Server::setTeam(player->id, team, options); +} + const Jupiter::ReadableString &RenX::Server::getPrefix() const { return RenX::Server::IRCPrefix; @@ -1110,12 +1130,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { PARSE_PLAYER_DATA_P(header); PlayerInfo *player = getPlayerOrAdd(this, name, id, team, isBot, playerData.asUnsignedLongLong(0), action); - player->ping = buff.getToken(4, RenX::DelimC).asUnsignedInt() * 4; - player->kills = buff.getToken(5, RenX::DelimC).asUnsignedInt(); - player->deaths = buff.getToken(6, RenX::DelimC).asUnsignedInt(); - player->score = static_cast(buff.getToken(7, RenX::DelimC).asDouble()); - player->credits = static_cast(buff.getToken(8, RenX::DelimC).asDouble()); - player->character = RenX::getCharacter(buff.getToken(9, RenX::DelimC)); + player->ping = buff.getToken(3, RenX::DelimC).asUnsignedInt() * 4; + player->kills = buff.getToken(4, RenX::DelimC).asUnsignedInt(); + player->deaths = buff.getToken(5, RenX::DelimC).asUnsignedInt(); + player->score = static_cast(buff.getToken(6, RenX::DelimC).asDouble()); + player->credits = static_cast(buff.getToken(7, RenX::DelimC).asDouble()); + player->character = RenX::getCharacter(buff.getToken(8, RenX::DelimC)); } header.shiftLeft(1); break; @@ -1126,7 +1146,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) PlayerInfo *player = getPlayerOrAdd(this, name, id, team, isBot, 0U, Jupiter::ReferenceString::empty); player->ping = playerData.asUnsignedInt(); player->score = static_cast(action.asDouble()); - player->credits = static_cast(buff.getToken(4, RenX::DelimC).asDouble()); + player->credits = static_cast(buff.getToken(3, RenX::DelimC).asDouble()); } header.shiftLeft(1); break; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 49a480c..6c15dbc 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -296,6 +296,44 @@ namespace RenX */ bool giveCredits(RenX::PlayerInfo *player, double credits); + /** + * @brief Forces a player to change teams, if the server supports it. + * + * @param id ID of the player to give credits to + * @param options Options to pass to the command + * @return True on success, false otherwise. + */ + bool changeTeam(int id, unsigned char options = 0x03); + + /** + * @brief Forces a player to change teams, if the server supports it. + * + * @param player Player to change teams + * @param options Options to pass to the command + * @return True on success, false otherwise. + */ + bool changeTeam(RenX::PlayerInfo *player, unsigned char options = 0x03); + + /** + * @brief Forces a player to change teams, if the server supports it. + * + * @param id ID of the player to give credits to + * @param team Team number to switch to + * @param options Options to pass to the command + * @return True on success, false otherwise. + */ + bool setTeam(int id, int team, unsigned char options = 0x03); + + /** + * @brief Forces a player to change teams, if the server supports it. + * + * @param player Player to change teams + * @param team Team number to switch to + * @param options Options to pass to the command + * @return True on success, false otherwise. + */ + bool setTeam(RenX::PlayerInfo *player, int team, unsigned char options = 0x03); + /** * @brief Fetches a server's IRC logging prefix. *