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);