diff --git a/projects/pswg_blasters/src/main/java/dev/pswg/item/BlasterItem.java b/projects/pswg_blasters/src/main/java/dev/pswg/item/BlasterItem.java
index 9abc4e64d..f83023fdd 100644
--- a/projects/pswg_blasters/src/main/java/dev/pswg/item/BlasterItem.java
+++ b/projects/pswg_blasters/src/main/java/dev/pswg/item/BlasterItem.java
@@ -137,7 +137,7 @@ public UseAction getUseAction(ItemStack stack)
 	@Override
 	public boolean onStoppedUsing(ItemStack stack, World world, LivingEntity user, int remainingUseTicks)
 	{
-		if (!world.isClient && user.getItemUseTime() > TOGGLE_AIMING_USE_TIME_TICKS && isAiming(stack))
+		if (!world.isClient() && user.getItemUseTime() > TOGGLE_AIMING_USE_TIME_TICKS && isAiming(stack))
 			setAiming(stack, false);
 
 		return super.onStoppedUsing(stack, world, user, remainingUseTicks);
@@ -148,7 +148,7 @@ public ActionResult use(World world, PlayerEntity user, Hand hand)
 	{
 		var stack = user.getStackInHand(hand);
 
-		if (!world.isClient)
+		if (!world.isClient())
 		{
 			setAiming(stack, !isAiming(stack));
 
diff --git a/projects/pswg_core/src/main/java/dev/pswg/Galaxies.java b/projects/pswg_core/src/main/java/dev/pswg/Galaxies.java
index 4423586c9..35c59a6e2 100644
--- a/projects/pswg_core/src/main/java/dev/pswg/Galaxies.java
+++ b/projects/pswg_core/src/main/java/dev/pswg/Galaxies.java
@@ -6,11 +6,14 @@
 import dev.pswg.configuration.MemoryConfigContainer;
 import dev.pswg.interaction.GalaxiesEntityLeftClickManager;
 import dev.pswg.interaction.GalaxiesPlayerActionManager;
+import dev.pswg.interaction.LeftClickingEntityAttachment;
 import dev.pswg.networking.GalaxiesPlayerActionC2SPacket;
 import dev.pswg.networking.PlayerInteractItemLeftC2SPacket;
 import dev.pswg.updater.GithubReleaseEntry;
 import dev.pswg.updater.UpdateChecker;
 import net.fabricmc.api.ModInitializer;
+import net.fabricmc.fabric.api.attachment.v1.AttachmentRegistry;
+import net.fabricmc.fabric.api.attachment.v1.AttachmentType;
 import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.util.Identifier;
@@ -57,6 +60,15 @@ public static Identifier id(String path)
 	 */
 	public static final IConfigContainer<GalaxiesConfig> CONFIG = new MemoryConfigContainer<>(new GalaxiesConfig());
 
+	/**
+	 * An attachment for entities that contains the data required to
+	 * represent their left-using state
+	 */
+	public static final AttachmentType<LeftClickingEntityAttachment> LEFT_CLICKING_ATTACHMENT = AttachmentRegistry.createPersistent(
+			id("left_clicking_entity"),
+			LeftClickingEntityAttachment.CODEC
+	);
+
 	/**
 	 * Create a derived logger for a subsystem within PSWG
 	 *
diff --git a/projects/pswg_core/src/main/java/dev/pswg/interaction/LeftClickingEntityAttachment.java b/projects/pswg_core/src/main/java/dev/pswg/interaction/LeftClickingEntityAttachment.java
new file mode 100644
index 000000000..4f9b74e86
--- /dev/null
+++ b/projects/pswg_core/src/main/java/dev/pswg/interaction/LeftClickingEntityAttachment.java
@@ -0,0 +1,27 @@
+package dev.pswg.interaction;
+
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+import dev.pswg.Galaxies;
+import net.minecraft.entity.LivingEntity;
+
+public record LeftClickingEntityAttachment(boolean isUsingItemLeft, int itemLeftUseTimeLeft)
+{
+	public static final Codec<LeftClickingEntityAttachment> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+			Codec.BOOL.fieldOf("isUsingItemLeft").forGetter(LeftClickingEntityAttachment::isUsingItemLeft),
+			Codec.INT.fieldOf("itemLeftUseTimeLeft").forGetter(LeftClickingEntityAttachment::itemLeftUseTimeLeft)
+	).apply(instance, LeftClickingEntityAttachment::new));
+
+	public static LeftClickingEntityAttachment get(LivingEntity entity)
+	{
+		return entity.getAttachedOrCreate(Galaxies.LEFT_CLICKING_ATTACHMENT, () -> new LeftClickingEntityAttachment(
+				false,
+				0
+		));
+	}
+
+	public LeftClickingEntityAttachment withIsLeftUsing(boolean isLeftUsing)
+	{
+		return new LeftClickingEntityAttachment(isLeftUsing, itemLeftUseTimeLeft);
+	}
+}
diff --git a/projects/pswg_core/src/main/java/dev/pswg/mixin/LivingEntityMixin.java b/projects/pswg_core/src/main/java/dev/pswg/mixin/LivingEntityMixin.java
index 146b24486..8bf9d5482 100644
--- a/projects/pswg_core/src/main/java/dev/pswg/mixin/LivingEntityMixin.java
+++ b/projects/pswg_core/src/main/java/dev/pswg/mixin/LivingEntityMixin.java
@@ -1,6 +1,8 @@
 package dev.pswg.mixin;
 
+import dev.pswg.Galaxies;
 import dev.pswg.interaction.ILeftClickingEntity;
+import dev.pswg.interaction.LeftClickingEntityAttachment;
 import dev.pswg.item.ILeftClickUsable;
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.item.ItemStack;
@@ -13,11 +15,8 @@
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
 @Mixin(LivingEntity.class)
-public class LivingEntityMixin implements ILeftClickingEntity
+public abstract class LivingEntityMixin implements ILeftClickingEntity
 {
-	@Unique
-	private boolean isUsingItemLeft;
-
 	@Unique
 	private int itemLeftUseTimeLeft;
 
@@ -27,17 +26,20 @@ public class LivingEntityMixin implements ILeftClickingEntity
 	@Override
 	public boolean pswg$isLeftUsingItem()
 	{
-		return isUsingItemLeft;
+		var self = (LivingEntity)(Object)this;
+
+		var attachment = LeftClickingEntityAttachment.get(self);
+		return attachment.isUsingItemLeft();
 	}
 
 	@Override
 	public void pswg$setLeftUsingItem(boolean isLeftUsing)
 	{
-		// TODO: find all setters
-		isUsingItemLeft = isLeftUsing;
-
 		var self = (LivingEntity)(Object)this;
 
+		var attachment = LeftClickingEntityAttachment.get(self);
+		self.setAttached(Galaxies.LEFT_CLICKING_ATTACHMENT, attachment.withIsLeftUsing(isLeftUsing));
+
 		if (this.pswg$isLeftUsingItem() && this.pswg$getLeftActiveItemStack().isEmpty())
 		{
 			var activeStack = self.getStackInHand(self.getActiveHand());
@@ -136,7 +138,7 @@ else if (!this.pswg$isLeftUsingItem() && !this.pswg$getLeftActiveItemStack().isE
 		if (!(stack.getItem() instanceof ILeftClickUsable leftClickingItem))
 			throw new RuntimeException("Attempted to tick usage of non-left-clicking item");
 
-		if (this.pswg$getItemLeftUseTimeLeft() == 0 && !self.getWorld().isClient && !leftClickingItem.isUsedOnLeftRelease(stack))
+		if (this.pswg$getItemLeftUseTimeLeft() == 0 && !self.getWorld().isClient() && !leftClickingItem.isUsedOnLeftRelease(stack))
 		{
 			this.pswg$consumeLeftItem();
 		}
@@ -147,7 +149,7 @@ else if (!this.pswg$isLeftUsingItem() && !this.pswg$getLeftActiveItemStack().isE
 	{
 		var self = (LivingEntity)(Object)this;
 
-		if (!self.getWorld().isClient || this.pswg$isLeftUsingItem())
+		if (!self.getWorld().isClient() || this.pswg$isLeftUsingItem())
 		{
 			Hand hand = self.getActiveHand();
 			if (!this.pswg$getLeftActiveItemStack().equals(self.getStackInHand(hand)))
@@ -189,7 +191,7 @@ else if (!this.pswg$isLeftUsingItem() && !this.pswg$getLeftActiveItemStack().isE
 
 			this.pswg$setItemLeftUseTimeLeft(leftClickingItem.getMaxUseLeftTime(itemStack, self));
 
-			if (!self.getWorld().isClient)
+			if (!self.getWorld().isClient())
 			{
 				this.pswg$setLeftUsingItem(true);
 
@@ -206,7 +208,7 @@ else if (!this.pswg$isLeftUsingItem() && !this.pswg$getLeftActiveItemStack().isE
 	{
 		var self = (LivingEntity)(Object)this;
 
-		if (!self.getWorld().isClient)
+		if (!self.getWorld().isClient())
 		{
 			boolean wasUsingItem = this.pswg$isLeftUsingItem();
 			this.pswg$setLeftUsingItem(false);