diff --git a/src/client/Minecraft.cpp b/src/client/Minecraft.cpp index 2b0075e..05e397b 100755 --- a/src/client/Minecraft.cpp +++ b/src/client/Minecraft.cpp @@ -277,6 +277,8 @@ void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, Loc } } this->level = level; + // So uhhh + level->ops.emplace(options.getStringValue(OPTIONS_USERNAME)); _hasSignaledGeneratingLevelFinished = false; #ifdef STANDALONE_SERVER const bool threadedLevelCreation = false; diff --git a/src/client/gui/screens/ConsoleScreen.cpp b/src/client/gui/screens/ConsoleScreen.cpp index 6380f48..9821f99 100644 --- a/src/client/gui/screens/ConsoleScreen.cpp +++ b/src/client/gui/screens/ConsoleScreen.cpp @@ -66,7 +66,7 @@ void ConsoleScreen::execute() if (_input[0] == '/') { // Command _input = Util::stringTrim(_input.substr(1)); - minecraft->commandManager().execute(*minecraft, _input); + minecraft->commandManager().execute(*minecraft, *minecraft->player, _input); } else { // @ai @rewrite if (minecraft->netCallback && minecraft->raknetInstance->isServer()) { diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp new file mode 100644 index 0000000..ebcbf3d --- /dev/null +++ b/src/commands/Command.cpp @@ -0,0 +1,7 @@ +#include "Command.hpp" +#include "world/level/Level.h" +#include + +bool Command::isPlayerOp(Minecraft& mc, Player& player) { + return mc.level->ops.find(player.name) != mc.level->ops.end(); +} \ No newline at end of file diff --git a/src/commands/Command.hpp b/src/commands/Command.hpp index ee2a5e2..f44c3df 100644 --- a/src/commands/Command.hpp +++ b/src/commands/Command.hpp @@ -8,13 +8,16 @@ enum CommandFlags { }; class Minecraft; +class Player; class Command { public: const std::string& getName() { return m_name; } const CommandFlags getFlags() { return m_flags; } - virtual void execute(Minecraft& mc, const std::vector& args) = 0; + bool isPlayerOp(Minecraft& mc, Player& player); + + virtual void execute(Minecraft& mc, Player& player, const std::vector& args) = 0; virtual void printHelp(Minecraft& mc) = 0; protected: diff --git a/src/commands/CommandHelp.cpp b/src/commands/CommandHelp.cpp index c922b4b..18f7741 100644 --- a/src/commands/CommandHelp.cpp +++ b/src/commands/CommandHelp.cpp @@ -5,7 +5,7 @@ CommandHelp::CommandHelp() : Command("help") {} -void CommandHelp::execute(Minecraft& mc, const std::vector& args) { +void CommandHelp::execute(Minecraft& mc, Player& player, const std::vector& args) { if (args.empty()) { auto cmds = mc.commandManager().getListAllCommands(); diff --git a/src/commands/CommandHelp.hpp b/src/commands/CommandHelp.hpp index 88bee09..48e1f1f 100644 --- a/src/commands/CommandHelp.hpp +++ b/src/commands/CommandHelp.hpp @@ -4,6 +4,6 @@ class CommandHelp : public Command { public: CommandHelp(); - void execute(Minecraft& mc, const std::vector& args); + void execute(Minecraft& mc, Player& player, const std::vector& args); void printHelp(Minecraft& mc); }; \ No newline at end of file diff --git a/src/commands/CommandKick.cpp b/src/commands/CommandKick.cpp index ed167e4..b08ba86 100644 --- a/src/commands/CommandKick.cpp +++ b/src/commands/CommandKick.cpp @@ -9,7 +9,11 @@ CommandKick::CommandKick() : Command("kick") {} -void CommandKick::execute(Minecraft& mc, const std::vector& args) { +void CommandKick::execute(Minecraft& mc, Player& player, const std::vector& args) { + if (!isPlayerOp(mc, player)) { + return mc.addMessage("You aren't enough priveleged to run this command"); + } + if (args.empty()) { return printHelp(mc); } diff --git a/src/commands/CommandKick.hpp b/src/commands/CommandKick.hpp index c743aa4..80225a8 100644 --- a/src/commands/CommandKick.hpp +++ b/src/commands/CommandKick.hpp @@ -4,6 +4,6 @@ class CommandKick : public Command { public: CommandKick(); - void execute(Minecraft& mc, const std::vector& args); + void execute(Minecraft& mc, Player& player, const std::vector& args); void printHelp(Minecraft& mc); }; \ No newline at end of file diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index 8ed2d18..2b7f7f0 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -6,6 +6,7 @@ #include "commands/Command.hpp" #include "commands/CommandHelp.hpp" #include "commands/CommandKick.hpp" +#include "commands/CommandOp.hpp" #include "network/packet/ChatPacket.h" #include "network/RakNetInstance.h" #include "world/level/Level.h" @@ -19,6 +20,7 @@ CommandManager::CommandManager() { void CommandManager::registerAllCommands() { m_commands.push_back(new CommandHelp()); m_commands.push_back(new CommandKick()); + m_commands.push_back(new CommandOp()); } std::vector CommandManager::getListAllCommands() { @@ -31,7 +33,7 @@ std::vector CommandManager::getListAllCommands() { return ret; } -void CommandManager::execute(Minecraft& mc, const std::string& input) { +void CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) { std::istringstream ss(input); std::string cmd; @@ -51,7 +53,7 @@ void CommandManager::execute(Minecraft& mc, const std::string& input) { while (ss >> tok) args.push_back(tok); if (!mc.level->isClientSide || (*it)->getFlags() & CommandFlags::COMMAND_FLAG_SINGLEPLAYER_ONLY) { - (*it)->execute(mc, args); + (*it)->execute(mc, player, args); } else { ChatPacket packet("/" + input); mc.raknetInstance->send(packet); diff --git a/src/commands/CommandManager.hpp b/src/commands/CommandManager.hpp index 1304877..28817ea 100644 --- a/src/commands/CommandManager.hpp +++ b/src/commands/CommandManager.hpp @@ -10,7 +10,7 @@ public: std::vector getListAllCommands(); - void execute(Minecraft& mc, const std::string& input); + void execute(Minecraft& mc, Player& player, const std::string& input); Command* getCommand(const std::string& name); diff --git a/src/commands/CommandOp.cpp b/src/commands/CommandOp.cpp new file mode 100644 index 0000000..b53646e --- /dev/null +++ b/src/commands/CommandOp.cpp @@ -0,0 +1,35 @@ +#include "CommandOp.hpp" +#include "commands/Command.hpp" +#include "network/RakNetInstance.h" +#include "raknet/RakPeer.h" +#include "world/level/Level.h" +#include +#include + + +CommandOp::CommandOp() : Command("op") {} + +void CommandOp::execute(Minecraft& mc, Player& player, const std::vector& args) { + if (!isPlayerOp(mc, player)) { + return mc.addMessage("You aren't enough priveleged to run this command"); + } + + if (args.empty()) { + return printHelp(mc); + } + + auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args] (auto& it) -> bool { + return it->name == args[0]; + }); + + if (mc.level->ops.find(args[0]) != mc.level->ops.end()) { + return mc.addMessage("op: player " + args[0] + " already opped"); + } + + mc.level->ops.emplace((*it)->name); + mc.addMessage("op: successfully opped player " + args[0]); +} + +void CommandOp::printHelp(Minecraft& mc) { + mc.addMessage("Usage: /op "); +} \ No newline at end of file diff --git a/src/commands/CommandOp.hpp b/src/commands/CommandOp.hpp new file mode 100644 index 0000000..ef5b30a --- /dev/null +++ b/src/commands/CommandOp.hpp @@ -0,0 +1,9 @@ +#include "Command.hpp" + +class CommandOp : public Command { +public: + CommandOp(); + + void execute(Minecraft& mc, Player& player, const std::vector& args); + void printHelp(Minecraft& mc); +}; \ No newline at end of file diff --git a/src/world/level/Level.h b/src/world/level/Level.h index fb76474..e6ea67c 100755 --- a/src/world/level/Level.h +++ b/src/world/level/Level.h @@ -307,6 +307,9 @@ public: Dimension* dimension; IRakNetInstance* raknetInstance; Random random; + + std::set ops; + protected: bool isFindingSpawn;