diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp index 8848ed16..837418ab 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -42,6 +42,7 @@ #include "..\Minecraft.Server\Common\StringUtils.h" #include "..\Minecraft.Server\ServerLogger.h" #include "..\Minecraft.Server\ServerLogManager.h" +#include "..\Minecraft.Server\ServerProperties.h" extern bool g_Win64DedicatedServer; #endif @@ -1758,23 +1759,31 @@ void PlayerList::banPlayerForHardcoreDeath(ServerPlayer *player) } // Ban the player's IP address (uses same access path as CliCommandBanIp) - if (player->connection != nullptr && player->connection->connection != nullptr && player->connection->connection->getSocket() != nullptr) + auto serverConfig = ServerRuntime::LoadServerPropertiesConfig(); + if (serverConfig.hardcoreBanIp) { - const unsigned char smallId = player->connection->connection->getSocket()->getSmallId(); - std::string ip; - if (smallId != 0 && ServerRuntime::ServerLogManager::TryGetConnectionRemoteIp(smallId, &ip)) + if (player->connection != nullptr && player->connection->connection != nullptr && player->connection->connection->getSocket() != nullptr) { - ServerRuntime::Access::AddIpBan(ip, metadata); - ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID + IP %s) for dying in hardcore mode.", playerName.c_str(), ip.c_str()); + const unsigned char smallId = player->connection->connection->getSocket()->getSmallId(); + std::string ip; + if (smallId != 0 && ServerRuntime::ServerLogManager::TryGetConnectionRemoteIp(smallId, &ip)) + { + ServerRuntime::Access::AddIpBan(ip, metadata); + ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID + IP %s) for dying in hardcore mode.", playerName.c_str(), ip.c_str()); + } + else + { + ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID only, IP not available) for dying in hardcore mode.", playerName.c_str()); + } } else { - ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID only, IP not available) for dying in hardcore mode.", playerName.c_str()); + ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID only, no connection) for dying in hardcore mode.", playerName.c_str()); } } else { - ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID only, no connection) for dying in hardcore mode.", playerName.c_str()); + ServerRuntime::LogInfof("Hardcore", "Player %s banned (XUID only, IP ban disabled) for dying in hardcore mode.", playerName.c_str()); } // Send ban reason then defer the actual close to the next tick, because this diff --git a/Minecraft.Server/ServerProperties.cpp b/Minecraft.Server/ServerProperties.cpp index 2b70f475..65c72191 100644 --- a/Minecraft.Server/ServerProperties.cpp +++ b/Minecraft.Server/ServerProperties.cpp @@ -55,6 +55,7 @@ static const ServerPropertyDefault kServerPropertyDefaults[] = { "gamertags", "true" }, { "generate-structures", "true" }, { "hardcore", "false" }, + { "hardcore-ban-ip", "true" }, { "host-can-be-invisible", "true" }, { "host-can-change-hunger", "true" }, { "host-can-fly", "true" }, @@ -863,6 +864,7 @@ ServerPropertiesConfig LoadServerPropertiesConfig() config.naturalRegeneration = ReadNormalizedBoolProperty(&merged, "natural-regeneration", true, &shouldWrite); config.doDaylightCycle = ReadNormalizedBoolProperty(&merged, "do-daylight-cycle", true, &shouldWrite); config.hardcore = ReadNormalizedBoolProperty(&merged, "hardcore", false, &shouldWrite); + config.hardcoreBanIp = ReadNormalizedBoolProperty(&merged, "hardcore-ban-ip", true, &shouldWrite); config.maxBuildHeight = ReadNormalizedIntProperty(&merged, "max-build-height", 256, 64, 256, &shouldWrite); config.motd = ReadNormalizedStringProperty(&merged, "motd", "A Minecraft Server", 255, &shouldWrite); diff --git a/Minecraft.Server/ServerProperties.h b/Minecraft.Server/ServerProperties.h index 1e303399..6592cda4 100644 --- a/Minecraft.Server/ServerProperties.h +++ b/Minecraft.Server/ServerProperties.h @@ -74,6 +74,8 @@ namespace ServerRuntime bool naturalRegeneration; bool doDaylightCycle; bool hardcore; + /** `hardcore-ban-ip` — whether hardcore death bans include IP bans */ + bool hardcoreBanIp; /** other MinecraftServer runtime settings */ int maxBuildHeight;