diff --git a/src/main/java/eu/pb4/ouch/DamageDisplayLogic.java b/src/main/java/eu/pb4/ouch/DamageDisplayLogic.java index 8a017d9..e4c4c9f 100644 --- a/src/main/java/eu/pb4/ouch/DamageDisplayLogic.java +++ b/src/main/java/eu/pb4/ouch/DamageDisplayLogic.java @@ -1,8 +1,8 @@ package eu.pb4.ouch; -import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import eu.pb4.ouch.api.DefaultDisplayEvents; import eu.pb4.placeholders.api.ParserContext; import eu.pb4.placeholders.api.PlaceholderContext; import eu.pb4.placeholders.api.parsers.NodeParser; @@ -20,16 +20,11 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.entry.RegistryEntryList; -import net.minecraft.registry.entry.RegistryEntryListCodec; import net.minecraft.registry.tag.TagKey; import net.minecraft.text.Text; -import net.minecraft.util.dynamic.Codecs; import net.minecraft.util.math.MathHelper; -import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; @@ -87,7 +82,7 @@ public static DamageDisplayLogic of(RegistryWrapper.WrapperLookup wrapper, Regis BuiltinPredicates.alwaysTrue(), BuiltinPredicates.alwaysTrue(), 1, - WrappedText.from(PARSER, format), + WrappedText.from(PARSER, DefaultDisplayEvents.MODIFY_DISPLAY_LOGIC.invoker().modify(wrapper, List.of(type), format)), FloatingText.DisplaySettings.GENERAL ); } @@ -97,7 +92,7 @@ public static DamageDisplayLogic of(RegistryWrapper.WrapperLookup wrapper, List< BuiltinPredicates.alwaysTrue(), BuiltinPredicates.alwaysTrue(), 1, - WrappedText.from(PARSER, format), + WrappedText.from(PARSER, DefaultDisplayEvents.MODIFY_DISPLAY_LOGIC.invoker().modify(wrapper, type, format)), FloatingText.DisplaySettings.GENERAL ); } diff --git a/src/main/java/eu/pb4/ouch/DeathDisplayLogic.java b/src/main/java/eu/pb4/ouch/DeathDisplayLogic.java index 5d61ed4..ead03bf 100644 --- a/src/main/java/eu/pb4/ouch/DeathDisplayLogic.java +++ b/src/main/java/eu/pb4/ouch/DeathDisplayLogic.java @@ -1,6 +1,5 @@ package eu.pb4.ouch; -import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import eu.pb4.placeholders.api.ParserContext; @@ -21,11 +20,8 @@ import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.registry.tag.TagKey; import net.minecraft.text.Text; -import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; diff --git a/src/main/java/eu/pb4/ouch/DefaultDisplay.java b/src/main/java/eu/pb4/ouch/DefaultDisplay.java index be54710..99cabd3 100644 --- a/src/main/java/eu/pb4/ouch/DefaultDisplay.java +++ b/src/main/java/eu/pb4/ouch/DefaultDisplay.java @@ -1,9 +1,13 @@ package eu.pb4.ouch; +import eu.pb4.ouch.api.DefaultDisplayEvents; import eu.pb4.predicate.api.BuiltinPredicates; +import net.minecraft.entity.damage.DamageType; import net.minecraft.entity.damage.DamageTypes; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.tag.DamageTypeTags; +import net.minecraft.util.Pair; import java.util.ArrayList; import java.util.List; @@ -42,6 +46,10 @@ static void createDefault(List damage, List-${value}")); heal.add(HealDisplayLogic.of("<#00FF00>+${value}")); + + LogicsImpl logics = new LogicsImpl(); + DefaultDisplayEvents.APPEND_DISPLAY_LOGIC.invoker().append(lookup, logics); + logics.getLogics().forEach(pair -> damage.add(DamageDisplayLogic.of(lookup, pair.getLeft(), pair.getRight()))); } static void createShowcase(List damage, List heal, List death, @@ -51,4 +59,19 @@ static void createShowcase(List damage, List${message}")); damageExtra.add(DamageDisplayLogic.of(0.03f, BuiltinPredicates.alwaysTrue(), "Ouch!")); } + + class LogicsImpl implements DefaultDisplayEvents.AppendDisplayLogic.Logics { + + final List>, String>> logics = new ArrayList<>(); + + @Override + @SafeVarargs + public final void add(String format, RegistryKey... types) { + this.logics.add(new Pair<>(List.of(types), format)); + } + + List>, String>> getLogics() { + return this.logics; + } + } } diff --git a/src/main/java/eu/pb4/ouch/api/DefaultDisplayEvents.java b/src/main/java/eu/pb4/ouch/api/DefaultDisplayEvents.java new file mode 100644 index 0000000..5c122f5 --- /dev/null +++ b/src/main/java/eu/pb4/ouch/api/DefaultDisplayEvents.java @@ -0,0 +1,75 @@ +package eu.pb4.ouch.api; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.entity.damage.DamageType; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryWrapper; +import org.jetbrains.annotations.ApiStatus; + +import java.util.List; + +public final class DefaultDisplayEvents { + + /** + * This event allows to append a format applied on one or more {@link DamageType} for the default configuration. + * Example: + *
+	 * {@code
+	 *  DefaultDisplayEvents.APPEND_DISPLAY_LOGIC.register((lookup, logics) -> {
+	 *      logics.add(firstDamageFormat, firstDamageTypes...);
+	 *      logics.add(secondDamageFormat, secondDamageTypes...);
+	 *      logics.add(thirdDamageFormat, thirdDamageTypes...);
+	 *      return logics;
+	 *  });
+	 * }
+	 * 
+ */ + public static final Event APPEND_DISPLAY_LOGIC = EventFactory.createArrayBacked(AppendDisplayLogic.class, callbacks -> (lookup, _logics) -> { + AppendDisplayLogic.Logics logics = _logics; + for (AppendDisplayLogic callback : callbacks) { + logics = callback.append(lookup, logics); + } + return logics; + }); + + /** + * This event allows to modify a format applied on one or more {@link DamageType} for the default configuration. + * Example: + *
+	 * {@code
+	 *  DefaultDisplayEvents.MODIFY_DISPLAY_LOGIC.register((lookup, types, format) -> {
+	 *      if (types.contains(DamageTypes.OUT_OF_WORLD)) {
+	 *          return yourModifiedFormat;
+	 *      }
+	 *      return format;
+	 *  });
+	 * }
+	 * 
+ */ + public static final Event MODIFY_DISPLAY_LOGIC = EventFactory.createArrayBacked(ModifyDisplayLogic.class, callbacks -> (lookup, types, _format) -> { + String format = _format; + for (ModifyDisplayLogic callback : callbacks) { + format = callback.modify(lookup, types, format); + } + return format; + }); + + @FunctionalInterface + public interface AppendDisplayLogic { + + Logics append(RegistryWrapper.WrapperLookup lookup, Logics logics); + + @ApiStatus.NonExtendable + interface Logics { + + void add(String format, RegistryKey... types); + } + } + + @FunctionalInterface + public interface ModifyDisplayLogic { + + String modify(RegistryWrapper.WrapperLookup lookup, List> types, String format); + } +}