From b03a249da3e3ddee374b34b4c26862b1ccc97666 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Wed, 12 Aug 2020 18:23:32 +0200 Subject: [PATCH] Remove libstructure Migrate to 1.16.2 final --- build.gradle | 3 - gradle.properties | 6 +- src/main/java/appeng/client/AppEngClient.java | 4 +- src/main/java/appeng/core/AppEngBase.java | 164 +----------------- .../java/appeng/core/AppEngBootstrap.java | 131 ++++++++++++++ .../core/api/definitions/ApiMaterials.java | 7 - .../appeng/core/worlddata/IWorldData.java | 4 - .../java/appeng/core/worlddata/WorldData.java | 19 +- .../java/appeng/mixins/BiomeAccessor.java | 19 -- .../java/appeng/mixins/BootstrapMixin.java | 20 +++ .../ThreadedAnvilChunkStorageAccessor.java | 15 -- .../feature/ConfiguredFeaturesAccessor.java | 19 ++ .../appeng/mixins/spatial/BiomesMixin.java | 27 +++ .../mixins/structure/BiomeAccessor.java | 25 +++ .../ConfiguredStructureFeaturesAccessor.java | 20 +++ .../GenerationSettingsAccessor.java | 5 +- .../structure/StructureFeatureAccessor.java | 17 ++ .../structure/StructuresConfigMixin.java | 40 +++++ src/main/java/appeng/server/AppEngServer.java | 12 +- .../java/appeng/worldgen/BiomeModifier.java | 4 +- .../meteorite/MeteoriteStructure.java | 10 ++ .../resources/appliedenergistics2.mixins.json | 13 +- 22 files changed, 346 insertions(+), 238 deletions(-) create mode 100644 src/main/java/appeng/core/AppEngBootstrap.java delete mode 100644 src/main/java/appeng/mixins/BiomeAccessor.java create mode 100644 src/main/java/appeng/mixins/BootstrapMixin.java delete mode 100644 src/main/java/appeng/mixins/ThreadedAnvilChunkStorageAccessor.java create mode 100644 src/main/java/appeng/mixins/feature/ConfiguredFeaturesAccessor.java create mode 100644 src/main/java/appeng/mixins/spatial/BiomesMixin.java create mode 100644 src/main/java/appeng/mixins/structure/BiomeAccessor.java create mode 100644 src/main/java/appeng/mixins/structure/ConfiguredStructureFeaturesAccessor.java rename src/main/java/appeng/mixins/{ => structure}/GenerationSettingsAccessor.java (87%) create mode 100644 src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java create mode 100644 src/main/java/appeng/mixins/structure/StructuresConfigMixin.java diff --git a/build.gradle b/build.gradle index 199778df9..b47cece1f 100644 --- a/build.gradle +++ b/build.gradle @@ -122,9 +122,6 @@ dependencies { implementation 'com.google.code.findbugs:jsr305:3.0.2' - modImplementation 'net.earthcomputer:libstructure:1.3' // Or the latest version - include 'net.earthcomputer:libstructure:1.3' - // unit test dependencies testCompile "junit:junit:4.13" } diff --git a/gradle.properties b/gradle.properties index 4784b03d8..3b22be639 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,12 +9,12 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # Check these on https://modmuss50.me/fabric.html -minecraft_version=1.16.2-rc2 -yarn_mappings=1.16.2-rc2+build.1 +minecraft_version=1.16.2 +yarn_mappings=1.16.2+build.6 loader_version=0.9.1+build.205 #Fabric api -fabric_version=0.17.1+build.394-1.16 +fabric_version=0.17.2+build.396-1.16 loom_version=0.4-SNAPSHOT diff --git a/src/main/java/appeng/client/AppEngClient.java b/src/main/java/appeng/client/AppEngClient.java index 859bff138..51e7cdbe8 100644 --- a/src/main/java/appeng/client/AppEngClient.java +++ b/src/main/java/appeng/client/AppEngClient.java @@ -196,8 +196,8 @@ public final class AppEngClient extends AppEngBase { // WorldData // each time the integrated server starts&stops ServerLifecycleEvents.SERVER_STARTING.register(WorldData::onServerStarting); - ServerLifecycleEvents.SERVER_STOPPING.register(server -> WorldData.instance().onServerStopping()); - ServerLifecycleEvents.SERVER_STOPPED.register(server -> WorldData.instance().onServerStoppped()); + ServerLifecycleEvents.SERVER_STOPPING.register(server -> WorldData.onServerStopping(server)); + ServerLifecycleEvents.SERVER_STOPPED.register(WorldData::onServerStoppped); this.bindings = new EnumMap<>(ActionKey.class); for (ActionKey key : ActionKey.values()) { diff --git a/src/main/java/appeng/core/AppEngBase.java b/src/main/java/appeng/core/AppEngBase.java index 646bb032b..5a578c4fa 100644 --- a/src/main/java/appeng/core/AppEngBase.java +++ b/src/main/java/appeng/core/AppEngBase.java @@ -4,56 +4,24 @@ import java.util.function.Consumer; import javax.annotation.Nullable; -import net.earthcomputer.libstructure.LibStructure; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BannerBlockEntity; -import net.minecraft.block.entity.BeaconBlockEntity; -import net.minecraft.block.entity.BrewingStandBlockEntity; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.entity.CommandBlockBlockEntity; -import net.minecraft.block.entity.ComparatorBlockEntity; -import net.minecraft.block.entity.DaylightDetectorBlockEntity; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.block.entity.DropperBlockEntity; -import net.minecraft.block.entity.EnchantingTableBlockEntity; -import net.minecraft.block.entity.EndPortalBlockEntity; -import net.minecraft.block.entity.EnderChestBlockEntity; -import net.minecraft.block.entity.FurnaceBlockEntity; -import net.minecraft.block.entity.HopperBlockEntity; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.block.entity.PistonBlockEntity; -import net.minecraft.block.entity.ShulkerBoxBlockEntity; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.block.entity.SkullBlockEntity; +import net.minecraft.block.entity.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.chunk.StructureConfig; -import net.minecraft.world.gen.decorator.Decorator; -import net.minecraft.world.gen.decorator.NopeDecoratorConfig; -import net.minecraft.world.gen.decorator.RangeDecoratorConfig; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.OreFeatureConfig; import appeng.api.config.Upgrades; import appeng.api.definitions.IBlocks; import appeng.api.definitions.IItems; import appeng.api.definitions.IParts; -import appeng.api.features.AEFeature; import appeng.api.features.IRegistryContainer; import appeng.api.features.IWirelessTermHandler; import appeng.api.features.IWorldGen; @@ -72,39 +40,7 @@ import appeng.bootstrap.components.ITileEntityRegistrationComponent; import appeng.client.render.effects.ParticleTypes; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpener; -import appeng.container.implementations.CellWorkbenchContainer; -import appeng.container.implementations.ChestContainer; -import appeng.container.implementations.CondenserContainer; -import appeng.container.implementations.CraftAmountContainer; -import appeng.container.implementations.CraftConfirmContainer; -import appeng.container.implementations.CraftingCPUContainer; -import appeng.container.implementations.CraftingStatusContainer; -import appeng.container.implementations.CraftingTermContainer; -import appeng.container.implementations.DriveContainer; -import appeng.container.implementations.FormationPlaneContainer; -import appeng.container.implementations.GrinderContainer; -import appeng.container.implementations.IOPortContainer; -import appeng.container.implementations.InscriberContainer; -import appeng.container.implementations.InterfaceContainer; -import appeng.container.implementations.InterfaceTerminalContainer; -import appeng.container.implementations.LevelEmitterContainer; -import appeng.container.implementations.MEMonitorableContainer; -import appeng.container.implementations.MEPortableCellContainer; -import appeng.container.implementations.MolecularAssemblerContainer; -import appeng.container.implementations.NetworkStatusContainer; -import appeng.container.implementations.NetworkToolContainer; -import appeng.container.implementations.PatternTermContainer; -import appeng.container.implementations.PriorityContainer; -import appeng.container.implementations.QNBContainer; -import appeng.container.implementations.QuartzKnifeContainer; -import appeng.container.implementations.SecurityStationContainer; -import appeng.container.implementations.SkyChestContainer; -import appeng.container.implementations.SpatialIOPortContainer; -import appeng.container.implementations.StorageBusContainer; -import appeng.container.implementations.UpgradeableContainer; -import appeng.container.implementations.VibrationChamberContainer; -import appeng.container.implementations.WirelessContainer; -import appeng.container.implementations.WirelessTermContainer; +import appeng.container.implementations.*; import appeng.core.features.registries.P2PTunnelRegistry; import appeng.core.features.registries.cell.BasicCellHandler; import appeng.core.features.registries.cell.BasicItemCellGuiHandler; @@ -115,41 +51,18 @@ import appeng.core.stats.AeStats; import appeng.core.sync.BasePacket; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.TargetPoint; -import appeng.fluids.container.FluidFormationPlaneContainer; -import appeng.fluids.container.FluidIOContainer; -import appeng.fluids.container.FluidInterfaceContainer; -import appeng.fluids.container.FluidLevelEmitterContainer; -import appeng.fluids.container.FluidStorageBusContainer; -import appeng.fluids.container.FluidTerminalContainer; +import appeng.fluids.container.*; import appeng.fluids.registries.BasicFluidCellGuiHandler; import appeng.hooks.ToolItemHook; import appeng.items.parts.FacadeItem; import appeng.items.tools.NetworkToolItem; -import appeng.me.cache.CraftingGridCache; -import appeng.me.cache.EnergyGridCache; -import appeng.me.cache.GridStorageCache; -import appeng.me.cache.P2PCache; -import appeng.me.cache.PathGridCache; -import appeng.me.cache.SecurityCache; -import appeng.me.cache.SpatialPylonCache; -import appeng.me.cache.TickManagerCache; +import appeng.me.cache.*; import appeng.mixins.CriteriaRegisterMixin; import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; -import appeng.recipes.handlers.GrinderRecipe; -import appeng.recipes.handlers.GrinderRecipeSerializer; -import appeng.recipes.handlers.InscriberRecipe; -import appeng.recipes.handlers.InscriberRecipeSerializer; -import appeng.recipes.handlers.QuartzKnifeRecipeSerializer; +import appeng.recipes.handlers.*; import appeng.server.AECommand; -import appeng.spatial.SpatialStorageBiome; -import appeng.spatial.SpatialStorageChunkGenerator; -import appeng.spatial.SpatialStorageDimensionIds; import appeng.tile.AEBaseBlockEntity; -import appeng.worldgen.BiomeModifier; -import appeng.worldgen.ChargedQuartzOreConfig; -import appeng.worldgen.ChargedQuartzOreFeature; -import appeng.worldgen.meteorite.MeteoriteStructure; public abstract class AppEngBase implements AppEng { @@ -172,8 +85,6 @@ public abstract class AppEngBase implements AppEng { throw new IllegalStateException(); } - AEConfig.load(FabricLoader.getInstance().getConfigDirectory()); - CreativeTab.init(); FacadeCreativeTab.init();// This call has a side-effect (adding it to the creative screen) @@ -182,15 +93,12 @@ public abstract class AppEngBase implements AppEng { ToolItemHook.install(); - Api.INSTANCE = new Api(); registerBlockEntities(); registerScreenHandlerTypes(); registerParticleTypes(); registerRecipeSerializers(); - registerWorldGen(); registerServerCommands(); - registerDimension(); setupInternalRegistries(); @@ -549,61 +457,6 @@ public abstract class AppEngBase implements AppEng { return type; } - private void registerWorldGen() { - LibStructure.registerStructure(MeteoriteStructure.ID, MeteoriteStructure.INSTANCE, - GenerationStep.Feature.TOP_LAYER_MODIFICATION, new StructureConfig(32, 8, 124895654), - new MeteoriteStructure(DefaultFeatureConfig.CODEC).configure(DefaultFeatureConfig.INSTANCE)); - Registry.register(Registry.FEATURE, AppEng.makeId("charged_quartz_ore"), ChargedQuartzOreFeature.INSTANCE); - - // add to all standard biomes - // TODO: Wrong... - BuiltinRegistries.BIOME.forEach(b -> { - addMeteoriteWorldGen(b); - addQuartzWorldGen(b); - }); - } - - private static void addMeteoriteWorldGen(Biome b) { - if (!AEConfig.instance().isFeatureEnabled(AEFeature.METEORITE_WORLD_GEN)) { - return; - } - - if (b.getCategory() == Biome.Category.THEEND || b.getCategory() == Biome.Category.NETHER) { - return; - } - - BiomeModifier modifier = new BiomeModifier(b); - modifier.addStructureFeature(MeteoriteStructure.INSTANCE.configure(FeatureConfig.DEFAULT)); - } - - private static void addQuartzWorldGen(Biome b) { - if (!AEConfig.instance().isFeatureEnabled(AEFeature.CERTUS_QUARTZ_WORLD_GEN)) { - return; - } - - BiomeModifier modifier = new BiomeModifier(b); - - BlockState quartzOre = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); - modifier.addFeature(GenerationStep.Feature.UNDERGROUND_ORES, - Feature.ORE - .configure(new OreFeatureConfig(OreFeatureConfig.Rules.BASE_STONE_OVERWORLD, quartzOre, - AEConfig.instance().getQuartzOresPerCluster())) - .decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(12, 12, 72))).spreadHorizontally() - .repeat(AEConfig.instance().getQuartzOresClusterAmount())); - - if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) { - - BlockState chargedQuartzOre = Api.instance().definitions().blocks().quartzOreCharged().block() - .getDefaultState(); - modifier.addFeature(GenerationStep.Feature.UNDERGROUND_DECORATION, - ChargedQuartzOreFeature.INSTANCE - .configure(new ChargedQuartzOreConfig(quartzOre, chargedQuartzOre, - AEConfig.instance().getSpawnChargedChance())) - .decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE))); - - } - } - private void registerServerCommands() { // The server commands need to know what the current minecraft server is. CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { @@ -611,11 +464,4 @@ public abstract class AppEngBase implements AppEng { }); } - private void registerDimension() { - BuiltinRegistries.add(BuiltinRegistries.BIOME, SpatialStorageDimensionIds.BIOME_KEY.getValue(), - SpatialStorageBiome.INSTANCE); - Registry.register(Registry.CHUNK_GENERATOR, SpatialStorageDimensionIds.CHUNK_GENERATOR_ID, - SpatialStorageChunkGenerator.CODEC); - } - } diff --git a/src/main/java/appeng/core/AppEngBootstrap.java b/src/main/java/appeng/core/AppEngBootstrap.java new file mode 100644 index 000000000..99d2224f4 --- /dev/null +++ b/src/main/java/appeng/core/AppEngBootstrap.java @@ -0,0 +1,131 @@ +package appeng.core; + +import com.google.common.base.Preconditions; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.BlockState; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.decorator.Decorator; +import net.minecraft.world.gen.decorator.NopeDecoratorConfig; +import net.minecraft.world.gen.decorator.RangeDecoratorConfig; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.OreFeatureConfig; + +import appeng.api.features.AEFeature; +import appeng.mixins.feature.ConfiguredFeaturesAccessor; +import appeng.mixins.structure.ConfiguredStructureFeaturesAccessor; +import appeng.mixins.structure.StructureFeatureAccessor; +import appeng.spatial.SpatialStorageChunkGenerator; +import appeng.spatial.SpatialStorageDimensionIds; +import appeng.worldgen.BiomeModifier; +import appeng.worldgen.ChargedQuartzOreConfig; +import appeng.worldgen.ChargedQuartzOreFeature; +import appeng.worldgen.meteorite.MeteoriteStructure; + +/** + * Hooks into the very early bootstrapping phase to register things before the + * first dynamic registry manager is created. + */ +public final class AppEngBootstrap { + + private static boolean initialized; + + private AppEngBootstrap() { + } + + public synchronized static void initialize() { + Preconditions.checkState(!initialized, "Already initialized!"); + initialized = true; + + AEConfig.load(FabricLoader.getInstance().getConfigDirectory()); + Api.INSTANCE = new Api(); + + registerStructures(); + + ConfiguredFeature quartzOreFeature = registerQuartzOreFeature(); + ConfiguredFeature chargedQuartzOreFeature = registerChargedQuartzOreFeature(); + + // add to all standard biomes + // TODO: This means we'll not add these things to newly created biomes + BuiltinRegistries.BIOME.forEach(b -> { + addMeteoriteWorldGen(b); + addQuartzWorldGen(b, quartzOreFeature, chargedQuartzOreFeature); + }); + + registerDimension(); + } + + private static void registerStructures() { + // Registering into the registry alone is INSUFFICIENT! + // There's a bidirectional map in the Structure class itself primarily for the + // purposes of NBT serialization + StructureFeatureAccessor.register(MeteoriteStructure.ID.toString(), MeteoriteStructure.INSTANCE, + GenerationStep.Feature.TOP_LAYER_MODIFICATION); + + ConfiguredStructureFeaturesAccessor.register(MeteoriteStructure.ID.toString(), + MeteoriteStructure.CONFIGURED_INSTANCE); + } + + private static void addMeteoriteWorldGen(Biome b) { + if (!AEConfig.instance().isFeatureEnabled(AEFeature.METEORITE_WORLD_GEN)) { + return; + } + + if (b.getCategory() == Biome.Category.THEEND || b.getCategory() == Biome.Category.NETHER) { + return; + } + + BiomeModifier modifier = new BiomeModifier(b); + modifier.addStructureFeature(MeteoriteStructure.CONFIGURED_INSTANCE); + } + + private static void addQuartzWorldGen(Biome b, ConfiguredFeature quartzOre, + ConfiguredFeature chargedQuartz) { + if (!AEConfig.instance().isFeatureEnabled(AEFeature.CERTUS_QUARTZ_WORLD_GEN)) { + return; + } + + BiomeModifier modifier = new BiomeModifier(b); + + modifier.addFeature(GenerationStep.Feature.UNDERGROUND_ORES, quartzOre); + + if (AEConfig.instance().isFeatureEnabled(AEFeature.CHARGED_CERTUS_ORE)) { + modifier.addFeature(GenerationStep.Feature.UNDERGROUND_DECORATION, chargedQuartz); + } + } + + private static ConfiguredFeature registerQuartzOreFeature() { + // Tell Minecraft about our configured quartz ore feature + BlockState quartzOreState = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); + return ConfiguredFeaturesAccessor.register(AppEng.makeId("quartz_ore").toString(), + Feature.ORE + .configure(new OreFeatureConfig(OreFeatureConfig.Rules.BASE_STONE_OVERWORLD, quartzOreState, + AEConfig.instance().getQuartzOresPerCluster())) + .decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(12, 12, 72))).spreadHorizontally() + .repeat(AEConfig.instance().getQuartzOresClusterAmount())); + } + + private static ConfiguredFeature registerChargedQuartzOreFeature() { + // Tell Minecraft about our configured charged quartz ore feature + Registry.register(Registry.FEATURE, AppEng.makeId("charged_quartz_ore"), ChargedQuartzOreFeature.INSTANCE); + + BlockState quartzOreState = Api.instance().definitions().blocks().quartzOre().block().getDefaultState(); + BlockState chargedQuartzOreState = Api.instance().definitions().blocks().quartzOreCharged().block() + .getDefaultState(); + return ConfiguredFeaturesAccessor.register(AppEng.makeId("charged_quartz_ore").toString(), + ChargedQuartzOreFeature.INSTANCE + .configure(new ChargedQuartzOreConfig(quartzOreState, chargedQuartzOreState, + AEConfig.instance().getSpawnChargedChance())) + .decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE))); + } + + private static void registerDimension() { + Registry.register(Registry.CHUNK_GENERATOR, SpatialStorageDimensionIds.CHUNK_GENERATOR_ID, + SpatialStorageChunkGenerator.CODEC); + } + +} diff --git a/src/main/java/appeng/core/api/definitions/ApiMaterials.java b/src/main/java/appeng/core/api/definitions/ApiMaterials.java index c36f22b8b..dc66f3c3a 100644 --- a/src/main/java/appeng/core/api/definitions/ApiMaterials.java +++ b/src/main/java/appeng/core/api/definitions/ApiMaterials.java @@ -27,7 +27,6 @@ import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IMaterials; import appeng.api.features.AEFeature; import appeng.bootstrap.FeatureFactory; -import appeng.core.AEConfig; import appeng.entity.ChargedQuartzEntity; import appeng.entity.SingularityEntity; import appeng.items.materials.MaterialItem; @@ -191,12 +190,6 @@ public final class ApiMaterials implements IMaterials { IItemDefinition def = registry.item(mat.getId(), props -> new MaterialItem(props, mat)) .features(mat.getFeature().toArray(new AEFeature[0])).build(); - boolean enabled = true; - - for (final AEFeature f : mat.getFeature()) { - enabled = enabled && AEConfig.instance().isFeatureEnabled(f); - } - mat.setItemInstance(def.item()); mat.markReady(); return def; diff --git a/src/main/java/appeng/core/worlddata/IWorldData.java b/src/main/java/appeng/core/worlddata/IWorldData.java index cfe12ecd5..7c3bb6391 100644 --- a/src/main/java/appeng/core/worlddata/IWorldData.java +++ b/src/main/java/appeng/core/worlddata/IWorldData.java @@ -26,10 +26,6 @@ import javax.annotation.Nonnull; * @since rv3 30.05.2015 */ public interface IWorldData { - void onServerStopping(); - - void onServerStoppped(); - @Nonnull IWorldGridStorageData storageData(); diff --git a/src/main/java/appeng/core/worlddata/WorldData.java b/src/main/java/appeng/core/worlddata/WorldData.java index 43859000d..47dac2c0a 100644 --- a/src/main/java/appeng/core/worlddata/WorldData.java +++ b/src/main/java/appeng/core/worlddata/WorldData.java @@ -49,7 +49,7 @@ public final class WorldData implements IWorldData { * Is null while no MinecraftServer exists. */ @Nullable - private static IWorldData instance; + private static WorldData instance; @Nullable private static MinecraftServer server; @@ -113,16 +113,17 @@ public final class WorldData implements IWorldData { WorldData.server = server; } - @Override - public void onServerStopping() { - compassData.service().kill(); + public static void onServerStopping(MinecraftServer server) { + if (WorldData.server == server && instance != null) { + instance.compassData.service().kill(); + } } - @Override - public void onServerStoppped() { - Preconditions.checkNotNull(server); - instance = null; - WorldData.server = null; + public static void onServerStoppped(MinecraftServer server) { + if (WorldData.server == server) { + instance = null; + WorldData.server = null; + } } @Nonnull diff --git a/src/main/java/appeng/mixins/BiomeAccessor.java b/src/main/java/appeng/mixins/BiomeAccessor.java deleted file mode 100644 index df563beee..000000000 --- a/src/main/java/appeng/mixins/BiomeAccessor.java +++ /dev/null @@ -1,19 +0,0 @@ -package appeng.mixins; - -import java.util.List; -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.feature.StructureFeature; - -@Mixin(Biome.class) -public interface BiomeAccessor { - - @Accessor - Map>> getField_26634(); - -} diff --git a/src/main/java/appeng/mixins/BootstrapMixin.java b/src/main/java/appeng/mixins/BootstrapMixin.java new file mode 100644 index 000000000..0277fd035 --- /dev/null +++ b/src/main/java/appeng/mixins/BootstrapMixin.java @@ -0,0 +1,20 @@ +package appeng.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.Bootstrap; + +import appeng.core.AppEngBootstrap; + +@Mixin(Bootstrap.class) +public class BootstrapMixin { + + @Inject(method = "initialize", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;setOutputStreams()V", shift = At.Shift.AFTER), require = 1, allow = 1) + private static void afterInitialize(CallbackInfo ci) { + AppEngBootstrap.initialize(); + } + +} diff --git a/src/main/java/appeng/mixins/ThreadedAnvilChunkStorageAccessor.java b/src/main/java/appeng/mixins/ThreadedAnvilChunkStorageAccessor.java deleted file mode 100644 index f268bee4a..000000000 --- a/src/main/java/appeng/mixins/ThreadedAnvilChunkStorageAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package appeng.mixins; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.world.ThreadedAnvilChunkStorage; - -@Mixin(ThreadedAnvilChunkStorage.class) -public interface ThreadedAnvilChunkStorageAccessor { - - @Accessor - WorldGenerationProgressListener getWorldGenerationProgressListener(); - -} diff --git a/src/main/java/appeng/mixins/feature/ConfiguredFeaturesAccessor.java b/src/main/java/appeng/mixins/feature/ConfiguredFeaturesAccessor.java new file mode 100644 index 000000000..249c0dceb --- /dev/null +++ b/src/main/java/appeng/mixins/feature/ConfiguredFeaturesAccessor.java @@ -0,0 +1,19 @@ +package appeng.mixins.feature; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.gen.feature.FeatureConfig; + +@Mixin(ConfiguredFeatures.class) +public interface ConfiguredFeaturesAccessor { + + @Invoker("register") + static ConfiguredFeature register(String id, + ConfiguredFeature configuredFeature) { + throw new AssertionError(); + } + +} diff --git a/src/main/java/appeng/mixins/spatial/BiomesMixin.java b/src/main/java/appeng/mixins/spatial/BiomesMixin.java new file mode 100644 index 000000000..8b8eed998 --- /dev/null +++ b/src/main/java/appeng/mixins/spatial/BiomesMixin.java @@ -0,0 +1,27 @@ +package appeng.mixins.spatial; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.world.biome.Biomes; + +import appeng.spatial.SpatialStorageBiome; +import appeng.spatial.SpatialStorageDimensionIds; + +/** + * This only needs to be here because the server-side will create a dynamic + * registry manager long before our mod is initialized. + */ +@Mixin(Biomes.class) +public class BiomesMixin { + + @Inject(method = "", at = @At("TAIL")) + private static void registerBiomes(CallbackInfo ci) { + BuiltinRegistries.add(BuiltinRegistries.BIOME, SpatialStorageDimensionIds.BIOME_KEY.getValue(), + SpatialStorageBiome.INSTANCE); + } + +} diff --git a/src/main/java/appeng/mixins/structure/BiomeAccessor.java b/src/main/java/appeng/mixins/structure/BiomeAccessor.java new file mode 100644 index 000000000..5f50b39bc --- /dev/null +++ b/src/main/java/appeng/mixins/structure/BiomeAccessor.java @@ -0,0 +1,25 @@ +package appeng.mixins.structure; + +import java.util.List; +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.StructureFeature; + +/** + * Allows access to the copy of _all_ structures that is maintained within each + * instance of {@link Biome}, in order to add our new structure to it. Note that + * this does not mean the structure will start _generating_ in this biome, it + * will only continue to generate if an adjacent biome has started the structure + * and it extends into this one. + */ +@Mixin(Biome.class) +public interface BiomeAccessor { + + @Accessor + Map>> getField_26634(); + +} diff --git a/src/main/java/appeng/mixins/structure/ConfiguredStructureFeaturesAccessor.java b/src/main/java/appeng/mixins/structure/ConfiguredStructureFeaturesAccessor.java new file mode 100644 index 000000000..3e8a10b80 --- /dev/null +++ b/src/main/java/appeng/mixins/structure/ConfiguredStructureFeaturesAccessor.java @@ -0,0 +1,20 @@ +package appeng.mixins.structure; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +import net.minecraft.world.gen.feature.FeatureConfig; +import net.minecraft.world.gen.feature.StructureFeature; + +@Mixin(ConfiguredStructureFeatures.class) +public interface ConfiguredStructureFeaturesAccessor { + + @Invoker("register") + static > ConfiguredStructureFeature register( + String id, ConfiguredStructureFeature configuredStructureFeature) { + throw new AssertionError(); + } + +} diff --git a/src/main/java/appeng/mixins/GenerationSettingsAccessor.java b/src/main/java/appeng/mixins/structure/GenerationSettingsAccessor.java similarity index 87% rename from src/main/java/appeng/mixins/GenerationSettingsAccessor.java rename to src/main/java/appeng/mixins/structure/GenerationSettingsAccessor.java index b98e6a550..039f0b744 100644 --- a/src/main/java/appeng/mixins/GenerationSettingsAccessor.java +++ b/src/main/java/appeng/mixins/structure/GenerationSettingsAccessor.java @@ -1,4 +1,4 @@ -package appeng.mixins; +package appeng.mixins.structure; import java.util.List; import java.util.function.Supplier; @@ -10,6 +10,9 @@ import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +/** + * Allows the settings in a Biome's generation settings to be modified. + */ @Mixin(GenerationSettings.class) public interface GenerationSettingsAccessor { diff --git a/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java b/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java new file mode 100644 index 000000000..d9d770fed --- /dev/null +++ b/src/main/java/appeng/mixins/structure/StructureFeatureAccessor.java @@ -0,0 +1,17 @@ +package appeng.mixins.structure; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.feature.StructureFeature; + +@Mixin(StructureFeature.class) +public interface StructureFeatureAccessor { + + @Invoker("register") + static > F register(String id, F structureFeature, GenerationStep.Feature step) { + throw new AssertionError(); + } + +} diff --git a/src/main/java/appeng/mixins/structure/StructuresConfigMixin.java b/src/main/java/appeng/mixins/structure/StructuresConfigMixin.java new file mode 100644 index 000000000..dc35fe05a --- /dev/null +++ b/src/main/java/appeng/mixins/structure/StructuresConfigMixin.java @@ -0,0 +1,40 @@ +package appeng.mixins.structure; + +import com.google.common.collect.ImmutableMap; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +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.callback.CallbackInfo; + +import net.minecraft.world.gen.chunk.StructureConfig; +import net.minecraft.world.gen.chunk.StructuresConfig; +import net.minecraft.world.gen.feature.StructureFeature; + +import appeng.worldgen.meteorite.MeteoriteStructure; + +/** + * This Mixin will add the structure placement configuration for the meteorite + * structure to the static final immutable map that contains them. There is + * currently no Fabric API for this, and registering them during the registry + * event is already too late. + *

+ * If this is not done, Meteorites spawn every chunk, since that is the default + * for missing entries. + */ +@Mixin(StructuresConfig.class) +public class StructuresConfigMixin { + + @Shadow + @Mutable + private static ImmutableMap, StructureConfig> DEFAULT_STRUCTURES; + + @Inject(method = "", at = @At("TAIL")) + private static void addMeteoriteConfig(CallbackInfo ci) { + DEFAULT_STRUCTURES = ImmutableMap., StructureConfig>builder().putAll(DEFAULT_STRUCTURES) + .put(MeteoriteStructure.INSTANCE, MeteoriteStructure.PLACEMENT_CONFIG).build(); + } + +} diff --git a/src/main/java/appeng/server/AppEngServer.java b/src/main/java/appeng/server/AppEngServer.java index cabb51cd0..a2c09a289 100644 --- a/src/main/java/appeng/server/AppEngServer.java +++ b/src/main/java/appeng/server/AppEngServer.java @@ -32,8 +32,8 @@ public final class AppEngServer extends AppEngBase { this.tickHandler = new TickHandler(); ServerLifecycleEvents.SERVER_STARTING.register(this::onServerStarting); - ServerLifecycleEvents.SERVER_STOPPING.register(s -> onServerStopping()); - ServerLifecycleEvents.SERVER_STOPPED.register(s -> onServerStopped()); + ServerLifecycleEvents.SERVER_STOPPING.register(WorldData::onServerStopping); + ServerLifecycleEvents.SERVER_STOPPED.register(WorldData::onServerStoppped); } private void onServerStarting(MinecraftServer server) { @@ -43,14 +43,6 @@ public final class AppEngServer extends AppEngBase { this.server = server; } - private void onServerStopping() { - WorldData.instance().onServerStopping(); - } - - private void onServerStopped() { - WorldData.instance().onServerStoppped(); - } - @Override public Stream getPlayers() { return PlayerStream.all(server); diff --git a/src/main/java/appeng/worldgen/BiomeModifier.java b/src/main/java/appeng/worldgen/BiomeModifier.java index 7d948032c..f6173ba9c 100644 --- a/src/main/java/appeng/worldgen/BiomeModifier.java +++ b/src/main/java/appeng/worldgen/BiomeModifier.java @@ -13,8 +13,8 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import net.minecraft.world.gen.feature.StructureFeature; -import appeng.mixins.BiomeAccessor; -import appeng.mixins.GenerationSettingsAccessor; +import appeng.mixins.structure.BiomeAccessor; +import appeng.mixins.structure.GenerationSettingsAccessor; public final class BiomeModifier { diff --git a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java index 9fe9733be..65a783820 100644 --- a/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java +++ b/src/main/java/appeng/worldgen/meteorite/MeteoriteStructure.java @@ -8,6 +8,8 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.gen.ChunkRandom; import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.StructureConfig; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.StructureFeature; @@ -15,11 +17,19 @@ import appeng.core.AppEng; public class MeteoriteStructure extends StructureFeature { + /** + * Configures how this structure will be placed throughout the world. + */ + public static final StructureConfig PLACEMENT_CONFIG = new StructureConfig(32, 8, 124895654); + public static final Identifier ID = AppEng.makeId("meteorite"); public static final StructureFeature INSTANCE = new MeteoriteStructure( DefaultFeatureConfig.CODEC); + public static final ConfiguredStructureFeature> CONFIGURED_INSTANCE = INSTANCE + .configure(DefaultFeatureConfig.INSTANCE); + public MeteoriteStructure(Codec configCodec) { super(configCodec); } diff --git a/src/main/resources/appliedenergistics2.mixins.json b/src/main/resources/appliedenergistics2.mixins.json index c11ec68f9..aaaac6b87 100644 --- a/src/main/resources/appliedenergistics2.mixins.json +++ b/src/main/resources/appliedenergistics2.mixins.json @@ -7,18 +7,23 @@ "spatial.DimensionTypeMixin", "spatial.DimensionOptionMixin", "spatial.EntityMixin", + "spatial.BiomesMixin", + "structure.StructuresConfigMixin", + "structure.ConfiguredStructureFeaturesAccessor", + "structure.StructureFeatureAccessor", + "structure.GenerationSettingsAccessor", + "structure.BiomeAccessor", + "feature.ConfiguredFeaturesAccessor", "CriteriaRegisterMixin", "RemainderSetter", "ScreenHandlerListeners", "ShapelessRecipeMixin", "SlotMixin", "TntAccessor", - "ThreadedAnvilChunkStorageAccessor", - "GenerationSettingsAccessor", - "BiomeAccessor", "ServerWorldCustomItemEntityMixin", "HopperMixin", - "FluidTagsAccessor" + "FluidTagsAccessor", + "BootstrapMixin" ], "client": [ "spatial.SkyRenderMixin",