From 18672ff97f6826b8dc8ad8c835830a8d14dd3b25 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:14:35 -0700 Subject: [PATCH] Fix MTE Initial Sync sending the wrong data (#2587) --- .../api/block/machines/BlockMachine.java | 86 ++++++++++--------- .../metatileentity/MetaTileEntityHolder.java | 5 +- .../interfaces/IGregTechTileEntity.java | 11 ++- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/main/java/gregtech/api/block/machines/BlockMachine.java b/src/main/java/gregtech/api/block/machines/BlockMachine.java index 5dc0ca85d18..2a04cf5d441 100644 --- a/src/main/java/gregtech/api/block/machines/BlockMachine.java +++ b/src/main/java/gregtech/api/block/machines/BlockMachine.java @@ -271,34 +271,38 @@ public void onBlockPlacedBy(World worldIn, @NotNull BlockPos pos, @NotNull IBloc Objects.requireNonNull(stack.getItem().getRegistryName()).getNamespace()); MetaTileEntity sampleMetaTileEntity = registry.getObjectById(stack.getItemDamage()); - if (holder != null && sampleMetaTileEntity != null) { - // TODO Fix this - if (stack.hasDisplayName() && holder instanceof MetaTileEntityHolder) { - ((MetaTileEntityHolder) holder).setCustomName(stack.getDisplayName()); - } - MetaTileEntity metaTileEntity = holder.setMetaTileEntity(sampleMetaTileEntity); - var stackTag = stack.getTagCompound(); - if (stackTag != null && !stackTag.isEmpty()) { - if (stackTag.hasKey(GregtechDataCodes.BLOCK_ENTITY_TAG)) { - var blockTag = stackTag.getCompoundTag(GregtechDataCodes.BLOCK_ENTITY_TAG); - String customName = blockTag.getString(GregtechDataCodes.CUSTOM_NAME); - if (!customName.isEmpty()) - ((MetaTileEntityHolder) holder).setCustomName(customName); - - var mteTag = blockTag.getCompoundTag(GregtechDataCodes.TAG_KEY_MTE); - List removed = new ArrayList<>(); - for (var key : mteTag.getKeySet()) { - var trait = metaTileEntity.getMTETrait(key); - if (trait == null) continue; - - removed.add(key); - } - removed.forEach(mteTag::removeTag); - metaTileEntity.readFromNBT(mteTag); - } else { - metaTileEntity.initFromItemStackData(stackTag); + if (holder == null || sampleMetaTileEntity == null) + return; + + // TODO Fix this + if (stack.hasDisplayName() && holder instanceof MetaTileEntityHolder) { + ((MetaTileEntityHolder) holder).setCustomName(stack.getDisplayName()); + } + var stackTag = stack.getTagCompound(); + NBTTagCompound mteTag = null; + if (stackTag != null && !stackTag.isEmpty()) { + if (stackTag.hasKey(GregtechDataCodes.BLOCK_ENTITY_TAG)) { + var blockTag = stackTag.getCompoundTag(GregtechDataCodes.BLOCK_ENTITY_TAG); + String customName = blockTag.getString(GregtechDataCodes.CUSTOM_NAME); + if (!customName.isEmpty()) + ((MetaTileEntityHolder) holder).setCustomName(customName); + + mteTag = blockTag.getCompoundTag(GregtechDataCodes.TAG_KEY_MTE); + List removed = new ArrayList<>(); + for (var key : mteTag.getKeySet()) { + var trait = sampleMetaTileEntity.getMTETrait(key); + if (trait == null) continue; + + removed.add(key); } + removed.forEach(mteTag::removeTag); } + } + MetaTileEntity metaTileEntity = holder.setMetaTileEntity(sampleMetaTileEntity, mteTag); + if (mteTag == null) { + if (stackTag != null && !stackTag.isEmpty()) + metaTileEntity.initFromItemStackData(stackTag); + if (metaTileEntity.isValidFrontFacing(EnumFacing.UP)) { metaTileEntity.setFrontFacing(EnumFacing.getDirectionFromEntityLiving(pos, placer)); } else { @@ -314,26 +318,26 @@ public void onBlockPlacedBy(World worldIn, @NotNull BlockPos pos, @NotNull IBloc } } } - if (Mods.AppliedEnergistics2.isModLoaded()) { - if (metaTileEntity.getProxy() != null) { - metaTileEntity.getProxy().setOwner((EntityPlayer) placer); - } + } + if (Mods.AppliedEnergistics2.isModLoaded()) { + if (metaTileEntity.getProxy() != null) { + metaTileEntity.getProxy().setOwner((EntityPlayer) placer); } + } - // Color machines on place if holding spray can in off-hand - if (placer instanceof EntityPlayer) { - ItemStack offhand = placer.getHeldItemOffhand(); - for (int i = 0; i < EnumDyeColor.values().length; i++) { - if (offhand.isItemEqual(MetaItems.SPRAY_CAN_DYES[i].getStackForm())) { - MetaItems.SPRAY_CAN_DYES[i].getBehaviours().get(0).onItemUse((EntityPlayer) placer, worldIn, - pos, EnumHand.OFF_HAND, EnumFacing.UP, 0, 0, 0); - break; - } + // Color machines on place if holding spray can in off-hand + if (placer instanceof EntityPlayer) { + ItemStack offhand = placer.getHeldItemOffhand(); + for (int i = 0; i < EnumDyeColor.values().length; i++) { + if (offhand.isItemEqual(MetaItems.SPRAY_CAN_DYES[i].getStackForm())) { + MetaItems.SPRAY_CAN_DYES[i].getBehaviours().get(0).onItemUse((EntityPlayer) placer, worldIn, + pos, EnumHand.OFF_HAND, EnumFacing.UP, 0, 0, 0); + break; } } - - metaTileEntity.onPlacement(placer); } + + metaTileEntity.onPlacement(placer); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java index 8fe6d31c0c2..6884f33ac38 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntityHolder.java @@ -89,9 +89,12 @@ public MetaTileEntity getMetaTileEntity() { * Also can use certain data to preinit the block before data is synced */ @Override - public MetaTileEntity setMetaTileEntity(MetaTileEntity sampleMetaTileEntity) { + public MetaTileEntity setMetaTileEntity(@NotNull MetaTileEntity sampleMetaTileEntity, + @Nullable NBTTagCompound tagCompound) { Preconditions.checkNotNull(sampleMetaTileEntity, "metaTileEntity"); setRawMetaTileEntity(sampleMetaTileEntity.createMetaTileEntity(this)); + if (tagCompound != null && !tagCompound.isEmpty()) + getMetaTileEntity().readFromNBT(tagCompound); if (hasWorld() && !getWorld().isRemote) { updateBlockOpacity(); writeCustomData(INITIALIZE_MTE, buffer -> { diff --git a/src/main/java/gregtech/api/metatileentity/interfaces/IGregTechTileEntity.java b/src/main/java/gregtech/api/metatileentity/interfaces/IGregTechTileEntity.java index 43446101414..df7ae0563fe 100644 --- a/src/main/java/gregtech/api/metatileentity/interfaces/IGregTechTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/interfaces/IGregTechTileEntity.java @@ -3,6 +3,11 @@ import gregtech.api.gui.IUIHolder; import gregtech.api.metatileentity.MetaTileEntity; +import net.minecraft.nbt.NBTTagCompound; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + /** * A simple compound Interface for all my TileEntities. *

@@ -13,7 +18,11 @@ public interface IGregTechTileEntity extends IHasWorldObjectAndCoords, INeighbor MetaTileEntity getMetaTileEntity(); - MetaTileEntity setMetaTileEntity(MetaTileEntity metaTileEntity); + default MetaTileEntity setMetaTileEntity(MetaTileEntity metaTileEntity) { + return setMetaTileEntity(metaTileEntity, null); + } + + MetaTileEntity setMetaTileEntity(@NotNull MetaTileEntity metaTileEntity, @Nullable NBTTagCompound tagCompound); long getOffsetTimer(); // todo might not keep this one