mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-18 14:50:56 +00:00
fix chunk generator reset on forge
This commit is contained in:
@@ -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.addons.annotations.Version;
|
||||||
import com.dfsek.terra.api.command.CommandManager;
|
import com.dfsek.terra.api.command.CommandManager;
|
||||||
import com.dfsek.terra.api.command.TerraCommandManager;
|
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.command.exception.MalformedCommandException;
|
||||||
import com.dfsek.terra.api.event.EventListener;
|
import com.dfsek.terra.api.event.EventListener;
|
||||||
import com.dfsek.terra.api.event.EventManager;
|
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.Global;
|
||||||
import com.dfsek.terra.api.event.annotations.Priority;
|
import com.dfsek.terra.api.event.annotations.Priority;
|
||||||
import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent;
|
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.block.BlockData;
|
||||||
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
import com.dfsek.terra.api.platform.handle.ItemHandle;
|
||||||
import com.dfsek.terra.api.platform.handle.WorldHandle;
|
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.transform.Transformer;
|
||||||
import com.dfsek.terra.api.util.JarUtil;
|
import com.dfsek.terra.api.util.JarUtil;
|
||||||
import com.dfsek.terra.api.util.logging.DebugLogger;
|
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.commands.CommandUtil;
|
||||||
import com.dfsek.terra.config.GenericLoaders;
|
import com.dfsek.terra.config.GenericLoaders;
|
||||||
import com.dfsek.terra.config.PluginConfig;
|
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.config.templates.BiomeTemplate;
|
||||||
import com.dfsek.terra.forge.generation.ForgeChunkGeneratorWrapper;
|
import com.dfsek.terra.forge.generation.ForgeChunkGeneratorWrapper;
|
||||||
import com.dfsek.terra.forge.generation.PopulatorFeature;
|
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.ForgeItemHandle;
|
||||||
import com.dfsek.terra.forge.handle.ForgeWorldHandle;
|
import com.dfsek.terra.forge.handle.ForgeWorldHandle;
|
||||||
import com.dfsek.terra.profiler.Profiler;
|
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.AddonRegistry;
|
||||||
import com.dfsek.terra.registry.master.ConfigRegistry;
|
import com.dfsek.terra.registry.master.ConfigRegistry;
|
||||||
import com.dfsek.terra.world.TerraWorld;
|
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.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.ResourceLocation;
|
||||||
import net.minecraft.util.text.StringTextComponent;
|
import net.minecraft.util.registry.Registry;
|
||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
import net.minecraft.world.biome.BiomeAmbience;
|
import net.minecraft.world.biome.BiomeAmbience;
|
||||||
import net.minecraft.world.biome.BiomeGenerationSettings;
|
import net.minecraft.world.biome.BiomeGenerationSettings;
|
||||||
import net.minecraft.world.gen.GenerationStage;
|
import net.minecraft.world.gen.GenerationStage;
|
||||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
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.Features;
|
||||||
import net.minecraft.world.gen.feature.IFeatureConfig;
|
import net.minecraft.world.gen.feature.IFeatureConfig;
|
||||||
import net.minecraft.world.gen.feature.NoFeatureConfig;
|
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.placement.NoPlacementConfig;
|
||||||
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
|
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
|
||||||
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig;
|
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.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
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 net.minecraftforge.registries.ForgeRegistries;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
@@ -91,19 +74,13 @@ import java.io.InputStream;
|
|||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal;
|
|
||||||
import static com.mojang.brigadier.builder.RequiredArgumentBuilder.argument;
|
|
||||||
|
|
||||||
@Mod("terra")
|
@Mod("terra")
|
||||||
@Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD)
|
@Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD)
|
||||||
public class TerraForgePlugin implements TerraPlugin {
|
public class TerraForgePlugin implements TerraPlugin {
|
||||||
@@ -136,6 +113,7 @@ public class TerraForgePlugin implements TerraPlugin {
|
|||||||
logger.error(message);
|
logger.error(message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private final DebugLogger debugLogger = new DebugLogger(logger);
|
private final DebugLogger debugLogger = new DebugLogger(logger);
|
||||||
private final ItemHandle itemHandle = new ForgeItemHandle();
|
private final ItemHandle itemHandle = new ForgeItemHandle();
|
||||||
private final WorldHandle worldHandle = new ForgeWorldHandle();
|
private final WorldHandle worldHandle = new ForgeWorldHandle();
|
||||||
@@ -152,9 +130,6 @@ public class TerraForgePlugin implements TerraPlugin {
|
|||||||
public TerraForgePlugin() {
|
public TerraForgePlugin() {
|
||||||
if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist.");
|
if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist.");
|
||||||
INSTANCE = this;
|
INSTANCE = this;
|
||||||
MinecraftForge.EVENT_BUS.register(ClientEvents.class);
|
|
||||||
MinecraftForge.EVENT_BUS.register(getClass());
|
|
||||||
MinecraftForge.EVENT_BUS.register(ForgeEvents.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TerraForgePlugin getInstance() {
|
public static TerraForgePlugin getInstance() {
|
||||||
@@ -165,52 +140,14 @@ public class TerraForgePlugin implements TerraPlugin {
|
|||||||
return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT);
|
return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RequiredArgumentBuilder<CommandSource, String> assemble(RequiredArgumentBuilder<CommandSource, String> in, CommandManager manager) {
|
@SubscribeEvent
|
||||||
return in.suggests((context, builder) -> {
|
public static void setup(FMLCommonSetupEvent event) {
|
||||||
List<String> args = parseCommand(context.getInput());
|
event.enqueueWork(() -> {
|
||||||
CommandSender sender = (CommandSender) context.getSource();
|
Registry.register(Registry.BIOME_SOURCE, "terra:biome", TerraBiomeSource.CODEC);
|
||||||
try {
|
Registry.register(Registry.CHUNK_GENERATOR, "terra:generator", ForgeChunkGeneratorWrapper.CODEC);
|
||||||
manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest);
|
|
||||||
} catch(CommandException e) {
|
|
||||||
sender.sendMessage(e.getMessage());
|
|
||||||
}
|
|
||||||
return builder.buildFuture();
|
|
||||||
}).executes(context -> {
|
|
||||||
List<String> 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<String> parseCommand(String command) {
|
|
||||||
if(command.startsWith("/terra ")) command = command.substring("/terra ".length());
|
|
||||||
else if(command.startsWith("/te ")) command = command.substring("/te ".length());
|
|
||||||
List<String> c = new ArrayList<>(Arrays.asList(command.split(" ")));
|
|
||||||
if(command.endsWith(" ")) c.add("");
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void register(RegistryEvent.Register<Biome> 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<ForgeWorldType> event) {
|
|
||||||
INSTANCE.logger().info("Registering level types...");
|
|
||||||
event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void registerPop(RegistryEvent.Register<Feature<?>> event) {
|
|
||||||
event.getRegistry().register(POPULATOR_FEATURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
public Biome createBiome(BiomeBuilder biome) {
|
public Biome createBiome(BiomeBuilder biome) {
|
||||||
BiomeTemplate template = biome.getTemplate();
|
BiomeTemplate template = biome.getTemplate();
|
||||||
@@ -408,22 +345,8 @@ public class TerraForgePlugin implements TerraPlugin {
|
|||||||
return profiler;
|
return profiler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.FORGE)
|
public CommandManager getManager() {
|
||||||
public static final class ForgeEvents {
|
return manager;
|
||||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void registerCommands(RegisterCommandsEvent event) {
|
|
||||||
int max = INSTANCE.manager.getMaxArgumentDepth();
|
|
||||||
RequiredArgumentBuilder<CommandSource, String> arg = argument("arg" + (max - 1), StringArgumentType.word());
|
|
||||||
for(int i = 0; i < max; i++) {
|
|
||||||
RequiredArgumentBuilder<CommandSource, String> 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)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Addon("Terra-Forge")
|
@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<ConfigPack> 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<ConfigPack>) 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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<ConfigPack> 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<ConfigPack>) 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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<CommandSource, String> arg = argument("arg" + (max - 1), StringArgumentType.word());
|
||||||
|
for(int i = 0; i < max; i++) {
|
||||||
|
RequiredArgumentBuilder<CommandSource, String> 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<CommandSource, String> assemble(RequiredArgumentBuilder<CommandSource, String> in, CommandManager manager) {
|
||||||
|
return in.suggests((context, builder) -> {
|
||||||
|
List<String> 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<String> 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<String> parseCommand(String command) {
|
||||||
|
if(command.startsWith("/terra ")) command = command.substring("/terra ".length());
|
||||||
|
else if(command.startsWith("/te ")) command = command.substring("/te ".length());
|
||||||
|
List<String> c = new ArrayList<>(Arrays.asList(command.split(" ")));
|
||||||
|
if(command.endsWith(" ")) c.add("");
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<ForgeWorldType> event) {
|
||||||
|
INSTANCE.logger().info("Registering level types...");
|
||||||
|
event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void register(RegistryEvent.Register<Biome> 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<Feature<?>> event) {
|
||||||
|
event.getRegistry().register(TerraForgePlugin.POPULATOR_FEATURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user