From 8e1edd46bf84952cb58a5a116c2e875d6bcf9c4f Mon Sep 17 00:00:00 2001
From: Jenny <jennytsonline@proton.me>
Date: Fri, 11 Apr 2025 02:45:42 +0200
Subject: [PATCH] more amulets & restructuring

---
 .../magic/blocks/entities/blockEntities.java  |   2 +-
 .../com/jenny/magic/enchantments/Homing.java  |   2 +-
 .../com/jenny/magic/items/QualityItem.java    |  49 --------------
 .../jenny/magic/items/amulets/AmuletBase.java |  46 +++++++++++++
 .../magic/items/amulets/AmuletBonemeal.java   |  30 +++++++++
 .../items/{ => amulets}/AmuletEffect.java     |  16 ++---
 .../magic/items/amulets/AmuletImmunity.java   |  35 ++++++++++
 .../items/{ => amulets}/AmuletRepair.java     |   7 +-
 .../magic/items/amulets/AmuletSuction.java    |  31 +++++++++
 .../java/com/jenny/magic/items/items.java     |  26 +++++---
 .../ScrollBonemeal.java}                      |   9 +--
 .../ScrollHealth.java}                        |   9 +--
 .../ScrollRepel.java}                         |  12 ++--
 .../ScrollTeleport.java}                      |   6 +-
 .../ScrollTeleportBiome.java}                 |   6 +-
 .../ScrollTeleportConsumable.java}            |   6 +-
 .../ScrollTeleportPersistent.java}            |   6 +-
 .../ScrollTeleportRandom.java}                |   8 +--
 .../{ => scrolls}/SingleActionScroll.java     |   6 +-
 .../{ => scrolls}/TeleportScrollRandom.java   |   4 +-
 .../magic/items/{ => wands}/BaseWand.java     |  19 ++----
 .../magic/items/{ => wands}/WandHurtful.java  |   5 +-
 .../magic/items/{ => wands}/WandVacuum.java   |   5 +-
 .../jenny/magic/mixins/ExperienceToMana.java  |  61 -----------------
 .../java/com/jenny/magic/mixins/PiglinAi.java |  20 ++++++
 .../magic/mixins/ShapelessRecipeMixin.java    |  63 ------------------
 src/main/java/com/jenny/magic/util/util.java  |  16 +++++
 .../magic/textures/item/amulet_bonemeal.png   | Bin 0 -> 300 bytes
 .../magic/textures/item/amulet_breathing.png  | Bin 0 -> 278 bytes
 .../magic/textures/item/amulet_gold.png       | Bin 0 -> 283 bytes
 .../magic/textures/item/amulet_growth.png     | Bin 0 -> 272 bytes
 .../textures/item/amulet_nightvision.png      | Bin 0 -> 267 bytes
 .../magic/textures/item/amulet_repair.png     | Bin 243 -> 267 bytes
 .../magic/textures/item/amulet_saturation.png | Bin 0 -> 289 bytes
 .../magic/textures/item/amulet_suction.png    | Bin 0 -> 273 bytes
 src/main/resources/magic.mixins.json          |   8 +--
 36 files changed, 262 insertions(+), 251 deletions(-)
 delete mode 100644 src/main/java/com/jenny/magic/items/QualityItem.java
 create mode 100644 src/main/java/com/jenny/magic/items/amulets/AmuletBase.java
 create mode 100644 src/main/java/com/jenny/magic/items/amulets/AmuletBonemeal.java
 rename src/main/java/com/jenny/magic/items/{ => amulets}/AmuletEffect.java (63%)
 create mode 100644 src/main/java/com/jenny/magic/items/amulets/AmuletImmunity.java
 rename src/main/java/com/jenny/magic/items/{ => amulets}/AmuletRepair.java (75%)
 create mode 100644 src/main/java/com/jenny/magic/items/amulets/AmuletSuction.java
 rename src/main/java/com/jenny/magic/items/{BonemealScroll.java => scrolls/ScrollBonemeal.java} (81%)
 rename src/main/java/com/jenny/magic/items/{HealthScroll.java => scrolls/ScrollHealth.java} (74%)
 rename src/main/java/com/jenny/magic/items/{RepelScroll.java => scrolls/ScrollRepel.java} (76%)
 rename src/main/java/com/jenny/magic/items/{TeleportScroll.java => scrolls/ScrollTeleport.java} (97%)
 rename src/main/java/com/jenny/magic/items/{TeleportScrollBiome.java => scrolls/ScrollTeleportBiome.java} (95%)
 rename src/main/java/com/jenny/magic/items/{TeleportScrollConsumable.java => scrolls/ScrollTeleportConsumable.java} (78%)
 rename src/main/java/com/jenny/magic/items/{TeleportScrollPersistent.java => scrolls/ScrollTeleportPersistent.java} (74%)
 rename src/main/java/com/jenny/magic/items/{BaseItem.java => scrolls/ScrollTeleportRandom.java} (92%)
 rename src/main/java/com/jenny/magic/items/{ => scrolls}/SingleActionScroll.java (83%)
 rename src/main/java/com/jenny/magic/items/{ => scrolls}/TeleportScrollRandom.java (98%)
 rename src/main/java/com/jenny/magic/items/{ => wands}/BaseWand.java (78%)
 rename src/main/java/com/jenny/magic/items/{ => wands}/WandHurtful.java (72%)
 rename src/main/java/com/jenny/magic/items/{ => wands}/WandVacuum.java (92%)
 delete mode 100644 src/main/java/com/jenny/magic/mixins/ExperienceToMana.java
 create mode 100644 src/main/java/com/jenny/magic/mixins/PiglinAi.java
 delete mode 100644 src/main/java/com/jenny/magic/mixins/ShapelessRecipeMixin.java
 create mode 100644 src/main/java/com/jenny/magic/util/util.java
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_bonemeal.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_breathing.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_gold.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_growth.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_nightvision.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_saturation.png
 create mode 100644 src/main/resources/assets/magic/textures/item/amulet_suction.png

diff --git a/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java b/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java
index 1cfeaad..55f2a54 100644
--- a/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java
+++ b/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java
@@ -12,7 +12,6 @@ import static com.jenny.magic.Magic.MODID;
 public class blockEntities {
     public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES =
             DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, MODID);
-
     public static void register(IEventBus bus) {
         BLOCK_ENTITIES.register(bus);
     }    public static final RegistryObject<BlockEntityType<AntiSpawnerBE>> ANTI_SPAWNER_BE =
@@ -21,4 +20,5 @@ public class blockEntities {
                             blocks.ANTI_SPAWNER.get()).build(null));
 
 
+
 }
