diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index 37cae164..e772f17c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -56,6 +56,7 @@ import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.scoreboard.CraftScoreboardManager; import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.plugin.PluginLoadOrder; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -63,6 +64,7 @@ import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -76,6 +78,7 @@ import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; +import java.util.Map; import java.util.function.BooleanSupplier; @Mixin(MinecraftServer.class) @@ -355,16 +358,64 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop map, Object key, Object value) { + Object ret = map.put(key, value); + ServerWorld serverWorld = (ServerWorld) value; if (((WorldBridge) serverWorld).bridge$getGenerator() != null) { ((WorldBridge) serverWorld).bridge$getWorld().getPopulators().addAll( ((WorldBridge) serverWorld).bridge$getGenerator().getDefaultPopulators( ((WorldBridge) serverWorld).bridge$getWorld())); } + Bukkit.getPluginManager().callEvent(new WorldInitEvent(((WorldBridge) serverWorld).bridge$getWorld())); + return ret; } - @Inject(method = "loadWorlds", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/management/PlayerList;func_212504_a(Lnet/minecraft/world/server/ServerWorld;)V")) - private void arclight$initEvent(SaveHandler saveHandlerIn, WorldInfo info, WorldSettings worldSettingsIn, IChunkStatusListener chunkStatusListenerIn, CallbackInfo ci, ServerWorld serverWorld) { - Bukkit.getPluginManager().callEvent(new WorldInitEvent(((WorldBridge) serverWorld).bridge$getWorld())); + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public void loadInitialChunks(IChunkStatusListener listener) { + this.setUserMessage(new TranslationTextComponent("menu.generatingTerrain")); + ServerWorld serverworld = this.getWorld(DimensionType.OVERWORLD); + this.forceTicks = true; + LOGGER.info("Preparing start region for dimension " + DimensionType.getKey(serverworld.dimension.getType())); + BlockPos blockpos = serverworld.getSpawnPoint(); + listener.start(new ChunkPos(blockpos)); + ServerChunkProvider serverchunkprovider = serverworld.getChunkProvider(); + serverchunkprovider.getLightManager().func_215598_a(500); + this.serverTime = Util.milliTime(); + serverchunkprovider.registerTicket(TicketType.START, new ChunkPos(blockpos), 11, Unit.INSTANCE); + + while (serverchunkprovider.getLoadedChunksCount() != 441) { + this.executeModerately(); + } + + this.executeModerately(); + + for (DimensionType dimensiontype : DimensionType.getAll()) { + ServerWorld serverWorld = this.getWorld(dimensiontype); + if (((WorldBridge) serverWorld).bridge$getWorld().getKeepSpawnInMemory()) { + ForcedChunksSaveData forcedchunkssavedata = serverWorld.getSavedData().get(ForcedChunksSaveData::new, "chunks"); + if (forcedchunkssavedata != null) { + LongIterator longiterator = forcedchunkssavedata.getChunks().iterator(); + + while (longiterator.hasNext()) { + long i = longiterator.nextLong(); + ChunkPos chunkpos = new ChunkPos(i); + serverWorld.getChunkProvider().forceChunk(chunkpos, true); + } + } + } + Bukkit.getPluginManager().callEvent(new WorldLoadEvent(((WorldBridge) serverWorld).bridge$getWorld())); + } + + this.executeModerately(); + listener.stop(); + serverchunkprovider.getLightManager().func_215598_a(5); } @Inject(method = "updateTimeLightAndEntities", at = @At("HEAD")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/ArclightEventDispatcherRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/ArclightEventDispatcherRegistry.java index dc858c25..32efee0f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/ArclightEventDispatcherRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/ArclightEventDispatcherRegistry.java @@ -9,7 +9,6 @@ public abstract class ArclightEventDispatcherRegistry { MinecraftForge.EVENT_BUS.register(new BlockBreakEventDispatcher()); MinecraftForge.EVENT_BUS.register(new BlockPlaceEventDispatcher()); MinecraftForge.EVENT_BUS.register(new EntityPotionEffectEventDispatcher()); - MinecraftForge.EVENT_BUS.register(new WorldEventDispatcher()); MinecraftForge.EVENT_BUS.register(new EntityEventDispatcher()); MinecraftForge.EVENT_BUS.register(new NetworkEventDispatcher()); MinecraftForge.EVENT_BUS.register(new EntityTeleportEventDispatcher()); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/WorldEventDispatcher.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/WorldEventDispatcher.java deleted file mode 100644 index b732230f..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/event/WorldEventDispatcher.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.izzel.arclight.common.mod.server.event; - -import io.izzel.arclight.common.bridge.world.WorldBridge; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import org.bukkit.Bukkit; -import org.bukkit.event.world.WorldLoadEvent; - -public class WorldEventDispatcher { - - @SubscribeEvent - public void onWorldLoad(WorldEvent.Load event) { - Bukkit.getPluginManager().callEvent(new WorldLoadEvent(((WorldBridge) event.getWorld()).bridge$getWorld())); - } -}