diff --git a/src/main/java/io/gitlab/jfronny/libjf/data/ShulkerIllegalChecker.java b/src/main/java/io/gitlab/jfronny/libjf/data/ShulkerIllegalChecker.java deleted file mode 100644 index 30cc069..0000000 --- a/src/main/java/io/gitlab/jfronny/libjf/data/ShulkerIllegalChecker.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.gitlab.jfronny.libjf.data; - -import net.fabricmc.fabric.api.tag.TagRegistry; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import io.gitlab.jfronny.libjf.Libjf; - -public class ShulkerIllegalChecker { - public static Tag SHULKER_ILLEGAL = TagRegistry.item(new Identifier(Libjf.MOD_ID, "shulker_boxes_illegal")); - public static boolean isAllowed(ItemStack stack) { - //Tag - return !SHULKER_ILLEGAL.contains(stack.getItem()); - //Should be equal to - //!(stack.getItem() instanceof BackpackTrinket) && !(Block.getBlockFromItem(stack.getItem()) instanceof ShulkerBoxBlock); - } -} diff --git a/src/main/java/io/gitlab/jfronny/libjf/data/Tags.java b/src/main/java/io/gitlab/jfronny/libjf/data/Tags.java new file mode 100644 index 0000000..d085b2f --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/libjf/data/Tags.java @@ -0,0 +1,12 @@ +package io.gitlab.jfronny.libjf.data; + +import net.fabricmc.fabric.api.tag.TagFactory; +import net.minecraft.item.Item; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; +import io.gitlab.jfronny.libjf.Libjf; + +public class Tags { + public static Tag SHULKER_ILLEGAL = TagFactory.ITEM.create(new Identifier(Libjf.MOD_ID, "shulker_boxes_illegal")); + public static Tag OVERPOWERED = TagFactory.ITEM.create(new Identifier(Libjf.MOD_ID, "overpowered")); +} diff --git a/src/main/java/io/gitlab/jfronny/libjf/mixin/EntityMixin.java b/src/main/java/io/gitlab/jfronny/libjf/mixin/EntityMixin.java new file mode 100644 index 0000000..b4f82e7 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/libjf/mixin/EntityMixin.java @@ -0,0 +1,47 @@ +package io.gitlab.jfronny.libjf.mixin; + +import io.gitlab.jfronny.libjf.data.Tags; +import net.minecraft.entity.Entity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.atomic.AtomicInteger; + +@Mixin(Entity.class) +public class EntityMixin { + @Inject(at = @At("HEAD"), method = "isInvulnerable()Z", cancellable = true) + public void setInvulnerable(CallbackInfoReturnable info) { + if (libjf$opArmor()) { + info.setReturnValue(true); + } + } + + @Inject(at = @At("HEAD"), method = "isInvulnerableTo(Lnet/minecraft/entity/damage/DamageSource;)Z", cancellable = true) + public void setInvulnerable(DamageSource source, CallbackInfoReturnable info) { + if (libjf$opArmor()) { + info.setReturnValue(true); + } + } + + @Inject(at = @At("HEAD"), method = "kill()V", cancellable = true) + public void setKillable(CallbackInfo info) { + if (libjf$opArmor()) { + info.cancel(); + } + } + + private boolean libjf$opArmor() { + Entity entity = (Entity) (Object) this; + AtomicInteger armorCount = new AtomicInteger(); + for (ItemStack s : entity.getArmorItems()) { + if (Tags.OVERPOWERED.contains(s.getItem())) + armorCount.getAndIncrement(); + } + return armorCount.get() >= 4; + } +} diff --git a/src/main/java/io/gitlab/jfronny/libjf/mixin/RecipeManagerMixin.java b/src/main/java/io/gitlab/jfronny/libjf/mixin/RecipeManagerMixin.java new file mode 100644 index 0000000..43f7ba3 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/libjf/mixin/RecipeManagerMixin.java @@ -0,0 +1,53 @@ +package io.gitlab.jfronny.libjf.mixin; + +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonObject; +import io.gitlab.jfronny.libjf.Libjf; +import io.gitlab.jfronny.libjf.data.RecipeUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeManager; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; + +@Mixin(RecipeManager.class) +public class RecipeManagerMixin { + @ModifyVariable(method = "apply", at = @At(value = "INVOKE_ASSIGN", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", ordinal = 0, remap = false)) + private Iterator> filterIterator(Iterator> iterator) { + ArrayList> replacement = new ArrayList<>(); + while(iterator.hasNext()) { + Map.Entry cur = iterator.next(); + Identifier recipeId = cur.getKey(); + + if (RecipeUtil.getIdentifiersForRemoval().contains(recipeId.toString())) { + Libjf.LOGGER.info("Blocking recipe by identifier: " + recipeId); + } else { + replacement.add(cur); + } + } + + return replacement.iterator(); + } + + @Redirect(method = "apply", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableMap$Builder;put(Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableMap$Builder;", remap = false)) + private ImmutableMap.Builder> onPutRecipe(ImmutableMap.Builder> builder, Object key, Object value) { + Identifier id = (Identifier) key; + Recipe recipe = (Recipe) value; + + for (ItemStack stack : RecipeUtil.getRecipesForRemoval()) { + if (recipe.getOutput().isItemEqual(stack)) { + Libjf.LOGGER.info("Blocked recipe by predicate: " + recipe.getId()); + return builder; + } + } + + return builder.put(id, recipe); + } +} diff --git a/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxBlockEntityMixin.java b/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxBlockEntityMixin.java index 5565049..6933be1 100644 --- a/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxBlockEntityMixin.java +++ b/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxBlockEntityMixin.java @@ -1,6 +1,6 @@ package io.gitlab.jfronny.libjf.mixin; -import io.gitlab.jfronny.libjf.data.ShulkerIllegalChecker; +import io.gitlab.jfronny.libjf.data.Tags; import net.minecraft.block.entity.ShulkerBoxBlockEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.Direction; @@ -18,6 +18,6 @@ public class ShulkerBoxBlockEntityMixin { */ @Overwrite public boolean canInsert(int slot, ItemStack stack, Direction dir) { - return ShulkerIllegalChecker.isAllowed(stack); + return !Tags.SHULKER_ILLEGAL.contains(stack.getItem()); } } diff --git a/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxSlotMixin.java b/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxSlotMixin.java index 24e6bc7..6eafbfa 100644 --- a/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxSlotMixin.java +++ b/src/main/java/io/gitlab/jfronny/libjf/mixin/ShulkerBoxSlotMixin.java @@ -1,6 +1,6 @@ package io.gitlab.jfronny.libjf.mixin; -import io.gitlab.jfronny.libjf.data.ShulkerIllegalChecker; +import io.gitlab.jfronny.libjf.data.Tags; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.ShulkerBoxSlot; import org.spongepowered.asm.mixin.Mixin; @@ -17,6 +17,6 @@ public class ShulkerBoxSlotMixin { */ @Overwrite public boolean canInsert(ItemStack stack) { - return ShulkerIllegalChecker.isAllowed(stack); + return !Tags.SHULKER_ILLEGAL.contains(stack.getItem()); } } diff --git a/src/main/resources/libjf.mixins.json b/src/main/resources/libjf.mixins.json index 5d368d1..ce3ba8e 100644 --- a/src/main/resources/libjf.mixins.json +++ b/src/main/resources/libjf.mixins.json @@ -4,6 +4,8 @@ "package": "io.gitlab.jfronny.libjf.mixin", "compatibilityLevel": "JAVA_16", "mixins": [ + "EntityMixin", + "RecipeManagerMixin", "ShulkerBoxBlockEntityMixin", "ShulkerBoxSlotMixin" ],