FIX: commands and multiplayer crashes

This commit is contained in:
2026-07-27 17:55:40 +03:00
parent 1f252ac4b3
commit 61ff4835ea
7 changed files with 38 additions and 44 deletions

View File

@@ -63,24 +63,25 @@ void ConsoleScreen::execute()
return minecraft->setScreen(NULL);
}
if (_input[0] == '/') {
// Command
if (minecraft->netCallback && !minecraft->raknetInstance->isServer()) {
minecraft->raknetInstance->send(MessagePacket(_input.c_str()));
} else if (_input[0] == '/') {
_input = Util::stringTrim(_input.substr(1));
std::istringstream iss(minecraft->commandManager().execute(*minecraft, *minecraft->player, _input));
for (std::string line; std::getline(iss, line); ) {
std::istringstream iss(
minecraft->commandManager().execute(*minecraft, *minecraft->player, _input)
);
for (std::string line; std::getline(iss, line);) {
minecraft->gui.addMessage(line);
}
} else {
// @ai @rewrite
if (minecraft->netCallback && minecraft->raknetInstance->isServer()) {
static_cast<ServerSideNetworkHandler*>(minecraft->netCallback)->displayGameMessage(_input);
} else if (minecraft->netCallback) {
MessagePacket chatPkt(_input.c_str());
minecraft->raknetInstance->send(chatPkt);
} else {
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
}
else {
if (minecraft->raknetInstance->isServer()) {
minecraft->raknetInstance->send(MessagePacket(_input.c_str()));
}
minecraft->gui.addMessage("<" + minecraft->player->name + "> " + _input);
}
minecraft->setScreen(NULL);

View File

@@ -36,14 +36,14 @@ std::string CommandBan::execute(Minecraft& mc, Player& player, const std::vector
(*it)->remove();
mc.raknetInstance->getPeer()->CloseConnection((*it)->owner, true);
} else {
for (auto& banned : mc.level->bannedPpl) {
for (auto& banned : mc.level->bannedPlayers) {
if (nicknameLower == banned) {
return args[0] + "already banned!";
}
}
}
mc.level->bannedPpl.insert(nicknameLower);
mc.level->bannedPlayers.insert(nicknameLower);
return "ban: successfully banned player " + args[0];
}

View File

@@ -36,32 +36,25 @@ std::vector<std::string> CommandManager::getListAllCommands() {
}
std::string CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) {
if (!mc.level->isClientSide) {
std::istringstream ss(input);
std::string cmd;
std::istringstream ss(input);
std::string cmd;
ss >> cmd;
ss >> cmd;
auto it = std::find_if(m_commands.begin(), m_commands.end(), [cmd](auto& it) -> bool {
return it->getName() == cmd;
});
auto it = std::find_if(m_commands.begin(), m_commands.end(), [cmd](auto& it) -> bool {
return it->getName() == cmd;
});
if (it == m_commands.end()) {
return "Command /" + cmd + " not found";
}
std::vector<std::string> args;
std::string tok;
while (ss >> tok) args.push_back(tok);
return (*it)->execute(mc, player, args);
} else {
ChatPacket packet("/" + input);
mc.raknetInstance->send(packet);
if (it == m_commands.end()) {
return "Command /" + cmd + " not found";
}
return std::string();
std::vector<std::string> args;
std::string tok;
while (ss >> tok) args.push_back(tok);
return (*it)->execute(mc, player, args);
}
Command* CommandManager::getCommand(const std::string& name) {

View File

@@ -190,13 +190,13 @@ int main(int numArguments, char* pszArgs[]) {
while (std::getline(banned, line)) {
if (!line.empty()) {
((MAIN_CLASS*)g_app)->level->bannedPpl.insert(line);
((MAIN_CLASS*)g_app)->level->bannedPlayers.insert(line);
}
}
} else {
std::ofstream bannedPpl("banned-players.txt");
std::ofstream bannedPlayers("banned-players.txt");
if (!bannedPpl.is_open()) {
if (!bannedPlayers.is_open()) {
throw std::runtime_error("Cannot create banned players list.");
}
}
@@ -225,7 +225,7 @@ int main(int numArguments, char* pszArgs[]) {
std::ofstream bannedWrite("banned-players.txt");
if (bannedWrite.is_open()) {
for (auto& banned : ((MAIN_CLASS*)g_app)->level->bannedPpl) {
for (auto& banned : ((MAIN_CLASS*)g_app)->level->bannedPlayers) {
bannedWrite << banned << std::endl;
}
bannedWrite.close();

View File

@@ -200,7 +200,7 @@ void RakNetInstance::runEvents(NetEventCallback* callback)
case ID_DISCONNECTION_NOTIFICATION:
case ID_CONNECTION_LOST:
callback->onDisconnect(currentEvent->guid);
break;
return;
case ID_UNCONNECTED_PONG:
{
RakNet::TimeMS time;

View File

@@ -257,7 +257,7 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac
}
}
for (auto& banned : level->bannedPpl) {
for (auto& banned : level->bannedPlayers) {
if (nicknameLower == banned) {
loginStatus = packet->newProto ? LoginStatus::Failed_Banned : LoginStatus::Failed_ClientOld;
break;

View File

@@ -312,7 +312,7 @@ public:
Random random;
std::set<std::string> ops;
std::set<std::string> bannedPpl;
std::set<std::string> bannedPlayers;
protected:
bool isFindingSpawn;