From 0da0d13c3dc8426b18a55107b42986e9d66387f1 Mon Sep 17 00:00:00 2001 From: dags- Date: Thu, 30 Apr 2020 11:59:27 +0100 Subject: [PATCH] - tweak feature debugger and catch any exceptions thrown during debugging --- .../feature/util/FeatureDebugger.java | 49 ++++-- .../feature/util/FeatureException.java | 155 ------------------ 2 files changed, 39 insertions(+), 165 deletions(-) delete mode 100644 src/main/java/com/terraforged/feature/util/FeatureException.java diff --git a/src/main/java/com/terraforged/feature/util/FeatureDebugger.java b/src/main/java/com/terraforged/feature/util/FeatureDebugger.java index 2fdbbc3..b129b6e 100644 --- a/src/main/java/com/terraforged/feature/util/FeatureDebugger.java +++ b/src/main/java/com/terraforged/feature/util/FeatureDebugger.java @@ -20,11 +20,23 @@ public class FeatureDebugger { public static List getErrors(ConfiguredFeature feature) { List errors = new ArrayList<>(); - checkConfiguredFeature(feature, errors); + try { + checkConfiguredFeature(feature, errors); + } catch (Throwable t) { + errors.add( + "Exception thrown whilst debugging biome feature: " + feature + " (this is bad)" + + "\nError message:" + + "\n" + t.getMessage() + ); + } return errors; } private static void checkConfiguredFeature(ConfiguredFeature feature, List errors) { + if (!isValid(feature, errors)) { + return; + } + if (feature.config instanceof DecoratedFeatureConfig) { decorated((DecoratedFeatureConfig) feature.config, errors); return; @@ -50,14 +62,11 @@ private static void checkConfiguredFeature(ConfiguredFeature feature, List multiChance((MultipleWithChanceRandomFeatureConfig) feature.config, errors); return; } - - checkFeature(feature.feature, errors); - checkConfig(feature.config, errors); } private static void decorated(DecoratedFeatureConfig config, List errors) { checkConfiguredFeature(config.feature, errors); - checkDecorator(config.decorator, errors); + isValid(config.decorator, errors); } private static void single(SingleRandomFeature config, List errors) { @@ -83,47 +92,67 @@ private static void multiChance(MultipleWithChanceRandomFeatureConfig config, Li } } - private static void checkFeature(Feature feature, List list) { + private static boolean isValid(ConfiguredFeature feature, List list) { + if (feature == null) { + list.add("null configured feature (this is bad! D: )"); + return false; + } + return isValid(feature.feature, list) && isValid(feature.config, list); + } + + private static boolean isValid(Feature feature, List list) { if (feature == null) { list.add("null feature"); + return false; } else if (!ForgeRegistries.FEATURES.containsValue(feature)) { list.add("unregistered feature: " + feature.getClass().getName()); + return false; } + return true; } - private static void checkConfig(IFeatureConfig config, List list) { + private static boolean isValid(IFeatureConfig config, List list) { if (config == null) { list.add("null config"); - return; + return false; } try { config.serialize(JsonOps.INSTANCE); + return true; } catch (Throwable t) { list.add("config: " + config.getClass().getName() + ", error: " + t.getMessage()); + return false; } } - private static void checkDecorator(ConfiguredPlacement decorator, List list) { + private static boolean isValid(ConfiguredPlacement decorator, List list) { if (decorator == null) { list.add("null configured placement"); - return; + return false; } + boolean valid = true; if (decorator.decorator == null) { list.add("null placement"); + valid = false; } else if (!ForgeRegistries.DECORATORS.containsValue(decorator.decorator)) { list.add("unregistered placement: " + decorator.decorator.getClass().getName()); + valid = false; } if (decorator.config == null) { list.add("null decorator config"); + valid = false; } else { try { decorator.config.serialize(JsonOps.INSTANCE); } catch (Throwable t) { + valid = false; list.add("placement config: " + decorator.config.getClass().getName() + ", error: " + t.getMessage()); } } + + return valid; } } diff --git a/src/main/java/com/terraforged/feature/util/FeatureException.java b/src/main/java/com/terraforged/feature/util/FeatureException.java deleted file mode 100644 index 9ca133b..0000000 --- a/src/main/java/com/terraforged/feature/util/FeatureException.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * - * MIT License - * - * Copyright (c) 2020 TerraForged - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.terraforged.feature.util; - -import com.google.gson.JsonElement; -import com.mojang.datafixers.types.JsonOps; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredRandomFeatureList; -import net.minecraft.world.gen.feature.DecoratedFeatureConfig; -import net.minecraft.world.gen.feature.IFeatureConfig; -import net.minecraft.world.gen.feature.MultipleRandomFeatureConfig; -import net.minecraft.world.gen.feature.MultipleWithChanceRandomFeatureConfig; -import net.minecraft.world.gen.feature.SingleRandomFeature; -import net.minecraft.world.gen.feature.TwoFeatureChoiceConfig; - -public class FeatureException extends RuntimeException { - - public FeatureException(ConfiguredFeature feature, Throwable t) { - super(feature(feature), t); - } - - public FeatureException(JsonElement element, Throwable t) { - super(element(element), t); - } - - public static String getName(ConfiguredFeature feature) { - StringBuilder sb = new StringBuilder(256); - toString(feature, sb); - return sb.toString(); - } - - private static String feature(ConfiguredFeature feature) { - StringBuilder sb = new StringBuilder(256); - toString(feature, sb); - return String.format("Failed to serialize Feature: %s", sb.toString()); - } - - private static String element(JsonElement element) { - return String.format("Failed to deserialize Feature data: %s", element); - } - - private static void toString(ConfiguredFeature feature, StringBuilder sb) { - if (feature.config instanceof DecoratedFeatureConfig) { - decorated((DecoratedFeatureConfig) feature.config, sb); - return; - } - - // note SingleRandomFeature & SingleRandomFeatureConfig names a mixed up - if (feature.config instanceof SingleRandomFeature) { - single((SingleRandomFeature) feature.config, sb); - return; - } - - if (feature.config instanceof TwoFeatureChoiceConfig) { - twoChoice((TwoFeatureChoiceConfig) feature.config, sb); - return; - } - - if (feature.config instanceof MultipleRandomFeatureConfig) { - multi((MultipleRandomFeatureConfig) feature.config, sb); - return; - } - - if (feature.config instanceof MultipleWithChanceRandomFeatureConfig) { - multiChance((MultipleWithChanceRandomFeatureConfig) feature.config, sb); - return; - } - - sb.append(feature.feature.getRegistryName()); - sb.append('(').append(config(feature.config)).append(')'); - } - - private static void decorated(DecoratedFeatureConfig config, StringBuilder sb) { - sb.append("Decorated{"); - toString(config.feature, sb); - sb.append("}"); - } - - private static void single(SingleRandomFeature config, StringBuilder sb) { - sb.append("Single["); - for (ConfiguredFeature feature : config.features) { - toString(feature, sb); - } - sb.append("]"); - } - - private static void twoChoice(TwoFeatureChoiceConfig config, StringBuilder sb) { - sb.append("Choice{"); - { - sb.append("a={"); - toString(config.field_227285_a_, sb); - sb.append("},b={"); - toString(config.field_227286_b_, sb); - sb.append("}"); - } - sb.append("}"); - } - - private static void multi(MultipleRandomFeatureConfig config, StringBuilder sb) { - sb.append("Multi["); - int start = sb.length(); - for (ConfiguredRandomFeatureList feature : config.features) { - comma(sb, start); - toString(feature.feature, sb); - } - sb.append("]"); - } - - private static void multiChance(MultipleWithChanceRandomFeatureConfig config, StringBuilder sb) { - sb.append("Chance["); - int start = sb.length(); - for (ConfiguredFeature feature : config.features) { - comma(sb, start); - toString(feature, sb); - } - sb.append("]"); - } - - private static void comma(StringBuilder sb, int len) { - if (sb.length() > len) { - sb.append(','); - } - } - - private static String config(IFeatureConfig config) { - try { - return config.serialize(JsonOps.INSTANCE).getValue().toString(); - } catch (Throwable t) { - return config + ""; - } - } -}