From e8b39d430a77c2e53656b4c7bc2ed4b4a2b48a00 Mon Sep 17 00:00:00 2001 From: md_5 Date: Tue, 25 Jun 2019 21:02:13 +1000 Subject: [PATCH] SPIGOT-5103: World.save does not save gamerules --- nms-patches/MinecraftServer.patch | 56 +++++++++++++++---------------- nms-patches/WorldServer.patch | 43 +++++++++++++++++------- 2 files changed, 58 insertions(+), 41 deletions(-) diff --git a/nms-patches/MinecraftServer.patch b/nms-patches/MinecraftServer.patch index 9c5f37fc11..848b6729cf 100644 --- a/nms-patches/MinecraftServer.patch +++ b/nms-patches/MinecraftServer.patch @@ -263,17 +263,17 @@ + this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); + this.server.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.STARTUP)); + // CraftBukkit end -+ -+ } -+ -+ // CraftBukkit start -+ public void initWorld(WorldServer worldserver1, WorldData worlddata, WorldSettings worldsettings) { -+ worldserver1.getWorldBorder().b(worlddata); - this.worldServer.put(DimensionManager.OVERWORLD, worldserver); - this.initializeScoreboards(worldserver.getWorldPersistentData()); - worldserver.getWorldBorder().b(worlddata); - WorldServer worldserver1 = this.getWorldServer(DimensionManager.OVERWORLD); ++ } ++ ++ // CraftBukkit start ++ public void initWorld(WorldServer worldserver1, WorldData worlddata, WorldSettings worldsettings) { ++ worldserver1.getWorldBorder().b(worlddata); ++ + // CraftBukkit start + if (worldserver1.generator != null) { + worldserver1.getWorld().getPopulators().addAll(worldserver1.generator.getDefaultPopulators(worldserver1.getWorld())); @@ -405,24 +405,24 @@ } protected void a(String s, WorldNBTStorage worldnbtstorage) { -@@ -449,14 +627,14 @@ - } catch (ExceptionWorldConflict exceptionworldconflict) { - MinecraftServer.LOGGER.warn(exceptionworldconflict.getMessage()); +@@ -451,12 +629,16 @@ } -- } + } -- WorldServer worldserver1 = this.getWorldServer(DimensionManager.OVERWORLD); -+ WorldServer worldserver1 = worldserver; // CraftBukkit ++ // CraftBukkit start - moved to WorldServer.save ++ /* + WorldServer worldserver1 = this.getWorldServer(DimensionManager.OVERWORLD); WorldData worlddata = worldserver1.getWorldData(); worldserver1.getWorldBorder().a(worlddata); worlddata.c(this.getBossBattleCustomData().c()); worldserver1.getDataManager().saveWorldData(worlddata, this.getPlayerList().r()); -+ } // CraftBukkit - moved down ++ */ ++ // CraftBukkit end return flag3; } -@@ -465,8 +643,29 @@ +@@ -465,8 +647,29 @@ this.stop(); } @@ -452,7 +452,7 @@ if (this.getServerConnection() != null) { this.getServerConnection().b(); } -@@ -475,6 +674,7 @@ +@@ -475,6 +678,7 @@ MinecraftServer.LOGGER.info("Saving players"); this.playerList.savePlayers(); this.playerList.shutdown(); @@ -460,7 +460,7 @@ } MinecraftServer.LOGGER.info("Saving worlds"); -@@ -544,14 +744,16 @@ +@@ -544,14 +748,16 @@ while (this.isRunning) { long i = SystemUtils.getMonotonicMillis() - this.nextTick; @@ -478,7 +478,7 @@ this.nextTick += 50L; if (this.S) { this.S = false; -@@ -598,6 +800,12 @@ +@@ -598,6 +804,12 @@ } catch (Throwable throwable1) { MinecraftServer.LOGGER.error("Exception stopping the server", throwable1); } finally { @@ -491,7 +491,7 @@ this.exit(); } -@@ -606,8 +814,15 @@ +@@ -606,8 +818,15 @@ } private boolean canSleepForTick() { @@ -508,7 +508,7 @@ protected void sleepForTick() { this.executeAll(); -@@ -708,7 +923,7 @@ +@@ -708,7 +927,7 @@ this.serverPing.b().a(agameprofile); } @@ -517,7 +517,7 @@ MinecraftServer.LOGGER.debug("Autosave started"); this.methodProfiler.enter("save"); this.playerList.savePlayers(); -@@ -738,23 +953,40 @@ +@@ -738,23 +957,40 @@ } protected void b(BooleanSupplier booleansupplier) { @@ -559,7 +559,7 @@ this.methodProfiler.enter("tick"); -@@ -793,7 +1025,8 @@ +@@ -793,7 +1029,8 @@ this.tickables.add(runnable); } @@ -569,7 +569,7 @@ OptionParser optionparser = new OptionParser(); OptionSpec optionspec = optionparser.accepts("nogui"); OptionSpec optionspec1 = optionparser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits"); -@@ -816,15 +1049,17 @@ +@@ -816,15 +1053,17 @@ optionparser.printHelpOn(System.err); return; } @@ -589,7 +589,7 @@ MinecraftServer.LOGGER.info("Initialized '" + java_nio_file_path.toAbsolutePath().toString() + "' and '" + java_nio_file_path1.toAbsolutePath().toString() + "'"); return; } -@@ -836,14 +1071,15 @@ +@@ -836,14 +1075,15 @@ DispenserRegistry.init(); DispenserRegistry.c(); @@ -608,7 +608,7 @@ dedicatedserver.i((String) optionset.valueOf(optionspec7)); dedicatedserver.setPort((Integer) optionset.valueOf(optionspec10)); dedicatedserver.e(optionset.has(optionspec2)); -@@ -866,6 +1102,29 @@ +@@ -866,6 +1106,29 @@ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(MinecraftServer.LOGGER)); Runtime.getRuntime().addShutdownHook(thread); @@ -638,7 +638,7 @@ } catch (Exception exception) { MinecraftServer.LOGGER.fatal("Failed to start the minecraft server", exception); } -@@ -885,7 +1144,9 @@ +@@ -885,7 +1148,9 @@ } public void startServerThread() { @@ -648,7 +648,7 @@ } public File d(String s) { -@@ -940,7 +1201,7 @@ +@@ -940,7 +1205,7 @@ } public String getServerModName() { @@ -657,7 +657,7 @@ } public CrashReport b(CrashReport crashreport) { -@@ -979,7 +1240,7 @@ +@@ -979,7 +1244,7 @@ } public boolean E() { @@ -666,7 +666,7 @@ } @Override -@@ -1482,4 +1743,16 @@ +@@ -1482,4 +1747,16 @@ } public abstract boolean b(GameProfile gameprofile); diff --git a/nms-patches/WorldServer.patch b/nms-patches/WorldServer.patch index 1479577f6d..f0d1380f75 100644 --- a/nms-patches/WorldServer.patch +++ b/nms-patches/WorldServer.patch @@ -249,7 +249,24 @@ if (iprogressupdate != null) { iprogressupdate.a(new ChatMessage("menu.savingLevel", new Object[0])); } -@@ -715,8 +801,16 @@ +@@ -648,6 +734,16 @@ + + chunkproviderserver.save(flag); + } ++ ++ // CraftBukkit start - moved from MinecraftServer.saveChunks ++ // PAIL - rename ++ WorldServer worldserver1 = this; ++ WorldData worlddata = worldserver1.getWorldData(); ++ ++ worldserver1.getWorldBorder().a(worlddata); ++ worlddata.c(this.server.getBossBattleCustomData().c()); ++ worldserver1.getDataManager().saveWorldData(worlddata, this.server.getPlayerList().r()); ++ // CraftBukkit end + } + + protected void k_() throws ExceptionWorldConflict { +@@ -715,8 +811,16 @@ while (objectiterator.hasNext()) { Entity entity = (Entity) objectiterator.next(); @@ -267,7 +284,7 @@ EnumCreatureType enumcreaturetype = entity.getEntityType().d(); if (enumcreaturetype != EnumCreatureType.MISC && this.getChunkProvider().b(entity)) { -@@ -730,11 +824,24 @@ +@@ -730,11 +834,24 @@ @Override public boolean addEntity(Entity entity) { @@ -294,7 +311,7 @@ } public void addEntityTeleport(Entity entity) { -@@ -784,13 +891,18 @@ +@@ -784,13 +901,18 @@ this.registerEntity(entityplayer); } @@ -315,7 +332,7 @@ IChunkAccess ichunkaccess = this.getChunkAt(MathHelper.floor(entity.locX / 16.0D), MathHelper.floor(entity.locZ / 16.0D), ChunkStatus.FULL, entity.attachedToPlayer); if (!(ichunkaccess instanceof Chunk)) { -@@ -818,7 +930,7 @@ +@@ -818,7 +940,7 @@ if (entity1 == null) { return false; } else { @@ -324,7 +341,7 @@ return true; } } -@@ -873,6 +985,7 @@ +@@ -873,6 +995,7 @@ this.I.remove(((EntityInsentient) entity).getNavigation()); } @@ -332,7 +349,7 @@ } private void registerEntity(Entity entity) { -@@ -896,6 +1009,7 @@ +@@ -896,6 +1019,7 @@ if (entity instanceof EntityInsentient) { this.I.add(((EntityInsentient) entity).getNavigation()); } @@ -340,7 +357,7 @@ } } -@@ -926,6 +1040,18 @@ +@@ -926,6 +1050,18 @@ } public void strikeLightning(EntityLightning entitylightning) { @@ -359,7 +376,7 @@ this.globalEntityList.add(entitylightning); this.server.getPlayerList().sendPacketNearby((EntityHuman) null, entitylightning.locX, entitylightning.locY, entitylightning.locZ, 512.0D, this.worldProvider.getDimensionManager(), new PacketPlayOutSpawnEntityWeather(entitylightning)); } -@@ -934,6 +1060,12 @@ +@@ -934,6 +1070,12 @@ public void a(int i, BlockPosition blockposition, int j) { Iterator iterator = this.server.getPlayerList().getPlayers().iterator(); @@ -372,7 +389,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -@@ -942,6 +1074,12 @@ +@@ -942,6 +1084,12 @@ double d1 = (double) blockposition.getY() - entityplayer.locY; double d2 = (double) blockposition.getZ() - entityplayer.locZ; @@ -385,7 +402,7 @@ if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); } -@@ -1002,6 +1140,14 @@ +@@ -1002,6 +1150,14 @@ @Override public Explosion createExplosion(@Nullable Entity entity, DamageSource damagesource, double d0, double d1, double d2, float f, boolean flag, Explosion.Effect explosion_effect) { @@ -400,7 +417,7 @@ Explosion explosion = new Explosion(this, entity, d0, d1, d2, f, flag, explosion_effect); if (damagesource != null) { -@@ -1010,6 +1156,8 @@ +@@ -1010,6 +1166,8 @@ explosion.a(); explosion.a(false); @@ -409,7 +426,7 @@ if (explosion_effect == Explosion.Effect.NONE) { explosion.clearBlocks(); } -@@ -1074,13 +1222,20 @@ +@@ -1074,13 +1232,20 @@ } public int a(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { @@ -432,7 +449,7 @@ ++j; } } -@@ -1163,7 +1318,13 @@ +@@ -1163,7 +1328,13 @@ @Override public WorldMap a(String s) { return (WorldMap) this.getMinecraftServer().getWorldServer(DimensionManager.OVERWORLD).getWorldPersistentData().b(() -> {