diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index ee789504d..527a0ffe2 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -8,7 +8,6 @@ import com.dfsek.terra.api.addons.annotations.Author; import com.dfsek.terra.api.addons.annotations.Version; import com.dfsek.terra.api.command.CommandManager; import com.dfsek.terra.api.command.TerraCommandManager; -import com.dfsek.terra.api.command.exception.CommandException; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventManager; @@ -16,7 +15,6 @@ import com.dfsek.terra.api.event.TerraEventManager; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; @@ -28,7 +26,6 @@ import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.api.util.logging.DebugLogger; -import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -39,7 +36,7 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.forge.generation.ForgeChunkGeneratorWrapper; import com.dfsek.terra.forge.generation.PopulatorFeature; -import com.dfsek.terra.forge.generation.TerraLevelType; +import com.dfsek.terra.forge.generation.TerraBiomeSource; import com.dfsek.terra.forge.handle.ForgeItemHandle; import com.dfsek.terra.forge.handle.ForgeWorldHandle; import com.dfsek.terra.profiler.Profiler; @@ -48,22 +45,14 @@ import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; import net.minecraft.block.Blocks; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.command.CommandSource; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeAmbience; import net.minecraft.world.biome.BiomeGenerationSettings; import net.minecraft.world.gen.GenerationStage; import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.Features; import net.minecraft.world.gen.feature.IFeatureConfig; import net.minecraft.world.gen.feature.NoFeatureConfig; @@ -71,15 +60,9 @@ import net.minecraft.world.gen.placement.DecoratedPlacement; import net.minecraft.world.gen.placement.NoPlacementConfig; import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.ForgeWorldTypeScreens; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.world.ForgeWorldType; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; @@ -91,19 +74,13 @@ import java.io.InputStream; import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.function.Consumer; import java.util.jar.JarFile; import java.util.zip.ZipFile; -import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; -import static com.mojang.brigadier.builder.RequiredArgumentBuilder.argument; - @Mod("terra") @Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD) public class TerraForgePlugin implements TerraPlugin { @@ -136,6 +113,7 @@ public class TerraForgePlugin implements TerraPlugin { logger.error(message); } }; + private final DebugLogger debugLogger = new DebugLogger(logger); private final ItemHandle itemHandle = new ForgeItemHandle(); private final WorldHandle worldHandle = new ForgeWorldHandle(); @@ -152,9 +130,6 @@ public class TerraForgePlugin implements TerraPlugin { public TerraForgePlugin() { if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist."); INSTANCE = this; - MinecraftForge.EVENT_BUS.register(ClientEvents.class); - MinecraftForge.EVENT_BUS.register(getClass()); - MinecraftForge.EVENT_BUS.register(ForgeEvents.class); } public static TerraForgePlugin getInstance() { @@ -165,52 +140,14 @@ public class TerraForgePlugin implements TerraPlugin { return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } - private static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { - return in.suggests((context, builder) -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); - } catch(CommandException e) { - sender.sendMessage(e.getMessage()); - } - return builder.buildFuture(); - }).executes(context -> { - List args = parseCommand(context.getInput()); - try { - manager.execute(args.remove(0), (CommandSender) context.getSource(), args); - } catch(CommandException e) { - context.getSource().sendFailure(new StringTextComponent(e.getMessage())); - } - return 1; + @SubscribeEvent + public static void setup(FMLCommonSetupEvent event) { + event.enqueueWork(() -> { + Registry.register(Registry.BIOME_SOURCE, "terra:biome", TerraBiomeSource.CODEC); + Registry.register(Registry.CHUNK_GENERATOR, "terra:generator", ForgeChunkGeneratorWrapper.CODEC); }); } - private static List parseCommand(String command) { - if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); - else if(command.startsWith("/te ")) command = command.substring("/te ".length()); - List c = new ArrayList<>(Arrays.asList(command.split(" "))); - if(command.endsWith(" ")) c.add(""); - return c; - } - - @SubscribeEvent - public static void register(RegistryEvent.Register event) { - INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff - INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(INSTANCE.createBiome(biome)))); // Register all Terra biomes. - } - - @SubscribeEvent - public static void registerLevels(RegistryEvent.Register event) { - INSTANCE.logger().info("Registering level types..."); - event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE); - } - - @SubscribeEvent - public static void registerPop(RegistryEvent.Register> event) { - event.getRegistry().register(POPULATOR_FEATURE); - } - @SuppressWarnings("ConstantConditions") public Biome createBiome(BiomeBuilder biome) { BiomeTemplate template = biome.getTemplate(); @@ -408,22 +345,8 @@ public class TerraForgePlugin implements TerraPlugin { return profiler; } - @Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.FORGE) - public static final class ForgeEvents { - @SuppressWarnings({"unchecked", "rawtypes"}) - @SubscribeEvent - public static void registerCommands(RegisterCommandsEvent event) { - int max = INSTANCE.manager.getMaxArgumentDepth(); - RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); - for(int i = 0; i < max; i++) { - RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - - arg = next.then(assemble(arg, INSTANCE.manager)); - } - - event.getDispatcher().register(literal("terra").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); - event.getDispatcher().register(literal("te").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); - } + public CommandManager getManager() { + return manager; } @Addon("Terra-Forge") @@ -475,33 +398,4 @@ public class TerraForgePlugin implements TerraPlugin { } } } - - @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) - public static final class ClientEvents { - @SubscribeEvent - public static void register(FMLClientSetupEvent event) { - INSTANCE.logger.info("Client setup..."); - - ForgeWorldType world = TerraLevelType.FORGE_WORLD_TYPE; - ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { - private final MutableInteger num = new MutableInteger(0); - private final List packs = new ArrayList<>(); - private final Button toggle = new Button(0, 25, 120, 20, new StringTextComponent(""), button -> { - num.increment(); - if(num.get() >= packs.size()) num.set(0); - button.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); - }); - - @Override - protected void init() { - packs.clear(); - INSTANCE.registry.forEach((Consumer) packs::add); - addButton(new Button(0, 0, 120, 20, new StringTextComponent("Close"), btn -> Minecraft.getInstance().setScreen(returnTo))); - toggle.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); - addButton(toggle); - } - }); - } - } - } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ClientListener.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ClientListener.java new file mode 100644 index 000000000..fd4c6cabc --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ClientListener.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.forge.listener; + +import com.dfsek.terra.api.util.mutable.MutableInteger; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.TerraForgePlugin; +import com.dfsek.terra.forge.generation.TerraLevelType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.ForgeWorldTypeScreens; +import net.minecraftforge.common.world.ForgeWorldType; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public class ClientListener { + private static final TerraForgePlugin INSTANCE = TerraForgePlugin.getInstance(); + + @SubscribeEvent + public static void register(FMLClientSetupEvent event) { + INSTANCE.logger().info("Client setup..."); + + ForgeWorldType world = TerraLevelType.FORGE_WORLD_TYPE; + ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { + private final MutableInteger num = new MutableInteger(0); + private final List packs = new ArrayList<>(); + private final Button toggle = new Button(0, 25, 120, 20, new StringTextComponent(""), button -> { + num.increment(); + if(num.get() >= packs.size()) num.set(0); + button.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); + }); + + @Override + protected void init() { + packs.clear(); + INSTANCE.getConfigRegistry().forEach((Consumer) packs::add); + addButton(new Button(0, 0, 120, 20, new StringTextComponent("Close"), btn -> Minecraft.getInstance().setScreen(returnTo))); + toggle.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); + addButton(toggle); + } + }); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ForgeListener.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ForgeListener.java new file mode 100644 index 000000000..6c8c214c8 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/ForgeListener.java @@ -0,0 +1,70 @@ +package com.dfsek.terra.forge.listener; + +import com.dfsek.terra.api.command.CommandManager; +import com.dfsek.terra.api.command.exception.CommandException; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.forge.TerraForgePlugin; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; +import static com.mojang.brigadier.builder.RequiredArgumentBuilder.argument; + +@Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.FORGE) +public class ForgeListener { + private static final TerraForgePlugin INSTANCE = TerraForgePlugin.getInstance(); + + @SuppressWarnings({"unchecked", "rawtypes"}) + @SubscribeEvent + public static void registerCommands(RegisterCommandsEvent event) { + int max = INSTANCE.getManager().getMaxArgumentDepth(); + RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); + for(int i = 0; i < max; i++) { + RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); + + arg = next.then(assemble(arg, INSTANCE.getManager())); + } + + event.getDispatcher().register(literal("terra").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.getManager()))); + event.getDispatcher().register(literal("te").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.getManager()))); + } + + public static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { + return in.suggests((context, builder) -> { + List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); + try { + manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); + } catch(CommandException e) { + sender.sendMessage(e.getMessage()); + } + return builder.buildFuture(); + }).executes(context -> { + List args = parseCommand(context.getInput()); + try { + manager.execute(args.remove(0), (CommandSender) context.getSource(), args); + } catch(CommandException e) { + context.getSource().sendFailure(new StringTextComponent(e.getMessage())); + } + return 1; + }); + } + + private static List parseCommand(String command) { + if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); + else if(command.startsWith("/te ")) command = command.substring("/te ".length()); + List c = new ArrayList<>(Arrays.asList(command.split(" "))); + if(command.endsWith(" ")) c.add(""); + return c; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/RegistryListener.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/RegistryListener.java new file mode 100644 index 000000000..bd2ae8a04 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/listener/RegistryListener.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.forge.listener; + +import com.dfsek.terra.forge.TerraForgePlugin; +import com.dfsek.terra.forge.generation.TerraLevelType; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.Feature; +import net.minecraftforge.common.world.ForgeWorldType; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class RegistryListener { + private static final TerraForgePlugin INSTANCE = TerraForgePlugin.getInstance(); + + @SubscribeEvent + public static void registerLevels(RegistryEvent.Register event) { + INSTANCE.logger().info("Registering level types..."); + event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE); + } + + @SubscribeEvent + public static void register(RegistryEvent.Register event) { + INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff + INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(INSTANCE.createBiome(biome)))); // Register all Terra biomes. + } + + @SubscribeEvent + public static void registerPop(RegistryEvent.Register> event) { + event.getRegistry().register(TerraForgePlugin.POPULATOR_FEATURE); + } +}