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); return minecraft->setScreen(NULL);
} }
if (_input[0] == '/') { if (minecraft->netCallback && !minecraft->raknetInstance->isServer()) {
// Command minecraft->raknetInstance->send(MessagePacket(_input.c_str()));
} else if (_input[0] == '/') {
_input = Util::stringTrim(_input.substr(1)); _input = Util::stringTrim(_input.substr(1));
std::istringstream iss(minecraft->commandManager().execute(*minecraft, *minecraft->player, _input)); std::istringstream iss(
for (std::string line; std::getline(iss, line); ) { minecraft->commandManager().execute(*minecraft, *minecraft->player, _input)
);
for (std::string line; std::getline(iss, line);) {
minecraft->gui.addMessage(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); minecraft->setScreen(NULL);

View File

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

View File

@@ -36,7 +36,6 @@ std::vector<std::string> CommandManager::getListAllCommands() {
} }
std::string CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) { std::string CommandManager::execute(Minecraft& mc, Player& player, const std::string& input) {
if (!mc.level->isClientSide) {
std::istringstream ss(input); std::istringstream ss(input);
std::string cmd; std::string cmd;
@@ -56,12 +55,6 @@ std::string CommandManager::execute(Minecraft& mc, Player& player, const std::st
while (ss >> tok) args.push_back(tok); while (ss >> tok) args.push_back(tok);
return (*it)->execute(mc, player, args); return (*it)->execute(mc, player, args);
} else {
ChatPacket packet("/" + input);
mc.raknetInstance->send(packet);
}
return std::string();
} }
Command* CommandManager::getCommand(const std::string& name) { Command* CommandManager::getCommand(const std::string& name) {

View File

@@ -190,13 +190,13 @@ int main(int numArguments, char* pszArgs[]) {
while (std::getline(banned, line)) { while (std::getline(banned, line)) {
if (!line.empty()) { if (!line.empty()) {
((MAIN_CLASS*)g_app)->level->bannedPpl.insert(line); ((MAIN_CLASS*)g_app)->level->bannedPlayers.insert(line);
} }
} }
} else { } 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."); 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"); std::ofstream bannedWrite("banned-players.txt");
if (bannedWrite.is_open()) { 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 << banned << std::endl;
} }
bannedWrite.close(); bannedWrite.close();

View File

@@ -200,7 +200,7 @@ void RakNetInstance::runEvents(NetEventCallback* callback)
case ID_DISCONNECTION_NOTIFICATION: case ID_DISCONNECTION_NOTIFICATION:
case ID_CONNECTION_LOST: case ID_CONNECTION_LOST:
callback->onDisconnect(currentEvent->guid); callback->onDisconnect(currentEvent->guid);
break; return;
case ID_UNCONNECTED_PONG: case ID_UNCONNECTED_PONG:
{ {
RakNet::TimeMS time; 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) { if (nicknameLower == banned) {
loginStatus = packet->newProto ? LoginStatus::Failed_Banned : LoginStatus::Failed_ClientOld; loginStatus = packet->newProto ? LoginStatus::Failed_Banned : LoginStatus::Failed_ClientOld;
break; break;

View File

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