Fix RecipeUtil and implement raut:overpowered armor tag

This commit is contained in:
JFronny 2021-09-10 19:02:15 +02:00
parent 187ce56f3e
commit 80ceeaaec4
No known key found for this signature in database
GPG Key ID: BEC5ACBBD4EE17E5
7 changed files with 118 additions and 22 deletions

View File

@ -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<Item> 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);
}
}

View File

@ -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<Item> SHULKER_ILLEGAL = TagFactory.ITEM.create(new Identifier(Libjf.MOD_ID, "shulker_boxes_illegal"));
public static Tag<Item> OVERPOWERED = TagFactory.ITEM.create(new Identifier(Libjf.MOD_ID, "overpowered"));
}

View File

@ -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<Boolean> 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<Boolean> 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;
}
}

View File

@ -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<Map.Entry<Identifier, JsonObject>> filterIterator(Iterator<Map.Entry<Identifier, JsonObject>> iterator) {
ArrayList<Map.Entry<Identifier, JsonObject>> replacement = new ArrayList<>();
while(iterator.hasNext()) {
Map.Entry<Identifier, JsonObject> 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<Identifier, Recipe<?>> onPutRecipe(ImmutableMap.Builder<Identifier, Recipe<?>> 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);
}
}

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -4,6 +4,8 @@
"package": "io.gitlab.jfronny.libjf.mixin",
"compatibilityLevel": "JAVA_16",
"mixins": [
"EntityMixin",
"RecipeManagerMixin",
"ShulkerBoxBlockEntityMixin",
"ShulkerBoxSlotMixin"
],