diff --git a/src/main/java/appeng/client/gui/Size1Slot.java b/src/main/java/appeng/client/gui/Size1Slot.java index 880223340..dc665d8e1 100644 --- a/src/main/java/appeng/client/gui/Size1Slot.java +++ b/src/main/java/appeng/client/gui/Size1Slot.java @@ -21,10 +21,10 @@ import appeng.client.me.SlotME; */ class Size1Slot extends Slot { - private final SlotME delegate; + private final Slot delegate; - public Size1Slot(SlotME delegate) { - super(delegate.inventory, -1, delegate.x, delegate.y); + public Size1Slot(Slot delegate) { + super(delegate.inventory, -1, delegate.xPos, delegate.yPos); this.delegate = delegate; } diff --git a/src/main/java/appeng/client/me/FluidRepo.java b/src/main/java/appeng/client/me/FluidRepo.java index f92cd12a1..7378efd05 100644 --- a/src/main/java/appeng/client/me/FluidRepo.java +++ b/src/main/java/appeng/client/me/FluidRepo.java @@ -41,11 +41,6 @@ import appeng.fluids.util.FluidSorters; import appeng.util.Platform; import appeng.util.prioritylist.IPartitionList; -/** - * @author BrockWS - * @version rv6 - 22/05/2018 - * @since rv6 22/05/2018 - */ public class FluidRepo { private final IItemList list = Api.instance().storage().getStorageChannel(IFluidStorageChannel.class) .createList(); diff --git a/src/main/java/appeng/client/me/SlotFluidME.java b/src/main/java/appeng/client/me/SlotFluidME.java index c8842f1be..ee4acc67f 100644 --- a/src/main/java/appeng/client/me/SlotFluidME.java +++ b/src/main/java/appeng/client/me/SlotFluidME.java @@ -21,23 +21,23 @@ package appeng.client.me; import javax.annotation.Nonnull; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import appeng.api.storage.data.IAEFluidStack; import appeng.fluids.container.slots.IMEFluidSlot; -/** - * @author BrockWS - * @version rv6 - 22/05/2018 - * @since rv6 22/05/2018 - */ public class SlotFluidME extends Slot implements IMEFluidSlot { + private static final IInventory EMPTY_INVENTORY = new Inventory(0); + private final InternalFluidSlotME slot; public SlotFluidME(InternalFluidSlotME slot) { - super(null, 0, slot.getxPosition(), slot.getyPosition()); + super(EMPTY_INVENTORY, 0, slot.getxPosition(), slot.getyPosition()); this.slot = slot; } @@ -69,7 +69,7 @@ public class SlotFluidME extends Slot implements IMEFluidSlot { } @Override - public void setStack(final ItemStack par1ItemStack) { + public void setStack(final ItemStack stack) { } @@ -85,7 +85,7 @@ public class SlotFluidME extends Slot implements IMEFluidSlot { } @Override - public boolean canTakeItems(final PlayerEntity par1PlayerEntity) { + public boolean canTakeItems(final PlayerEntity player) { return false; } } diff --git a/src/main/java/appeng/client/me/SlotME.java b/src/main/java/appeng/client/me/SlotME.java index 6b9b2b4ce..7d5a94b78 100644 --- a/src/main/java/appeng/client/me/SlotME.java +++ b/src/main/java/appeng/client/me/SlotME.java @@ -19,6 +19,9 @@ package appeng.client.me; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -26,16 +29,18 @@ import appeng.api.storage.data.IAEItemStack; public class SlotME extends Slot { - private final InternalSlotME mySlot; + private static final Inventory EMPTY_INVENTORY = new Inventory(0); - public SlotME(final InternalSlotME me) { - super(null, 0, me.getxPosition(), me.getyPosition()); - this.mySlot = me; + private final InternalSlotME slot; + + public SlotME(final InternalSlotME slot) { + super(EMPTY_INVENTORY, 0, slot.getxPosition(), slot.getyPosition()); + this.slot = slot; } public IAEItemStack getAEStack() { - if (this.mySlot.hasPower()) { - return this.mySlot.getAEStack(); + if (this.slot.hasPower()) { + return this.slot.getAEStack(); } return null; } @@ -47,15 +52,15 @@ public class SlotME extends Slot { @Override public ItemStack getStack() { - if (this.mySlot.hasPower()) { - return this.mySlot.getStack(); + if (this.slot.hasPower()) { + return this.slot.getStack(); } return ItemStack.EMPTY; } @Override public boolean hasStack() { - if (this.mySlot.hasPower()) { + if (this.slot.hasPower()) { return !this.getStack().isEmpty(); } return false; diff --git a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java index 4f2c1937d..8dc8e7fb9 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java @@ -20,7 +20,6 @@ package appeng.client.render.cablebus; import java.util.ArrayList; import java.util.EnumMap; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -40,6 +39,11 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.cache.Weigher; + import net.minecraft.block.BlockState; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedQuad; @@ -63,8 +67,10 @@ public class CableBusBakedModel implements BakedModel, FabricBakedModel { private static final Renderer RENDERER = RendererAccess.INSTANCE.getRenderer(); - // FIXME: This entire cache seems dumb as shit - private static final Map CABLE_MODEL_CACHE = new HashMap<>(); + // The number of quads overall that will be cached + private static final int CACHE_QUAD_COUNT = 5000; + + private static final LoadingCache cableModelCache = new HashMap<>(); private final CableBuilder cableBuilder; @@ -80,6 +86,17 @@ public class CableBusBakedModel implements BakedModel, FabricBakedModel { this.facadeBuilder = facadeBuilder; this.partModels = partModels; this.particleTexture = particleTexture; + this.cableModelCache = CacheBuilder.newBuilder()// + .maximumWeight(CACHE_QUAD_COUNT)// + .weigher((Weigher>) (key, value) -> value.size())// + .build(new CacheLoader>() { + @Override + public List load(CableBusRenderState renderState) { + final List model = new ArrayList<>(); + addCableQuads(renderState, model); + return model; + } + }); } @Override @@ -359,10 +376,6 @@ public class CableBusBakedModel implements BakedModel, FabricBakedModel { return ModelOverrideList.EMPTY; } - public static void clearCache() { - CABLE_MODEL_CACHE.clear(); - } - @Override public boolean isVanillaAdapter() { return false; diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java b/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java index 618976192..36a030ccc 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModelLoader.java @@ -23,7 +23,6 @@ public class CableBusModelLoader implements ModelResourceProvider { public UnbakedModel loadModelResource(Identifier resourceId, ModelProviderContext context) throws ModelProviderException { if (CABLE_BUS_MODEL.equals(resourceId)) { - CableBusBakedModel.clearCache(); return new CableBusModel(partModels); } else { return null; diff --git a/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java b/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java index 1d0a40353..5a768a4db 100644 --- a/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java +++ b/src/main/java/appeng/container/implementations/InterfaceTerminalContainer.java @@ -45,7 +45,7 @@ import appeng.api.networking.security.IActionHost; import appeng.container.AEBaseContainer; import appeng.container.ContainerLocator; import appeng.core.sync.network.NetworkHandler; -import appeng.core.sync.packets.CompressedNBTPacket; +import appeng.core.sync.packets.MEInterfaceUpdatePacket; import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.InventoryAction; @@ -177,7 +177,7 @@ public final class InterfaceTerminalContainer extends AEBaseContainer { if (!this.data.isEmpty()) { try { - NetworkHandler.instance().sendTo(new CompressedNBTPacket(this.data), + NetworkHandler.instance().sendTo(new MEInterfaceUpdatePacket(this.data), (ServerPlayerEntity) this.getPlayerInv().player); } catch (final IOException e) { // :P diff --git a/src/main/java/appeng/core/sync/BasePacketHandler.java b/src/main/java/appeng/core/sync/BasePacketHandler.java index cca1d33ab..14447a0df 100644 --- a/src/main/java/appeng/core/sync/BasePacketHandler.java +++ b/src/main/java/appeng/core/sync/BasePacketHandler.java @@ -29,7 +29,6 @@ import appeng.core.sync.packets.BlockTransitionEffectPacket; import appeng.core.sync.packets.ClickPacket; import appeng.core.sync.packets.CompassRequestPacket; import appeng.core.sync.packets.CompassResponsePacket; -import appeng.core.sync.packets.CompressedNBTPacket; import appeng.core.sync.packets.ConfigButtonPacket; import appeng.core.sync.packets.ConfigValuePacket; import appeng.core.sync.packets.CraftRequestPacket; @@ -39,6 +38,7 @@ import appeng.core.sync.packets.ItemTransitionEffectPacket; import appeng.core.sync.packets.JEIRecipePacket; import appeng.core.sync.packets.LightningPacket; import appeng.core.sync.packets.MEFluidInventoryUpdatePacket; +import appeng.core.sync.packets.MEInterfaceUpdatePacket; import appeng.core.sync.packets.MEInventoryUpdatePacket; import appeng.core.sync.packets.MatterCannonPacket; import appeng.core.sync.packets.PaintedEntityPacket; @@ -99,7 +99,7 @@ public class BasePacketHandler { PACKET_ASSEMBLER_ANIMATION(AssemblerAnimationPacket.class, AssemblerAnimationPacket::new), - PACKET_COMPRESSED_NBT(CompressedNBTPacket.class, CompressedNBTPacket::new), + PACKET_ME_INTERFACE_UPDATE(MEInterfaceUpdatePacket.class, MEInterfaceUpdatePacket::new), PACKET_PAINTED_ENTITY(PaintedEntityPacket.class, PaintedEntityPacket::new), diff --git a/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java b/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java index 682884c64..e03d6f7a3 100644 --- a/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java +++ b/src/main/java/appeng/core/sync/packets/MEFluidInventoryUpdatePacket.java @@ -19,13 +19,9 @@ package appeng.core.sync.packets; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.nio.BufferOverflowException; import java.util.LinkedList; import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; import javax.annotation.Nullable; @@ -41,7 +37,6 @@ import net.minecraft.network.Packet; import net.minecraft.network.PacketByteBuf; import appeng.api.storage.data.IAEFluidStack; -import appeng.core.AELog; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.fluids.client.gui.FluidTerminalScreen; @@ -55,8 +50,6 @@ import appeng.fluids.util.AEFluidStack; public class MEFluidInventoryUpdatePacket extends BasePacket { private static final int UNCOMPRESSED_PACKET_BYTE_LIMIT = 16 * 1024 * 1024; private static final int OPERATION_BYTE_LIMIT = 2 * 1024; - private static final int TEMP_BUFFER_SIZE = 1024; - private static final int STREAM_MASK = 0xff; // input. @Nullable @@ -66,47 +59,18 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { @Nullable private final PacketByteBuf data; - @Nullable - private final GZIPOutputStream compressFrame; private int writtenBytes = 0; private boolean empty = true; public MEFluidInventoryUpdatePacket(final PacketByteBuf stream) { this.data = null; - this.compressFrame = null; this.list = new LinkedList<>(); this.ref = stream.readByte(); - try (final GZIPInputStream gzReader = new GZIPInputStream(new InputStream() { - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & STREAM_MASK; - } - })) { - - final PacketByteBuf uncompressed = new PacketByteBuf(Unpooled.buffer(stream.readableBytes())); - final byte[] tmp = new byte[TEMP_BUFFER_SIZE]; - - while (gzReader.available() != 0) { - final int bytes = gzReader.read(tmp); - - if (bytes > 0) { - uncompressed.writeBytes(tmp, 0, bytes); - } - } - - while (uncompressed.readableBytes() > 0) { - this.list.add(AEFluidStack.fromPacket(uncompressed)); - } - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); + while (stream.readableBytes() > 0) { + this.list.add(AEFluidStack.fromPacket(stream)); } - this.empty = this.list.isEmpty(); } @@ -121,14 +85,6 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { this.data = new PacketByteBuf(Unpooled.buffer(OPERATION_BYTE_LIMIT)); this.data.writeInt(this.getPacketID()); this.data.writeByte(this.ref); - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - @Override - public void write(final int value) { - MEFluidInventoryUpdatePacket.this.data.writeByte(value); - } - }); - this.list = null; } @@ -145,28 +101,19 @@ public class MEFluidInventoryUpdatePacket extends BasePacket { @Nullable @Override public Packet toPacket(NetworkSide direction) { - try { - this.compressFrame.close(); - - this.configureWrite(this.data); - return super.toPacket(direction); - } catch (final IOException e) { - AELog.debug(e); - } - - return null; + this.configureWrite(this.data); + return super.toPacket(direction); } public void appendFluid(final IAEFluidStack fs) throws IOException, BufferOverflowException { final PacketByteBuf tmp = new PacketByteBuf(Unpooled.buffer(OPERATION_BYTE_LIMIT)); fs.writeToPacket(tmp); - this.compressFrame.flush(); if (this.writtenBytes + tmp.readableBytes() > UNCOMPRESSED_PACKET_BYTE_LIMIT) { throw new BufferOverflowException(); } else { this.writtenBytes += tmp.readableBytes(); - this.compressFrame.write(tmp.array(), 0, tmp.readableBytes()); + this.data.writeBytes(tmp.array(), 0, tmp.readableBytes()); this.empty = false; } } diff --git a/src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java b/src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java similarity index 58% rename from src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java rename to src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java index 27efc84e8..1098e382d 100644 --- a/src/main/java/appeng/core/sync/packets/CompressedNBTPacket.java +++ b/src/main/java/appeng/core/sync/packets/MEInterfaceUpdatePacket.java @@ -18,13 +18,7 @@ package appeng.core.sync.packets; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; import io.netty.buffer.Unpooled; @@ -33,6 +27,10 @@ import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import net.minecraft.network.PacketByteBuf; @@ -41,55 +39,24 @@ import appeng.client.gui.implementations.InterfaceTerminalScreen; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; -//TODO, this is pointless, NBT is already compressed when written to a PacketBuffer. -public class CompressedNBTPacket extends BasePacket { +public class MEInterfaceUpdatePacket extends BasePacket { // input. private final CompoundTag in; // output... private final PacketByteBuf data; - private final GZIPOutputStream compressFrame; - public CompressedNBTPacket(final PacketByteBuf stream) { + public MEInterfaceUpdatePacket(final PacketByteBuf stream) { this.data = null; - this.compressFrame = null; - - try (DataInputStream inStream = new DataInputStream(new GZIPInputStream(new InputStream() { - - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & 0xff; - } - }))) { - this.in = NbtIo.read(inStream); - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); - } + this.in = stream.readCompoundTag(); } // api - public CompressedNBTPacket(final CompoundTag din) throws IOException { - + public MEInterfaceUpdatePacket(final CompoundTag din) throws IOException { + this.in = null; this.data = new PacketByteBuf(Unpooled.buffer(2048)); this.data.writeInt(this.getPacketID()); - - this.in = din; - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - - @Override - public void write(final int value) { - CompressedNBTPacket.this.data.writeByte(value); - } - }); - - NbtIo.write(din, new DataOutputStream(this.compressFrame)); - this.compressFrame.close(); - + this.data.writeCompoundTag(din); this.configureWrite(this.data); } diff --git a/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java b/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java index badb06c75..842e696bb 100644 --- a/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java +++ b/src/main/java/appeng/core/sync/packets/MEInventoryUpdatePacket.java @@ -19,12 +19,10 @@ package appeng.core.sync.packets; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.nio.BufferOverflowException; import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.annotation.Nullable; @@ -45,7 +43,6 @@ import appeng.client.gui.implementations.CraftConfirmScreen; import appeng.client.gui.implementations.CraftingCPUScreen; import appeng.client.gui.implementations.MEMonitorableScreen; import appeng.client.gui.implementations.NetworkStatusScreen; -import appeng.core.AELog; import appeng.core.sync.BasePacket; import appeng.core.sync.network.INetworkInfo; import appeng.util.item.AEItemStack; @@ -53,8 +50,6 @@ import appeng.util.item.AEItemStack; public class MEInventoryUpdatePacket extends BasePacket { private static final int UNCOMPRESSED_PACKET_BYTE_LIMIT = 16 * 1024 * 1024; private static final int OPERATION_BYTE_LIMIT = 2 * 1024; - private static final int TEMP_BUFFER_SIZE = 1024; - private static final int STREAM_MASK = 0xff; // input. @Nullable @@ -64,48 +59,18 @@ public class MEInventoryUpdatePacket extends BasePacket { @Nullable private final PacketByteBuf data; - @Nullable - private final GZIPOutputStream compressFrame; private int writtenBytes = 0; private boolean empty = true; public MEInventoryUpdatePacket(final PacketByteBuf stream) { this.data = null; - this.compressFrame = null; this.list = new ArrayList<>(); this.ref = stream.readByte(); - // int originalBytes = stream.readableBytes(); - - try (GZIPInputStream gzReader = new GZIPInputStream(new InputStream() { - @Override - public int read() { - if (stream.readableBytes() <= 0) { - return -1; - } - - return stream.readByte() & STREAM_MASK; - } - })) { - final PacketByteBuf uncompressed = new PacketByteBuf(Unpooled.buffer(stream.readableBytes())); - final byte[] tmp = new byte[TEMP_BUFFER_SIZE]; - - while (gzReader.available() != 0) { - final int bytes = gzReader.read(tmp); - - if (bytes > 0) { - uncompressed.writeBytes(tmp, 0, bytes); - } - } - - while (uncompressed.readableBytes() > 0) { - this.list.add(AEItemStack.fromPacket(uncompressed)); - } - } catch (IOException e) { - throw new RuntimeException("Failed to decompress packet.", e); + while (stream.readableBytes() > 0) { + this.list.add(AEItemStack.fromPacket(stream)); } - this.empty = this.list.isEmpty(); } @@ -120,14 +85,6 @@ public class MEInventoryUpdatePacket extends BasePacket { this.data = new PacketByteBuf(Unpooled.buffer(OPERATION_BYTE_LIMIT)); this.data.writeInt(this.getPacketID()); this.data.writeByte(this.ref); - - this.compressFrame = new GZIPOutputStream(new OutputStream() { - @Override - public void write(final int value) { - MEInventoryUpdatePacket.this.data.writeByte(value); - } - }); - this.list = null; } @@ -156,28 +113,19 @@ public class MEInventoryUpdatePacket extends BasePacket { @Nullable @Override public Packet toPacket(NetworkSide direction) { - try { - this.compressFrame.close(); - - this.configureWrite(this.data); - return super.toPacket(direction); - } catch (final IOException e) { - AELog.debug(e); - } - - return null; + this.configureWrite(this.data); + return super.toPacket(direction); } public void appendItem(final IAEItemStack is) throws IOException, BufferOverflowException { final PacketByteBuf tmp = new PacketByteBuf(Unpooled.buffer(OPERATION_BYTE_LIMIT)); is.writeToPacket(tmp); - this.compressFrame.flush(); if (this.writtenBytes + tmp.readableBytes() > UNCOMPRESSED_PACKET_BYTE_LIMIT) { throw new BufferOverflowException(); } else { this.writtenBytes += tmp.readableBytes(); - this.compressFrame.write(tmp.array(), 0, tmp.readableBytes()); + this.data.writeBytes(tmp.array(), 0, tmp.readableBytes()); this.empty = false; } } diff --git a/src/main/java/appeng/facade/FacadeContainer.java b/src/main/java/appeng/facade/FacadeContainer.java index 0926dcace..1db4b8bf4 100644 --- a/src/main/java/appeng/facade/FacadeContainer.java +++ b/src/main/java/appeng/facade/FacadeContainer.java @@ -38,15 +38,18 @@ public class FacadeContainer implements IFacadeContainer { private final int facades = 6; private final CableBusStorage storage; + private final Runnable changeCallback; - public FacadeContainer(final CableBusStorage cbs) { + public FacadeContainer(final CableBusStorage cbs, Runnable changeCallback) { this.storage = cbs; + this.changeCallback = changeCallback; } @Override public boolean addFacade(final IFacadePart a) { if (this.getFacade(a.getSide()) == null) { this.storage.setFacade(a.getSide().ordinal(), a); + this.notifyChange(); return true; } return false; @@ -57,6 +60,7 @@ public class FacadeContainer implements IFacadeContainer { if (side != null && side != AEPartLocation.INTERNAL) { if (this.storage.getFacade(side.ordinal()) != null) { this.storage.setFacade(side.ordinal(), null); + this.notifyChange(); if (host != null) { host.markForUpdate(); } @@ -85,6 +89,7 @@ public class FacadeContainer implements IFacadeContainer { for (int x = 0; x < this.facades; x++) { this.storage.setFacade(x, newFacades[x]); } + this.notifyChange(); } @Override @@ -176,4 +181,9 @@ public class FacadeContainer implements IFacadeContainer { } return true; } + + private void notifyChange() { + this.changeCallback.run(); + } + } diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java index cac28ae44..894f76f8e 100644 --- a/src/main/java/appeng/parts/CableBusContainer.java +++ b/src/main/java/appeng/parts/CableBusContainer.java @@ -125,7 +125,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I @Override public IFacadeContainer getFacadeContainer() { - return new FacadeContainer(this); + return new FacadeContainer(this, this::invalidateShapes); } @Override diff --git a/src/main/java/appeng/util/item/AEItemStack.java b/src/main/java/appeng/util/item/AEItemStack.java index acae924d5..0342b355f 100644 --- a/src/main/java/appeng/util/item/AEItemStack.java +++ b/src/main/java/appeng/util/item/AEItemStack.java @@ -125,7 +125,7 @@ public final class AEItemStack extends AEStack implements IAEItemS buffer.writeBoolean(this.isCraftable()); buffer.writeVarLong(this.getStackSize()); buffer.writeVarLong(this.getCountRequestable()); - buffer.writeItemStack(getDefinition()); + buffer.writeItemStack(getDefinition(), false); } @Override diff --git a/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json b/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json index a6f6f1378..041b76a9e 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json +++ b/src/main/resources/assets/appliedenergistics2/lang/zh_cn.json @@ -58,7 +58,7 @@ "block.appliedenergistics2.chest": "ME箱子", "block.appliedenergistics2.chiseled_quartz_block": "錾制赛特斯石英块", "block.appliedenergistics2.chiseled_quartz_slab": "錾制赛特斯石英台阶", - "block.appliedenergistics2.chiseled_quartz_stairs": "竖纹赛特斯石英楼梯", + "block.appliedenergistics2.chiseled_quartz_stairs": "錾制赛特斯石英楼梯", "block.appliedenergistics2.condenser": "物质聚合器", "block.appliedenergistics2.controller": "ME控制器", "block.appliedenergistics2.crafting_accelerator": "并行处理单元", @@ -77,7 +77,7 @@ "block.appliedenergistics2.fluid_interface": "ME流体接口", "block.appliedenergistics2.fluix_block": "福鲁伊克斯块", "block.appliedenergistics2.fluix_slab": "福鲁伊克斯台阶", - "block.appliedenergistics2.fluix_stairs": "錾制赛特斯石英楼梯", + "block.appliedenergistics2.fluix_stairs": "福鲁伊克斯楼梯", "block.appliedenergistics2.grindstone": "石英磨具", "block.appliedenergistics2.inscriber": "压印器", "block.appliedenergistics2.interface": "ME接口", @@ -92,11 +92,11 @@ "block.appliedenergistics2.quartz_glass": "石英玻璃", "block.appliedenergistics2.quartz_growth_accelerator": "晶体催生器", "block.appliedenergistics2.quartz_ore": "赛特斯石英矿石", - "block.appliedenergistics2.quartz_pillar": "赛特斯竖纹石英块", + "block.appliedenergistics2.quartz_pillar": "竖纹赛特斯石英块", "block.appliedenergistics2.quartz_pillar_slab": "竖纹赛特斯石英台阶", - "block.appliedenergistics2.quartz_pillar_stairs": "赛特斯石英楼梯", + "block.appliedenergistics2.quartz_pillar_stairs": "竖纹赛特斯石英楼梯", "block.appliedenergistics2.quartz_slab": "赛特斯石英台阶", - "block.appliedenergistics2.quartz_stairs": "福鲁伊克斯楼梯", + "block.appliedenergistics2.quartz_stairs": "赛特斯石英楼梯", "block.appliedenergistics2.quartz_vibrant_glass": "聚能石英玻璃", "block.appliedenergistics2.security_station": "ME安全终端", "block.appliedenergistics2.sky_compass": "陨石罗盘", @@ -407,28 +407,28 @@ "item.appliedenergistics2.annihilation_plane": "ME破坏面板", "item.appliedenergistics2.basic_card": "基础卡", "item.appliedenergistics2.biometric_card": "身份卡", - "item.appliedenergistics2.black_covered_cable": "黑色 ME包层线缆", - "item.appliedenergistics2.black_covered_dense_cable": "黑色 ME致密包层线缆", - "item.appliedenergistics2.black_glass_cable": "黑色 ME玻璃线缆", - "item.appliedenergistics2.black_lumen_paint_ball": "黑色 光通 染色球", - "item.appliedenergistics2.black_paint_ball": "黑色 染色球", - "item.appliedenergistics2.black_smart_cable": "黑色 ME智能线缆", - "item.appliedenergistics2.black_smart_dense_cable": "黑色 ME致密线缆", + "item.appliedenergistics2.black_covered_cable": "ME包层线缆(黑色)", + "item.appliedenergistics2.black_covered_dense_cable": "ME致密包层线缆(黑色)", + "item.appliedenergistics2.black_glass_cable": "ME玻璃线缆(黑色)", + "item.appliedenergistics2.black_lumen_paint_ball": "光通染色球(黑色)", + "item.appliedenergistics2.black_paint_ball": "染色球(黑色)", + "item.appliedenergistics2.black_smart_cable": "ME智能线缆(黑色)", + "item.appliedenergistics2.black_smart_dense_cable": "ME致密线缆(黑色)", "item.appliedenergistics2.blank_pattern": "空白样板", - "item.appliedenergistics2.blue_covered_cable": "蓝色 ME包层线缆", - "item.appliedenergistics2.blue_covered_dense_cable": "蓝色 ME致密包层线缆", - "item.appliedenergistics2.blue_glass_cable": "蓝色 ME玻璃线缆", - "item.appliedenergistics2.blue_lumen_paint_ball": "蓝色 光通 染色球", - "item.appliedenergistics2.blue_paint_ball": "蓝色 染色球", - "item.appliedenergistics2.blue_smart_cable": "蓝色 ME智能线缆", - "item.appliedenergistics2.blue_smart_dense_cable": "蓝色 ME致密线缆", - "item.appliedenergistics2.brown_covered_cable": "棕色 ME包层线缆", - "item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆", - "item.appliedenergistics2.brown_glass_cable": "棕色 ME玻璃线缆", - "item.appliedenergistics2.brown_lumen_paint_ball": "棕色 光通 染色球", - "item.appliedenergistics2.brown_paint_ball": "棕色 染色球", - "item.appliedenergistics2.brown_smart_cable": "棕色 ME智能线缆", - "item.appliedenergistics2.brown_smart_dense_cable": "棕色 ME致密线缆", + "item.appliedenergistics2.blue_covered_cable": "ME包层线缆(蓝色)", + "item.appliedenergistics2.blue_covered_dense_cable": "ME致密包层线缆(蓝色)", + "item.appliedenergistics2.blue_glass_cable": "ME玻璃线缆(蓝色)", + "item.appliedenergistics2.blue_lumen_paint_ball": "光通染色球(蓝色)", + "item.appliedenergistics2.blue_paint_ball": "染色球(蓝色)", + "item.appliedenergistics2.blue_smart_cable": "ME智能线缆(蓝色)", + "item.appliedenergistics2.blue_smart_dense_cable": "ME致密线缆(蓝色)", + "item.appliedenergistics2.brown_covered_cable": "ME包层线缆(棕色)", + "item.appliedenergistics2.brown_covered_dense_cable": "棕色 ME致密包层线缆(棕色)", + "item.appliedenergistics2.brown_glass_cable": "ME玻璃线缆(棕色)", + "item.appliedenergistics2.brown_lumen_paint_ball": "光通染色球(棕色)", + "item.appliedenergistics2.brown_paint_ball": "染色球(棕色)", + "item.appliedenergistics2.brown_smart_cable": "ME智能线缆(棕色)", + "item.appliedenergistics2.brown_smart_dense_cable": "ME致密线缆(棕色)", "item.appliedenergistics2.cable_anchor": "线缆锚", "item.appliedenergistics2.cable_fluid_interface": "ME流体接口", "item.appliedenergistics2.cable_interface": "ME接口", @@ -458,13 +458,13 @@ "item.appliedenergistics2.crafting_monitor": "ME合成监控器", "item.appliedenergistics2.crafting_terminal": "ME合成终端", "item.appliedenergistics2.creative_storage_cell": "创造型ME存储元件", - "item.appliedenergistics2.cyan_covered_cable": "青色 ME包层线缆", - "item.appliedenergistics2.cyan_covered_dense_cable": "青色 ME致密包层线缆", - "item.appliedenergistics2.cyan_glass_cable": "青色 ME玻璃线缆", - "item.appliedenergistics2.cyan_lumen_paint_ball": "青色 光通 染色球", - "item.appliedenergistics2.cyan_paint_ball": "青色 染色球", - "item.appliedenergistics2.cyan_smart_cable": "青色 ME智能线缆", - "item.appliedenergistics2.cyan_smart_dense_cable": "青色 ME致密线缆", + "item.appliedenergistics2.cyan_covered_cable": "ME包层线缆(青色)", + "item.appliedenergistics2.cyan_covered_dense_cable": "ME致密包层线缆(青色)", + "item.appliedenergistics2.cyan_glass_cable": "ME玻璃线缆(青色)", + "item.appliedenergistics2.cyan_lumen_paint_ball": "光通染色球(青色)", + "item.appliedenergistics2.cyan_paint_ball": "染色球(青色)", + "item.appliedenergistics2.cyan_smart_cable": "ME智能线缆(青色)", + "item.appliedenergistics2.cyan_smart_dense_cable": "ME致密线缆(青色)", "item.appliedenergistics2.dark_monitor": "暗色照明面板", "item.appliedenergistics2.debug_card": "Dev.调试卡", "item.appliedenergistics2.debug_replicator_card": "Dev.复制卡", @@ -477,7 +477,7 @@ "item.appliedenergistics2.entropy_manipulator": "熵变机械臂", "item.appliedenergistics2.export_bus": "ME输出总线", "item.appliedenergistics2.facade": "线缆伪装板", - "item.appliedenergistics2.fe_p2p_tunnel": "FE P2P通道", + "item.appliedenergistics2.fe_p2p_tunnel": "P2P通道-FE", "item.appliedenergistics2.flour": "面粉", "item.appliedenergistics2.fluid_annihilation_plane": "ME流体破坏面板", "item.appliedenergistics2.16k_fluid_cell_component": "16k-ME流体存储组件", @@ -488,43 +488,43 @@ "item.appliedenergistics2.fluid_formation_plane": "ME流体成型面板", "item.appliedenergistics2.fluid_import_bus": "ME流体输入总线", "item.appliedenergistics2.fluid_level_emitter": "ME流体标准发信器", - "item.appliedenergistics2.fluid_p2p_tunnel": "流体 P2P通道", - "item.appliedenergistics2.fluid_storage_bus": "ME流体储存总线", + "item.appliedenergistics2.fluid_p2p_tunnel": "P2P通道-流体", + "item.appliedenergistics2.fluid_storage_bus": "ME流体存储总线", "item.appliedenergistics2.16k_fluid_storage_cell": "16k-ME流体储存元件", "item.appliedenergistics2.1k_fluid_storage_cell": "1k-ME流体储存元件", "item.appliedenergistics2.4k_fluid_storage_cell": "4k-ME流体储存元件", "item.appliedenergistics2.64k_fluid_storage_cell": "64k-ME流体储存元件", "item.appliedenergistics2.fluid_terminal": "ME流体终端", - "item.appliedenergistics2.fluix_covered_cable": "Fluix默认色 ME包层线缆", - "item.appliedenergistics2.fluix_covered_dense_cable": "Fluix默认色 ME致密包层线缆", + "item.appliedenergistics2.fluix_covered_cable": "ME包层线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_covered_dense_cable": "ME致密包层线缆(Fluix默认色)", "item.appliedenergistics2.fluix_crystal": "福鲁伊克斯水晶", "item.appliedenergistics2.fluix_crystal_seed": "福鲁伊克斯种子", "item.appliedenergistics2.fluix_dust": "福鲁伊克斯粉", - "item.appliedenergistics2.fluix_glass_cable": "Fluix默认色 ME玻璃线缆", - "item.appliedenergistics2.fluix_lumen_paint_ball": "Fluix默认色 光通 染色球", - "item.appliedenergistics2.fluix_paint_ball": "Fluix默认色 染色球", + "item.appliedenergistics2.fluix_glass_cable": "ME玻璃线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_lumen_paint_ball": "光通染色球(Fluix默认色)", + "item.appliedenergistics2.fluix_paint_ball": "色球(Fluix默认色)", "item.appliedenergistics2.fluix_pearl": "福鲁伊克斯珍珠", - "item.appliedenergistics2.fluix_smart_cable": "Fluix默认色 ME智能线缆", - "item.appliedenergistics2.fluix_smart_dense_cable": "Fluix默认色 ME致密线缆", + "item.appliedenergistics2.fluix_smart_cable": "ME智能线缆(Fluix默认色)", + "item.appliedenergistics2.fluix_smart_dense_cable": "ME致密线缆(Fluix默认色)", "item.appliedenergistics2.formation_core": "成型核心", "item.appliedenergistics2.formation_plane": "ME成型面板", "item.appliedenergistics2.fuzzy_card": "模糊卡", "item.appliedenergistics2.gold_dust": "金粉", - "item.appliedenergistics2.gray_covered_cable": "灰色 ME包层线缆", - "item.appliedenergistics2.gray_covered_dense_cable": "灰色 ME致密包层线缆", - "item.appliedenergistics2.gray_glass_cable": "灰色 ME玻璃线缆", - "item.appliedenergistics2.gray_lumen_paint_ball": "灰色 光通 染色球", - "item.appliedenergistics2.gray_paint_ball": "灰色 染色球", - "item.appliedenergistics2.gray_smart_cable": "灰色 ME智能线缆", - "item.appliedenergistics2.gray_smart_dense_cable": "灰色 ME致密线缆", - "item.appliedenergistics2.green_covered_cable": "绿色 ME包层线缆", - "item.appliedenergistics2.green_covered_dense_cable": "绿色 ME致密包层线缆", - "item.appliedenergistics2.green_glass_cable": "绿色 ME玻璃线缆", - "item.appliedenergistics2.green_lumen_paint_ball": "绿色 光通 染色球", - "item.appliedenergistics2.green_paint_ball": "绿色 染色球", - "item.appliedenergistics2.green_smart_cable": "绿色 ME智能线缆", - "item.appliedenergistics2.green_smart_dense_cable": "绿色 ME致密线缆", - "item.appliedenergistics2.ic2_p2p_tunnel": "EU P2P通道", + "item.appliedenergistics2.gray_covered_cable": "ME包层线缆(灰色)", + "item.appliedenergistics2.gray_covered_dense_cable": "ME致密包层线缆(灰色)", + "item.appliedenergistics2.gray_glass_cable": "ME玻璃线缆(灰色)", + "item.appliedenergistics2.gray_lumen_paint_ball": "光通染色球(灰色)", + "item.appliedenergistics2.gray_paint_ball": "染色球(灰色)", + "item.appliedenergistics2.gray_smart_cable": "ME智能线缆(灰色)", + "item.appliedenergistics2.gray_smart_dense_cable": "ME致密线缆(灰色)", + "item.appliedenergistics2.green_covered_cable": "ME包层线缆(绿色)", + "item.appliedenergistics2.green_covered_dense_cable": "ME致密包层线缆(绿色)", + "item.appliedenergistics2.green_glass_cable": "ME玻璃线缆(绿色)", + "item.appliedenergistics2.green_lumen_paint_ball": "光通染色球(绿色)", + "item.appliedenergistics2.green_paint_ball": "染色球(绿色)", + "item.appliedenergistics2.green_smart_cable": "ME智能线缆(绿色)", + "item.appliedenergistics2.green_smart_dense_cable": "ME致密线缆(绿色)", + "item.appliedenergistics2.ic2_p2p_tunnel": "P2P通道-EU", "item.appliedenergistics2.identity_annihilation_plane": "ME精准破坏面板", "item.appliedenergistics2.import_bus": "ME输入总线", "item.appliedenergistics2.interface_terminal": "ME接口终端", @@ -532,44 +532,44 @@ "item.appliedenergistics2.inverted_toggle_bus": "ME反相触发总线", "item.appliedenergistics2.inverter_card": "反相卡", "item.appliedenergistics2.iron_dust": "铁粉", - "item.appliedenergistics2.item_p2p_tunnel": "物品 P2P通道", + "item.appliedenergistics2.item_p2p_tunnel": "P2P通道-物品", "item.appliedenergistics2.level_emitter": "ME标准发信器", - "item.appliedenergistics2.light_blue_covered_cable": "浅蓝色 ME包层线缆", - "item.appliedenergistics2.light_blue_covered_dense_cable": "浅蓝色 ME致密包层线缆", - "item.appliedenergistics2.light_blue_glass_cable": "浅蓝色 ME玻璃线缆", - "item.appliedenergistics2.light_blue_lumen_paint_ball": "浅蓝色 光通 染色球", - "item.appliedenergistics2.light_blue_paint_ball": "浅蓝色 染色球", - "item.appliedenergistics2.light_blue_smart_cable": "浅蓝色 ME智能线缆", - "item.appliedenergistics2.light_blue_smart_dense_cable": "浅蓝色 ME致密线缆", - "item.appliedenergistics2.light_gray_covered_cable": "浅灰色 ME包层线缆", - "item.appliedenergistics2.light_gray_covered_dense_cable": "浅灰色 ME致密包层线缆", - "item.appliedenergistics2.light_gray_glass_cable": "浅灰色 ME玻璃线缆", - "item.appliedenergistics2.light_gray_lumen_paint_ball": "浅灰色 光通 染色球", - "item.appliedenergistics2.light_gray_paint_ball": "浅灰色 染色球", - "item.appliedenergistics2.light_gray_smart_cable": "浅灰色 ME智能线缆", - "item.appliedenergistics2.light_gray_smart_dense_cable": "浅灰色 ME致密线缆", - "item.appliedenergistics2.light_p2p_tunnel": "光 P2P通道", - "item.appliedenergistics2.lime_covered_cable": "柠檬色 ME包层线缆", - "item.appliedenergistics2.lime_covered_dense_cable": "柠檬色 ME致密包层线缆", - "item.appliedenergistics2.lime_glass_cable": "柠檬色 ME玻璃线缆", - "item.appliedenergistics2.lime_lumen_paint_ball": "柠檬色 光通 染色球", - "item.appliedenergistics2.lime_paint_ball": "柠檬色 染色球", - "item.appliedenergistics2.lime_smart_cable": "柠檬色 ME智能线缆", - "item.appliedenergistics2.lime_smart_dense_cable": "柠檬色 ME致密线缆", + "item.appliedenergistics2.light_blue_covered_cable": "ME包层线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_covered_dense_cable": "ME致密包层线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_glass_cable": "ME玻璃线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_lumen_paint_ball": "光通染色球(浅蓝色)", + "item.appliedenergistics2.light_blue_paint_ball": "染色球(浅蓝色)", + "item.appliedenergistics2.light_blue_smart_cable": "ME智能线缆(浅蓝色)", + "item.appliedenergistics2.light_blue_smart_dense_cable": "ME致密线缆(浅蓝色)", + "item.appliedenergistics2.light_gray_covered_cable": "ME包层线缆(浅灰色)", + "item.appliedenergistics2.light_gray_covered_dense_cable": "ME致密包层线缆(浅灰色)", + "item.appliedenergistics2.light_gray_glass_cable": "ME玻璃线缆(浅灰色)", + "item.appliedenergistics2.light_gray_lumen_paint_ball": "光通染色球(浅灰色)", + "item.appliedenergistics2.light_gray_paint_ball": "染色球(浅灰色)", + "item.appliedenergistics2.light_gray_smart_cable": "ME智能线缆(浅灰色)", + "item.appliedenergistics2.light_gray_smart_dense_cable": "ME致密线缆(浅灰色)", + "item.appliedenergistics2.light_p2p_tunnel": "P2P通道-光", + "item.appliedenergistics2.lime_covered_cable": "ME包层线缆(柠檬色)", + "item.appliedenergistics2.lime_covered_dense_cable": "ME致密包层线缆(柠檬色)", + "item.appliedenergistics2.lime_glass_cable": "ME玻璃线缆(柠檬色)", + "item.appliedenergistics2.lime_lumen_paint_ball": "光通染色球(柠檬色)", + "item.appliedenergistics2.lime_paint_ball": "染色球(柠檬色)", + "item.appliedenergistics2.lime_smart_cable": "ME智能线缆(柠檬色)", + "item.appliedenergistics2.lime_smart_dense_cable": "ME致密线缆(柠檬色)", "item.appliedenergistics2.logic_processor": "逻辑处理器", "item.appliedenergistics2.logic_processor_asm": "半成品-逻辑处理器", "item.appliedenergistics2.logic_processor_press": "逻辑压印模板", "item.appliedenergistics2.printed_logic_processor": "逻辑电路板", - "item.appliedenergistics2.magenta_covered_cable": "品红色 ME包层线缆", - "item.appliedenergistics2.magenta_covered_dense_cable": "品红色 ME致密包层线缆", - "item.appliedenergistics2.magenta_glass_cable": "品红色 ME玻璃线缆", - "item.appliedenergistics2.magenta_lumen_paint_ball": "品红色 光通 染色球", - "item.appliedenergistics2.magenta_paint_ball": "品红色 染色球", - "item.appliedenergistics2.magenta_smart_cable": "品红色 ME智能线缆", - "item.appliedenergistics2.magenta_smart_dense_cable": "品红色 ME致密线缆", + "item.appliedenergistics2.magenta_covered_cable": "ME包层线缆(品红色)", + "item.appliedenergistics2.magenta_covered_dense_cable": "ME致密包层线缆(品红色)", + "item.appliedenergistics2.magenta_glass_cable": "ME玻璃线缆(品红色)", + "item.appliedenergistics2.magenta_lumen_paint_ball": "光通染色球(品红色)", + "item.appliedenergistics2.magenta_paint_ball": "染色球(品红色)", + "item.appliedenergistics2.magenta_smart_cable": "ME智能线缆(品红色)", + "item.appliedenergistics2.magenta_smart_dense_cable": "ME致密线缆(品红色)", "item.appliedenergistics2.matter_ball": "物质球", "item.appliedenergistics2.matter_cannon": "物质炮", - "item.appliedenergistics2.me_p2p_tunnel": "ME P2P通道", + "item.appliedenergistics2.me_p2p_tunnel": "P2P通道-ME", "item.appliedenergistics2.memory_card": "内存卡", "item.appliedenergistics2.monitor": "亮色照明面板", "item.appliedenergistics2.name_press": "名称压印模板", @@ -583,43 +583,43 @@ "item.appliedenergistics2.nether_quartz_sword": "下界石英剑", "item.appliedenergistics2.nether_quartz_wrench": "下界石英扳手", "item.appliedenergistics2.network_tool": "网络工具", - "item.appliedenergistics2.orange_covered_cable": "橙色 ME包层线缆", - "item.appliedenergistics2.orange_covered_dense_cable": "橙色 ME致密包层线缆", - "item.appliedenergistics2.orange_glass_cable": "橙色 ME玻璃线缆", - "item.appliedenergistics2.orange_lumen_paint_ball": "橙色 光通 染色球", - "item.appliedenergistics2.orange_paint_ball": "橙色 染色球", - "item.appliedenergistics2.orange_smart_cable": "橙色 ME智能线缆", - "item.appliedenergistics2.orange_smart_dense_cable": "橙色 ME致密线缆", + "item.appliedenergistics2.orange_covered_cable": "ME包层线缆(橙色)", + "item.appliedenergistics2.orange_covered_dense_cable": "ME致密包层线缆(橙色)", + "item.appliedenergistics2.orange_glass_cable": "ME玻璃线缆(橙色)", + "item.appliedenergistics2.orange_lumen_paint_ball": "光通染色球(橙色)", + "item.appliedenergistics2.orange_paint_ball": "染色球(橙色)", + "item.appliedenergistics2.orange_smart_cable": "ME智能线缆(橙色)", + "item.appliedenergistics2.orange_smart_dense_cable": "ME致密线缆(橙色)", "item.appliedenergistics2.pattern_terminal": "ME样板终端", - "item.appliedenergistics2.pink_covered_cable": "粉色 ME包层线缆", - "item.appliedenergistics2.pink_covered_dense_cable": "粉色 ME致密包层线缆", - "item.appliedenergistics2.pink_glass_cable": "粉色 ME玻璃线缆", - "item.appliedenergistics2.pink_lumen_paint_ball": "粉色 光通 染色球", - "item.appliedenergistics2.pink_paint_ball": "粉色 染色球", - "item.appliedenergistics2.pink_smart_cable": "粉色 ME智能线缆", - "item.appliedenergistics2.pink_smart_dense_cable": "粉色 ME致密线缆", + "item.appliedenergistics2.pink_covered_cable": "ME包层线缆(粉色)", + "item.appliedenergistics2.pink_covered_dense_cable": "ME致密包层线缆(粉色)", + "item.appliedenergistics2.pink_glass_cable": "ME玻璃线缆(粉色)", + "item.appliedenergistics2.pink_lumen_paint_ball": "光通染色球(粉色)", + "item.appliedenergistics2.pink_paint_ball": "染色球(粉色)", + "item.appliedenergistics2.pink_smart_cable": "ME智能线缆(粉色)", + "item.appliedenergistics2.pink_smart_dense_cable": "ME致密线缆(粉色)", "item.appliedenergistics2.portable_cell": "便携元件", "item.appliedenergistics2.purified_certus_quartz_crystal": "高纯赛特斯石英水晶", "item.appliedenergistics2.purified_fluix_crystal": "高纯福鲁伊克斯水晶", "item.appliedenergistics2.purified_nether_quartz_crystal": "高纯下界石英水晶", - "item.appliedenergistics2.purple_covered_cable": "紫色 ME包层线缆", - "item.appliedenergistics2.purple_covered_dense_cable": "紫色 ME致密包层线缆", - "item.appliedenergistics2.purple_glass_cable": "紫色 ME玻璃线缆", - "item.appliedenergistics2.purple_lumen_paint_ball": "紫色 光通 染色球", - "item.appliedenergistics2.purple_paint_ball": "紫色 染色球", - "item.appliedenergistics2.purple_smart_cable": "紫色 ME智能线缆", - "item.appliedenergistics2.purple_smart_dense_cable": "紫色 ME致密线缆", + "item.appliedenergistics2.purple_covered_cable": "ME包层线缆(紫色)", + "item.appliedenergistics2.purple_covered_dense_cable": "ME致密包层线缆(紫色)", + "item.appliedenergistics2.purple_glass_cable": "ME玻璃线缆(紫色)", + "item.appliedenergistics2.purple_lumen_paint_ball": "光通染色球(紫色)", + "item.appliedenergistics2.purple_paint_ball": "染色球(紫色)", + "item.appliedenergistics2.purple_smart_cable": "ME智能线缆(紫色)", + "item.appliedenergistics2.purple_smart_dense_cable": "ME致密线缆(紫色)", "item.appliedenergistics2.quantum_entangled_singularity": "量子缠绕态奇点", "item.appliedenergistics2.quartz_fiber": "石英纤维", - "item.appliedenergistics2.red_covered_cable": "红色 ME包层线缆", - "item.appliedenergistics2.red_covered_dense_cable": "红色 ME致密包层线缆", - "item.appliedenergistics2.red_glass_cable": "红色 ME玻璃线缆", - "item.appliedenergistics2.red_lumen_paint_ball": "红色 光通 染色球", - "item.appliedenergistics2.red_paint_ball": "红色 染色球", - "item.appliedenergistics2.red_smart_cable": "红色 ME智能线缆", - "item.appliedenergistics2.red_smart_dense_cable": "红色 ME致密线缆", + "item.appliedenergistics2.red_covered_cable": "ME包层线缆(红色)", + "item.appliedenergistics2.red_covered_dense_cable": "ME致密包层线缆(红色)", + "item.appliedenergistics2.red_glass_cable": "ME玻璃线缆(红色)", + "item.appliedenergistics2.red_lumen_paint_ball": "光通染色球(红色)", + "item.appliedenergistics2.red_paint_ball": "染色球(红色)", + "item.appliedenergistics2.red_smart_cable": "ME智能线缆(红色)", + "item.appliedenergistics2.red_smart_dense_cable": "ME致密线缆(红色)", "item.appliedenergistics2.redstone_card": "红石卡", - "item.appliedenergistics2.redstone_p2p_tunnel": "红石 P2P通道", + "item.appliedenergistics2.redstone_p2p_tunnel": "P2P通道-红石", "item.appliedenergistics2.semi_dark_monitor": "照明面板", "item.appliedenergistics2.silicon": "硅", "item.appliedenergistics2.silicon_press": "硅压印模板", @@ -642,24 +642,24 @@ "item.appliedenergistics2.terminal": "ME终端", "item.appliedenergistics2.toggle_bus": "ME触发总线", "item.appliedenergistics2.view_cell": "显示元件", - "item.appliedenergistics2.white_covered_cable": "白色 ME包层线缆", - "item.appliedenergistics2.white_covered_dense_cable": "白色 ME致密包层线缆", - "item.appliedenergistics2.white_glass_cable": "白色 ME玻璃线缆", - "item.appliedenergistics2.white_lumen_paint_ball": "白色 光通 染色球", - "item.appliedenergistics2.white_paint_ball": "白色 染色球", - "item.appliedenergistics2.white_smart_cable": "白色 ME智能线缆", - "item.appliedenergistics2.white_smart_dense_cable": "白色 ME致密线缆", + "item.appliedenergistics2.white_covered_cable": "ME包层线缆(白色)", + "item.appliedenergistics2.white_covered_dense_cable": "ME致密包层线缆(白色)", + "item.appliedenergistics2.white_glass_cable": "ME玻璃线缆(白色)", + "item.appliedenergistics2.white_lumen_paint_ball": "光通染色球(白色)", + "item.appliedenergistics2.white_paint_ball": "染色球(白色)", + "item.appliedenergistics2.white_smart_cable": "ME智能线缆(白色)", + "item.appliedenergistics2.white_smart_dense_cable": "ME致密线缆(白色)", "item.appliedenergistics2.wireless_booster": "无线信号增幅器", "item.appliedenergistics2.wireless_receiver": "无线接收器", "item.appliedenergistics2.wireless_terminal": "无线终端", "item.appliedenergistics2.wooden_gear": "木齿轮", - "item.appliedenergistics2.yellow_covered_cable": "黄色 ME包层线缆", - "item.appliedenergistics2.yellow_covered_dense_cable": "黄色 ME致密包层线缆", - "item.appliedenergistics2.yellow_glass_cable": "黄色 ME玻璃线缆", - "item.appliedenergistics2.yellow_lumen_paint_ball": "黄色 光通 染色球", - "item.appliedenergistics2.yellow_paint_ball": "黄色 染色球", - "item.appliedenergistics2.yellow_smart_cable": "黄色 ME智能线缆", - "item.appliedenergistics2.yellow_smart_dense_cable": "黄色 ME致密线缆", + "item.appliedenergistics2.yellow_covered_cable": "ME包层线缆(黄色)", + "item.appliedenergistics2.yellow_covered_dense_cable": "ME致密包层线缆(黄色)", + "item.appliedenergistics2.yellow_glass_cable": "ME玻璃线缆(黄色)", + "item.appliedenergistics2.yellow_lumen_paint_ball": "光通染色球(黄色)", + "item.appliedenergistics2.yellow_paint_ball": "染色球(黄色)", + "item.appliedenergistics2.yellow_smart_cable": "ME智能线缆(黄色)", + "item.appliedenergistics2.yellow_smart_dense_cable": "ME致密线缆(黄色)", "itemGroup.appliedenergistics2": "应用能源2", "itemGroup.appliedenergistics2.facades": "应用能源2-伪装板", "key.appliedenergistics2.category": "Applied Energistics 2",