- fix logic for loading generator settings
- start support on external datapack support - add command to save the current TF worlds gen settings as defaults - support mushroom fields as a beach biome - register custom arg types to support command completion on servers
This commit is contained in:
parent
69be3a17f6
commit
2375a2b7fc
@ -27,9 +27,11 @@ package com.terraforged.mod;
|
|||||||
|
|
||||||
import com.terraforged.api.material.WGTags;
|
import com.terraforged.api.material.WGTags;
|
||||||
import com.terraforged.feature.FeatureManager;
|
import com.terraforged.feature.FeatureManager;
|
||||||
|
import com.terraforged.mod.command.TerraCommand;
|
||||||
import com.terraforged.mod.data.DataGen;
|
import com.terraforged.mod.data.DataGen;
|
||||||
import com.terraforged.mod.feature.feature.DiskFeature;
|
import com.terraforged.mod.feature.feature.DiskFeature;
|
||||||
import com.terraforged.mod.feature.tree.SaplingManager;
|
import com.terraforged.mod.feature.tree.SaplingManager;
|
||||||
|
import com.terraforged.mod.util.DataPackFinder;
|
||||||
import com.terraforged.mod.util.Environment;
|
import com.terraforged.mod.util.Environment;
|
||||||
import net.minecraft.world.biome.Biomes;
|
import net.minecraft.world.biome.Biomes;
|
||||||
import net.minecraft.world.gen.feature.Feature;
|
import net.minecraft.world.gen.feature.Feature;
|
||||||
@ -39,6 +41,9 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
|
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
|
||||||
|
import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author <dags@dags.me>
|
* Author <dags@dags.me>
|
||||||
@ -53,6 +58,7 @@ public class TerraForgedMod {
|
|||||||
WGTags.init();
|
WGTags.init();
|
||||||
TerraWorld.init();
|
TerraWorld.init();
|
||||||
SaplingManager.init();
|
SaplingManager.init();
|
||||||
|
TerraCommand.init();
|
||||||
|
|
||||||
// temp fix
|
// temp fix
|
||||||
BiomeDictionary.addTypes(Biomes.BAMBOO_JUNGLE, BiomeDictionary.Type.OVERWORLD);
|
BiomeDictionary.addTypes(Biomes.BAMBOO_JUNGLE, BiomeDictionary.Type.OVERWORLD);
|
||||||
@ -71,4 +77,15 @@ public class TerraForgedMod {
|
|||||||
FeatureManager.registerTemplates(event);
|
FeatureManager.registerTemplates(event);
|
||||||
event.getRegistry().register(DiskFeature.INSTANCE);
|
event.getRegistry().register(DiskFeature.INSTANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||||
|
public static class ForgeEvents {
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void serverStart(FMLServerAboutToStartEvent event) {
|
||||||
|
Log.info("Adding DataPackFinder");
|
||||||
|
File dir = event.getServer().getFile("config/terraforged/datapacks");
|
||||||
|
DataPackFinder dataPackFinder = new DataPackFinder(dir);
|
||||||
|
event.getServer().getResourcePacks().addPackFinder(dataPackFinder);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ import com.terraforged.mod.chunk.test.TestChunkGenerator;
|
|||||||
import com.terraforged.mod.gui.SettingsScreen;
|
import com.terraforged.mod.gui.SettingsScreen;
|
||||||
import com.terraforged.mod.settings.SettingsHelper;
|
import com.terraforged.mod.settings.SettingsHelper;
|
||||||
import com.terraforged.mod.settings.TerraSettings;
|
import com.terraforged.mod.settings.TerraSettings;
|
||||||
|
import com.terraforged.mod.util.Environment;
|
||||||
import com.terraforged.mod.util.nbt.NBTHelper;
|
import com.terraforged.mod.util.nbt.NBTHelper;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.screen.CreateWorldScreen;
|
import net.minecraft.client.gui.screen.CreateWorldScreen;
|
||||||
@ -52,11 +53,9 @@ import java.util.HashSet;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class TerraWorld extends WorldType {
|
public class TerraWorld extends WorldType {
|
||||||
public static final int VERSION = 1;
|
|
||||||
|
|
||||||
|
public static final int VERSION = 1;
|
||||||
private static final Set<WorldType> types = new HashSet<>();
|
private static final Set<WorldType> types = new HashSet<>();
|
||||||
public static final TerraWorld TERRA = new TerraWorld("terraforged", TerraChunkGenerator::new);
|
|
||||||
public static final TerraWorld TEST = new TerraWorld("terratest", TestChunkGenerator::new);
|
|
||||||
|
|
||||||
private final ChunkGeneratorFactory<?> factory;
|
private final ChunkGeneratorFactory<?> factory;
|
||||||
|
|
||||||
@ -113,7 +112,12 @@ public class TerraWorld extends WorldType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void init() {
|
public static void init() {
|
||||||
Log.info("Registered world type(s)");
|
Log.info("Registered world type");
|
||||||
|
new TerraWorld("terraforged", TerraChunkGenerator::new);
|
||||||
|
if (Environment.isDev()) {
|
||||||
|
Log.info("Registered developer world type");
|
||||||
|
new TerraWorld("terratest", TestChunkGenerator::new);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTerraWorld(IWorld world) {
|
public static boolean isTerraWorld(IWorld world) {
|
||||||
|
@ -84,7 +84,7 @@ public interface BiomePredicate {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BiomePredicate COAST = type(Biome.Category.BEACH);
|
BiomePredicate COAST = type(Biome.Category.BEACH, Biome.Category.MUSHROOM).or(name("shore")).or(name("beach"));
|
||||||
BiomePredicate WETLAND = type(Biome.Category.SWAMP);
|
BiomePredicate WETLAND = type(Biome.Category.SWAMP);
|
||||||
BiomePredicate DESERT = type(Biome.Category.DESERT).or(temp(0.9, 2).and(rain(-1, 0.2)));
|
BiomePredicate DESERT = type(Biome.Category.DESERT).or(temp(0.9, 2).and(rain(-1, 0.2)));
|
||||||
BiomePredicate SAVANNA = type(Biome.Category.SAVANNA).or(temp(0.8, 2).and(rain(-1, 0.4)));
|
BiomePredicate SAVANNA = type(Biome.Category.SAVANNA).or(temp(0.8, 2).and(rain(-1, 0.4)));
|
||||||
|
@ -87,23 +87,19 @@ public class BiomeHelper {
|
|||||||
weight = 5;
|
weight = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getCategory() == Biome.Category.MUSHROOM) {
|
|
||||||
weight = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't use BiomeDictionary with transient biomes
|
// don't use BiomeDictionary with transient biomes
|
||||||
if (ForgeRegistries.BIOMES.containsKey(biome.getRegistryName())) {
|
if (ForgeRegistries.BIOMES.containsKey(biome.getRegistryName())) {
|
||||||
if (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.RARE)) {
|
if (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.RARE)) {
|
||||||
weight = 1;
|
weight = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getCategory() == Biome.Category.OCEAN) {
|
if (BiomePredicate.COAST.test(data)) {
|
||||||
|
builder.addBeach(biome, weight);
|
||||||
|
} else if (biome.getCategory() == Biome.Category.OCEAN) {
|
||||||
builder.addOcean(biome, weight);
|
builder.addOcean(biome, weight);
|
||||||
} else if (biome.getCategory() == Biome.Category.RIVER) {
|
} else if (biome.getCategory() == Biome.Category.RIVER) {
|
||||||
builder.addRiver(biome, weight);
|
builder.addRiver(biome, weight);
|
||||||
} else if (biome.getCategory() == Biome.Category.BEACH || biome == Biomes.STONE_SHORE) {
|
|
||||||
builder.addBeach(biome, weight);
|
|
||||||
} else if (biome.getCategory() == Biome.Category.SWAMP) {
|
} else if (biome.getCategory() == Biome.Category.SWAMP) {
|
||||||
builder.addWetland(biome, weight);
|
builder.addWetland(biome, weight);
|
||||||
} else {
|
} else {
|
||||||
|
@ -49,6 +49,8 @@ import com.terraforged.mod.data.DataGen;
|
|||||||
import com.terraforged.mod.settings.SettingsHelper;
|
import com.terraforged.mod.settings.SettingsHelper;
|
||||||
import net.minecraft.command.CommandSource;
|
import net.minecraft.command.CommandSource;
|
||||||
import net.minecraft.command.Commands;
|
import net.minecraft.command.Commands;
|
||||||
|
import net.minecraft.command.arguments.ArgumentSerializer;
|
||||||
|
import net.minecraft.command.arguments.ArgumentTypes;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
@ -77,8 +79,13 @@ import java.util.function.Supplier;
|
|||||||
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
|
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE)
|
||||||
public class TerraCommand {
|
public class TerraCommand {
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
ArgumentTypes.register("terraforged:biome", BiomeArgType.class, new ArgumentSerializer<>(BiomeArgType::new));
|
||||||
|
ArgumentTypes.register("terraforged:terrain", TerrainArgType.class, new ArgumentSerializer<>(TerrainArgType::new));
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void start(FMLServerStartingEvent event) {
|
public static void register(FMLServerStartingEvent event) {
|
||||||
Log.info("Registering /terra command");
|
Log.info("Registering /terra command");
|
||||||
register(event.getCommandDispatcher());
|
register(event.getCommandDispatcher());
|
||||||
}
|
}
|
||||||
@ -165,7 +172,7 @@ public class TerraCommand {
|
|||||||
|
|
||||||
context.getSource().sendFeedback(new StringTextComponent(
|
context.getSource().sendFeedback(new StringTextComponent(
|
||||||
"Actual Biome = " + actual.getRegistryName()
|
"Actual Biome = " + actual.getRegistryName()
|
||||||
+ "\nLookup Biome = " + biome2.getRegistryName()),
|
+ "\nLookup Biome = " + biome2.getRegistryName()),
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public class BiomeArgType implements ArgumentType<Biome> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder suggestions) {
|
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder suggestions) {
|
||||||
return ISuggestionProvider.func_212476_a(ForgeRegistries.BIOMES.getValues().stream().map(Biome::getRegistryName), suggestions);
|
return ISuggestionProvider.suggestIterable(ForgeRegistries.BIOMES.getKeys(), suggestions);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CommandSyntaxException createException(String type, String message, Object... args) {
|
private static CommandSyntaxException createException(String type, String message, Object... args) {
|
||||||
|
@ -74,18 +74,20 @@ public class SettingsHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static TerraSettings getSettings(IWorld world) {
|
public static TerraSettings getSettings(IWorld world) {
|
||||||
try (Reader reader = new BufferedReader(new FileReader(new File("config", SETTINGS_FILE_NAME)))) {
|
|
||||||
Log.info("Loading generator settings from json");
|
|
||||||
return new Gson().fromJson(reader, TerraSettings.class);
|
|
||||||
} catch (Throwable ignored) {
|
|
||||||
return getSettings(world.getWorldInfo());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TerraSettings getSettings(WorldInfo info) {
|
|
||||||
TerraSettings settings = new TerraSettings();
|
TerraSettings settings = new TerraSettings();
|
||||||
if (!info.getGeneratorOptions().isEmpty()) {
|
if (world.getWorldInfo().getGeneratorOptions().isEmpty()) {
|
||||||
NBTHelper.deserialize(info.getGeneratorOptions(), settings);
|
File defaults = new File("config", SETTINGS_FILE_NAME);
|
||||||
|
if (defaults.exists()) {
|
||||||
|
try (Reader reader = new BufferedReader(new FileReader(defaults))) {
|
||||||
|
Log.info("Loading generator settings from json");
|
||||||
|
return new Gson().fromJson(reader, TerraSettings.class);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.info("Loading generator settings from level.dat");
|
||||||
|
NBTHelper.deserialize(world.getWorldInfo().getGeneratorOptions(), settings);
|
||||||
}
|
}
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.terraforged.mod.util;
|
||||||
|
|
||||||
|
import com.terraforged.mod.Log;
|
||||||
|
import net.minecraft.resources.FolderPackFinder;
|
||||||
|
import net.minecraft.resources.ResourcePackInfo;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class DataPackFinder extends FolderPackFinder {
|
||||||
|
|
||||||
|
public DataPackFinder(File folderIn) {
|
||||||
|
super(folderIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends ResourcePackInfo> void addPackInfosToMap(Map<String, T> map, ResourcePackInfo.IFactory<T> factory) {
|
||||||
|
int start = map.size();
|
||||||
|
super.addPackInfosToMap(map, factory);
|
||||||
|
Log.info("Found {} datapacks", map.size() - start);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user