diff --git a/README.md b/README.md index c6eb387..a95e130 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,12 @@ For common tags used by various mods, see [tutorial:tags](https://fabricmc.net/w // this is not valid config since JSON doesn't support comments! { // the key is item tags. - // this is a shorthand of nbt=false and thrown=false + // this is a shorthand of nbt=false "c:copper_ingots": "techreborn:copper_ingot", "c:steel_ingots": { "target": "techreborn:steel_ingot", "nbt" : true, // [optional] allow converting items with nbt. nbt will be copied. - "thrown": true // [optional] convert items thrown by player. } } ``` diff --git a/gradle.properties b/gradle.properties index af52684..2eab874 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ yarn = 1.16.2+build.21 loader = 0.9.2+build.206 # Mod Properties -mod = 1.0 +mod = 1.1 group = com.github.badasintended archiveBaseName = monopoly diff --git a/src/main/java/badasintended/monopoly/Monopoly.java b/src/main/java/badasintended/monopoly/Monopoly.java index 03e9ce0..0e75a50 100644 --- a/src/main/java/badasintended/monopoly/Monopoly.java +++ b/src/main/java/badasintended/monopoly/Monopoly.java @@ -5,7 +5,13 @@ import com.google.gson.reflect.TypeToken; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -63,6 +69,30 @@ public Map getConfig() { return config; } + public ItemStack unify(World world, ItemStack from) { + if (world.isClient || from.isEmpty()) return from; + for (Map.Entry entry : getConfig().entrySet()) { + Tag tag = world.getTagManager().getItems().getTag(entry.getKey()); + if (tag == null) continue; + if (tag.contains(from.getItem())) { + UnifyConfig unifyConfig = entry.getValue(); + if (unifyConfig == null) continue; + + if (!unifyConfig.isNbt() && from.getTag() != null) continue; + + Item item = Registry.ITEM.get(unifyConfig.getTarget()); + if (item == Items.AIR) continue; + + ItemStack unified = new ItemStack(item, from.getCount()); + + unified.setTag(from.getTag()); + + return unified; + } + } + return from; + } + private void reset() { try { Files.write(CONFIG_PATH, gson.toJson(config).getBytes()); diff --git a/src/main/java/badasintended/monopoly/UnifyConfig.java b/src/main/java/badasintended/monopoly/UnifyConfig.java index d1374b7..bb12a27 100644 --- a/src/main/java/badasintended/monopoly/UnifyConfig.java +++ b/src/main/java/badasintended/monopoly/UnifyConfig.java @@ -11,8 +11,6 @@ public class UnifyConfig { private boolean nbt = false; - private boolean thrown = false; - public Identifier getTarget() { return target; } @@ -21,10 +19,6 @@ public boolean isNbt() { return nbt; } - public boolean isThrown() { - return thrown; - } - public void setTarget(Identifier target) { this.target = target; } @@ -33,10 +27,6 @@ public void setNbt(boolean nbt) { this.nbt = nbt; } - public void setThrown(boolean thrown) { - this.thrown = thrown; - } - public static class Serializer implements JsonSerializer, JsonDeserializer { public Serializer() { @@ -52,7 +42,6 @@ public UnifyConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializati JsonObject object = json.getAsJsonObject(); unifyConfig.setTarget(new Identifier(object.get("target").getAsString())); if (object.has("nbt")) unifyConfig.setNbt(object.get("nbt").getAsBoolean()); - if (object.has("thrown")) unifyConfig.setThrown(object.get("thrown").getAsBoolean()); } return unifyConfig; @@ -60,12 +49,11 @@ public UnifyConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializati @Override public JsonElement serialize(UnifyConfig src, Type typeOfSrc, JsonSerializationContext context) { - if (!src.nbt && !src.thrown) return new JsonPrimitive(src.target.toString()); + if (!src.nbt) return new JsonPrimitive(src.target.toString()); JsonObject object = new JsonObject(); object.addProperty("target", src.target.toString()); if (src.nbt) object.addProperty("nbt", true); - if (src.thrown) object.addProperty("thrown", true); return object; } diff --git a/src/main/java/badasintended/monopoly/mixin/ItemEntityMixin.java b/src/main/java/badasintended/monopoly/mixin/ItemEntityMixin.java index 1ab6a7d..b118deb 100644 --- a/src/main/java/badasintended/monopoly/mixin/ItemEntityMixin.java +++ b/src/main/java/badasintended/monopoly/mixin/ItemEntityMixin.java @@ -1,65 +1,18 @@ package badasintended.monopoly.mixin; import badasintended.monopoly.Monopoly; -import badasintended.monopoly.UnifyConfig; import net.minecraft.entity.ItemEntity; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Map; -import java.util.UUID; +import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(ItemEntity.class) public abstract class ItemEntityMixin extends EntityMixin { - @Shadow - public abstract UUID getThrower(); - - @Shadow - public abstract ItemStack getStack(); - - @Shadow - public abstract void setStack(ItemStack stack); - - @Unique - private boolean monopoly$already = false; - - @Inject(method = "tick", at = @At("TAIL")) - private void unifyStack(CallbackInfo ci) { - if (!world.isClient && !monopoly$already) { - monopoly$already = true; - ItemStack stack = getStack(); - for (Map.Entry entry : Monopoly.getInstance().getConfig().entrySet()) { - Tag tag = world.getTagManager().getItems().getTag(entry.getKey()); - if (tag == null) continue; - if (tag.contains(stack.getItem())) { - UnifyConfig unifyConfig = entry.getValue(); - if (unifyConfig == null) continue; - - if (!unifyConfig.isThrown() && getThrower() != null) continue; - if (!unifyConfig.isNbt() && stack.getTag() != null) continue; - - Item item = Registry.ITEM.get(unifyConfig.getTarget()); - if (item == Items.AIR) continue; - - ItemStack unified = new ItemStack(item, stack.getCount()); - - unified.setTag(stack.getTag()); - - setStack(unified); - } - } - } + @ModifyVariable(method = "setStack", at = @At("HEAD"), argsOnly = true) + private ItemStack unifyStack(ItemStack from) { + return Monopoly.getInstance().unify(world, from); } }