diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 9726fe23..5df06e7d 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,11 +3,13 @@ package ru.betterend; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndPotions; +import ru.betterend.events.PlayerAdvancementsEvents; import ru.betterend.integration.Integrations; import ru.betterend.item.GuideBookItem; import ru.betterend.recipe.AlloyingRecipes; @@ -67,6 +69,15 @@ public class BetterEnd implements ModInitializer { FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Configs.saveConfigs(); + + if (hasGuideBook()) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.register((player, advancement, criterionName) -> { + Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); + if (advId.equals(advancement.getId())) { + player.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); + } + }); + } } public static boolean hasGuideBook() { diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java new file mode 100644 index 00000000..7a90891e --- /dev/null +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsEvents.java @@ -0,0 +1,19 @@ +package ru.betterend.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.advancement.Advancement; +import net.minecraft.server.network.ServerPlayerEntity; + +public final class PlayerAdvancementsEvents { + + public static Event PLAYER_ADVENCEMENT_COMPLETE = EventFactory.createArrayBacked(AdvancementComplete.class, callbacks -> (player, advancement, criterionName) -> { + for (AdvancementComplete event : callbacks) { + event.onAdvancementComplete(player, advancement, criterionName); + } + }); + + public interface AdvancementComplete { + void onAdvancementComplete(ServerPlayerEntity player, Advancement advancement, String criterionName); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java index 662a3293..43220b04 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementTrackerMixin.java @@ -9,11 +9,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.advancement.Advancement; import net.minecraft.advancement.PlayerAdvancementTracker; -import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import ru.betterend.BetterEnd; -import ru.betterend.item.GuideBookItem; + +import ru.betterend.events.PlayerAdvancementsEvents; @Mixin(PlayerAdvancementTracker.class) public abstract class PlayerAdvancementTrackerMixin { @@ -25,10 +23,7 @@ public abstract class PlayerAdvancementTrackerMixin { value = "INVOKE", target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V", shift = Shift.AFTER)) - public void grantBonuses(Advancement advancement, String criterionName, CallbackInfoReturnable info) { - Identifier advId = new Identifier("minecraft:end/enter_end_gateway"); - if (BetterEnd.hasGuideBook() && advId.equals(advancement.getId())) { - this.owner.giveItemStack(new ItemStack(GuideBookItem.GUIDE_BOOK)); - } + public void be_onAdvancementComplete(Advancement advancement, String criterionName, CallbackInfoReturnable info) { + PlayerAdvancementsEvents.PLAYER_ADVENCEMENT_COMPLETE.invoker().onAdvancementComplete(owner, advancement, criterionName); } }