diff --git a/Jupiter b/Jupiter index 46ce354..54a9e74 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 46ce3548d245459aba3f0b14c7fd7fd8528a0c59 +Subproject commit 54a9e74686b814f6935d8203822c54168f0af5e2 diff --git a/Release/Bot.lib b/Release/Bot.lib index 0cecd97..dbe2a14 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 c5036ba..c57bded 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 f44d387..dfd6444 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -269,7 +269,16 @@ void HostMsgIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString & { if (parameters.isEmpty() == false) { - if (RenX::getCore()->send(source->getChannel(channel)->getType(), Jupiter::StringS::Format("say %.*s", parameters.size(), parameters.ptr())) == 0) + int type = source->getChannel(channel)->getType(); + + bool success = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + success = server->sendMessage(parameters) > 0; + } + if (!success) source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too Few Parameters. Syntax: hmsg ")); @@ -948,7 +957,7 @@ IRC_COMMAND_INIT(SetRulesIRCCommand) void ReconnectIRCCommand::create() { this->addTrigger(STRING_LITERAL_AS_REFERENCE("reconnect")); - this->setAccessLevel(4); + this->setAccessLevel(3); } void ReconnectIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &) @@ -963,7 +972,7 @@ void ReconnectIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString RenX::Server *server = RenX::getCore()->getServer(i); if (server->isLogChanType(type)) { - if (server->reconnect()) msg.format("Connection established"); + if (server->reconnect()) msg.set("Connection established"); else msg.format("[RenX] ERROR: Failed to connect to %.*s on port %u." ENDL, server->getHostname().size(), server->getHostname().ptr(), server->getPort()); source->sendMessage(channel, msg); } @@ -971,7 +980,7 @@ void ReconnectIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString if (msg.isEmpty()) { // We didn't connect anywhere!! - msg.format("ERROR: No servers found to connect to."); + msg.set("ERROR: No servers found to connect to."); source->sendMessage(channel, msg); } } @@ -979,102 +988,139 @@ void ReconnectIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString const Jupiter::ReadableString &ReconnectIRCCommand::getHelp(const Jupiter::ReadableString &) { - static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Gets information about a player. Syntax: Reconnect"); + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Resets the RCON connection. Syntax: Reconnect"); return defaultHelp; } IRC_COMMAND_INIT(ReconnectIRCCommand) -// RestartMap IRC Command +// GameOver IRC Command -/*void RestartMapIRCCommand::create() +void GameOverIRCCommand::create() { - this->addTrigger("restartmap"); - this->setAccessLevel(2); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("gameover")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("endmap")); + this->setAccessLevel(3); } -void RestartMapIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +void GameOverIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &) { - int r = RenX::getCore()->send(source->getChannel(channel.c_str())->getType(), "adminrestartmap"); - if (r > 0) + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) { - char t[256]; - sprintf(t, "Command sent to %d servers.", r); - source->sendMessage(channel.c_str(), t); + int type = chan->getType(); + bool match = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + match = true; + if (server->gameover() == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support gameover.")); + } + } + if (match == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); } - else source->sendMessage(channel.c_str(), "Error: Channel not attached to any connected Renegade X servers."); } -const char *RestartMapIRCCommand::getHelp() +const Jupiter::ReadableString &GameOverIRCCommand::getHelp(const Jupiter::ReadableString &) { - return "Restarts the current map. Syntax: RestartMap"; + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Ends the game immediately. Syntax: Gameover"); + return defaultHelp; } -IRC_COMMAND_INIT(RestartMapIRCCommand) +IRC_COMMAND_INIT(GameOverIRCCommand) // SetMap IRC Command void SetMapIRCCommand::create() { - this->addTrigger("setmap"); - this->setAccessLevel(3); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("setmap")); + this->setAccessLevel(4); } void SetMapIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) { - if (parameters != nullptr) + if (parameters.isEmpty() == false) { - Jupiter::StringL cmd = "adminrestartmap "; - cmd += parameters; - int r = RenX::getCore()->send(source->getChannel(channel.c_str())->getType(), cmd.c_str()); - if (r > 0) + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) { - char t[256]; - sprintf(t, "Command sent to %d servers.", r); - source->sendMessage(channel.c_str(), t); + int type = chan->getType(); + bool match = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + match = true; + if (server->setMap(parameters) == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support setmap.")); + } + } + if (match == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); } - else source->sendMessage(channel.c_str(), "Error: Channel not attached to any connected Renegade X servers."); } - else source->sendNotice(nick.c_str(), "Error: Too Few Parameters. Syntax: SetMap "); + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too few parameters. Syntax: setmap ")); } -const char *SetMapIRCCommand::getHelp() +const Jupiter::ReadableString &SetMapIRCCommand::getHelp(const Jupiter::ReadableString &) { - return "Sets the next map, and ends the current map. Syntax: SetMap "; + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Ends the game immediately. Syntax: setmap "); + return defaultHelp; } -IRC_COMMAND_INIT(SetMapIRCCommand)*/ +IRC_COMMAND_INIT(SetMapIRCCommand) // Mute IRC Command -/*void MuteIRCCommand::create() +void MuteIRCCommand::create() { - this->addTrigger("mute"); - this->addTrigger("silence"); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("mute")); this->setAccessLevel(2); } void MuteIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) { - if (parameters != nullptr) + if (parameters.isEmpty() == false) { - Jupiter::StringL cmd = "AdminForceTextMute "; - cmd += parameters; - int r = RenX::getCore()->send(source->getChannel(channel.c_str())->getType(), cmd.c_str()); - if (r > 0) + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) { - char t[256]; - sprintf(t, "Command sent to %d servers.", r); - source->sendMessage(channel.c_str(), t); + int type = chan->getType(); + RenX::PlayerInfo *player; + bool match = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + match = true; + player = server->getPlayerByPartName(parameters); + if (player != nullptr) + { + if (server->mute(player) == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + } + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + } + } + if (match == false) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); } - else source->sendMessage(channel.c_str(), "Error: Channel not attached to any connected Renegade X servers."); } - else source->sendNotice(nick.c_str(), "Error: Too Few Parameters. Syntax: Mute "); + else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too Few Parameters. Syntax: mute ")); } -const char *MuteIRCCommand::getHelp() +const Jupiter::ReadableString &MuteIRCCommand::getHelp(const Jupiter::ReadableString &) { - return "Mutes a player from the game chat. Syntax: Mute "; + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Mutes a player. Syntax: mute "); + return defaultHelp; } IRC_COMMAND_INIT(MuteIRCCommand) @@ -1083,34 +1129,50 @@ IRC_COMMAND_INIT(MuteIRCCommand) void UnMuteIRCCommand::create() { - this->addTrigger("unmute"); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("unmute")); this->setAccessLevel(2); } void UnMuteIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) { - if (parameters != nullptr) + if (parameters.isEmpty() == false) { - Jupiter::StringL cmd = "AdminForceTextUnMute "; - cmd += parameters; - int r = RenX::getCore()->send(source->getChannel(channel.c_str())->getType(), cmd.c_str()); - if (r > 0) + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) { - char t[256]; - sprintf(t, "Command sent to %d servers.", r); - source->sendMessage(channel.c_str(), t); + int type = chan->getType(); + RenX::PlayerInfo *player; + bool match = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + match = true; + player = server->getPlayerByPartName(parameters); + if (player != nullptr) + { + if (server->unmute(player) == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + } + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + } + } + if (match == false) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); } - else source->sendMessage(channel.c_str(), "Error: Channel not attached to any connected Renegade X servers."); } - else source->sendNotice(nick.c_str(), "Error: Too Few Parameters. Syntax: UnMute "); + else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too Few Parameters. Syntax: unmute ")); } -const char *UnMuteIRCCommand::getHelp() +const Jupiter::ReadableString &UnMuteIRCCommand::getHelp(const Jupiter::ReadableString &) { - return "UnMutes a player from the game chat. Syntax: UnMute "; + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Unmutes a player. Syntax: unmute "); + return defaultHelp; } -IRC_COMMAND_INIT(UnMuteIRCCommand)*/ +IRC_COMMAND_INIT(UnMuteIRCCommand) // Kick IRC Command @@ -1337,8 +1399,7 @@ void AddBotsIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString & { RenX::Server *server; Jupiter::StringL cmd; - Jupiter::ReferenceString targetTeam = Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE); - RenX::TeamType team = targetTeam.isEmpty() ? RenX::TeamType::Other : RenX::getTeam(targetTeam[0]); + RenX::TeamType team = RenX::getTeam(Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE)); switch (team) { @@ -1348,6 +1409,7 @@ void AddBotsIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString & case RenX::TeamType::Nod: cmd = "addbluebots "; break; + case RenX::TeamType::None: case RenX::TeamType::Other: cmd = "addbots "; break; @@ -1584,7 +1646,6 @@ void TeamChangeIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableStrin { int type = chan->getType(); Jupiter::ReferenceString playerName = Jupiter::ReferenceString::getWord(parameters, 0, WHITESPACE); - double credits = Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE).asDouble(); RenX::PlayerInfo *player; bool playerFound = false; for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) @@ -1640,7 +1701,6 @@ void TeamChange2IRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableStri { int type = chan->getType(); Jupiter::ReferenceString playerName = Jupiter::ReferenceString::getWord(parameters, 0, WHITESPACE); - double credits = Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE).asDouble(); RenX::PlayerInfo *player; bool playerFound = false; for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) @@ -1654,7 +1714,7 @@ void TeamChange2IRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableStri if (player->name.findi(playerName) != Jupiter::INVALID_INDEX) { playerFound = true; - if (server->changeTeam(player, 0x01) == false) + if (server->changeTeam(player, false) == false) source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support team changing.")); } } @@ -2007,10 +2067,9 @@ void AddBotsGameCommand::create() void AddBotsGameCommand::trigger(RenX::Server *source, RenX::PlayerInfo *player, const Jupiter::ReadableString ¶meters) { - Jupiter::ReferenceString targetTeam = Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE); - RenX::TeamType team = targetTeam.isEmpty() ? RenX::TeamType::Other : RenX::getTeam(targetTeam[0]); + RenX::TeamType team = RenX::getTeam(Jupiter::ReferenceString::getWord(parameters, 1, WHITESPACE)); - const char *cmd; + Jupiter::StringS cmd; switch (team) { case RenX::TeamType::GDI: @@ -2020,6 +2079,7 @@ void AddBotsGameCommand::trigger(RenX::Server *source, RenX::PlayerInfo *player, cmd = "addbluebots "; break; default: + case RenX::TeamType::None: case RenX::TeamType::Other: cmd = "addbots "; break; @@ -2030,7 +2090,9 @@ void AddBotsGameCommand::trigger(RenX::Server *source, RenX::PlayerInfo *player, amount = 1; else amount = parameters.asUnsignedInt(); - source->send(Jupiter::StringS::Format("%s %u", cmd, amount)); + cmd += Jupiter::StringS::Format("%u", amount); + + source->send(cmd); source->sendMessage(player, Jupiter::StringS::Format("%u bots have been added to the server.", amount)); } diff --git a/RenX.Commands/RenX_Commands.h b/RenX.Commands/RenX_Commands.h index 0e3df39..4e3052f 100644 --- a/RenX.Commands/RenX_Commands.h +++ b/RenX.Commands/RenX_Commands.h @@ -67,7 +67,7 @@ GENERIC_IRC_COMMAND(ShowRulesIRCCommand) GENERIC_IRC_COMMAND(RulesIRCCommand) GENERIC_IRC_COMMAND(SetRulesIRCCommand) GENERIC_IRC_COMMAND(ReconnectIRCCommand) -GENERIC_IRC_COMMAND(RestartMapIRCCommand) +GENERIC_IRC_COMMAND(GameOverIRCCommand) GENERIC_IRC_COMMAND(SetMapIRCCommand) GENERIC_IRC_COMMAND(MuteIRCCommand) GENERIC_IRC_COMMAND(UnMuteIRCCommand) diff --git a/RenX.Core/RenX_Core.cpp b/RenX.Core/RenX_Core.cpp index c1508b7..7f5fe12 100644 --- a/RenX.Core/RenX_Core.cpp +++ b/RenX.Core/RenX_Core.cpp @@ -62,11 +62,6 @@ RenX::Core::~Core() RenX::Core::servers.emptyAndDelete(); } -int RenX::Core::send(RenX::Server *server, const Jupiter::ReadableString &msg) -{ - return server->send(msg); -} - unsigned int RenX::Core::send(int type, const Jupiter::ReadableString &msg) { unsigned int r = 0; @@ -74,7 +69,7 @@ unsigned int RenX::Core::send(int type, const Jupiter::ReadableString &msg) for (size_t i = 0; i != RenX::Core::servers.size(); i++) { server = RenX::Core::getServer(i); - if (server->isLogChanType(type) && RenX::Core::send(server, msg) > 0) r++; + if (server->isLogChanType(type) && server->send(msg) > 0) r++; } return r; } diff --git a/RenX.Core/RenX_Core.h b/RenX.Core/RenX_Core.h index c61c558..d5c504e 100644 --- a/RenX.Core/RenX_Core.h +++ b/RenX.Core/RenX_Core.h @@ -66,15 +66,6 @@ namespace RenX */ const Jupiter::ReadableString &getName() override { return name; } - /** - * @brief Sends a command to a specific server. - * - * @param server Server to send the command to. - * @param data Command to send. - * @return Number of bytes sent on success, less than or equal to 0 otherwise. - */ - int send(Server *server, const Jupiter::ReadableString &data); - /** * @brief Sends a command to all servers of a specific type. * diff --git a/RenX.Core/RenX_Functions.cpp b/RenX.Core/RenX_Functions.cpp index a3af4bd..7fad43f 100644 --- a/RenX.Core/RenX_Functions.cpp +++ b/RenX.Core/RenX_Functions.cpp @@ -102,9 +102,31 @@ Jupiter::ReferenceString translated_Vehicle_AC130_DmgType_HeavyCannon = STRING_L Jupiter::ReferenceString translated_Vehicle_AC130_DmgType_AutoCannon = STRING_LITERAL_AS_REFERENCE("AC130 Auto Cannon"); /** Weapons */ +Jupiter::ReferenceString translated_Weapon_HeavyPistol = STRING_LITERAL_AS_REFERENCE("Heavy Pistol"); +Jupiter::ReferenceString translated_Weapon_Carbine = STRING_LITERAL_AS_REFERENCE("Carbine"); +Jupiter::ReferenceString translated_Weapon_Airstrike_GDI = STRING_LITERAL_AS_REFERENCE("GDI Airstrike"); +Jupiter::ReferenceString translated_Weapon_Airstrike_Nod = STRING_LITERAL_AS_REFERENCE("Nod Airstrike"); +Jupiter::ReferenceString translated_Weapon_TiberiumFlechetteRifle = STRING_LITERAL_AS_REFERENCE("Tiberium Flechette Gun"); +Jupiter::ReferenceString translated_Weapon_TiberiumAutoRifle = STRING_LITERAL_AS_REFERENCE("Tiberium Automatic Rifle"); +Jupiter::ReferenceString translated_Weapon_EMPGrenade = STRING_LITERAL_AS_REFERENCE("EMP Grenade"); +Jupiter::ReferenceString translated_Weapon_SmokeGrenade = STRING_LITERAL_AS_REFERENCE("Smoke Grenade"); +Jupiter::ReferenceString translated_Weapon_TimedC4 = STRING_LITERAL_AS_REFERENCE("Timed C4"); +Jupiter::ReferenceString translated_Weapon_RemoteC4 = STRING_LITERAL_AS_REFERENCE("Remote C4"); +Jupiter::ReferenceString translated_Weapon_ProxyC4 = STRING_LITERAL_AS_REFERENCE("Proximity C4"); +Jupiter::ReferenceString translated_Weapon_ATMine = STRING_LITERAL_AS_REFERENCE("Anti-Tank Mine"); +Jupiter::ReferenceString translated_Weapon_IonCannonBeacon = STRING_LITERAL_AS_REFERENCE("Ion Cannon Beacon"); +Jupiter::ReferenceString translated_Weapon_NukeBeacon = STRING_LITERAL_AS_REFERENCE("Nuclear Missile Beacon"); Jupiter::ReferenceString translated_Weapon_DeployedC4 = STRING_LITERAL_AS_REFERENCE("Timed C4"); +Jupiter::ReferenceString translated_Weapon_DeployedTimedC4 = STRING_LITERAL_AS_REFERENCE("Timed C4"); Jupiter::ReferenceString translated_Weapon_DeployedRemoteC4 = STRING_LITERAL_AS_REFERENCE("Remote C4"); Jupiter::ReferenceString translated_Weapon_DeployedProxyC4 = STRING_LITERAL_AS_REFERENCE("Proximity C4"); +Jupiter::ReferenceString translated_Weapon_DeployedATMine = STRING_LITERAL_AS_REFERENCE("Anti-Tank Mine"); +Jupiter::ReferenceString translated_Weapon_DeployedIonCannonBeacon = STRING_LITERAL_AS_REFERENCE("Ion Cannon Beacon"); +Jupiter::ReferenceString translated_Weapon_DeployedNukeBeacon = STRING_LITERAL_AS_REFERENCE("Nuclear Missile Beacon"); + +/** Projectiles */ +Jupiter::ReferenceString translated_Projectile_EMPGrenade = STRING_LITERAL_AS_REFERENCE("EMP Grenade"); +Jupiter::ReferenceString translated_Projectile_SmokeGrenade = STRING_LITERAL_AS_REFERENCE("Smoke Grenade"); /** GDI Characters */ Jupiter::ReferenceString translated_GDI_Deadeye = STRING_LITERAL_AS_REFERENCE("Deadeye"); @@ -254,6 +276,9 @@ Jupiter::ReferenceString translated_Building_PowerPlant_GDI_Internals = STRING_L Jupiter::ReferenceString translated_Building_AdvancedGuardTower_Internals = STRING_LITERAL_AS_REFERENCE("Advanced Guard Tower"); Jupiter::ReferenceString translated_Building_Obelisk_Internals = STRING_LITERAL_AS_REFERENCE("Obelisk of Light"); +/** Other structures */ +Jupiter::ReferenceString translated_Building_Silo_Internals = STRING_LITERAL_AS_REFERENCE("Tiberium Silo"); + /** Defences */ Jupiter::ReferenceString translated_Defence_GuardTower = STRING_LITERAL_AS_REFERENCE("Guard Tower"); Jupiter::ReferenceString translated_Defence_Turret = STRING_LITERAL_AS_REFERENCE("Turret"); @@ -276,21 +301,32 @@ Jupiter::ReferenceString translated_IonCannonBeacon = STRING_LITERAL_AS_REFERENC Jupiter::ReferenceString translated_NukeBeacon = STRING_LITERAL_AS_REFERENCE("Nuclear Strike Beacon"); Jupiter::ReferenceString translated_KillZDamageType = STRING_LITERAL_AS_REFERENCE("Kill Zone"); -RenX::TeamType RenX::getTeam(char team) +RenX::TeamType RenX::getTeam(int teamNum) { - switch (team) + switch (teamNum) { - case 'g': - case 'G': + case 0: return RenX::TeamType::GDI; - case 'n': - case 'N': + case 1: return RenX::TeamType::Nod; + case 255: + return RenX::TeamType::None; default: return RenX::TeamType::Other; } } +RenX::TeamType RenX::getTeam(const Jupiter::ReadableString &team) +{ + if (team.equalsi("GDI")) + return RenX::TeamType::GDI; + if (team.equalsi("Nod")) + return RenX::TeamType::Nod; + if (team.isEmpty() || team.equalsi("Neutral") || team.equalsi("Civilians")) + return RenX::TeamType::None; + return RenX::TeamType::Other; +} + const Jupiter::ReadableString &RenX::getTeamColor(TeamType team) { switch (team) @@ -451,10 +487,33 @@ const Jupiter::ReadableString &RenX::translateName(const Jupiter::ReadableString else if (object.find(STRING_LITERAL_AS_REFERENCE("Weapon_")) == 0) { object.shiftRight(7); + if (object.equals(STRING_LITERAL_AS_REFERENCE("HeavyPistol"))) return translated_Weapon_HeavyPistol; + if (object.equals(STRING_LITERAL_AS_REFERENCE("Carbine"))) return translated_Weapon_Carbine; + if (object.equals(STRING_LITERAL_AS_REFERENCE("Airstrike_GDI"))) return translated_Weapon_Airstrike_GDI; + if (object.equals(STRING_LITERAL_AS_REFERENCE("Airstrike_Nod"))) return translated_Weapon_Airstrike_Nod; + if (object.equals(STRING_LITERAL_AS_REFERENCE("TiberiumFlechetteRifle"))) return translated_Weapon_TiberiumFlechetteRifle; + if (object.equals(STRING_LITERAL_AS_REFERENCE("TiberiumAutoRifle"))) return translated_Weapon_TiberiumAutoRifle; + if (object.equals(STRING_LITERAL_AS_REFERENCE("EMPGrenade"))) return translated_Weapon_EMPGrenade; + if (object.equals(STRING_LITERAL_AS_REFERENCE("SmokeGrenade"))) return translated_Weapon_SmokeGrenade; + if (object.equals(STRING_LITERAL_AS_REFERENCE("TimedC4"))) return translated_Weapon_TimedC4; + if (object.equals(STRING_LITERAL_AS_REFERENCE("RemoteC4"))) return translated_Weapon_RemoteC4; + if (object.equals(STRING_LITERAL_AS_REFERENCE("ProxyC4"))) return translated_Weapon_ProxyC4; + if (object.equals(STRING_LITERAL_AS_REFERENCE("ATMine"))) return translated_Weapon_ATMine; + if (object.equals(STRING_LITERAL_AS_REFERENCE("IonCannonBeacon"))) return translated_Weapon_IonCannonBeacon; + if (object.equals(STRING_LITERAL_AS_REFERENCE("NukeBeacon"))) return translated_Weapon_NukeBeacon; if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedC4"))) return translated_Weapon_DeployedC4; + if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedTimedC4"))) return translated_Weapon_DeployedTimedC4; if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedRemoteC4"))) return translated_Weapon_DeployedRemoteC4; if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedProxyC4"))) return translated_Weapon_DeployedProxyC4; - // TODO: Add more translations. + if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedATMine"))) return translated_Weapon_DeployedATMine; + if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedIonCannonBeacon"))) return translated_Weapon_DeployedIonCannonBeacon; + if (object.equals(STRING_LITERAL_AS_REFERENCE("DeployedNukeBeacon"))) return translated_Weapon_DeployedNukeBeacon; + } + else if (object.find(STRING_LITERAL_AS_REFERENCE("Projectile_")) == 0) + { + object.shiftRight(11); + if (object.equals(STRING_LITERAL_AS_REFERENCE("EMPGrenade"))) return translated_Projectile_EMPGrenade; + if (object.equals(STRING_LITERAL_AS_REFERENCE("SmokeGrenade"))) return translated_Projectile_SmokeGrenade; } else if (object.find(STRING_LITERAL_AS_REFERENCE("InventoryManager_")) == 0) { @@ -593,6 +652,9 @@ const Jupiter::ReadableString &RenX::translateName(const Jupiter::ReadableString /** Defense structures */ if (object.equals(STRING_LITERAL_AS_REFERENCE("AdvancedGuardTower_Internals"))) return translated_Building_AdvancedGuardTower_Internals; if (object.equals(STRING_LITERAL_AS_REFERENCE("Obelisk_Internals"))) return translated_Building_Obelisk_Internals; + + /** Other structures */ + if (object.equals(STRING_LITERAL_AS_REFERENCE("Silo_Internals"))) return translated_Building_Silo_Internals; } else if (object.find(STRING_LITERAL_AS_REFERENCE("Defence_")) == 0) { @@ -712,25 +774,6 @@ Jupiter::String RenX::getFormattedPlayerName(const RenX::PlayerInfo *player) return r; } -void RenX::sanitizeString(char *str) -{ - while (*str != 0) - { - switch (*str) - { - case '|': - *str = '/'; - break; - case '\\': - if (*(str + 1) == 0) *str = '/'; // So users get something at least. - break; - default: - break; - } - str++; - } -} - void RenX::sanitizeString(Jupiter::StringType &str) { if (str.isEmpty() == false) diff --git a/RenX.Core/RenX_Functions.h b/RenX.Core/RenX_Functions.h index ec07af7..8759b61 100644 --- a/RenX.Core/RenX_Functions.h +++ b/RenX.Core/RenX_Functions.h @@ -34,12 +34,20 @@ namespace RenX class Server; /** - * @brief Translates the first character of a team's name into a TeamType. + * @brief Translates a team's number into a TeamType. * - * @param First character of the team name. + * @param teamNum Team number * @return A corresponding TeamType. */ - RENX_API TeamType getTeam(char team); + RENX_API TeamType getTeam(int teamNum); + + /** + * @brief Translates team number into a TeamType. + * + * @param team Team name + * @return A corresponding TeamType. + */ + RENX_API TeamType getTeam(const Jupiter::ReadableString &team); /** * @brief Fetches the corresponding IRC color code for a team. @@ -127,12 +135,12 @@ namespace RenX RENX_API Jupiter::String getFormattedPlayerName(const RenX::PlayerInfo *player); /** - * @brief Sanitizes a string into a RCON-ready state. + * @brief Sanitizes a string into a RCON-ready state by replacing special + * characters with HTML-style character codes. * Note: This resolves the pipe character ('|') exploit. * * @brief str String to sanitize. */ - RENX_API void sanitizeString(char *str); RENX_API void sanitizeString(Jupiter::StringType &str); /** diff --git a/RenX.Core/RenX_Plugin.cpp b/RenX.Core/RenX_Plugin.cpp index 769b198..207879a 100644 --- a/RenX.Core/RenX_Plugin.cpp +++ b/RenX.Core/RenX_Plugin.cpp @@ -125,6 +125,21 @@ void RenX::Plugin::RenX_OnDisarm(Server *, const RenX::PlayerInfo *, const Jupit return; } +void RenX::Plugin::RenX_OnDisarm(Server *, const RenX::PlayerInfo *, const Jupiter::ReadableString &, const RenX::PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnExplode(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnExplode(Server *, const Jupiter::ReadableString &) +{ + return; +} + void RenX::Plugin::RenX_OnSuicide(Server *, const RenX::PlayerInfo *, const Jupiter::ReadableString &) { return; @@ -150,7 +165,7 @@ void RenX::Plugin::RenX_OnDie(Server *, const Jupiter::ReadableString &, const T return; } -void RenX::Plugin::RenX_OnDestroy(Server *, const RenX::PlayerInfo *, const Jupiter::ReadableString &, const Jupiter::ReadableString &, ObjectType) +void RenX::Plugin::RenX_OnDestroy(Server *, const RenX::PlayerInfo *, const Jupiter::ReadableString &, const TeamType &, const Jupiter::ReadableString &, ObjectType) { return; } @@ -170,6 +185,76 @@ void RenX::Plugin::RenX_OnNeutralize(Server *, const PlayerInfo *, const Jupiter return; } +void RenX::Plugin::RenX_OnCharacterPurchase(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnItemPurchase(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnWeaponPurchase(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnRefillPurchase(Server *, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVehiclePurchase(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnVehicleSpawn(Server *, const TeamType &, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnSpawn(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnBotJoin(Server *, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVehicleCrate(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnDeathCrate(Server *, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnMoneyCrate(Server *, const PlayerInfo *, int) +{ + return; +} + +void RenX::Plugin::RenX_OnCharacterCrate(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnSpyCrate(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + +void RenX::Plugin::RenX_OnRefillCrate(Server *, const PlayerInfo *) +{ + return; +} + void RenX::Plugin::RenX_OnSteal(Server *, const PlayerInfo *, const Jupiter::ReadableString &) { return; @@ -180,6 +265,11 @@ void RenX::Plugin::RenX_OnSteal(Server *, const PlayerInfo *, const Jupiter::Rea return; } +void RenX::Plugin::RenX_OnDonate(Server *, const PlayerInfo *, const PlayerInfo *, double) +{ + return; +} + void RenX::Plugin::RenX_OnGameOver(Server *, RenX::WinType, const TeamType &, int, int) { return; @@ -285,7 +375,7 @@ void RenX::Plugin::RenX_OnVoteCall(Server *, const TeamType &, const Jupiter::Re return; } -void RenX::Plugin::RenX_OnVoteOver(Server *server, const TeamType &, const Jupiter::ReadableString &, bool, int, int) +void RenX::Plugin::RenX_OnVoteOver(Server *, const TeamType &, const Jupiter::ReadableString &, bool, int, int) { return; } @@ -315,53 +405,32 @@ void RenX::Plugin::RenX_OnMap(Server *, const Jupiter::ReadableString &) return; } -void RenX::Plugin::RenX_OnDemoRecord(Server *server, const PlayerInfo *) -{ - return; -} - -void RenX::Plugin::RenX_OnDemoRecord(Server *server, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_OnDemoRecord(Server *, const PlayerInfo *) { return; } - -void RenX::Plugin::RenX_OnDemo(Server *server, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_OnDemoRecord(Server *, const Jupiter::ReadableString &) { return; } -void RenX::Plugin::RenX_OnLog(Server *, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_OnDemoRecordStop(Server *) { return; } -void RenX::Plugin::RenX_XOnVersion(Server *, unsigned int) +void RenX::Plugin::RenX_OnDemo(Server *, const Jupiter::ReadableString &) { return; } -void RenX::Plugin::RenX_OnGrantCharacter(Server *, const PlayerInfo *, const Jupiter::ReadableString &) -{ - return; -} - -void RenX::Plugin::RenX_OnGrantWeapon(Server *, const PlayerInfo *, const Jupiter::ReadableString &) -{ - return; -} - -void RenX::Plugin::RenX_OnSpawnVehicle(Server *, const PlayerInfo *, const Jupiter::ReadableString &) -{ - return; -} - -void RenX::Plugin::RenX_OnSpawnVehicleNoOwner(Server *, const TeamType &, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_OnLog(Server *, const Jupiter::ReadableString &) { return; } -void RenX::Plugin::RenX_OnMinePlace(Server *, const PlayerInfo *, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_XOnVersion(Server *, unsigned int) { return; } diff --git a/RenX.Core/RenX_Plugin.h b/RenX.Core/RenX_Plugin.h index db6e553..26b3ae7 100644 --- a/RenX.Core/RenX_Plugin.h +++ b/RenX.Core/RenX_Plugin.h @@ -65,17 +65,35 @@ namespace RenX /** Game type logs */ virtual void RenX_OnDeploy(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &object); virtual void RenX_OnDisarm(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &object); + virtual void RenX_OnDisarm(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &object, const PlayerInfo *victim); + virtual void RenX_OnExplode(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &object); + virtual void RenX_OnExplode(Server *server, const Jupiter::ReadableString &object); virtual void RenX_OnSuicide(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &damageType); virtual void RenX_OnKill(Server *server, const PlayerInfo *player, const PlayerInfo *victim, const Jupiter::ReadableString &damageType); virtual void RenX_OnKill(Server *server, const Jupiter::ReadableString &killer, const TeamType &killerTeam, const PlayerInfo *victim, const Jupiter::ReadableString &damageType); virtual void RenX_OnDie(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &damageType); virtual void RenX_OnDie(Server *server, const Jupiter::ReadableString &object, const TeamType &objectTeam, const Jupiter::ReadableString &damageType); - virtual void RenX_OnDestroy(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &objectName, const Jupiter::ReadableString &damageType, ObjectType type); + virtual void RenX_OnDestroy(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &objectName, const TeamType &victimTeam, const Jupiter::ReadableString &damageType, ObjectType type); virtual void RenX_OnDestroy(Server *server, const Jupiter::ReadableString &killer, const TeamType &killerTeam, const Jupiter::ReadableString &objectName, const TeamType &objectTeam, const Jupiter::ReadableString &damageType, ObjectType type); virtual void RenX_OnCapture(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &building, const TeamType &oldTeam); virtual void RenX_OnNeutralize(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &building, const TeamType &oldTeam); + virtual void RenX_OnCharacterPurchase(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &character); + virtual void RenX_OnItemPurchase(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &item); + virtual void RenX_OnWeaponPurchase(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &weapon); + virtual void RenX_OnRefillPurchase(Server *server, const PlayerInfo *player); + virtual void RenX_OnVehiclePurchase(Server *server, const PlayerInfo *owner, const Jupiter::ReadableString &vehicle); + virtual void RenX_OnVehicleSpawn(Server *server, const TeamType &team, const Jupiter::ReadableString &vehicle); + virtual void RenX_OnSpawn(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &character); + virtual void RenX_OnBotJoin(Server *server, const PlayerInfo *player); + virtual void RenX_OnVehicleCrate(Server *server, const PlayerInfo *owner, const Jupiter::ReadableString &vehicle); + virtual void RenX_OnDeathCrate(Server *server, const PlayerInfo *player); + virtual void RenX_OnMoneyCrate(Server *server, const PlayerInfo *player, int amount); + virtual void RenX_OnCharacterCrate(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &character); + virtual void RenX_OnSpyCrate(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &character); + virtual void RenX_OnRefillCrate(Server *server, const PlayerInfo *player); virtual void RenX_OnSteal(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &vehicle); virtual void RenX_OnSteal(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &vehicle, const PlayerInfo *victim); + virtual void RenX_OnDonate(Server *server, const PlayerInfo *donor, const PlayerInfo *player, double amount); virtual void RenX_OnGameOver(Server *server, WinType winType, const TeamType &team, int gScore, int nScore); virtual void RenX_OnGame(Server *server, const Jupiter::ReadableString &raw); @@ -115,6 +133,7 @@ namespace RenX /** Demo Type Logs */ virtual void RenX_OnDemoRecord(Server *server, const PlayerInfo *player); virtual void RenX_OnDemoRecord(Server *server, const Jupiter::ReadableString &user); // Note: user is currently always empty. + virtual void RenX_OnDemoRecordStop(Server *server); virtual void RenX_OnDemo(Server *server, const Jupiter::ReadableString &raw); /** Other Logs */ @@ -122,11 +141,6 @@ namespace RenX /** eXtended RCON */ virtual void RenX_XOnVersion(Server *server, unsigned int version); - virtual void RenX_OnGrantCharacter(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &character); - virtual void RenX_OnGrantWeapon(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &weapon); - virtual void RenX_OnSpawnVehicle(Server *server, const PlayerInfo *owner, const Jupiter::ReadableString &vehicle); - virtual void RenX_OnSpawnVehicleNoOwner(Server *server, const TeamType &team, const Jupiter::ReadableString &vehicle); - virtual void RenX_OnMinePlace(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &mine); virtual void RenX_XOnOther(Server *server, const Jupiter::ReadableString &raw); /** Command type */ diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 02d74c4..1f18e5f 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -135,6 +135,16 @@ bool RenX::Server::isFirstDeath() const return RenX::Server::firstDeath; } +bool RenX::Server::isFirstAction() const +{ + return RenX::Server::firstAction; +} + +bool RenX::Server::isSeamless() const +{ + return RenX::Server::seamless; +} + bool RenX::Server::isPublicLogChanType(int type) const { return RenX::Server::logChanType == type; @@ -152,17 +162,11 @@ bool RenX::Server::isLogChanType(int type) const int RenX::Server::send(const Jupiter::ReadableString &command) { - char *t = new char[command.size() + 2]; - *t = 'c'; - for (size_t i = 0; i != command.size(); i++) - t[i + 1] = command.get(i); - t[command.size() + 1] = '\n'; - int r; - if (RenX::Server::profile->mustSanitize) - RenX::sanitizeString(t); - r = RenX::Server::sock.send(t, command.size() + 2); - delete[] t; - return r; + Jupiter::String cmd(command.size() + 2); + cmd = 'c'; + cmd += command; + cmd += '\n'; + return RenX::Server::sock.send(cmd); } int RenX::Server::sendMessage(const Jupiter::ReadableString &message) @@ -199,9 +203,18 @@ int RenX::Server::sendMessage(const RenX::PlayerInfo *player, const Jupiter::Rea if (RenX::Server::profile->privateMessages == false) return RenX::Server::sendMessage(message); + Jupiter::String cmd(message.size() + 28); if (RenX::Server::rconVersion <= 2) - return RenX::Server::sock.send(Jupiter::StringS::Format("cevaprivatesay pid%d %.*s\n", player->id, message.size(), message.ptr())); - return RenX::Server::sock.send(Jupiter::StringS::Format("chostprivatesay pid%d %.*s\n", player->id, message.size(), message.ptr())); + cmd = STRING_LITERAL_AS_REFERENCE("cevaprivatesay pid"); + else + cmd = STRING_LITERAL_AS_REFERENCE("chostprivatesay pid"); + cmd += Jupiter::StringS::Format("%d ", player->id); + cmd += message; + cmd += '\n'; + RenX::sanitizeString(cmd); + return RenX::Server::sock.send(cmd); + //return RenX::Server::sock.send(Jupiter::StringS::Format("cevaprivatesay pid%d %.*s\n", player->id, message.size(), message.ptr())); + //return RenX::Server::sock.send(Jupiter::StringS::Format("chostprivatesay pid%d %.*s\n", player->id, message.size(), message.ptr())); } int RenX::Server::sendData(const Jupiter::ReadableString &data) @@ -376,12 +389,70 @@ bool RenX::Server::updateClientList() return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("_x\x01\n")) > 0; if (RenX::Server::rconVersion <= 2) return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("clogclientlist\n")) > 0; - return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientlist\n")) > 0; + return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS\xA0""DEATHS\xA0""SCORE\xA0""CREDITS\xA0""CHARACTER\xA0""VEHICLE\xA0""PING\xA0""ADMIN\xA0""STEAM\xA0""IP\xA0""PLAYERLOG\n")) > 0 + && RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cbotvarlist KILLS\xA0""DEATHS\xA0""SCORE\xA0""CREDITS\xA0""CHARACTER\xA0""VEHICLE\xA0""PLAYERLOG\n")); + //return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientlist\n")) > 0; +} + +bool RenX::Server::gameover() +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(STRING_LITERAL_AS_REFERENCE("endmap")) > 0; +} + +bool RenX::Server::setMap(const Jupiter::ReadableString &map) +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("changemap %.*s", map.size(), map.ptr())) > 0; +} + +bool RenX::Server::loadMutator(const Jupiter::ReadableString &mutator) +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("loadmutator %.*s", mutator.size(), mutator.ptr())) > 0; +} + +bool RenX::Server::unloadMutator(const Jupiter::ReadableString &mutator) +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("unloadmutator %.*s", mutator.size(), mutator.ptr())) > 0; +} + +bool RenX::Server::cancelVote(const RenX::TeamType team) +{ + if (RenX::Server::rconVersion < 3) + return false; + switch (team) + { + default: + return RenX::Server::send(STRING_LITERAL_AS_REFERENCE("cancelvote -1")) > 0; + case TeamType::GDI: + return RenX::Server::send(STRING_LITERAL_AS_REFERENCE("cancelvote 0")) > 0; + case TeamType::Nod: + return RenX::Server::send(STRING_LITERAL_AS_REFERENCE("cancelvote 1")) > 0; + } +} + +bool RenX::Server::swapTeams() +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(STRING_LITERAL_AS_REFERENCE("swapteams")) > 0; +} + +bool RenX::Server::recordDemo() +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(STRING_LITERAL_AS_REFERENCE("recorddemo")) > 0; +} + +bool RenX::Server::mute(const RenX::PlayerInfo *player) +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("textmute pid%u", player->id)) > 0; +} + +bool RenX::Server::unmute(const RenX::PlayerInfo *player) +{ + return RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("textunmute pid%u", player->id)) > 0; } bool RenX::Server::giveCredits(int id, double credits) { - return RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x04%d%c%.4f\n", id, RenX::DelimC, credits)) > 0; + return (RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x04%d%c%.4f\n", id, RenX::DelimC, credits)) > 0) + || (RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("givecredits pid%d %f", id, credits)) > 0); } bool RenX::Server::giveCredits(RenX::PlayerInfo *player, double credits) @@ -389,14 +460,19 @@ bool RenX::Server::giveCredits(RenX::PlayerInfo *player, double credits) return RenX::Server::giveCredits(player->id, credits); } -bool RenX::Server::changeTeam(int id, unsigned char options) +bool RenX::Server::changeTeam(int id, bool resetCredits) { - return RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x07%d%c%c\n", id, RenX::DelimC, options)) > 0; + if (resetCredits) + return (RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x07%d%c\x03\n", id, RenX::DelimC)) > 0) + || (RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("team pid%d", id)) > 0); + else + return (RenX::Server::xRconVersion != 0 && RenX::Server::sock.send(Jupiter::StringS::Format("_x\x07%d%c\x01\n", id, RenX::DelimC)) > 0) + || (RenX::Server::rconVersion >= 3 && RenX::Server::send(Jupiter::StringS::Format("team2 pid%d", id)) > 0); } -bool RenX::Server::changeTeam(RenX::PlayerInfo *player, unsigned char options) +bool RenX::Server::changeTeam(RenX::PlayerInfo *player, bool resetCredits) { - return RenX::Server::changeTeam(player->id, options); + return RenX::Server::changeTeam(player->id, resetCredits); } bool RenX::Server::setTeam(int id, int team, unsigned char options) @@ -729,14 +805,23 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->silenceJoins = false; } }; + auto setPlayerSteamID = [this](RenX::PlayerInfo *player, uint64_t steamid) + { + player->steamid = steamid; + if (this->uuidMode == 0) + player->uuid = this->formatSteamID(steamid); + }; + auto setPlayerName = [this](RenX::PlayerInfo *player, const Jupiter::ReadableString &name) + { + player->name = name; + if (this->uuidMode == 1) + player->uuid = name; + }; auto parsePlayerData = [this](const Jupiter::ReadableString &data, Jupiter::ReferenceString &name, TeamType &team, int &id, bool &isBot) { Jupiter::ReferenceString idToken = Jupiter::ReferenceString::getToken(data, 1, ','); name = Jupiter::ReferenceString::gotoToken(data, 2, ','); - if (data[0] == ',') - team = TeamType::Other; - else - team = RenX::getTeam(data[0]); + team = RenX::getTeam(Jupiter::ReferenceString::getToken(data, 0, ',')); if (idToken.get(0) == 'b') { idToken.shiftRight(1); @@ -760,9 +845,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } if (r->steamid == 0U && steamid != 0U) { - r->steamid = steamid; - if (this->uuidMode == 0) - r->uuid = this->formatSteamID(r); + setPlayerSteamID(r, steamid); checkBans = true; } }; @@ -771,15 +854,13 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) checkBans = true; r = new RenX::PlayerInfo(); r->id = id; - r->name = name; + setPlayerName(r, name); checkMissing(); if (r->isBot = isBot) r->formatNamePrefix = IRCCOLOR "05[B]"; r->joinTime = time(nullptr); if (id != 0) this->players.add(r); - if (this->uuidMode == 1) - r->uuid = r->name; for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnPlayerCreate(this, r); @@ -818,6 +899,21 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) PARSE_PLAYER_DATA_P(token); return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty); }; + auto resetPlayerCharacter = [](PlayerInfo *player) + { + switch (player->team) + { + case TeamType::GDI: + player->character = STRING_LITERAL_AS_REFERENCE("Rx_FamilyInfo_GDI_Soldier"); + break; + case TeamType::Nod: + player->character = STRING_LITERAL_AS_REFERENCE("Rx_FamilyInfo_Nod_Soldier"); + break; + default: + player->character = Jupiter::ReferenceString::empty; + break; + } + }; if (buff.size() != 0) { @@ -849,9 +945,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (steamToken.equals("-----NO-STEAM-----") == false) steamid = steamToken.asUnsignedLongLong(); - - if (teamToken.isEmpty() == false) - team = RenX::getTeam(teamToken.get(0)); + team = RenX::getTeam(teamToken); if (adminToken.equalsi("None")) getPlayerOrAdd(buff.getToken(5, RenX::DelimC), id, team, isBot, steamid, buff.getToken(1, RenX::DelimC)); @@ -860,6 +954,227 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } header.shiftLeft(1); } + else if (this->lastCommand.equalsi("clientvarlist")) + { + buff.shiftRight(1); + if (this->commandListFormat.isEmpty()) + this->commandListFormat = buff; + else + { + /* + lRCON Command; Conn4 executed: clientvarlist PlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum + rPlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum + rGDI,256,EKT-J 0 0 0 0 0 5217.9629 Rx_FamilyInfo_GDI_Soldier   False 0 0 0.0000 8 None 0x0110000104AE0666 127.0.0.1 256 EKT-J GDI 0 + */ + Jupiter::INIFile::Section table; + size_t i = this->commandListFormat.tokenCount(RenX::DelimC); + while (i-- != 0) + table.set(this->commandListFormat.getToken(i, RenX::DelimC), buff.getToken(i, RenX::DelimC)); + auto parse = [&table](RenX::PlayerInfo *player) + { + Jupiter::INIFile::Section::KeyValuePair *pair; + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Kills")); + if (pair != nullptr) + player->kills = pair->getValue().asUnsignedInt(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Deaths")); + if (pair != nullptr) + player->deaths = pair->getValue().asUnsignedInt(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Score")); + if (pair != nullptr) + player->score = static_cast(pair->getValue().asDouble()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Credits")); + if (pair != nullptr) + player->credits = static_cast(pair->getValue().asDouble()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Character")); + if (pair != nullptr) + player->character = pair->getValue(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Vehicle")); + if (pair != nullptr) + player->vehicle = pair->getValue(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Ping")); + if (pair != nullptr) + player->ping = pair->getValue().asUnsignedInt(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Admin")); + if (pair != nullptr) + player->adminType = pair->getValue(); + }; + Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair(STRING_LITERAL_AS_REFERENCE("PlayerLog")); + if (pair != nullptr) + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), false, table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong(), table.get(STRING_LITERAL_AS_REFERENCE("IP")))); + else + { + Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair(STRING_LITERAL_AS_REFERENCE("Name")); + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("ID")); + + if (pair != nullptr) + { + RenX::PlayerInfo *player = getPlayer(pair->getValue().asInt()); + if (player != nullptr) + { + if (player->name.isEmpty()) + player->name = table.get(STRING_LITERAL_AS_REFERENCE("Name")); + if (player->ip.isEmpty()) + player->ip = table.get(STRING_LITERAL_AS_REFERENCE("IP")); + if (player->steamid == 0) + setPlayerSteamID(player, table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue().asInt()); + else + { + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Team")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue()); + } + + parse(player); + } + // I *could* try and fetch a player by name, but that seems like it *could* open a security hole. + // In addition, would I update their ID? + } + else if (namePair != nullptr) + { + RenX::PlayerInfo *player = getPlayerByName(namePair->getValue()); + if (player != nullptr) + { + if (player->ip.isEmpty()) + player->ip = table.get(STRING_LITERAL_AS_REFERENCE("IP")); + if (player->steamid == 0) + setPlayerSteamID(player, table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue().asInt()); + else + { + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Team")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue()); + } + + parse(player); + } + // No other way to identify player -- worthless command format. + } + } + } + buff.shiftLeft(1); + } + else if (this->lastCommand.equalsi("botlist")) + { + // Team,ID,Name + buff.shiftRight(1); + if (commandListFormat.isEmpty()) + commandListFormat = buff; + else + parseGetPlayerOrAdd(buff); + buff.shiftLeft(1); + } + else if (this->lastCommand.equalsi("botvarlist")) + { + buff.shiftRight(1); + if (this->commandListFormat.isEmpty()) + this->commandListFormat = buff; + else + { + /* + lRCON Command; Conn4 executed: clientvarlist PlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum + rPlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum + rGDI,256,EKT-J 0 0 0 0 0 5217.9629 Rx_FamilyInfo_GDI_Soldier   False 0 0 0.0000 8 None 0x0110000104AE0666 127.0.0.1 256 EKT-J GDI 0 + */ + Jupiter::INIFile::Section table; + size_t i = this->commandListFormat.tokenCount(RenX::DelimC); + while (i-- != 0) + table.set(this->commandListFormat.getToken(i, RenX::DelimC), buff.getToken(i, RenX::DelimC)); + auto parse = [&table](RenX::PlayerInfo *player) + { + Jupiter::INIFile::Section::KeyValuePair *pair; + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Kills")); + if (pair != nullptr) + player->kills = pair->getValue().asUnsignedInt(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Deaths")); + if (pair != nullptr) + player->deaths = pair->getValue().asUnsignedInt(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Score")); + if (pair != nullptr) + player->score = static_cast(pair->getValue().asDouble()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Credits")); + if (pair != nullptr) + player->credits = static_cast(pair->getValue().asDouble()); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Character")); + if (pair != nullptr) + player->character = pair->getValue(); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Vehicle")); + if (pair != nullptr) + player->vehicle = pair->getValue(); + }; + Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair(STRING_LITERAL_AS_REFERENCE("PlayerLog")); + if (pair != nullptr) + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').substring(1).asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), true, 0ULL, Jupiter::ReferenceString::empty)); + else + { + Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair(STRING_LITERAL_AS_REFERENCE("Name")); + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("ID")); + + if (pair != nullptr) + { + RenX::PlayerInfo *player = getPlayer(pair->getValue().asInt()); + if (player != nullptr) + { + if (player->name.isEmpty()) + player->name = table.get(STRING_LITERAL_AS_REFERENCE("Name")); + + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue().asInt()); + else + { + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Team")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue()); + } + + parse(player); + } + } + else if (namePair != nullptr) + { + RenX::PlayerInfo *player = getPlayerByName(namePair->getValue()); + if (player != nullptr) + { + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue().asInt()); + else + { + pair = table.getPair(STRING_LITERAL_AS_REFERENCE("Team")); + if (pair != nullptr) + player->team = RenX::getTeam(pair->getValue()); + } + + parse(player); + } + // No other way to identify player -- worthless command format. + } + } + } + buff.shiftLeft(1); + } break; case 'l': if (RenX::Server::rconVersion >= 3) @@ -870,7 +1185,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (subHeader.equals("Deployed;")) { - // Beacon | "by" | Player + // Object (Beacon/Mine) | Player + // Object (Beacon/Mine) | Player | "on" | Surface RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); Jupiter::ReferenceString objectType = buff.getToken(2, RenX::DelimC); if (objectType.match("*Beacon")) @@ -881,35 +1197,47 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else if (subHeader.equals("Disarmed;")) { - // Beacon | "by" | Player + // Object (Beacon/Mine) | "by" | Player + // Object (Beacon/Mine) | "by" | Player | "owned by" | Owner RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); Jupiter::ReferenceString objectType = buff.getToken(2, RenX::DelimC); if (objectType.match("*Beacon")) player->beaconDisarms++; - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnDisarm(this, player, objectType); + + if (buff.getToken(5, RenX::DelimC).equals("owned by")) + { + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(buff.getToken(6, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDisarm(this, player, objectType, victim); + } + else + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDisarm(this, player, objectType); onAction(); } - /*else if (subHeader.equals("Exploded;")) + else if (subHeader.equals("Exploded;")) { + // Explosive | "at" | Location // Explosive | "at" | Location | "by" | Owner + Jupiter::ReferenceString explosive = buff.getToken(2, RenX::DelimC); + if (buff.getToken(5, RenX::DelimC).equals("by")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(6, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnExplode(this, player, explosive); + } + else + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnExplode(this, explosive); onAction(); - }*/ + } else if (subHeader.equals("Captured;")) { - // Team ',' Building | "by" | Player + // Team ',' Building | "id" | Building ID | "by" | Player Jupiter::ReferenceString teamBuildingToken = buff.getToken(2, RenX::DelimC); - Jupiter::ReferenceString teamToken = teamBuildingToken.getToken(0, ','); Jupiter::ReferenceString building = teamBuildingToken.getToken(1, ','); - if (building.size() > 2) // temporary fix to remove unique identifier from building token - { - if (building.get(building.size() - 2) == '_') - building.truncate(2); - else if (building.size() > 3 && building.get(building.size() - 3) == '_') - building.truncate(3); - } - TeamType oldTeam = teamToken.isEmpty() ? TeamType::None : RenX::getTeam(teamToken.get(0)); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); + TeamType oldTeam = RenX::getTeam(teamBuildingToken.getToken(0, ',')); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(6, RenX::DelimC)); player->captures++; for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnCapture(this, player, building, oldTeam); @@ -917,23 +1245,137 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else if (subHeader.equals("Neutralized;")) { - // Team ',' Building | "by" | Player + // Team ',' Building | "id" | Building ID | "by" | Player Jupiter::ReferenceString teamBuildingToken = buff.getToken(2, RenX::DelimC); - Jupiter::ReferenceString teamToken = teamBuildingToken.getToken(0, ','); Jupiter::ReferenceString building = teamBuildingToken.getToken(1, ','); - if (building.size() > 2) // temporary fix to remove unique identifier from building token - { - if (building.get(building.size() - 2) == '_') - building.truncate(2); - else if (building.size() > 3 && building.get(building.size() - 3) == '_') - building.truncate(3); - } - TeamType oldTeam = teamToken.isEmpty() ? TeamType::None : RenX::getTeam(teamToken.get(0)); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); + TeamType oldTeam = RenX::getTeam(teamBuildingToken.getToken(0, ',')); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(6, RenX::DelimC)); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnNeutralize(this, player, building, oldTeam); onAction(); } + else if (subHeader.equals("Purchase;")) + { + // "character" | Character | "by" | Player + // "item" | Item | "by" | Player + // "weapon" | Weapon | "by" | Player + // "refill" | Player + // "vehicle" | Vehicle | "by" | Player + Jupiter::ReferenceString type = buff.getToken(2, RenX::DelimC); + Jupiter::ReferenceString obj = buff.getToken(3, RenX::DelimC); + if (type.equals("character")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnCharacterPurchase(this, player, obj); + player->character = obj; + } + else if (type.equals("item")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnItemPurchase(this, player, obj); + } + else if (type.equals("weapon")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnWeaponPurchase(this, player, obj); + } + else if (type.equals("refill")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(obj); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnRefillPurchase(this, player); + } + else if (type.equals("vehicle")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVehiclePurchase(this, player, obj); + } + } + else if (subHeader.equals("Spawn;")) + { + // "vehicle" | Vehicle Team, Vehicle + // "player" | Player | "character" | Character + // "bot" | Player + if (buff.getToken(2, RenX::DelimC).equals("vehicle")) + { + Jupiter::ReferenceString vehicle = buff.getToken(3, RenX::DelimC); + Jupiter::ReferenceString vehicleTeamToken = vehicle.getToken(0, ','); + vehicle.shiftRight(vehicleTeamToken.size() + 1); + TeamType team = RenX::getTeam(vehicleTeamToken); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVehicleSpawn(this, team, vehicle); + } + else if (buff.getToken(2, RenX::DelimC).equals("player")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(3, RenX::DelimC)); + Jupiter::ReferenceString character = buff.getToken(5, RenX::DelimC); + player->character = character; + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnSpawn(this, player, character); + } + else if (buff.getToken(2, RenX::DelimC).equals("bot")) + { + RenX::PlayerInfo *bot = parseGetPlayerOrAdd(buff.getToken(3, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnBotJoin(this, bot); + } + } + else if (subHeader.equals("Crate;")) + { + // "vehicle" | Vehicle | "by" | Player + // "death" | "by" | Player + // "money" | Amount | "by" | Player + // "character" | Character | "by" | Player + // "spy" | Character | "by" | Player + // "refill" | "by" | Player + Jupiter::ReferenceString type = buff.getToken(2, RenX::DelimC); + if (type.equals("vehicle")) + { + Jupiter::ReferenceString vehicle = buff.getToken(3, RenX::DelimC); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVehicleCrate(this, player, vehicle); + } + else if (type.equals("death")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDeathCrate(this, player); + } + else if (type.equals("money")) + { + int amount = buff.getToken(3, RenX::DelimC).asInt(); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnMoneyCrate(this, player, amount); + } + else if (type.equals("character")) + { + Jupiter::ReferenceString character = buff.getToken(3, RenX::DelimC); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnCharacterCrate(this, player, character); + player->character = character; + } + else if (type.equals("spy")) + { + Jupiter::ReferenceString character = buff.getToken(3, RenX::DelimC); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(5, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnSpyCrate(this, player, character); + player->character = character; + } + else if (type.equals("refill")) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnRefillCrate(this, player); + } + } else if (subHeader.equals("Death;")) { // "player" | Player | "by" | Killer Player | "with" | Damage Type @@ -944,7 +1386,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (playerToken.isEmpty() == false) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(playerToken); - player->deaths++; Jupiter::ReferenceString type = buff.getToken(4, RenX::DelimC); Jupiter::ReferenceString damageType; if (type.equals("by")) @@ -953,15 +1394,16 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) Jupiter::ReferenceString killerData = buff.getToken(5, RenX::DelimC); Jupiter::ReferenceString kName = killerData.getToken(2, ','); Jupiter::ReferenceString kIDToken = killerData.getToken(1, ','); - Jupiter::ReferenceString kTeamToken = killerData.getToken(0, ','); - RenX::TeamType vTeam = TeamType::Other; - if (kTeamToken.isEmpty() == false) - vTeam = RenX::getTeam(kTeamToken.get(0)); + RenX::TeamType vTeam = RenX::getTeam(killerData.getToken(0, ',')); if (kIDToken.equals("ai") || kIDToken.isEmpty()) + { + player->deaths++; for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnKill(this, kName, vTeam, player, damageType); + } else { + player->deaths++; int kID = 0; bool kIsBot = false; if (kIDToken.get(0) == 'b') @@ -983,17 +1425,20 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else if (type.equals("died by")) { + player->deaths++; damageType = buff.getToken(5, RenX::DelimC); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnDie(this, player, damageType); } else if (type.equals("suicide by")) { + player->deaths++; player->suicides++; damageType = buff.getToken(5, RenX::DelimC); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnSuicide(this, player, damageType); } + resetPlayerCharacter(player); } onAction(); } @@ -1042,14 +1487,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (buff.getToken(4, RenX::DelimC).equals("by")) { Jupiter::ReferenceString killerToken = buff.getToken(5, RenX::DelimC); - Jupiter::ReferenceString teamToken = killerToken.getToken(0, ','); Jupiter::ReferenceString idToken = killerToken.getToken(1, ','); Jupiter::ReferenceString name = killerToken.gotoToken(2, ','); Jupiter::ReferenceString damageType = buff.getToken(7, RenX::DelimC); - RenX::TeamType team = TeamType::Other; - if (teamToken.isEmpty() == false) - team = RenX::getTeam(teamToken.get(0)); + RenX::TeamType team = RenX::getTeam(killerToken.getToken(0, ',')); if (idToken.equals("ai") || idToken.isEmpty()) for (size_t i = 0; i < xPlugins.size(); i++) @@ -1080,12 +1522,24 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) break; } for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnDestroy(this, player, objectName, damageType, type); + xPlugins.get(i)->RenX_OnDestroy(this, player, objectName, RenX::getEnemy(player->team), damageType, type); } } } onAction(); } + else if (subHeader.equals("Donated;")) + { + // Amount | "to" | Recipient | "by" | Donor + if (buff.getToken(5, RenX::DelimC).equals("by")) + { + double amount = buff.getToken(2, RenX::DelimC).asDouble(); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(4, RenX::DelimC)); + RenX::PlayerInfo *donor = parseGetPlayerOrAdd(buff.getToken(6, RenX::DelimC)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDonate(this, donor, player, amount); + } + } else if (subHeader.equals("MatchEnd;")) { // "winner" | Winner | Reason("TimeLimit" etc) | "GDI=" GDI Score | "Nod=" Nod Score @@ -1102,10 +1556,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) else if (sWinType.equals("triggered")) winType = WinType::Shutdown; - Jupiter::ReferenceString winTeam = buff.getToken(3, RenX::DelimC); - TeamType team = TeamType::Other; - if (winTeam.isEmpty() == false) - team = RenX::getTeam(winTeam.get(0)); + TeamType team = RenX::getTeam(buff.getToken(3, RenX::DelimC)); int gScore = buff.getToken(5, RenX::DelimC).getToken(1, '=').asInt(); int nScore = buff.getToken(6, RenX::DelimC).getToken(1, '=').asInt(); @@ -1186,14 +1637,13 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) // Player | "joined" | Team // Player | "joined" | Team | "left" | Old Team RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(2, RenX::DelimC)); + resetPlayerCharacter(player); if (buff.tokenCount(RenX::DelimC) > 4) { - Jupiter::ReferenceString oldTeamToken = buff.getToken(6, RenX::DelimC); - RenX::TeamType oldTeam = TeamType::Other; - if (oldTeamToken.isEmpty() == false) - oldTeam = RenX::getTeam(oldTeamToken.get(0)); - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnTeamChange(this, player, oldTeam); + RenX::TeamType oldTeam = RenX::getTeam(buff.getToken(6, RenX::DelimC)); + if (oldTeam != RenX::TeamType::None) + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnTeamChange(this, player, oldTeam); } } else if (subHeader.equals("Exit;")) @@ -1209,7 +1659,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Player | "to:" | New Name RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(2, RenX::DelimC)); - Jupiter::ReferenceString newName = buff.getToken(3, RenX::DelimC); + Jupiter::ReferenceString newName = buff.getToken(4, RenX::DelimC); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnNameChange(this, player, newName); player->name = newName; @@ -1498,11 +1948,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Map | Mode="seamless" / "nonseamless" Jupiter::ReferenceString map = buff.getToken(2, RenX::DelimC); - bool seamless = true; - if (buff.getToken(3, RenX::DelimC).equals("nonseamless")) + if (buff.getToken(3, RenX::DelimC).equals("seamless")) + this->seamless = true; + else { + this->seamless = false; this->silenceParts = true; - seamless = false; } for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnMapChange(this, map, seamless); @@ -1544,6 +1995,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) xPlugins.get(i)->RenX_OnDemoRecord(this, user); } } + else if (subHeader.equals("RecordStop;")) + { + // Empty + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDemoRecordStop(this); + } else { Jupiter::ReferenceString raw = buff.gotoToken(1, RenX::DelimC); @@ -1595,9 +2052,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(playerData); Jupiter::ReferenceString victimData = buff.getToken(3, RenX::DelimC); - Jupiter::ReferenceString vTeamToken = victimData.getToken(0, ','); Jupiter::ReferenceString vidToken = victimData.getToken(1, ','); - if (vTeamToken.size() != 0 && vidToken.size() != 0) + if (vidToken.size() != 0) { Jupiter::ReferenceString vname = victimData.getToken(2, ','); int vid; @@ -1608,7 +2064,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) visBot = true; } vid = vidToken.asInt(10); - TeamType vteam = RenX::getTeam(vTeamToken.get(0)); + TeamType vteam = RenX::getTeam(victimData.getToken(0, ',')); Jupiter::ReferenceString damageType = buff.getToken(5, RenX::DelimC); RenX::PlayerInfo *victim = getPlayerOrAdd(vname, vid, vteam, visBot, 0, Jupiter::ReferenceString::empty); player->kills++; @@ -1665,12 +2121,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) player->vehicleKills++; } for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnDestroy(this, player, victim, damageType, type); + xPlugins.get(i)->RenX_OnDestroy(this, player, victim, RenX::getEnemy(player->team), damageType, type); onAction(); } else if (playerData.match("??? wins (*)")) { - TeamType team = RenX::getTeam(playerData[0]); + TeamType team = RenX::getTeam(playerData.getToken(0, ' ')); int gScore = buff.getToken(2, RenX::DelimC).gotoToken(1, '=').asInt(10); int nScore = buff.getToken(3, RenX::DelimC).gotoToken(1, '=').asInt(10); Jupiter::ReferenceString winType = Jupiter::ReferenceString::substring(playerData, 10); @@ -1684,7 +2140,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) iWinType = WinType::Base; this->needsCList = true; - if (this->profile->disconnectOnGameOver) + if (!this->seamless) this->silenceParts = true; onPreGameOver(iWinType, team, gScore, nScore); @@ -1708,7 +2164,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) int nScore = buff.getToken(3, RenX::DelimC).gotoToken(1, '=').asInt(10); this->needsCList = true; - if (this->profile->disconnectOnGameOver) + if (!this->seamless) this->silenceParts = true; if (gScore == nScore) @@ -1720,7 +2176,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else { - TeamType winTeam = gScore > nScore ? RenX::getTeam('G') : RenX::getTeam('N'); + TeamType winTeam = gScore > nScore ? RenX::getTeam(0) : RenX::getTeam(1); onPreGameOver(WinType::Shutdown, winTeam, gScore, nScore); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnGameOver(this, WinType::Shutdown, winTeam, gScore, nScore); @@ -1779,9 +2235,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) Jupiter::ReferenceString newName = buff.getToken(3, RenX::DelimC); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnNameChange(this, player, newName); - player->name = newName; - if (RenX::Server::uuidMode == 1) - player->uuid = player->name; + setPlayerName(player, newName); onAction(); } } @@ -1890,20 +2344,14 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (steamid.equals("-----NO")) // RCONv2-2a { steamid = ""; - Jupiter::ReferenceString &teamToken = playerData.getToken(4, CListDelim); - if (teamToken.isEmpty()) - break; - team = getTeam(teamToken.get(0)); + team = getTeam(playerData.getToken(4, CListDelim)); name = playerData.gotoToken(5, CListDelim); } else { if (steamid.equals("-----NO-STEAM-----")) // RCONv2-2.5a steamid = ""; - Jupiter::ReferenceString &teamToken = playerData.getToken(3, CListDelim); - if (teamToken.isEmpty()) - break; - team = getTeam(teamToken.get(0)); + team = getTeam(playerData.getToken(3, CListDelim)); name = playerData.gotoToken(4, CListDelim); } @@ -2017,15 +2465,20 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(1, RenX::DelimC)); Jupiter::ReferenceString character = buff.getToken(2, RenX::DelimC); - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnGrantCharacter(this, player, character); + fputs("Character: \"", stdout); + character.print(stdout); + puts("\""); + if (character.match("Rx_InventoryManager_???_Soldier") == false && player->character != RenX::getCharacter(character)) + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnCharacterPurchase(this, player, character); player->character = RenX::getCharacter(character); } else if (header.equals("grant_weapon")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(1, RenX::DelimC)); + // Support dropped + /*RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(1, RenX::DelimC)); for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnGrantWeapon(this, player, buff.getToken(2, RenX::DelimC)); + xPlugins.get(i)->RenX_OnWeaponPurchase(this, player, buff.getToken(2, RenX::DelimC));*/ } else if (header.equals("spawn_vehicle")) { @@ -2034,24 +2487,20 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(3, RenX::DelimC)); for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnSpawnVehicle(this, player, buff.getToken(2, RenX::DelimC)); + xPlugins.get(i)->RenX_OnVehiclePurchase(this, player, buff.getToken(2, RenX::DelimC)); } else { - RenX::TeamType team; - if (tok1.isEmpty()) - team = TeamType::Other; - else - team = RenX::getTeam(tok1.get(0)); + RenX::TeamType team = RenX::getTeam(tok1); for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnSpawnVehicleNoOwner(this, team, buff.getToken(2, RenX::DelimC)); + xPlugins.get(i)->RenX_OnVehicleSpawn(this, team, buff.getToken(2, RenX::DelimC)); } } else if (header.equals("mine_place")) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(1, RenX::DelimC)); for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnMinePlace(this, player, buff.getToken(2, RenX::DelimC)); + xPlugins.get(i)->RenX_OnDeploy(this, player, buff.getToken(2, RenX::DelimC)); } /*else if (header.equals("mlimit_inc")) { @@ -2072,11 +2521,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) killerData.data = kData.substring(1); victimData.type = vData[0]; victimData.data = vData.substring(1); - if (killerData.type == 1) // These are already handled in standard RCON logs; update models and move on. + if (killerData.type == 1) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(killerData.data.gotoToken(1, ',')); player->character = RenX::getCharacter(killerData.data.getToken(0, ',')); - if (victimData.type == 1) + if (victimData.type == 1) // This is handled in standard RCON logs; update models and move on. { if (this->xRconVersion > 1 || this->xRconRevision >= 1 || victimData.data.findi(STRING_LITERAL_AS_REFERENCE("None")) != 0) { @@ -2084,12 +2533,27 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) victim->character = RenX::getCharacter(victimData.data.getToken(0, ',')); } } + else if (victimData.type == 2) + { + TeamType victimTeam = RenX::getTeam(victimData.data.getToken(0, ',')); + victimData.data = victimData.data.gotoToken(1, ','); + ObjectType type; + if (victimData.data.match("Rx_Building_*")) + type = ObjectType::Building; + else if (victimData.data.match("Rx_Defence_*")) + type = ObjectType::Defence; + else + type = ObjectType::Vehicle; + if (this->xRconVersion > 1 || this->xRconRevision != 0) + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnDestroy(this, player, victimData.data, victimTeam, damageType, type); + } } else if (killerData.type == 3) // No killer! { - if (victimData.type == 2 && victimData.data.size() != 0) + if (victimData.type == 2) { - TeamType victimTeam = RenX::getTeam(victimData.data.getToken(0, ',').get(0)); + TeamType victimTeam = RenX::getTeam(victimData.data.getToken(0, ',')); victimData.data = victimData.data.gotoToken(1, ','); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnDie(this, victimData.data, victimTeam, damageType); @@ -2097,18 +2561,22 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else if (killerData.data.size() != 0) // Non-player killer (log!) { - TeamType killerTeam = RenX::getTeam(killerData.data.getToken(0, ',').get(0)); + TeamType killerTeam = RenX::getTeam(killerData.data.getToken(0, ',')); killerData.data = killerData.data.gotoToken(1, ','); if (victimData.type == 1) // Non-player killed player { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(victimData.data.gotoToken(1, ',')); - player->character = RenX::getCharacter(victimData.data.getToken(0, ',')); - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnKill(this, killerData.data, killerTeam, player, damageType); + if (this->xRconVersion > 1 || this->xRconRevision >= 1 || victimData.data.findi(STRING_LITERAL_AS_REFERENCE("None")) != 0) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(victimData.data.gotoToken(1, ',')); + player->character = RenX::getCharacter(victimData.data.getToken(0, ',')); + player->deaths++; + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnKill(this, killerData.data, killerTeam, player, damageType); + } } else if (victimData.data.size() != 0) // Non-player destroyed non-player { - TeamType victimTeam = RenX::getTeam(victimData.data.getToken(0, ',').get(0)); + TeamType victimTeam = RenX::getTeam(victimData.data.getToken(0, ',')); victimData.data = victimData.data.gotoToken(1, ','); ObjectType type; if (victimData.data.match("Rx_Building_*")) @@ -2137,6 +2605,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) buff.shiftRight(1); for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnCommand(this, buff); + this->commandListFormat.set(Jupiter::ReferenceString::empty); + this->lastCommand = Jupiter::ReferenceString::empty; buff.shiftLeft(1); break; @@ -2162,7 +2632,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) RenX::Server::updateClientList(); if (this->profile->disconnectOnGameOver == false) + { this->firstGame = true; + this->seamless = true; + } else if (this->firstGame == false) { this->firstAction = false; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index adf29d5..7b70248 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -127,6 +127,13 @@ namespace RenX */ bool isFirstAction() const; + /** + * @brief Checks if the server travel mode is seamless. + * + * @return True if the server is using seamless travel, false otherwise. + */ + bool isSeamless() const; + /** * @brief Checks if a channel type is a public channel type. * @@ -285,6 +292,69 @@ namespace RenX */ bool updateClientList(); + /** + * @brief Forces the current game to end, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool gameover(); + + /** + * @brief Forces the current game to end and changes the map, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool setMap(const Jupiter::ReadableString &map); + + /** + * @brief Forces the current game to end, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool loadMutator(const Jupiter::ReadableString &mutator); + + /** + * @brief Forces the current game to end, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool unloadMutator(const Jupiter::ReadableString &mutator); + + /** + * @brief Forcefully ends the current vote, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool cancelVote(const RenX::TeamType team); + + /** + * @brief Swaps the teams, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool swapTeams(); + + /** + * @brief Starts a demo recording, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool recordDemo(); + + /** + * @brief Mutes a player from the game chat, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool mute(const RenX::PlayerInfo *player); + + /** + * @brief Allows a player to use the game chat, if the server supports it. + * + * @return True on success, false otherwise. + */ + bool unmute(const RenX::PlayerInfo *player); + /** * @brief Gives a player additional credits, if the server supports it. * @@ -307,19 +377,19 @@ namespace RenX * @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 + * @param resetCredits True to reset the player's credits, false otherwise. * @return True on success, false otherwise. */ - bool changeTeam(int id, unsigned char options = 0x03); + bool changeTeam(int id, bool resetCredits = true); /** * @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 + * @param resetCredits True to reset the player's credits, false otherwise. * @return True on success, false otherwise. */ - bool changeTeam(RenX::PlayerInfo *player, unsigned char options = 0x03); + bool changeTeam(RenX::PlayerInfo *player, bool resetCredits = true); /** * @brief Forces a player to change teams, if the server supports it. @@ -603,6 +673,7 @@ namespace RenX /** Tracking variables */ bool connected = false; + bool seamless = false; bool needsCList = false; bool silenceParts = false; bool silenceJoins = false; @@ -615,6 +686,7 @@ namespace RenX unsigned int xRconRevision = 0; time_t lastAttempt = 0; Jupiter::String lastLine; + Jupiter::StringS commandListFormat; Jupiter::StringS gameVersion; Jupiter::ArrayList commands; diff --git a/RenX.Core/RenX_ServerProfile.cpp b/RenX.Core/RenX_ServerProfile.cpp index f019a0a..6ab70ec 100644 --- a/RenX.Core/RenX_ServerProfile.cpp +++ b/RenX.Core/RenX_ServerProfile.cpp @@ -25,7 +25,7 @@ struct BaseProfile : RenX::ServerProfile privateMessages = true; disconnectOnGameOver = false; pidbug = false; - mustSanitize = true; + mustSanitize = false; tieFormat = 1; } } _baseProfile; @@ -37,6 +37,7 @@ struct OpenBeta1Profile : BaseProfile { supported = false; privateMessages = false; + mustSanitize = true; } } _openBeta1Profile; const RenX::ServerProfile *RenX::openBeta1Profile = &_openBeta1Profile; @@ -48,6 +49,7 @@ struct OpenBeta2Profile : BaseProfile privateMessages = false; pidbug = true; tieFormat = 0; + mustSanitize = true; } } _openBeta2Profile; const RenX::ServerProfile *RenX::openBeta2Profile = &_openBeta2Profile; @@ -57,6 +59,15 @@ struct OpenBeta3Profile : BaseProfile OpenBeta3Profile() { disconnectOnGameOver = true; + mustSanitize = true; } } _openBeta3Profile; const RenX::ServerProfile *RenX::openBeta3Profile = &_openBeta3Profile; + +struct OpenBeta4Profile : BaseProfile +{ + OpenBeta4Profile() + { + } +} _openBeta4Profile; +const RenX::ServerProfile *RenX::openBeta4Profile = &_openBeta4Profile; \ No newline at end of file diff --git a/RenX.Core/RenX_ServerProfile.h b/RenX.Core/RenX_ServerProfile.h index 0b7835e..f8012c1 100644 --- a/RenX.Core/RenX_ServerProfile.h +++ b/RenX.Core/RenX_ServerProfile.h @@ -44,6 +44,7 @@ namespace RenX RENX_API extern const ServerProfile *openBeta1Profile; /** Open Beta 1 server profile */ RENX_API extern const ServerProfile *openBeta2Profile; /** Open Beta 2 server profile */ RENX_API extern const ServerProfile *openBeta3Profile; /** Open Beta 3 server profile */ + RENX_API extern const ServerProfile *openBeta4Profile; /** Open Beta 4 server profile */ } diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index 0beace1..8cf4f10 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -37,14 +37,32 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::hostPagePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("HostPagePublic"), false); RenX_LoggingPlugin::otherChatPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("OtherChatPublic"), false); RenX_LoggingPlugin::deployPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DeployPublic"), true); + RenX_LoggingPlugin::mineDeployPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MineDeployPublic"), false); RenX_LoggingPlugin::disarmPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DisarmPublic"), true); + RenX_LoggingPlugin::mineDisarmPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MineDisarmPublic"), false); + RenX_LoggingPlugin::explodePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("ExplodePublic"), false); RenX_LoggingPlugin::suicidePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("SuicidePublic"), true); RenX_LoggingPlugin::killPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("KillPublic"), true); RenX_LoggingPlugin::diePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DiePublic"), true); RenX_LoggingPlugin::destroyPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DestroyPublic"), true); RenX_LoggingPlugin::capturePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("CapturePublic"), true); RenX_LoggingPlugin::neutralizePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("NeutralizePublic"), true); + RenX_LoggingPlugin::characterPurchasePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("CharacterPurchasePublic"), false); + RenX_LoggingPlugin::itemPurchasePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("ItemPurchasePublic"), false); + RenX_LoggingPlugin::weaponPurchasePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("WeaponPurchasePublic"), false); + RenX_LoggingPlugin::refillPurchasePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("RefillPurchasePublic"), false); + RenX_LoggingPlugin::vehiclePurchasePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("VehiclePurchasePublic"), false); + RenX_LoggingPlugin::vehicleSpawnPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("VehicleSpawnPublic"), true); + RenX_LoggingPlugin::spawnPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("SpawnPublic"), true); + RenX_LoggingPlugin::botJoinPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("BotJoinPublic"), true); + RenX_LoggingPlugin::vehicleCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("VehicleCratePublic"), false); + RenX_LoggingPlugin::deathCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DeathCratePublic"), false); + RenX_LoggingPlugin::moneyCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MoneyCratePublic"), false); + RenX_LoggingPlugin::characterCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("CharacterCratePublic"), false); + RenX_LoggingPlugin::spyCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("SpyCratePublic"), false); + RenX_LoggingPlugin::refillCratePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("RefillCratePublic"), false); RenX_LoggingPlugin::stealPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("StealPublic"), true); + RenX_LoggingPlugin::donatePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DonatePublic"), true); RenX_LoggingPlugin::gamePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("GamePublic"), true); RenX_LoggingPlugin::gameOverPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("GameOverPublic"), true); RenX_LoggingPlugin::executePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("ExecutePublic"), false); @@ -62,13 +80,10 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::mapLoadPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MapLoadPublic"), true); RenX_LoggingPlugin::mapPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MapPublic"), false); RenX_LoggingPlugin::demoRecordPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DemoRecordPublic"), true); + RenX_LoggingPlugin::demoRecordStopPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DemoRecordStopPublic"), true); RenX_LoggingPlugin::demoPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("DemoPublic"), false); RenX_LoggingPlugin::logPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("LogPublic"), false); RenX_LoggingPlugin::xVersionPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("XVersionPublic"), true); - RenX_LoggingPlugin::grantCharacterPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("GrantCharacterPublic"), false); - RenX_LoggingPlugin::spawnVehiclePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("SpawnVehiclePublic"), false); - RenX_LoggingPlugin::spawnVehicleNoOwnerPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("SpawnVehicleNoOwnerPublic"), true); - RenX_LoggingPlugin::minePlacePublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("MinePlacePublic"), false); RenX_LoggingPlugin::xOtherPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("XOtherPublic"), false); RenX_LoggingPlugin::commandPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("CommandPublic"), false); RenX_LoggingPlugin::errorPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), STRING_LITERAL_AS_REFERENCE("ErrorPublic"), false); @@ -117,16 +132,34 @@ void RenX_LoggingPlugin::init() Jupiter::StringS::Format(IRCCOLOR "06[Other Chat]" IRCCOLOR " %.*s", RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); RenX_LoggingPlugin::deployFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DeployFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD " deployed a " IRCBOLD "%.*s" IRCBOLD, RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " deployed a " IRCBOLD IRCCOLOR "12%.*s" IRCBOLD, RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::mineDeployFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("MineDeployFormat"), + RenX_LoggingPlugin::deployFmt); RenX_LoggingPlugin::disarmFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DisarmFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD " disarmed %.*s's " IRCBOLD "%.*s" IRCBOLD, RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::mineDisarmFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("MineDisarmFormat"), + RenX_LoggingPlugin::disarmFmt); + + RenX_LoggingPlugin::disarmNoOwnerFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DisarmNoOwnerFormat"), Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD " disarmed a " IRCBOLD "%.*s" IRCBOLD, RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + RenX_LoggingPlugin::mineDisarmNoOwnerFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("MineDisarmNoOwnerFormat"), + RenX_LoggingPlugin::disarmNoOwnerFmt); + + RenX_LoggingPlugin::explodeFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("ExplodeFormat"), + Jupiter::StringS::Format("%.*s" IRCCOLOR " detonated a " IRCCOLOR "07%.*s" IRCCOLOR ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + + RenX_LoggingPlugin::explodeNoOwnerFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("ExplodeMoOwnerFormat"), + Jupiter::StringS::Format("A " IRCCOLOR "07%.*s" IRCCOLOR " detonated.", RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + RenX_LoggingPlugin::suicideFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("SuicideFormat"), - Jupiter::StringS::Format("%.*s" IRCCOLOR " suicided (death by " IRCCOLOR "12%.*s" IRCCOLOR ").", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + Jupiter::StringS::Format("%.*s" IRCCOLOR " suicided (" IRCCOLOR "12%.*s" IRCCOLOR ").", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); RenX_LoggingPlugin::killFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("KillFormat"), - Jupiter::StringS::Format("%.*s" IRCCOLOR " killed %.*s" IRCCOLOR " (" IRCCOLOR "12%.*s" IRCCOLOR ").", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + Jupiter::StringS::Format("%.*s" IRCCOLOR " killed %.*s" IRCCOLOR " (" IRCCOLOR "%.*s%.*s/%.*s" IRCCOLOR "vs" IRCCOLOR "%.*s%.*s" ").", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->characterTag.size(), RenX::tags->characterTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); RenX_LoggingPlugin::killFmt2 = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("KillFormat2"), Jupiter::StringS::Format(IRCCOLOR "%.*s%.*s" IRCCOLOR " killed %.*s" IRCCOLOR " (" IRCCOLOR "12%.*s" IRCCOLOR ").", RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); @@ -156,16 +189,61 @@ void RenX_LoggingPlugin::init() Jupiter::StringS::Format(IRCCOLOR "%.*s%.*s" IRCCOLOR " destroyed a " IRCCOLOR "%.*s%.*s" IRCCOLOR " (" IRCCOLOR "12%.*s" IRCCOLOR ").", RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); RenX_LoggingPlugin::captureFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("CaptureFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD " captured the " IRCBOLD IRCCOLOR "%.*s%.*s" IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr())); + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " captured the " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); RenX_LoggingPlugin::neutralizeFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("NeutralizeFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD " neutralized the " IRCBOLD IRCCOLOR "%.*s%.*s" IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr())); + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " neutralized the " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::characterPurchaseFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("CharacterPurchaseFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); + + RenX_LoggingPlugin::itemPurchaseFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("ItemPurchaseFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::weaponPurchaseFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("WeaponPurchaseFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + + RenX_LoggingPlugin::refillPurchaseFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("RefillPurchaseFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*srefill" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr())); + + RenX_LoggingPlugin::vehiclePurchaseFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("VehiclePurchaseFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimVehicleTag.size(), RenX::tags->victimVehicleTag.ptr())); + + RenX_LoggingPlugin::vehicleSpawnFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("VehicleSpawnFormat"), + Jupiter::StringS::Format("A " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD " has spawned.", RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->vehicleTag.size(), RenX::tags->vehicleTag.ptr())); + + RenX_LoggingPlugin::spawnFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("SpawnFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " spawned as a " IRCCOLOR "%.*s%.*s.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); + + RenX_LoggingPlugin::botJoinFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("BotJoinFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " online.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::vehicleCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("VehicleCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up a %.*s vehicle crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::deathCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DeathCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up a " IRCCOLOR "12death" IRCCOLOR " crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::moneyCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("MoneyCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up " IRCCOLOR "09%.*s credits" IRCCOLOR " from a " IRCCOLOR "12money" IRCCOLOR " crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::characterCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("CharacterCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up a " IRCCOLOR "%.*s%.*s" IRCCOLOR " " IRCCOLOR "12character" IRCCOLOR " crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); + + RenX_LoggingPlugin::spyCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("SpyCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up a " IRCCOLOR "%.*s%.*s" IRCCOLOR " " IRCCOLOR "12spy" IRCCOLOR " crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); + + RenX_LoggingPlugin::refillCrateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("RefillCrateFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " picked up a " IRCCOLOR "%.*srefill" IRCCOLOR " crate.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr())); RenX_LoggingPlugin::stealFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("StealFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD IRCCOLOR " stole " IRCBOLD "%.*s" IRCBOLD "'s " IRCBOLD "%.*s" IRCBOLD "!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " stole " IRCBOLD "%.*s" IRCBOLD "'s " IRCBOLD "%.*s" IRCBOLD "!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); RenX_LoggingPlugin::stealNoOwnerFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("StealNoOwnerFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCBOLD IRCCOLOR " stole a " IRCBOLD IRCCOLOR "12%.*s" IRCBOLD "!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " stole a " IRCBOLD IRCCOLOR "12%.*s" IRCBOLD "!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); + + RenX_LoggingPlugin::donateFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("StealFormat"), + Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " donated " IRCCOLOR "09%.*s credits" IRCCOLOR " to " IRCBOLD "%.*s" IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimNameTag.size(), RenX::tags->victimNameTag.ptr())); RenX_LoggingPlugin::gameOverFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("GameOverFormat"), Jupiter::StringS::Format(IRCCOLOR "03[Game]" IRCCOLOR "%.*s The " IRCBOLD "%.*s" IRCBOLD " won by " IRCBOLD "%.*s" IRCBOLD, RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); @@ -233,6 +311,9 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::rconDemoRecordFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("RCONDemoRecordFormat"), STRING_LITERAL_AS_REFERENCE(IRCCOLOR "07A demo recording has started.")); + RenX_LoggingPlugin::demoRecordStopFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DemoRecordStopFormat"), + STRING_LITERAL_AS_REFERENCE(IRCCOLOR "07The demo recording has stopped.")); + RenX_LoggingPlugin::demoFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("DemoFormat"), Jupiter::StringS::Format(IRCCOLOR "06[Demo]" IRCCOLOR " %.*s", RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); @@ -242,18 +323,6 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::xVersionFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("XVersionFormat"), Jupiter::StringS::Format(IRCCOLOR "03This server is using eXtended RCON version %.*s", RenX::tags->xRconVersionTag.size(), RenX::tags->xRconVersionTag.ptr())); - RenX_LoggingPlugin::grantCharacterFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("GrantCharacterFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " is now a " IRCBOLD IRCCOLOR "%.*s%.*s", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimCharacterTag.size(), RenX::tags->victimCharacterTag.ptr())); - - RenX_LoggingPlugin::spawnVehicleFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("SpawnVehicleFormat"), - Jupiter::StringS::Format(IRCBOLD "%.*s" IRCCOLOR IRCBOLD " purchased a " IRCBOLD IRCCOLOR "%.*s%.*s", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->victimVehicleTag.size(), RenX::tags->victimVehicleTag.ptr())); - - RenX_LoggingPlugin::spawnVehicleNoOwnerFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("SpawnVehicleNoOwnerFormat"), - Jupiter::StringS::Format("A " IRCBOLD IRCCOLOR "%.*s%.*s" IRCCOLOR IRCBOLD " has spawned.", RenX::tags->teamColorTag.size(), RenX::tags->teamColorTag.ptr(), RenX::tags->vehicleTag.size(), RenX::tags->vehicleTag.ptr())); - - RenX_LoggingPlugin::minePlaceFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("MinePlaceFormat"), - Jupiter::StringS::Format(IRCCOLOR "07[C4] " IRCCOLOR IRCBOLD "%.*s" IRCCOLOR IRCBOLD " placed a " IRCBOLD IRCCOLOR "12%.*s", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); - RenX_LoggingPlugin::xOtherFmt = Jupiter::IRC::Client::Config->get(this->getName(), STRING_LITERAL_AS_REFERENCE("XOtherFormat"), Jupiter::StringS::Format(IRCCOLOR "06[XOther]" IRCCOLOR " %.*s", RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); @@ -284,7 +353,13 @@ void RenX_LoggingPlugin::init() RenX::sanitizeTags(teamChatFmt); RenX::sanitizeTags(otherChatFmt); RenX::sanitizeTags(deployFmt); + RenX::sanitizeTags(mineDeployFmt); RenX::sanitizeTags(disarmFmt); + RenX::sanitizeTags(mineDisarmFmt); + RenX::sanitizeTags(disarmNoOwnerFmt); + RenX::sanitizeTags(mineDisarmNoOwnerFmt); + RenX::sanitizeTags(explodeFmt); + RenX::sanitizeTags(explodeNoOwnerFmt); RenX::sanitizeTags(suicideFmt); RenX::sanitizeTags(dieFmt); RenX::sanitizeTags(dieFmt2); @@ -298,8 +373,23 @@ void RenX_LoggingPlugin::init() RenX::sanitizeTags(destroyVehicleFmt2); RenX::sanitizeTags(captureFmt); RenX::sanitizeTags(neutralizeFmt); + RenX::sanitizeTags(characterPurchaseFmt); + RenX::sanitizeTags(itemPurchaseFmt); + RenX::sanitizeTags(weaponPurchaseFmt); + RenX::sanitizeTags(refillPurchaseFmt); + RenX::sanitizeTags(vehiclePurchaseFmt); + RenX::sanitizeTags(vehicleSpawnFmt); + RenX::sanitizeTags(spawnFmt); + RenX::sanitizeTags(botJoinFmt); + RenX::sanitizeTags(vehicleCrateFmt); + RenX::sanitizeTags(deathCrateFmt); + RenX::sanitizeTags(moneyCrateFmt); + RenX::sanitizeTags(characterCrateFmt); + RenX::sanitizeTags(spyCrateFmt); + RenX::sanitizeTags(refillCrateFmt); RenX::sanitizeTags(stealFmt); RenX::sanitizeTags(stealNoOwnerFmt); + RenX::sanitizeTags(donateFmt); RenX::sanitizeTags(gameOverFmt); RenX::sanitizeTags(gameOverTieFmt); RenX::sanitizeTags(gameOverTieNoWinFmt); @@ -325,13 +415,10 @@ void RenX_LoggingPlugin::init() RenX::sanitizeTags(mapFmt); RenX::sanitizeTags(demoRecordFmt); RenX::sanitizeTags(rconDemoRecordFmt); + RenX::sanitizeTags(demoRecordStopFmt); RenX::sanitizeTags(demoFmt); RenX::sanitizeTags(logFmt); RenX::sanitizeTags(xVersionFmt); - RenX::sanitizeTags(grantCharacterFmt); - RenX::sanitizeTags(spawnVehicleFmt); - RenX::sanitizeTags(spawnVehicleNoOwnerFmt); - RenX::sanitizeTags(minePlaceFmt); RenX::sanitizeTags(xOtherFmt); RenX::sanitizeTags(commandFmt); RenX::sanitizeTags(errorFmt); @@ -536,12 +623,25 @@ void RenX_LoggingPlugin::RenX_OnOtherChat(RenX::Server *server, const Jupiter::R void RenX_LoggingPlugin::RenX_OnDeploy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) { logFuncType func; - if (RenX_LoggingPlugin::deployPublic) - func = &RenX::Server::sendLogChan; + Jupiter::String msg; + if (object.match("*Beacon")) + { + if (RenX_LoggingPlugin::deployPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->deployFmt; + } else - func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->deployFmt; + { + if (RenX_LoggingPlugin::mineDeployPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->mineDeployFmt; + } if (msg.isEmpty() == false) { RenX::processTags(msg, server, player); @@ -550,18 +650,99 @@ void RenX_LoggingPlugin::RenX_OnDeploy(RenX::Server *server, const RenX::PlayerI } } +void RenX_LoggingPlugin::RenX_OnDisarm(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object, const RenX::PlayerInfo *victim) +{ + logFuncType func; + Jupiter::String msg; + + if (object.match("*Beacon")) + { + if (RenX_LoggingPlugin::disarmPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->disarmFmt; + } + else + { + if (RenX_LoggingPlugin::mineDisarmPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->mineDisarmFmt; + } + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player, victim); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(object)); + (server->*func)(msg); + } +} + void RenX_LoggingPlugin::RenX_OnDisarm(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) { logFuncType func; - if (RenX_LoggingPlugin::disarmPublic) + Jupiter::String msg; + + if (object.match("*Beacon")) + { + if (RenX_LoggingPlugin::disarmPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->disarmNoOwnerFmt; + } + else + { + if (RenX_LoggingPlugin::mineDisarmPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + msg = this->mineDisarmNoOwnerFmt; + } + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(object)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnExplode(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) +{ + logFuncType func; + if (RenX_LoggingPlugin::explodePublic) func = &RenX::Server::sendLogChan; else func = &RenX::Server::sendAdmChan; - Jupiter::String msg = this->disarmFmt; + Jupiter::String msg = this->explodeFmt; if (msg.isEmpty() == false) { RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_WEAPON_TAG, RenX::translateName(object)); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(object)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnExplode(RenX::Server *server, const Jupiter::ReadableString &object) +{ + logFuncType func; + if (RenX_LoggingPlugin::explodePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->explodeNoOwnerFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server); + msg.replace(RenX::tags->INTERNAL_WEAPON_TAG, RenX::translateName(object)); msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(object)); (server->*func)(msg); } @@ -660,7 +841,7 @@ void RenX_LoggingPlugin::RenX_OnDie(RenX::Server *server, const Jupiter::Readabl } } -void RenX_LoggingPlugin::RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const Jupiter::ReadableString &damageType, RenX::ObjectType type) +void RenX_LoggingPlugin::RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) { logFuncType func; if (RenX_LoggingPlugin::destroyPublic) @@ -683,11 +864,10 @@ void RenX_LoggingPlugin::RenX_OnDestroy(RenX::Server *server, const RenX::Player } if (msg.isEmpty() == false) { - RenX::TeamType victimTeam = RenX::getEnemy(player->team); RenX::processTags(msg, server, player); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(victimTeam)); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(victimTeam)); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(victimTeam)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(objectTeam)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(objectTeam)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(objectTeam)); msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(objectName)); msg.replace(RenX::tags->INTERNAL_WEAPON_TAG, RenX::translateName(damageType)); (server->*func)(msg); @@ -734,6 +914,247 @@ void RenX_LoggingPlugin::RenX_OnNeutralize(RenX::Server *server, const RenX::Pla } } +void RenX_LoggingPlugin::RenX_OnCharacterPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) +{ + logFuncType func; + if (RenX_LoggingPlugin::characterPurchasePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->characterPurchaseFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(character)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnItemPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &item) +{ + logFuncType func; + if (RenX_LoggingPlugin::itemPurchasePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->itemPurchaseFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(item)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnWeaponPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &weapon) +{ + logFuncType func; + if (RenX_LoggingPlugin::weaponPurchasePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->weaponPurchaseFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_WEAPON_TAG, RenX::translateName(weapon)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnRefillPurchase(RenX::Server *server, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::refillPurchasePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->refillPurchaseFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVehiclePurchase(RenX::Server *server, const RenX::PlayerInfo *owner, const Jupiter::ReadableString &vehicle) +{ + logFuncType func; + if (RenX_LoggingPlugin::vehiclePurchasePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->vehiclePurchaseFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, owner); + msg.replace(RenX::tags->INTERNAL_VICTIM_VEHICLE_TAG, RenX::translateName(vehicle)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVehicleSpawn(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &vehicle) +{ + logFuncType func; + if (RenX_LoggingPlugin::vehicleSpawnPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->vehicleSpawnFmt; + if (msg.isEmpty() == false) + { + RenX::TeamType otherTeam = RenX::getEnemy(team); + RenX::processTags(msg, server); + msg.replace(RenX::tags->INTERNAL_TEAM_COLOR_TAG, RenX::getTeamColor(team)); + msg.replace(RenX::tags->INTERNAL_TEAM_SHORT_TAG, RenX::getTeamName(team)); + msg.replace(RenX::tags->INTERNAL_TEAM_LONG_TAG, RenX::getFullTeamName(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(otherTeam)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(otherTeam)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(otherTeam)); + msg.replace(RenX::tags->INTERNAL_VEHICLE_TAG, RenX::translateName(vehicle)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnSpawn(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) +{ + logFuncType func; + if (RenX_LoggingPlugin::spawnPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->spawnFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(character)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnBotJoin(RenX::Server *server, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::botJoinPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->botJoinFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVehicleCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &vehicle) +{ + logFuncType func; + if (RenX_LoggingPlugin::vehicleCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->vehicleCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(vehicle)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnDeathCrate(RenX::Server *server, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::deathCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->deathCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnMoneyCrate(RenX::Server *server, const RenX::PlayerInfo *player, int amount) +{ + logFuncType func; + if (RenX_LoggingPlugin::moneyCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->moneyCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, Jupiter::StringS::Format("%d", amount)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnCharacterCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) +{ + logFuncType func; + if (RenX_LoggingPlugin::characterCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->characterCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(character)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnSpyCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) +{ + logFuncType func; + if (RenX_LoggingPlugin::spyCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->spyCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(character)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnRefillCrate(RenX::Server *server, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::refillCratePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->refillCrateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, player); + (server->*func)(msg); + } +} + void RenX_LoggingPlugin::RenX_OnSteal(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &vehicle) { logFuncType func; @@ -768,6 +1189,23 @@ void RenX_LoggingPlugin::RenX_OnSteal(RenX::Server *server, const RenX::PlayerIn } } +void RenX_LoggingPlugin::RenX_OnDonate(RenX::Server *server, const RenX::PlayerInfo *donor, const RenX::PlayerInfo *player, double amount) +{ + logFuncType func; + if (RenX_LoggingPlugin::donatePublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->donateFmt; + if (msg.isEmpty() == false) + { + RenX::processTags(msg, server, donor, player); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, Jupiter::StringS::Format("%.0f", amount)); + (server->*func)(msg); + } +} + void RenX_LoggingPlugin::RenX_OnDestroy(RenX::Server *server, const Jupiter::ReadableString &killer, const RenX::TeamType &killerTeam, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) { logFuncType func; @@ -1124,6 +1562,8 @@ void RenX_LoggingPlugin::RenX_OnMapChange(RenX::Server *server, const Jupiter::R msg.replace(RenX::tags->INTERNAL_MESSAGE_TAG, map); (server->*func)(msg); } + if (server->isSeamless() == false) + server->sendLogChan(IRCCOLOR "07[Warning]" IRCCOLOR " This server is using non-seamless server travel; this bot will be disconnected."); } void RenX_LoggingPlugin::RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) @@ -1193,32 +1633,31 @@ void RenX_LoggingPlugin::RenX_OnDemoRecord(RenX::Server *server, const Jupiter:: } } -void RenX_LoggingPlugin::RenX_OnDemo(RenX::Server *server, const Jupiter::ReadableString &raw) +void RenX_LoggingPlugin::RenX_OnDemoRecordStop(RenX::Server *server) { logFuncType func; - if (RenX_LoggingPlugin::demoPublic) + if (RenX_LoggingPlugin::demoRecordStopPublic) func = &RenX::Server::sendLogChan; else func = &RenX::Server::sendAdmChan; - Jupiter::String msg = this->demoFmt; + Jupiter::String msg = this->demoRecordStopFmt; if (msg.isEmpty() == false) { RenX::processTags(msg, server); - msg.replace(RenX::tags->INTERNAL_MESSAGE_TAG, raw); (server->*func)(msg); } } -void RenX_LoggingPlugin::RenX_OnLog(RenX::Server *server, const Jupiter::ReadableString &raw) +void RenX_LoggingPlugin::RenX_OnDemo(RenX::Server *server, const Jupiter::ReadableString &raw) { logFuncType func; - if (RenX_LoggingPlugin::logPublic) + if (RenX_LoggingPlugin::demoPublic) func = &RenX::Server::sendLogChan; else func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->logFmt; + + Jupiter::String msg = this->demoFmt; if (msg.isEmpty() == false) { RenX::processTags(msg, server); @@ -1227,97 +1666,36 @@ void RenX_LoggingPlugin::RenX_OnLog(RenX::Server *server, const Jupiter::Readabl } } -void RenX_LoggingPlugin::RenX_XOnVersion(RenX::Server *server, unsigned int version) +void RenX_LoggingPlugin::RenX_OnLog(RenX::Server *server, const Jupiter::ReadableString &raw) { logFuncType func; - if (RenX_LoggingPlugin::xVersionPublic) + if (RenX_LoggingPlugin::logPublic) func = &RenX::Server::sendLogChan; else func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->xVersionFmt; + + Jupiter::String msg = this->logFmt; if (msg.isEmpty() == false) { RenX::processTags(msg, server); - msg.replace(RenX::tags->INTERNAL_XRCON_VERSION_TAG, Jupiter::StringS::Format("%u", version)); - (server->*func)(msg); - } -} - -void RenX_LoggingPlugin::RenX_OnGrantCharacter(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) -{ - if (player->character.equals(RenX::getCharacter(character)) == false) - { - logFuncType func; - if (RenX_LoggingPlugin::grantCharacterPublic) - func = &RenX::Server::sendLogChan; - else - func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->grantCharacterFmt; - if (msg.isEmpty() == false) - { - RenX::processTags(msg, server, player); - msg.replace(RenX::tags->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(character)); - (server->*func)(msg); - } - } -} - -void RenX_LoggingPlugin::RenX_OnSpawnVehicle(RenX::Server *server, const RenX::PlayerInfo *owner, const Jupiter::ReadableString &vehicle) -{ - logFuncType func; - if (RenX_LoggingPlugin::spawnVehiclePublic) - func = &RenX::Server::sendLogChan; - else - func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->spawnVehicleFmt; - if (msg.isEmpty() == false) - { - RenX::processTags(msg, server, owner); - msg.replace(RenX::tags->INTERNAL_VICTIM_VEHICLE_TAG, RenX::translateName(vehicle)); + msg.replace(RenX::tags->INTERNAL_MESSAGE_TAG, raw); (server->*func)(msg); } } -void RenX_LoggingPlugin::RenX_OnSpawnVehicleNoOwner(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &vehicle) +void RenX_LoggingPlugin::RenX_XOnVersion(RenX::Server *server, unsigned int version) { logFuncType func; - if (RenX_LoggingPlugin::spawnVehicleNoOwnerPublic) + if (RenX_LoggingPlugin::xVersionPublic) func = &RenX::Server::sendLogChan; else func = &RenX::Server::sendAdmChan; - Jupiter::String msg = this->spawnVehicleNoOwnerFmt; + Jupiter::String msg = this->xVersionFmt; if (msg.isEmpty() == false) { - RenX::TeamType otherTeam = RenX::getEnemy(team); RenX::processTags(msg, server); - msg.replace(RenX::tags->INTERNAL_TEAM_COLOR_TAG, RenX::getTeamColor(team)); - msg.replace(RenX::tags->INTERNAL_TEAM_SHORT_TAG, RenX::getTeamName(team)); - msg.replace(RenX::tags->INTERNAL_TEAM_LONG_TAG, RenX::getFullTeamName(team)); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(otherTeam)); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(otherTeam)); - msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(otherTeam)); - msg.replace(RenX::tags->INTERNAL_VEHICLE_TAG, RenX::translateName(vehicle)); - (server->*func)(msg); - } -} - -void RenX_LoggingPlugin::RenX_OnMinePlace(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &mine) -{ - logFuncType func; - if (RenX_LoggingPlugin::minePlacePublic) - func = &RenX::Server::sendLogChan; - else - func = &RenX::Server::sendAdmChan; - - Jupiter::String msg = this->minePlaceFmt; - if (msg.isEmpty() == false) - { - RenX::processTags(msg, server, player); - msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, RenX::translateName(mine)); + msg.replace(RenX::tags->INTERNAL_XRCON_VERSION_TAG, Jupiter::StringS::Format("%u", version)); (server->*func)(msg); } } diff --git a/RenX.Logging/RenX_Logging.h b/RenX.Logging/RenX_Logging.h index 0bba7c5..2ef23f1 100644 --- a/RenX.Logging/RenX_Logging.h +++ b/RenX.Logging/RenX_Logging.h @@ -38,18 +38,36 @@ public: // RenX::Plugin void RenX_OnOtherChat(RenX::Server *server, const Jupiter::ReadableString &raw) override; void RenX_OnDeploy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) override; + void RenX_OnDisarm(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object, const RenX::PlayerInfo *victim) override; void RenX_OnDisarm(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) override; + void RenX_OnExplode(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &object) override; + void RenX_OnExplode(RenX::Server *server, const Jupiter::ReadableString &object) override; void RenX_OnSuicide(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &damageType) override; void RenX_OnKill(RenX::Server *server, const RenX::PlayerInfo *player, const RenX::PlayerInfo *victim, const Jupiter::ReadableString &damageType) override; void RenX_OnKill(RenX::Server *server, const Jupiter::ReadableString &killer, const RenX::TeamType &killerTeam, const RenX::PlayerInfo *victim, const Jupiter::ReadableString &damageType) override; void RenX_OnDie(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &damageType) override; void RenX_OnDie(RenX::Server *server, const Jupiter::ReadableString &object, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType) override; - void RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const Jupiter::ReadableString &damageType, RenX::ObjectType type) override; + void RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) override; void RenX_OnDestroy(RenX::Server *server, const Jupiter::ReadableString &killer, const RenX::TeamType &killerTeam, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) override; void RenX_OnCapture(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &building, const RenX::TeamType &oldTeam) override; void RenX_OnNeutralize(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &building, const RenX::TeamType &oldTeam) override; + void RenX_OnCharacterPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) override; + void RenX_OnItemPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &item) override; + void RenX_OnWeaponPurchase(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &weapon) override; + void RenX_OnRefillPurchase(RenX::Server *server, const RenX::PlayerInfo *player) override; + void RenX_OnVehiclePurchase(RenX::Server *server, const RenX::PlayerInfo *owner, const Jupiter::ReadableString &vehicle) override; + void RenX_OnVehicleSpawn(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &vehicle) override; + void RenX_OnSpawn(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) override; + void RenX_OnBotJoin(RenX::Server *server, const RenX::PlayerInfo *player) override; + void RenX_OnVehicleCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &vehicle) override; + void RenX_OnDeathCrate(RenX::Server *server, const RenX::PlayerInfo *player) override; + void RenX_OnMoneyCrate(RenX::Server *server, const RenX::PlayerInfo *player, int amount) override; + void RenX_OnCharacterCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) override; + void RenX_OnSpyCrate(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) override; + void RenX_OnRefillCrate(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnSteal(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &vehicle) override; void RenX_OnSteal(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &vehicle, const RenX::PlayerInfo *victim) override; + void RenX_OnDonate(RenX::Server *server, const RenX::PlayerInfo *donor, const RenX::PlayerInfo *player, double amount) override; void RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) override; void RenX_OnGame(RenX::Server *server, const Jupiter::ReadableString &raw) override; @@ -73,15 +91,12 @@ public: // RenX::Plugin void RenX_OnDemoRecord(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnDemoRecord(RenX::Server *server, const Jupiter::ReadableString &user) override; + void RenX_OnDemoRecordStop(RenX::Server *server) override; void RenX_OnDemo(RenX::Server *server, const Jupiter::ReadableString &raw) override; void RenX_OnLog(RenX::Server *server, const Jupiter::ReadableString &raw) override; void RenX_XOnVersion(RenX::Server *server, unsigned int version) override; - void RenX_OnGrantCharacter(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &character) override; - void RenX_OnSpawnVehicle(RenX::Server *server, const RenX::PlayerInfo *owner, const Jupiter::ReadableString &vehicle) override; - void RenX_OnSpawnVehicleNoOwner(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &vehicle) override; - void RenX_OnMinePlace(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &mine) override; void RenX_XOnOther(RenX::Server *server, const Jupiter::ReadableString &raw) override; void RenX_OnCommand(RenX::Server *server, const Jupiter::ReadableString &raw) override; @@ -111,14 +126,32 @@ private: unsigned int hostPagePublic : 1; unsigned int otherChatPublic : 1; unsigned int deployPublic : 1; + unsigned int mineDeployPublic : 1; unsigned int disarmPublic : 1; + unsigned int mineDisarmPublic : 1; + unsigned int explodePublic : 1; unsigned int suicidePublic : 1; unsigned int killPublic : 1; unsigned int diePublic : 1; unsigned int destroyPublic : 1; unsigned int capturePublic : 1; unsigned int neutralizePublic : 1; + unsigned int characterPurchasePublic : 1; + unsigned int itemPurchasePublic : 1; + unsigned int weaponPurchasePublic : 1; + unsigned int refillPurchasePublic : 1; + unsigned int vehiclePurchasePublic : 1; + unsigned int vehicleSpawnPublic : 1; + unsigned int spawnPublic : 1; + unsigned int botJoinPublic : 1; + unsigned int vehicleCratePublic : 1; + unsigned int deathCratePublic : 1; + unsigned int moneyCratePublic : 1; + unsigned int characterCratePublic : 1; + unsigned int spyCratePublic : 1; + unsigned int refillCratePublic : 1; unsigned int stealPublic : 1; + unsigned int donatePublic : 1; unsigned int gameOverPublic : 1; unsigned int gamePublic : 1; unsigned int executePublic : 1; @@ -136,13 +169,10 @@ private: unsigned int mapLoadPublic : 1; unsigned int mapPublic : 1; unsigned int demoRecordPublic : 1; + unsigned int demoRecordStopPublic : 1; unsigned int demoPublic : 1; unsigned int logPublic : 1; unsigned int xVersionPublic : 1; - unsigned int grantCharacterPublic : 1; - unsigned int spawnVehiclePublic : 1; - unsigned int spawnVehicleNoOwnerPublic : 1; - unsigned int minePlacePublic : 1; unsigned int xOtherPublic : 1; unsigned int commandPublic : 1; unsigned int errorPublic : 1; @@ -162,7 +192,13 @@ private: Jupiter::StringS hostPageFmt; Jupiter::StringS otherChatFmt; Jupiter::StringS deployFmt; + Jupiter::StringS mineDeployFmt; Jupiter::StringS disarmFmt; + Jupiter::StringS mineDisarmFmt; + Jupiter::StringS disarmNoOwnerFmt; + Jupiter::StringS mineDisarmNoOwnerFmt; + Jupiter::StringS explodeFmt; + Jupiter::StringS explodeNoOwnerFmt; Jupiter::StringS suicideFmt; Jupiter::StringS dieFmt; Jupiter::StringS dieFmt2; @@ -176,8 +212,23 @@ private: Jupiter::StringS destroyVehicleFmt2; Jupiter::StringS captureFmt; Jupiter::StringS neutralizeFmt; + Jupiter::StringS characterPurchaseFmt; + Jupiter::StringS itemPurchaseFmt; + Jupiter::StringS weaponPurchaseFmt; + Jupiter::StringS refillPurchaseFmt; + Jupiter::StringS vehiclePurchaseFmt; + Jupiter::StringS vehicleSpawnFmt; + Jupiter::StringS spawnFmt; + Jupiter::StringS botJoinFmt; + Jupiter::StringS vehicleCrateFmt; + Jupiter::StringS deathCrateFmt; + Jupiter::StringS moneyCrateFmt; + Jupiter::StringS characterCrateFmt; + Jupiter::StringS spyCrateFmt; + Jupiter::StringS refillCrateFmt; Jupiter::StringS stealFmt; Jupiter::StringS stealNoOwnerFmt; + Jupiter::StringS donateFmt; Jupiter::StringS gameOverFmt; Jupiter::StringS gameOverTieFmt; Jupiter::StringS gameOverTieNoWinFmt; @@ -199,13 +250,10 @@ private: Jupiter::StringS mapLoadFmt; Jupiter::StringS mapFmt; Jupiter::StringS demoRecordFmt, rconDemoRecordFmt; + Jupiter::StringS demoRecordStopFmt; Jupiter::StringS demoFmt; Jupiter::StringS logFmt; Jupiter::StringS xVersionFmt; - Jupiter::StringS grantCharacterFmt; - Jupiter::StringS spawnVehicleFmt; - Jupiter::StringS spawnVehicleNoOwnerFmt; - Jupiter::StringS minePlaceFmt; Jupiter::StringS xOtherFmt; Jupiter::StringS commandFmt; Jupiter::StringS errorFmt; diff --git a/RenX.Medals/RenX_Medals.cpp b/RenX.Medals/RenX_Medals.cpp index 07fc0c6..e8c2a1e 100644 --- a/RenX.Medals/RenX_Medals.cpp +++ b/RenX.Medals/RenX_Medals.cpp @@ -226,7 +226,7 @@ void RenX_MedalsPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winT RenX_MedalsPlugin::medalsFile.sync(medalsFileName); } -void RenX_MedalsPlugin::RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const Jupiter::ReadableString &damageType, RenX::ObjectType type) +void RenX_MedalsPlugin::RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) { if (type == RenX::ObjectType::Building) { diff --git a/RenX.Medals/RenX_Medals.h b/RenX.Medals/RenX_Medals.h index 0f04070..64e6c32 100644 --- a/RenX.Medals/RenX_Medals.h +++ b/RenX.Medals/RenX_Medals.h @@ -48,7 +48,7 @@ public: // RenX::Plugin void RenX_OnPlayerDelete(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) override; - void RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const Jupiter::ReadableString &damageType, RenX::ObjectType type) override; + void RenX_OnDestroy(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &objectName, const RenX::TeamType &objectTeam, const Jupiter::ReadableString &damageType, RenX::ObjectType type) override; RenX_MedalsPlugin(); ~RenX_MedalsPlugin();