Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Validation for Data Json Files with feedback to the end user. #218

Merged
merged 20 commits into from
Jun 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file removed logs/debug.log
Empty file.
Empty file removed logs/latest.log
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
package com.ridanisaurus.emendatusenigmatica;

import com.ridanisaurus.emendatusenigmatica.config.EEConfig;
import com.ridanisaurus.emendatusenigmatica.core.mixin.OreVeinifierMixin;
import com.ridanisaurus.emendatusenigmatica.datagen.base.DataGeneratorFactory;
import com.ridanisaurus.emendatusenigmatica.datagen.base.EEPackFinder;
import com.ridanisaurus.emendatusenigmatica.loader.EELoader;
Expand All @@ -43,13 +42,13 @@
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import org.jetbrains.annotations.NotNull;

// The value here should match an entry in the META-INF/mods.toml file
@Mod(Reference.MOD_ID)
Expand All @@ -71,6 +70,7 @@ public static EmendatusEnigmatica getInstance() {
public EmendatusEnigmatica() {
EmendatusEnigmatica.instance = this;
EEConfig.registerClient();
EEConfig.setupCommon();

// Register Deferred Registers and populate their tables once the mod is done constructing
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
Expand Down Expand Up @@ -102,7 +102,7 @@ private void commonEvents(FMLCommonSetupEvent event) {

public static final CreativeModeTab TAB = new CreativeModeTab("emendatusenigmatica") {
@Override
public ItemStack makeIcon() {
public @NotNull ItemStack makeIcon() {
return new ItemStack(EERegistrar.ENIGMATIC_HAMMER.get());
}
};
Expand All @@ -113,14 +113,20 @@ private static void registerDataGen() {
EmendatusEnigmatica.getInstance().getLoader().datagen(generator);
}

public static void generate() {
public static void generate() {
if (!hasGenerated) {
try {
if(generator == null)
registerDataGen();
generator.run();
} catch (IOException e) {
e.printStackTrace();
if(generator == null) registerDataGen();
if (!ModLoader.isLoadingStateValid()) {
LOGGER.error("Loading state is invalid! Aborting running Data Generation to avoid even more issues.");
return;
}
generator.run();
} catch (Throwable e) {
LOGGER.error("Exception caught while running data generation!", e);
if (ModLoader.isLoadingStateValid()) throw new RuntimeException(e);
LOGGER.error("It was probably caused by another mod crashing before Data Generation, as LoadingState is already invalid!");
return;
}
hasGenerated = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.ridanisaurus.emendatusenigmatica.loader.parser.model.CompatModel;
import com.ridanisaurus.emendatusenigmatica.loader.parser.model.MaterialModel;
import com.ridanisaurus.emendatusenigmatica.loader.parser.model.StrataModel;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashMap;
Expand All @@ -29,10 +30,25 @@ public EmendatusDataRegistry() {
this.strataByIndex = new HashMap<>();
}

/**
* Used to register new Material model, returning passed defaultModel or previous value under that id.
* @param material ID of the material.
* @param defaultModel MaterialModel to register under that id.
* @return MaterialModel passed to the argument or previous MaterialModel that was registered under that id.
*/
public MaterialModel getMaterialOrRegister(String material, MaterialModel defaultModel){
return this.materials.computeIfAbsent(material, s -> defaultModel);
}

/**
* Used to get MaterialModel by its ID.
* @param materialID MaterialID to get model of.
* @return MaterialModel under that ID, or null if not registered.
*/
public @Nullable MaterialModel getMaterialByID(String materialID) {
return this.materials.get(materialID);
}

public void registerStrata(StrataModel strataModel){
this.strata.add(strataModel);
this.strataByIndex.put(strataModel.getFillerType().toString(), this.strata.size() - 1);
Expand All @@ -55,6 +71,10 @@ public List<CompatModel> getCompat() {
return ImmutableList.copyOf(compat);
}

/**
* Used to get Map with Strata Filler Types mapped to indexes of {@link EmendatusDataRegistry#strata} list.
* @return Map with mapping of Strata Filler Type -> Index of the model
*/
public Map<String, Integer> getStrataByIndex() {
return strataByIndex;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,66 @@

package com.ridanisaurus.emendatusenigmatica.config;

import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import com.ridanisaurus.emendatusenigmatica.EmendatusEnigmatica;
import com.ridanisaurus.emendatusenigmatica.util.Reference;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.config.ConfigFileTypeHandler;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.loading.FMLPaths;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;

import java.nio.file.Path;


public class EEConfig {
public static ClientConfig client;
public static CommonConfig common;

public static void registerClient() {
Pair<ClientConfig, ForgeConfigSpec> clientSpecPair = new ForgeConfigSpec.Builder().configure(ClientConfig::new);
client = clientSpecPair.getLeft();
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, clientSpecPair.getRight());
EmendatusEnigmatica.LOGGER.info("Emendatus Enigmatica Client Config has been registered.");
}

public static void setupCommon() {
Pair<CommonConfig, ForgeConfigSpec> commonSpecPair = new ForgeConfigSpec.Builder().configure(CommonConfig::new);
common = commonSpecPair.getLeft();
ForgeConfigSpec commonSpec = commonSpecPair.getRight();

try {
// Even tho this uses ModConfig object,
// which will be tracked for changes,
// there are no listeners for this config, so it's going to be fine.
CommentedFileConfig configData = new ConfigFileTypeHandler()
.reader(FMLPaths.CONFIGDIR.get())
.apply(new ModConfig(ModConfig.Type.COMMON, commonSpec, ModLoadingContext.get().getActiveContainer()));
commonSpec.setConfig(configData);
EmendatusEnigmatica.LOGGER.info("EmendatusEnigmatica Common Config has been parsed.");
} catch (Exception e) {
EmendatusEnigmatica.LOGGER.error("Failed parsing Common config!", e);
throw new IllegalStateException("Common Config for EmendatusEnigmatica wasn't possible to parse.", e);
}
}

public static class CommonConfig {
public final ForgeConfigSpec.BooleanValue logConfigErrors;
CommonConfig(ForgeConfigSpec.@NotNull Builder builder) {
builder.push("Debug");
logConfigErrors = builder
.comment("Whether EmendatusEnigmatica should log warnings and errors generated on the configuration parsing.")
.translation(Reference.MOD_ID + ".config.common.log_errors")
.define("logConfigErrors", true);
builder.pop();
}
}

public static class ClientConfig {
public final ForgeConfigSpec.BooleanValue showPatreonReward;
ClientConfig(ForgeConfigSpec.Builder builder) {
ClientConfig(ForgeConfigSpec.@NotNull Builder builder) {
builder.push("Patreon Reward");
showPatreonReward = builder
.comment("Whether the Patreon Reward should appear floating over the player's head")
Expand All @@ -44,12 +92,4 @@ public static class ClientConfig {
builder.pop();
}
}

public static void registerClient() {
Pair<ClientConfig, ForgeConfigSpec> clientSpecPair = new ForgeConfigSpec.Builder().configure(ClientConfig::new);
ForgeConfigSpec clientSpec = clientSpecPair.getRight();
client = clientSpecPair.getLeft();
ModLoadingContext.get().registerConfig(net.minecraftforge.fml.config.ModConfig.Type.CLIENT, clientSpec);
EmendatusEnigmatica.LOGGER.info("Emendatus Enigmatica Config has been parsed.");
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.ridanisaurus.emendatusenigmatica.core.mixin;

import com.ridanisaurus.emendatusenigmatica.EmendatusEnigmatica;
import com.ridanisaurus.emendatusenigmatica.api.EmendatusDataRegistry;
import com.ridanisaurus.emendatusenigmatica.loader.parser.model.MaterialModel;
import com.ridanisaurus.emendatusenigmatica.plugin.DefaultConfigPlugin;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.Blocks;
Expand All @@ -13,6 +14,8 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;

import java.util.Objects;

@Mixin(OreVeinifier.class)
public class OreVeinifierMixin {

Expand Down Expand Up @@ -48,16 +51,19 @@ protected static NoiseChunk.BlockStateFiller create(DensityFunction dFunction1,
if ((double)randomsource.nextFloat() < d3 && dFunction3.compute(filler) > (double)-0.3F) {
BlockState mixinRawOreBlock = oreveinifier$veintype.rawOreBlock;
BlockState mixinOreBlock = oreveinifier$veintype.ore;
for (MaterialModel material : DefaultConfigPlugin.MATERIALS) {
if (oreveinifier$veintype == OreVeinifier.VeinType.COPPER && material.getId().equals("copper") && material.getDisableDefaultOre()) {
mixinRawOreBlock = Blocks.STONE.defaultBlockState();
mixinOreBlock = Blocks.STONE.defaultBlockState();
}
if (oreveinifier$veintype == OreVeinifier.VeinType.IRON && material.getId().equals("iron") && material.getDisableDefaultOre()) {
mixinRawOreBlock = Blocks.DEEPSLATE.defaultBlockState();
mixinOreBlock = Blocks.DEEPSLATE.defaultBlockState();
}

EmendatusDataRegistry registry = EmendatusEnigmatica.getInstance().getLoader().getDataRegistry();
MaterialModel copper = registry.getMaterialByID("copper");
MaterialModel iron = registry.getMaterialByID("iron");

if (oreveinifier$veintype == OreVeinifier.VeinType.COPPER && Objects.nonNull(copper) && copper.getDisableDefaultOre()) {
mixinRawOreBlock = Blocks.STONE.defaultBlockState();
mixinOreBlock = Blocks.STONE.defaultBlockState();
} else if (oreveinifier$veintype == OreVeinifier.VeinType.IRON && Objects.nonNull(iron) && iron.getDisableDefaultOre()) {
mixinRawOreBlock = Blocks.DEEPSLATE.defaultBlockState();
mixinOreBlock = Blocks.DEEPSLATE.defaultBlockState();
}

return randomsource.nextFloat() < 0.02F ? mixinRawOreBlock : mixinOreBlock;
} else {
return oreveinifier$veintype.filler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,7 @@

package com.ridanisaurus.emendatusenigmatica.datagen;

import com.google.common.base.Suppliers;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import com.ridanisaurus.emendatusenigmatica.api.EmendatusDataRegistry;
import com.ridanisaurus.emendatusenigmatica.blocks.BasicWaxedBlock;
import com.ridanisaurus.emendatusenigmatica.loader.parser.model.MaterialModel;
import com.ridanisaurus.emendatusenigmatica.registries.EERegistrar;
import com.ridanisaurus.emendatusenigmatica.registries.EETags;
Expand All @@ -37,20 +33,16 @@
import net.minecraft.data.*;
import net.minecraft.data.recipes.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.HoneycombItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraftforge.common.Tags;
import net.minecraftforge.registries.ForgeRegistries;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class RecipesGen extends RecipeProvider {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,9 @@
import java.util.List;

public class EELoader {

public static final Logger LOADER_LOGGER = LogManager.getLogger(EELoader.class);
private final EmendatusDataRegistry dataRegistry;

private List<IEmendatusPlugin> plugins;
private final List<IEmendatusPlugin> plugins;

public EELoader() {
this.dataRegistry = new EmendatusDataRegistry();
Expand Down
Loading