mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-04 14:33:36 +00:00
FEAT: server-side commands
This commit is contained in:
@@ -66,7 +66,11 @@ void ConsoleScreen::execute()
|
|||||||
if (_input[0] == '/') {
|
if (_input[0] == '/') {
|
||||||
// Command
|
// Command
|
||||||
_input = Util::stringTrim(_input.substr(1));
|
_input = Util::stringTrim(_input.substr(1));
|
||||||
minecraft->commandManager().execute(*minecraft, *minecraft->player, _input);
|
|
||||||
|
std::istringstream iss(minecraft->commandManager().execute(*minecraft, *minecraft->player, _input));
|
||||||
|
for (std::string line; std::getline(iss, line); ) {
|
||||||
|
minecraft->gui.addMessage(line);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// @ai @rewrite
|
// @ai @rewrite
|
||||||
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
|
||||||
@@ -75,7 +79,7 @@ void ConsoleScreen::execute()
|
|||||||
ChatPacket chatPkt(_input);
|
ChatPacket chatPkt(_input);
|
||||||
minecraft->raknetInstance->send(chatPkt);
|
minecraft->raknetInstance->send(chatPkt);
|
||||||
} else {
|
} else {
|
||||||
minecraft->gui.addMessage(_input);
|
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ public:
|
|||||||
|
|
||||||
bool isPlayerOp(Minecraft& mc, Player& player);
|
bool isPlayerOp(Minecraft& mc, Player& player);
|
||||||
|
|
||||||
virtual void execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) = 0;
|
virtual std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) = 0;
|
||||||
virtual void printHelp(Minecraft& mc) = 0;
|
virtual std::string help(Minecraft& mc) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Command(const std::string& name, CommandFlags flags = (CommandFlags)0) : m_name(name), m_flags(flags) {}
|
Command(const std::string& name, CommandFlags flags = (CommandFlags)0) : m_name(name), m_flags(flags) {}
|
||||||
|
|||||||
@@ -2,26 +2,34 @@
|
|||||||
#include "commands/Command.hpp"
|
#include "commands/Command.hpp"
|
||||||
#include "CommandManager.hpp"
|
#include "CommandManager.hpp"
|
||||||
#include <client/Minecraft.h>
|
#include <client/Minecraft.h>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
CommandHelp::CommandHelp() : Command("help") {}
|
CommandHelp::CommandHelp() : Command("help") {}
|
||||||
|
|
||||||
void CommandHelp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
std::string CommandHelp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
||||||
if (args.empty()) {
|
if (args.empty()) {
|
||||||
auto cmds = mc.commandManager().getListAllCommands();
|
auto cmds = mc.commandManager().getListAllCommands();
|
||||||
|
|
||||||
mc.addMessage("Usage: /help <command>");
|
std::ostringstream output;
|
||||||
mc.addMessage("List of all commands:");
|
|
||||||
|
output << "List of all commands:" << std::endl;
|
||||||
|
|
||||||
for (auto& cmd : cmds) {
|
for (auto& cmd : cmds) {
|
||||||
mc.addMessage(" - " + cmd);
|
output << " - " + cmd << std::endl;;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
return output.str();
|
||||||
|
}
|
||||||
|
|
||||||
Command* cmd = mc.commandManager().getCommand(args[0]);
|
Command* cmd = mc.commandManager().getCommand(args[0]);
|
||||||
|
|
||||||
if (cmd != nullptr) {
|
if (cmd != nullptr) {
|
||||||
cmd->printHelp(mc);
|
return cmd->help(mc);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandHelp::printHelp(Minecraft& mc) {}
|
return "help: command " + args[0] + " not found";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CommandHelp::help(Minecraft& mc) {
|
||||||
|
return "Usage: /help <command>";
|
||||||
|
}
|
||||||
@@ -4,6 +4,6 @@ class CommandHelp : public Command {
|
|||||||
public:
|
public:
|
||||||
CommandHelp();
|
CommandHelp();
|
||||||
|
|
||||||
void execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
||||||
void printHelp(Minecraft& mc);
|
std::string help(Minecraft& mc);
|
||||||
};
|
};
|
||||||
@@ -9,13 +9,13 @@
|
|||||||
|
|
||||||
CommandKick::CommandKick() : Command("kick") {}
|
CommandKick::CommandKick() : Command("kick") {}
|
||||||
|
|
||||||
void CommandKick::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
std::string CommandKick::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
||||||
if (!isPlayerOp(mc, player)) {
|
if (!isPlayerOp(mc, player)) {
|
||||||
return mc.addMessage("You aren't enough priveleged to run this command");
|
return "You aren't enough priveleged to run this command";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.empty()) {
|
if (args.empty()) {
|
||||||
return printHelp(mc);
|
return help(mc);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args] (auto& it) -> bool {
|
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args] (auto& it) -> bool {
|
||||||
@@ -23,11 +23,11 @@ void CommandKick::execute(Minecraft& mc, Player& player, const std::vector<std::
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (it == mc.level->players.end()) {
|
if (it == mc.level->players.end()) {
|
||||||
return mc.addMessage("kick: can't find player with name " + args[0]);
|
return "kick: can't find player with name " + args[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*it == (Player*)mc.player) {
|
if (*it == (Player*)mc.player) {
|
||||||
return mc.addMessage("kick: you can't kick urself lol");
|
return "kick: you can't kick urself lol";
|
||||||
}
|
}
|
||||||
|
|
||||||
mc.level->removePlayer(*it);
|
mc.level->removePlayer(*it);
|
||||||
@@ -36,6 +36,6 @@ void CommandKick::execute(Minecraft& mc, Player& player, const std::vector<std::
|
|||||||
mc.addMessage("kick: successfully kicked player " + args[0]);
|
mc.addMessage("kick: successfully kicked player " + args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandKick::printHelp(Minecraft& mc) {
|
std::string CommandKick::help(Minecraft& mc) {
|
||||||
mc.addMessage("Usage: /kick <player>");
|
return "Usage: /kick <player>";
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,6 @@ class CommandKick : public Command {
|
|||||||
public:
|
public:
|
||||||
CommandKick();
|
CommandKick();
|
||||||
|
|
||||||
void execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
||||||
void printHelp(Minecraft& mc);
|
std::string help(Minecraft& mc);
|
||||||
};
|
};
|
||||||
@@ -33,7 +33,7 @@ std::vector<std::string> CommandManager::getListAllCommands() {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) {
|
std::string CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) {
|
||||||
std::istringstream ss(input);
|
std::istringstream ss(input);
|
||||||
std::string cmd;
|
std::string cmd;
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ void CommandManager::execute(Minecraft& mc, Player& player, const std::string& i
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (it == m_commands.end()) {
|
if (it == m_commands.end()) {
|
||||||
return mc.addMessage("Command /" + cmd + " not found");
|
return "Command /" + cmd + " not found";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> args;
|
std::vector<std::string> args;
|
||||||
@@ -53,11 +53,13 @@ void CommandManager::execute(Minecraft& mc, Player& player, const std::string& i
|
|||||||
while (ss >> tok) args.push_back(tok);
|
while (ss >> tok) args.push_back(tok);
|
||||||
|
|
||||||
if (!mc.level->isClientSide || (*it)->getFlags() & CommandFlags::COMMAND_FLAG_SINGLEPLAYER_ONLY) {
|
if (!mc.level->isClientSide || (*it)->getFlags() & CommandFlags::COMMAND_FLAG_SINGLEPLAYER_ONLY) {
|
||||||
(*it)->execute(mc, player, args);
|
return (*it)->execute(mc, player, args);
|
||||||
} else {
|
} else {
|
||||||
ChatPacket packet("/" + input);
|
ChatPacket packet("/" + input);
|
||||||
mc.raknetInstance->send(packet);
|
mc.raknetInstance->send(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
Command* CommandManager::getCommand(const std::string& name) {
|
Command* CommandManager::getCommand(const std::string& name) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public:
|
|||||||
|
|
||||||
std::vector<std::string> getListAllCommands();
|
std::vector<std::string> getListAllCommands();
|
||||||
|
|
||||||
void execute(Minecraft& mc, Player& player, const std::string& input);
|
std::string execute(Minecraft& mc, Player& player, const std::string& input);
|
||||||
|
|
||||||
Command* getCommand(const std::string& name);
|
Command* getCommand(const std::string& name);
|
||||||
|
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
|
|
||||||
CommandOp::CommandOp() : Command("op") {}
|
CommandOp::CommandOp() : Command("op") {}
|
||||||
|
|
||||||
void CommandOp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
std::string CommandOp::execute(Minecraft& mc, Player& player, const std::vector<std::string>& args) {
|
||||||
if (!isPlayerOp(mc, player)) {
|
if (!isPlayerOp(mc, player)) {
|
||||||
return mc.addMessage("You aren't enough priveleged to run this command");
|
return "You aren't enough priveleged to run this command";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.empty()) {
|
if (args.empty()) {
|
||||||
return printHelp(mc);
|
return help(mc);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args] (auto& it) -> bool {
|
auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args] (auto& it) -> bool {
|
||||||
@@ -23,13 +23,13 @@ void CommandOp::execute(Minecraft& mc, Player& player, const std::vector<std::st
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (mc.level->ops.find(args[0]) != mc.level->ops.end()) {
|
if (mc.level->ops.find(args[0]) != mc.level->ops.end()) {
|
||||||
return mc.addMessage("op: player " + args[0] + " already opped");
|
return "op: player " + args[0] + " already opped";
|
||||||
}
|
}
|
||||||
|
|
||||||
mc.level->ops.emplace((*it)->name);
|
mc.level->ops.emplace((*it)->name);
|
||||||
mc.addMessage("op: successfully opped player " + args[0]);
|
return "op: successfully opped player " + args[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandOp::printHelp(Minecraft& mc) {
|
std::string CommandOp::help(Minecraft& mc) {
|
||||||
mc.addMessage("Usage: /op <player>");
|
return "Usage: /op <player>";
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,6 @@ class CommandOp : public Command {
|
|||||||
public:
|
public:
|
||||||
CommandOp();
|
CommandOp();
|
||||||
|
|
||||||
void execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
std::string execute(Minecraft& mc, Player& player, const std::vector<std::string>& args);
|
||||||
void printHelp(Minecraft& mc);
|
std::string help(Minecraft& mc);
|
||||||
};
|
};
|
||||||
@@ -949,7 +949,11 @@ void ClientSideNetworkHandler::handle(const RakNet::RakNetGUID& source, Containe
|
|||||||
void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, ChatPacket* packet )
|
void ClientSideNetworkHandler::handle( const RakNet::RakNetGUID& source, ChatPacket* packet )
|
||||||
{
|
{
|
||||||
#ifndef STANDALONE_SERVER
|
#ifndef STANDALONE_SERVER
|
||||||
minecraft->gui.displayClientMessage(packet->message);
|
// minecraft->gui.displayClientMessage(packet->message);
|
||||||
|
std::istringstream iss(packet->message);
|
||||||
|
for (std::string line; std::getline(iss, line); ) {
|
||||||
|
minecraft->gui.addMessage(line);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "../world/entity/player/Inventory.h"
|
#include "../world/entity/player/Inventory.h"
|
||||||
#include "../world/Container.h"
|
#include "../world/Container.h"
|
||||||
#include "../world/inventory/BaseContainerMenu.h"
|
#include "../world/inventory/BaseContainerMenu.h"
|
||||||
|
#include "network/packet/ChatPacket.h"
|
||||||
#include "network/packet/ContainerSetSlotPacket.h"
|
#include "network/packet/ContainerSetSlotPacket.h"
|
||||||
#include "network/packet/LoginStatusPacket.h"
|
#include "network/packet/LoginStatusPacket.h"
|
||||||
#include "network/packet/MovePlayerPacket.h"
|
#include "network/packet/MovePlayerPacket.h"
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
#include "../raknet/PacketPriority.h"
|
#include "../raknet/PacketPriority.h"
|
||||||
#include "platform/log.h"
|
#include "platform/log.h"
|
||||||
#include "util/Mth.h"
|
#include "util/Mth.h"
|
||||||
|
#include "util/StringUtils.h"
|
||||||
#include "world/item/ItemInstance.h"
|
#include "world/item/ItemInstance.h"
|
||||||
#include "world/level/storage/LevelStorage.h"
|
#include "world/level/storage/LevelStorage.h"
|
||||||
#include "world/phys/Vec3.h"
|
#include "world/phys/Vec3.h"
|
||||||
@@ -154,7 +156,18 @@ void ServerSideNetworkHandler::displayGameMessage(const std::string& message)
|
|||||||
|
|
||||||
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet)
|
||||||
{
|
{
|
||||||
displayGameMessage(packet->message);
|
auto player = getPlayer(source);
|
||||||
|
|
||||||
|
if (player == nullptr) return; // TODO maybe kick?
|
||||||
|
|
||||||
|
if (packet->message[0] == '/') {
|
||||||
|
// This is a command
|
||||||
|
|
||||||
|
ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, Util::stringTrim(packet->message.substr(1))));
|
||||||
|
return sendPrivate(resp, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
displayGameMessage("<" + player->name + "> " + packet->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid)
|
void ServerSideNetworkHandler::onNewClient(const RakNet::RakNetGUID& clientGuid)
|
||||||
@@ -1020,3 +1033,9 @@ Player* ServerSideNetworkHandler::getPlayer( const RakNet::RakNetGUID& source )
|
|||||||
if (source == level->players[i]->owner) return level->players[i];
|
if (source == level->players[i]->owner) return level->players[i];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ServerSideNetworkHandler::sendPrivate(Packet& packet, const RakNet::RakNetGUID& source) {
|
||||||
|
RakNet::BitStream bitStream;
|
||||||
|
packet.write(&bitStream);
|
||||||
|
rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false);
|
||||||
|
}
|
||||||
@@ -71,6 +71,12 @@ private:
|
|||||||
* @brief Send packet to all players
|
* @brief Send packet to all players
|
||||||
*/
|
*/
|
||||||
void redistributePacket(Packet* packet, const RakNet::RakNetGUID& fromPlayer);
|
void redistributePacket(Packet* packet, const RakNet::RakNetGUID& fromPlayer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send packer private with GUID
|
||||||
|
*/
|
||||||
|
void sendPrivate(Packet& packet, const RakNet::RakNetGUID& source);
|
||||||
|
|
||||||
Player* getPlayer(const RakNet::RakNetGUID& source);
|
Player* getPlayer(const RakNet::RakNetGUID& source);
|
||||||
|
|
||||||
Minecraft* minecraft;
|
Minecraft* minecraft;
|
||||||
|
|||||||
Reference in New Issue
Block a user