mirror of
https://github.com/DarkflameUniverse/DarkflameServer
synced 2024-08-30 18:43:58 +00:00
move commandss into their namespace
make help command useful fix mac error TODO: remove the multiple not founds/ rework the structure to split into help and handling
This commit is contained in:
parent
23d40d54fa
commit
549f878206
@ -90,111 +90,12 @@ void SlashCommandHandler::RegisterCommand(Command command) {
|
|||||||
RegisteredCommands.push_back(command);
|
RegisteredCommands.push_back(command);
|
||||||
};
|
};
|
||||||
|
|
||||||
// DEV Commands
|
|
||||||
void DEVGMCommands::SetGMLevel(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
|
||||||
User* user = UserManager::Instance()->GetUser(entity->GetSystemAddress());
|
|
||||||
|
|
||||||
const auto level_intermed = GeneralUtils::TryParse<uint32_t>(args);
|
|
||||||
if (!level_intermed) {
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"Invalid GM level.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
eGameMasterLevel level = static_cast<eGameMasterLevel>(level_intermed.value());
|
|
||||||
|
|
||||||
#ifndef DEVELOPER_SERVER
|
|
||||||
if (user->GetMaxGMLevel() == eGameMasterLevel::JUNIOR_DEVELOPER) {
|
|
||||||
level = eGameMasterLevel::CIVILIAN;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (level > user->GetMaxGMLevel()) level = user->GetMaxGMLevel();
|
|
||||||
|
|
||||||
if (level == entity->GetGMLevel()) return;
|
|
||||||
bool success = user->GetMaxGMLevel() >= level;
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
WorldPackets::SendGMLevelChange(entity->GetSystemAddress(), success, user->GetMaxGMLevel(), entity->GetGMLevel(), level);
|
|
||||||
GameMessages::SendChatModeUpdate(entity->GetObjectID(), level);
|
|
||||||
entity->SetGMLevel(level);
|
|
||||||
LOG("User %s (%i) has changed their GM level to %i for charID %llu", user->GetUsername().c_str(), user->GetAccountID(), level, entity->GetObjectID());
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef DEVELOPER_SERVER
|
|
||||||
if ((entity->GetGMLevel() > user->GetMaxGMLevel()) || (entity->GetGMLevel() > eGameMasterLevel::CIVILIAN && user->GetMaxGMLevel() == eGameMasterLevel::JUNIOR_DEVELOPER)) {
|
|
||||||
WorldPackets::SendGMLevelChange(entity->GetSystemAddress(), true, user->GetMaxGMLevel(), entity->GetGMLevel(), eGameMasterLevel::CIVILIAN);
|
|
||||||
GameMessages::SendChatModeUpdate(entity->GetObjectID(), eGameMasterLevel::CIVILIAN);
|
|
||||||
entity->SetGMLevel(eGameMasterLevel::CIVILIAN);
|
|
||||||
|
|
||||||
GameMessages::SendToggleGMInvis(entity->GetObjectID(), false, UNASSIGNED_SYSTEM_ADDRESS);
|
|
||||||
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"Your game master level has been changed, you may not be able to use all commands.");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void DEVGMCommands::ToggleNameplate(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
|
||||||
if ((Game::config->GetValue("allow_nameplate_off") != "1" && entity->GetGMLevel() < eGameMasterLevel::DEVELOPER)) return;
|
|
||||||
|
|
||||||
auto* character = entity->GetCharacter();
|
|
||||||
if (character && character->GetBillboardVisible()) {
|
|
||||||
character->SetBillboardVisible(false);
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"Your nameplate has been turned off and is not visible to players currently in this zone.");
|
|
||||||
} else {
|
|
||||||
character->SetBillboardVisible(true);
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"Your nameplate is now on and visible to all players.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DEVGMCommands::ToggleSkipCinematics(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
|
||||||
if (Game::config->GetValue("allow_players_to_skip_cinematics") != "1" && entity->GetGMLevel() < eGameMasterLevel::DEVELOPER) return;
|
|
||||||
auto* character = entity->GetCharacter();
|
|
||||||
if (!character) return;
|
|
||||||
bool current = character->GetPlayerFlag(ePlayerFlag::DLU_SKIP_CINEMATICS);
|
|
||||||
character->SetPlayerFlag(ePlayerFlag::DLU_SKIP_CINEMATICS, !current);
|
|
||||||
if (!current) {
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"You have elected to skip cinematics. Note that not all cinematics can be skipped, but most will be skipped now.");
|
|
||||||
} else {
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, u"Cinematics will no longer be skipped.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Greater Than Zero Commands
|
|
||||||
|
|
||||||
// GM Zero Commands
|
|
||||||
void GMZeroCommands::Help(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
|
||||||
if (args.empty()) {
|
|
||||||
std::ostringstream helpMessage;
|
|
||||||
helpMessage << "Commands:\n*";
|
|
||||||
for (auto& command : RegisteredCommands) {
|
|
||||||
// TODO: Limit displaying commands based on GM level they require
|
|
||||||
// if (RegisteredCommands[args].requiredLevel > entity->GetGMLevel()) continue;
|
|
||||||
helpMessage << "\t" << command.aliases[0] << ": " << command.info << "\n*";
|
|
||||||
}
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(helpMessage.str().substr(0, helpMessage.str().size() - 3)));
|
|
||||||
} else {
|
|
||||||
for (auto& command : RegisteredCommands) {
|
|
||||||
if (std::find(command.aliases.begin(), command.aliases.end(), args) != command.aliases.end()) {
|
|
||||||
if (entity->GetGMLevel() >= command.requiredLevel) {
|
|
||||||
command.help;
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(command.help));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// We don't need to tell normies commands don't exist
|
|
||||||
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
|
||||||
std::ostringstream feedback;
|
|
||||||
feedback << "Command " << std::quoted(args) << " does not exist!";
|
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(feedback.str()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SlashCommandHandler::Startup() {
|
void SlashCommandHandler::Startup() {
|
||||||
|
|
||||||
// Register Dev Commands
|
// Register Dev Commands
|
||||||
Command SetGMLevelCommand{
|
Command SetGMLevelCommand{
|
||||||
.help = "",
|
.help = "Change the GM level of your character",
|
||||||
.info = "",
|
.info = "Within the authorized range of levels for the current account, changes the character's game master level to the specified value. This is required to use certain commands",
|
||||||
.aliases = { "setgmlevel", "makegm", "gmlevel" },
|
.aliases = { "setgmlevel", "makegm", "gmlevel" },
|
||||||
.handle = DEVGMCommands::SetGMLevel,
|
.handle = DEVGMCommands::SetGMLevel,
|
||||||
.requiredLevel = eGameMasterLevel::CIVILIAN
|
.requiredLevel = eGameMasterLevel::CIVILIAN
|
||||||
@ -202,8 +103,8 @@ void SlashCommandHandler::Startup() {
|
|||||||
RegisterCommand(SetGMLevelCommand);
|
RegisterCommand(SetGMLevelCommand);
|
||||||
|
|
||||||
Command ToggleNameplateCommand{
|
Command ToggleNameplateCommand{
|
||||||
.help = "",
|
.help = "Toggle the visibility of your nameplate",
|
||||||
.info = "",
|
.info = "Turns the nameplate above your head that is visible to other players off and on",
|
||||||
.aliases = { "togglenameplate", "tnp" },
|
.aliases = { "togglenameplate", "tnp" },
|
||||||
.handle = DEVGMCommands::ToggleNameplate,
|
.handle = DEVGMCommands::ToggleNameplate,
|
||||||
.requiredLevel = eGameMasterLevel::CIVILIAN
|
.requiredLevel = eGameMasterLevel::CIVILIAN
|
||||||
@ -211,8 +112,8 @@ void SlashCommandHandler::Startup() {
|
|||||||
RegisterCommand(ToggleNameplateCommand);
|
RegisterCommand(ToggleNameplateCommand);
|
||||||
|
|
||||||
Command ToggleSkipCinematicsCommand{
|
Command ToggleSkipCinematicsCommand{
|
||||||
.help = "",
|
.help = "Toggle Skipping Cinematics",
|
||||||
.info = "",
|
.info = "Skips mission and world load related cinematics",
|
||||||
.aliases = { "toggleskipcinematics", "tsc" },
|
.aliases = { "toggleskipcinematics", "tsc" },
|
||||||
.handle = DEVGMCommands::ToggleSkipCinematics,
|
.handle = DEVGMCommands::ToggleSkipCinematics,
|
||||||
.requiredLevel = eGameMasterLevel::CIVILIAN
|
.requiredLevel = eGameMasterLevel::CIVILIAN
|
||||||
@ -242,10 +143,11 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& chat, Entity*
|
|||||||
LOG("Handling command \"%s\" with args \"%s\"", command.c_str(), args.c_str());
|
LOG("Handling command \"%s\" with args \"%s\"", command.c_str(), args.c_str());
|
||||||
|
|
||||||
for (auto& registeredCommand : RegisteredCommands) {
|
for (auto& registeredCommand : RegisteredCommands) {
|
||||||
if (std::find(registeredCommand.aliases.begin(), registeredCommand.aliases.end(), args) != registeredCommand.aliases.end()) {
|
if (std::find(registeredCommand.aliases.begin(), registeredCommand.aliases.end(), command) != registeredCommand.aliases.end()) {
|
||||||
if (entity->GetGMLevel() >= registeredCommand.requiredLevel) {
|
if (entity->GetGMLevel() >= registeredCommand.requiredLevel) {
|
||||||
// Database::Get()->InsertSlashCommandUsage(entity->GetObjectID(), chatCommand);
|
// Database::Get()->InsertSlashCommandUsage(entity->GetObjectID(), chatCommand);
|
||||||
registeredCommand.handle(entity, sysAddr, args);
|
registeredCommand.handle(entity, sysAddr, args);
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
// We don't need to tell normies they aren't high enough level
|
// We don't need to tell normies they aren't high enough level
|
||||||
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
||||||
@ -253,7 +155,6 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& chat, Entity*
|
|||||||
feedback << "You are not high enough GM level to use " << std::quoted(command) << "";
|
feedback << "You are not high enough GM level to use " << std::quoted(command) << "";
|
||||||
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(feedback.str()));
|
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(feedback.str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// We don't need to tell normies commands don't exist
|
// We don't need to tell normies commands don't exist
|
||||||
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
||||||
@ -265,6 +166,40 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& chat, Entity*
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace GMZeroCommands {
|
namespace GMZeroCommands {
|
||||||
|
void Help(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
|
if (args.empty()) {
|
||||||
|
std::ostringstream helpMessage;
|
||||||
|
helpMessage << "Commands:\n*";
|
||||||
|
for (auto& command : RegisteredCommands) {
|
||||||
|
// TODO: Limit displaying commands based on GM level they require
|
||||||
|
// if (RegisteredCommands[args].requiredLevel > entity->GetGMLevel()) continue;
|
||||||
|
helpMessage << command.aliases[0] << ": " << command.help << "\n*";
|
||||||
|
}
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(helpMessage.str().substr(0, helpMessage.str().size() - 2)));
|
||||||
|
} else {
|
||||||
|
for (auto& command : RegisteredCommands) {
|
||||||
|
if (std::find(command.aliases.begin(), command.aliases.end(), args) != command.aliases.end()) {
|
||||||
|
if (entity->GetGMLevel() >= command.requiredLevel) {
|
||||||
|
std::ostringstream commandDetails;
|
||||||
|
commandDetails << "Command: " << command.aliases[0] << "\n*";
|
||||||
|
commandDetails << command.info << "\n*";
|
||||||
|
if (command.aliases.size() > 1) {
|
||||||
|
commandDetails << "Aliases: ";
|
||||||
|
std::copy(command.aliases.begin(), command.aliases.end(), std::ostream_iterator<std::string>(commandDetails, ", "));
|
||||||
|
}
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(commandDetails.str().substr(0, commandDetails.str().size() - 2)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We don't need to tell normies commands don't exist
|
||||||
|
if (entity->GetGMLevel() == eGameMasterLevel::CIVILIAN) return;
|
||||||
|
std::ostringstream feedback;
|
||||||
|
feedback << "Command " << std::quoted(args) << " does not exist!";
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(feedback.str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Pvp(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
void Pvp(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
auto* character = entity->GetComponent<CharacterComponent>();
|
auto* character = entity->GetComponent<CharacterComponent>();
|
||||||
|
|
||||||
@ -468,6 +403,74 @@ namespace GMZeroCommands {
|
|||||||
};
|
};
|
||||||
|
|
||||||
namespace DEVGMCommands {
|
namespace DEVGMCommands {
|
||||||
|
void SetGMLevel(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
|
User* user = UserManager::Instance()->GetUser(entity->GetSystemAddress());
|
||||||
|
|
||||||
|
const auto level_intermed = GeneralUtils::TryParse<uint32_t>(args);
|
||||||
|
if (!level_intermed) {
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"Invalid GM level.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
eGameMasterLevel level = static_cast<eGameMasterLevel>(level_intermed.value());
|
||||||
|
|
||||||
|
#ifndef DEVELOPER_SERVER
|
||||||
|
if (user->GetMaxGMLevel() == eGameMasterLevel::JUNIOR_DEVELOPER) {
|
||||||
|
level = eGameMasterLevel::CIVILIAN;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (level > user->GetMaxGMLevel()) level = user->GetMaxGMLevel();
|
||||||
|
|
||||||
|
if (level == entity->GetGMLevel()) return;
|
||||||
|
bool success = user->GetMaxGMLevel() >= level;
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
WorldPackets::SendGMLevelChange(entity->GetSystemAddress(), success, user->GetMaxGMLevel(), entity->GetGMLevel(), level);
|
||||||
|
GameMessages::SendChatModeUpdate(entity->GetObjectID(), level);
|
||||||
|
entity->SetGMLevel(level);
|
||||||
|
LOG("User %s (%i) has changed their GM level to %i for charID %llu", user->GetUsername().c_str(), user->GetAccountID(), level, entity->GetObjectID());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef DEVELOPER_SERVER
|
||||||
|
if ((entity->GetGMLevel() > user->GetMaxGMLevel()) || (entity->GetGMLevel() > eGameMasterLevel::CIVILIAN && user->GetMaxGMLevel() == eGameMasterLevel::JUNIOR_DEVELOPER)) {
|
||||||
|
WorldPackets::SendGMLevelChange(entity->GetSystemAddress(), true, user->GetMaxGMLevel(), entity->GetGMLevel(), eGameMasterLevel::CIVILIAN);
|
||||||
|
GameMessages::SendChatModeUpdate(entity->GetObjectID(), eGameMasterLevel::CIVILIAN);
|
||||||
|
entity->SetGMLevel(eGameMasterLevel::CIVILIAN);
|
||||||
|
|
||||||
|
GameMessages::SendToggleGMInvis(entity->GetObjectID(), false, UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
|
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"Your game master level has been changed, you may not be able to use all commands.");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ToggleNameplate(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
|
if ((Game::config->GetValue("allow_nameplate_off") != "1" && entity->GetGMLevel() < eGameMasterLevel::DEVELOPER)) return;
|
||||||
|
|
||||||
|
auto* character = entity->GetCharacter();
|
||||||
|
if (character && character->GetBillboardVisible()) {
|
||||||
|
character->SetBillboardVisible(false);
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"Your nameplate has been turned off and is not visible to players currently in this zone.");
|
||||||
|
} else {
|
||||||
|
character->SetBillboardVisible(true);
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"Your nameplate is now on and visible to all players.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToggleSkipCinematics(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
|
if (Game::config->GetValue("allow_players_to_skip_cinematics") != "1" && entity->GetGMLevel() < eGameMasterLevel::DEVELOPER) return;
|
||||||
|
auto* character = entity->GetCharacter();
|
||||||
|
if (!character) return;
|
||||||
|
bool current = character->GetPlayerFlag(ePlayerFlag::DLU_SKIP_CINEMATICS);
|
||||||
|
character->SetPlayerFlag(ePlayerFlag::DLU_SKIP_CINEMATICS, !current);
|
||||||
|
if (!current) {
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"You have elected to skip cinematics. Note that not all cinematics can be skipped, but most will be skipped now.");
|
||||||
|
} else {
|
||||||
|
GameMessages::SendSlashCommandFeedbackText(entity, u"Cinematics will no longer be skipped.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ResetMission(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
void ResetMission(Entity* entity, const SystemAddress& sysAddr, const std::string args) {
|
||||||
const auto splitArgs = GeneralUtils::SplitString(args, ' ');
|
const auto splitArgs = GeneralUtils::SplitString(args, ' ');
|
||||||
if (splitArgs.empty()) return;
|
if (splitArgs.empty()) return;
|
||||||
|
Loading…
Reference in New Issue
Block a user