diff --git a/src/main/java/com/minelittlepony/unicopia/advancement/AbstractRepeatingCriterion.java b/src/main/java/com/minelittlepony/unicopia/advancement/AbstractRepeatingCriterion.java index 1003094b..c0851828 100644 --- a/src/main/java/com/minelittlepony/unicopia/advancement/AbstractRepeatingCriterion.java +++ b/src/main/java/com/minelittlepony/unicopia/advancement/AbstractRepeatingCriterion.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiPredicate; +import java.util.function.Predicate; + import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.advancement.PlayerAdvancementTracker; @@ -40,7 +42,7 @@ public abstract class AbstractRepeatingCriterion predicate) { + protected void trigger(ServerPlayerEntity player, Predicate shouldCount, BiPredicate predicate) { PlayerAdvancementTracker tracker = player.getAdvancementTracker(); TriggerCountTracker counter = Pony.of(player).getAdvancementProgress(); counter.removeGranted(player, tracker); @@ -52,7 +54,7 @@ public abstract class AbstractRepeatingCriterion { if (player instanceof ServerPlayerEntity p) { - trigger(p, (count, condition) -> condition.test(name, count, p)); + trigger(p, + condition -> condition.event().equalsIgnoreCase(name), + (count, condition) -> condition.test(count, p) + ); } }; } @@ -64,12 +67,11 @@ public class CustomEventCriterion extends AbstractRepeatingCriterion counterCallback) { if (player instanceof ServerPlayerEntity spe) { - trigger(spe, (count, c) -> { - if (c.test(spe, payload, recipient, false)) { - c.counter.ifPresent(counter -> { - counterCallback.accept(counter, count); - }); - return true; - } - return false; + trigger(spe, c -> c.test(spe, payload, recipient, false), (count, c) -> { + c.counter.ifPresent(counter -> counterCallback.accept(counter, count)); + return true; }); } } public void triggerReceived(LivingEntity recipient, ItemStack payload) { if (recipient instanceof ServerPlayerEntity spe) { - trigger(spe, (count, c) -> c.test(spe, payload, recipient.getDisplayName().getString(), true)); + trigger(spe, c -> c.test(spe, payload, recipient.getDisplayName().getString(), true), (count, c) -> true); } } diff --git a/src/main/java/com/minelittlepony/unicopia/advancement/TriggerCountTracker.java b/src/main/java/com/minelittlepony/unicopia/advancement/TriggerCountTracker.java index 660cf013..9a159d75 100644 --- a/src/main/java/com/minelittlepony/unicopia/advancement/TriggerCountTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/advancement/TriggerCountTracker.java @@ -1,13 +1,13 @@ package com.minelittlepony.unicopia.advancement; +import java.util.HashMap; import java.util.Map; +import java.util.function.Function; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.util.Copyable; import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; - import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.advancement.AdvancementEntry; @@ -16,22 +16,25 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; public class TriggerCountTracker implements Copyable { - public static final Codec CODEC = Codec.unboundedMap(Key.CODEC, Codec.INT).xmap(TriggerCountTracker::new, tracker -> tracker.entries); + public static final Codec CODEC = Codec.unboundedMap( + Identifier.CODEC, + Codec.unboundedMap(Codec.STRING, Codec.INT).xmap(i -> (Object2IntMap)new Object2IntOpenHashMap<>(i), Function.identity()) + ).xmap(TriggerCountTracker::new, tracker -> tracker.entries); - private final Object2IntMap entries = new Object2IntOpenHashMap<>(); + private final Map> entries = new HashMap<>(); - public TriggerCountTracker(Map entries) { + public TriggerCountTracker(Map> entries) { this.entries.putAll(entries); } public int update(AdvancementEntry advancement, String criterionName) { - return entries.computeInt(new Key(advancement.id(), criterionName), (key, initial) -> (initial == null ? 0 : initial) + 1); + return entries.computeIfAbsent(advancement.id(), id -> new Object2IntOpenHashMap<>()).computeInt(criterionName, (key, initial) -> (initial == null ? 0 : initial) + 1); } public void removeGranted(ServerPlayerEntity player, PlayerAdvancementTracker tracker) { - entries.keySet().removeIf(key -> { + entries.entrySet().removeIf(entry -> { @Nullable - AdvancementEntry a = player.getServer().getAdvancementLoader().get(key.advancement()); + AdvancementEntry a = player.getServer().getAdvancementLoader().get(entry.getKey()); return a == null || tracker.getProgress(a).isDone(); }); } @@ -41,19 +44,4 @@ public class TriggerCountTracker implements Copyable { entries.clear(); entries.putAll(other.entries); } - - record Key(Identifier advancement, String criterion) { - public static final Codec CODEC = Codec.STRING.flatXmap(s -> { - String[] parts = s.split(":"); - return parts.length == 3 - ? DataResult.success(new Key(Identifier.of(parts[0], parts[1]), parts[2])) - : DataResult.error(() -> "String '" + s + "' was in the wrong format"); - }, key -> DataResult.success(key.toString())); - - @Override - public String toString() { - return advancement.toString() + ":" + criterion; - } - } - }