From 881c1188a148f5efbdd61d656efa2c35dc80ca46 Mon Sep 17 00:00:00 2001 From: InviseDivine Date: Mon, 27 Jul 2026 00:12:58 +0200 Subject: [PATCH] lol --- src/client/Minecraft.cpp | 4 -- src/commands/CommandBan.cpp | 14 +++--- src/commands/CommandBanIp.cpp | 58 ++++++++++++++++++++++++ src/commands/CommandBanIp.hpp | 9 ++++ src/commands/CommandManager.cpp | 2 + src/main_dedicated.cpp | 30 ++++++++++++ src/network/ServerSideNetworkHandler.cpp | 41 ++++++++++++++++- src/network/ServerSideNetworkHandler.h | 1 + src/plugins/LuaPlayer.hpp | 21 +++++++++ src/plugins/PluginsManager.cpp | 6 +-- src/world/item/TileItem.h | 4 +- src/world/level/Level.h | 1 + 12 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 src/commands/CommandBanIp.cpp create mode 100644 src/commands/CommandBanIp.hpp diff --git a/src/client/Minecraft.cpp b/src/client/Minecraft.cpp index 91f3d5d..5a236f7 100755 --- a/src/client/Minecraft.cpp +++ b/src/client/Minecraft.cpp @@ -287,11 +287,7 @@ void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, Loc } } this->level = level; - // So uhhh - std::string op = options.getStringValue(OPTIONS_USERNAME); - std::transform(op.begin(), op.end(), op.begin(), ::tolower); - level->ops.emplace(op); _hasSignaledGeneratingLevelFinished = false; #ifdef STANDALONE_SERVER const bool threadedLevelCreation = false; diff --git a/src/commands/CommandBan.cpp b/src/commands/CommandBan.cpp index 0373d5b..b9595c0 100644 --- a/src/commands/CommandBan.cpp +++ b/src/commands/CommandBan.cpp @@ -20,7 +20,7 @@ std::string CommandBan::execute(Minecraft& mc, Player& player, const std::vector std::string nicknameLower = args[0]; std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower); - auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [args, nicknameLower] (auto& it) -> bool { + auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [nicknameLower] (auto& it) -> bool { std::string lower = it->name; std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); @@ -30,15 +30,17 @@ std::string CommandBan::execute(Minecraft& mc, Player& player, const std::vector if (*it == (Player*)mc.player) { return "ban: you can't ban urself lol"; } - + + auto sourceId = (*it)->owner; + if (it != mc.level->players.end()) { - mc.level->removePlayer(*it); - (*it)->remove(); - mc.raknetInstance->getPeer()->CloseConnection((*it)->owner, true); + (*it)->reallyRemoveIfPlayer = true; + mc.level->removeEntity((*it)); + mc.raknetInstance->getPeer()->CloseConnection(sourceId, true); } else { for (auto& banned : mc.level->bannedPpl) { if (nicknameLower == banned) { - return args[0] + "already banned!"; + return args[0] + " already banned!"; } } } diff --git a/src/commands/CommandBanIp.cpp b/src/commands/CommandBanIp.cpp new file mode 100644 index 0000000..2374903 --- /dev/null +++ b/src/commands/CommandBanIp.cpp @@ -0,0 +1,58 @@ +#include "CommandBanIp.hpp" +#include "commands/Command.hpp" +#include "network/RakNetInstance.h" +#include "raknet/RakPeerInterface.h" +#include "world/level/Level.h" +#include +#include + +CommandBanIp::CommandBanIp() : Command("banip") {} + +std::string CommandBanIp::execute(Minecraft& mc, Player& player, const std::vector& args) { + if (!isPlayerOp(mc, player)) { + return "You aren't enough priveleged to run this command"; + } + + if (args.empty()) { + return help(mc); + } + + std::string nicknameLower = args[0]; + std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower); + + auto it = std::find_if(mc.level->players.begin(), mc.level->players.end(), [nicknameLower] (auto& it) -> bool { + std::string lower = it->name; + std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); + + return lower == nicknameLower; + }); + + if (*it == (Player*)mc.player) { + return "banip: you can't ban urself lol"; + } + + RakNet::SystemAddress sysAddress = mc.raknetInstance->getPeer()->GetSystemAddressFromGuid((*it)->owner); + + char clientIp[32]; + sysAddress.ToString(false, clientIp); + auto sourceId = (*it)->owner; + + if (it != mc.level->players.end()) { + (*it)->reallyRemoveIfPlayer = true; + mc.level->removeEntity((*it)); + mc.raknetInstance->getPeer()->CloseConnection(sourceId, true); + } else { + for (auto& banned : mc.level->bannedIps) { + if (clientIp == banned) { + return args[0] + " already banned!"; + } + } + } + + mc.level->bannedIps.insert(clientIp); + return "banip: successfully banned player by ip " + args[0]; +} + +std::string CommandBanIp::help(Minecraft& mc) { + return "Usage: /banip "; +} \ No newline at end of file diff --git a/src/commands/CommandBanIp.hpp b/src/commands/CommandBanIp.hpp new file mode 100644 index 0000000..2115357 --- /dev/null +++ b/src/commands/CommandBanIp.hpp @@ -0,0 +1,9 @@ +#include "Command.hpp" + +class CommandBanIp : public Command { +public: + CommandBanIp(); + + std::string execute(Minecraft& mc, Player& player, const std::vector& args); + std::string help(Minecraft& mc); +}; \ No newline at end of file diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index fbb9324..549204c 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -8,6 +8,7 @@ #include "commands/CommandKick.hpp" #include "commands/CommandOp.hpp" #include "commands/CommandBan.hpp" +#include "commands/CommandBanIp.hpp" #include "network/packet/ChatPacket.h" #include "network/RakNetInstance.h" #include "world/level/Level.h" @@ -21,6 +22,7 @@ void CommandManager::registerAllCommands() { m_commands.push_back(new CommandKick()); m_commands.push_back(new CommandOp()); m_commands.push_back(new CommandBan()); + m_commands.push_back(new CommandBanIp()); } std::vector CommandManager::getListAllCommands() { diff --git a/src/main_dedicated.cpp b/src/main_dedicated.cpp index fc135b1..deab4e7 100755 --- a/src/main_dedicated.cpp +++ b/src/main_dedicated.cpp @@ -202,6 +202,24 @@ int main(int numArguments, char* pszArgs[]) { } } + std::ifstream bannedIps("banned-ips.txt"); + + if (bannedIps.is_open()) { + std::string line; + + while (std::getline(bannedIps, line)) { + if (!line.empty()) { + ((MAIN_CLASS*)g_app)->level->bannedIps.insert(line); + } + } + } else { + std::ofstream bannedIp("banned-ips.txt"); + + if (!bannedIp.is_open()) { + throw std::runtime_error("Cannot create banned players list."); + } + } + std::cout << "Level has been generated in " << getTimeS() - startTime << std::endl; ((MAIN_CLASS*)g_app)->level->saveLevelData(); std::cout << "Level has been saved!" << std::endl; @@ -234,6 +252,18 @@ int main(int numArguments, char* pszArgs[]) { } else { throw std::runtime_error("Cannot open banned players list."); } + + std::ofstream bannedIpsWrite("banned-ips.txt"); + + if (bannedIpsWrite.is_open()) { + for (auto& banned : ((MAIN_CLASS*)g_app)->level->bannedIps) { + bannedIpsWrite << banned << std::endl; + } + bannedIpsWrite.close(); + } else { + throw std::runtime_error("Cannot open banned players list."); + } + PluginsManager::get().emit("ServerShutdown"); ((MAIN_CLASS*)g_app)->level->saveLevelData(); diff --git a/src/network/ServerSideNetworkHandler.cpp b/src/network/ServerSideNetworkHandler.cpp index 9c3c239..5fbc932 100755 --- a/src/network/ServerSideNetworkHandler.cpp +++ b/src/network/ServerSideNetworkHandler.cpp @@ -156,6 +156,30 @@ void ServerSideNetworkHandler::displayGameMessage(const std::string& message) raknetInstance->send(packet); } +void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, MessagePacket* packet) +{ + auto player = getPlayer(source); + + if (player == nullptr) return; // @todo maybe kick? + + auto msg = std::string(packet->message.C_String()); + + if (packet->message[0] == '/') { + // This is a command + auto cmd = Util::stringTrim(msg); + + if (PluginsManager::get().emitCommands(msg, source)) { + ChatPacket resp(minecraft->commandManager().execute(*minecraft, *player, msg)); + return sendPrivate(resp, source); + } else { + return; + } + } + + displayGameMessage("<" + player->name + "> " + msg); + PluginsManager::get().emit("Message", LuaPlayer(source), packet->message); +} + void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, ChatPacket* packet) { auto player = getPlayer(source); @@ -195,12 +219,12 @@ void ServerSideNetworkHandler::onDisconnect(const RakNet::RakNetGUID& guid) if (player->owner == guid) { + PluginsManager::get().emit("PlayerDisconnect", LuaPlayer(guid)); minecraft->level->getLevelStorage()->savePlayer(*player); std::string message = player->name; message += " disconnected from the game"; displayGameMessage(message); - PluginsManager::get().emit("PlayerDisconnect", LuaPlayer(guid)); //RemoveEntityPacket packet(player->entityId); //raknetInstance->send(packet); @@ -234,6 +258,10 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac std::string nicknameLower = packet->clientName.C_String(); std::transform(nicknameLower.begin(), nicknameLower.end(), nicknameLower.begin(), ::tolower); + RakNet::SystemAddress sysAddress = rakPeer->GetSystemAddressFromGuid(source); + char clientIp[32]; + sysAddress.ToString(false, clientIp); + for (int i = 0; i < level->players.size(); i++) { ServerPlayer* player = (ServerPlayer*) level->players.at(i); @@ -254,6 +282,13 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, LoginPac } } + for (auto& banned : level->bannedIps) { + if (clientIp == banned) { + loginStatus = packet->newProto ? LoginStatus::Failed_Banned : LoginStatus::Failed_ClientOld; + break; + } + } + RakNet::BitStream bitStream; LoginStatusPacket(loginStatus).write(&bitStream); rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, false); @@ -412,7 +447,7 @@ void ServerSideNetworkHandler::onReady_ClientGeneration(const RakNet::RakNetGUID bitStream.Reset(); AddPlayerPacket(newPlayer).write(&bitStream); rakPeer->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, 0, source, true); - + PluginsManager::get().emit("PlayerJoin", LuaPlayer(source)); } @@ -511,6 +546,8 @@ void ServerSideNetworkHandler::handle(const RakNet::RakNetGUID& source, RemoveBl oldTile->destroy(level, x, y, z, data); + // RemoveEntityPacket packet(e->entityId); + // redistributePacket(&packet, rakPeer->GetMyGUID()); } LOGI("Remove block [%i, %i, %i]\n", packet->x, packet->y, packet->z); diff --git a/src/network/ServerSideNetworkHandler.h b/src/network/ServerSideNetworkHandler.h index 5955e0b..a23cb13 100755 --- a/src/network/ServerSideNetworkHandler.h +++ b/src/network/ServerSideNetworkHandler.h @@ -58,6 +58,7 @@ public: virtual void handle(const RakNet::RakNetGUID& source, ContainerClosePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, SignUpdatePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, ChatPacket* packet); + virtual void handle(const RakNet::RakNetGUID& source, MessagePacket* packet); virtual void handle(const RakNet::RakNetGUID& source, WantCreatePacket* packet); bool allowsIncomingConnections() { return _allowIncoming; } diff --git a/src/plugins/LuaPlayer.hpp b/src/plugins/LuaPlayer.hpp index 0234854..711b70b 100644 --- a/src/plugins/LuaPlayer.hpp +++ b/src/plugins/LuaPlayer.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -133,6 +134,26 @@ public: return inv; } + + int getHp() { + auto plr = getPlayer(); + if (plr == nullptr) return -1; + + return plr->health; + } + + void setHp(int hp) { + auto plr = getPlayer(); + if (plr == nullptr) return; + + plr->health = hp; + + auto mc = PluginsManager::get().getMinecraft(); + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) mc->netCallback; + + SetHealthPacket hpPacket(plr->health); + ss->sendPrivate(hpPacket, m_source); + } private: const RakNet::RakNetGUID m_source; }; \ No newline at end of file diff --git a/src/plugins/PluginsManager.cpp b/src/plugins/PluginsManager.cpp index cdb1c7e..a129f88 100644 --- a/src/plugins/PluginsManager.cpp +++ b/src/plugins/PluginsManager.cpp @@ -25,8 +25,6 @@ int PluginsManager::emitCommands(std::string command, const RakNet::RakNetGUID& i++; } - std::cout << cmd << " " << " ff" << std::endl; - auto it = m_luaCommands.find(cmd); if (it == m_luaCommands.end()) return 1; @@ -76,7 +74,9 @@ void PluginsManager::registerTypes() { "getInventory", &LuaPlayer::getInventory, "addItem", &LuaPlayer::addItem, "getItem", &LuaPlayer::getItem, - "clearInventory", &LuaPlayer::clearInventory + "clearInventory", &LuaPlayer::clearInventory, + "getHp", &LuaPlayer::getHp, + "setHp", &LuaPlayer::setHp ); m_lua["Server"] = &m_srv; diff --git a/src/world/item/TileItem.h b/src/world/item/TileItem.h index 08bd1d0..dc46029 100755 --- a/src/world/item/TileItem.h +++ b/src/world/item/TileItem.h @@ -4,6 +4,8 @@ //package net.minecraft.world.item; #include +#include +#include #include "Item.h" #include "ItemInstance.h" @@ -61,7 +63,7 @@ public: if (level->setTileAndData(x, y, z, tileId, data)) { Tile::tiles[tileId]->setPlacedBy(level, x, y, z, player); level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getStepSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); - printf("%f %f %f \n", player->x, player->y, player->z); + PluginsManager::get().emit("PlayerPlaceBlock", LuaPlayer(player->owner), x, y, z, face, tileId, instance->getAuxValue()); /* PlaceBlockPacket packet(player->entityId, x, y, z, face, tileId, instance->getAuxValue()); //LOGI("Place block at @ %d, %d, %d\n", x, y, z); diff --git a/src/world/level/Level.h b/src/world/level/Level.h index 17c1d48..254dce6 100755 --- a/src/world/level/Level.h +++ b/src/world/level/Level.h @@ -313,6 +313,7 @@ public: std::set ops; std::set bannedPpl; + std::set bannedIps; protected: bool isFindingSpawn;