#include "ChatCommandExecutor.h" #include "BlockInfoCommand.h" #include "Chat.h" #include "Game.h" #include "GrantCommand.h" #include "SaveCommand.h" ChatCommandExecutor::ChatCommandExecutor() : ReferenceCounter() { knownCommands.add(new SaveCommand()); knownCommands.add(new CrantCommand()); knownCommands.add(new BlockInfoCommand()); // Add more commands here for (ChatCommand* command : knownCommands) { Game::INSTANCE->consoleInput->addPossibleCommand( dynamic_cast(command->getThis())); } } bool ChatCommandExecutor::execute(Framework::Text line, Entity* zActor) { if (line.hatAt(0, "/")) { for (ChatCommand* command : knownCommands) { if (line.hatAt(0, Framework::Text("/") + command->getName())) { if (line.getLength() > command->getName().getLength() + 1 && !line.hatAt(command->getName().getLength() + 1, " ")) { continue; } Framework::RCArray params; int start = command->getName().getLength() + 2; bool escaped = 0; for (int i = command->getName().getLength() + 2; i < line.getLength(); i++) { if (line.hatAt(i, " ") && !escaped) { if (start < i) { if (line.hatAt(start, "'") && line.hatAt(i - 1, "'")) { params.add(line.getTeilText(start + 1, i - 1)); } else { params.add(line.getTeilText(start, i)); } } start = i + 1; } else if (line.hatAt(i, "'")) { escaped = !escaped; } } if (start < line.getLength()) { if (line.hatAt(start, "'") && line.hatAt(line.getLength() - 1, "'")) { params.add( line.getTeilText(start + 1, line.getLength() - 1)); } else { params.add(line.getTeilText(start, line.getLength())); } } int index = 0; for (ChatCommandParameter* param : command->getParams()) { if (params.getEintragAnzahl() > index && param->isLegalValue(*params.z(index))) { index++; } else { bool isError = 0; if (param->isOptional() && zActor) { Framework::Text defaultValue = param->getDefaultValue(zActor); if (!param->isLegalValue(defaultValue)) { isError = 1; } else { params.add( new Framework::Text(defaultValue), index++); } } else { isError = 1; } if (isError) { Framework::Text error = "Illegal parameter at position "; error.append() << (index + 1) << ": "; if (params.getEintragAnzahl() > index) { error += *params.z(index); } else { error += "(no parameter was given)"; } error.append() << "\n" << command->getHelp(); Game::INSTANCE->zChat()->sendMessageTo( error, zActor, Chat::CHANNEL_ERROR); return true; } } } if (index != params.getEintragAnzahl()) { Framework::Text error = "Illegal number of parameters. " "First unknown parameter: "; error.append() << *params.z(index) << "\n" << command->getHelp(); Game::INSTANCE->zChat()->sendMessageTo( error, zActor, Chat::CHANNEL_ERROR); return true; } if (zActor && command->getSecurityLevel(params) > zActor->getChatSecurityLevel()) { Framework::Text error = "This command requires a security level of at least "; error.append() << command->getSecurityLevel(params) << ". You have currently a security level of " << zActor->getChatSecurityLevel() << ". Ask someone with the required security lavel to " "grant you the same level."; Game::INSTANCE->zChat()->sendMessageTo( error, zActor, Chat::CHANNEL_ERROR); return true; } command->execute(params, zActor); return true; } } } return false; }