diff --git a/src/main/java/com/jenny/magic/enchantments/Homing.java b/src/main/java/com/jenny/magic/enchantments/Homing.java
index c5c4451..96fa88b 100644
--- a/src/main/java/com/jenny/magic/enchantments/Homing.java
+++ b/src/main/java/com/jenny/magic/enchantments/Homing.java
@@ -1,6 +1,6 @@
 package com.jenny.magic.enchantments;
 
-import com.jenny.magic.items.BaseWand;
+import com.jenny.magic.items.wands.BaseWand;
 import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
diff --git a/src/main/java/com/jenny/magic/items/QualityItem.java b/src/main/java/com/jenny/magic/items/QualityItem.java
deleted file mode 100644
index 2c51ed8..0000000
--- a/src/main/java/com/jenny/magic/items/QualityItem.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.jenny.magic.items;
-
-import net.minecraft.ChatFormatting;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.MutableComponent;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.item.TooltipFlag;
-import net.minecraft.world.level.Level;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.List;
-import java.util.Random;
-
-public class QualityItem extends BaseItem {
-    public QualityItem(Properties pProperties) {
-        super(pProperties);
-    }
-
-    @Override
-    public ItemStack getDefaultInstance() {
-        return setQuality(new ItemStack(this));
-    }
-
-    protected ItemStack setQuality(@NotNull ItemStack itemStack) {
-        float quality = (float) new Random(System.nanoTime()).nextInt(0, 21) / 10 + 1;
-        CompoundTag tag;
-        if (itemStack.getTag() != null) {
-            tag = itemStack.getTag();
-        } else {
-            tag = new CompoundTag();
-        }
-        tag.putFloat("magic_quality", quality);
-        itemStack.setTag(tag);
-        return itemStack;
-    }
-
-    protected float getQuality(@NotNull ItemStack itemStack) {
-        return itemStack.getTag() != null ? itemStack.getTag().getFloat("magic_quality") : 1;
-    }
-
-    @Override
-    public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List<Component> pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) {
-        MutableComponent toolTip = Component.literal(Float.toString(getQuality(pStack)));
-        pTooltipComponents.add(toolTip.withStyle(ChatFormatting.DARK_RED));
-        super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
-    }
-}
diff --git a/src/main/java/com/jenny/magic/items/amulets/AmuletBase.java b/src/main/java/com/jenny/magic/items/amulets/AmuletBase.java
new file mode 100644
index 0000000..7e65520
--- /dev/null
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletBase.java
@@ -0,0 +1,46 @@
+package com.jenny.magic.items.amulets;
+
+import net.minecraft.ChatFormatting;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.network.chat.Component;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.phys.Vec3;
+import org.jetbrains.annotations.NotNull;
+
+public class AmuletBase extends com.jenny.magic.items.scrolls.SingleActionScroll {
+    public AmuletBase(Properties pProperties) {
+        super(pProperties.stacksTo(1));
+    }
+
+    public static boolean isEnabled(CompoundTag tag) {
+        if (tag != null && tag.contains("amulet_enabled") && tag.getString("amulet_enabled").equals("false")) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    public static CompoundTag setEnabled(CompoundTag tag, boolean b) {
+        tag.putString("amulet_enabled", Boolean.toString(b));
+        return tag;
+    }
+
+    protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) {
+        CompoundTag tag = itemStack.getTag();
+        if (tag == null) {
+            tag = new CompoundTag();
+        }
+        itemStack.setTag(setEnabled(tag, !isEnabled(tag)));
+    }
+
+    @Override
+    public Component getName(@NotNull ItemStack pStack) {
+        if (!isEnabled(pStack.getTag())) {
+            return Component.translatable(this.getDescriptionId(pStack)).withStyle(ChatFormatting.GRAY);
+        } else {
+            return Component.translatable(this.getDescriptionId(pStack));
+        }
+    }
+}
diff --git a/src/main/java/com/jenny/magic/items/amulets/AmuletBonemeal.java b/src/main/java/com/jenny/magic/items/amulets/AmuletBonemeal.java
new file mode 100644
index 0000000..c624443
--- /dev/null
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletBonemeal.java
@@ -0,0 +1,30 @@
+package com.jenny.magic.items.amulets;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Vec3i;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.BoneMealItem;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.Items;
+import net.minecraft.world.level.Level;
+import org.jetbrains.annotations.NotNull;
+
+public class AmuletBonemeal extends AmuletBase {
+    protected static int chance = 10;
+
+    public AmuletBonemeal(Properties pProperties) {
+        super(pProperties);
+    }
+
+    protected static BlockPos getLocation(Player player) {
+        return player.blockPosition().offset(new Vec3i(player.level().getRandom().nextIntBetweenInclusive(-5, 5), 0, player.level().getRandom().nextIntBetweenInclusive(-5, 5)));
+    }
+
+    @Override
+    public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) {
+        if (!pLevel.isClientSide && isEnabled(pStack.getTag()) && pLevel.getRandom().nextInt(chance) == 0 && pEntity instanceof Player pPlayer) {
+            BoneMealItem.applyBonemeal(new ItemStack(Items.BONE_MEAL), pLevel, getLocation(pPlayer), pPlayer);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jenny/magic/items/AmuletEffect.java b/src/main/java/com/jenny/magic/items/amulets/AmuletEffect.java
similarity index 63%
rename from src/main/java/com/jenny/magic/items/AmuletEffect.java
rename to src/main/java/com/jenny/magic/items/amulets/AmuletEffect.java
index 1ba331e..e915048 100644
--- a/src/main/java/com/jenny/magic/items/AmuletEffect.java
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletEffect.java
@@ -1,6 +1,5 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.amulets;
 
-import net.minecraft.server.level.ServerLevel;
 import net.minecraft.world.effect.MobEffect;
 import net.minecraft.world.effect.MobEffectInstance;
 import net.minecraft.world.entity.Entity;
@@ -11,25 +10,26 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.Optional;
 
-public class AmuletEffect extends BaseItem {
+public class AmuletEffect extends AmuletBase {
     private MobEffect effect;
-    private int delay, duration, amplifier;
+    private int delay, duration, amplifier, tick;
 
     public AmuletEffect(Properties pProperties, MobEffect effect, int delay, int duration, int amplifier) {
-        super(pProperties.stacksTo(1));
+        super(pProperties);
         this.effect = effect;
         this.delay = delay;
         this.duration = duration;
         this.amplifier = amplifier;
+        this.tick = 0;
     }
 
     @Override
     public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) {
-        if (!pLevel.isClientSide && ((ServerLevel) pLevel).getServer().getTickCount() % this.delay == 0) {
+        if (!pLevel.isClientSide && isEnabled(pStack.getTag()) && tick % delay == 0) {
             if (pEntity instanceof LivingEntity p) {
-                p.addEffect(new MobEffectInstance(effect, this.duration, this.amplifier, true, true, true, null, Optional.empty()));
-                System.out.println("test1878567");
+                p.addEffect(new MobEffectInstance(effect, duration, amplifier, true, true, true, null, Optional.empty()));
             }
         }
+        tick++;
     }
 }
diff --git a/src/main/java/com/jenny/magic/items/amulets/AmuletImmunity.java b/src/main/java/com/jenny/magic/items/amulets/AmuletImmunity.java
new file mode 100644
index 0000000..62947df
--- /dev/null
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletImmunity.java
@@ -0,0 +1,35 @@
+package com.jenny.magic.items.amulets;
+
+import net.minecraft.world.effect.MobEffectCategory;
+import net.minecraft.world.effect.MobEffectInstance;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
+import org.jetbrains.annotations.NotNull;
+
+public class AmuletImmunity extends AmuletBase {
+    private static int delay = 200;
+    private int count = 0;
+
+    public AmuletImmunity(Item.Properties pProperties) {
+        super(pProperties);
+    }
+
+    @Override
+    public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) {
+        if (!pLevel.isClientSide) {
+            count = count < 200 ? count + 1 : count;
+            if (count == 200 && pEntity instanceof LivingEntity entity) {
+                for (MobEffectInstance effect : entity.getActiveEffects()) {
+                    if (effect.getEffect().getCategory().equals(MobEffectCategory.HARMFUL)) {
+                        entity.removeEffect(effect.getEffect());
+                        count = 1;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/jenny/magic/items/AmuletRepair.java b/src/main/java/com/jenny/magic/items/amulets/AmuletRepair.java
similarity index 75%
rename from src/main/java/com/jenny/magic/items/AmuletRepair.java
rename to src/main/java/com/jenny/magic/items/amulets/AmuletRepair.java
index 0128d62..81511f5 100644
--- a/src/main/java/com/jenny/magic/items/AmuletRepair.java
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletRepair.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.amulets;
 
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.player.Player;
@@ -6,17 +6,16 @@ import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.Level;
 import org.jetbrains.annotations.NotNull;
 
-public class AmuletRepair extends BaseItem {
+public class AmuletRepair extends AmuletBase {
     public AmuletRepair(@NotNull Properties pProperties) {
         super(pProperties.stacksTo(1));
     }
 
     @Override
     public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) {
-        if (!pLevel.isClientSide && pLevel.getRandom().nextInt(10) == 0 && pEntity instanceof Player pPlayer) {
+        if (!pLevel.isClientSide && isEnabled(pStack.getTag()) && pLevel.getRandom().nextInt(10) == 0 && pEntity instanceof Player pPlayer) {
             int rand = pLevel.getRandom().nextInt(0, 9);
             ItemStack itemStack = pPlayer.getInventory().items.get(rand);
-            System.out.println(itemStack.getItem().toString());
             if (itemStack.isDamaged()) {
                 itemStack.setDamageValue(itemStack.getDamageValue() - 1);
             }
diff --git a/src/main/java/com/jenny/magic/items/amulets/AmuletSuction.java b/src/main/java/com/jenny/magic/items/amulets/AmuletSuction.java
new file mode 100644
index 0000000..ac1a1f7
--- /dev/null
+++ b/src/main/java/com/jenny/magic/items/amulets/AmuletSuction.java
@@ -0,0 +1,31 @@
+package com.jenny.magic.items.amulets;
+
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.item.ItemEntity;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.phys.AABB;
+import org.jetbrains.annotations.NotNull;
+
+public class AmuletSuction extends AmuletBase {
+    private int delay, tick;
+    private float range, power;
+
+    public AmuletSuction(Properties pProperties, int delay, float range, float power) {
+        super(pProperties);
+        this.delay = delay;
+        this.range = range;
+        this.power = power;
+        this.tick = 0;
+    }
+
+    @Override
+    public void inventoryTick(@NotNull ItemStack pStack, @NotNull Level pLevel, @NotNull Entity pEntity, int pSlotId, boolean pIsSelected) {
+        if (this.tick % this.delay == 0 && isEnabled(pStack.getTag())) {
+            for (Entity drop : pLevel.getEntitiesOfClass(ItemEntity.class, new AABB(pEntity.position(), pEntity.position()).inflate(range), (itemEntity) -> true)) {
+                drop.addDeltaMovement(pEntity.position().subtract(drop.position()).normalize().scale(power));
+            }
+        }
+        tick++;
+    }
+}
diff --git a/src/main/java/com/jenny/magic/items/items.java b/src/main/java/com/jenny/magic/items/items.java
index 58344e4..455da48 100644
--- a/src/main/java/com/jenny/magic/items/items.java
+++ b/src/main/java/com/jenny/magic/items/items.java
@@ -1,5 +1,9 @@
 package com.jenny.magic.items;
 
+import com.jenny.magic.items.amulets.*;
+import com.jenny.magic.items.scrolls.*;
+import com.jenny.magic.items.wands.WandHurtful;
+import com.jenny.magic.items.wands.WandVacuum;
 import net.minecraft.ChatFormatting;
 import net.minecraft.world.effect.MobEffects;
 import net.minecraft.world.item.Item;
@@ -15,19 +19,21 @@ public class items {
     public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
     public static final RegistryObject<Item> WAND_HURTFUL = ITEMS.register("wand_hurtful", () -> new WandHurtful(new Item.Properties()));
     public static final RegistryObject<Item> WAND_VAUUM = ITEMS.register("wand_vacuum", () -> new WandVacuum(new Item.Properties().stacksTo(1)));
-    public static final RegistryObject<Item> SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScrollPersistent(new Item.Properties().stacksTo(1)));
-    public static final RegistryObject<Item> SCROLL_TELEPORT_BRITTLE = ITEMS.register("scroll_teleport_brittle", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16)));
+    public static final RegistryObject<Item> SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new ScrollTeleportPersistent(new Item.Properties().stacksTo(1)));
+    public static final RegistryObject<Item> SCROLL_TELEPORT_BRITTLE = ITEMS.register("scroll_teleport_brittle", () -> new ScrollTeleportConsumable(new Item.Properties().stacksTo(16)));
     public static final RegistryObject<Item> SCROLL_TELEPORT_RANDOM = ITEMS.register("scroll_teleport_random", () -> new TeleportScrollRandom(new Item.Properties().stacksTo(1)));
-    public static final RegistryObject<Item> SCROLL_TELEPORT_BIOME_PLAINS = ITEMS.register("scroll_teleport_biome_plains", () -> new TeleportScrollBiome(new Item.Properties().stacksTo(16), Biomes.PLAINS, ChatFormatting.GREEN));
-    public static final RegistryObject<Item> SCROLL_HEALTH = ITEMS.register("scroll_health", () -> new HealthScroll(new Item.Properties().stacksTo(16)));
-    public static final RegistryObject<Item> SCROLL_REPEL = ITEMS.register("scroll_repel", () -> new RepelScroll(new Item.Properties().stacksTo(16)));
-    public static final RegistryObject<Item> SCROLL_BONEMEAL = ITEMS.register("scroll_bonemeal", () -> new BonemealScroll(new Item.Properties().stacksTo(16)));
+    public static final RegistryObject<Item> SCROLL_TELEPORT_BIOME_PLAINS = ITEMS.register("scroll_teleport_biome_plains", () -> new ScrollTeleportBiome(new Item.Properties().stacksTo(16), Biomes.PLAINS, ChatFormatting.GREEN));
+    public static final RegistryObject<Item> SCROLL_HEALTH = ITEMS.register("scroll_health", () -> new ScrollHealth(new Item.Properties().stacksTo(16)));
+    public static final RegistryObject<Item> SCROLL_REPEL = ITEMS.register("scroll_repel", () -> new ScrollRepel(new Item.Properties().stacksTo(16)));
+    public static final RegistryObject<Item> SCROLL_BONEMEAL = ITEMS.register("scroll_bonemeal", () -> new ScrollBonemeal(new Item.Properties().stacksTo(16)));
     public static final RegistryObject<Item> AMULET_REPAIR = ITEMS.register("amulet_repair", () -> new AmuletRepair(new Item.Properties()));
-    public static final RegistryObject<Item> AMULET_BREATHING = ITEMS.register("amulet_breathing", () -> new AmuletEffect(new Item.Properties(), MobEffects.WATER_BREATHING, 100, 200, 1));
+    public static final RegistryObject<Item> AMULET_BREATHING = ITEMS.register("amulet_breathing", () -> new AmuletEffect(new Item.Properties(), MobEffects.WATER_BREATHING, 200, 500, 1));
     public static final RegistryObject<Item> AMULET_NIGHTVISION = ITEMS.register("amulet_nightvision", () -> new AmuletEffect(new Item.Properties(), MobEffects.NIGHT_VISION, 200, 500, 1));
-
-    public static final RegistryObject<Item> DRAGON_HEART = ITEMS.register("dragon_heart", () -> new QualityItem(new Item.Properties()));
-
+    public static final RegistryObject<Item> AMULET_SATURATION = ITEMS.register("amulet_saturation", () -> new AmuletEffect(new Item.Properties(), MobEffects.SATURATION, 200, 500, 1));
+    public static final RegistryObject<Item> AMULET_SUCTION = ITEMS.register("amulet_suction", () -> new AmuletSuction(new Item.Properties(), 3, 4, 0.5f));
+    public static final RegistryObject<Item> AMULET_BONEMEAL = ITEMS.register("amulet_bonemeal", () -> new AmuletBonemeal(new Item.Properties()));
+    public static final RegistryObject<Item> AMULET_GOLD = ITEMS.register("amulet_gold", () -> new Item(new Item.Properties()));
+    public static final RegistryObject<Item> AMULET_IMMUNITY = ITEMS.register("amulet_immunity", () -> new AmuletImmunity(new Item.Properties()));
     public static void register(IEventBus bus) {
         ITEMS.register(bus);
     }
diff --git a/src/main/java/com/jenny/magic/items/BonemealScroll.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollBonemeal.java
similarity index 81%
rename from src/main/java/com/jenny/magic/items/BonemealScroll.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollBonemeal.java
index abd197a..ff17d21 100644
--- a/src/main/java/com/jenny/magic/items/BonemealScroll.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollBonemeal.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.EffectS2C;
@@ -6,19 +6,20 @@ import com.jenny.magic.particles.effects;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.BoneMealItem;
+import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.item.Items;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-public class BonemealScroll extends SingleActionScroll {
-    public BonemealScroll(Properties pProperties) {
+public class ScrollBonemeal extends SingleActionScroll {
+    public ScrollBonemeal(Item.Properties pProperties) {
         super(pProperties);
     }
 
     @Override
-    void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, @NotNull Level level) {
+    protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, @NotNull Level level) {
         if (!level.isClientSide) {
             boolean flag = false;
             for (int x = -5; x <= 5; x++) {
diff --git a/src/main/java/com/jenny/magic/items/HealthScroll.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollHealth.java
similarity index 74%
rename from src/main/java/com/jenny/magic/items/HealthScroll.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollHealth.java
index d78322f..8f7cd36 100644
--- a/src/main/java/com/jenny/magic/items/HealthScroll.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollHealth.java
@@ -1,22 +1,23 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.EffectS2C;
 import com.jenny.magic.particles.effects;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-public class HealthScroll extends SingleActionScroll {
-    public HealthScroll(Properties pProperties) {
+public class ScrollHealth extends SingleActionScroll {
+    public ScrollHealth(Item.Properties pProperties) {
         super(pProperties);
     }
 
     @Override
-    void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) {
+    protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) {
         if (!level.isClientSide) {
             if (player.getMaxHealth() != player.getHealth()) {
                 player.heal(5);
diff --git a/src/main/java/com/jenny/magic/items/RepelScroll.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollRepel.java
similarity index 76%
rename from src/main/java/com/jenny/magic/items/RepelScroll.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollRepel.java
index 9f3cb68..436ff0f 100644
--- a/src/main/java/com/jenny/magic/items/RepelScroll.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollRepel.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.EffectS2C;
@@ -7,21 +7,25 @@ import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-public class RepelScroll extends SingleActionScroll {
-    public RepelScroll(Properties pProperties) {
+public class ScrollRepel extends SingleActionScroll {
+    public ScrollRepel(Item.Properties pProperties) {
         super(pProperties);
     }
 
     @Override
-    void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, @NotNull Level level) {
+    protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, @NotNull Level level) {
         if (!level.isClientSide) {
             boolean flag = false;
             for (Entity e : level.getEntitiesOfClass(LivingEntity.class, player.getBoundingBox().inflate(5, 2, 5))) {
+                if (e.is(player)) {
+                    continue;
+                }
                 e.addDeltaMovement(e.position().subtract(player.position()).normalize().scale(5 * e.position().subtract(player.position()).length()).multiply(1, 0, 1));
                 flag = true;
                 networking.sendToPlayer(new EffectS2C(effects.EFFECT.SCROLL_REPEL, e.position().add(0, e.getEyeHeight(), 0)), (ServerPlayer) player);
diff --git a/src/main/java/com/jenny/magic/items/TeleportScroll.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleport.java
similarity index 97%
rename from src/main/java/com/jenny/magic/items/TeleportScroll.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollTeleport.java
index fbdcd44..4a2e787 100644
--- a/src/main/java/com/jenny/magic/items/TeleportScroll.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleport.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.config.ConfigServer;
 import com.jenny.magic.networking.networking;
@@ -25,8 +25,8 @@ import java.util.List;
 
 import static com.jenny.magic.Magic.MODID;
 
-public class TeleportScroll extends BaseItem {
-    public TeleportScroll(Properties pProperties) {
+public class ScrollTeleport extends ScrollTeleportRandom {
+    public ScrollTeleport(Properties pProperties) {
         super(pProperties);
     }
 
diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportBiome.java
similarity index 95%
rename from src/main/java/com/jenny/magic/items/TeleportScrollBiome.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportBiome.java
index 5bab3f7..389f1c5 100644
--- a/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportBiome.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.EffectS2C;
@@ -28,11 +28,11 @@ import java.util.List;
 
 import static com.jenny.magic.Magic.MODID;
 
-public class TeleportScrollBiome extends BaseItem {
+public class ScrollTeleportBiome extends ScrollTeleportRandom {
     private final ResourceKey<Biome> biome;
     private final ChatFormatting color;
 
-    public TeleportScrollBiome(Properties pProperties, ResourceKey<Biome> biome, ChatFormatting color) {
+    public ScrollTeleportBiome(Properties pProperties, ResourceKey<Biome> biome, ChatFormatting color) {
         super(pProperties);
         this.biome = biome;
         this.color = color;
diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollConsumable.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportConsumable.java
similarity index 78%
rename from src/main/java/com/jenny/magic/items/TeleportScrollConsumable.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportConsumable.java
index 6cc9c10..3975e1f 100644
--- a/src/main/java/com/jenny/magic/items/TeleportScrollConsumable.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportConsumable.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
@@ -6,8 +6,8 @@ import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-public class TeleportScrollConsumable extends TeleportScroll {
-    public TeleportScrollConsumable(Properties pProperties) {
+public class ScrollTeleportConsumable extends ScrollTeleport {
+    public ScrollTeleportConsumable(Properties pProperties) {
         super(pProperties);
     }
 
diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportPersistent.java
similarity index 74%
rename from src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportPersistent.java
index 894ae7d..1735040 100644
--- a/src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportPersistent.java
@@ -1,13 +1,13 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import net.minecraft.ChatFormatting;
 import net.minecraft.network.chat.Component;
 import net.minecraft.world.item.ItemStack;
 import org.jetbrains.annotations.NotNull;
 
-public class TeleportScrollPersistent extends TeleportScroll {
+public class ScrollTeleportPersistent extends ScrollTeleport {
 
-    public TeleportScrollPersistent(Properties pProperties) {
+    public ScrollTeleportPersistent(Properties pProperties) {
         super(pProperties);
     }
 
diff --git a/src/main/java/com/jenny/magic/items/BaseItem.java b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportRandom.java
similarity index 92%
rename from src/main/java/com/jenny/magic/items/BaseItem.java
rename to src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportRandom.java
index 85d72d8..2b993a9 100644
--- a/src/main/java/com/jenny/magic/items/BaseItem.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/ScrollTeleportRandom.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.ManaAmountS2C;
@@ -20,9 +20,9 @@ import java.util.List;
 
 import static com.jenny.magic.Magic.MODID;
 
-abstract class BaseItem extends Item {
+public abstract class ScrollTeleportRandom extends Item {
 
-    public BaseItem(Properties pProperties) {
+    public ScrollTeleportRandom(Properties pProperties) {
         super(pProperties);
     }
 
@@ -52,7 +52,7 @@ abstract class BaseItem extends Item {
         }
     }
 
-    enum ParticleDirection {
+    public enum ParticleDirection {
         INWARD,
         OUTWARD
     }
diff --git a/src/main/java/com/jenny/magic/items/SingleActionScroll.java b/src/main/java/com/jenny/magic/items/scrolls/SingleActionScroll.java
similarity index 83%
rename from src/main/java/com/jenny/magic/items/SingleActionScroll.java
rename to src/main/java/com/jenny/magic/items/scrolls/SingleActionScroll.java
index 6aa7fb5..232e391 100644
--- a/src/main/java/com/jenny/magic/items/SingleActionScroll.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/SingleActionScroll.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import net.minecraft.world.InteractionHand;
 import net.minecraft.world.InteractionResult;
@@ -10,7 +10,7 @@ import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-abstract class SingleActionScroll extends BaseItem {
+public abstract class SingleActionScroll extends ScrollTeleportRandom {
     public SingleActionScroll(Properties pProperties) {
         super(pProperties);
     }
@@ -27,5 +27,5 @@ abstract class SingleActionScroll extends BaseItem {
         return InteractionResult.SUCCESS;
     }
 
-    abstract void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level);
+    protected abstract void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level);
 }
diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollRandom.java b/src/main/java/com/jenny/magic/items/scrolls/TeleportScrollRandom.java
similarity index 98%
rename from src/main/java/com/jenny/magic/items/TeleportScrollRandom.java
rename to src/main/java/com/jenny/magic/items/scrolls/TeleportScrollRandom.java
index 515e45d..16d2b8a 100644
--- a/src/main/java/com/jenny/magic/items/TeleportScrollRandom.java
+++ b/src/main/java/com/jenny/magic/items/scrolls/TeleportScrollRandom.java
@@ -1,4 +1,4 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.scrolls;
 
 import com.jenny.magic.config.ConfigServer;
 import com.jenny.magic.networking.networking;
@@ -30,7 +30,7 @@ import java.util.List;
 
 import static com.jenny.magic.Magic.MODID;
 
-public class TeleportScrollRandom extends BaseItem {
+public class TeleportScrollRandom extends ScrollTeleportRandom {
     public TeleportScrollRandom(Properties pProperties) {
         super(pProperties);
     }
diff --git a/src/main/java/com/jenny/magic/items/BaseWand.java b/src/main/java/com/jenny/magic/items/wands/BaseWand.java
similarity index 78%
rename from src/main/java/com/jenny/magic/items/BaseWand.java
rename to src/main/java/com/jenny/magic/items/wands/BaseWand.java
index 1ebbf1a..139cd3b 100644
--- a/src/main/java/com/jenny/magic/items/BaseWand.java
+++ b/src/main/java/com/jenny/magic/items/wands/BaseWand.java
@@ -1,38 +1,33 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.wands;
 
 import com.jenny.magic.entities.BaseWandProjectile;
 import net.minecraft.world.InteractionHand;
 import net.minecraft.world.InteractionResultHolder;
 import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.Items;
 import net.minecraft.world.level.Level;
 import org.jetbrains.annotations.NotNull;
 
-public abstract class BaseWand extends QualityItem {
-    public BaseWand(Properties properties) {
+public abstract class BaseWand extends Item {
+    public BaseWand(Item.Properties properties) {
         super(properties.stacksTo(1).durability(100));
     }
 
-    private static void onItemDestroyed(Player player) {
-    }
-
     @Override
     public @NotNull InteractionResultHolder<ItemStack> use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pUsedHand) {
         ItemStack itemstack = pPlayer.getItemInHand(pUsedHand);
         BaseWandProjectile projectile = newProjectile(pLevel);
         projectile.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), 0.0F, 2.0F);
         pLevel.addFreshEntity(projectile);
-        itemstack.hurtAndBreak(1, pPlayer, (player) -> {
-            player.broadcastBreakEvent(pPlayer.getUsedItemHand());
-        });
+        itemstack.hurtAndBreak(1, pPlayer, (player) -> player.broadcastBreakEvent(pPlayer.getUsedItemHand()));
         return InteractionResultHolder.success(itemstack);
     }
 
-    ;
-
     @Override
     public boolean isValidRepairItem(@NotNull ItemStack pStack, @NotNull ItemStack pRepairCandidate) {
-        if (pRepairCandidate.getItem().getDescriptionId().equals(items.DRAGON_HEART.get().getDescriptionId())) {
+        if (pRepairCandidate.getItem().getDescriptionId().equals(Items.DIAMOND.getDescriptionId())) {
             while (pRepairCandidate.getCount() >= 1 && pStack.isDamaged()) {
                 pRepairCandidate.shrink(1);
                 pStack.setDamageValue(pStack.getDamageValue() - 20);
diff --git a/src/main/java/com/jenny/magic/items/WandHurtful.java b/src/main/java/com/jenny/magic/items/wands/WandHurtful.java
similarity index 72%
rename from src/main/java/com/jenny/magic/items/WandHurtful.java
rename to src/main/java/com/jenny/magic/items/wands/WandHurtful.java
index d36f8d1..de211e6 100644
--- a/src/main/java/com/jenny/magic/items/WandHurtful.java
+++ b/src/main/java/com/jenny/magic/items/wands/WandHurtful.java
@@ -1,11 +1,12 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.wands;
 
 import com.jenny.magic.entities.BaseWandProjectile;
 import com.jenny.magic.entities.HurtfulProjectile;
+import net.minecraft.world.item.Item;
 import net.minecraft.world.level.Level;
 
 public class WandHurtful extends BaseWand {
-    public WandHurtful(Properties p_41383_) {
+    public WandHurtful(Item.Properties p_41383_) {
         super(p_41383_);
     }
 
diff --git a/src/main/java/com/jenny/magic/items/WandVacuum.java b/src/main/java/com/jenny/magic/items/wands/WandVacuum.java
similarity index 92%
rename from src/main/java/com/jenny/magic/items/WandVacuum.java
rename to src/main/java/com/jenny/magic/items/wands/WandVacuum.java
index 1471372..f394747 100644
--- a/src/main/java/com/jenny/magic/items/WandVacuum.java
+++ b/src/main/java/com/jenny/magic/items/wands/WandVacuum.java
@@ -1,5 +1,6 @@
-package com.jenny.magic.items;
+package com.jenny.magic.items.wands;
 
+import com.jenny.magic.items.scrolls.ScrollTeleportRandom;
 import com.jenny.magic.networking.networking;
 import com.jenny.magic.networking.packets.EffectS2C;
 import com.jenny.magic.particles.effects;
@@ -16,7 +17,7 @@ import net.minecraft.world.phys.AABB;
 import net.minecraft.world.phys.Vec3;
 import org.jetbrains.annotations.NotNull;
 
-public class WandVacuum extends BaseItem {
+public class WandVacuum extends ScrollTeleportRandom {
     public WandVacuum(Properties pProperties) {
         super(pProperties);
     }
diff --git a/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java b/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java
deleted file mode 100644
index 36f3388..0000000
--- a/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.jenny.magic.mixins;
-
-import com.jenny.magic.mana.ManaClient;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.Gui;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.resources.ResourceLocation;
-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;
-
-@Mixin(Gui.class)
-public class ExperienceToMana {
-    @Shadow
-    protected int screenHeight;
-    @Unique
-    private float experienceProgress;
-    @Unique
-    private int experienceLevel;
-    @Unique
-    private ResourceLocation guiIconsLocation = new ResourceLocation("textures/gui/icons_mana.png");
-
-    @Unique
-    private Gui self() {
-        return (Gui) (Object) this;
-    }
-
-    @Unique
-    private boolean manaMode() {
-        return System.currentTimeMillis() - ManaClient.lastUse < 1000;
-    }
-
-
-    /**
-     * @author xJenny69
-     * @reason display mana instead of xp bar
-     */
-    @Inject(method = "renderExperienceBar", at = @At("HEAD"))
-    public void renderExperienceBarHead(GuiGraphics pGuiGraphics, int pX, CallbackInfo ci) {
-        if (manaMode()) {
-            experienceLevel = Minecraft.getInstance().player.experienceLevel;
-            experienceProgress = Minecraft.getInstance().player.experienceProgress;
-
-            Minecraft.getInstance().player.experienceLevel = ManaClient.mana;
-            Minecraft.getInstance().player.experienceProgress = (float) ManaClient.mana / 100;
-        }
-    }
-
-    @Inject(method = "renderExperienceBar", at = @At("TAIL"))
-    public void renderExperienceBarTail(GuiGraphics pGuiGraphics, int pX, CallbackInfo ci) {
-        if (manaMode()) {
-            int l = this.screenHeight - 32 + 3;
-            pGuiGraphics.blit(guiIconsLocation, pX, l, 0, 64, 182, 5);
-            Minecraft.getInstance().player.experienceLevel = experienceLevel;
-            Minecraft.getInstance().player.experienceProgress = experienceProgress;
-        }
-    }
-}
diff --git a/src/main/java/com/jenny/magic/mixins/PiglinAi.java b/src/main/java/com/jenny/magic/mixins/PiglinAi.java
new file mode 100644
index 0000000..369c6e2
--- /dev/null
+++ b/src/main/java/com/jenny/magic/mixins/PiglinAi.java
@@ -0,0 +1,20 @@
+package com.jenny.magic.mixins;
+
+import com.jenny.magic.items.items;
+import com.jenny.magic.util.util;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.player.Player;
+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.CallbackInfoReturnable;
+
+@Mixin(net.minecraft.world.entity.monster.piglin.PiglinAi.class)
+public class PiglinAi {
+    @Inject(method = "isWearingGold", at = @At("RETURN"), cancellable = true)
+    private static void isWearingGold(LivingEntity pLivingEntity, CallbackInfoReturnable<Boolean> cir) {
+        if (pLivingEntity instanceof Player player && util.hasItem(player, items.AMULET_GOLD.get())) {
+            cir.setReturnValue(true);
+        }
+    }
+}
diff --git a/src/main/java/com/jenny/magic/mixins/ShapelessRecipeMixin.java b/src/main/java/com/jenny/magic/mixins/ShapelessRecipeMixin.java
deleted file mode 100644
index 77c9515..0000000
--- a/src/main/java/com/jenny/magic/mixins/ShapelessRecipeMixin.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.jenny.magic.mixins;
-
-import net.minecraft.core.NonNullList;
-import net.minecraft.core.RegistryAccess;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.world.inventory.CraftingContainer;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.item.crafting.Ingredient;
-import net.minecraft.world.item.crafting.ShapelessRecipe;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Overwrite;
-import org.spongepowered.asm.mixin.Shadow;
-
-@Mixin(ShapelessRecipe.class)
-public class ShapelessRecipeMixin {
-    @Final
-    @Shadow
-    ItemStack result;
-
-    @Final
-    @Shadow
-    NonNullList<Ingredient> ingredients;
-
-    /**
-     * @author xJenny69
-     * @reason allow "magic_quality" tag to be passed on
-     */
-    @Overwrite
-    public ItemStack assemble(CraftingContainer pContainer, RegistryAccess pRegistryAccess) {
-        for (Ingredient ingredient : ingredients) {
-            for (ItemStack itemStack : ingredient.getItems()) {
-                if (itemStack.getTag() != null && itemStack.getTag().contains("magic_quality")) {
-                    CompoundTag tag = result.getTag();
-                    tag.putFloat("magic_quality", itemStack.getTag().getFloat("magic_quality"));
-                    result.setTag(tag);
-                    return result.copy();
-                }
-            }
-        }
-        return result.copy();
-    }
-
-    /**
-     * @author
-     * @reason
-     */
-    @Overwrite
-    public ItemStack getResultItem(RegistryAccess pRegistryAccess) {
-        for (Ingredient ingredient : ingredients) {
-            for (ItemStack itemStack : ingredient.getItems()) {
-                if (itemStack.getTag() != null && itemStack.getTag().contains("magic_quality")) {
-                    CompoundTag tag = result.getTag();
-                    tag.putFloat("magic_quality", itemStack.getTag().getFloat("magic_quality"));
-                    result.setTag(tag);
-                    return result.copy();
-                }
-            }
-        }
-        return result.copy();
-    }
-
-}
diff --git a/src/main/java/com/jenny/magic/util/util.java b/src/main/java/com/jenny/magic/util/util.java
new file mode 100644
index 0000000..62e4708
--- /dev/null
+++ b/src/main/java/com/jenny/magic/util/util.java
@@ -0,0 +1,16 @@
+package com.jenny.magic.util;
+
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.ItemStack;
+
+public class util {
+    public static boolean hasItem(Player player, Item item) {
+        for (ItemStack itemStack : player.getInventory().items) {
+            if (itemStack.getItem().equals(item)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/main/resources/assets/magic/textures/item/amulet_bonemeal.png b/src/main/resources/assets/magic/textures/item/amulet_bonemeal.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e135d5477546e31706ff34835898d8683b5d9df
GIT binary patch
literal 300
zcmV+{0n`48P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#=1D|BR5*>bk}(c~KoCU-4lp%^h1HOdpb3Yu@dg}#Ls%1UKts(f2nIDVk;;N%
z>+Pt<!YpCgWrHS8xjX;OpT7(6&mxMLDB_>RZJl#l=ift=n1`z2p=w+Z&n7O56!yFA
zWqN+Sy^_Q63|;roG~ODq3*x!NVVorZ0MGmB;({1E^H4QJ5hEfaA`?a0-82(lL2S0A
zl%AB*$Z6W^0{{rok9Jj+MLPb2vPd;R7-xwPy`BLgau95cediOESUJ<|*&w#b)3uEK
ymLN9qV$G9RFJkLmq$wu=pO9Bgwn3IAt9k>*X0=S>H`TlV0000<MNUMnLSTYe?tOOv

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_breathing.png b/src/main/resources/assets/magic/textures/item/amulet_breathing.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a8837e07d589703d0a555751f76e7047f79b8bf
GIT binary patch
literal 278
zcmV+x0qOpUP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#&`Cr=R5*>blQ9ayFcgOWcz`!|5DE?%DkAg_y@XeA>^U4AdVwCNR78gkg3uvz
zE)WMvNt^eg2);4A?|c6X3GmO-x^P+-?q|4adRH}lQlca{uUpV&-vNMqT*~L^fMK{t
z{n5b^_9aQwH*iX#Qt<V-EdgM6zIBpBrC?)506><lMajw^a<Q$o%32%UQ`ox#0At1}
zuCKgqr+1Lo?Mx7+o9sm7xTwpC9`?y*@i+-LIb18=PmpjhE8rv&EDAyi@V;aY{#Zoh
ch$#6RUt$29kI;8Nw*UYD07*qoM6N<$f^j==_W%F@

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_gold.png b/src/main/resources/assets/magic/textures/item/amulet_gold.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b1a14022f1460baa69e5a6c115a7d98c38326d7
GIT binary patch
literal 283
zcmV+$0p$LPP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#)k#D_R5*>blfMeWFc61-DTv$69o#ClbP@V6zJO2BC-5nxdtak-OI-wuV~5Py
zieMZhCAF9M2fXpf_vLp-0{pY$IMs2S>Yw4Zh;&;--%AXvtEARdQu`!=gUfutcD-oq
z{^@$lc84Xp?mS_{C$LW<eDG!;WB_nE-W!)h_+Tk}06-Y7oRYvax!6i6p_H2K$vztZ
zfRz0h*HoDg<2xwxVIr{8jdmi^T-4Va4Q!H4;&Br0W_zsJd@czGvjR@yf}H|e0z8+@
h!EcL*G!c0}(gRZ?p3ruL9v=Vz002ovPDHLkV1nfEcqRY<

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_growth.png b/src/main/resources/assets/magic/textures/item/amulet_growth.png
new file mode 100644
index 0000000000000000000000000000000000000000..62ec7138ea43a4059af124c7f6d0fb8b0d77471f
GIT binary patch
literal 272
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|PI<aGhFJ7&
zoovf>$U(sEKHKY+!5lBcI65XAW+@Wzf9S|$>Epn1u*9kBN_FGb3A~0gV{_*e&G`Q9
zw*8Ov$mptU@A<QCE`6{rgJDJHUxPcnX3Nc(YbMq57nCN4+DDt5T(+^z`KZb>aSK&L
z%^wB3Lm2uW@9g*V;hMKhu)*fOyJ}=c*2cNT$1Jy7E`OTCX5jl+#ylk4<g+!$^_5F!
zzg2p)b;WB@W|>K~M=q<}I(0fX_nY|Sj15{BR17V&BD@~do{;*p)#XUH$0zfB3;_>j
U=WcD20Qr}})78&qol`;+0OAmBkpKVy

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_nightvision.png b/src/main/resources/assets/magic/textures/item/amulet_nightvision.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fc27c8db4385e94e4b5bf4d77ef8d4e2e783f99
GIT binary patch
literal 267
zcmV+m0rdWfP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px##Ysd#R5*>blc5g6Fc60SHW1wD33NlYDI|}w2i&6|QH+r3iRyENgd(8LSg!|$
zbGzL4^>5b#|19U~;9MQFnUw~&wts(gVH__;niHE5ruA+B0KQ+F^P__#$r?*IR!L%h
zfi;QI;NxxI0Kj2$8cGtQ!QM{*fU4RSB{nvt*vxF0IXkEMtOWq?rxZ6<Yx{H$((e?~
zB|8xXDe7{?2*+d}@g#|~@_bwQ{t6Na76p=|1Q!K!3Gg~(3I19{6o^QDjZZycnxYi}
Rn8g49002ovPDHLkV1ldgYCiw~

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_repair.png b/src/main/resources/assets/magic/textures/item/amulet_repair.png
index 1b847d5289c758f5b815848c3e65e3dc294e151b..d47d28c9053579cbdc17f4a299d6d4e90924827c 100644
GIT binary patch
delta 226
zcmV<803HAH0gD2VF@MELL_t(IjkS|K4#F@DM!yuXdaeX>kh&oCF6A5?g>#g<RAND*
zbCEJ<MI{W#QE2SIf=A2m<;x%N&$6}&);6IuV@mMccL0FZ;f!&-inC&q;q`tq0KnsN
zZ#7BQSi)SI#QXx6B&GyEcc&Hrs@rkUB&GyAHvs_ZdaFt*Zd*#Rz4yj@pPf@WTLFM`
zQ;f?s_g#Dke4SFdXeXi|MP07QFem$nCrPB0(`{w@(<Bls3M7dJtAbPlyboD|zZMY%
cA}apI7p+a5OyyF>P5=M^07*qoM6N<$f?lm;z5oCK

delta 202
zcmV;*05$)M0`mcoF@LQ|L_t(IjbmV-B``9w_-|xn@t<tX=N59DI=7JH6v>9bH2*ou
zvG&hVj<xs<VZ^3+PX2|{dMXT$k;O0FVUSIkXkdEo+zAXlIBkZ70WmJYs+o(6YX%n=
z*9?M&;L;3}$7cu=OcA=DzkU0bfsKt#EnXXlaUotq2x(?SH$y~2LofZ*<O}N<7$8xH
z>}0cCgP<EXF3m*u5?+_!bvChvkfa&i5VABQ8$w7k0I)K~IRjazi~s-t07*qoM6N<$
Ef>0<}NdN!<

diff --git a/src/main/resources/assets/magic/textures/item/amulet_saturation.png b/src/main/resources/assets/magic/textures/item/amulet_saturation.png
new file mode 100644
index 0000000000000000000000000000000000000000..c67e57f3882a33c7949766927cb5f03724c08b63
GIT binary patch
literal 289
zcmV++0p9+JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#+et)0R5*>blCcegFc3u#2Dq9cHHx5!<QeGLAVZ|d95f8U0w@wiRv>~R2tkJ^
zTzdhhhz@}{hY%^(`u_Xh-v;>S_<o>$KhQsmi@efBUhRjFc<6OG^t#*yF~wUD#}ubY
z2Ep<4;NVSLi_7&4UDr6PL(Z8>+)QE<Bcevcj}Vt2Tx_M3qm)|3o$tB;08)++#i5ul
zrAapZgEYw&fG7@yl;g5QMAV*lfcxz^(VMmwrXz_d*&-eX;hg8!THVhE;l$Q4o2M7y
ncC9o@0`M;RD`yU3bEbI#b9U7-alN+g00000NkvXXu0mjf_-c9G

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/magic/textures/item/amulet_suction.png b/src/main/resources/assets/magic/textures/item/amulet_suction.png
new file mode 100644
index 0000000000000000000000000000000000000000..b76be27db14e5c6029ce6bc0b5e148dc68768c5d
GIT binary patch
literal 273
zcmV+s0q*{ZP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#%Sl8*R5*>blRXN;KoCa14c1c!BG|2%M#y1ugWST>TjT~gOu$Aloe*K`xxiY;
zgf%<6+BoGf@9npLz(32{+FM)u+{`8icS8jL=v(+{x*BaxZ3?_Q(g*;L3paiHgeHj^
zYgj5JF~7h$iOIpI{jC9j^ZhWUBqj$tHv<65a+{PC($r!zvtj1woWj`x0GykbxKiCv
zE$=|CQ%kqliO6eF*DDGv$v)y~5^d#hThabf5)D=bnj{4$1)&6ZAF>92Eh6$nl>Ln_
XPNSP?eG-vW00000NkvXXu0mjf0)%a}

literal 0
HcmV?d00001

diff --git a/src/main/resources/magic.mixins.json b/src/main/resources/magic.mixins.json
index e6ed0fe..adbed21 100644
--- a/src/main/resources/magic.mixins.json
+++ b/src/main/resources/magic.mixins.json
@@ -2,14 +2,12 @@
   "required": true,
   "minVersion": "0.8",
   "package": "com.jenny.magic.mixins",
-  "compatibilityLevel": "JAVA_8",
+  "compatibilityLevel": "JAVA_17",
   "refmap": "magic.refmap.json",
   "mixins": [
-    "ShapelessRecipeMixin"
-  ],
-  "client": [
-    "ExperienceToMana"
+    "PiglinAi"
   ],
+  "client": [],
   "injectors": {
     "defaultRequire": 1
   }