From 096265aef2df1ea3205d81ce3aa7eb7034d48b29 Mon Sep 17 00:00:00 2001 From: EdgeAtZero Date: Mon, 12 Jan 2026 22:35:51 +0800 Subject: [PATCH] add an instant var TAG to HubItem add MixinLecternControllerBlockEntity to ensure LecternControllerBlockEntity has the tag Hub --- .../MixinLecternControllerBlockEntity.java | 61 +++++++++++++++++++ .../stratodonut/drivebywire/util/HubItem.java | 8 ++- src/main/resources/drivebywire.mixins.json | 1 + 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100755 src/main/java/edn/stratodonut/drivebywire/mixin/compat/MixinLecternControllerBlockEntity.java diff --git a/src/main/java/edn/stratodonut/drivebywire/mixin/compat/MixinLecternControllerBlockEntity.java b/src/main/java/edn/stratodonut/drivebywire/mixin/compat/MixinLecternControllerBlockEntity.java new file mode 100755 index 0000000..4797278 --- /dev/null +++ b/src/main/java/edn/stratodonut/drivebywire/mixin/compat/MixinLecternControllerBlockEntity.java @@ -0,0 +1,61 @@ +package edn.stratodonut.drivebywire.mixin.compat; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.redstone.link.controller.LecternControllerBlockEntity; +import edn.stratodonut.drivebywire.util.HubItem; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static edn.stratodonut.drivebywire.util.HubItem.TAG; + +@Mixin(LecternControllerBlockEntity.class) +public class MixinLecternControllerBlockEntity { + + @Unique + private BlockPos drivebywire$blockPos; + + @Inject(method = "read", at = @At("RETURN"), remap = false) + private void read(CompoundTag compound, boolean clientPacket, CallbackInfo ci) { + if (compound.contains(TAG)) { + this.drivebywire$blockPos = BlockPos.of(compound.getLong(TAG)); + } + } + + @Inject(method = "write", at = @At("TAIL"), remap = false) + private void write(CompoundTag compound, boolean clientPacket, CallbackInfo ci) { + if (this.drivebywire$blockPos != null) { + compound.putLong(TAG, this.drivebywire$blockPos.asLong()); + } + } + + @Inject(method = "writeSafe", at = @At("TAIL"), remap = false) + private void writeSafe(CompoundTag compound, CallbackInfo ci) { + if (this.drivebywire$blockPos != null) { + compound.putLong(TAG, this.drivebywire$blockPos.asLong()); + } + } + + @Inject(method = "setController", at = @At("HEAD"), remap = false) + private void setController(ItemStack newController, CallbackInfo ci) { + if (newController != null && AllItems.LINKED_CONTROLLER.get() == newController.getItem()) { + HubItem.ifHubPresent(newController, (pos) -> this.drivebywire$blockPos = pos); + } + } + + // the oldest version 0.5.1 don't have the method, so set require 0 + @Inject(method = "createLinkedController", at = @At("RETURN"), remap = false, require = 0) + private void createLinkedController(CallbackInfoReturnable cir) { + ItemStack stack = cir.getReturnValue(); + if ((stack.hasTag() && !stack.getTag().contains(TAG, Tag.TAG_LONG)) && this.drivebywire$blockPos != null) { + HubItem.putHub(stack, this.drivebywire$blockPos); + } + } +} diff --git a/src/main/java/edn/stratodonut/drivebywire/util/HubItem.java b/src/main/java/edn/stratodonut/drivebywire/util/HubItem.java index 22690f6..afb3dc8 100644 --- a/src/main/java/edn/stratodonut/drivebywire/util/HubItem.java +++ b/src/main/java/edn/stratodonut/drivebywire/util/HubItem.java @@ -8,15 +8,17 @@ import java.util.function.Consumer; public class HubItem { + public static String TAG = "Hub"; + public static void putHub(ItemStack itemStack, BlockPos pos) { CompoundTag nbt = itemStack.getOrCreateTag(); - nbt.putLong("Hub", pos.asLong()); + nbt.putLong(TAG, pos.asLong()); itemStack.setTag(nbt); } public static void ifHubPresent(ItemStack itemStack, Consumer runnable) { - if (itemStack.hasTag() && itemStack.getTag().contains("Hub", Tag.TAG_LONG)) { - runnable.accept(BlockPos.of(itemStack.getTag().getLong("Hub"))); + if (itemStack.hasTag() && itemStack.getTag().contains(TAG, Tag.TAG_LONG)) { + runnable.accept(BlockPos.of(itemStack.getTag().getLong(TAG))); } } } diff --git a/src/main/resources/drivebywire.mixins.json b/src/main/resources/drivebywire.mixins.json index 2d27cce..0983d6d 100644 --- a/src/main/resources/drivebywire.mixins.json +++ b/src/main/resources/drivebywire.mixins.json @@ -5,6 +5,7 @@ "mixins": [ "MixinServerLevel", "compat.MixinLecternControllerBlock", + "compat.MixinLecternControllerBlockEntity", "compat.MixinLinkedControllerInputPacket", "compat.MixinLinkedControllerStopLecternPacket", "compat.tweaked.MixinLecternTweakedBlock",