Fix RecipeUtil and implement raut:overpowered armor tag
This commit is contained in:
parent
187ce56f3e
commit
80ceeaaec4
@ -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);
|
||||
}
|
||||
}
|
12
src/main/java/io/gitlab/jfronny/libjf/data/Tags.java
Normal file
12
src/main/java/io/gitlab/jfronny/libjf/data/Tags.java
Normal 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"));
|
||||
}
|
47
src/main/java/io/gitlab/jfronny/libjf/mixin/EntityMixin.java
Normal file
47
src/main/java/io/gitlab/jfronny/libjf/mixin/EntityMixin.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,8 @@
|
||||
"package": "io.gitlab.jfronny.libjf.mixin",
|
||||
"compatibilityLevel": "JAVA_16",
|
||||
"mixins": [
|
||||
"EntityMixin",
|
||||
"RecipeManagerMixin",
|
||||
"ShulkerBoxBlockEntityMixin",
|
||||
"ShulkerBoxSlotMixin"
|
||||
],
|
||||
|
Loading…
Reference in New Issue
Block a user