From 0c9f9111a7521791203cb0aab004a1eb84520fd6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:05:21 +0300 Subject: [PATCH 01/15] Actually use the generics prospector code has instead of bypassing them --- .../gtceu/api/gui/misc/PacketProspecting.java | 18 +- .../api/gui/texture/ProspectingTexture.java | 97 ++++--- .../api/gui/widget/ProspectingMapWidget.java | 259 ++++++++++-------- .../behavior/ProspectorScannerBehavior.java | 4 +- 4 files changed, 203 insertions(+), 175 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java index 6aad5dff961..ef746940413 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java @@ -4,25 +4,27 @@ import java.lang.reflect.Array; -public class PacketProspecting { +public class PacketProspecting { public int chunkX; public int chunkZ; - public ProspectorMode mode; - public Object[][][] data; + public ProspectorMode mode; + public T[][][] data; - public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { + public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { this.chunkX = chunkX; this.chunkZ = chunkZ; this.mode = mode; - this.data = (Object[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); + //noinspection unchecked + this.data = (T[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); } - public static PacketProspecting readPacketData(ProspectorMode mode, FriendlyByteBuf buffer) { - PacketProspecting packet = new PacketProspecting(buffer.readVarInt(), buffer.readVarInt(), mode); + public static PacketProspecting readPacketData(ProspectorMode mode, FriendlyByteBuf buffer) { + PacketProspecting packet = new PacketProspecting<>(buffer.readVarInt(), buffer.readVarInt(), mode); for (int x = 0; x < mode.cellSize; x++) { for (int z = 0; z < mode.cellSize; z++) { - packet.data[x][z] = (Object[]) Array.newInstance(mode.getItemClass(), buffer.readVarInt()); + //noinspection unchecked + packet.data[x][z] = (T[]) Array.newInstance(mode.getItemClass(), buffer.readVarInt()); for (int i = 0; i < packet.data[x][z].length; i++) { packet.data[x][z][i] = mode.deserialize(buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java index f987592eee7..0382b6659fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java @@ -15,6 +15,7 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.FastColor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -25,6 +26,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import lombok.Getter; +import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import java.io.IOException; @@ -34,48 +36,47 @@ import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX_COLOR; -@SuppressWarnings({ "rawtypes", "unchecked" }) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @OnlyIn(Dist.CLIENT) -public class ProspectingTexture extends AbstractTexture { +public class ProspectingTexture extends AbstractTexture { - public static final String SELECTED_ALL = "[all]"; private static final ResourceTexture ARROW = GuiTextures.UP.copy().setColor(ColorPattern.RED.color); @Getter - private String selected = SELECTED_ALL; + private @Nullable String selected = null; private boolean darkMode; @Getter private final int imageWidth; @Getter private final int imageHeight; - public final Object[][][] data; + public final T[][][] data; private final int playerXGui; private final int playerYGui; private final float direction; private final int playerChunkX; private final int playerChunkZ; - private final ProspectorMode mode; - private final int radius; + private final ProspectorMode mode; + private final int chunkRadius; - public ProspectingTexture(int playerChunkX, int playerChunkZ, int posX, int posZ, float direction, - ProspectorMode mode, int radius, boolean darkMode) { + public ProspectingTexture(int playerChunkX, int playerChunkZ, int playerBlockX, int playerBlockZ, float direction, + ProspectorMode mode, int chunkRadius, boolean darkMode) { this.darkMode = darkMode; - this.radius = radius; + this.chunkRadius = chunkRadius; this.mode = mode; - this.data = (Object[][][]) Array.newInstance(mode.getItemClass(), (radius * 2 - 1) * mode.cellSize, - (radius * 2 - 1) * mode.cellSize, 0); - this.imageWidth = (radius * 2 - 1) * 16; - this.imageHeight = (radius * 2 - 1) * 16; + //noinspection unchecked + this.data = (T[][][]) Array.newInstance(mode.getItemClass(), (chunkRadius * 2 - 1) * mode.cellSize, + (chunkRadius * 2 - 1) * mode.cellSize, 0); + this.imageWidth = (chunkRadius * 2 - 1) * 16; + this.imageHeight = (chunkRadius * 2 - 1) * 16; this.playerChunkX = playerChunkX; this.playerChunkZ = playerChunkZ; this.direction = (direction + 180) % 360; - this.playerXGui = posX - (playerChunkX - this.radius + 1) * 16 + (posX > 0 ? 1 : 0); - playerYGui = posZ - (playerChunkZ - this.radius + 1) * 16 + (posX > 0 ? 1 : 0); + this.playerXGui = playerBlockX - (playerChunkX - this.chunkRadius + 1) * 16 + (playerBlockX > 0 ? 1 : 0); + this.playerYGui = playerBlockZ - (playerChunkZ - this.chunkRadius + 1) * 16 + (playerBlockX > 0 ? 1 : 0); } - public void updateTexture(PacketProspecting packet) { + public void updateTexture(PacketProspecting packet) { int ox; if ((packet.chunkX > 0 && playerChunkX > 0) || (packet.chunkX < 0 && playerChunkX < 0)) { ox = Math.abs(Math.abs(packet.chunkX) - Math.abs(playerChunkX)); @@ -96,8 +97,8 @@ public void updateTexture(PacketProspecting packet) { oy = -oy; } - int currentColumn = (this.radius - 1) + ox; - int currentRow = (this.radius - 1) + oy; + int currentColumn = (this.chunkRadius - 1) + ox; + int currentRow = (this.chunkRadius - 1) + oy; if (currentRow < 0) { return; } @@ -110,63 +111,61 @@ public void updateTexture(PacketProspecting packet) { } private NativeImage getImage() { - int wh = (this.radius * 2 - 1) * 16; - NativeImage image = new NativeImage(wh, wh, false); - for (int i = 0; i < wh; i++) { - for (int j = 0; j < wh; j++) { - Object[] items = this.data[i * mode.cellSize / 16][j * mode.cellSize / 16]; - // draw bg - image.setPixelRGBA(i, j, (darkMode ? ColorPattern.GRAY.color : ColorPattern.WHITE.color)); + NativeImage image = new NativeImage(this.imageWidth, this.imageHeight, false); + + for (int x = 0; x < this.imageWidth; x++) { + for (int y = 0; y < this.imageHeight; y++) { + T[] items = this.data[x * mode.cellSize / 16][y * mode.cellSize / 16]; + // draw background + image.setPixelRGBA(x, y, (darkMode ? 0xFF666666 : 0xFFFFFFFF)); // draw items - for (Object item : items) { - if (!selected.equals(SELECTED_ALL) && !selected.equals(mode.getUniqueID(item))) continue; + for (T item : items) { + if (selected != null && !selected.equals(mode.getUniqueId(item))) continue; int color = mode.getItemColor(item); - image.setPixelRGBA(i, j, - combine(255, ColorUtils.blueI(color), ColorUtils.greenI(color), ColorUtils.redI(color))); + // this is actually ARGB, even though the method name says RGBA and the parameter says ABGR. + image.setPixelRGBA(x, y, FastColor.ABGR32.opaque(color)); break; } // draw grid - if ((i) % 16 == 0 || (j) % 16 == 0) { - image.setPixelRGBA(i, j, ColorUtils.averageColor(image.getPixelRGBA(i, j), 0xff000000)); + if (x % 16 == 0 || y % 16 == 0) { + image.blendPixel(x, y, 0xFF000000); + image.setPixelRGBA(x, y, ColorUtils.averageColor(image.getPixelRGBA(x, y), 0xFF000000)); } } } return image; } - /** - * The resulting color of this operation is stored as least to most significant bits. - */ - public static int combine(int alpha, int blue, int green, int red) { - return (alpha & 0xFF) << 24 | (blue & 0xFF) << 16 | (green & 0xFF) << 8 | (red & 0xFF) << 0; - } - public void load() { doLoad(getImage()); } private void doLoad(NativeImage image) { - TextureUtil.prepareImage(this.getId(), 0, image.getWidth(), image.getHeight()); - image.upload(0, 0, 0, 0, 0, image.getWidth(), image.getHeight(), false, false, false, true); + TextureUtil.prepareImage(this.getId(), image.getWidth(), image.getHeight()); + // the last parameter is actually autoClose, it's named wrong. + image.upload(0, 0, 0, true); } public void draw(GuiGraphics graphics, int x, int y) { - if (this.getId() == -1) return; + // getId() generates a new texture ID if it's NOT_ASSIGNED, so we shouldn't use that. + if (this.id == NOT_ASSIGNED) return; + Tesselator tesselator = Tesselator.getInstance(); BufferBuilder bufferbuilder = tesselator.getBuilder(); RenderSystem.setShader(GameRenderer::getPositionTexColorShader); RenderSystem.setShaderTexture(0, this.getId()); - Matrix4f matrix4f = graphics.pose().last().pose(); + + Matrix4f pose = graphics.pose().last().pose(); bufferbuilder.begin(VertexFormat.Mode.QUADS, POSITION_TEX_COLOR); - bufferbuilder.vertex(matrix4f, x, y + imageHeight, 0).uv(0, 1).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x + imageWidth, y + imageHeight, 0).uv(1, 1).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x + imageWidth, y, 0).uv(1, 0).color(-1).endVertex(); - bufferbuilder.vertex(matrix4f, x, y, 0).uv(0, 0).color(-1).endVertex(); + bufferbuilder.vertex(pose, x, y + imageHeight, 0).uv(0, 1).color(0xFFFFFFFF).endVertex(); + bufferbuilder.vertex(pose, x + imageWidth, y + imageHeight, 0).uv(1, 1).color(0xFFFFFFFF).endVertex(); + bufferbuilder.vertex(pose, x + imageWidth, y, 0).uv(1, 0).color(0xFFFFFFFF).endVertex(); + bufferbuilder.vertex(pose, x, y, 0).uv(0, 0).color(0xFFFFFFFF).endVertex(); tesselator.end(); // draw special grid (e.g. fluid) - for (int cx = 0; cx < radius * 2 - 1; cx++) { - for (int cz = 0; cz < radius * 2 - 1; cz++) { + for (int cx = 0; cx < chunkRadius * 2 - 1; cx++) { + for (int cz = 0; cz < chunkRadius * 2 - 1; cz++) { if (this.data[cx][cz] != null && this.data[cx][cz].length > 0) { var items = this.data[cx][cz]; mode.drawSpecialGrid(graphics, items, x + cx * 16 + 1, y + cz * 16 + 1, 16, 16); diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java index 56afaf9f62b..32b4a1cd1a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.gui.widget; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.misc.PacketProspecting; import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; @@ -16,17 +17,18 @@ import com.lowdragmc.lowdraglib.gui.texture.TextTexture; import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; import com.lowdragmc.lowdraglib.gui.widget.*; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -41,39 +43,46 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.function.Consumer; -public class ProspectingMapWidget extends WidgetGroup implements SearchComponentWidget.IWidgetSearch { +public class ProspectingMapWidget extends WidgetGroup implements SearchComponentWidget.IWidgetSearch { private final int chunkRadius; - private final ProspectorMode mode; + private final ProspectorMode mode; private final int scanTick; @Getter private boolean darkMode = false; private final DraggableScrollableWidgetGroup itemList; + @OnlyIn(Dist.CLIENT) - private ProspectingTexture texture; + private ProspectingTexture texture; + private int playerChunkX; private int playerChunkZ; // runtime private int chunkIndex = 0; - private final Queue packetQueue = new LinkedBlockingQueue<>(); - private final Set items = new CopyOnWriteArraySet<>(); + + private final Queue> packetQueue = new LinkedBlockingQueue<>(); + private final Set items = new CopyOnWriteArraySet<>(); private final Map selectedMap = new ConcurrentHashMap<>(); public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, int chunkRadius, - @NotNull ProspectorMode mode, int scanTick) { + @NotNull ProspectorMode mode, int scanTick) { super(xPosition, yPosition, width, height); this.chunkRadius = chunkRadius; this.mode = mode; this.scanTick = scanTick; + int imageWidth = (chunkRadius * 2 - 1) * 16; int imageHeight = (chunkRadius * 2 - 1) * 16; addWidget(new ImageWidget(0, (height - imageHeight) / 2 - 4, imageWidth + 8, imageHeight + 8, GuiTextures.BACKGROUND_INVERSE)); - var group = (WidgetGroup) new WidgetGroup(imageWidth + 10, 0, width - (imageWidth + 10), height) + + WidgetGroup group = (WidgetGroup) new WidgetGroup(imageWidth + 10, 0, width - (imageWidth + 10), height) .setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(itemList = new DraggableScrollableWidgetGroup(4, 28, group.getSize().width - 8, - group.getSize().height - 32) - .setYScrollBarWidth(2).setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1))); + group.addWidget(this.itemList = new DraggableScrollableWidgetGroup(4, 28, + group.getSize().width - 8, group.getSize().height - 32) + .setYScrollBarWidth(2) + .setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1)) + ); group.addWidget(new SearchComponentWidget<>(6, 6, group.getSize().width - 12, 18, this)); addWidget(group); addNewItem("[all]", "all resources", IGuiTexture.EMPTY, -1); @@ -82,8 +91,8 @@ public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, @Override public void writeInitialData(FriendlyByteBuf buffer) { super.writeInitialData(buffer); - buffer.writeVarInt(playerChunkX = gui.entityPlayer.chunkPosition().x); - buffer.writeVarInt(playerChunkZ = gui.entityPlayer.chunkPosition().z); + buffer.writeVarInt(this.playerChunkX = gui.entityPlayer.chunkPosition().x); + buffer.writeVarInt(this.playerChunkZ = gui.entityPlayer.chunkPosition().z); buffer.writeVarInt(gui.entityPlayer.getBlockX()); buffer.writeVarInt(gui.entityPlayer.getBlockZ()); } @@ -92,31 +101,31 @@ public void writeInitialData(FriendlyByteBuf buffer) { @OnlyIn(Dist.CLIENT) public void readInitialData(FriendlyByteBuf buffer) { super.readInitialData(buffer); - texture = new ProspectingTexture( - buffer.readVarInt(), - buffer.readVarInt(), - buffer.readVarInt(), - buffer.readVarInt(), - gui.entityPlayer.getVisualRotationYInDegrees(), mode, chunkRadius, darkMode); + this.texture = new ProspectingTexture<>( + buffer.readVarInt(), buffer.readVarInt(), + buffer.readVarInt(), buffer.readVarInt(), + gui.entityPlayer.getVisualRotationYInDegrees(), + mode, chunkRadius, darkMode + ); } - public void setDarkMode(boolean mode) { - if (darkMode != mode) { - darkMode = mode; - if (isRemote()) { - texture.setDarkMode(darkMode); - } + public void setDarkMode(boolean darkMode) { + if (this.darkMode == darkMode) { + return; + } + this.darkMode = darkMode; + if (isRemote()) { + this.texture.setDarkMode(this.darkMode); } } - private void addOresToList(Object[][][] data) { - var newItems = new HashSet<>(); + private void addOresToList(T[][][] data) { + HashSet newItems = new HashSet<>(); for (int x = 0; x < mode.cellSize; x++) { for (int z = 0; z < mode.cellSize; z++) { - for (var item : data[x][z]) { + for (T item : data[x][z]) { newItems.add(item); - addNewItem(mode.getUniqueID(item), mode.getDescriptionId(item), mode.getItemIcon(item), - mode.getItemColor(item)); + addNewItem(mode.getUniqueId(item), mode.getDescription(item), mode.getItemIcon(item)); } } } @@ -137,6 +146,7 @@ private void addNewItem(String uniqueID, String renderingName, IGuiTexture icon, } }); selectableWidgetGroup.setSelectedTexture(ColorPattern.WHITE.borderTexture(-1)); + itemList.addWidget(selectableWidgetGroup); selectedMap.put(uniqueID, selectableWidgetGroup); } @@ -144,32 +154,37 @@ private void addNewItem(String uniqueID, String renderingName, IGuiTexture icon, @Override public void detectAndSendChanges() { - var player = gui.entityPlayer; - var world = player.level(); - if (gui.getTickCount() % scanTick == 0 && chunkIndex < (chunkRadius * 2 - 1) * (chunkRadius * 2 - 1)) { + Player player = gui.entityPlayer; + Level level = player.level(); - int row = chunkIndex / (chunkRadius * 2 - 1); - int column = chunkIndex % (chunkRadius * 2 - 1); + int chunkDiameter = this.chunkRadius * 2 - 1; - int ox = column - chunkRadius + 1; - int oz = row - chunkRadius + 1; + if (gui.getTickCount() % this.scanTick == 0 && this.chunkIndex < chunkDiameter * chunkDiameter) { + int row = this.chunkIndex / chunkDiameter; + int column = this.chunkIndex % chunkDiameter; - var chunk = world.getChunk(playerChunkX + ox, playerChunkZ + oz); + int ox = column - this.chunkRadius + 1; + int oz = row - this.chunkRadius + 1; + + LevelChunk chunk = level.getChunk(this.playerChunkX + ox, this.playerChunkZ + oz); if (mode == ProspectorMode.ORE) { - ServerCache.instance.prospectAllInChunk(world.dimension(), chunk.getPos(), (ServerPlayer) player); + ServerCache.instance.prospectAllInChunk(level.dimension(), chunk.getPos(), (ServerPlayer) player); } - PacketProspecting packet = new PacketProspecting(playerChunkX + ox, playerChunkZ + oz, this.mode); + PacketProspecting packet = new PacketProspecting<>(this.playerChunkX + ox, this.playerChunkZ + oz, mode); mode.scan(packet.data, chunk); writeUpdateInfo(-1, packet::writePacketData); - chunkIndex++; + + this.chunkIndex++; } - var held = player.getItemInHand(InteractionHand.MAIN_HAND); - if (held.getItem() instanceof IComponentItem componentItem) { - for (var component : componentItem.getComponents()) { - if (component instanceof ProspectorScannerBehavior prospector) { - if (!player.isCreative() && !prospector.drainEnergy(held, false)) { - player.closeContainer(); - } + + ItemStack held = player.getItemInHand(InteractionHand.MAIN_HAND); + if (!(held.getItem() instanceof IComponentItem componentItem)) { + return; + } + for (var component : componentItem.getComponents()) { + if (component instanceof ProspectorScannerBehavior prospector) { + if (!player.isCreative() && !prospector.drainEnergy(held, false)) { + player.closeContainer(); } } } @@ -189,23 +204,24 @@ public void readUpdateInfo(int id, FriendlyByteBuf buffer) { @OnlyIn(Dist.CLIENT) public void updateScreen() { super.updateScreen(); - if (packetQueue != null) { - int max = 10; - while (max-- > 0 && !packetQueue.isEmpty()) { - var packet = packetQueue.poll(); - texture.updateTexture(packet); - addOresToList(packet.data); - } + + int maxToProcess = 10; + while (maxToProcess-- > 0 && !packetQueue.isEmpty()) { + PacketProspecting packet = packetQueue.poll(); + texture.updateTexture(packet); + addOresToList(packet.data); } } @OnlyIn(Dist.CLIENT) - private void addPacketToQueue(PacketProspecting packet) { + private void addPacketToQueue(PacketProspecting packet) { packetQueue.add(packet); if (mode == ProspectorMode.FLUID && packet.data[0][0].length > 0) { - GTClientCache.instance.addFluid(gui.entityPlayer.level().dimension(), packet.chunkX, packet.chunkZ, - (ProspectorMode.FluidInfo) packet.data[0][0][0]); - + GTClientCache.instance.addFluid( + gui.entityPlayer.level().dimension(), + packet.chunkX, packet.chunkZ, + (ProspectorMode.FluidInfo) packet.data[0][0][0] + ); } } @@ -215,13 +231,16 @@ public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mous super.drawInBackground(graphics, mouseX, mouseY, partialTicks); var position = getPosition(); var size = getSize(); + // draw background - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - texture.draw(graphics, x, y); + int x = position.x + 3; + int y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; + this.texture.draw(graphics, x, y); + + int chunkDiameter = this.chunkRadius * 2 - 1; int cX = (mouseX - x) / 16; int cZ = (mouseY - y) / 16; - if (cX >= 0 && cZ >= 0 && cX < chunkRadius * 2 - 1 && cZ < chunkRadius * 2 - 1) { + if (cX >= 0 && cZ >= 0 && cX < chunkDiameter && cZ < chunkDiameter) { // draw hover layer DrawerHelper.drawSolidRect(graphics, cX * 16 + x, cZ * 16 + y, 16, 16, 0x4B6C6C6C); } @@ -231,46 +250,47 @@ public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mous @OnlyIn(Dist.CLIENT) public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - // draw tooltips var position = getPosition(); var size = getSize(); var x = position.x + 3; var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - int cX = (mouseX - x) / 16; - int cZ = (mouseY - y) / 16; - if (cX >= 0 && cZ >= 0 && cX < chunkRadius * 2 - 1 && cZ < chunkRadius * 2 - 1) { - // draw hover layer - List tooltips = new ArrayList<>(); - tooltips.add(Component.translatable(mode.unlocalizedName)); - List items = new ArrayList<>(); - for (int i = 0; i < mode.cellSize; i++) { - for (int j = 0; j < mode.cellSize; j++) { - assert texture != null; - if (texture.data[cX * mode.cellSize + i][cZ * mode.cellSize + j] != null) { - items.add(texture.data[cX * mode.cellSize + i][cZ * mode.cellSize + j]); - } + + int chunkDiameter = this.chunkRadius * 2 - 1; + int chunkX = (mouseX - x) / 16; + int chunkZ = (mouseY - y) / 16; + if (chunkX < 0 || chunkZ < 0 || chunkX >= chunkDiameter || chunkZ >= chunkDiameter) { + return; + } + + List tooltips = new ArrayList<>(); + tooltips.add(Component.translatable(mode.unlocalizedName)); + List items = new ArrayList<>(); + + for (int i = 0; i < mode.cellSize; i++) { + for (int j = 0; j < mode.cellSize; j++) { + if (this.texture.data[chunkX * mode.cellSize + i][chunkZ * mode.cellSize + j] != null) { + items.add(this.texture.data[chunkX * mode.cellSize + i][chunkZ * mode.cellSize + j]); } } - mode.appendTooltips(items, tooltips, texture.getSelected()); - gui.getModularUIGui().setHoverTooltip(tooltips, ItemStack.EMPTY, null, null); } + + // draw tooltips + mode.appendTooltips(items, tooltips, this.texture.getSelected()); + gui.getModularUIGui().setHoverTooltip(tooltips, ItemStack.EMPTY, null, null); } @Override @OnlyIn(Dist.CLIENT) public boolean mouseClicked(double mouseX, double mouseY, int button) { - var clickedItem = getClickedVein(mouseX, mouseY); + WaypointItem clickedItem = getClickedVein(mouseX, mouseY); if (clickedItem == null) { return super.mouseClicked(mouseX, mouseY, button); } if (!WaypointManager.isActive()) return true; - MutableComponent veinName = Component.literal(clickedItem.name()); - veinName.setStyle(veinName.getStyle().withColor(clickedItem.color)); - WaypointManager.setWaypoint(new ChunkPos(clickedItem.position).toString(), - clickedItem.name, - clickedItem.color, - gui.entityPlayer.level().dimension(), - clickedItem.position.getX(), clickedItem.position.getY(), clickedItem.position.getZ()); + + WaypointManager.setWaypoint(clickedItem.uniqueId, + clickedItem.name.getString(), clickedItem.color, + gui.entityPlayer.level().dimension(), clickedItem.position); gui.entityPlayer.displayClientMessage( Component.translatable("behavior.prospector.added_waypoint", veinName), false); playButtonClickSound(); @@ -280,15 +300,15 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private WaypointItem getClickedVein(double mouseX, double mouseY) { var position = getPosition(); var size = getSize(); - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; + int x = position.x + 3; + int y = position.y + (size.getHeight() - this.texture.getImageHeight()) / 2 - 1; int cX = (int) (mouseX - x) / 16; int cZ = (int) (mouseY - y) / 16; int offsetX = Math.abs((int) (mouseX - x) % 16); int offsetZ = Math.abs((int) (mouseY - y) % 16); - int xDiff = cX - (chunkRadius - 1); - int zDiff = cZ - (chunkRadius - 1); + int xDiff = cX - (this.chunkRadius - 1); + int zDiff = cZ - (this.chunkRadius - 1); int xPos = ((gui.entityPlayer.chunkPosition().x + xDiff) << 4) + offsetX; int zPos = ((gui.entityPlayer.chunkPosition().z + zDiff) << 4) + offsetZ; @@ -310,8 +330,9 @@ private WaypointItem getClickedVein(double mouseX, double mouseY) { } // If the cursor is over an ore use its name - var hoveredItem = texture.data[cX * mode.cellSize + (offsetX * mode.cellSize / 16)][cZ * mode.cellSize + - (offsetZ * mode.cellSize / 16)]; + T[] hoveredItem = this.texture.data + [cX * mode.cellSize + (offsetX * mode.cellSize / 16)] + [cZ * mode.cellSize + (offsetZ * mode.cellSize / 16)]; if (hoveredItem != null && hoveredItem.length != 0) { var name = Component.translatable(mode.getDescriptionId(hoveredItem[0])).getString(); var color = mode.getItemColor(hoveredItem[0]); @@ -319,15 +340,21 @@ private WaypointItem getClickedVein(double mouseX, double mouseY) { } // If all else fails see if there's a nearby vein and use the vein's name - var vein = GTClientCache.instance.getNearbyVeins(gui.entityPlayer.level().dimension(), blockPos, 32); - if (!vein.isEmpty()) { - vein.sort((o1, o2) -> (int) (o1.center().distToCenterSqr(xPos, o1.center().getY(), zPos) - - o2.center().distToCenterSqr(xPos, o2.center().getY(), zPos))); - var name = OreRenderLayer.getName(vein.get(0)).getString(); - var materials = vein.get(0).definition().veinGenerator().getAllMaterials(); - var mostCommonItem = materials.get(materials.size() - 1); - var color = mostCommonItem.getMaterialRGB(); - return new WaypointItem(blockPos, name, color); + if (mode == ProspectorMode.ORE) { + var veins = GTClientCache.instance.getNearbyVeins(gui.entityPlayer.level().dimension(), pos, 32); + if (!veins.isEmpty()) { + veins.sort((o1, o2) -> { + int o1Dist = (int) o1.center().distToCenterSqr(xPos, o1.center().getY(), zPos); + int o2Dist = (int) o2.center().distToCenterSqr(xPos, o2.center().getY(), zPos); + return o1Dist - o2Dist; + }); + String uniqueId = OreRenderLayer.getId(veins.get(0)); + Component name = OreRenderLayer.getName(veins.get(0)); + List materials = veins.get(0).definition().veinGenerator().getAllMaterials(); + Material mostCommonItem = materials.get(materials.size() - 1); + int color = mostCommonItem.getMaterialARGB(); + return new WaypointItem(pos, uniqueId, name, color); + } } return new WaypointItem(blockPos, "Depleted Vein", 0x990000); @@ -339,28 +366,28 @@ public String resultDisplay(Object value) { } @Override - public void selectResult(Object item) { + public void selectResult(T item) { if (isRemote()) { - var uid = mode.getUniqueID(item); - texture.setSelected(uid); - var selected = selectedMap.get(uid); + String uniqueId = mode.getUniqueId(item); + this.texture.setSelected(uniqueId); + var selected = this.selectedMap.get(uniqueId); if (selected != null) { - itemList.setSelected(selected); + this.itemList.setSelected(selected); } } } @Override - public void search(String s, Consumer consumer) { - var added = new HashSet(); - for (var item : this.items) { + public void search(String searched, Consumer consumer) { + HashSet added = new HashSet<>(); + for (T item : this.items) { if (Thread.currentThread().isInterrupted()) return; - var id = mode.getUniqueID(item); + String id = mode.getUniqueId(item); if (!added.contains(id)) { added.add(id); - var localized = LocalizationUtils.format(resultDisplay(item)); - if (item.toString().toLowerCase(Locale.ROOT).contains(s.toLowerCase(Locale.ROOT)) || - localized.toLowerCase(Locale.ROOT).contains(s.toLowerCase(Locale.ROOT))) { + String localized = resultDisplay(item); + if (item.toString().toLowerCase(Locale.ROOT).contains(searched.toLowerCase(Locale.ROOT)) || + localized.toLowerCase(Locale.ROOT).contains(searched.toLowerCase(Locale.ROOT))) { consumer.accept(item); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index 33de34a5288..1edfe4c2c3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -91,8 +91,8 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer) { - var mode = getMode(entityPlayer.getItemInHand(InteractionHand.MAIN_HAND)); - var map = new ProspectingMapWidget(4, 4, 332 - 8, 200 - 8, radius, mode, 1); + ProspectorMode mode = this.getMode(entityPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + ProspectingMapWidget map = new ProspectingMapWidget<>(4, 4, 332 - 8, 200 - 8, radius, mode, 1); return new ModularUI(332, 200, holder, entityPlayer) .background(GuiTextures.BACKGROUND) .widget(map) From a19ceeb8c142c6eb630a1ee8ea94822c2b9230b4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:09:03 +0300 Subject: [PATCH 02/15] Make ProspectorMode.ORE not use `String`s for keys like, what?? wtf is that why would Kila do that --- .../gtceu/api/gui/misc/PacketProspecting.java | 4 +- .../gtceu/api/gui/misc/ProspectorMode.java | 145 ++++++++++-------- .../api/gui/texture/ProspectingTexture.java | 2 +- .../api/gui/widget/ProspectingMapWidget.java | 12 +- 4 files changed, 93 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java index ef746940413..4fe2a40cae3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java @@ -15,7 +15,7 @@ public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { this.chunkX = chunkX; this.chunkZ = chunkZ; this.mode = mode; - //noinspection unchecked + // noinspection unchecked this.data = (T[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); } @@ -23,7 +23,7 @@ public static PacketProspecting readPacketData(ProspectorMode mode, Fr PacketProspecting packet = new PacketProspecting<>(buffer.readVarInt(), buffer.readVarInt(), mode); for (int x = 0; x < mode.cellSize; x++) { for (int z = 0; z < mode.cellSize; z++) { - //noinspection unchecked + // noinspection unchecked packet.data[x][z] = (T[]) Array.newInstance(mode.getItemClass(), buffer.readVarInt()); for (int i = 0; i < packet.data[x][z].length; i++) { packet.data[x][z][i] = mode.deserialize(buffer); diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java index 0a00d5a9c19..c247811f11f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java @@ -9,9 +9,8 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.FluidVeinWorldEntry; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreVeinSavedData; -import com.gregtechceu.gtceu.api.gui.texture.ProspectingTexture; -import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.BlockStateAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -25,11 +24,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.material.Fluid; @@ -38,6 +41,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; +import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.AllArgsConstructor; import lombok.Getter; @@ -48,106 +52,127 @@ import java.util.*; +@SuppressWarnings("deprecation") public abstract class ProspectorMode { - public static ProspectorMode ORE = new ProspectorMode<>("metaitem.prospector.mode.ores", 16) { + public static ProspectorMode> ORE = new ProspectorMode<>( + "behavior.prospector.mode.ores", 16) { - private final Map BLOCK_CACHE = new HashMap<>(); - private final Map ICON_CACHE = new HashMap<>(); + private static final String MATERIAL_PREFIX = "material_"; + + private final Map> BLOCK_CACHE = new HashMap<>(); + private final Map, IGuiTexture> ICON_CACHE = new HashMap<>(); @Override - public void scan(String[][][] storage, LevelChunk chunk) { + public void scan(Either[][][] storage, LevelChunk chunk) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); var oreTag = TagUtil.createBlockTag("ores"); for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { for (int y = chunk.getMaxBuildHeight() - 1; y >= chunk.getMinBuildHeight(); y--) { pos.set(x, y, z); - var state = chunk.getBlockState(pos); - if (state.is(oreTag)) { - var itemName = BLOCK_CACHE.computeIfAbsent(state, blockState -> { - var name = BuiltInRegistries.BLOCK.getKey(blockState.getBlock()).toString(); - var entry = ChemicalHelper.getMaterialEntry(blockState.getBlock()); - if (!entry.isEmpty()) { - name = "material_" + entry.material(); - } - return name; - }); - storage[x][z] = ArrayUtils.add(storage[x][z], itemName); - } + BlockState state = chunk.getBlockState(pos); + if (!state.is(oreTag)) continue; + + Either item = BLOCK_CACHE.computeIfAbsent(state, blockState -> { + MaterialEntry entry = ChemicalHelper.getMaterialEntry(blockState.getBlock()); + if (!entry.isEmpty()) { + return Either.left(entry.material()); + } + return Either.right(blockState); + }); + storage[x][z] = ArrayUtils.add(storage[x][z], item); } } } } @Override - public int getItemColor(String item) { - if (item.startsWith("material_")) { - var mat = GTMaterials.get(item.substring(9)); - if (!mat.isNull()) { - return mat.getMaterialRGB(); - } - } - return BuiltInRegistries.BLOCK.get(new ResourceLocation(item)).defaultMapColor().col; + public int getItemColor(Either item) { + return item.map(Material::getMaterialARGB, + state -> ((BlockStateAccessor) state).gtceu$getDefaultMapColor().col | 0xFF000000); } @Override - public IGuiTexture getItemIcon(String item) { - return ICON_CACHE.computeIfAbsent(item, name -> { - if (name.startsWith("material_")) { - var mat = GTMaterials.get(name.substring(9)); - if (!mat.isNull()) { - var list = new ArrayList(); + public IGuiTexture getItemIcon(Either item) { + return ICON_CACHE.computeIfAbsent(item, either -> { + List items = either.map(material -> { + List oreItems = ChemicalHelper.getItems(new MaterialEntry(TagPrefix.rawOre, material)); + if (oreItems.isEmpty()) { + oreItems = new ArrayList<>(); for (TagPrefix oreTag : TagPrefix.ORES.keySet()) { - for (var block : ChemicalHelper.getBlocks(new MaterialEntry(oreTag, mat))) { - list.add(new ItemStack(block)); - } + oreItems.addAll(ChemicalHelper.getItems(new MaterialEntry(oreTag, material))); } - return new ItemStackTexture(list.toArray(ItemStack[]::new)).scale(0.8f); } - } - return new ItemStackTexture(new ItemStack(BuiltInRegistries.BLOCK.get(new ResourceLocation(name)))) - .scale(0.8f); + return oreItems; + }, state -> { + MaterialEntry entry = ChemicalHelper.getMaterialEntry(state.getBlock()); + List oreItems = ChemicalHelper.getItems(entry); + if (oreItems.isEmpty()) { + oreItems = List.of(state.getBlock().asItem()); + if (oreItems.get(0).asItem() == Items.AIR) { + oreItems = List.of(Items.BARRIER); + } + } + return oreItems; + }); + ItemStack[] stacks = items.stream() + .map(itemLike -> itemLike.asItem().getDefaultInstance()) + .toArray(ItemStack[]::new); + + return new ItemStackTexture(stacks).scale(0.8f); }); } @Override - public String getDescriptionId(String item) { - if (item.startsWith("material_")) { - var mat = GTMaterials.get(item.substring(9)); - if (!mat.isNull()) { - return mat.getUnlocalizedName(); - } - } - return BuiltInRegistries.BLOCK.get(new ResourceLocation(item)).getDescriptionId(); + public String getDescriptionId(Either item) { + return item.map(Material::getUnlocalizedName, state -> state.getBlock().getDescriptionId()); } @Override - public String getUniqueID(String item) { - return item; + public String getUniqueID(Either item) { + return item.map(material -> MATERIAL_PREFIX + material.getResourceLocation(), + state -> state.getBlockHolder().unwrapKey() + .map(ResourceKey::location) + .map(ResourceLocation::toString) + .orElse("Unknown entry ???")); } @Override - public void serialize(String item, FriendlyByteBuf buf) { - buf.writeUtf(item); + public void serialize(Either item, FriendlyByteBuf buf) { + item.ifLeft(material -> { + buf.writeBoolean(true); + buf.writeResourceLocation(material.getResourceLocation()); + }).ifRight(state -> { + buf.writeBoolean(false); + buf.writeNbt(NbtUtils.writeBlockState(state)); + }); } @Override - public String deserialize(FriendlyByteBuf buf) { - return buf.readUtf(); + public Either deserialize(FriendlyByteBuf buf) { + if (buf.readBoolean()) { + return Either.left(GTCEuAPI.materialManager.getMaterial(buf.readResourceLocation())); + } else { + CompoundTag tag = buf.readNbt(); + assert tag != null; + return Either.right(NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), tag)); + } } + @SuppressWarnings("unchecked") @Override - public Class getItemClass() { - return String.class; + public Class> getItemClass() { + return (Class>) (Class) Either.class; } @Override - public void appendTooltips(List items, List tooltips, String selected) { - Object2IntOpenHashMap counter = new Object2IntOpenHashMap<>(); - for (var array : items) { - for (String item : array) { - if (ProspectingTexture.SELECTED_ALL.equals(selected) || selected.equals(getUniqueID(item))) { + public void appendTooltips(List[]> items, List tooltips, + String selected) { + Object2IntOpenHashMap> counter = new Object2IntOpenHashMap<>(); + for (Either[] array : items) { + for (Either item : array) { + if (selected == null || selected.equals(this.getUniqueId(item))) { counter.addTo(item, 1); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java index 0382b6659fb..1d2ceb89dc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java @@ -64,7 +64,7 @@ public ProspectingTexture(int playerChunkX, int playerChunkZ, int playerBlockX, this.darkMode = darkMode; this.chunkRadius = chunkRadius; this.mode = mode; - //noinspection unchecked + // noinspection unchecked this.data = (T[][][]) Array.newInstance(mode.getItemClass(), (chunkRadius * 2 - 1) * mode.cellSize, (chunkRadius * 2 - 1) * mode.cellSize, 0); this.imageWidth = (chunkRadius * 2 - 1) * 16; diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java index 32b4a1cd1a1..f4d6a49eff7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java @@ -35,6 +35,7 @@ import lombok.Getter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.List; @@ -79,10 +80,9 @@ public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, WidgetGroup group = (WidgetGroup) new WidgetGroup(imageWidth + 10, 0, width - (imageWidth + 10), height) .setBackground(GuiTextures.BACKGROUND_INVERSE); group.addWidget(this.itemList = new DraggableScrollableWidgetGroup(4, 28, - group.getSize().width - 8, group.getSize().height - 32) + group.getSize().width - 8, group.getSize().height - 32) .setYScrollBarWidth(2) - .setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1)) - ); + .setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1))); group.addWidget(new SearchComponentWidget<>(6, 6, group.getSize().width - 12, 18, this)); addWidget(group); addNewItem("[all]", "all resources", IGuiTexture.EMPTY, -1); @@ -105,8 +105,7 @@ public void readInitialData(FriendlyByteBuf buffer) { buffer.readVarInt(), buffer.readVarInt(), buffer.readVarInt(), buffer.readVarInt(), gui.entityPlayer.getVisualRotationYInDegrees(), - mode, chunkRadius, darkMode - ); + mode, chunkRadius, darkMode); } public void setDarkMode(boolean darkMode) { @@ -220,8 +219,7 @@ private void addPacketToQueue(PacketProspecting packet) { GTClientCache.instance.addFluid( gui.entityPlayer.level().dimension(), packet.chunkX, packet.chunkZ, - (ProspectorMode.FluidInfo) packet.data[0][0][0] - ); + (ProspectorMode.FluidInfo) packet.data[0][0][0]); } } From c7aabe5915bc689f8ff510fd6f997d23a9c5b2f7 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:12:30 +0300 Subject: [PATCH 03/15] Rename ProspectorMode.OreInfo -> BedrockOreInfo --- .../gtceu/api/gui/misc/ProspectorMode.java | 42 +++++++++---------- .../SPacketProspectBedrockOre.java | 6 +-- .../map/cache/client/GTClientCache.java | 4 +- .../map/cache/fluid/FluidCache.java | 4 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java index c247811f11f..104e20a5c1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java @@ -304,15 +304,14 @@ public void drawSpecialGrid(GuiGraphics graphics, FluidInfo[] items, int x, int } }; - public record OreInfo(Material material, int weight, int left, int yield) { + public record BedrockOreInfo(Material material, int weight, int left, int yield) {} - } - - public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>("metaitem.prospector.mode.bedrock_ore", + public static ProspectorMode BEDROCK_ORE = new ProspectorMode<>( + "behavior.prospector.mode.bedrock_ore", 1) { @Override - public void scan(OreInfo[][][] storage, LevelChunk chunk) { + public void scan(BedrockOreInfo[][][] storage, LevelChunk chunk) { if (chunk.getLevel() instanceof ServerLevel serverLevel) { var oreVein = BedrockOreVeinSavedData.getOrCreate(serverLevel).getOreVeinWorldEntry(chunk.getPos().x, chunk.getPos().z); @@ -320,19 +319,19 @@ public void scan(OreInfo[][][] storage, LevelChunk chunk) { var left = 100 * oreVein.getOperationsRemaining() / BedrockOreVeinSavedData.MAXIMUM_VEIN_OPERATIONS; for (var entry : oreVein.getDefinition().materials()) { storage[0][0] = ArrayUtils.add(storage[0][0], - new OreInfo(entry.material(), entry.weight(), left, oreVein.getOreYield())); + new BedrockOreInfo(entry.material(), entry.weight(), left, oreVein.getOreYield())); } } } } @Override - public int getItemColor(OreInfo item) { - return item.material.getMaterialRGB(); + public int getItemColor(BedrockOreInfo item) { + return item.material.getMaterialARGB(); } @Override - public IGuiTexture getItemIcon(OreInfo item) { + public IGuiTexture getItemIcon(BedrockOreInfo item) { Material material = item.material; ItemStack stack = GTUtil.getFirstNonEmpty( ChemicalHelper.get(TagPrefix.get(ConfigHolder.INSTANCE.machines.bedrockOreDropTagPrefix), material), @@ -344,17 +343,17 @@ public IGuiTexture getItemIcon(OreInfo item) { } @Override - public String getDescriptionId(OreInfo item) { - return item.material.getUnlocalizedName(); + public Component getDescription(BedrockOreInfo item) { + return item.material.getLocalizedName(); } @Override - public String getUniqueID(OreInfo item) { + public String getUniqueId(BedrockOreInfo item) { return item.material.getName(); } @Override - public void serialize(OreInfo item, FriendlyByteBuf buf) { + public void serialize(BedrockOreInfo item, FriendlyByteBuf buf) { buf.writeResourceLocation(item.material.getResourceLocation()); buf.writeVarInt(item.weight); buf.writeVarInt(item.left); @@ -362,25 +361,26 @@ public void serialize(OreInfo item, FriendlyByteBuf buf) { } @Override - public OreInfo deserialize(FriendlyByteBuf buf) { + public BedrockOreInfo deserialize(FriendlyByteBuf buf) { ResourceLocation materialId = buf.readResourceLocation(); - return new OreInfo( + return new BedrockOreInfo( GTCEuAPI.materialManager.getRegistry(materialId.getNamespace()).get(materialId.getPath()), buf.readVarInt(), buf.readVarInt(), buf.readVarInt()); } @Override - public Class getItemClass() { - return OreInfo.class; + public Class getItemClass() { + return BedrockOreInfo.class; } @Override - public void appendTooltips(List items, List tooltips, String selected) { + public void appendTooltips(List items, List tooltips, String selected) { for (var array : items) { - int totalWeight = Arrays.stream(array).mapToInt(OreInfo::weight).sum(); - for (OreInfo item : array) { + int totalWeight = Arrays.stream(array).mapToInt(BedrockOreInfo::weight).sum(); + for (BedrockOreInfo item : array) { float chance = (float) item.weight / totalWeight * 100; - tooltips.add(Component.translatable(getDescriptionId(item)).append(" (") + tooltips.add(getDescription(item).copy() + .append(" (") .append(Component.translatable("gtceu.gui.content.chance_base", FormattingUtil.formatNumber2Places(chance))) .append(") --- %s (%s%%)".formatted(item.yield, item.left))); diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java index 2ee47f2d3d8..b0596119290 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java @@ -5,7 +5,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; -public class SPacketProspectBedrockOre extends SPacketProspect { +public class SPacketProspectBedrockOre extends SPacketProspect { @SuppressWarnings("unused") public SPacketProspectBedrockOre() { @@ -17,12 +17,12 @@ public SPacketProspectBedrockOre(FriendlyByteBuf buf) { } @Override - public void encodeData(FriendlyByteBuf buf, ProspectorMode.OreInfo data) { + public void encodeData(FriendlyByteBuf buf, ProspectorMode.BedrockOreInfo data) { ProspectorMode.BEDROCK_ORE.serialize(data, buf); } @Override - public ProspectorMode.OreInfo decodeData(FriendlyByteBuf buf) { + public ProspectorMode.BedrockOreInfo decodeData(FriendlyByteBuf buf) { return ProspectorMode.BEDROCK_ORE.deserialize(buf); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java index fcee40600f4..562f55e4bc3 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java @@ -56,7 +56,7 @@ public void addFluid(ResourceKey dim, int chunkX, int chunkZ, ProspectorM public boolean addVein(ResourceKey dim, int gridX, int gridZ, GeneratedVeinMetadata vein) { GenericMapRenderer renderer = GroupingMapRenderer.getInstance(); if (renderer != null) { - renderer.addMarker(OreRenderLayer.getName(vein).getString(), dim, vein, OreRenderLayer.getId(vein)); + renderer.addMarker(OreRenderLayer.getName(vein), dim, vein, OreRenderLayer.getId(vein)); } boolean added = super.addVein(dim, gridX, gridZ, vein); if (added) { @@ -93,7 +93,7 @@ public void readDimFile(String prefix, ResourceKey dim, CompoundTag data) if (renderer != null) { for (GridCache grid : cache.get(dim).getCache().values()) { for (GeneratedVeinMetadata vein : grid.getVeins()) { - renderer.addMarker(OreRenderLayer.getName(vein).getString(), dim, vein, OreRenderLayer.getId(vein)); + renderer.addMarker(OreRenderLayer.getName(vein), dim, vein, OreRenderLayer.getId(vein)); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java index b819067d239..d3b44201b1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java @@ -24,7 +24,7 @@ public void addFluid(ResourceKey dim, int chunkX, int chunkZ, ProspectorM ChunkPos pos = new ChunkPos(chunkX, chunkZ); if (!fluidCache.contains(dim, pos)) { fluidCache.put(dim, pos, fluid); - GroupingMapRenderer.getInstance().addMarker(FluidRenderLayer.getName(fluid).getString(), + GroupingMapRenderer.getInstance().addMarker(FluidRenderLayer.getName(fluid), FluidRenderLayer.getId(fluid, pos), dim, pos, fluid); } } @@ -39,7 +39,7 @@ public void fromNbt(CompoundTag nbt) { var fluid = ProspectorMode.FluidInfo.fromNbt(fluidTag); fluidCache.put(dim, pos, fluid); - GroupingMapRenderer.getInstance().addMarker(FluidRenderLayer.getName(fluid).getString(), + GroupingMapRenderer.getInstance().addMarker(FluidRenderLayer.getName(fluid), FluidRenderLayer.getId(fluid, pos), dim, pos, fluid); } } From 1f9554537a7ae253735486040a0bbdca98461741 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:17:35 +0300 Subject: [PATCH 04/15] Use actual `Component`s for translated strings instead of hardcoding them in some places and fetching the value early in others --- .../gtceu/api/gui/misc/ProspectorMode.java | 22 +-- .../api/gui/widget/ProspectingMapWidget.java | 67 ++++---- .../behavior/ProspectorScannerBehavior.java | 42 ++--- .../gtceu/data/lang/IntegrationLang.java | 7 +- .../gtceu/data/lang/LangHandler.java | 20 +-- .../integration/map/GenericMapRenderer.java | 5 +- .../integration/map/GroupingMapRenderer.java | 5 +- .../map/ftbchunks/FTBChunksRenderer.java | 7 +- .../map/ftbchunks/veins/ore/OreVeinIcon.java | 64 +++---- .../map/journeymap/JourneymapOptions.java | 11 +- .../map/journeymap/JourneymapRenderer.java | 158 ++++++++---------- .../map/layer/builtin/FluidRenderLayer.java | 18 +- .../map/layer/builtin/OreRenderLayer.java | 6 +- .../map/xaeros/XaerosRenderer.java | 7 +- .../ore/OreVeinElement.java | 21 ++- .../xaeros/minimap/ore/OreVeinElement.java | 29 ---- .../minimap/ore/OreVeinElementReader.java | 3 +- .../ore/OreVeinElementRenderProvider.java | 1 + .../minimap/ore/OreVeinElementRenderer.java | 7 +- .../worldmap/ore/OreVeinElementReader.java | 3 +- .../ore/OreVeinElementRenderProvider.java | 7 +- .../worldmap/ore/OreVeinElementRenderer.java | 6 +- 22 files changed, 249 insertions(+), 267 deletions(-) rename src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/{worldmap => common}/ore/OreVeinElement.java (55%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElement.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java index 104e20a5c1f..3b78cadd84d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java @@ -125,12 +125,12 @@ public IGuiTexture getItemIcon(Either item) { } @Override - public String getDescriptionId(Either item) { - return item.map(Material::getUnlocalizedName, state -> state.getBlock().getDescriptionId()); + public Component getDescription(Either item) { + return item.map(Material::getLocalizedName, state -> state.getBlock().getName()); } @Override - public String getUniqueID(Either item) { + public String getUniqueId(Either item) { return item.map(material -> MATERIAL_PREFIX + material.getResourceLocation(), state -> state.getBlockHolder().unwrapKey() .map(ResourceKey::location) @@ -178,7 +178,7 @@ public void appendTooltips(List[]> items, List tooltips - .add(Component.translatable(getDescriptionId(item)).append(" --- " + count))); + .add(getDescription(item).copy().append(" --- %s".formatted(count)))); } }; @@ -219,7 +219,7 @@ public static FluidInfo fromVeinWorldEntry(@NotNull FluidVeinWorldEntry savedDat } } - public static ProspectorMode FLUID = new ProspectorMode<>("metaitem.prospector.mode.fluid", 1) { + public static ProspectorMode FLUID = new ProspectorMode<>("behavior.prospector.mode.fluid", 1) { @Override public void scan(FluidInfo[][][] storage, LevelChunk chunk) { @@ -249,12 +249,12 @@ public IGuiTexture getItemIcon(FluidInfo item) { } @Override - public String getDescriptionId(FluidInfo item) { - return new FluidStack(item.fluid, item.yield).getDisplayName().getString(); + public Component getDescription(FluidInfo item) { + return new FluidStack(item.fluid, item.yield).getDisplayName(); } @Override - public String getUniqueID(FluidInfo item) { + public String getUniqueId(FluidInfo item) { return BuiltInRegistries.FLUID.getKey(item.fluid).toString(); } @@ -280,7 +280,7 @@ public Class getItemClass() { public void appendTooltips(List items, List tooltips, String selected) { for (var array : items) { for (FluidInfo item : array) { - tooltips.add(Component.translatable(getDescriptionId(item)) + tooltips.add(getDescription(item).copy() .append(" --- %s (%s%%)".formatted(item.yield, item.left))); } } @@ -403,9 +403,9 @@ public void appendTooltips(List items, List tooltip public abstract IGuiTexture getItemIcon(T item); - public abstract String getDescriptionId(T item); + public abstract Component getDescription(T item); - public abstract String getUniqueID(T item); + public abstract String getUniqueId(T item); public abstract void serialize(T item, FriendlyByteBuf buf); diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java index f4d6a49eff7..1039fe7623a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java @@ -85,7 +85,8 @@ public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, .setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1))); group.addWidget(new SearchComponentWidget<>(6, 6, group.getSize().width - 12, 18, this)); addWidget(group); - addNewItem("[all]", "all resources", IGuiTexture.EMPTY, -1); + + addNewItem(null, Component.translatable("behavior.prospector.display_all"), IGuiTexture.EMPTY); } @Override @@ -131,23 +132,26 @@ private void addOresToList(T[][][] data) { items.addAll(newItems); } - private void addNewItem(String uniqueID, String renderingName, IGuiTexture icon, int color) { - if (!selectedMap.containsKey(uniqueID)) { - var index = itemList.widgets.size(); + private void addNewItem(String uniqueId, Component renderingName, IGuiTexture icon) { + if (!selectedMap.containsKey(uniqueId)) { + int index = itemList.widgets.size(); var selectableWidgetGroup = new SelectableWidgetGroup(0, index * 15, itemList.getSize().width - 4, 15); var size = selectableWidgetGroup.getSize(); selectableWidgetGroup.addWidget(new ImageWidget(0, 0, 15, 15, icon)); selectableWidgetGroup.addWidget(new ImageWidget(15, 0, size.width - 15, 15, - new TextTexture(renderingName).setWidth(size.width - 15).setType(TextTexture.TextType.LEFT_HIDE))); + new TextTexture(renderingName.getString()) + .setWidth(size.width - 15) + .setType(TextTexture.TextType.LEFT_HIDE))); + selectableWidgetGroup.setOnSelected(s -> { if (isRemote()) { - texture.setSelected(uniqueID); + texture.setSelected(uniqueId); } }); selectableWidgetGroup.setSelectedTexture(ColorPattern.WHITE.borderTexture(-1)); itemList.addWidget(selectableWidgetGroup); - selectedMap.put(uniqueID, selectableWidgetGroup); + selectedMap.put(uniqueId, selectableWidgetGroup); } } @@ -290,7 +294,10 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { clickedItem.name.getString(), clickedItem.color, gui.entityPlayer.level().dimension(), clickedItem.position); gui.entityPlayer.displayClientMessage( - Component.translatable("behavior.prospector.added_waypoint", veinName), false); + Component.translatable("behavior.prospector.added_waypoint", + clickedItem.name.copy().withStyle(style -> style.withColor(clickedItem.color))), + false); + playButtonClickSound(); return true; } @@ -308,33 +315,35 @@ private WaypointItem getClickedVein(double mouseX, double mouseY) { int xDiff = cX - (this.chunkRadius - 1); int zDiff = cZ - (this.chunkRadius - 1); - int xPos = ((gui.entityPlayer.chunkPosition().x + xDiff) << 4) + offsetX; - int zPos = ((gui.entityPlayer.chunkPosition().z + zDiff) << 4) + offsetZ; + int xPos = SectionPos.sectionToBlockCoord(gui.entityPlayer.chunkPosition().x + xDiff) + offsetX; + int zPos = SectionPos.sectionToBlockCoord(gui.entityPlayer.chunkPosition().z + zDiff) + offsetZ; + int yPos = gui.entityPlayer.level().getHeight(Heightmap.Types.WORLD_SURFACE, xPos, zPos); - var blockPos = new BlockPos(xPos, gui.entityPlayer.level().getHeight(Heightmap.Types.WORLD_SURFACE, xPos, zPos), - zPos); - if (cX < 0 || cZ < 0 || cX >= chunkRadius * 2 - 1 || cZ >= chunkRadius * 2 - 1) { + BlockPos pos = new BlockPos(xPos, yPos, zPos); + if (cX < 0 || cZ < 0 || cX >= this.chunkRadius * 2 - 1 || cZ >= this.chunkRadius * 2 - 1) { return null; } // If the ores are filtered use its name - if (!texture.getSelected().equals(ProspectingTexture.SELECTED_ALL)) { - for (var item : items) { - if (!texture.getSelected().equals(mode.getUniqueID(item))) continue; - var name = Component.translatable(mode.getDescriptionId(item)).getString(); - var color = mode.getItemColor(item); - return new WaypointItem(blockPos, name, color); + if (this.texture.getSelected() != null) { + for (T item : this.items) { + String uniqueId = mode.getUniqueId(item); + if (!this.texture.getSelected().equals(uniqueId)) continue; + + Component name = mode.getDescription(item); + int color = mode.getItemColor(item); + return new WaypointItem(pos, uniqueId, name, color); } } // If the cursor is over an ore use its name - T[] hoveredItem = this.texture.data - [cX * mode.cellSize + (offsetX * mode.cellSize / 16)] - [cZ * mode.cellSize + (offsetZ * mode.cellSize / 16)]; + T[] hoveredItem = this.texture.data[cX * mode.cellSize + (offsetX * mode.cellSize / 16)][cZ * mode.cellSize + + (offsetZ * mode.cellSize / 16)]; if (hoveredItem != null && hoveredItem.length != 0) { - var name = Component.translatable(mode.getDescriptionId(hoveredItem[0])).getString(); - var color = mode.getItemColor(hoveredItem[0]); - return new WaypointItem(blockPos, name, color); + String uniqueId = mode.getUniqueId(hoveredItem[0]); + Component name = mode.getDescription(hoveredItem[0]); + int color = mode.getItemColor(hoveredItem[0]); + return new WaypointItem(pos, uniqueId, name, color); } // If all else fails see if there's a nearby vein and use the vein's name @@ -355,12 +364,12 @@ private WaypointItem getClickedVein(double mouseX, double mouseY) { } } - return new WaypointItem(blockPos, "Depleted Vein", 0x990000); + return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), 0xFF990000); } @Override - public String resultDisplay(Object value) { - return mode.getDescriptionId(value); + public String resultDisplay(T value) { + return mode.getDescription(value).getString(); } @Override @@ -392,5 +401,5 @@ public void search(String searched, Consumer consumer) { } } - private record WaypointItem(BlockPos position, String name, int color) {} + private record WaypointItem(BlockPos position, @Nullable String uniqueId, Component name, int color) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index 1edfe4c2c3f..aca5b5c49d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -16,8 +16,8 @@ import com.lowdragmc.lowdraglib.gui.widget.SwitchWidget; import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -47,26 +47,26 @@ public ProspectorScannerBehavior(int radius, long cost, ProspectorMode... mod @NotNull public ProspectorMode getMode(ItemStack stack) { - if (stack == ItemStack.EMPTY) { - return modes[0]; + if (stack.isEmpty()) { + return this.modes[0]; } - var tag = stack.getTag(); + CompoundTag tag = stack.getTag(); if (tag == null) { - return modes[0]; + return this.modes[0]; } - return modes[tag.getInt("Mode") % modes.length]; + return this.modes[tag.getInt("Mode") % this.modes.length]; } public void setNextMode(ItemStack stack) { - var tag = stack.getOrCreateTag(); - tag.putInt("Mode", (tag.getInt("Mode") + 1) % modes.length); + CompoundTag tag = stack.getOrCreateTag(); + tag.putInt("Mode", (tag.getInt("Mode") + 1) % this.modes.length); } public boolean drainEnergy(@NotNull ItemStack stack, boolean simulate) { IElectricItem electricItem = GTCapabilityHelper.getElectricItem(stack); if (electricItem == null) return false; - int amount = Math.round(cost * (ConfigHolder.INSTANCE.machines.prospectorEnergyUseMultiplier / 100F)); + int amount = Math.round(this.cost * (ConfigHolder.INSTANCE.machines.prospectorEnergyUseMultiplier / 100F)); return electricItem.discharge(amount, Integer.MAX_VALUE, true, false, simulate) >= amount; } @@ -74,17 +74,17 @@ public boolean drainEnergy(@NotNull ItemStack stack, boolean simulate) { @Override public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { ItemStack heldItem = player.getItemInHand(usedHand); - if (player.isShiftKeyDown() && modes.length > 1) { + if (player.isShiftKeyDown() && this.modes.length > 1) { if (!level.isClientSide) { setNextMode(heldItem); - var mode = getMode(heldItem); + ProspectorMode mode = getMode(heldItem); player.sendSystemMessage(Component.translatable(mode.unlocalizedName)); } - return InteractionResultHolder.success(heldItem); + return InteractionResultHolder.sidedSuccess(heldItem, level.isClientSide); } if (!player.isCreative() && !drainEnergy(heldItem, true)) { player.sendSystemMessage(Component.translatable("behavior.prospector.not_enough_energy")); - return InteractionResultHolder.success(heldItem); + return InteractionResultHolder.sidedSuccess(heldItem, level.isClientSide); } return IItemUIFactory.super.use(item, level, player, usedHand); } @@ -102,18 +102,20 @@ public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entity new GuiTextureGroup(GuiTextures.BUTTON, GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(true).copy() .getSubTexture(0, 0.5, 1, 0.5).scale(0.8f)), - new GuiTextureGroup(GuiTextures.BUTTON, GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(true) - .copy().getSubTexture(0, 0, 1, 0.5).scale(0.8f)))); + new GuiTextureGroup(GuiTextures.BUTTON, + GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(true).copy() + .getSubTexture(0, 0, 1, 0.5).scale(0.8f)))); } @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { - tooltipComponents.add(Component.translatable("metaitem.prospector.tooltip.radius", radius)); - tooltipComponents.add(Component.translatable("metaitem.prospector.tooltip.modes")); - for (ProspectorMode mode : modes) { - tooltipComponents.add(Component.literal(" -").append(Component.translatable(mode.unlocalizedName)) - .withStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + tooltipComponents.add(Component.translatable("behavior.prospector.tooltip.radius", this.radius)); + tooltipComponents.add(Component.translatable("behavior.prospector.tooltip.modes")); + for (ProspectorMode mode : this.modes) { + tooltipComponents.add(Component.literal(" -") + .append(Component.translatable(mode.unlocalizedName)) + .withStyle(ChatFormatting.RED)); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index e421abd7451..35e6de78113 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -121,7 +121,7 @@ private static void initWailaLikeLang(RegistrateLangProvider provider) { } private static void initMinimapLang(RegistrateLangProvider provider) { - provider.add("gtceu.minimap.ore_vein.depleted", "Depleted"); + provider.add("gtceu.minimap.ore_vein.depleted", "Depleted Vein"); provider.add("message.gtceu.new_veins.amount", "Prospected %d new veins!"); provider.add("message.gtceu.new_veins.name", "Prospected %s!"); @@ -132,6 +132,11 @@ private static void initMinimapLang(RegistrateLangProvider provider) { provider.add("gtceu.journeymap.options.layers.ore_veins", "Show Ore Veins"); provider.add("gtceu.journeymap.options.layers.bedrock_fluids", "Show Bedrock Fluid Veins"); provider.add("gtceu.journeymap.options.layers.hide_depleted", "Hide Depleted Veins"); + + provider.add("gtceu.button.ore_veins", "Show Ore Veins"); + provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); + provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); + provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); } private static void initOwnershipLang(RegistrateLangProvider provider) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index e0ae7dd8bb2..8eb6fca1f11 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -808,23 +808,17 @@ public static void init(RegistrateLangProvider provider) { provider.add("enchantment.hard_hammer", "Hammering"); provider.add("enchantment.gtceu.hard_hammer.description", "Breaks blocks as if they were mined with a GregTech Hammer."); - provider.add("tile.gtceu.seal.name", "Sealed Block"); - provider.add("tile.gtceu.foam.name", "Foam"); - provider.add("tile.gtceu.reinforced_foam.name", "Reinforced Foam"); - provider.add("tile.gtceu.petrified_foam.name", "Petrified Foam"); - provider.add("tile.gtceu.reinforced_stone.name", "Reinforced Stone"); - provider.add("tile.gtceu.brittle_charcoal.name", "Brittle Charcoal"); - multilineLang(provider, "tile.gtceu.brittle_charcoal.tooltip", - "Produced by the Charcoal Pile Igniter.\nMine this to get Charcoal."); - provider.add("metaitem.prospector.mode.ores", "§aOre Prospection Mode§r"); - provider.add("metaitem.prospector.mode.fluid", "§bFluid Prospection Mode§r"); - provider.add("metaitem.prospector.mode.bedrock_ore", "§bBedrock Ore Prospection Mode§r"); - provider.add("metaitem.prospector.tooltip.radius", "Scans range in a %s Chunk Radius"); - provider.add("metaitem.prospector.tooltip.modes", "Available Modes:"); + provider.add("behavior.prospector.mode.ores", "§aOre Prospection Mode"); + provider.add("behavior.prospector.mode.fluid", "§bFluid Prospection Mode"); + provider.add("behavior.prospector.mode.bedrock_ore", "§bBedrock Ore Prospection Mode"); + provider.add("behavior.prospector.tooltip.radius", "Scans resources in a %s Chunk Radius"); + provider.add("behavior.prospector.tooltip.modes", "Available Modes:"); provider.add("behavior.prospector.not_enough_energy", "Not Enough Energy!"); provider.add("behavior.prospector.added_waypoint", "Created waypoint named %s!"); provider.add("metaitem.tricorder_scanner.tooltip", "Tricorder"); provider.add("metaitem.debug_scanner.tooltip", "Tricorder"); + provider.add("behavior.prospector.display_all", "All resources"); + provider.add("behavior.portable_scanner.bedrock_fluid.amount", "Fluid In Deposit: %s %s - %s%%"); provider.add("behavior.portable_scanner.bedrock_fluid.amount_unknown", "Fluid In Deposit: %s%%"); provider.add("behavior.portable_scanner.bedrock_fluid.nothing", "Fluid In Deposit: §6Nothing§r"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java index a149d377830..407ac91000b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.MapRenderLayer; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -33,10 +34,10 @@ public GenericMapRenderer(boolean initializeLayers) { } } - public abstract boolean addMarker(String name, String id, ResourceKey dim, ChunkPos pos, + public abstract boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid); - public abstract boolean addMarker(String name, ResourceKey dim, GeneratedVeinMetadata vein, String id); + public abstract boolean addMarker(Component name, ResourceKey dim, GeneratedVeinMetadata vein, String id); public abstract boolean removeMarker(ResourceKey dim, String id); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java index bea0399c3c2..23f9cc6377e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.integration.map.journeymap.JourneymapRenderer; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -53,7 +54,7 @@ public GroupingMapRenderer(Map renderers) { } @Override - public boolean addMarker(String name, String id, ResourceKey dim, ChunkPos pos, + public boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid) { boolean value = false; for (GenericMapRenderer renderer : rendererList) { @@ -63,7 +64,7 @@ public boolean addMarker(String name, String id, ResourceKey dim, ChunkPo } @Override - public boolean addMarker(String name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { + public boolean addMarker(Component name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { boolean value = false; for (GenericMapRenderer renderer : rendererList) { value |= renderer.addMarker(name, dim, vein, id); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java index 6ea64c9c1bd..0e27eb8e37b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.fluid.FluidVeinIcon; import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.ore.OreVeinIcon; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -28,15 +29,15 @@ public class FTBChunksRenderer extends GenericMapRenderer { private static final Map markers = new Object2ObjectOpenHashMap<>(); @Override - public boolean addMarker(String name, String id, ResourceKey dim, ChunkPos pos, + public boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid) { fluidElements.put(dim, pos, new FluidVeinIcon(pos, fluid)); return true; } @Override - public boolean addMarker(String name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { - oreElements.put(dim, id, new OreVeinIcon(vein)); + public boolean addMarker(Component name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { + oreElements.put(dim, id, new OreVeinIcon(name, vein)); return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java index c6cd4331c23..bd5d4ecfaee 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java @@ -12,6 +12,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.phys.Vec3; @@ -31,16 +33,19 @@ import dev.ftb.mods.ftblibrary.ui.input.Key; import dev.ftb.mods.ftblibrary.ui.input.MouseButton; import dev.ftb.mods.ftblibrary.util.TooltipList; +import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.List; public class OreVeinIcon implements MapIcon { + @Getter + protected final Component name; protected final GeneratedVeinMetadata veinMetadata; - protected String name = null; - public OreVeinIcon(GeneratedVeinMetadata veinMetadata) { + public OreVeinIcon(Component name, GeneratedVeinMetadata veinMetadata) { + this.name = name; this.veinMetadata = veinMetadata; } @@ -55,10 +60,6 @@ public boolean isEnabled() { !(veinMetadata.depleted() && FTBChunksOptions.hideDepleted()); } - public String getName() { - return name == null ? name = OreRenderLayer.getName(veinMetadata).getString() : name; - } - public @NotNull Material getMaterial() { return OreRenderLayer.getMaterial(veinMetadata); } @@ -84,20 +85,22 @@ public boolean onMousePressed(BaseScreen baseScreen, MouseButton mouseButton) { } private void openContextMenu(LargeMapScreen screen) { - var title = Component.literal(getName()); + MutableComponent title = getName().copy(); if (veinMetadata.depleted()) { title.append(" (").append(Component.translatable("gtceu.minimap.ore_vein.depleted")).append(")"); } - var markDepleted = new ContextMenuItem(Component.translatable("button.gtceu.mark_as_depleted.name"), + ContextMenuItem markDepleted = new ContextMenuItem(Component.translatable("button.gtceu.mark_as_depleted.name"), Icons.REMOVE, b -> veinMetadata.depleted(!veinMetadata.depleted())); - var material = getMaterial(); - var color = material.isNull() ? Color4I.rgba(0xFFFFFFFF) : Color4I.rgba(material.getMaterialARGB()); + + var color = Color4I.rgba(getMaterial().getMaterialARGB()); var waypointIcon = WaypointType.DEFAULT.getIcon().withColor(color); - var toggleWaypoint = new ContextMenuItem(Component.translatable("button.gtceu.toggle_waypoint.name"), + ContextMenuItem toggleWaypoint = new ContextMenuItem( + Component.translatable("button.gtceu.toggle_waypoint.name"), waypointIcon, b -> toggleWaypoint(screen)); - var contextMenu = List.of( + + List contextMenu = List.of( ContextMenuItem.title(title), ContextMenuItem.SEPARATOR, markDepleted, @@ -111,14 +114,14 @@ public void toggleWaypoint(LargeMapScreen screen) { var waypointManager = FTBChunksAPI.clientApi().getWaypointManager(dimension) .orElse(null); if (mapManager == null || waypointManager == null) return; - var waypoint = new WaypointImpl(WaypointType.DEFAULT, mapManager.getDimension(dimension), - veinMetadata.center()); + + var waypoint = new WaypointImpl(WaypointType.DEFAULT, + mapManager.getDimension(dimension), veinMetadata.center()); if (waypointManager.getAllWaypoints().contains(waypoint)) { waypointManager.removeWaypoint(waypoint); } else { - var material = getMaterial(); - var color = material.isNull() ? 0xFFFFFFFF : material.getMaterialARGB(); - waypointManager.addWaypointAt(veinMetadata.center(), getName()) + int color = getMaterial().getMaterialARGB(); + waypointManager.addWaypointAt(veinMetadata.center(), getName().getString()) .setColor(color) .setHidden(false); } @@ -148,30 +151,29 @@ public void addTooltip(TooltipList list) { } @Override - public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int h, boolean outsideVisibleArea, - int iconAlpha) { + public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int h, + boolean outsideVisibleArea, int iconAlpha) { if (outsideVisibleArea || !isEnabled()) { return; } - var iconSize = ConfigHolder.INSTANCE.compat.minimap.oreIconSize; - var material = getMaterial(); - var color = material.isNull() ? 0xFFFFFFFF : material.getMaterialARGB(); - var colors = DrawUtil.floats(color); + int iconSize = ConfigHolder.INSTANCE.compat.minimap.oreIconSize; + Material material = getMaterial(); + int color = material.getMaterialARGB(); + float[] colors = DrawUtil.floats(color); RenderSystem.setShaderColor(1, 1, 1, 1); - var iconSet = material.isNull() ? MaterialIconSet.METALLIC : material.getMaterialIconSet(); - var oreTexture = MaterialIconType.rawOre.getItemTexturePath(iconSet, - true); + MaterialIconSet iconSet = material.isNull() ? MaterialIconSet.METALLIC : material.getMaterialIconSet(); + ResourceLocation oreTexture = MaterialIconType.rawOre.getItemTexturePath(iconSet, true); if (oreTexture != null) { - var oreSprite = Minecraft.getInstance() - .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + var oreSprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS) .apply(oreTexture); graphics.blit(x, y, 0, w, h, oreSprite, colors[0], colors[1], colors[2], 1); } + oreTexture = MaterialIconType.rawOre.getItemTexturePath(iconSet, "secondary", true); if (oreTexture != null) { - var materialSecondaryARGB = material.isNull() ? 0xFFFFFFFF : material.getMaterialSecondaryARGB(); + int materialSecondaryARGB = material.getMaterialSecondaryARGB(); colors = DrawUtil.floats(materialSecondaryARGB); var oreSprite = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) @@ -180,9 +182,9 @@ public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int } RenderSystem.setShaderColor(1, 1, 1, 1); - var borderColor = ConfigHolder.INSTANCE.compat.minimap.getBorderColor(color | 0xFF000000); + int borderColor = ConfigHolder.INSTANCE.compat.minimap.getBorderColor(color | 0xFF000000); if ((borderColor & 0xFF000000) != 0) { - var thickness = iconSize / 16; + int thickness = iconSize / 16; graphics.fill(x, y, x + w, y + h + thickness, borderColor); graphics.fill(x, y - thickness, x + w, y + h + thickness, borderColor); graphics.fill(x, y, x + w + thickness, y + h, borderColor); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapOptions.java b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapOptions.java index 45246a2ec12..5c5c105207b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapOptions.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapOptions.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.map.journeymap; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.integration.map.layer.Layers; import journeymap.client.api.IClientAPI; import journeymap.client.api.option.BooleanOption; @@ -14,14 +15,12 @@ public class JourneymapOptions { private final Map layerOptions = new HashMap<>(); public JourneymapOptions() { - final String prefix = "gtceu.journeymap.options.layers."; final OptionCategory category = new OptionCategory(GTCEu.MOD_ID, "gtceu.journeymap.options.layers"); - final BooleanOption oreLayer = new BooleanOption(category, "ore_veins", prefix + "ore_veins", false); - layerOptions.put(oreLayer.getFieldName(), oreLayer); - final BooleanOption fluidLayer = new BooleanOption(category, "bedrock_fluids", prefix + "bedrock_fluids", - false); - layerOptions.put(fluidLayer.getFieldName(), fluidLayer); + for (String layerName : Layers.allKeys()) { + final BooleanOption layer = new BooleanOption(category, layerName, "gtceu.button." + layerName, false); + layerOptions.put(layerName, layer); + } } public boolean showLayer(String name) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java index a62aa179808..88ef4d1d521 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java @@ -57,7 +57,7 @@ public JourneymapRenderer() { } @Override - public boolean addMarker(String name, String id, ResourceKey dim, ChunkPos pos, + public boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid) { IClientAPI api = JourneyMapPlugin.getJmApi(); if (!api.playerAccepts(GTCEu.MOD_ID, DisplayType.Image)) { @@ -77,7 +77,7 @@ public boolean addMarker(String name, String id, ResourceKey dim, ChunkPo } @Override - public boolean addMarker(String name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { + public boolean addMarker(Component name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { IClientAPI api = JourneyMapPlugin.getJmApi(); if (!api.playerAccepts(GTCEu.MOD_ID, DisplayType.Image)) { return false; @@ -123,11 +123,12 @@ public void clear() { markers.clear(); } - private MarkerOverlay createMarker(String name, String id, ResourceKey dim, GeneratedVeinMetadata vein) { - BlockPos center = vein.center(); + private MarkerOverlay createMarker(Component name, String id, ResourceKey dim, + GeneratedVeinMetadata oreVein) { + final BlockPos center = oreVein.center(); @SuppressWarnings("DataFlowIssue") - MapImage image = new MapImage(createOreImage(vein)); + MapImage image = new MapImage(createOreImage(oreVein)); image.centerAnchors() .setDisplayWidth(ConfigHolder.INSTANCE.compat.minimap.oreIconSize) .setDisplayHeight(ConfigHolder.INSTANCE.compat.minimap.oreIconSize); @@ -136,17 +137,33 @@ private MarkerOverlay createMarker(String name, String id, ResourceKey di overlay.setDimension(dim); overlay.setLabel("") - .setTitle(OreRenderLayer.getTooltip(name, vein).stream().map(Component::getString).reduce("", - (s1, s2) -> { - if (s1.isEmpty()) { - return s2; - } - if (s2.isEmpty()) { - return s1; - } - return String.join("\n", s1, s2); - })) - .setOverlayListener(new MarkerListener(vein, name)); + .setTitle(OreRenderLayer.getTooltip(name, oreVein) + .stream() + .map(Component::getString) + .reduce("", + (s1, s2) -> { + if (s1.isEmpty()) { + return s2; + } + if (s2.isEmpty()) { + return s1; + } + return String.join("\n", s1, s2); + })) + .setOverlayListener(new MarkerListener(() -> { + Material firstMaterial = oreVein.definition().veinGenerator().getAllMaterials().get(0); + int color = firstMaterial.getMaterialARGB(); + + WaypointManager.toggleWaypoint(OreRenderLayer.getId(oreVein), name.getString(), color, + null, center); + }, () -> { + oreVein.depleted(!oreVein.depleted()); + }, () -> { + Material firstMaterial = oreVein.definition().veinGenerator().getAllMaterials().get(0); + int color = firstMaterial.getMaterialARGB(); + WaypointManager.toggleWaypoint(OreRenderLayer.getId(oreVein), id, color, + null, center); + })); return overlay; } @@ -185,8 +202,8 @@ private static NativeImage createOreImage(GeneratedVeinMetadata vein) { } if (material.getMaterialSecondaryARGB() != -1) { int materialSecondaryABGR = GradientUtil.argbToAbgr(material.getMaterialSecondaryARGB()); - ResourceLocation layer2 = MaterialIconType.rawOre.getItemTexturePath(material.getMaterialIconSet(), - "secondary", true); + ResourceLocation layer2 = MaterialIconType.rawOre + .getItemTexturePath(material.getMaterialIconSet(), "secondary", true); if (layer2 == null) { return result; } @@ -213,12 +230,16 @@ private static NativeImage createOreImage(GeneratedVeinMetadata vein) { return result; } - private PolygonOverlay createMarker(String name, String id, ResourceKey dim, ChunkPos pos, - ProspectorMode.FluidInfo vein) { + private PolygonOverlay createMarker(Component name, String id, ResourceKey dim, ChunkPos pos, + final ProspectorMode.FluidInfo vein) { + final BlockPos center = pos.getMiddleBlockPosition(0); ResourceLocation texture = IClientFluidTypeExtensions.of(vein.fluid()).getStillTexture(); - int color = IClientFluidTypeExtensions.of(vein.fluid()).getTintColor(); + + final int color; Material material = ChemicalHelper.getMaterial(vein.fluid()); - if (!material.isNull()) { + if (material.isNull()) { + color = IClientFluidTypeExtensions.of(vein.fluid()).getTintColor(); + } else { color = material.getMaterialARGB(); } @@ -234,16 +255,25 @@ private PolygonOverlay createMarker(String name, String id, ResourceKey d overlay.setDimension(dim); overlay.setLabel("") - .setTitle(FluidRenderLayer.getTooltip(vein).stream().map(Component::getString).reduce("", (s1, s2) -> { - if (s1.isEmpty()) { - return s2; - } - if (s2.isEmpty()) { - return s1; - } - return String.join("\n", s1, s2); - })) - .setOverlayListener(new MarkerListener(pos, vein, name)); + .setTitle(FluidRenderLayer.getTooltip(name, vein) + .stream() + .map(Component::getString) + .reduce("", (s1, s2) -> { + if (s1.isEmpty()) { + return s2; + } + if (s2.isEmpty()) { + return s1; + } + return String.join("\n", s1, s2); + })) + .setOverlayListener(new MarkerListener(() -> { + WaypointManager.toggleWaypoint(FluidRenderLayer.getId(vein, pos), id, color, null, center); + }, () -> { + vein.left(0); + }, () -> { + WaypointManager.toggleWaypoint("ore_veins", id, color, null, center); + })); return overlay; } @@ -254,25 +284,14 @@ private PolygonOverlay createMarker(String name, String id, ResourceKey d @ParametersAreNonnullByDefault private static class MarkerListener implements IOverlayListener { - private final GeneratedVeinMetadata oreVein; - private final String label; + private final Runnable onClick; + private final Runnable markAsDepleted; + private final Runnable toggleWaypoint; - private final ChunkPos fluidCenterPos; - private final ProspectorMode.FluidInfo fluidInfo; - - private MarkerListener(GeneratedVeinMetadata oreVein, String label) { - this.oreVein = oreVein; - this.label = label; - - this.fluidCenterPos = null; - this.fluidInfo = null; - } - - private MarkerListener(ChunkPos fluidCenterPos, ProspectorMode.FluidInfo fluidInfo, String label) { - this.fluidCenterPos = fluidCenterPos; - this.fluidInfo = fluidInfo; - this.label = label; - this.oreVein = null; + private MarkerListener(Runnable onClick, Runnable markAsDepleted, Runnable toggleWaypoint) { + this.onClick = onClick; + this.markAsDepleted = markAsDepleted; + this.toggleWaypoint = toggleWaypoint; } @Override @@ -291,20 +310,7 @@ public void onMouseOut(UIState mapState, Point2D.Double mousePosition, BlockPos public boolean onMouseClick(UIState uiState, Point2D.Double mousePosition, BlockPos blockPosition, int button, boolean doubleClick) { if (button == 0 && doubleClick) { - if (oreVein != null) { - Material firstMaterial = oreVein.definition().veinGenerator().getAllMaterials().get(0); - int color = firstMaterial.getMaterialARGB(); - - BlockPos center = oreVein.center(); - WaypointManager.toggleWaypoint("ore_veins", label, color, - null, center.getX(), center.getY(), center.getZ()); - } else if (fluidCenterPos != null && fluidInfo != null) { - int color = IClientFluidTypeExtensions.of(fluidInfo.fluid()).getTintColor(); - - BlockPos center = fluidCenterPos.getMiddleBlockPosition(0); - WaypointManager.toggleWaypoint("ore_veins", label, color, - null, center.getX(), center.getY(), center.getZ()); - } + this.onClick.run(); return false; } return true; @@ -313,28 +319,8 @@ public boolean onMouseClick(UIState uiState, Point2D.Double mousePosition, Block @Override public void onOverlayMenuPopup(UIState mapState, Point2D.Double mousePosition, BlockPos blockPosition, ModPopupMenu modPopupMenu) { - modPopupMenu.addMenuItem("button.gtceu.mark_as_depleted.name", (b) -> { - if (oreVein != null) { - oreVein.depleted(!oreVein.depleted()); - } else if (fluidInfo != null) { - fluidInfo.left(0); - } - }); - modPopupMenu.addMenuItem("button.gtceu.toggle_waypoint.name", (b) -> { - if (oreVein != null) { - Material firstMaterial = oreVein.definition().veinGenerator().getAllMaterials().get(0); - int color = firstMaterial.getMaterialARGB(); - BlockPos center = oreVein.center(); - WaypointManager.toggleWaypoint("ore_veins", label, color, - null, center.getX(), center.getY(), center.getZ()); - } else if (fluidCenterPos != null && fluidInfo != null) { - int color = IClientFluidTypeExtensions.of(fluidInfo.fluid()).getTintColor(); - - BlockPos center = fluidCenterPos.getMiddleBlockPosition(0); - WaypointManager.toggleWaypoint("ore_veins", label, color, - null, center.getX(), center.getY(), center.getZ()); - } - }); + modPopupMenu.addMenuItem("button.gtceu.mark_as_depleted.name", b -> this.markAsDepleted.run()); + modPopupMenu.addMenuItem("button.gtceu.toggle_waypoint.name", b -> this.toggleWaypoint.run()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java index 7a2401b86e6..da8b36bc92a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java @@ -10,7 +10,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.ChunkPos; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; public class FluidRenderLayer extends MapRenderLayer { @@ -28,9 +28,17 @@ public static Component getName(ProspectorMode.FluidInfo entry) { return fluidStack.getDisplayName(); } - public static List getTooltip(ProspectorMode.FluidInfo entry) { - FluidStack fluidStack = FluidStack.create(entry.fluid(), entry.left()); - return Collections.singletonList(((MutableComponent) fluidStack.getDisplayName()) - .append(" --- %s (%s%%)".formatted(entry.yield(), entry.left()))); + public static List getTooltip(Component name, ProspectorMode.FluidInfo entry) { + final List tooltip = new ArrayList<>(); + + MutableComponent title = name.copy(); + if (entry.left() <= 0) { + title.append(" (").append(Component.translatable("gtceu.minimap.ore_vein.depleted")).append(")"); + } else { + title.append(" --- %s (%s%%)".formatted(entry.yield(), entry.left())); + } + tooltip.add(title); + + return tooltip; } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java index dea2be0b90e..dee9c4bb75f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/OreRenderLayer.java @@ -32,7 +32,7 @@ public static String getId(GeneratedVeinMetadata vein) { return "ore_veins@[" + center.getX() + "," + center.getY() + "," + center.getZ() + "]"; } - public static MutableComponent getName(GeneratedVeinMetadata vein) { + public static Component getName(GeneratedVeinMetadata vein) { // noinspection ConstantValue IDK, it crashed if (vein == null || vein.definition() == null || ClientProxy.CLIENT_ORE_VEINS.inverse().get(vein.definition()) == null) { @@ -58,9 +58,9 @@ public static MutableComponent getName(GeneratedVeinMetadata vein) { return firstMaterial; } - public static List getTooltip(String name, GeneratedVeinMetadata vein) { + public static List getTooltip(Component name, GeneratedVeinMetadata vein) { final List tooltip = new ArrayList<>(); - var title = Component.literal(name); + MutableComponent title = name.copy(); if (vein.depleted()) { title.append(" (").append(Component.translatable("gtceu.minimap.ore_vein.depleted")).append(")"); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java index 2f078d750fe..42223876626 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java @@ -3,8 +3,9 @@ import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; -import com.gregtechceu.gtceu.integration.map.xaeros.minimap.ore.OreVeinElement; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -23,14 +24,14 @@ public XaerosRenderer() { } @Override - public boolean addMarker(String name, String id, ResourceKey dim, ChunkPos pos, + public boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid) { fluidElements.put(dim, pos, fluid); return true; } @Override - public boolean addMarker(String name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { + public boolean addMarker(Component name, ResourceKey dim, GeneratedVeinMetadata vein, String id) { oreElements.put(dim, id, new OreVeinElement(vein, name)); return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElement.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/common/ore/OreVeinElement.java similarity index 55% rename from src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElement.java rename to src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/common/ore/OreVeinElement.java index 5628b39966d..aa9727df3a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElement.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/common/ore/OreVeinElement.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.integration.map.xaeros.worldmap.ore; +package com.gregtechceu.gtceu.integration.map.xaeros.common.ore; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; @@ -6,40 +6,39 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import lombok.Getter; public class OreVeinElement { @Getter - private GeneratedVeinMetadata vein; + private final GeneratedVeinMetadata vein; @Getter - private final String name; + private final Component name; @Getter private final int cachedNameLength; - public OreVeinElement(GeneratedVeinMetadata vein, String name) { + public OreVeinElement(GeneratedVeinMetadata vein, Component name) { this.vein = vein; this.name = name; - this.cachedNameLength = Minecraft.getInstance().font.width(this.getName()); } public void onMouseSelect() { - Material firstMaterial = vein.definition().veinGenerator().getAllMaterials().get(0); + Material firstMaterial = this.vein.definition().veinGenerator().getAllMaterials().get(0); int color = firstMaterial.getMaterialARGB(); // TODO generalize to all possible layer types - BlockPos center = vein.center(); - WaypointManager.toggleWaypoint("ore_veins", name, color, - null, center.getX(), center.getY(), center.getZ()); + BlockPos center = this.vein.center(); + WaypointManager.toggleWaypoint("ore_veins", this.name.getString(), color, null, center); } public void toggleDepleted() { - vein.depleted(!vein.depleted()); + this.vein.depleted(!this.vein.depleted()); } public Material getFirstMaterial() { - return vein.definition().veinGenerator().getAllMaterials().get(0); + return this.vein.definition().veinGenerator().getAllMaterials().get(0); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElement.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElement.java deleted file mode 100644 index f1d7e28efbd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gregtechceu.gtceu.integration.map.xaeros.minimap.ore; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; - -import net.minecraft.client.Minecraft; - -import lombok.Getter; - -public class OreVeinElement { - - @Getter - private GeneratedVeinMetadata vein; - @Getter - private final String name; - @Getter - private final int cachedNameLength; - - public OreVeinElement(GeneratedVeinMetadata vein, String name) { - this.vein = vein; - this.name = name; - - this.cachedNameLength = Minecraft.getInstance().font.width(this.getName()); - } - - public Material getFirstMaterial() { - return vein.definition().veinGenerator().getAllMaterials().get(0); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java index f7e7a851109..754c92d894b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementReader.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; @@ -62,7 +63,7 @@ public int getLeftSideLength(OreVeinElement element, Minecraft mc) { @Override public String getMenuName(OreVeinElement element) { - return element.getName(); + return element.getName().getString(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java index b147141dd97..50feb11f579 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderProvider.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.map.xaeros.minimap.ore; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceKey; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java index 6539ed5ffad..77490bfccbe 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.util.DrawUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -21,8 +22,6 @@ public class OreVeinElementRenderer extends MinimapElementRenderer { - protected static final ResourceLocation STONE = new ResourceLocation("block/stone"); - private OreVeinElementRenderer(OreVeinElementReader elementReader, OreVeinElementRenderProvider provider, OreVeinElementContext context) { @@ -48,8 +47,8 @@ public boolean renderElement(OreVeinElement element, float[] colors = DrawUtil.floats(materialARGB); RenderSystem.setShaderColor(1, 1, 1, 1); - ResourceLocation oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), - true); + ResourceLocation oreTexture = MaterialIconType.rawOre + .getItemTexturePath(firstMaterial.getMaterialIconSet(), true); if (oreTexture != null) { var oreSprite = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java index e7db60ba262..60b1b02cd54 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementReader.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -78,7 +79,7 @@ public int getLeftSideLength(OreVeinElement element, Minecraft mc) { @Override public String getMenuName(OreVeinElement element) { - return element.getName(); + return element.getName().getString(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java index b83b73418c3..af18774359e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderProvider.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.map.xaeros.worldmap.ore; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceKey; @@ -22,10 +23,8 @@ public void begin(int location, OreVeinElementContext context) { if (WorldMap.INSTANCE.getConfigs().getClientConfigManager().getEffective( WorldMapProfiledConfigOptions.WAYPOINT_BACKGROUNDS)) { ResourceKey currentDim = Minecraft.getInstance().level.dimension(); - this.iterator = XaerosRenderer.oreElements.row(currentDim).values() - .stream() - .map(element -> new OreVeinElement(element.getVein(), element.getName())) - .iterator(); + this.iterator = XaerosRenderer.oreElements.row(currentDim).values().iterator(); + context.worldmapWaypointsScale = WorldMap.INSTANCE.getConfigs().getClientConfigManager() .getEffective(WorldMapProfiledConfigOptions.WAYPOINT_SCALE).floatValue(); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java index 653e9667f00..72d5ffd157b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.util.DrawUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; +import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -87,8 +88,8 @@ public boolean renderElement(int location, OreVeinElement element, float[] colors = DrawUtil.floats(materialARGB); RenderSystem.setShaderColor(1, 1, 1, 1); - ResourceLocation oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), - true); + ResourceLocation oreTexture = MaterialIconType.rawOre + .getItemTexturePath(firstMaterial.getMaterialIconSet(), true); if (oreTexture != null) { var oreSprite = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) @@ -96,6 +97,7 @@ public boolean renderElement(int location, OreVeinElement element, graphics.blit(-iconSize / 2, -iconSize / 2, 200, iconSize, iconSize, oreSprite, colors[0], colors[1], colors[2], 1); } + oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), "secondary", true); if (oreTexture != null) { int materialSecondaryARGB = firstMaterial.getMaterialSecondaryARGB(); From faa4c738acede58988e8b3aacd3751570ba2dbbb Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 17:55:01 +0300 Subject: [PATCH 05/15] Copy some very useful stuff from another branch --- .../resources/assets/gtceu/lang/en_ud.json | 63 +++----- .../resources/assets/gtceu/lang/en_us.json | 150 +++++++----------- .../gtceu/core/mixins/BlockStateAccessor.java | 14 ++ .../gtceu/data/lang/IntegrationLang.java | 3 - .../gtceu/data/lang/LangHandler.java | 5 - .../map/ftbchunks/FTBChunksRenderer.java | 2 +- .../ftbchunks/veins/fluid/FluidVeinIcon.java | 24 +-- .../worldmap/fluid/FluidChunkHighlighter.java | 21 +-- src/main/resources/gtceu.mixins.json | 1 + 9 files changed, 120 insertions(+), 163 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/BlockStateAccessor.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 53efcdcd9bf..7858d203325 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -14,6 +14,7 @@ "behavior.portable_scanner.debug_lag_count": "˙ɹǝʌɹǝS ǝɥʇ uo )sɯ%s uɐɥʇ ɹǝbuoן buıʞɐʇ buıɥʇʎuɐ( sbuıuɹɐM ǝʞıdS bɐꞀ %s pǝsnɐƆ", "behavior.portable_scanner.debug_machine": "%s :ᗡI-ɐʇǝW", "behavior.portable_scanner.debug_machine_invalid": "¡pıןɐʌuı ", + "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": "¡ןןnu ", "behavior.portable_scanner.debug_machine_valid": "pıןɐʌ ", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :NI xɐW", @@ -55,7 +56,13 @@ "behavior.portable_scanner.workable_progress": "s %s / s %s :ssǝɹboɹԀ", "behavior.portable_scanner.workable_stored_energy": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ pǝɹoʇS", "behavior.prospector.added_waypoint": "¡%s pǝɯɐu ʇuıodʎɐʍ pǝʇɐǝɹƆ", + "behavior.prospector.display_all": "sǝɔɹnosǝɹ ןןⱯ", + "behavior.prospector.mode.bedrock_ore": "ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", + "behavior.prospector.mode.fluid": "ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", + "behavior.prospector.mode.ores": "ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", "behavior.prospector.not_enough_energy": "¡ʎbɹǝuƎ ɥbnouƎ ʇoN", + "behavior.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", + "behavior.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı sǝɔɹnosǝɹ suɐɔS", "behavior.toggle_energy_consumer.tooltip": "ǝpoɯ ǝןbboʇ oʇ ǝs∩", "behaviour.boor.by": "%s ʎq", "behaviour.hammer": ")ɯǝɥʇ buıʇʇıɥ ʎq( sǝuıɥɔɐW ɹoɟ buıןɟɟnW ɟɟo puɐ uo suɹn⟘", @@ -1757,6 +1764,7 @@ "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", + "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "ǝpıSʇndʇnOɯoɹℲspınןℲʇnduIsɯnɹᗡʍoןןɐ", "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", @@ -2143,9 +2151,9 @@ "cover.voiding.voiding_mode.void_any": "buıɥɔʇɐW pıoΛ", "cover.voiding.voiding_mode.void_overflow": "ʍoןɟɹǝʌO pıoΛ", "curios.identifier.gtceu_magnet": "ʇǝubɐW nƎƆ⟘⅁", - "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ sɐʍ %s", + "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ uǝǝq sɐɥ %s", "death.attack.gtceu.butchery_knife": "%s ʎq pǝɹǝɥɔʇnq sɐʍ %s", - "death.attack.gtceu.buzzsaw": "%s ʎq pǝzznq sɐʍ %s", + "death.attack.gtceu.buzzsaw": "%s ʎq pǝzznq ʇob %s", "death.attack.gtceu.chainsaw_lv": "%s ʎq pǝɹɔɐssɐɯ sɐʍ %s", "death.attack.gtceu.chemical": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", "death.attack.gtceu.crowbar": "%s oʇ ǝɟıן ɐ ɟןɐɥ ʇsoן %s", @@ -2155,6 +2163,8 @@ "death.attack.gtceu.drill_lv": "%s ʎq ΛᄅƐ ɥʇıʍ pǝןןıɹp sɐʍ %s", "death.attack.gtceu.drill_mv": "%s ʎq Λ8ᄅƖ ɥʇıʍ pǝןןıɹp sɐʍ %s", "death.attack.gtceu.electric": "pǝʇnɔoɹʇɔǝןǝ sɐʍ %s", + "death.attack.gtceu.explosion": "pǝpoןdxǝ %s", + "death.attack.gtceu.explosion.player": "%s ɟo dןǝɥ ɥʇıʍ pǝpoןdxǝ %s", "death.attack.gtceu.file": "%s ʎq ,pɐǝᗡ, ɹoɟ ᗡ pǝןıɟ uǝǝq sɐɥ %s", "death.attack.gtceu.frost": "sɔıuǝboʎɹɔ pǝɹoןdxǝ %s", "death.attack.gtceu.hammer": "%s ʎq pǝɥsɐnbs sɐʍ %s", @@ -2162,7 +2172,7 @@ "death.attack.gtceu.heat.player": "%s ʎq ǝʌıןɐ pǝןıoq sɐʍ %s", "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", - "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ sɐʍ %s", + "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ ʇob %s", "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", @@ -2178,18 +2188,18 @@ "death.attack.gtceu.medical_condition/weak_poison": "pɐǝן ǝʇɐ %s", "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", - "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ sɐʍ %s", + "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ ʇob %s", "death.attack.gtceu.radiation": "ʍou ʎoظ ɥʇıʍ sʍoןb %s", "death.attack.gtceu.screwdriver": "¡ǝɯıʇ ʇsɐן ǝɥʇ ɹoɟ %s ɥʇıʍ pǝʍǝɹɔs sɐɥ %s", "death.attack.gtceu.screwdriver_lv": "%s ʎq pǝʌoɯǝɹ sʍǝɹɔs ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.scythe": "%s ʎq uǝʞɐʇ ןnos ɹıǝɥʇ pɐɥ %s", - "death.attack.gtceu.shovel": "%s ʎq dn bnp sɐʍ %s", - "death.attack.gtceu.spade": "%s ʎq pǝʇɐʌɐɔxǝ sɐʍ %s", + "death.attack.gtceu.shovel": "%s ʎq dn bnp ʇob %s", + "death.attack.gtceu.spade": "%s ʎq pǝʇɐʌɐɔxǝ ʇob %s", "death.attack.gtceu.turbine": "ǝuıqɹnʇ ɐ oʇuı pɐǝɥ ɹıǝɥʇ ʇnd %s", "death.attack.gtceu.wire_cutter": "%s ɟo ǝuıɥɔɐW ʇɹoddnS ǝɟıꞀ ǝɥʇ ɹoɟ ǝןqɐɔ ǝɥʇ ʇnɔ sɐɥ %s", "death.attack.gtceu.wrench": "¡ɥɔuǝɹM ǝɥʇ ɥʇıʍ ʞɔɐɥʍ ɐ %s ǝʌɐb %s", "death.attack.gtceu.wrench_hv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", - "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹʍ ɐ pɐɥ %s", + "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹM ʎǝʞuoW ɐ pɐɥ %s", "death.attack.gtceu.wrench_lv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", "enchantment.damage.disjunction": "uoıʇɔunظsıᗡ", @@ -2226,7 +2236,7 @@ "gtceu.bus.collapse_true": "sɯǝʇI ǝsdɐןןoɔ ןןıʍ snᗺ", "gtceu.button.bedrock_fluids": "suıǝΛ pınןℲ ʞɔoɹpǝᗺ ʍoɥS", "gtceu.button.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", - "gtceu.button.ore_veins": "suıǝΛ ǝɹO ⟘⅁ ʍoɥS", + "gtceu.button.ore_veins": "suıǝΛ ǝɹO ʍoɥS", "gtceu.button.show_depleted": "suıǝΛ pǝʇǝןdǝᗡ ʍoɥS", "gtceu.cable.amperage": "%dǝ§ ɹ§:ǝbɐɹǝdɯⱯ xɐWǝ§", "gtceu.cable.loss_per_block": "ʇןoΛ-∩Ǝ ㄥ§%dɔ§ ɹ§:ǝɹǝdɯⱯ/ɹǝʇǝW/ssoꞀɔ§", @@ -2616,10 +2626,6 @@ "gtceu.jei.ore_vein_diagram.spawn_range": ":ǝbuɐᴚ uʍɐdS", "gtceu.jei.ore_vein_diagram.weight": "%s :ʇɥbıǝM", "gtceu.jei.programmed_circuit": "ǝbɐԀ ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", - "gtceu.journeymap.options.layers": "sɹǝʎɐן uoıʇɔǝdsoɹԀ", - "gtceu.journeymap.options.layers.bedrock_fluids": "suıǝΛ pınןℲ ʞɔoɹpǝᗺ ʍoɥS", - "gtceu.journeymap.options.layers.hide_depleted": "suıǝΛ pǝʇǝןdǝᗡ ǝpıH", - "gtceu.journeymap.options.layers.ore_veins": "suıǝΛ ǝɹO ʍoɥS", "gtceu.key.armor_charging": "ǝןbbo⟘ ʎɹoʇuǝʌuI oʇ buıbɹɐɥƆ ɹoɯɹⱯ", "gtceu.key.armor_hover": "ǝןbbo⟘ ɹǝʌoH ɹoɯɹⱯ", "gtceu.key.armor_mode_switch": "ɥɔʇıʍS ǝpoW ɹoɯɹⱯ", @@ -3258,7 +3264,7 @@ "gtceu.maintenance.configurable_time": "xɟ% :ǝɯı⟘", "gtceu.maintenance.configurable_time.changed_description": "˙ǝʇɐɹ ןɐɯɹou ǝɥʇ xɟ% ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", "gtceu.maintenance.configurable_time.unchanged_description": "˙ǝʇɐpdn oʇ uoıʇɐɹnbıɟuoɔ ǝbuɐɥƆ ˙ǝʇɐɹ ןɐɯɹou ʇɐ ɹnɔɔo ןןıʍ sɯǝןqoɹd ǝɔuɐuǝʇuıɐW", - "gtceu.minimap.ore_vein.depleted": "pǝʇǝןdǝᗡ", + "gtceu.minimap.ore_vein.depleted": "uıǝΛ pǝʇǝןdǝᗡ", "gtceu.mixer": "ɹǝxıW", "gtceu.mode.both": "ɹ§)ɯǝʇI puⱯ pınןℲ( ɥʇoᗺp§", "gtceu.mode.fluid": "ɹ§pınןℲ6§", @@ -3595,14 +3601,13 @@ "gtceu.placeholder_info.count.2": "ʇsɹıɟ ǝɥʇ oʇ ןɐnbǝ ǝɹɐ ʇɐɥʇ sʇuǝɯnbɹɐ ɟo ʇunoɯɐ ǝɥʇ >- }˙˙˙ ]ㄣbɹɐ[ ]Ɛbɹɐ[ ]ᄅbɹɐ[ >Ɩbɹɐ< ʇunoɔ{ ", "gtceu.placeholder_info.data.0": "˙sʇoןs ǝɥʇ ɟo ǝuo uı )ǝןnpoɯ/qɹo/ʞɔıʇs ɐʇɐp( ɯǝʇı ɐʇɐp ɐ ɯoɹɟ ɐʇɐp ǝɯos sǝʌǝıɹʇǝɹ ɹo sǝɹoʇS", "gtceu.placeholder_info.data.1": "˙)ʇqu ɯǝʇı ɐʇɐp ǝɥʇ uı pǝɹoʇs sı ʇɐɥʇ )Ɩ - ʎʇıɔɐdɐɔ( oʇ 0 ɯoɹɟ ɹǝbǝʇuı uɐ sı d( d ǝnןɐʌ ǝɥʇ ɥʇıʍ pǝɔɐןdǝɹ ǝq ןןıʍ ʇı 'ʎʇdɯǝ ʇuǝɯnbɹɐ >xǝpuı< ǝɥʇ ǝʌɐǝן noʎ ɟI", - "gtceu.placeholder_info.data.2": "˙ɥɔʇɐɥ ɐʇɐp ɐ ǝpısuı ǝןnpoɯ ʇxǝʇ sıɥʇ ʎq pǝʇǝbɹɐʇ ʎןʇuǝɹɹnɔ sı ʇɐɥʇ ʞɔıʇs ɐʇɐp ǝɥʇ ǝʇɐןndıuɐɯ ןןıʍ ɹǝpןoɥǝɔɐןd sıɥʇ '0 oʇ ןɐnbǝ sı ʇuǝɯnbɹɐ ʇoןs ǝɥʇ ɟI", - "gtceu.placeholder_info.data.3": ":ǝbɐs∩", - "gtceu.placeholder_info.data.4": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ >- }>xǝpuı< >ʇoןs< ʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.5": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ sʇǝs >- }>ǝnןɐʌ< >xǝpuı< >ʇoןs< ʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.6": "d >- }>ʇoןs< dʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.7": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'd sʇǝs >- }>ǝnןɐʌ< >ʇoןs< dʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.8": "0 oʇ d sʇǝs 'ʎʇıɔɐdɐɔ oʇ ןɐnbǝ ɹo uɐɥʇ ǝɹoɯ sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔuı >- }>ʇoןs< ɔuı ɐʇɐp{ ", - "gtceu.placeholder_info.data.9": ")Ɩ - ʎʇıɔɐdɐɔ( oʇ d sʇǝs '0 uɐɥʇ ssǝן sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔǝp >- }>ʇoןs< ɔǝp ɐʇɐp{ ", + "gtceu.placeholder_info.data.2": ":ǝbɐs∩", + "gtceu.placeholder_info.data.3": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ >- }>xǝpuı< >ʇoןs< ʇǝb ɐʇɐp{ ", + "gtceu.placeholder_info.data.4": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ sʇǝs >- }>ǝnןɐʌ< >xǝpuı< >ʇoןs< ʇǝs ɐʇɐp{ ", + "gtceu.placeholder_info.data.5": "d >- }>ʇoןs< dʇǝb ɐʇɐp{ ", + "gtceu.placeholder_info.data.6": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'd sʇǝs >- }>ǝnןɐʌ< >ʇoןs< dʇǝs ɐʇɐp{ ", + "gtceu.placeholder_info.data.7": "0 oʇ d sʇǝs 'ʎʇıɔɐdɐɔ oʇ ןɐnbǝ ɹo uɐɥʇ ǝɹoɯ sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔuı >- }>ʇoןs< ɔuı ɐʇɐp{ ", + "gtceu.placeholder_info.data.8": ")Ɩ - ʎʇıɔɐdɐɔ( oʇ d sʇǝs '0 uɐɥʇ ssǝן sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔǝp >- }>ʇoןs< ɔǝp ɐʇɐp{ ", "gtceu.placeholder_info.displayTarget.0": "˙ʞuıן ʎɐןdsıp ɐ buısn ɹǝʌoɔ sıɥʇ oʇ pǝʇʇıɯsuɐɹʇ sɐʍ ʇɐɥʇ ǝuıן pǝıɟıɔǝds ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.displayTarget.1": ":ǝbɐs∩", "gtceu.placeholder_info.displayTarget.2": ")00Ɩ-Ɩ sı ɹǝqɯnu ǝuıן( ǝuıן pǝıɟıɔǝds ǝɥʇ uo ʇxǝʇ ǝɥʇ >- }>ɹǝqɯnu‾ǝuıן< ʇǝbɹɐ⟘ʎɐןdsıp{ ", @@ -3699,20 +3704,12 @@ "gtceu.placeholder_info.setImage.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝbɐɯı uɐ uı Ꞁᴚ∩ ǝbɐɯı ǝɥʇ sʇǝS", "gtceu.placeholder_info.setImage.1": ":ǝbɐs∩", "gtceu.placeholder_info.setImage.2": "buıɹʇs ʎʇdɯǝ >- }>ןɹn< >ʇoןs< ǝbɐɯIʇǝs{ ", - "gtceu.placeholder_info.setTargetSlot.0": "˙ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ sʇǝS", - "gtceu.placeholder_info.setTargetSlot.1": "˙sǝʇnɔǝxǝ ɹǝpןoɥǝɔɐןd sıɥʇ ɹǝʇɟɐ ʎןǝʇɐıpǝɯɯı ʇɔǝɟɟǝ ǝʞɐʇ ןןıʍ ǝbuɐɥɔ ǝɥ⟘", - "gtceu.placeholder_info.setTargetSlot.2": ")ʇǝbɹɐʇ ʍǝu ǝɥʇ ǝɔuǝɹǝɟǝɹ ןןıʍ sɹǝpןoɥǝɔɐןd ɹǝɥʇɹnℲ(", - "gtceu.placeholder_info.setTargetSlot.3": ":ǝbɐs∩", - "gtceu.placeholder_info.setTargetSlot.4": "buıɹʇs ʎʇdɯǝ >- }>ʇoןs< ʇoןSʇǝbɹɐ⟘ʇǝs{ ", "gtceu.placeholder_info.strike.0": "ʇno pǝssoɹɔ sɐʍ ʇı ɟı sɐ ʇı buıʎɐןdsıp 'ʇxǝʇ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.strike.1": ":ǝbɐs∩", "gtceu.placeholder_info.strike.2": "ʇxǝʇ ʇno-pǝssoɹɔ >- }>ʇxǝʇ< ǝʞıɹʇs{ ", "gtceu.placeholder_info.subList.0": ")0 ɯoɹɟ buıʇɹɐʇs( )ǝʌısnןɔxǝ( ɹ oʇ )ǝʌısnןɔuı( ן ɯoɹɟ sǝxǝpuı ɥʇıʍ ɯoɹɟ sʇuǝɯnbɹɐ suɹnʇǝᴚ", "gtceu.placeholder_info.subList.1": ":ǝbɐs∩", "gtceu.placeholder_info.subList.2": "sǝɔɐds ʎq pǝʇɐɹɐdǝs ɹ oʇ ן ɯoɹɟ sǝxǝpuı ɥʇıʍ sʇuǝɯnbɹɐ ןןɐ >- }˙˙˙ ]Ɩbɹɐ[ ]0bɹɐ[ >ʇɥbıɹ< >ʇɟǝן< ʇsıꞀqns{ ", - "gtceu.placeholder_info.targetSlot.0": "ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ suɹnʇǝᴚ", - "gtceu.placeholder_info.targetSlot.1": ":ǝbɐs∩", - "gtceu.placeholder_info.targetSlot.2": ")9Ɩ/6/ㄣ oʇ Ɩ ɯoɹɟ( >ʇoןs< >- }ʇoןSʇǝbɹɐʇ{ ", "gtceu.placeholder_info.tick.0": "˙pǝɔɐןd sɐʍ ɹǝʌoɔ sıɥʇ uǝɥʍ ɯoɹɟ pǝssɐd sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.tick.1": ":ǝbɐs∩", "gtceu.placeholder_info.tick.2": "sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ >- }ʞɔıʇ{ ", @@ -3735,7 +3732,6 @@ "gtceu.plasma_generator": "ɹoʇɐɹǝuǝ⅁ ɐɯsɐןԀ", "gtceu.polarizer": "ɹǝzıɹɐןoԀ", "gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", - "gtceu.provider.computer_monitor_cover.error.no_target": "dnoɹb ɹoʇıuoɯ ǝɥʇ ɹoɟ pǝʇɔǝןǝs ʇǝbɹɐʇ oN", "gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", "gtceu.recipe.byproduct_tier": "+ɹ§%s ɯoɹɟ sʇɔnpoɹdʎᗺ", "gtceu.recipe.category.arc_furnace_recycling": "buıddɐɹɔS ɔɹⱯ", @@ -5738,8 +5734,6 @@ "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "metaarmor.message.step_assist.disabled": "ɟɟOɔ§ :ʇsıssⱯ-dǝʇSq§", - "metaarmor.message.step_assist.enabled": "uOɐ§ :ʇsıssⱯ-dǝʇSq§", "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", @@ -5800,11 +5794,6 @@ "metaitem.machine_configuration.mode": "%s ɹ§:ǝpoW uoıʇɐɹnbıɟuoƆɐ§", "metaitem.plugin.proxy.tooltips.1": ")uǝǝɹɔs ǝɥʇ uı ǝpoɯ ʎxoɹd oʇ ʇsnظpɐ ǝsɐǝןԀ(", "metaitem.plugin.tooltips.1": "˙ʎʇıןɐuoıʇɔunɟ ǝɹoɯ ɹoɟ uǝǝɹɔs ǝɥʇ oʇ pǝppɐ ǝq uɐɔ suıbnןԀ", - "metaitem.prospector.mode.bedrock_ore": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹO ʞɔoɹpǝᗺq§", - "metaitem.prospector.mode.fluid": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ pınןℲq§", - "metaitem.prospector.mode.ores": "ɹ§ǝpoW uoıʇɔǝdsoɹԀ ǝɹOɐ§", - "metaitem.prospector.tooltip.modes": ":sǝpoW ǝןqɐןıɐʌⱯ", - "metaitem.prospector.tooltip.radius": "snıpɐᴚ ʞunɥƆ %s ɐ uı ǝbuɐɹ suɐɔS", "metaitem.record.sus.tooltip": "dıɹᗡ s∩ buoɯⱯ - zuoǝꞀㄥ§", "metaitem.terminal.tooltip": "ʞɹoʍ poob ǝʞɐɯ sןooʇ dɹɐɥS", "metaitem.terminal.tooltip.creative": "ǝpoW ǝʌıʇɐǝɹƆq§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index e45f64dfb7f..3acb3a2c285 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -14,6 +14,7 @@ "behavior.portable_scanner.debug_lag_count": "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server.", "behavior.portable_scanner.debug_machine": "Meta-ID: %s", "behavior.portable_scanner.debug_machine_invalid": " invalid!", + "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " null!", "behavior.portable_scanner.debug_machine_valid": " valid", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Max IN: %s (%s) EU at %s A", @@ -55,7 +56,13 @@ "behavior.portable_scanner.workable_progress": "Progress: %s s / %s s", "behavior.portable_scanner.workable_stored_energy": "Stored Energy: %s EU / %s EU", "behavior.prospector.added_waypoint": "Created waypoint named %s!", + "behavior.prospector.display_all": "All resources", + "behavior.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode", + "behavior.prospector.mode.fluid": "§bFluid Prospection Mode", + "behavior.prospector.mode.ores": "§aOre Prospection Mode", "behavior.prospector.not_enough_energy": "Not Enough Energy!", + "behavior.prospector.tooltip.modes": "Available Modes:", + "behavior.prospector.tooltip.radius": "Scans resources in a %s Chunk Radius", "behavior.toggle_energy_consumer.tooltip": "Use to toggle mode", "behaviour.boor.by": "by %s", "behaviour.hammer": "Turns on and off Muffling for Machines (by hitting them)", @@ -1757,6 +1764,7 @@ "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", + "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", "config.gtceu.option.allowedImageDomains": "allowedImageDomains", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", @@ -2029,18 +2037,20 @@ "cover.conveyor.transfer_rate": "§7items/sec", "cover.detector_base.message_inverted_state": "Monitoring Status: Inverted", "cover.detector_base.message_normal_state": "Monitoring Status: Normal", + "cover.ender_fluid_link.incomplete_hex.0": "Inputted color is incomplete!", + "cover.ender_fluid_link.incomplete_hex.1": "It will be applied once complete (all 8 hex digits)", + "cover.ender_fluid_link.incomplete_hex.2": "Closing the gui will lose edits!", "cover.ender_fluid_link.iomode.disabled": "I/O Disabled", "cover.ender_fluid_link.iomode.enabled": "I/O Enabled", + "cover.ender_fluid_link.private.tooltip.disabled.0": "Switch to private tank mode", + "cover.ender_fluid_link.private.tooltip.disabled.1": "Private mode uses the player who originally placed the cover", + "cover.ender_fluid_link.private.tooltip.enabled": "Switch to public tank mode", "cover.ender_fluid_link.title": "Ender Fluid Link", + "cover.ender_fluid_link.tooltip.channel_description": "Set channel description with input text", + "cover.ender_fluid_link.tooltip.channel_name": "Set channel name with input text", + "cover.ender_fluid_link.tooltip.clear_button": "Clear channel description", + "cover.ender_fluid_link.tooltip.list_button": "Show channel list", "cover.ender_item_link.title": "Ender Item Link", - "cover.ender_link.description_empty": "Empty Description", - "cover.ender_link.private.tooltip": "Private mode: Only accessible to the player who placed this cover", - "cover.ender_link.protected.tooltip": "Protected Mode: Accessible to players on the same team.", - "cover.ender_link.public.tooltip": "Public mode: Accessible to all players", - "cover.ender_link.tooltip.channel_description": "Channel description", - "cover.ender_link.tooltip.channel_name": "Channel ID (32-bit hexadecimal value)", - "cover.ender_link.tooltip.clear_button": "Clear channel description", - "cover.ender_link.tooltip.list_button": "Show channel list", "cover.ender_redstone_link.title": "Ender Redstone Link", "cover.filter.blacklist.disabled": "Whitelist", "cover.filter.blacklist.enabled": "Blacklist", @@ -2078,7 +2088,6 @@ "cover.item_smart_filter.filtering_mode.electrolyzer": "Electrolyzer", "cover.item_smart_filter.filtering_mode.sifter": "Sifter", "cover.item_smart_filter.title": "Smart Item Filter", - "cover.machine_controller.control": "Controller Target", "cover.machine_controller.invert.disabled.0": "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run", "cover.machine_controller.invert.enabled.0": "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run", "cover.machine_controller.inverted": "Inverted", @@ -2142,9 +2151,9 @@ "cover.voiding.voiding_mode.void_any": "Void Matching", "cover.voiding.voiding_mode.void_overflow": "Void Overflow", "curios.identifier.gtceu_magnet": "GTCEu Magnet", - "death.attack.gtceu.axe": "%s was chopped by %s", + "death.attack.gtceu.axe": "%s has been chopped by %s", "death.attack.gtceu.butchery_knife": "%s was butchered by %s", - "death.attack.gtceu.buzzsaw": "%s was buzzed by %s", + "death.attack.gtceu.buzzsaw": "%s got buzzed by %s", "death.attack.gtceu.chainsaw_lv": "%s was massacred by %s", "death.attack.gtceu.chemical": "%s had a chemical accident", "death.attack.gtceu.crowbar": "%s lost half a life to %s", @@ -2154,6 +2163,8 @@ "death.attack.gtceu.drill_lv": "%s was drilled with 32V by %s", "death.attack.gtceu.drill_mv": "%s was drilled with 128V by %s", "death.attack.gtceu.electric": "%s was electrocuted", + "death.attack.gtceu.explosion": "%s exploded", + "death.attack.gtceu.explosion.player": "%s exploded with help of %s", "death.attack.gtceu.file": "%s has been filed D for 'Dead' by %s", "death.attack.gtceu.frost": "%s explored cryogenics", "death.attack.gtceu.hammer": "%s was squashed by %s", @@ -2161,7 +2172,7 @@ "death.attack.gtceu.heat.player": "%s was boiled alive by %s", "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", - "death.attack.gtceu.mallet": "%s was hammered to death by %s", + "death.attack.gtceu.mallet": "%s got hammered to death by %s", "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", @@ -2177,18 +2188,18 @@ "death.attack.gtceu.medical_condition/weak_poison": "%s ate lead", "death.attack.gtceu.mining_hammer": "%s was mistaken for Ore by %s", "death.attack.gtceu.mortar": "%s was ground to dust by %s", - "death.attack.gtceu.pickaxe": "%s was mined by %s", + "death.attack.gtceu.pickaxe": "%s got mined by %s", "death.attack.gtceu.radiation": "%s glows with joy now", "death.attack.gtceu.screwdriver": "%s has screwed with %s for the last time!", "death.attack.gtceu.screwdriver_lv": "%s had their screws removed by %s", "death.attack.gtceu.scythe": "%s had their soul taken by %s", - "death.attack.gtceu.shovel": "%s was dug up by %s", - "death.attack.gtceu.spade": "%s was excavated by %s", + "death.attack.gtceu.shovel": "%s got dug up by %s", + "death.attack.gtceu.spade": "%s got excavated by %s", "death.attack.gtceu.turbine": "%s put their head into a turbine", "death.attack.gtceu.wire_cutter": "%s has cut the cable for the Life Support Machine of %s", "death.attack.gtceu.wrench": "%s gave %s a whack with the Wrench!", "death.attack.gtceu.wrench_hv": "%s's pipes were loosened by %s", - "death.attack.gtceu.wrench_iv": "%s had a wrench thrown into their plans by %s", + "death.attack.gtceu.wrench_iv": "%s had a Monkey Wrench thrown into their plans by %s", "death.attack.gtceu.wrench_lv": "%s's pipes were loosened by %s", "effect.gtceu.weak_poison": "Weak Poison", "enchantment.damage.disjunction": "Disjunction", @@ -2225,7 +2236,7 @@ "gtceu.bus.collapse_true": "Bus will collapse Items", "gtceu.button.bedrock_fluids": "Show Bedrock Fluid Veins", "gtceu.button.hide_depleted": "Hide Depleted Veins", - "gtceu.button.ore_veins": "Show GT Ore Veins", + "gtceu.button.ore_veins": "Show Ore Veins", "gtceu.button.show_depleted": "Show Depleted Veins", "gtceu.cable.amperage": "§eMax Amperage:§r §e%d", "gtceu.cable.loss_per_block": "§cLoss/Meter/Ampere:§r §c%d§7 EU-Volt", @@ -2234,10 +2245,6 @@ "gtceu.canner": "Canner", "gtceu.central_monitor.gui.create_group": "Create group", "gtceu.central_monitor.gui.currently_editing": "Currently editing: %s", - "gtceu.central_monitor.gui.data_slot": "Set slot number of data stick", - "gtceu.central_monitor.gui.group_editor": "Editing monitor group", - "gtceu.central_monitor.gui.group_name": "Name:", - "gtceu.central_monitor.gui.monitor_groups": "Monitor groups", "gtceu.central_monitor.gui.remove_from_group": "Remove from group", "gtceu.central_monitor.gui.set_target": "Set target", "gtceu.central_monitor.info_tooltip.0": "In order to use monitors, you have to split them into groups first. A group may only have 1 module in it.", @@ -2294,8 +2301,7 @@ "gtceu.creative.chest.ipc": "Items per Cycle", "gtceu.creative.chest.item": "Item", "gtceu.creative.chest.tpc": "Ticks per Cycle", - "gtceu.creative.computation.average": "Average CWU/tick: %d", - "gtceu.creative.computation.max_usage": "Max CWU/tick:", + "gtceu.creative.computation.average": "Average Requested CWUt", "gtceu.creative.energy.amperage": "Amperage", "gtceu.creative.energy.sink": "Sink", "gtceu.creative.energy.source": "Source", @@ -2375,24 +2381,10 @@ "gtceu.gui.adv_stocking_config.title": "Configure Automatic Stocking", "gtceu.gui.all_voiding": "§7Voiding §cAll", "gtceu.gui.auto_output.name": "auto", - "gtceu.gui.central_monitor.data_hatch_target": "If you select a data hatch as a target, you will be prompted to enter a slot number. Then the block that the data stick in the specified slot is linked to (via right-clicking a wireless transmitter cover) will be considered the target instead.", "gtceu.gui.central_monitor.group": "Group: %s", "gtceu.gui.central_monitor.group_default_name": "Group #%d", - "gtceu.gui.central_monitor.gui_module_info": "To select a block to get the GUI from, select a target in the monitor group editor.", - "gtceu.gui.central_monitor.help": "A monitor group is a collection of any amount of monitors in the multiblock.\nFor a group to display anything, it needs 2 things:\n - you to select the monitors that you want to display something on\n - an inserted and configured monitor module\nA module must be inserted in the slot to the right of the group name textbox.\nWhen you insert it, a button will appear to configure the module (for example just enter the text to display)\nThen you have to select at least 1 monitor in the grid below the group name textbox, here are types of selections:", - "gtceu.gui.central_monitor.in_group": "Monitors selected this way are added to the group, and will be used to display stuff", - "gtceu.gui.central_monitor.in_group_and_target": "The monitor selected this way is used for displaying and as a target at the same time.", - "gtceu.gui.central_monitor.left_click": "Select/unselect a monitor by left-clicking it", - "gtceu.gui.central_monitor.module_editor_button": "Edit module", - "gtceu.gui.central_monitor.module_editor_disabled": "You recently changed the module, please re-open this GUI to edit it", - "gtceu.gui.central_monitor.pause": "Pause placeholder execution.\nText won't be updated, and code won't be run.", - "gtceu.gui.central_monitor.resume": "Unpause placeholder execution.", - "gtceu.gui.central_monitor.right_click": "Select a block by right-clicking it. Only 1 block can be a target.", - "gtceu.gui.central_monitor.target": "The block selected this way is considered a target, to be used with placeholders in a text module.", - "gtceu.gui.central_monitor.text_module_help": "This module displays text that can have placeholders.\nPlaceholders are strings like \"{energy}\" that when displayed, will display their value instead (in this case the amount of energy).\nThey can also do some other things, such as set a redstone output/read redstone input, run calculations, etc.\nSome placeholders, like {energy} must have a target to function. A target is basically any block that can accept covers or is part of the\ncentral monitor multiblock. For example {energy} displays the amount of energy in its target block, usually a battery buffer or a PSS.\nSelect a target in the monitor group editing window, check out the help page there for more info.\nHere's an example usage of placeholders, that displays some energy info and sends a redstone signal when energy is <50%:\n", + "gtceu.gui.central_monitor.none": "none", "gtceu.gui.central_monitor.text_scale": "Text scale", - "gtceu.gui.central_monitor.update_once": "Update text and run all placeholders in it exactly once.", - "gtceu.gui.central_monitor.url": "Input image URL:", "gtceu.gui.charger_slot.tooltip.0": "§fCharger Slot§r", "gtceu.gui.charger_slot.tooltip.1": "§7Draws power from %s batteries§r", "gtceu.gui.charger_slot.tooltip.2": "§7Charges %s tools and batteries", @@ -2410,7 +2402,8 @@ "gtceu.gui.computer_monitor_cover.placeholder_reference.1": "(hover for more info)", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "Input placeholder to be used in place of %s '{}' here.", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "For example, you can have a string 'Energy: {}/{} EU' and 'energy' and 'energyCapacity' in these text boxes.", - "gtceu.gui.computer_monitor_cover.slot_tooltip": "A slot for items that some placeholders can reference\nSlot number: %d\n", + "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "A slot for items that some placeholders can reference", + "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "Slot number: %d", "gtceu.gui.computer_monitor_cover.update_interval": "Update interval (in ticks)", "gtceu.gui.config_slot": "§fConfig Slot§r", "gtceu.gui.config_slot.auto_pull_managed": "§4Disabled:§7 Managed by Auto-Pull", @@ -2452,6 +2445,8 @@ "gtceu.gui.fluid_amount": "Fluid Amount:", "gtceu.gui.fluid_auto_input.tooltip.disabled": "Fluid Auto-Input Disabled", "gtceu.gui.fluid_auto_input.tooltip.enabled": "Fluid Auto-Input Enabled", + "gtceu.gui.fluid_auto_output.allow_input.disabled": "disable fluids input from the output side", + "gtceu.gui.fluid_auto_output.allow_input.enabled": "allow fluids input from the output side", "gtceu.gui.fluid_auto_output.disabled": "Fluid Auto Output: §cDisabled", "gtceu.gui.fluid_auto_output.enabled": "Fluid Auto Output: §aEnabled", "gtceu.gui.fluid_auto_output.other_direction.0": "Fluid Auto Output: §6Other Direction", @@ -2461,8 +2456,6 @@ "gtceu.gui.fluid_auto_output.tooltip.enabled": "Fluid Auto-Output Enabled", "gtceu.gui.fluid_auto_output.unselected.0": "Fluid Auto Output", "gtceu.gui.fluid_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", - "gtceu.gui.fluid_input_from_output.disabled": "Allow Fluid Input from Output Side: §cDisabled", - "gtceu.gui.fluid_input_from_output.enabled": "Allow Fluid Input from Output Side: §aEnabled", "gtceu.gui.fluid_lock.tooltip.disabled": "Fluid Locking Disabled", "gtceu.gui.fluid_lock.tooltip.enabled": "Fluid Locking Enabled", "gtceu.gui.fluid_voiding": "§7Voiding §9Fluids", @@ -2471,6 +2464,8 @@ "gtceu.gui.fuel_amount": "Fuel Amount:", "gtceu.gui.item_auto_input.tooltip.disabled": "Item Auto-Input Disabled", "gtceu.gui.item_auto_input.tooltip.enabled": "Item Auto-Input Enabled", + "gtceu.gui.item_auto_output.allow_input.disabled": "disable items input from the output side", + "gtceu.gui.item_auto_output.allow_input.enabled": "allow items input from the output side", "gtceu.gui.item_auto_output.disabled": "Item Auto Output: §cDisabled", "gtceu.gui.item_auto_output.enabled": "Item Auto Output: §aEnabled", "gtceu.gui.item_auto_output.other_direction.0": "Item Auto Output: §6Other Direction", @@ -2480,9 +2475,6 @@ "gtceu.gui.item_auto_output.tooltip.enabled": "Item Auto-Output Enabled", "gtceu.gui.item_auto_output.unselected.0": "Item Auto Output", "gtceu.gui.item_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", - "gtceu.gui.item_collector.range": "Range: ", - "gtceu.gui.item_input_from_output.disabled": "Allow Item Input from Output Side: §cDisabled", - "gtceu.gui.item_input_from_output.enabled": "Allow Item Input from Output Side: §aEnabled", "gtceu.gui.item_lock.tooltip.disabled": "Item Locking Disabled", "gtceu.gui.item_lock.tooltip.enabled": "Item Locking Enabled", "gtceu.gui.item_voiding": "§7Voiding §6Items", @@ -2492,13 +2484,8 @@ "gtceu.gui.machinemode.tab_tooltip": "Change active Machine Mode", "gtceu.gui.machinemode.title": "Active Machine Mode", "gtceu.gui.me_bus.auto_pull_button": "Click to toggle automatic item pulling from ME", - "gtceu.gui.me_network.auto_pull_toggle": "Toggle Auto-Pull", - "gtceu.gui.me_network.empty": "Empty", - "gtceu.gui.me_network.min_stack_size": "Min Stack Size:", "gtceu.gui.me_network.offline": "Network Status: §4Offline§r", "gtceu.gui.me_network.online": "Network Status: §2Online§r", - "gtceu.gui.me_network.stocking_settings": "Stocking Settings", - "gtceu.gui.me_network.ticks_per_cycle": "Ticks Per Cycle:", "gtceu.gui.multiblock.voiding_mode": "Voiding Mode:", "gtceu.gui.no_voiding": "§7Voiding Nothing", "gtceu.gui.output_setting.title": "Output Settings", @@ -2513,7 +2500,6 @@ "gtceu.gui.overclock.off": "X", "gtceu.gui.overclock.range": "Available Tiers [%s, %s]", "gtceu.gui.overclock.title": "Overclock Tier", - "gtceu.gui.pattern_buffer.set_custom_name": "Set Custom Name: ", "gtceu.gui.silktouch.disabled.0": "Silk Touch Disabled: Click to Enable.", "gtceu.gui.silktouch.disabled.1": "§7Switching requires an idle machine.", "gtceu.gui.silktouch.enabled.0": "Silk Touch Enabled: Click to Disable.", @@ -2532,7 +2518,6 @@ "gtceu.io.export": "Export", "gtceu.io.import": "Import", "gtceu.io.none": "None", - "gtceu.item.tooltip.image_url": "Image URL: %s", "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", @@ -2641,10 +2626,6 @@ "gtceu.jei.ore_vein_diagram.spawn_range": "Spawn Range:", "gtceu.jei.ore_vein_diagram.weight": "Weight: %s", "gtceu.jei.programmed_circuit": "Programmed Circuit Page", - "gtceu.journeymap.options.layers": "Prospection layers", - "gtceu.journeymap.options.layers.bedrock_fluids": "Show Bedrock Fluid Veins", - "gtceu.journeymap.options.layers.hide_depleted": "Hide Depleted Veins", - "gtceu.journeymap.options.layers.ore_veins": "Show Ore Veins", "gtceu.key.armor_charging": "Armor Charging to Inventory Toggle", "gtceu.key.armor_hover": "Armor Hover Toggle", "gtceu.key.armor_mode_switch": "Armor Mode Switch", @@ -3059,16 +3040,19 @@ "gtceu.machine.me_import_item_hatch.configs.tooltip": "Keeps 16 item types in stock", "gtceu.machine.miner.chunkradius": "Chunk Radius: %d", "gtceu.machine.miner.fluid_usage": "Uses §f%d mB/t §7of §f%s§7, doubled per overclock.", + "gtceu.machine.miner.minex": "mX: %d", + "gtceu.machine.miner.miney": "mY: %d", + "gtceu.machine.miner.minez": "mZ: %d", "gtceu.machine.miner.multi.description": "A multiblock mining machine that covers a large area and produces huge quantity of ore.", "gtceu.machine.miner.multi.modes": "Has Silk Touch and Chunk Aligned Modes.", "gtceu.machine.miner.multi.production": "Produces §f3x§7 more crushed ore than a §fMacerator§7.", "gtceu.machine.miner.per_block": "§7takes §f%ds §7per Block", "gtceu.machine.miner.progress": "Progress: %d/%d", "gtceu.machine.miner.radius": "Radius: %d", + "gtceu.machine.miner.startx": "sX: %d", + "gtceu.machine.miner.starty": "sY: %d", + "gtceu.machine.miner.startz": "sZ: %d", "gtceu.machine.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", - "gtceu.machine.miner.x": "sX: %d, mX: %d", - "gtceu.machine.miner.y": "sY: %d, mY: %d", - "gtceu.machine.miner.z": "sZ: %d, mZ: %d", "gtceu.machine.muffle.off": "Sound Muffling: Disabled", "gtceu.machine.muffle.on": "Sound Muffling: Enabled", "gtceu.machine.muffler_hatch.tooltip.0": "Recovers waste from machines", @@ -3123,7 +3107,6 @@ "gtceu.machine.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", "gtceu.machine.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", "gtceu.machine.parallel_hatch.display": "Adjust the maximum parallel of the multiblock", - "gtceu.machine.parallel_hatch.parallel_ui": "Parallels", "gtceu.machine.parallel_hatch_mk5.tooltip": "Allows to run up to 4 recipes in parallel.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Allows to run up to 16 recipes in parallel.", "gtceu.machine.parallel_hatch_mk7.tooltip": "Allows to run up to 64 recipes in parallel.", @@ -3281,7 +3264,7 @@ "gtceu.maintenance.configurable_time": "Time: %fx", "gtceu.maintenance.configurable_time.changed_description": "Maintenance problems will occur at %fx the normal rate.", "gtceu.maintenance.configurable_time.unchanged_description": "Maintenance problems will occur at normal rate. Change configuration to update.", - "gtceu.minimap.ore_vein.depleted": "Depleted", + "gtceu.minimap.ore_vein.depleted": "Depleted Vein", "gtceu.mixer": "Mixer", "gtceu.mode.both": "§dBoth (Fluid And Item)§r", "gtceu.mode.fluid": "§9Fluid§r", @@ -3347,9 +3330,10 @@ "gtceu.multiblock.hpca.info_bridging_disabled": "Bridging Disabled", "gtceu.multiblock.hpca.info_bridging_enabled": "Bridging Enabled", "gtceu.multiblock.hpca.info_coolant_name": "PCB Coolant", - "gtceu.multiblock.hpca.info_cooling_demand": "Cooling Demand: %s / %d", "gtceu.multiblock.hpca.info_max_computation": "Max CWU/t: %s", "gtceu.multiblock.hpca.info_max_coolant_required": "Coolant Needed: %s", + "gtceu.multiblock.hpca.info_max_cooling_available": "Cooling Available: %s", + "gtceu.multiblock.hpca.info_max_cooling_demand": "Cooling Demand: %s", "gtceu.multiblock.hpca.temperature": "Temperature: %s", "gtceu.multiblock.hpca.warning_low_cooling": "- Not enough cooling", "gtceu.multiblock.hpca.warning_multiple_bridges": "- Multiple bridges in structure (provides no additional benefit)", @@ -3502,9 +3486,9 @@ "gtceu.multiblock.turbine.rotor_durability": "Rotor Durability: %s%%", "gtceu.multiblock.turbine.rotor_speed": "Rotor Speed: %s/%s RPM", "gtceu.multiblock.universal.distinct": "Distinct Buses:", - "gtceu.multiblock.universal.distinct.disabled": "Distinct Buses: §eDisabled", - "gtceu.multiblock.universal.distinct.enabled": "Distinct Buses: §eEnabled", "gtceu.multiblock.universal.distinct.info": "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc.", + "gtceu.multiblock.universal.distinct.no": "No", + "gtceu.multiblock.universal.distinct.yes": "Yes", "gtceu.multiblock.universal.has_problems": "Has Maintenance Problems!", "gtceu.multiblock.universal.has_problems_header": "Fix the following issues in a Maintenance Hatch:", "gtceu.multiblock.universal.muffler_obstructed": "Muffler Hatch is Obstructed!", @@ -3535,14 +3519,6 @@ "gtceu.packer": "Packer", "gtceu.part_sharing.disabled": "Multiblock Sharing §4Disabled", "gtceu.part_sharing.enabled": "Multiblock Sharing §aEnabled", - "gtceu.placeholder_editor.constant_value": "This expression always evaluates to the same result.\nConsider replacing it with a constant.", - "gtceu.placeholder_editor.extra_closing_bracket": "Extra closing bracket", - "gtceu.placeholder_editor.no_placeholder": "Placeholder with name '%s' does not exist", - "gtceu.placeholder_editor.unclosed_bracket": "Unclosed bracket (\"}\")", - "gtceu.placeholder_editor.unclosed_brackets": "%d brackets (\"}\") are unclosed", - "gtceu.placeholder_editor.unclosed_escape": "Unclosed escape (\"']\")", - "gtceu.placeholder_editor.unclosed_escapes": "%d escapes (\"']\") are unclosed", - "gtceu.placeholder_editor.write_in_if": "Placeholders inside {if} are executed regardless of the condition.\nThis means that, for example, \"{if 0 {redstone set 15}}\" will produce redstone output.\nTo avoid this, use \"{eval {if \"\" \"\"}}\".", "gtceu.placeholder_info.active.0": "Returns a 1 if the block the cover is attached to is currently running a recipe, 0 otherwise.", "gtceu.placeholder_info.active.1": "Usage:", "gtceu.placeholder_info.active.2": " {active} -> whether there's a currently running recipe", @@ -3625,14 +3601,13 @@ "gtceu.placeholder_info.count.2": " {count [arg2] [arg3] [arg4] ...} -> the amount of arguments that are equal to the first", "gtceu.placeholder_info.data.0": "Stores or retrieves some data from a data item (data stick/orb/module) in one of the slots.", "gtceu.placeholder_info.data.1": "If you leave the argument empty, it will be replaced with the value p (p is an integer from 0 to (capacity - 1) that is stored in the data item nbt).", - "gtceu.placeholder_info.data.2": "If the slot argument is equal to 0, this placeholder will manipulate the data stick that is currently targeted by this text module inside a data hatch.", - "gtceu.placeholder_info.data.3": "Usage:", - "gtceu.placeholder_info.data.4": " {data get } -> the data stored in the item in the specified slot", - "gtceu.placeholder_info.data.5": " {data set } -> sets the data stored in the item in the specified slot, returns an empty string", - "gtceu.placeholder_info.data.6": " {data getp } -> p", - "gtceu.placeholder_info.data.7": " {data setp } -> sets p, returns an empty string", - "gtceu.placeholder_info.data.8": " {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0", - "gtceu.placeholder_info.data.9": " {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)", + "gtceu.placeholder_info.data.2": "Usage:", + "gtceu.placeholder_info.data.3": " {data get } -> the data stored in the item in the specified slot", + "gtceu.placeholder_info.data.4": " {data set } -> sets the data stored in the item in the specified slot, returns an empty string", + "gtceu.placeholder_info.data.5": " {data getp } -> p", + "gtceu.placeholder_info.data.6": " {data setp } -> sets p, returns an empty string", + "gtceu.placeholder_info.data.7": " {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0", + "gtceu.placeholder_info.data.8": " {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)", "gtceu.placeholder_info.displayTarget.0": "Returns the specified line that was transmitted to this cover using a display link.", "gtceu.placeholder_info.displayTarget.1": "Usage:", "gtceu.placeholder_info.displayTarget.2": " {displayTarget } -> the text on the specified line (line number is 1-100)", @@ -3729,20 +3704,12 @@ "gtceu.placeholder_info.setImage.0": "Sets the image URL in an image module in the specified slot", "gtceu.placeholder_info.setImage.1": "Usage:", "gtceu.placeholder_info.setImage.2": " {setImage } -> empty string", - "gtceu.placeholder_info.setTargetSlot.0": "Sets the index of the targeted data hatch slot.", - "gtceu.placeholder_info.setTargetSlot.1": "The change will take effect immediately after this placeholder executes.", - "gtceu.placeholder_info.setTargetSlot.2": "(Further placeholders will reference the new target)", - "gtceu.placeholder_info.setTargetSlot.3": "Usage:", - "gtceu.placeholder_info.setTargetSlot.4": " {setTargetSlot } -> empty string", "gtceu.placeholder_info.strike.0": "Returns the text from the first text, displaying it as if it was crossed out", "gtceu.placeholder_info.strike.1": "Usage:", "gtceu.placeholder_info.strike.2": " {strike } -> crossed-out text", "gtceu.placeholder_info.subList.0": "Returns arguments from with indexes from l (inclusive) to r (exclusive) (starting from 0)", "gtceu.placeholder_info.subList.1": "Usage:", "gtceu.placeholder_info.subList.2": " {subList [arg0] [arg1] ...} -> all arguments with indexes from l to r separated by spaces", - "gtceu.placeholder_info.targetSlot.0": "Returns the index of the targeted data hatch slot", - "gtceu.placeholder_info.targetSlot.1": "Usage:", - "gtceu.placeholder_info.targetSlot.2": " {targetSlot} -> (from 1 to 4/9/16)", "gtceu.placeholder_info.tick.0": "Returns the amount of ticks passed from when this cover was placed.", "gtceu.placeholder_info.tick.1": "Usage:", "gtceu.placeholder_info.tick.2": " {tick} -> the amount of ticks", @@ -3765,7 +3732,6 @@ "gtceu.plasma_generator": "Plasma Generator", "gtceu.polarizer": "Polarizer", "gtceu.primitive_blast_furnace": "Primitive Blast Furnace", - "gtceu.provider.computer_monitor_cover.error.no_target": "No target selected for the monitor group", "gtceu.pyrolyse_oven": "Pyrolyse Oven", "gtceu.recipe.byproduct_tier": "Byproducts from %s§r+", "gtceu.recipe.category.arc_furnace_recycling": "Arc Scrapping", @@ -4301,7 +4267,6 @@ "item.gtceu.gray_glass_lens": "Glass Lens (Gray)", "item.gtceu.green_dye_spray_can": "Spray Can (Green)", "item.gtceu.green_glass_lens": "Glass Lens (Green)", - "item.gtceu.gui_module": "Gui Module", "item.gtceu.hammer_extruder_mold.tooltip": "§7Extruder Shape for making Hammers", "item.gtceu.hazmat_boots": "Hazardous Materials Suit Boots", "item.gtceu.hazmat_chestpiece": "Hazardous Materials Suit Chestpiece", @@ -5831,11 +5796,6 @@ "metaitem.machine_configuration.mode": "§aConfiguration Mode:§r %s", "metaitem.plugin.proxy.tooltips.1": "(Please adjust to proxy mode in the screen)", "metaitem.plugin.tooltips.1": "Plugins can be added to the screen for more functionality.", - "metaitem.prospector.mode.bedrock_ore": "§bBedrock Ore Prospection Mode§r", - "metaitem.prospector.mode.fluid": "§bFluid Prospection Mode§r", - "metaitem.prospector.mode.ores": "§aOre Prospection Mode§r", - "metaitem.prospector.tooltip.modes": "Available Modes:", - "metaitem.prospector.tooltip.radius": "Scans range in a %s Chunk Radius", "metaitem.record.sus.tooltip": "§7Leonz - Among Us Drip", "metaitem.terminal.tooltip": "Sharp tools make good work", "metaitem.terminal.tooltip.creative": "§bCreative Mode", @@ -6009,4 +5969,4 @@ "tooltip.gtceu.hazard_trigger.skin_contact": "Skin contact", "tooltip.gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:" -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockStateAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockStateAccessor.java new file mode 100644 index 00000000000..b5058f17123 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/BlockStateAccessor.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.core.mixins; + +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(BlockBehaviour.BlockStateBase.class) +public interface BlockStateAccessor { + + @Accessor("mapColor") + MapColor gtceu$getDefaultMapColor(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java index 35e6de78113..0ef5046812b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/IntegrationLang.java @@ -129,9 +129,6 @@ private static void initMinimapLang(RegistrateLangProvider provider) { provider.add("button.gtceu.toggle_waypoint.name", "Toggle Waypoint"); provider.add("gtceu.journeymap.options.layers", "Prospection layers"); - provider.add("gtceu.journeymap.options.layers.ore_veins", "Show Ore Veins"); - provider.add("gtceu.journeymap.options.layers.bedrock_fluids", "Show Bedrock Fluid Veins"); - provider.add("gtceu.journeymap.options.layers.hide_depleted", "Hide Depleted Veins"); provider.add("gtceu.button.ore_veins", "Show Ore Veins"); provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 8eb6fca1f11..683c8914296 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1303,11 +1303,6 @@ public static void init(RegistrateLangProvider provider) { provider.add("config.jade.plugin_gtceu.ldp_endpoint", "[GTCEu] Long Distance Pipeline Endpoint Info"); // gui - provider.add("gtceu.button.ore_veins", "Show GT Ore Veins"); - provider.add("gtceu.button.bedrock_fluids", "Show Bedrock Fluid Veins"); - provider.add("gtceu.button.hide_depleted", "Hide Depleted Veins"); - provider.add("gtceu.button.show_depleted", "Show Depleted Veins"); - provider.add("gtceu.recipe_type.show_recipes", "Show Recipes"); provider.add("gtceu.gui.cover_setting.title", "Cover Settings"); provider.add("gtceu.gui.output_setting.title", "Output Settings"); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java index 0e27eb8e37b..b16417afc22 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java @@ -31,7 +31,7 @@ public class FTBChunksRenderer extends GenericMapRenderer { @Override public boolean addMarker(Component name, String id, ResourceKey dim, ChunkPos pos, ProspectorMode.FluidInfo fluid) { - fluidElements.put(dim, pos, new FluidVeinIcon(pos, fluid)); + fluidElements.put(dim, pos, new FluidVeinIcon(pos, name, fluid)); return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java index 3a69a8aa4d7..eadab7935b9 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java @@ -7,6 +7,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; @@ -34,13 +35,16 @@ public class FluidVeinIcon implements MapIcon { @Getter private final ChunkPos chunkPos; @Getter + private final Component name; + @Getter private final ProspectorMode.FluidInfo fluidInfo; @Setter private int size; private Icon icon; - public FluidVeinIcon(ChunkPos chunkPos, ProspectorMode.FluidInfo fluidInfo) { + public FluidVeinIcon(ChunkPos chunkPos, Component name, ProspectorMode.FluidInfo fluidInfo) { this.chunkPos = chunkPos; + this.name = name; this.fluidInfo = fluidInfo; this.size = 1; } @@ -50,10 +54,6 @@ public boolean isEnabled() { (fluidInfo.left() > 0 || !FTBChunksOptions.hideDepleted()); } - public String getName() { - return FluidRenderLayer.getName(fluidInfo).getString(); - } - public int getColor() { var color = IClientFluidTypeExtensions.of(fluidInfo.fluid()).getTintColor(); var material = ChemicalHelper.getMaterial(fluidInfo.fluid()); @@ -65,7 +65,7 @@ public int getColor() { @Override public double getIconScale(MapType mapType) { - return mapType.isMinimap() ? FTBChunksClientConfig.MINIMAP_ZOOM.get() : size; + return mapType.isMinimap() ? FTBChunksClientConfig.MINIMAP_ZOOM.get() : this.size; } @Override @@ -100,7 +100,7 @@ public boolean onMousePressed(BaseScreen baseScreen, MouseButton mouseButton) { var pos = getMiddleBlock(); var waypoint = new WaypointImpl(WaypointType.DEFAULT, mapDimension, pos); if (!waypointManager.getAllWaypoints().contains(waypoint)) { - waypointManager.addWaypointAt(pos, getName()) + waypointManager.addWaypointAt(pos, this.getName().getString()) .setColor(getColor()) .setHidden(false); baseScreen.refreshWidgets(); @@ -111,7 +111,7 @@ public boolean onMousePressed(BaseScreen baseScreen, MouseButton mouseButton) { @Override public void addTooltip(TooltipList list) { - FluidRenderLayer.getTooltip(fluidInfo).forEach(list::add); + FluidRenderLayer.getTooltip(this.name, this.fluidInfo).forEach(list::add); } @Override @@ -121,7 +121,7 @@ public boolean onKeyPressed(BaseScreen baseScreen, Key key) { public Icon getIcon(int alpha, boolean mouseOver) { var color = getColor(); - var fluidIcon = Icon.getIcon(IClientFluidTypeExtensions.of(fluidInfo.fluid()).getStillTexture()) + var fluidIcon = Icon.getIcon(IClientFluidTypeExtensions.of(this.fluidInfo.fluid()).getStillTexture()) .withColor(Color4I.rgba(color).withAlpha(alpha)); if (mouseOver) { fluidIcon = fluidIcon.withBorder(Color4I.rgba(color), false); @@ -135,9 +135,9 @@ public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int if (!mapType.isMinimap() || !isEnabled()) { return; } - if (icon == null) { - icon = getIcon(200, false); + if (this.icon == null) { + this.icon = getIcon(200, false); } - icon.draw(graphics, x, y, w, h); + this.icon.draw(graphics, x, y, w, h); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java index e646e81bca3..c6d4c8f2463 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java @@ -112,19 +112,20 @@ public Component getChunkHighlightBluntTooltip(ResourceKey dimension, int if (!isEnabled()) { return null; } - var fluid = XaerosRenderer.fluidElements.get(dimension, new ChunkPos(x, z)); + ProspectorMode.FluidInfo fluid = XaerosRenderer.fluidElements.get(dimension, new ChunkPos(x, z)); if (fluid == null) { return null; } - return FluidRenderLayer.getTooltip(fluid).stream().reduce(Component.empty(), (c1, c2) -> { - if (c1.getString().isEmpty()) { - return c2; - } - if (c2.getString().isEmpty()) { - return c1; - } - return ((MutableComponent) c1).append("\n").append(c2); - }); + return FluidRenderLayer.getTooltip(FluidRenderLayer.getName(fluid), fluid).stream() + .reduce(Component.empty(), (c1, c2) -> { + if (c1.getString().isEmpty()) { + return c2; + } + if (c2.getString().isEmpty()) { + return c1; + } + return ((MutableComponent) c1).append("\n").append(c2); + }); } @Override diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index e70d3cbc406..3abc59e6751 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -38,6 +38,7 @@ "BlockBehaviourAccessor", "BlockMixin", "BlockPropertiesAccessor", + "BlockStateAccessor", "ChunkGeneratorMixin", "EntityMixin", "GrowingPlantBlockAccessor", From d8bd2d4acbc04b8b5783ba6abc42c0510534c4aa Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 4 May 2026 19:43:01 +0300 Subject: [PATCH 06/15] De-ldlib the prospector --- .../api/gui/texture/ProspectingTexture.java | 208 --------- .../api/gui/widget/ProspectingMapWidget.java | 405 ------------------ .../gtceu/api/item/ComponentItem.java | 18 +- .../prospector/ProspectingUpdatePacket.java} | 24 +- .../prospector}/ProspectorMode.java | 73 ++-- .../gtceu/common/data/GTItems.java | 2 +- .../behavior/PortableScannerBehavior.java | 2 +- .../behavior/ProspectorScannerBehavior.java | 104 +++-- .../common/mui/drawable/CycleDrawable.java | 76 ++++ .../prospector/ProspectorMapHandler.java | 265 ++++++++++++ .../prospector/ProspectorMapTexture.java | 175 ++++++++ .../SPacketProspectBedrockFluid.java | 2 +- .../SPacketProspectBedrockOre.java | 2 +- .../integration/map/GenericMapRenderer.java | 2 +- .../integration/map/GroupingMapRenderer.java | 2 +- .../map/cache/client/GTClientCache.java | 2 +- .../map/cache/fluid/FluidCache.java | 2 +- .../map/ftbchunks/FTBChunksRenderer.java | 2 +- .../ftbchunks/veins/fluid/FluidVeinIcon.java | 2 +- .../map/journeymap/JourneymapRenderer.java | 2 +- .../map/layer/builtin/FluidRenderLayer.java | 2 +- .../map/xaeros/XaerosRenderer.java | 2 +- .../minimap/fluid/FluidChunkHighlighter.java | 2 +- .../worldmap/fluid/FluidChunkHighlighter.java | 2 +- 24 files changed, 660 insertions(+), 718 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java rename src/main/java/com/gregtechceu/gtceu/api/{gui/misc/PacketProspecting.java => mui/prospector/ProspectingUpdatePacket.java} (63%) rename src/main/java/com/gregtechceu/gtceu/api/{gui/misc => mui/prospector}/ProspectorMode.java (85%) create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/drawable/CycleDrawable.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java b/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java deleted file mode 100644 index 1d2ceb89dc6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/texture/ProspectingTexture.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.texture; - -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.misc.PacketProspecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; - -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import com.lowdragmc.lowdraglib.gui.texture.TransformTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.utils.ColorUtils; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.texture.AbstractTexture; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.util.FastColor; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; -import lombok.Getter; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; - -import java.io.IOException; -import java.lang.reflect.Array; - -import javax.annotation.ParametersAreNonnullByDefault; - -import static com.mojang.blaze3d.vertex.DefaultVertexFormat.POSITION_TEX_COLOR; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@OnlyIn(Dist.CLIENT) -public class ProspectingTexture extends AbstractTexture { - - private static final ResourceTexture ARROW = GuiTextures.UP.copy().setColor(ColorPattern.RED.color); - - @Getter - private @Nullable String selected = null; - private boolean darkMode; - @Getter - private final int imageWidth; - @Getter - private final int imageHeight; - public final T[][][] data; - private final int playerXGui; - private final int playerYGui; - private final float direction; - private final int playerChunkX; - private final int playerChunkZ; - private final ProspectorMode mode; - private final int chunkRadius; - - public ProspectingTexture(int playerChunkX, int playerChunkZ, int playerBlockX, int playerBlockZ, float direction, - ProspectorMode mode, int chunkRadius, boolean darkMode) { - this.darkMode = darkMode; - this.chunkRadius = chunkRadius; - this.mode = mode; - // noinspection unchecked - this.data = (T[][][]) Array.newInstance(mode.getItemClass(), (chunkRadius * 2 - 1) * mode.cellSize, - (chunkRadius * 2 - 1) * mode.cellSize, 0); - this.imageWidth = (chunkRadius * 2 - 1) * 16; - this.imageHeight = (chunkRadius * 2 - 1) * 16; - this.playerChunkX = playerChunkX; - this.playerChunkZ = playerChunkZ; - this.direction = (direction + 180) % 360; - this.playerXGui = playerBlockX - (playerChunkX - this.chunkRadius + 1) * 16 + (playerBlockX > 0 ? 1 : 0); - this.playerYGui = playerBlockZ - (playerChunkZ - this.chunkRadius + 1) * 16 + (playerBlockX > 0 ? 1 : 0); - } - - public void updateTexture(PacketProspecting packet) { - int ox; - if ((packet.chunkX > 0 && playerChunkX > 0) || (packet.chunkX < 0 && playerChunkX < 0)) { - ox = Math.abs(Math.abs(packet.chunkX) - Math.abs(playerChunkX)); - } else { - ox = Math.abs(playerChunkX) + Math.abs(packet.chunkX); - } - if (playerChunkX > packet.chunkX) { - ox = -ox; - } - - int oy; - if ((packet.chunkZ > 0 && playerChunkZ > 0) || (packet.chunkZ < 0 && playerChunkZ < 0)) { - oy = Math.abs(Math.abs(packet.chunkZ) - Math.abs(playerChunkZ)); - } else { - oy = Math.abs(playerChunkZ) + Math.abs(packet.chunkZ); - } - if (playerChunkZ > packet.chunkZ) { - oy = -oy; - } - - int currentColumn = (this.chunkRadius - 1) + ox; - int currentRow = (this.chunkRadius - 1) + oy; - if (currentRow < 0) { - return; - } - - for (int x = 0; x < mode.cellSize; x++) { - System.arraycopy(packet.data[x], 0, data[x + currentColumn * mode.cellSize], currentRow * mode.cellSize, - mode.cellSize); - } - load(); - } - - private NativeImage getImage() { - NativeImage image = new NativeImage(this.imageWidth, this.imageHeight, false); - - for (int x = 0; x < this.imageWidth; x++) { - for (int y = 0; y < this.imageHeight; y++) { - T[] items = this.data[x * mode.cellSize / 16][y * mode.cellSize / 16]; - // draw background - image.setPixelRGBA(x, y, (darkMode ? 0xFF666666 : 0xFFFFFFFF)); - // draw items - for (T item : items) { - if (selected != null && !selected.equals(mode.getUniqueId(item))) continue; - int color = mode.getItemColor(item); - // this is actually ARGB, even though the method name says RGBA and the parameter says ABGR. - image.setPixelRGBA(x, y, FastColor.ABGR32.opaque(color)); - break; - } - // draw grid - if (x % 16 == 0 || y % 16 == 0) { - image.blendPixel(x, y, 0xFF000000); - image.setPixelRGBA(x, y, ColorUtils.averageColor(image.getPixelRGBA(x, y), 0xFF000000)); - } - } - } - return image; - } - - public void load() { - doLoad(getImage()); - } - - private void doLoad(NativeImage image) { - TextureUtil.prepareImage(this.getId(), image.getWidth(), image.getHeight()); - // the last parameter is actually autoClose, it's named wrong. - image.upload(0, 0, 0, true); - } - - public void draw(GuiGraphics graphics, int x, int y) { - // getId() generates a new texture ID if it's NOT_ASSIGNED, so we shouldn't use that. - if (this.id == NOT_ASSIGNED) return; - - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tesselator.getBuilder(); - RenderSystem.setShader(GameRenderer::getPositionTexColorShader); - RenderSystem.setShaderTexture(0, this.getId()); - - Matrix4f pose = graphics.pose().last().pose(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, POSITION_TEX_COLOR); - bufferbuilder.vertex(pose, x, y + imageHeight, 0).uv(0, 1).color(0xFFFFFFFF).endVertex(); - bufferbuilder.vertex(pose, x + imageWidth, y + imageHeight, 0).uv(1, 1).color(0xFFFFFFFF).endVertex(); - bufferbuilder.vertex(pose, x + imageWidth, y, 0).uv(1, 0).color(0xFFFFFFFF).endVertex(); - bufferbuilder.vertex(pose, x, y, 0).uv(0, 0).color(0xFFFFFFFF).endVertex(); - tesselator.end(); - - // draw special grid (e.g. fluid) - for (int cx = 0; cx < chunkRadius * 2 - 1; cx++) { - for (int cz = 0; cz < chunkRadius * 2 - 1; cz++) { - if (this.data[cx][cz] != null && this.data[cx][cz].length > 0) { - var items = this.data[cx][cz]; - mode.drawSpecialGrid(graphics, items, x + cx * 16 + 1, y + cz * 16 + 1, 16, 16); - } - } - } - TransformTexture arrow = ARROW.rotate(this.direction / 2); - arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); - - // draw red vertical line - if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); - } - // draw red horizontal line - if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); - } - } - - @Override - public void load(ResourceManager resourceManager) throws IOException {} - - public void setDarkMode(boolean darkMode) { - if (this.darkMode != darkMode) { - this.darkMode = darkMode; - load(); - } - } - - public void setSelected(String uniqueID) { - if (!this.selected.equals(uniqueID)) { - this.selected = uniqueID; - load(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java deleted file mode 100644 index 1039fe7623a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ /dev/null @@ -1,405 +0,0 @@ -package com.gregtechceu.gtceu.api.gui.widget; - -import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.misc.PacketProspecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; -import com.gregtechceu.gtceu.api.gui.texture.ProspectingTexture; -import com.gregtechceu.gtceu.api.item.IComponentItem; -import com.gregtechceu.gtceu.common.item.behavior.ProspectorScannerBehavior; -import com.gregtechceu.gtceu.integration.map.WaypointManager; -import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; -import com.gregtechceu.gtceu.integration.map.cache.server.ServerCache; -import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; - -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.gui.widget.*; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import lombok.Getter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.function.Consumer; - -public class ProspectingMapWidget extends WidgetGroup implements SearchComponentWidget.IWidgetSearch { - - private final int chunkRadius; - private final ProspectorMode mode; - private final int scanTick; - @Getter - private boolean darkMode = false; - private final DraggableScrollableWidgetGroup itemList; - - @OnlyIn(Dist.CLIENT) - private ProspectingTexture texture; - - private int playerChunkX; - private int playerChunkZ; - // runtime - private int chunkIndex = 0; - - private final Queue> packetQueue = new LinkedBlockingQueue<>(); - private final Set items = new CopyOnWriteArraySet<>(); - private final Map selectedMap = new ConcurrentHashMap<>(); - - public ProspectingMapWidget(int xPosition, int yPosition, int width, int height, int chunkRadius, - @NotNull ProspectorMode mode, int scanTick) { - super(xPosition, yPosition, width, height); - this.chunkRadius = chunkRadius; - this.mode = mode; - this.scanTick = scanTick; - - int imageWidth = (chunkRadius * 2 - 1) * 16; - int imageHeight = (chunkRadius * 2 - 1) * 16; - addWidget(new ImageWidget(0, (height - imageHeight) / 2 - 4, imageWidth + 8, imageHeight + 8, - GuiTextures.BACKGROUND_INVERSE)); - - WidgetGroup group = (WidgetGroup) new WidgetGroup(imageWidth + 10, 0, width - (imageWidth + 10), height) - .setBackground(GuiTextures.BACKGROUND_INVERSE); - group.addWidget(this.itemList = new DraggableScrollableWidgetGroup(4, 28, - group.getSize().width - 8, group.getSize().height - 32) - .setYScrollBarWidth(2) - .setYBarStyle(null, ColorPattern.T_WHITE.rectTexture().setRadius(1))); - group.addWidget(new SearchComponentWidget<>(6, 6, group.getSize().width - 12, 18, this)); - addWidget(group); - - addNewItem(null, Component.translatable("behavior.prospector.display_all"), IGuiTexture.EMPTY); - } - - @Override - public void writeInitialData(FriendlyByteBuf buffer) { - super.writeInitialData(buffer); - buffer.writeVarInt(this.playerChunkX = gui.entityPlayer.chunkPosition().x); - buffer.writeVarInt(this.playerChunkZ = gui.entityPlayer.chunkPosition().z); - buffer.writeVarInt(gui.entityPlayer.getBlockX()); - buffer.writeVarInt(gui.entityPlayer.getBlockZ()); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void readInitialData(FriendlyByteBuf buffer) { - super.readInitialData(buffer); - this.texture = new ProspectingTexture<>( - buffer.readVarInt(), buffer.readVarInt(), - buffer.readVarInt(), buffer.readVarInt(), - gui.entityPlayer.getVisualRotationYInDegrees(), - mode, chunkRadius, darkMode); - } - - public void setDarkMode(boolean darkMode) { - if (this.darkMode == darkMode) { - return; - } - this.darkMode = darkMode; - if (isRemote()) { - this.texture.setDarkMode(this.darkMode); - } - } - - private void addOresToList(T[][][] data) { - HashSet newItems = new HashSet<>(); - for (int x = 0; x < mode.cellSize; x++) { - for (int z = 0; z < mode.cellSize; z++) { - for (T item : data[x][z]) { - newItems.add(item); - addNewItem(mode.getUniqueId(item), mode.getDescription(item), mode.getItemIcon(item)); - } - } - } - items.addAll(newItems); - } - - private void addNewItem(String uniqueId, Component renderingName, IGuiTexture icon) { - if (!selectedMap.containsKey(uniqueId)) { - int index = itemList.widgets.size(); - var selectableWidgetGroup = new SelectableWidgetGroup(0, index * 15, itemList.getSize().width - 4, 15); - var size = selectableWidgetGroup.getSize(); - selectableWidgetGroup.addWidget(new ImageWidget(0, 0, 15, 15, icon)); - selectableWidgetGroup.addWidget(new ImageWidget(15, 0, size.width - 15, 15, - new TextTexture(renderingName.getString()) - .setWidth(size.width - 15) - .setType(TextTexture.TextType.LEFT_HIDE))); - - selectableWidgetGroup.setOnSelected(s -> { - if (isRemote()) { - texture.setSelected(uniqueId); - } - }); - selectableWidgetGroup.setSelectedTexture(ColorPattern.WHITE.borderTexture(-1)); - - itemList.addWidget(selectableWidgetGroup); - selectedMap.put(uniqueId, selectableWidgetGroup); - } - } - - @Override - public void detectAndSendChanges() { - Player player = gui.entityPlayer; - Level level = player.level(); - - int chunkDiameter = this.chunkRadius * 2 - 1; - - if (gui.getTickCount() % this.scanTick == 0 && this.chunkIndex < chunkDiameter * chunkDiameter) { - int row = this.chunkIndex / chunkDiameter; - int column = this.chunkIndex % chunkDiameter; - - int ox = column - this.chunkRadius + 1; - int oz = row - this.chunkRadius + 1; - - LevelChunk chunk = level.getChunk(this.playerChunkX + ox, this.playerChunkZ + oz); - if (mode == ProspectorMode.ORE) { - ServerCache.instance.prospectAllInChunk(level.dimension(), chunk.getPos(), (ServerPlayer) player); - } - PacketProspecting packet = new PacketProspecting<>(this.playerChunkX + ox, this.playerChunkZ + oz, mode); - mode.scan(packet.data, chunk); - writeUpdateInfo(-1, packet::writePacketData); - - this.chunkIndex++; - } - - ItemStack held = player.getItemInHand(InteractionHand.MAIN_HAND); - if (!(held.getItem() instanceof IComponentItem componentItem)) { - return; - } - for (var component : componentItem.getComponents()) { - if (component instanceof ProspectorScannerBehavior prospector) { - if (!player.isCreative() && !prospector.drainEnergy(held, false)) { - player.closeContainer(); - } - } - } - } - - @OnlyIn(Dist.CLIENT) - @Override - public void readUpdateInfo(int id, FriendlyByteBuf buffer) { - if (id == -1) { - addPacketToQueue(PacketProspecting.readPacketData(mode, buffer)); - } else { - super.readUpdateInfo(id, buffer); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void updateScreen() { - super.updateScreen(); - - int maxToProcess = 10; - while (maxToProcess-- > 0 && !packetQueue.isEmpty()) { - PacketProspecting packet = packetQueue.poll(); - texture.updateTexture(packet); - addOresToList(packet.data); - } - } - - @OnlyIn(Dist.CLIENT) - private void addPacketToQueue(PacketProspecting packet) { - packetQueue.add(packet); - if (mode == ProspectorMode.FLUID && packet.data[0][0].length > 0) { - GTClientCache.instance.addFluid( - gui.entityPlayer.level().dimension(), - packet.chunkX, packet.chunkZ, - (ProspectorMode.FluidInfo) packet.data[0][0][0]); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInBackground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInBackground(graphics, mouseX, mouseY, partialTicks); - var position = getPosition(); - var size = getSize(); - - // draw background - int x = position.x + 3; - int y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - this.texture.draw(graphics, x, y); - - int chunkDiameter = this.chunkRadius * 2 - 1; - int cX = (mouseX - x) / 16; - int cZ = (mouseY - y) / 16; - if (cX >= 0 && cZ >= 0 && cX < chunkDiameter && cZ < chunkDiameter) { - // draw hover layer - DrawerHelper.drawSolidRect(graphics, cX * 16 + x, cZ * 16 + y, 16, 16, 0x4B6C6C6C); - } - } - - @Override - @OnlyIn(Dist.CLIENT) - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - var position = getPosition(); - var size = getSize(); - var x = position.x + 3; - var y = position.y + (size.getHeight() - texture.getImageHeight()) / 2 - 1; - - int chunkDiameter = this.chunkRadius * 2 - 1; - int chunkX = (mouseX - x) / 16; - int chunkZ = (mouseY - y) / 16; - if (chunkX < 0 || chunkZ < 0 || chunkX >= chunkDiameter || chunkZ >= chunkDiameter) { - return; - } - - List tooltips = new ArrayList<>(); - tooltips.add(Component.translatable(mode.unlocalizedName)); - List items = new ArrayList<>(); - - for (int i = 0; i < mode.cellSize; i++) { - for (int j = 0; j < mode.cellSize; j++) { - if (this.texture.data[chunkX * mode.cellSize + i][chunkZ * mode.cellSize + j] != null) { - items.add(this.texture.data[chunkX * mode.cellSize + i][chunkZ * mode.cellSize + j]); - } - } - } - - // draw tooltips - mode.appendTooltips(items, tooltips, this.texture.getSelected()); - gui.getModularUIGui().setHoverTooltip(tooltips, ItemStack.EMPTY, null, null); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean mouseClicked(double mouseX, double mouseY, int button) { - WaypointItem clickedItem = getClickedVein(mouseX, mouseY); - if (clickedItem == null) { - return super.mouseClicked(mouseX, mouseY, button); - } - if (!WaypointManager.isActive()) return true; - - WaypointManager.setWaypoint(clickedItem.uniqueId, - clickedItem.name.getString(), clickedItem.color, - gui.entityPlayer.level().dimension(), clickedItem.position); - gui.entityPlayer.displayClientMessage( - Component.translatable("behavior.prospector.added_waypoint", - clickedItem.name.copy().withStyle(style -> style.withColor(clickedItem.color))), - false); - - playButtonClickSound(); - return true; - } - - private WaypointItem getClickedVein(double mouseX, double mouseY) { - var position = getPosition(); - var size = getSize(); - int x = position.x + 3; - int y = position.y + (size.getHeight() - this.texture.getImageHeight()) / 2 - 1; - - int cX = (int) (mouseX - x) / 16; - int cZ = (int) (mouseY - y) / 16; - int offsetX = Math.abs((int) (mouseX - x) % 16); - int offsetZ = Math.abs((int) (mouseY - y) % 16); - int xDiff = cX - (this.chunkRadius - 1); - int zDiff = cZ - (this.chunkRadius - 1); - - int xPos = SectionPos.sectionToBlockCoord(gui.entityPlayer.chunkPosition().x + xDiff) + offsetX; - int zPos = SectionPos.sectionToBlockCoord(gui.entityPlayer.chunkPosition().z + zDiff) + offsetZ; - int yPos = gui.entityPlayer.level().getHeight(Heightmap.Types.WORLD_SURFACE, xPos, zPos); - - BlockPos pos = new BlockPos(xPos, yPos, zPos); - if (cX < 0 || cZ < 0 || cX >= this.chunkRadius * 2 - 1 || cZ >= this.chunkRadius * 2 - 1) { - return null; - } - - // If the ores are filtered use its name - if (this.texture.getSelected() != null) { - for (T item : this.items) { - String uniqueId = mode.getUniqueId(item); - if (!this.texture.getSelected().equals(uniqueId)) continue; - - Component name = mode.getDescription(item); - int color = mode.getItemColor(item); - return new WaypointItem(pos, uniqueId, name, color); - } - } - - // If the cursor is over an ore use its name - T[] hoveredItem = this.texture.data[cX * mode.cellSize + (offsetX * mode.cellSize / 16)][cZ * mode.cellSize + - (offsetZ * mode.cellSize / 16)]; - if (hoveredItem != null && hoveredItem.length != 0) { - String uniqueId = mode.getUniqueId(hoveredItem[0]); - Component name = mode.getDescription(hoveredItem[0]); - int color = mode.getItemColor(hoveredItem[0]); - return new WaypointItem(pos, uniqueId, name, color); - } - - // If all else fails see if there's a nearby vein and use the vein's name - if (mode == ProspectorMode.ORE) { - var veins = GTClientCache.instance.getNearbyVeins(gui.entityPlayer.level().dimension(), pos, 32); - if (!veins.isEmpty()) { - veins.sort((o1, o2) -> { - int o1Dist = (int) o1.center().distToCenterSqr(xPos, o1.center().getY(), zPos); - int o2Dist = (int) o2.center().distToCenterSqr(xPos, o2.center().getY(), zPos); - return o1Dist - o2Dist; - }); - String uniqueId = OreRenderLayer.getId(veins.get(0)); - Component name = OreRenderLayer.getName(veins.get(0)); - List materials = veins.get(0).definition().veinGenerator().getAllMaterials(); - Material mostCommonItem = materials.get(materials.size() - 1); - int color = mostCommonItem.getMaterialARGB(); - return new WaypointItem(pos, uniqueId, name, color); - } - } - - return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), 0xFF990000); - } - - @Override - public String resultDisplay(T value) { - return mode.getDescription(value).getString(); - } - - @Override - public void selectResult(T item) { - if (isRemote()) { - String uniqueId = mode.getUniqueId(item); - this.texture.setSelected(uniqueId); - var selected = this.selectedMap.get(uniqueId); - if (selected != null) { - this.itemList.setSelected(selected); - } - } - } - - @Override - public void search(String searched, Consumer consumer) { - HashSet added = new HashSet<>(); - for (T item : this.items) { - if (Thread.currentThread().isInterrupted()) return; - String id = mode.getUniqueId(item); - if (!added.contains(id)) { - added.add(id); - String localized = resultDisplay(item); - if (item.toString().toLowerCase(Locale.ROOT).contains(searched.toLowerCase(Locale.ROOT)) || - localized.toLowerCase(Locale.ROOT).contains(searched.toLowerCase(Locale.ROOT))) { - consumer.accept(item); - } - } - } - } - - private record WaypointItem(BlockPos position, @Nullable String uniqueId, Component name, int color) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java index 682e2965d35..c4814247d4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java @@ -7,9 +7,6 @@ import com.gregtechceu.gtceu.api.item.component.*; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; @@ -52,9 +49,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ComponentItem extends Item - implements HeldItemUIFactory.IHeldItemUIHolder, IComponentItem, - IItemUIHolder { +public class ComponentItem extends Item implements IComponentItem, IItemUIHolder { protected int burnTime = -1; @@ -299,17 +294,6 @@ public String getDescriptionId(ItemStack stack) { return super.getDescriptionId(stack); } - @Override - @Nullable - public ModularUI createUI(Player entityPlayer, HeldItemUIFactory.HeldItemHolder holder) { - for (IItemComponent component : components) { - if (component instanceof IItemUIFactory uiFactory) { - return uiFactory.createUI(holder, entityPlayer); - } - } - return null; - } - @Override public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { for (IItemComponent component : components) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java b/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java similarity index 63% rename from src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java rename to src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java index 4fe2a40cae3..5bdae9a72ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/PacketProspecting.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java @@ -1,17 +1,17 @@ -package com.gregtechceu.gtceu.api.gui.misc; +package com.gregtechceu.gtceu.api.mui.prospector; import net.minecraft.network.FriendlyByteBuf; import java.lang.reflect.Array; -public class PacketProspecting { +public class ProspectingUpdatePacket { public int chunkX; public int chunkZ; public ProspectorMode mode; public T[][][] data; - public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { + public ProspectingUpdatePacket(int chunkX, int chunkZ, ProspectorMode mode) { this.chunkX = chunkX; this.chunkZ = chunkZ; this.mode = mode; @@ -19,27 +19,35 @@ public PacketProspecting(int chunkX, int chunkZ, ProspectorMode mode) { this.data = (T[][][]) Array.newInstance(mode.getItemClass(), this.mode.cellSize, this.mode.cellSize, 0); } - public static PacketProspecting readPacketData(ProspectorMode mode, FriendlyByteBuf buffer) { - PacketProspecting packet = new PacketProspecting<>(buffer.readVarInt(), buffer.readVarInt(), mode); + public static ProspectingUpdatePacket read(ProspectorMode mode, FriendlyByteBuf buffer) { + int chunkX = buffer.readVarInt(); + int chunkZ = buffer.readVarInt(); + + ProspectingUpdatePacket packet = new ProspectingUpdatePacket<>(chunkX, chunkZ, mode); + for (int x = 0; x < mode.cellSize; x++) { for (int z = 0; z < mode.cellSize; z++) { + int cellEntryCount = buffer.readVarInt(); // noinspection unchecked - packet.data[x][z] = (T[]) Array.newInstance(mode.getItemClass(), buffer.readVarInt()); - for (int i = 0; i < packet.data[x][z].length; i++) { + packet.data[x][z] = (T[]) Array.newInstance(mode.getItemClass(), cellEntryCount); + for (int i = 0; i < cellEntryCount; i++) { packet.data[x][z][i] = mode.deserialize(buffer); } } } + return packet; } public void writePacketData(FriendlyByteBuf buffer) { buffer.writeVarInt(chunkX); buffer.writeVarInt(chunkZ); + for (int x = 0; x < mode.cellSize; x++) { for (int z = 0; z < mode.cellSize; z++) { buffer.writeVarInt(data[x][z].length); - for (var item : data[x][z]) { + + for (T item : data[x][z]) { mode.serialize(item, buffer); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java similarity index 85% rename from src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java rename to src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java index 3b78cadd84d..906bc84c76a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.gui.misc; +package com.gregtechceu.gtceu.api.mui.prospector; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; @@ -9,18 +9,12 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.FluidVeinWorldEntry; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreVeinSavedData; +import com.gregtechceu.gtceu.common.mui.drawable.CycleDrawable; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.BlockStateAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; -import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; -import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; - -import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; @@ -41,6 +35,11 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; +import brachy.modularui.api.drawable.IIcon; +import brachy.modularui.drawable.FluidDrawable; +import brachy.modularui.drawable.GuiDraw; +import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.screen.viewport.GuiContext; import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.AllArgsConstructor; @@ -61,7 +60,7 @@ public abstract class ProspectorMode { private static final String MATERIAL_PREFIX = "material_"; private final Map> BLOCK_CACHE = new HashMap<>(); - private final Map, IGuiTexture> ICON_CACHE = new HashMap<>(); + private final Map, IIcon> ICON_CACHE = new HashMap<>(); @Override public void scan(Either[][][] storage, LevelChunk chunk) { @@ -94,7 +93,7 @@ public int getItemColor(Either item) { } @Override - public IGuiTexture getItemIcon(Either item) { + public IIcon getItemIcon(Either item) { return ICON_CACHE.computeIfAbsent(item, either -> { List items = either.map(material -> { List oreItems = ChemicalHelper.getItems(new MaterialEntry(TagPrefix.rawOre, material)); @@ -116,11 +115,12 @@ public IGuiTexture getItemIcon(Either item) { } return oreItems; }); - ItemStack[] stacks = items.stream() + ItemDrawable[] drawables = items.stream() .map(itemLike -> itemLike.asItem().getDefaultInstance()) - .toArray(ItemStack[]::new); + .map(ItemDrawable::new) + .toArray(ItemDrawable[]::new); - return new ItemStackTexture(stacks).scale(0.8f); + return new CycleDrawable(drawables).asIcon().size(12); }); } @@ -178,7 +178,7 @@ public void appendTooltips(List[]> items, List tooltips - .add(getDescription(item).copy().append(" --- %s".formatted(count)))); + .add(Component.empty().append(getDescription(item)).append(" --- %s".formatted(count)))); } }; @@ -194,6 +194,10 @@ public static final class FluidInfo { @Setter private int left; + public FluidStack asStack() { + return new FluidStack(this.fluid, this.yield); + } + public static FluidInfo fromNbt(CompoundTag tag) { Fluid fluid = BuiltInRegistries.FLUID.get(new ResourceLocation(tag.getString("fluid"))); int left = tag.getInt("left"); @@ -236,7 +240,7 @@ public void scan(FluidInfo[][][] storage, LevelChunk chunk) { @Override public int getItemColor(FluidInfo item) { - var fluidStack = new FluidStack(item.fluid, item.yield); + var fluidStack = item.asStack(); if (fluidStack.getFluid() == Fluids.LAVA) { return 0xFFFF7000; } @@ -244,13 +248,13 @@ public int getItemColor(FluidInfo item) { } @Override - public IGuiTexture getItemIcon(FluidInfo item) { - return new ItemStackTexture(item.fluid.getBucket()); + public IIcon getItemIcon(FluidInfo item) { + return new FluidDrawable(item.asStack()).asIcon(); } @Override public Component getDescription(FluidInfo item) { - return new FluidStack(item.fluid, item.yield).getDisplayName(); + return item.asStack().getDisplayName(); } @Override @@ -280,7 +284,7 @@ public Class getItemClass() { public void appendTooltips(List items, List tooltips, String selected) { for (var array : items) { for (FluidInfo item : array) { - tooltips.add(getDescription(item).copy() + tooltips.add(Component.empty().append(getDescription(item)) .append(" --- %s (%s%%)".formatted(item.yield, item.left))); } } @@ -288,19 +292,16 @@ public void appendTooltips(List items, List tooltips, St @Override @OnlyIn(Dist.CLIENT) - public void drawSpecialGrid(GuiGraphics graphics, FluidInfo[] items, int x, int y, int width, int height) { - if (items.length > 0) { - var item = items[0]; - double progress = item.left * 1.0 / Math.max(Math.min(item.left, 100), 1); - float drawnU = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnU(progress); - float drawnV = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnV(progress); - float drawnWidth = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnWidth(progress); - float drawnHeight = (float) ProgressTexture.FillDirection.DOWN_TO_UP.getDrawnHeight(progress); - DrawerHelper.drawFluidForGui(graphics, - FluidHelperImpl.toFluidStack(new FluidStack(item.fluid(), item.left)), 100, - (int) (x + drawnU * width), (int) (y + drawnV * height), ((int) (width * drawnWidth)), - ((int) (height * drawnHeight))); + public void drawSpecialGrid(GuiContext context, FluidInfo[] items, int x, int y, int width, int height) { + if (items.length == 0) { + return; } + FluidInfo item = items[0]; + float filled = item.left / Math.max(Math.min(item.left, 100.0f), 1.0f); + + GuiDraw.drawFluidTexture(context.getGraphics(), item.asStack(), + x * width, y + (1.0f - filled) * height, width, height * filled, + context.getCurrentDrawingZ()); } }; @@ -331,7 +332,7 @@ public int getItemColor(BedrockOreInfo item) { } @Override - public IGuiTexture getItemIcon(BedrockOreInfo item) { + public IIcon getItemIcon(BedrockOreInfo item) { Material material = item.material; ItemStack stack = GTUtil.getFirstNonEmpty( ChemicalHelper.get(TagPrefix.get(ConfigHolder.INSTANCE.machines.bedrockOreDropTagPrefix), material), @@ -339,7 +340,7 @@ public IGuiTexture getItemIcon(BedrockOreInfo item) { ChemicalHelper.get(TagPrefix.gem, material), ChemicalHelper.get(TagPrefix.ore, material), ChemicalHelper.get(TagPrefix.dust, material)); - return new ItemStackTexture(stack).scale(0.8f); + return new ItemDrawable(stack).asIcon().size(12); } @Override @@ -379,7 +380,7 @@ public void appendTooltips(List items, List tooltip int totalWeight = Arrays.stream(array).mapToInt(BedrockOreInfo::weight).sum(); for (BedrockOreInfo item : array) { float chance = (float) item.weight / totalWeight * 100; - tooltips.add(getDescription(item).copy() + tooltips.add(Component.empty().append(getDescription(item)) .append(" (") .append(Component.translatable("gtceu.gui.content.chance_base", FormattingUtil.formatNumber2Places(chance))) @@ -401,7 +402,7 @@ public void appendTooltips(List items, List tooltip public abstract int getItemColor(T item); - public abstract IGuiTexture getItemIcon(T item); + public abstract IIcon getItemIcon(T item); public abstract Component getDescription(T item); @@ -416,5 +417,5 @@ public void appendTooltips(List items, List tooltip public abstract void appendTooltips(List items, List tooltips, String selected); @OnlyIn(Dist.CLIENT) - public void drawSpecialGrid(GuiGraphics graphics, T[] items, int x, int y, int width, int height) {} + public void drawSpecialGrid(GuiContext graphics, T[] items, int x, int y, int width, int height) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 1133ea21b9f..b4c1d4f19c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -15,7 +15,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.tag.TagUtil; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.TagPrefixItem; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index fb965cdd1e9..dff1cc89f4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.GTCapability; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index aca5b5c49d7..27b7ed6a1c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -2,19 +2,14 @@ import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; -import com.gregtechceu.gtceu.api.gui.widget.ProspectingMapWidget; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; +import com.gregtechceu.gtceu.api.mui.IItemUIHolder; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.widgets.prospector.ProspectorMapHandler; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; -import com.lowdragmc.lowdraglib.gui.widget.SwitchWidget; - import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -26,6 +21,18 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import brachy.modularui.api.IThemeApi; +import brachy.modularui.drawable.DynamicDrawable; +import brachy.modularui.drawable.UITexture; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.StringValue; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.ButtonWidget; +import brachy.modularui.widgets.DynamicSyncedWidget; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,7 +40,12 @@ import java.util.List; import java.util.Objects; -public class ProspectorScannerBehavior implements IItemUIFactory, IInteractionItem, IAddInformation { +public class ProspectorScannerBehavior implements IItemUIHolder, IInteractionItem, IAddInformation { + + private static final UITexture DARK_MODE_BUTTON_INACTIVE = GTGuiTextures.PROGRESS_BAR_SOLAR_STEEL + .getSubArea(0, 0.5f, 1, 0.5f); + private static final UITexture DARK_MODE_BUTTON_ACTIVE = GTGuiTextures.PROGRESS_BAR_SOLAR_STEEL + .getSubArea(0, 0, 1, 0.5f); private final int radius; private final long cost; @@ -86,25 +98,7 @@ public InteractionResultHolder use(Item item, Level level, Player pla player.sendSystemMessage(Component.translatable("behavior.prospector.not_enough_energy")); return InteractionResultHolder.sidedSuccess(heldItem, level.isClientSide); } - return IItemUIFactory.super.use(item, level, player, usedHand); - } - - @Override - public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer) { - ProspectorMode mode = this.getMode(entityPlayer.getItemInHand(InteractionHand.MAIN_HAND)); - ProspectingMapWidget map = new ProspectingMapWidget<>(4, 4, 332 - 8, 200 - 8, radius, mode, 1); - return new ModularUI(332, 200, holder, entityPlayer) - .background(GuiTextures.BACKGROUND) - .widget(map) - .widget(new SwitchWidget(-20, 4, 18, 18, (cd, pressed) -> map.setDarkMode(pressed)) - .setSupplier(map::isDarkMode) - .setTexture( - new GuiTextureGroup(GuiTextures.BUTTON, - GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(true).copy() - .getSubTexture(0, 0.5, 1, 0.5).scale(0.8f)), - new GuiTextureGroup(GuiTextures.BUTTON, - GuiTextures.PROGRESS_BAR_SOLAR_STEAM.get(true).copy() - .getSubTexture(0, 0, 1, 0.5).scale(0.8f)))); + return IItemUIHolder.super.use(item, level, player, usedHand); } @Override @@ -118,4 +112,56 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List buildUI(PlayerInventoryGuiData guiData, PanelSyncManager panelSyncManager, + UISettings settings) { + ProspectorMode mode = getMode(guiData.getPlayer().getItemInHand(InteractionHand.MAIN_HAND)); + final int diameter = radius * 2 - 1; + + StringValue searchValue = new StringValue(""); + + DynamicSyncedWidget searchList; + + var panel = ModularPanel.defaultPanel("prospector_scanner", 332, 200) + .margin(4) + .child(Flow.col() + .leftRel(1.0f) + .child(new TextFieldWidget() + .value(searchValue) + .height(16) + .widthRel(1f) + .autoUpdateOnChange(true)) + .child(searchList = new DynamicSyncedWidget<>())); + + ProspectorMapHandler mapHandler = new ProspectorMapHandler<>(mode, radius, 1, searchValue, searchList, + panelSyncManager); + + panel.child(Flow.col() + .topRel(0.5f).leftRel(0.0f) + .size(diameter) + .margin(2) + .background(GTGuiTextures.BACKGROUND_INVERSE) + .child(mapHandler) + .child(new ButtonWidget<>().widgetTheme(IThemeApi.BUTTON) + .top(0).leftRelAnchor(0.0f, 1.0f) + .margin(2) + .backgroundOverlay(new DynamicDrawable(() -> { + if (mapHandler.getTexture().isDarkMode()) { + return DARK_MODE_BUTTON_ACTIVE; + } else { + return DARK_MODE_BUTTON_INACTIVE; + } + })) + .onMousePressed((mouseX, mouseY, button) -> { + if (button == 0 || button == 1) { + mapHandler.getTexture().toggleDarkMode(); + return true; + } + return false; + })) + ); + + return panel; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/drawable/CycleDrawable.java b/src/main/java/com/gregtechceu/gtceu/common/mui/drawable/CycleDrawable.java new file mode 100644 index 00000000000..c582b0bf311 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/drawable/CycleDrawable.java @@ -0,0 +1,76 @@ +package com.gregtechceu.gtceu.common.mui.drawable; + +import brachy.modularui.ModularUI; +import brachy.modularui.api.IJsonSerializable; +import brachy.modularui.api.drawable.IDrawable; +import brachy.modularui.screen.viewport.GuiContext; +import brachy.modularui.theme.WidgetTheme; +import brachy.modularui.utils.serialization.json.JsonHelper; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public record CycleDrawable(IDrawable... drawables) implements IDrawable, IJsonSerializable { + + public @Nullable IDrawable getCurrent() { + if (this.drawables.length == 0) return null; + return this.drawables[Math.abs((int) (System.currentTimeMillis() / 1000) % this.drawables.length)]; + } + + @Override + public boolean canApplyTheme() { + IDrawable current = getCurrent(); + return current != null && current.canApplyTheme(); + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + IDrawable current = getCurrent(); + if (current == null) return; + + current.draw(context, x, y, width, height, widgetTheme); + } + + public static IDrawable parseJson(JsonObject json) { + JsonElement drawables = JsonHelper.getJsonElement(json, "drawables", "children"); + if (drawables != null && drawables.isJsonArray()) { + return parseJson(drawables.getAsJsonArray()); + } + ModularUI.LOGGER.throwing( + new JsonParseException("CycleDrawable json should have an array named 'drawables' or 'children'.")); + return IDrawable.EMPTY; + } + + public static IDrawable parseJson(JsonArray drawables) { + List list = new ArrayList<>(); + for (JsonElement child : drawables) { + IDrawable drawable = JsonHelper.deserialize(child, IDrawable.class); + if (drawable != null) { + list.add(drawable); + } + } + if (list.isEmpty()) { + return IDrawable.EMPTY; + } + if (list.size() == 1) { + return list.get(0); + } + return new CycleDrawable(list.toArray(IDrawable[]::new)); + } + + // this method should never be called, but the special casing code is copied here in case it does. + @Override + public boolean saveToJson(JsonObject json) { + JsonArray jsonArray = new JsonArray(); + for (IDrawable drawable : this.drawables()) { + jsonArray.add(JsonHelper.serialize(drawable)); + } + json.add("drawables", jsonArray); + return true; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java new file mode 100644 index 00000000000..ee4d722b6b4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java @@ -0,0 +1,265 @@ +package com.gregtechceu.gtceu.common.mui.widgets.prospector; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectingUpdatePacket; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.common.mui.drawable.BorderDrawable; +import com.gregtechceu.gtceu.integration.map.WaypointManager; +import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; +import com.gregtechceu.gtceu.integration.map.cache.server.ServerCache; +import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.levelgen.Heightmap; + +import brachy.modularui.api.IThemeApi; +import brachy.modularui.api.drawable.IKey; +import brachy.modularui.api.widget.Interactable; +import brachy.modularui.drawable.DynamicDrawable; +import brachy.modularui.utils.Alignment; +import brachy.modularui.value.StringValue; +import brachy.modularui.value.sync.DynamicSyncHandler; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.Widget; +import brachy.modularui.widgets.ButtonWidget; +import brachy.modularui.widgets.DynamicSyncedWidget; +import brachy.modularui.widgets.ListWidget; +import brachy.modularui.widgets.ScrollingTextWidget; +import brachy.modularui.widgets.layout.Flow; +import com.mojang.blaze3d.platform.InputConstants; +import info.journeymap.shaded.org.eclipse.jetty.util.ConcurrentHashSet; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.LinkedBlockingQueue; + +public class ProspectorMapHandler extends Widget> implements Interactable { + + private static final BorderDrawable WHITE_BORDER = new BorderDrawable(0xFFFFFFFF, -1); + + @Getter + private final ProspectorMode mode; + @Getter + private final int chunkRadius; + private final int scanInterval; + + @Getter + private final Player player; + @Getter + private final ChunkPos playerChunkPos; + + private final StringValue searchValue; + private final DynamicSyncHandler syncHandler; + @Getter + private final ProspectorMapTexture texture; + + // runtime + private final Queue> packetQueue = new LinkedBlockingQueue<>(); + private final Set items = new ConcurrentHashSet<>(); + + // runtime + private int chunkIndex = 0; + + public ProspectorMapHandler(ProspectorMode mode, int chunkRadius, int scanInterval, + StringValue searchValue, DynamicSyncedWidget searchListWidget, + PanelSyncManager panelSyncManager) { + super(); + this.mode = mode; + this.chunkRadius = chunkRadius; + this.scanInterval = scanInterval; + + this.searchValue = searchValue; + this.syncHandler = createListSyncHandler(); + searchListWidget.syncHandler(this.syncHandler); + panelSyncManager.onServerTick(this::scanOres); + + this.player = panelSyncManager.getPlayer(); + this.playerChunkPos = player.chunkPosition(); + + this.texture = new ProspectorMapTexture<>(this, this.player.chunkPosition()); + background(this.texture); + } + + private DynamicSyncHandler createListSyncHandler() { + return new DynamicSyncHandler() + .widgetProvider((syncManager, buf) -> { + ProspectingUpdatePacket packet = ProspectingUpdatePacket.read(this.mode, buf); + this.texture.updateTexture(packet); + this.addOresToList(packet.data); + + return new ListWidget<>() + .collapseDisabledChildren() + .expanded() + .widthRel(1f) + .children(this.items, item -> { + String uniqueId = mode.getUniqueId(item); + Component description = mode.getDescription(item); + + return new ButtonWidget<>().widgetTheme(IThemeApi.BUTTON) + .onMousePressed((x, y, button) -> { + if (button == InputConstants.MOUSE_BUTTON_LEFT || button == InputConstants.MOUSE_BUTTON_RIGHT) { + this.texture.setSelected(uniqueId); + return true; + } + return false; + }) + .backgroundOverlay(new DynamicDrawable(() -> { + if (Objects.equals(this.texture.getSelected(), uniqueId)) { + return WHITE_BORDER; + } else { + return null; + } + })) + .child(Flow.row() + .height(15).widthRel(1f) + .padding(2) + .marginBottom(-1) + .widgetTheme(IThemeApi.BUTTON) + .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN) + .setEnabledIf(w -> { + String searched = searchValue.getStringValue(); + if (searched == null) { + return true; + } else { + return description.getString().toLowerCase().contains(searched); + } + }) + .child(mode.getItemIcon(item).asWidget()) + .child(new ScrollingTextWidget(IKey.lang(description)) + .widgetTheme(IThemeApi.BUTTON) + .textAlign(Alignment.CENTER) + .expanded() + .height(16) + .invisible())); + }); + }); + } + + private void scanOres() { + if (!(this.player instanceof ServerPlayer serverPlayer)) return; + + Level level = this.player.level(); + int chunkDiameter = this.chunkRadius * 2 - 1; + + if (getContext().getTick() % this.scanInterval == 0 && this.chunkIndex < chunkDiameter * chunkDiameter) { + int row = this.chunkIndex / chunkDiameter; + int column = this.chunkIndex % chunkDiameter; + + int ox = column - this.chunkRadius + 1; + int oz = row - this.chunkRadius + 1; + + LevelChunk chunk = level.getChunk(this.playerChunkPos.x + ox, this.playerChunkPos.z + oz); + if (mode == ProspectorMode.ORE) { + ServerCache.instance.prospectAllInChunk(level.dimension(), chunk.getPos(), serverPlayer); + } + + ProspectingUpdatePacket packet = new ProspectingUpdatePacket<>(this.playerChunkPos.x + ox, + this.playerChunkPos.z + oz, + mode); + mode.scan(packet.data, chunk); + this.syncHandler.notifyUpdate(packet::writePacketData); + + this.chunkIndex++; + } + } + + private void addOresToList(T[][][] data) { + for (int x = 0; x < mode.cellSize; x++) { + for (int z = 0; z < mode.cellSize; z++) { + Collections.addAll(this.items, data[x][z]); + } + } + } + + @Override + public @NotNull Result onMousePressed(double mouseX, double mouseY, int button) { + if (!WaypointManager.isActive()) return Result.IGNORE; + + WaypointItem clickedItem = getClickedVein(mouseX, mouseY); + if (clickedItem == null) return Result.ACCEPT; + + WaypointManager.setWaypoint(clickedItem.uniqueId, + clickedItem.name.getString(), clickedItem.color, + player.level().dimension(), clickedItem.position); + player.displayClientMessage( + Component.translatable("behavior.prospector.added_waypoint", + clickedItem.name.copy().withStyle(style -> style.withColor(clickedItem.color))), + false); + + Interactable.playButtonClickSound(); + return Result.SUCCESS; + } + + private @Nullable WaypointItem getClickedVein(double mouseX, double mouseY) { + int chunkX = (int) (mouseX - getArea().x()) / 16; + int chunkZ = (int) (mouseY - getArea().y()) / 16; + int offsetX = (int) (mouseX - getArea().x()) % 16; + int offsetZ = (int) (mouseY - getArea().y()) % 16; + int xDiff = chunkX - (this.chunkRadius - 1); + int zDiff = chunkZ - (this.chunkRadius - 1); + + int x = SectionPos.sectionToBlockCoord(player.chunkPosition().x + xDiff) + offsetX; + int z = SectionPos.sectionToBlockCoord(player.chunkPosition().z + zDiff) + offsetZ; + int y = player.level().getHeight(Heightmap.Types.WORLD_SURFACE, x, z); + + if (chunkX < 0 || chunkZ < 0 || chunkX >= this.chunkRadius * 2 - 1 || chunkZ >= this.chunkRadius * 2 - 1) { + return null; + } + + BlockPos pos = new BlockPos(x, y, z); + // If the ores are filtered use its name + if (this.texture.getSelected() != null) { + for (T item : this.items) { + String uniqueId = mode.getUniqueId(item); + if (!this.texture.getSelected().equals(uniqueId)) continue; + + Component name = mode.getDescription(item); + int color = mode.getItemColor(item); + return new WaypointItem(pos, uniqueId, name, color); + } + } + + // If the cursor is over an ore use its name + T[] hoveredItem = this.texture.data + [chunkX * mode.cellSize + (offsetX * mode.cellSize / 16)] + [chunkZ * mode.cellSize + (offsetZ * mode.cellSize / 16)]; + if (hoveredItem != null && hoveredItem.length != 0) { + String uniqueId = mode.getUniqueId(hoveredItem[0]); + Component name = mode.getDescription(hoveredItem[0]); + int color = mode.getItemColor(hoveredItem[0]); + return new WaypointItem(pos, uniqueId, name, color); + } + + // If all else fails see if there's a nearby vein and use the vein's name + if (mode == ProspectorMode.ORE) { + var veins = GTClientCache.instance.getNearbyVeins(player.level().dimension(), pos, 32); + if (veins.isEmpty()) { + return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), 0xFF990000); + } + veins.sort((o1, o2) -> { + int o1Dist = (int) o1.center().distToCenterSqr(x, o1.center().getY(), z); + int o2Dist = (int) o2.center().distToCenterSqr(x, o2.center().getY(), z); + return o1Dist - o2Dist; + }); + String uniqueId = OreRenderLayer.getId(veins.get(0)); + Component name = OreRenderLayer.getName(veins.get(0)); + List materials = veins.get(0).definition().veinGenerator().getAllMaterials(); + Material mostCommonItem = materials.get(materials.size() - 1); + int color = mostCommonItem.getMaterialARGB(); + return new WaypointItem(pos, uniqueId, name, color); + } + + return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), 0xFF990000); + } + + private record WaypointItem(BlockPos position, @Nullable String uniqueId, Component name, int color) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java new file mode 100644 index 00000000000..37b2c532d39 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -0,0 +1,175 @@ +package com.gregtechceu.gtceu.common.mui.widgets.prospector; + +import com.gregtechceu.gtceu.api.mui.prospector.ProspectingUpdatePacket; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.utils.GradientUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.texture.AbstractTexture; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.level.ChunkPos; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import brachy.modularui.api.drawable.IDrawable; +import brachy.modularui.drawable.GuiDraw; +import brachy.modularui.screen.viewport.GuiContext; +import brachy.modularui.theme.WidgetTheme; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.platform.TextureUtil; +import com.mojang.blaze3d.systems.RenderSystem; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.lang.reflect.Array; +import java.util.Objects; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@OnlyIn(Dist.CLIENT) +public class ProspectorMapTexture extends AbstractTexture implements IDrawable { + + private final ProspectorMapHandler mapHandler; + @Getter + private final int imageWidth; + @Getter + private final int imageHeight; + public final T[][][] data; + + @Getter + private @Nullable String selected = null; + @Getter + private boolean darkMode = false; + + public ProspectorMapTexture(ProspectorMapHandler mapHandler, ChunkPos playerChunkPos) { + this.mapHandler = mapHandler; + + int diameter = mapHandler.getChunkRadius() * 2 - 1; + ProspectorMode mode = mapHandler.getMode(); + + this.imageWidth = this.imageHeight = diameter * 16; + // noinspection unchecked + this.data = (T[][][]) Array.newInstance(mode.getItemClass(), + diameter * mode.cellSize, diameter * mode.cellSize, 0); + } + + public void toggleDarkMode() { + this.darkMode = !this.darkMode; + } + + public void updateTexture(ProspectingUpdatePacket packet) { + int ox = packet.chunkX - mapHandler.getPlayerChunkPos().x; + int oz = packet.chunkZ - mapHandler.getPlayerChunkPos().z; + + int currentColumn = (mapHandler.getChunkRadius() - 1) + ox; + int currentRow = (mapHandler.getChunkRadius() - 1) + oz; + if (currentRow < 0) { + return; + } + + ProspectorMode mode = mapHandler.getMode(); + for (int x = 0; x < mode.cellSize; x++) { + System.arraycopy(packet.data[x], 0, data[x + currentColumn * mode.cellSize], currentRow * mode.cellSize, + mode.cellSize); + } + + loadToImage(); + } + + private NativeImage getImage() { + ProspectorMode mode = mapHandler.getMode(); + NativeImage image = new NativeImage(this.imageWidth, this.imageHeight, false); + + for (int x = 0; x < this.imageWidth; x++) { + for (int z = 0; z < this.imageHeight; z++) { + T[] items = this.data[x * mode.cellSize / 16][z * mode.cellSize / 16]; + // draw background color + image.setPixelRGBA(x, z, (darkMode ? 0xFF666666 : 0xFFFFFFFF)); + + // draw items + for (T item : items) { + if (selected != null && !selected.equals(mode.getUniqueId(item))) continue; + + int color = mode.getItemColor(item); + image.setPixelRGBA(x, z, GradientUtil.argbToAbgr(color) | 0xFF000000); + break; + } + // draw grid + if (x % 16 == 0 || z % 16 == 0) { + image.blendPixel(x, z, 0xFF000000); + } + } + } + + return image; + } + + public void loadToImage() { + NativeImage image = getImage(); + TextureUtil.prepareImage(this.getId(), image.getWidth(), image.getHeight()); + // the last parameter is actually autoClose, it's named wrong. + image.upload(0, 0, 0, true); + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + // getId() generates a new texture ID if it's NOT_ASSIGNED, so we shouldn't use that. + if (this.id == NOT_ASSIGNED) return; + + RenderSystem.enableBlend(); + RenderSystem.setShaderTexture(0, this.getId()); + GuiDraw.drawTexture(context.getLastGraphicsPose(), x, y, x + width, y + height, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f); + RenderSystem.disableBlend(); + + // draw special grid (e.g. fluid) + final int diameter = mapHandler.getChunkRadius() * 2 - 1; + for (int cx = 0; cx < diameter; cx++) { + for (int cz = 0; cz < diameter; cz++) { + if (this.data[cx][cz] != null && this.data[cx][cz].length > 0) { + var items = this.data[cx][cz]; + mapHandler.getMode().drawSpecialGrid(context, items, x + cx * 16 + 1, y + cz * 16 + 1, 16, 16); + } + } + } + + // player rotation & red lines are drawn separately + /* + + TransformTexture arrow = ARROW.rotate(this.direction / 2); + arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); + + // draw red vertical line + if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { + DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); + } else { + DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); + } + // draw red horizontal line + if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { + DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); + } else { + DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); + } + */ + } + + @Override + public void load(ResourceManager resourceManager) throws IOException {} + + public void setDarkMode(boolean darkMode) { + if (this.darkMode != darkMode) { + this.darkMode = darkMode; + loadToImage(); + } + } + + public void setSelected(String uniqueID) { + if (!Objects.equals(this.selected, uniqueID)) { + this.selected = uniqueID; + loadToImage(); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java index 0beb48db846..c3a7b25a6f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.network.packets.prospecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java index b0596119290..6c9687b38b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.network.packets.prospecting; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java index 407ac91000b..c343ede62be 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.MapRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java index 23f9cc6377e..b28f7f116a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksRenderer; import com.gregtechceu.gtceu.integration.map.journeymap.JourneymapRenderer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java index 562f55e4bc3..6504dff1c17 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.cache.client; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.cache.DimensionCache; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java index d3b44201b1f..00ae1f3dea7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.map.cache.fluid; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java index b16417afc22..b393c8ab866 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.ftbchunks; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.fluid.FluidVeinIcon; import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.ore.OreVeinIcon; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java index eadab7935b9..8c47a5ad0ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.ftbchunks.veins.fluid; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksOptions; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java index 88ef4d1d521..7fa18f4f82b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.WaypointManager; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java index da8b36bc92a..2cd2af6253a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.map.layer.builtin; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.MapRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java index 42223876626..59ba7294d88 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.xaeros; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java index 72a3a1b5655..4711a0810c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java index c6d4c8f2463..300e7564c6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.gui.misc.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; From b7b44c3c384efce8cee77825a72ba134c21fb186 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 4 May 2026 19:43:24 +0300 Subject: [PATCH 07/15] Minor simplification that happened to be on the branch I copied most of this from --- .../integration/map/IWaypointHandler.java | 3 ++- .../integration/map/WaypointManager.java | 26 +++++++++---------- .../ftbchunks/FTBChunksWaypointHandler.java | 5 ++-- .../journeymap/JourneymapWaypointHandler.java | 4 +-- .../map/xaeros/XaeroWaypointHandler.java | 6 +++-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/IWaypointHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/map/IWaypointHandler.java index ee90a58ce4d..7529fc5153c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/IWaypointHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/IWaypointHandler.java @@ -1,11 +1,12 @@ package com.gregtechceu.gtceu.integration.map; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; public interface IWaypointHandler { - void setWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, int z); + void setWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos); void removeWaypoint(String key); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/WaypointManager.java b/src/main/java/com/gregtechceu/gtceu/integration/map/WaypointManager.java index 48f7e72ed29..0e4577d3b7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/WaypointManager.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/WaypointManager.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -52,12 +53,12 @@ public static void updateDimension(LevelAccessor dim) { } } - public static void setWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, int z) { + public static void setWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos) { if (dim == null) dim = currentDimension; for (IWaypointHandler handler : handlers) { - handler.setWaypoint(key, name, color, dim, x, y, z); + handler.setWaypoint(key, name, color, dim, pos); } - waypoints.put(key, new WaypointKey(dim, x, y, z)); + waypoints.put(key, new WaypointKey(dim, pos)); } public static void removeWaypoint(String key) { @@ -67,14 +68,13 @@ public static void removeWaypoint(String key) { waypoints.remove(key); } - public static boolean toggleWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, - int z) { + public static boolean toggleWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos) { if (dim == null) dim = currentDimension; - if ((new WaypointKey(dim, x, y, z)).equals(waypoints.get(key))) { + if ((new WaypointKey(dim, pos)).equals(waypoints.get(key))) { removeWaypoint(key); return false; } - setWaypoint(key, name, color, dim, x, y, z); + setWaypoint(key, name, color, dim, pos); return true; } @@ -85,13 +85,11 @@ public static void registerWaypointHandler(IWaypointHandler handler) { private static class WaypointKey { ResourceKey dim; - int x, y, z; + BlockPos pos; - public WaypointKey(ResourceKey dim, int x, int y, int z) { + public WaypointKey(ResourceKey dim, BlockPos pos) { this.dim = dim; - this.x = x; - this.y = y; - this.z = z; + this.pos = pos; } @Override @@ -99,12 +97,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; WaypointKey that = (WaypointKey) o; - return dim == that.dim && x == that.x && y == that.y && z == that.z; + return this.dim == that.dim && this.pos.equals(that.pos); } @Override public int hashCode() { - return GTMath.hashInts(dim.hashCode(), x, y, z); + return GTMath.hashInts(dim.hashCode(), pos.hashCode()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksWaypointHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksWaypointHandler.java index 946a45bab74..b0c0a9cb386 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksWaypointHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksWaypointHandler.java @@ -17,10 +17,9 @@ public class FTBChunksWaypointHandler implements IWaypointHandler { private static final Map waypoints = new Object2ObjectOpenHashMap<>(); @Override - public void setWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, int z) { + public void setWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos) { FTBChunksAPI.clientApi().getWaypointManager() - .map(manager -> manager.addWaypointAt( - new BlockPos(x, y, z), name).setColor(color).setHidden(false)) + .map(manager -> manager.addWaypointAt(pos, name).setColor(color).setHidden(false)) .map(waypoint -> waypoints.put(key, waypoint)); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapWaypointHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapWaypointHandler.java index 964d8b616e0..8b2db333864 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapWaypointHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapWaypointHandler.java @@ -17,8 +17,8 @@ public class JourneymapWaypointHandler implements IWaypointHandler { private static final Map waypoints = new Object2ObjectOpenHashMap<>(); @Override - public void setWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, int z) { - Waypoint waypoint = new Waypoint(GTCEu.MOD_ID, name, dim, new BlockPos(x, y, z)) + public void setWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos) { + Waypoint waypoint = new Waypoint(GTCEu.MOD_ID, name, dim, pos) .setPersistent(true) .setColor(color); waypoints.put(key, waypoint); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaeroWaypointHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaeroWaypointHandler.java index ba43c37a4a8..4bfdd548f65 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaeroWaypointHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaeroWaypointHandler.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.integration.map.IWaypointHandler; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraftforge.common.util.Lazy; @@ -23,9 +24,10 @@ public class XaeroWaypointHandler implements IWaypointHandler { private final List knownKeys = new ObjectArrayList<>(); @Override - public void setWaypoint(String key, String name, int color, ResourceKey dim, int x, int y, int z) { + public void setWaypoint(String key, String name, int color, ResourceKey dim, BlockPos pos) { waypoints.get().put(getIndex(key), - new WaypointWithDimension(dim, x, y, z, name, name.substring(0, 1), WaypointColor.WHITE)); + new WaypointWithDimension(dim, pos.getX(), pos.getY(), pos.getZ(), + name, name.substring(0, 1), WaypointColor.WHITE)); } @Override From 60bea5fc2fc96aa55d7591b66685fb92aabc90e2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 4 May 2026 19:50:01 +0300 Subject: [PATCH 08/15] dtngn nd sprthlss --- .../resources/assets/gtceu/lang/en_ud.json | 167 ++++++++++++------ .../resources/assets/gtceu/lang/en_us.json | 167 ++++++++++++------ .../gtceu/common/data/GTItems.java | 2 +- .../behavior/PortableScannerBehavior.java | 2 +- .../behavior/ProspectorScannerBehavior.java | 5 +- .../prospector/ProspectorMapHandler.java | 11 +- .../prospector/ProspectorMapTexture.java | 32 ++-- 7 files changed, 249 insertions(+), 137 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 7858d203325..68491cac08e 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -14,7 +14,6 @@ "behavior.portable_scanner.debug_lag_count": "˙ɹǝʌɹǝS ǝɥʇ uo )sɯ%s uɐɥʇ ɹǝbuoן buıʞɐʇ buıɥʇʎuɐ( sbuıuɹɐM ǝʞıdS bɐꞀ %s pǝsnɐƆ", "behavior.portable_scanner.debug_machine": "%s :ᗡI-ɐʇǝW", "behavior.portable_scanner.debug_machine_invalid": "¡pıןɐʌuı ", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": "¡ןןnu ", "behavior.portable_scanner.debug_machine_valid": "pıןɐʌ ", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :NI xɐW", @@ -1140,6 +1139,8 @@ "block.gtceu.substation_capacitor.tooltip_filled": "∩Ǝ %dɟ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", "block.gtceu.superconducting_coil": "ʞɔoןᗺ ןıoƆ buıʇɔnpuoɔɹǝdnS", "block.gtceu.tempered_glass": "ssɐן⅁ pǝɹǝdɯǝ⟘", + "block.gtceu.test_mui": "ınW ʇsǝ⟘", + "block.gtceu.test_mui_new": "ʍǝN ınW ʇsǝ⟘", "block.gtceu.the_end_marker": "puƎ ǝɥ⟘", "block.gtceu.the_nether_marker": "ɹǝɥʇǝN ǝɥ⟘", "block.gtceu.titanium_crate": "ǝʇɐɹƆ ɯnıuɐʇı⟘", @@ -1764,7 +1765,6 @@ "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "ǝpıSʇndʇnOɯoɹℲspınןℲʇnduIsɯnɹᗡʍoןןɐ", "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", @@ -1785,7 +1785,9 @@ "config.gtceu.option.coloredWireOutline": "ǝuıןʇnOǝɹıMpǝɹoןoɔ", "config.gtceu.option.compat": "ʇɐdɯoɔ", "config.gtceu.option.createCompat": "ʇɐdɯoƆǝʇɐǝɹɔ", + "config.gtceu.option.cursorColor": "ɹoןoƆɹosɹnɔ", "config.gtceu.option.debug": "bnqǝp", + "config.gtceu.option.debugUI": "I∩bnqǝp", "config.gtceu.option.debugWorldgen": "uǝbpןɹoMbnqǝp", "config.gtceu.option.defaultPaintingColor": "ɹoןoƆbuıʇuıɐԀʇןnɐɟǝp", "config.gtceu.option.defaultUIColor": "ɹoןoƆI∩ʇןnɐɟǝp", @@ -1813,6 +1815,7 @@ "config.gtceu.option.energyUsageMultiplier": "ɹǝıןdıʇןnWǝbɐs∩ʎbɹǝuǝ", "config.gtceu.option.environmentalHazardDecayRate": "ǝʇɐᴚʎɐɔǝᗡpɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", "config.gtceu.option.environmentalHazards": "spɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", + "config.gtceu.option.escRestoresLastText": "ʇxǝ⟘ʇsɐꞀsǝɹoʇsǝᴚɔsǝ", "config.gtceu.option.euToFeRatio": "oıʇɐᴚǝℲo⟘nǝ", "config.gtceu.option.extractorRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɹoʇɔɐɹʇxǝ", "config.gtceu.option.feToEuRatio": "oıʇɐᴚnƎo⟘ǝɟ", @@ -1864,6 +1867,7 @@ "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", "config.gtceu.option.minerSpeed": "pǝǝdSɹǝuıɯ", "config.gtceu.option.minimap": "dɐɯıuıɯ", + "config.gtceu.option.mui": "ınɯ", "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", "config.gtceu.option.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", "config.gtceu.option.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", @@ -1884,6 +1888,7 @@ "config.gtceu.option.oreVeinGridSize": "ǝzıSpıɹ⅁uıǝΛǝɹo", "config.gtceu.option.oreVeinRandomOffset": "ʇǝsɟɟOɯopuɐᴚuıǝΛǝɹo", "config.gtceu.option.oreVeins": "suıǝΛǝɹo", + "config.gtceu.option.outlineColor": "ɹoןoƆǝuıןʇno", "config.gtceu.option.ownerOPBypass": "ssɐdʎᗺԀOɹǝuʍo", "config.gtceu.option.prospectorEnergyUseMultiplier": "ɹǝıןdıʇןnWǝs∩ʎbɹǝuƎɹoʇɔǝdsoɹd", "config.gtceu.option.quantumTank": "ʞuɐ⟘ɯnʇuɐnb", @@ -1897,14 +1902,28 @@ "config.gtceu.option.renderGrowingPlants": "sʇuɐןԀbuıʍoɹ⅁ɹǝpuǝɹ", "config.gtceu.option.renderer": "ɹǝɹǝpuǝɹ", "config.gtceu.option.replaceMinedBlocksWith": "ɥʇıMsʞɔoןᗺpǝuıWǝɔɐןdǝɹ", + "config.gtceu.option.replaceVanillaTooltips": "sdıʇןoo⟘ɐןןıuɐΛǝɔɐןdǝɹ", "config.gtceu.option.replaceWithCobbleVersion": "uoısɹǝΛǝןqqoƆɥʇıMǝɔɐןdǝɹ", "config.gtceu.option.requireGTToolsForBlocks": "sʞɔoןᗺɹoℲsןoo⟘⟘⅁ǝɹınbǝɹ", "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", + "config.gtceu.option.scale": "ǝןɐɔs", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", + "config.gtceu.option.showExtra": "ɐɹʇxƎʍoɥs", + "config.gtceu.option.showHovered": "pǝɹǝʌoHʍoɥs", + "config.gtceu.option.showOutline": "ǝuıןʇnOʍoɥs", + "config.gtceu.option.showParent": "ʇuǝɹɐԀʍoɥs", + "config.gtceu.option.showParentOutline": "ǝuıןʇnOʇuǝɹɐԀʍoɥs", + "config.gtceu.option.showParentPos": "soԀʇuǝɹɐԀʍoɥs", + "config.gtceu.option.showParentSize": "ǝzıSʇuǝɹɐԀʍoɥs", + "config.gtceu.option.showParentWidgetTheme": "ǝɯǝɥ⟘ʇǝbpıMʇuǝɹɐԀʍoɥs", + "config.gtceu.option.showPos": "soԀʍoɥs", + "config.gtceu.option.showSize": "ǝzıSʍoɥs", + "config.gtceu.option.showWidgetTheme": "ǝɯǝɥ⟘ʇǝbpıMʍoɥs", "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", + "config.gtceu.option.smoothProgressBar": "ɹɐᗺssǝɹboɹԀɥʇooɯs", "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", "config.gtceu.option.solidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןos", "config.gtceu.option.sprayCanChainLength": "ɥʇbuǝꞀuıɐɥƆuɐƆʎɐɹds", @@ -1916,17 +1935,21 @@ "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", "config.gtceu.option.tankItemFluidPreview": "ʍǝıʌǝɹԀpınןℲɯǝʇIʞuɐʇ", "config.gtceu.option.temperaturesInCelsius": "snısןǝƆuIsǝɹnʇɐɹǝdɯǝʇ", + "config.gtceu.option.textColor": "ɹoןoƆʇxǝʇ", "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.toggle": "ǝןbboʇ", "config.gtceu.option.toolCraftingSounds": "spunoSbuıʇɟɐɹƆןooʇ", "config.gtceu.option.toolUseSounds": "spunoSǝs∩ןooʇ", "config.gtceu.option.tools": "sןooʇ", + "config.gtceu.option.tooltipPos": "soԀdıʇןooʇ", "config.gtceu.option.treeFellingDelay": "ʎɐןǝᗡbuıןןǝℲǝǝɹʇ", "config.gtceu.option.tungstensteelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", "config.gtceu.option.tungstensteelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", + "config.gtceu.option.ui": "ın", "config.gtceu.option.universalHazards": "spɹɐzɐHןɐsɹǝʌıun", "config.gtceu.option.updateIntervals": "sןɐʌɹǝʇuIǝʇɐpdn", + "config.gtceu.option.useDarkThemeByDefault": "ʇןnɐɟǝᗡʎᗺǝɯǝɥ⟘ʞɹɐᗡǝsn", "config.gtceu.option.useVBO": "OᗺΛǝsn", "config.gtceu.option.voltageTierAdvImpeller": "ɹǝןןǝdɯIʌpⱯɹǝı⟘ǝbɐʇןoʌ", "config.gtceu.option.voltageTierAdvNanoSuit": "ʇınSouɐNʌpⱯɹǝı⟘ǝbɐʇןoʌ", @@ -2037,20 +2060,18 @@ "cover.conveyor.transfer_rate": "ɔǝs/sɯǝʇıㄥ§", "cover.detector_base.message_inverted_state": "pǝʇɹǝʌuI :snʇɐʇS buıɹoʇıuoW", "cover.detector_base.message_normal_state": "ןɐɯɹoN :snʇɐʇS buıɹoʇıuoW", - "cover.ender_fluid_link.incomplete_hex.0": "¡ǝʇǝןdɯoɔuı sı ɹoןoɔ pǝʇʇnduI", - "cover.ender_fluid_link.incomplete_hex.1": ")sʇıbıp xǝɥ 8 ןןɐ( ǝʇǝןdɯoɔ ǝɔuo pǝıןddɐ ǝq ןןıʍ ʇI", - "cover.ender_fluid_link.incomplete_hex.2": "¡sʇıpǝ ǝsoן ןןıʍ ınb ǝɥʇ buısoןƆ", "cover.ender_fluid_link.iomode.disabled": "pǝןqɐsıᗡ O/I", "cover.ender_fluid_link.iomode.enabled": "pǝןqɐuƎ O/I", - "cover.ender_fluid_link.private.tooltip.disabled.0": "ǝpoɯ ʞuɐʇ ǝʇɐʌıɹd oʇ ɥɔʇıʍS", - "cover.ender_fluid_link.private.tooltip.disabled.1": "ɹǝʌoɔ ǝɥʇ pǝɔɐןd ʎןןɐuıbıɹo oɥʍ ɹǝʎɐןd ǝɥʇ sǝsn ǝpoɯ ǝʇɐʌıɹԀ", - "cover.ender_fluid_link.private.tooltip.enabled": "ǝpoɯ ʞuɐʇ ɔıןqnd oʇ ɥɔʇıʍS", "cover.ender_fluid_link.title": "ʞuıꞀ pınןℲ ɹǝpuƎ", - "cover.ender_fluid_link.tooltip.channel_description": "ʇxǝʇ ʇnduı ɥʇıʍ uoıʇdıɹɔsǝp ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.channel_name": "ʇxǝʇ ʇnduı ɥʇıʍ ǝɯɐu ןǝuuɐɥɔ ʇǝS", - "cover.ender_fluid_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", - "cover.ender_fluid_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", "cover.ender_item_link.title": "ʞuıꞀ ɯǝʇI ɹǝpuƎ", + "cover.ender_link.description_empty": "uoıʇdıɹɔsǝᗡ ʎʇdɯƎ", + "cover.ender_link.private.tooltip": "ɹǝʌoɔ sıɥʇ pǝɔɐןd oɥʍ ɹǝʎɐןd ǝɥʇ oʇ ǝןqıssǝɔɔɐ ʎןuO :ǝpoɯ ǝʇɐʌıɹԀ", + "cover.ender_link.protected.tooltip": "˙ɯɐǝʇ ǝɯɐs ǝɥʇ uo sɹǝʎɐןd oʇ ǝןqıssǝɔɔⱯ :ǝpoW pǝʇɔǝʇoɹԀ", + "cover.ender_link.public.tooltip": "sɹǝʎɐןd ןןɐ oʇ ǝןqıssǝɔɔⱯ :ǝpoɯ ɔıןqnԀ", + "cover.ender_link.tooltip.channel_description": "uoıʇdıɹɔsǝp ןǝuuɐɥƆ", + "cover.ender_link.tooltip.channel_name": ")ǝnןɐʌ ןɐɯıɔǝpɐxǝɥ ʇıq-ᄅƐ( ᗡI ןǝuuɐɥƆ", + "cover.ender_link.tooltip.clear_button": "uoıʇdıɹɔsǝp ןǝuuɐɥɔ ɹɐǝןƆ", + "cover.ender_link.tooltip.list_button": "ʇsıן ןǝuuɐɥɔ ʍoɥS", "cover.ender_redstone_link.title": "ʞuıꞀ ǝuoʇspǝᴚ ɹǝpuƎ", "cover.filter.blacklist.disabled": "ʇsıןǝʇıɥM", "cover.filter.blacklist.enabled": "ʇsıןʞɔɐןᗺ", @@ -2088,6 +2109,7 @@ "cover.item_smart_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", "cover.item_smart_filter.filtering_mode.sifter": "ɹǝʇɟıS", "cover.item_smart_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", + "cover.machine_controller.control": "ʇǝbɹɐ⟘ ɹǝןןoɹʇuoƆ", "cover.machine_controller.invert.disabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝʞɐǝʍ ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§ןɐɯɹoNǝ§", "cover.machine_controller.invert.enabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝbuoɹʇs ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§pǝʇɹǝʌuIǝ§", "cover.machine_controller.inverted": "pǝʇɹǝʌuI", @@ -2151,9 +2173,9 @@ "cover.voiding.voiding_mode.void_any": "buıɥɔʇɐW pıoΛ", "cover.voiding.voiding_mode.void_overflow": "ʍoןɟɹǝʌO pıoΛ", "curios.identifier.gtceu_magnet": "ʇǝubɐW nƎƆ⟘⅁", - "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ uǝǝq sɐɥ %s", + "death.attack.gtceu.axe": "%s ʎq pǝddoɥɔ sɐʍ %s", "death.attack.gtceu.butchery_knife": "%s ʎq pǝɹǝɥɔʇnq sɐʍ %s", - "death.attack.gtceu.buzzsaw": "%s ʎq pǝzznq ʇob %s", + "death.attack.gtceu.buzzsaw": "%s ʎq pǝzznq sɐʍ %s", "death.attack.gtceu.chainsaw_lv": "%s ʎq pǝɹɔɐssɐɯ sɐʍ %s", "death.attack.gtceu.chemical": "ʇuǝpıɔɔɐ ןɐɔıɯǝɥɔ ɐ pɐɥ %s", "death.attack.gtceu.crowbar": "%s oʇ ǝɟıן ɐ ɟןɐɥ ʇsoן %s", @@ -2163,8 +2185,6 @@ "death.attack.gtceu.drill_lv": "%s ʎq ΛᄅƐ ɥʇıʍ pǝןןıɹp sɐʍ %s", "death.attack.gtceu.drill_mv": "%s ʎq Λ8ᄅƖ ɥʇıʍ pǝןןıɹp sɐʍ %s", "death.attack.gtceu.electric": "pǝʇnɔoɹʇɔǝןǝ sɐʍ %s", - "death.attack.gtceu.explosion": "pǝpoןdxǝ %s", - "death.attack.gtceu.explosion.player": "%s ɟo dןǝɥ ɥʇıʍ pǝpoןdxǝ %s", "death.attack.gtceu.file": "%s ʎq ,pɐǝᗡ, ɹoɟ ᗡ pǝןıɟ uǝǝq sɐɥ %s", "death.attack.gtceu.frost": "sɔıuǝboʎɹɔ pǝɹoןdxǝ %s", "death.attack.gtceu.hammer": "%s ʎq pǝɥsɐnbs sɐʍ %s", @@ -2172,7 +2192,7 @@ "death.attack.gtceu.heat.player": "%s ʎq ǝʌıןɐ pǝןıoq sɐʍ %s", "death.attack.gtceu.hoe": "%s ʎq pǝןןıʇ pɐǝɥ ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.knife": "%s ʎq pǝʞod ʎןʇuǝb sɐʍ %s", - "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ ʇob %s", + "death.attack.gtceu.mallet": "%s ʎq ɥʇɐǝp oʇ pǝɹǝɯɯɐɥ sɐʍ %s", "death.attack.gtceu.medical_condition/arsenicosis": "buıuosıod ɔıuǝsɹɐ ʇob %s", "death.attack.gtceu.medical_condition/asbestosis": "ɐɯoıןǝɥʇosǝɯ ʇob %s", "death.attack.gtceu.medical_condition/berylliosis": "ʎןıpǝǝɹb ooʇ ʇıq ɐ spןɐɹǝɯǝ pǝuıɯ %s", @@ -2188,18 +2208,18 @@ "death.attack.gtceu.medical_condition/weak_poison": "pɐǝן ǝʇɐ %s", "death.attack.gtceu.mining_hammer": "%s ʎq ǝɹO ɹoɟ uǝʞɐʇsıɯ sɐʍ %s", "death.attack.gtceu.mortar": "%s ʎq ʇsnp oʇ punoɹb sɐʍ %s", - "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ ʇob %s", + "death.attack.gtceu.pickaxe": "%s ʎq pǝuıɯ sɐʍ %s", "death.attack.gtceu.radiation": "ʍou ʎoظ ɥʇıʍ sʍoןb %s", "death.attack.gtceu.screwdriver": "¡ǝɯıʇ ʇsɐן ǝɥʇ ɹoɟ %s ɥʇıʍ pǝʍǝɹɔs sɐɥ %s", "death.attack.gtceu.screwdriver_lv": "%s ʎq pǝʌoɯǝɹ sʍǝɹɔs ɹıǝɥʇ pɐɥ %s", "death.attack.gtceu.scythe": "%s ʎq uǝʞɐʇ ןnos ɹıǝɥʇ pɐɥ %s", - "death.attack.gtceu.shovel": "%s ʎq dn bnp ʇob %s", - "death.attack.gtceu.spade": "%s ʎq pǝʇɐʌɐɔxǝ ʇob %s", + "death.attack.gtceu.shovel": "%s ʎq dn bnp sɐʍ %s", + "death.attack.gtceu.spade": "%s ʎq pǝʇɐʌɐɔxǝ sɐʍ %s", "death.attack.gtceu.turbine": "ǝuıqɹnʇ ɐ oʇuı pɐǝɥ ɹıǝɥʇ ʇnd %s", "death.attack.gtceu.wire_cutter": "%s ɟo ǝuıɥɔɐW ʇɹoddnS ǝɟıꞀ ǝɥʇ ɹoɟ ǝןqɐɔ ǝɥʇ ʇnɔ sɐɥ %s", "death.attack.gtceu.wrench": "¡ɥɔuǝɹM ǝɥʇ ɥʇıʍ ʞɔɐɥʍ ɐ %s ǝʌɐb %s", "death.attack.gtceu.wrench_hv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", - "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹM ʎǝʞuoW ɐ pɐɥ %s", + "death.attack.gtceu.wrench_iv": "%s ʎq suɐןd ɹıǝɥʇ oʇuı uʍoɹɥʇ ɥɔuǝɹʍ ɐ pɐɥ %s", "death.attack.gtceu.wrench_lv": "%s ʎq pǝuǝsooן ǝɹǝʍ sǝdıd s,%s", "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", "enchantment.damage.disjunction": "uoıʇɔunظsıᗡ", @@ -2245,6 +2265,10 @@ "gtceu.canner": "ɹǝuuɐƆ", "gtceu.central_monitor.gui.create_group": "dnoɹb ǝʇɐǝɹƆ", "gtceu.central_monitor.gui.currently_editing": "%s :buıʇıpǝ ʎןʇuǝɹɹnƆ", + "gtceu.central_monitor.gui.data_slot": "ʞɔıʇs ɐʇɐp ɟo ɹǝqɯnu ʇoןs ʇǝS", + "gtceu.central_monitor.gui.group_editor": "dnoɹb ɹoʇıuoɯ buıʇıpƎ", + "gtceu.central_monitor.gui.group_name": ":ǝɯɐN", + "gtceu.central_monitor.gui.monitor_groups": "sdnoɹb ɹoʇıuoW", "gtceu.central_monitor.gui.remove_from_group": "dnoɹb ɯoɹɟ ǝʌoɯǝᴚ", "gtceu.central_monitor.gui.set_target": "ʇǝbɹɐʇ ʇǝS", "gtceu.central_monitor.info_tooltip.0": "˙ʇı uı ǝןnpoɯ Ɩ ǝʌɐɥ ʎןuo ʎɐɯ dnoɹb Ɐ ˙ʇsɹıɟ sdnoɹb oʇuı ɯǝɥʇ ʇıןds oʇ ǝʌɐɥ noʎ 'sɹoʇıuoɯ ǝsn oʇ ɹǝpɹo uI", @@ -2301,7 +2325,8 @@ "gtceu.creative.chest.ipc": "ǝןɔʎƆ ɹǝd sɯǝʇI", "gtceu.creative.chest.item": "ɯǝʇI", "gtceu.creative.chest.tpc": "ǝןɔʎƆ ɹǝd sʞɔı⟘", - "gtceu.creative.computation.average": "ʇ∩MƆ pǝʇsǝnbǝᴚ ǝbɐɹǝʌⱯ", + "gtceu.creative.computation.average": "%d :ʞɔıʇ/∩MƆ ǝbɐɹǝʌⱯ", + "gtceu.creative.computation.max_usage": ":ʞɔıʇ/∩MƆ xɐW", "gtceu.creative.energy.amperage": "ǝbɐɹǝdɯⱯ", "gtceu.creative.energy.sink": "ʞuıS", "gtceu.creative.energy.source": "ǝɔɹnoS", @@ -2381,10 +2406,24 @@ "gtceu.gui.adv_stocking_config.title": "buıʞɔoʇS ɔıʇɐɯoʇnⱯ ǝɹnbıɟuoƆ", "gtceu.gui.all_voiding": "ןןⱯɔ§ buıpıoΛㄥ§", "gtceu.gui.auto_output.name": "oʇnɐ", + "gtceu.gui.central_monitor.data_hatch_target": "˙pɐǝʇsuı ʇǝbɹɐʇ ǝɥʇ pǝɹǝpısuoɔ ǝq ןןıʍ )ɹǝʌoɔ ɹǝʇʇıɯsuɐɹʇ ssǝןǝɹıʍ ɐ buıʞɔıןɔ-ʇɥbıɹ ɐıʌ( oʇ pǝʞuıן sı ʇoןs pǝıɟıɔǝds ǝɥʇ uı ʞɔıʇs ɐʇɐp ǝɥʇ ʇɐɥʇ ʞɔoןq ǝɥʇ uǝɥ⟘ ˙ɹǝqɯnu ʇoןs ɐ ɹǝʇuǝ oʇ pǝʇdɯoɹd ǝq ןןıʍ noʎ 'ʇǝbɹɐʇ ɐ sɐ ɥɔʇɐɥ ɐʇɐp ɐ ʇɔǝןǝs noʎ ɟI", "gtceu.gui.central_monitor.group": "%s :dnoɹ⅁", "gtceu.gui.central_monitor.group_default_name": "%d# dnoɹ⅁", - "gtceu.gui.central_monitor.none": "ǝuou", + "gtceu.gui.central_monitor.gui_module_info": "˙ɹoʇıpǝ dnoɹb ɹoʇıuoɯ ǝɥʇ uı ʇǝbɹɐʇ ɐ ʇɔǝןǝs 'ɯoɹɟ I∩⅁ ǝɥʇ ʇǝb oʇ ʞɔoןq ɐ ʇɔǝןǝs o⟘", + "gtceu.gui.central_monitor.help": ":suoıʇɔǝןǝs ɟo sǝdʎʇ ǝɹɐ ǝɹǝɥ 'xoqʇxǝʇ ǝɯɐu dnoɹb ǝɥʇ ʍoןǝq pıɹb ǝɥʇ uı ɹoʇıuoɯ Ɩ ʇsɐǝן ʇɐ ʇɔǝןǝs oʇ ǝʌɐɥ noʎ uǝɥ⟘\n)ʎɐןdsıp oʇ ʇxǝʇ ǝɥʇ ɹǝʇuǝ ʇsnظ ǝןdɯɐxǝ ɹoɟ( ǝןnpoɯ ǝɥʇ ǝɹnbıɟuoɔ oʇ ɹɐǝddɐ ןןıʍ uoʇʇnq ɐ 'ʇı ʇɹǝsuı noʎ uǝɥM\n˙xoqʇxǝʇ ǝɯɐu dnoɹb ǝɥʇ ɟo ʇɥbıɹ ǝɥʇ oʇ ʇoןs ǝɥʇ uı pǝʇɹǝsuı ǝq ʇsnɯ ǝןnpoɯ Ɐ\nǝןnpoɯ ɹoʇıuoɯ pǝɹnbıɟuoɔ puɐ pǝʇɹǝsuı uɐ - \nuo buıɥʇǝɯos ʎɐןdsıp oʇ ʇuɐʍ noʎ ʇɐɥʇ sɹoʇıuoɯ ǝɥʇ ʇɔǝןǝs oʇ noʎ - \n:sbuıɥʇ ᄅ spǝǝu ʇı 'buıɥʇʎuɐ ʎɐןdsıp oʇ dnoɹb ɐ ɹoℲ\n˙ʞɔoןqıʇןnɯ ǝɥʇ uı sɹoʇıuoɯ ɟo ʇunoɯɐ ʎuɐ ɟo uoıʇɔǝןןoɔ ɐ sı dnoɹb ɹoʇıuoɯ Ɐ", + "gtceu.gui.central_monitor.in_group": "ɟɟnʇs ʎɐןdsıp oʇ pǝsn ǝq ןןıʍ puɐ 'dnoɹb ǝɥʇ oʇ pǝppɐ ǝɹɐ ʎɐʍ sıɥʇ pǝʇɔǝןǝs sɹoʇıuoW", + "gtceu.gui.central_monitor.in_group_and_target": "˙ǝɯıʇ ǝɯɐs ǝɥʇ ʇɐ ʇǝbɹɐʇ ɐ sɐ puɐ buıʎɐןdsıp ɹoɟ pǝsn sı ʎɐʍ sıɥʇ pǝʇɔǝןǝs ɹoʇıuoɯ ǝɥ⟘", + "gtceu.gui.central_monitor.left_click": "ʇı buıʞɔıןɔ-ʇɟǝן ʎq ɹoʇıuoɯ ɐ ʇɔǝןǝsun/ʇɔǝןǝS", + "gtceu.gui.central_monitor.module_editor_button": "ǝןnpoɯ ʇıpƎ", + "gtceu.gui.central_monitor.module_editor_disabled": "ʇı ʇıpǝ oʇ I∩⅁ sıɥʇ uǝdo-ǝɹ ǝsɐǝןd 'ǝןnpoɯ ǝɥʇ pǝbuɐɥɔ ʎןʇuǝɔǝɹ noʎ", + "gtceu.gui.central_monitor.pause": "˙unɹ ǝq ʇ,uoʍ ǝpoɔ puɐ 'pǝʇɐpdn ǝq ʇ,uoʍ ʇxǝ⟘\n˙uoıʇnɔǝxǝ ɹǝpןoɥǝɔɐןd ǝsnɐԀ", + "gtceu.gui.central_monitor.resume": "˙uoıʇnɔǝxǝ ɹǝpןoɥǝɔɐןd ǝsnɐdu∩", + "gtceu.gui.central_monitor.right_click": "˙ʇǝbɹɐʇ ɐ ǝq uɐɔ ʞɔoןq Ɩ ʎןuO ˙ʇı buıʞɔıןɔ-ʇɥbıɹ ʎq ʞɔoןq ɐ ʇɔǝןǝS", + "gtceu.gui.central_monitor.target": "˙ǝןnpoɯ ʇxǝʇ ɐ uı sɹǝpןoɥǝɔɐןd ɥʇıʍ pǝsn ǝq oʇ 'ʇǝbɹɐʇ ɐ pǝɹǝpısuoɔ sı ʎɐʍ sıɥʇ pǝʇɔǝןǝs ʞɔoןq ǝɥ⟘", + "gtceu.gui.central_monitor.text_module_help": "\n:%0ϛ< sı ʎbɹǝuǝ uǝɥʍ ןɐubıs ǝuoʇspǝɹ ɐ spuǝs puɐ oɟuı ʎbɹǝuǝ ǝɯos sʎɐןdsıp ʇɐɥʇ 'sɹǝpןoɥǝɔɐןd ɟo ǝbɐsn ǝןdɯɐxǝ uɐ s,ǝɹǝH\n˙oɟuı ǝɹoɯ ɹoɟ ǝɹǝɥʇ ǝbɐd dןǝɥ ǝɥʇ ʇno ʞɔǝɥɔ 'ʍopuıʍ buıʇıpǝ dnoɹb ɹoʇıuoɯ ǝɥʇ uı ʇǝbɹɐʇ ɐ ʇɔǝןǝS\n˙SSԀ ɐ ɹo ɹǝɟɟnq ʎɹǝʇʇɐq ɐ ʎןןɐnsn 'ʞɔoןq ʇǝbɹɐʇ sʇı uı ʎbɹǝuǝ ɟo ʇunoɯɐ ǝɥʇ sʎɐןdsıp }ʎbɹǝuǝ{ ǝןdɯɐxǝ ɹoℲ ˙ʞɔoןqıʇןnɯ ɹoʇıuoɯ ןɐɹʇuǝɔ\nǝɥʇ ɟo ʇɹɐd sı ɹo sɹǝʌoɔ ʇdǝɔɔɐ uɐɔ ʇɐɥʇ ʞɔoןq ʎuɐ ʎןןɐɔısɐq sı ʇǝbɹɐʇ Ɐ ˙uoıʇɔunɟ oʇ ʇǝbɹɐʇ ɐ ǝʌɐɥ ʇsnɯ }ʎbɹǝuǝ{ ǝʞıן 'sɹǝpןoɥǝɔɐןd ǝɯoS\n˙ɔʇǝ 'suoıʇɐןnɔןɐɔ unɹ 'ʇnduı ǝuoʇspǝɹ pɐǝɹ/ʇndʇno ǝuoʇspǝɹ ɐ ʇǝs sɐ ɥɔns 'sbuıɥʇ ɹǝɥʇo ǝɯos op osןɐ uɐɔ ʎǝɥ⟘\n˙)ʎbɹǝuǝ ɟo ʇunoɯɐ ǝɥʇ ǝsɐɔ sıɥʇ uı( pɐǝʇsuı ǝnןɐʌ ɹıǝɥʇ ʎɐןdsıp ןןıʍ 'pǝʎɐןdsıp uǝɥʍ ʇɐɥʇ \"}ʎbɹǝuǝ{\" ǝʞıן sbuıɹʇs ǝɹɐ sɹǝpןoɥǝɔɐןԀ\n˙sɹǝpןoɥǝɔɐןd ǝʌɐɥ uɐɔ ʇɐɥʇ ʇxǝʇ sʎɐןdsıp ǝןnpoɯ sıɥ⟘", "gtceu.gui.central_monitor.text_scale": "ǝןɐɔs ʇxǝ⟘", + "gtceu.gui.central_monitor.update_once": "˙ǝɔuo ʎןʇɔɐxǝ ʇı uı sɹǝpןoɥǝɔɐןd ןןɐ unɹ puɐ ʇxǝʇ ǝʇɐpd∩", + "gtceu.gui.central_monitor.url": ":Ꞁᴚ∩ ǝbɐɯı ʇnduI", "gtceu.gui.charger_slot.tooltip.0": "ɹ§ʇoןS ɹǝbɹɐɥƆɟ§", "gtceu.gui.charger_slot.tooltip.1": "ɹ§sǝıɹǝʇʇɐq %s ɯoɹɟ ɹǝʍod sʍɐɹᗡㄥ§", "gtceu.gui.charger_slot.tooltip.2": "sǝıɹǝʇʇɐq puɐ sןooʇ %s sǝbɹɐɥƆㄥ§", @@ -2402,8 +2441,7 @@ "gtceu.gui.computer_monitor_cover.placeholder_reference.1": ")oɟuı ǝɹoɯ ɹoɟ ɹǝʌoɥ(", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "˙ǝɹǝɥ ,}{, %s ɟo ǝɔɐןd uı pǝsn ǝq oʇ ɹǝpןoɥǝɔɐןd ʇnduI", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "˙sǝxoq ʇxǝʇ ǝsǝɥʇ uı ,ʎʇıɔɐdɐƆʎbɹǝuǝ, puɐ ,ʎbɹǝuǝ, puɐ ,∩Ǝ }{/}{ :ʎbɹǝuƎ, buıɹʇs ɐ ǝʌɐɥ uɐɔ noʎ 'ǝןdɯɐxǝ ɹoℲ", - "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "ǝɔuǝɹǝɟǝɹ uɐɔ sɹǝpןoɥǝɔɐןd ǝɯos ʇɐɥʇ sɯǝʇı ɹoɟ ʇoןs Ɐ", - "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "%d :ɹǝqɯnu ʇoןS", + "gtceu.gui.computer_monitor_cover.slot_tooltip": "\n%d :ɹǝqɯnu ʇoןS\nǝɔuǝɹǝɟǝɹ uɐɔ sɹǝpןoɥǝɔɐןd ǝɯos ʇɐɥʇ sɯǝʇı ɹoɟ ʇoןs Ɐ", "gtceu.gui.computer_monitor_cover.update_interval": ")sʞɔıʇ uı( ןɐʌɹǝʇuı ǝʇɐpd∩", "gtceu.gui.config_slot": "ɹ§ʇoןS bıɟuoƆɟ§", "gtceu.gui.config_slot.auto_pull_managed": "ןןnԀ-oʇnⱯ ʎq pǝbɐuɐW ㄥ§:pǝןqɐsıᗡㄣ§", @@ -2445,8 +2483,6 @@ "gtceu.gui.fluid_amount": ":ʇunoɯⱯ pınןℲ", "gtceu.gui.fluid_auto_input.tooltip.disabled": "pǝןqɐsıᗡ ʇnduI-oʇnⱯ pınןℲ", "gtceu.gui.fluid_auto_input.tooltip.enabled": "pǝןqɐuƎ ʇnduI-oʇnⱯ pınןℲ", - "gtceu.gui.fluid_auto_output.allow_input.disabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı spınןɟ ǝןqɐsıp", - "gtceu.gui.fluid_auto_output.allow_input.enabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı spınןɟ ʍoןןɐ", "gtceu.gui.fluid_auto_output.disabled": "pǝןqɐsıᗡɔ§ :ʇndʇnO oʇnⱯ pınןℲ", "gtceu.gui.fluid_auto_output.enabled": "pǝןqɐuƎɐ§ :ʇndʇnO oʇnⱯ pınןℲ", "gtceu.gui.fluid_auto_output.other_direction.0": "uoıʇɔǝɹıᗡ ɹǝɥʇO9§ :ʇndʇnO oʇnⱯ pınןℲ", @@ -2456,6 +2492,8 @@ "gtceu.gui.fluid_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ pınןℲ", "gtceu.gui.fluid_auto_output.unselected.0": "ʇndʇnO oʇnⱯ pınןℲ", "gtceu.gui.fluid_auto_output.unselected.1": "˙ʇndʇno sʇı ǝɹnbıɟuoɔ oʇ ǝuıɥɔɐɯ ǝɥʇ ɟo ǝpıs ɐ ʇɔǝןǝSㄥ§", + "gtceu.gui.fluid_input_from_output.disabled": "pǝןqɐsıᗡɔ§ :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI pınןℲ ʍoןןⱯ", + "gtceu.gui.fluid_input_from_output.enabled": "pǝןqɐuƎɐ§ :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI pınןℲ ʍoןןⱯ", "gtceu.gui.fluid_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ pınןℲ", "gtceu.gui.fluid_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ pınןℲ", "gtceu.gui.fluid_voiding": "spınןℲ6§ buıpıoΛㄥ§", @@ -2464,8 +2502,6 @@ "gtceu.gui.fuel_amount": ":ʇunoɯⱯ ןǝnℲ", "gtceu.gui.item_auto_input.tooltip.disabled": "pǝןqɐsıᗡ ʇnduI-oʇnⱯ ɯǝʇI", "gtceu.gui.item_auto_input.tooltip.enabled": "pǝןqɐuƎ ʇnduI-oʇnⱯ ɯǝʇI", - "gtceu.gui.item_auto_output.allow_input.disabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı sɯǝʇı ǝןqɐsıp", - "gtceu.gui.item_auto_output.allow_input.enabled": "ǝpıs ʇndʇno ǝɥʇ ɯoɹɟ ʇnduı sɯǝʇı ʍoןןɐ", "gtceu.gui.item_auto_output.disabled": "pǝןqɐsıᗡɔ§ :ʇndʇnO oʇnⱯ ɯǝʇI", "gtceu.gui.item_auto_output.enabled": "pǝןqɐuƎɐ§ :ʇndʇnO oʇnⱯ ɯǝʇI", "gtceu.gui.item_auto_output.other_direction.0": "uoıʇɔǝɹıᗡ ɹǝɥʇO9§ :ʇndʇnO oʇnⱯ ɯǝʇI", @@ -2475,6 +2511,9 @@ "gtceu.gui.item_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ ɯǝʇI", "gtceu.gui.item_auto_output.unselected.0": "ʇndʇnO oʇnⱯ ɯǝʇI", "gtceu.gui.item_auto_output.unselected.1": "˙ʇndʇno sʇı ǝɹnbıɟuoɔ oʇ ǝuıɥɔɐɯ ǝɥʇ ɟo ǝpıs ɐ ʇɔǝןǝSㄥ§", + "gtceu.gui.item_collector.range": " :ǝbuɐᴚ", + "gtceu.gui.item_input_from_output.disabled": "pǝןqɐsıᗡɔ§ :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ɯǝʇI ʍoןןⱯ", + "gtceu.gui.item_input_from_output.enabled": "pǝןqɐuƎɐ§ :ǝpıS ʇndʇnO ɯoɹɟ ʇnduI ɯǝʇI ʍoןןⱯ", "gtceu.gui.item_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ ɯǝʇI", "gtceu.gui.item_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ ɯǝʇI", "gtceu.gui.item_voiding": "sɯǝʇI9§ buıpıoΛㄥ§", @@ -2484,8 +2523,13 @@ "gtceu.gui.machinemode.tab_tooltip": "ǝpoW ǝuıɥɔɐW ǝʌıʇɔɐ ǝbuɐɥƆ", "gtceu.gui.machinemode.title": "ǝpoW ǝuıɥɔɐW ǝʌıʇɔⱯ", "gtceu.gui.me_bus.auto_pull_button": "ƎW ɯoɹɟ buıןןnd ɯǝʇı ɔıʇɐɯoʇnɐ ǝןbboʇ oʇ ʞɔıןƆ", + "gtceu.gui.me_network.auto_pull_toggle": "ןןnԀ-oʇnⱯ ǝןbbo⟘", + "gtceu.gui.me_network.empty": "ʎʇdɯƎ", + "gtceu.gui.me_network.min_stack_size": ":ǝzıS ʞɔɐʇS uıW", "gtceu.gui.me_network.offline": "ɹ§ǝuıןɟɟOㄣ§ :snʇɐʇS ʞɹoʍʇǝN", "gtceu.gui.me_network.online": "ɹ§ǝuıןuOᄅ§ :snʇɐʇS ʞɹoʍʇǝN", + "gtceu.gui.me_network.stocking_settings": "sbuıʇʇǝS buıʞɔoʇS", + "gtceu.gui.me_network.ticks_per_cycle": ":ǝןɔʎƆ ɹǝԀ sʞɔı⟘", "gtceu.gui.multiblock.voiding_mode": ":ǝpoW buıpıoΛ", "gtceu.gui.no_voiding": "buıɥʇoN buıpıoΛㄥ§", "gtceu.gui.output_setting.title": "sbuıʇʇǝS ʇndʇnO", @@ -2500,6 +2544,7 @@ "gtceu.gui.overclock.off": "X", "gtceu.gui.overclock.range": "]%s '%s[ sɹǝı⟘ ǝןqɐןıɐʌⱯ", "gtceu.gui.overclock.title": "ɹǝı⟘ ʞɔoןɔɹǝʌO", + "gtceu.gui.pattern_buffer.set_custom_name": " :ǝɯɐN ɯoʇsnƆ ʇǝS", "gtceu.gui.silktouch.disabled.0": "˙ǝןqɐuƎ oʇ ʞɔıןƆ :pǝןqɐsıᗡ ɥɔno⟘ ʞןıS", "gtceu.gui.silktouch.disabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§", "gtceu.gui.silktouch.enabled.0": "˙ǝןqɐsıᗡ oʇ ʞɔıןƆ :pǝןqɐuƎ ɥɔno⟘ ʞןıS", @@ -2513,11 +2558,13 @@ "gtceu.gui.toggle_view.disabled": ")spınןℲ( ʍǝıΛ ǝןbbo⟘", "gtceu.gui.toggle_view.enabled": ")sɯǝʇI( ʍǝıΛ ǝןbbo⟘", "gtceu.gui.waiting_list": ":ǝnǝnὉ buıpuǝS", + "gtceu.gui.waiting_list_empty": "ʎʇdɯƎᄅ§ :ǝnǝnὉ buıpuǝS", "gtceu.implosion_compressor": "ɹossǝɹdɯoƆ uoısoןdɯI", "gtceu.io.both": "ɥʇoᗺ", "gtceu.io.export": "ʇɹodxƎ", "gtceu.io.import": "ʇɹodɯI", "gtceu.io.none": "ǝuoN", + "gtceu.item.tooltip.image_url": "%s :Ꞁᴚ∩ ǝbɐɯI", "gtceu.item_filter.empty_item": ")ɯǝʇI oN( ʎʇdɯƎ", "gtceu.item_filter.footer": "ǝpıɹɹǝʌo oʇ ɯǝʇı ɥʇıʍ ʞɔıןƆǝ§", "gtceu.item_list.item_stored": "%d :pǝɹoʇSㄥ§", @@ -2626,6 +2673,7 @@ "gtceu.jei.ore_vein_diagram.spawn_range": ":ǝbuɐᴚ uʍɐdS", "gtceu.jei.ore_vein_diagram.weight": "%s :ʇɥbıǝM", "gtceu.jei.programmed_circuit": "ǝbɐԀ ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", + "gtceu.journeymap.options.layers": "sɹǝʎɐן uoıʇɔǝdsoɹԀ", "gtceu.key.armor_charging": "ǝןbbo⟘ ʎɹoʇuǝʌuI oʇ buıbɹɐɥƆ ɹoɯɹⱯ", "gtceu.key.armor_hover": "ǝןbbo⟘ ɹǝʌoH ɹoɯɹⱯ", "gtceu.key.armor_mode_switch": "ɥɔʇıʍS ǝpoW ɹoɯɹⱯ", @@ -3040,19 +3088,16 @@ "gtceu.machine.me_import_item_hatch.configs.tooltip": "ʞɔoʇs uı sǝdʎʇ ɯǝʇı 9Ɩ sdǝǝʞ", "gtceu.machine.miner.chunkradius": "%d :snıpɐᴚ ʞunɥƆ", "gtceu.machine.miner.fluid_usage": "˙ʞɔoןɔɹǝʌo ɹǝd pǝןqnop 'ㄥ§%sɟ§ ɟoㄥ§ ʇ/ᗺɯ %dɟ§ sǝs∩", - "gtceu.machine.miner.minex": "%d :Xɯ", - "gtceu.machine.miner.miney": "%d :ʎɯ", - "gtceu.machine.miner.minez": "%d :Zɯ", "gtceu.machine.miner.multi.description": "˙ǝɹo ɟo ʎʇıʇuɐnb ǝbnɥ sǝɔnpoɹd puɐ ɐǝɹɐ ǝbɹɐן ɐ sɹǝʌoɔ ʇɐɥʇ ǝuıɥɔɐɯ buıuıɯ ʞɔoןqıʇןnɯ Ɐ", "gtceu.machine.miner.multi.modes": "˙sǝpoW pǝubıןⱯ ʞunɥƆ puɐ ɥɔno⟘ ʞןıS sɐH", "gtceu.machine.miner.multi.production": "˙ㄥ§ɹoʇɐɹǝɔɐWɟ§ ɐ uɐɥʇ ǝɹo pǝɥsnɹɔ ǝɹoɯ ㄥ§xƐɟ§ sǝɔnpoɹԀ", "gtceu.machine.miner.per_block": "ʞɔoןᗺ ɹǝdㄥ§ %dsɟ§ sǝʞɐʇㄥ§", "gtceu.machine.miner.progress": "%d/%d :ssǝɹboɹԀ", "gtceu.machine.miner.radius": "%d :snıpɐᴚ", - "gtceu.machine.miner.startx": "%d :Xs", - "gtceu.machine.miner.starty": "%d :ʎs", - "gtceu.machine.miner.startz": "%d :Zs", "gtceu.machine.miner.tooltip": "ɐǝɹɐㄥ§ %sx%sɟ§ sɐ sʇɹɐʇS ¡ɹǝuıW ǝɥʇ ʍoןǝq sǝɹo sǝuıWㄥ§", + "gtceu.machine.miner.x": "%d :Xɯ '%d :Xs", + "gtceu.machine.miner.y": "%d :ʎɯ '%d :ʎs", + "gtceu.machine.miner.z": "%d :Zɯ '%d :Zs", "gtceu.machine.muffle.off": "pǝןqɐsıᗡ :buıןɟɟnW punoS", "gtceu.machine.muffle.on": "pǝןqɐuƎ :buıןɟɟnW punoS", "gtceu.machine.muffler_hatch.tooltip.0": "sǝuıɥɔɐɯ ɯoɹɟ ǝʇsɐʍ sɹǝʌoɔǝᴚ", @@ -3107,6 +3152,7 @@ "gtceu.machine.opv_gas_collector.tooltip": "uoısuǝɯıp ǝɥʇ uo buıpuǝdǝp ǝsɹǝʌıun ǝɥʇ ɯoɹɟ sɐ⅁ sʇɔǝןןoƆㄥ§", "gtceu.machine.opv_rock_crusher.tooltip": "ɹǝqɯɐɥƆ uoıʇɐɯɹoℲ ɔıuɐɔןoΛㄥ§", "gtceu.machine.parallel_hatch.display": "ʞɔoןqıʇןnɯ ǝɥʇ ɟo ןǝןןɐɹɐd ɯnɯıxɐɯ ǝɥʇ ʇsnظpⱯ", + "gtceu.machine.parallel_hatch.parallel_ui": "sןǝןןɐɹɐԀ", "gtceu.machine.parallel_hatch_mk5.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ oʇ dn unɹ oʇ sʍoןןⱯ", "gtceu.machine.parallel_hatch_mk6.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ 9Ɩ oʇ dn unɹ oʇ sʍoןןⱯ", "gtceu.machine.parallel_hatch_mk7.tooltip": "˙ןǝןןɐɹɐd uı sǝdıɔǝɹ ㄣ9 oʇ dn unɹ oʇ sʍoןןⱯ", @@ -3330,10 +3376,9 @@ "gtceu.multiblock.hpca.info_bridging_disabled": "pǝןqɐsıᗡ buıbpıɹᗺ", "gtceu.multiblock.hpca.info_bridging_enabled": "pǝןqɐuƎ buıbpıɹᗺ", "gtceu.multiblock.hpca.info_coolant_name": "ʇuɐןooƆ ᗺƆԀ", + "gtceu.multiblock.hpca.info_cooling_demand": "%d / %s :puɐɯǝᗡ buıןooƆ", "gtceu.multiblock.hpca.info_max_computation": "%s :ʇ/∩MƆ xɐW", "gtceu.multiblock.hpca.info_max_coolant_required": "%s :pǝpǝǝN ʇuɐןooƆ", - "gtceu.multiblock.hpca.info_max_cooling_available": "%s :ǝןqɐןıɐʌⱯ buıןooƆ", - "gtceu.multiblock.hpca.info_max_cooling_demand": "%s :puɐɯǝᗡ buıןooƆ", "gtceu.multiblock.hpca.temperature": "%s :ǝɹnʇɐɹǝdɯǝ⟘", "gtceu.multiblock.hpca.warning_low_cooling": "buıןooɔ ɥbnouǝ ʇoN -", "gtceu.multiblock.hpca.warning_multiple_bridges": ")ʇıɟǝuǝq ןɐuoıʇıppɐ ou sǝpıʌoɹd( ǝɹnʇɔnɹʇs uı sǝbpıɹq ǝןdıʇןnW -", @@ -3486,9 +3531,9 @@ "gtceu.multiblock.turbine.rotor_durability": "%s%% :ʎʇıןıqɐɹnᗡ ɹoʇoᴚ", "gtceu.multiblock.turbine.rotor_speed": "WԀᴚ %s/%s :pǝǝdS ɹoʇoᴚ", "gtceu.multiblock.universal.distinct": ":sǝsnᗺ ʇɔuıʇsıᗡ", + "gtceu.multiblock.universal.distinct.disabled": "pǝןqɐsıᗡǝ§ :sǝsnᗺ ʇɔuıʇsıᗡ", + "gtceu.multiblock.universal.distinct.enabled": "pǝןqɐuƎǝ§ :sǝsnᗺ ʇɔuıʇsıᗡ", "gtceu.multiblock.universal.distinct.info": "˙ɔʇǝ 'sǝdɐɥS ɹǝpnɹʇxƎ 'sʇınɔɹıƆ pǝɯɯɐɹboɹԀ ǝʞıן sbuıɥʇ ɹoɟ ןnɟǝs∩ ˙dnʞooן ǝdıɔǝɹ ɹoɟ ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʇɔuıʇsıp ʎןןnɟ sɐ pǝʇɐǝɹʇ ǝq ןןıʍ snᗺ ʇnduI ɯǝʇI ɥɔɐǝ 'pǝןqɐuǝ ɟI", - "gtceu.multiblock.universal.distinct.no": "oN", - "gtceu.multiblock.universal.distinct.yes": "sǝʎ", "gtceu.multiblock.universal.has_problems": "¡sɯǝןqoɹԀ ǝɔuɐuǝʇuıɐW sɐH", "gtceu.multiblock.universal.has_problems_header": ":ɥɔʇɐH ǝɔuɐuǝʇuıɐW ɐ uı sǝnssı buıʍoןןoɟ ǝɥʇ xıℲ", "gtceu.multiblock.universal.muffler_obstructed": "¡pǝʇɔnɹʇsqO sı ɥɔʇɐH ɹǝןɟɟnW", @@ -3519,6 +3564,14 @@ "gtceu.packer": "ɹǝʞɔɐԀ", "gtceu.part_sharing.disabled": "pǝןqɐsıᗡㄣ§ buıɹɐɥS ʞɔoןqıʇןnW", "gtceu.part_sharing.enabled": "pǝןqɐuƎɐ§ buıɹɐɥS ʞɔoןqıʇןnW", + "gtceu.placeholder_editor.constant_value": "˙ʇuɐʇsuoɔ ɐ ɥʇıʍ ʇı buıɔɐןdǝɹ ɹǝpısuoƆ\n˙ʇןnsǝɹ ǝɯɐs ǝɥʇ oʇ sǝʇɐnןɐʌǝ sʎɐʍןɐ uoıssǝɹdxǝ sıɥ⟘", + "gtceu.placeholder_editor.extra_closing_bracket": "ʇǝʞɔɐɹq buısoןɔ ɐɹʇxƎ", + "gtceu.placeholder_editor.no_placeholder": "ʇsıxǝ ʇou sǝop ,%s, ǝɯɐu ɥʇıʍ ɹǝpןoɥǝɔɐןԀ", + "gtceu.placeholder_editor.unclosed_bracket": ")\"}\"( ʇǝʞɔɐɹq pǝsoןɔu∩", + "gtceu.placeholder_editor.unclosed_brackets": "pǝsoןɔun ǝɹɐ )\"}\"( sʇǝʞɔɐɹq %d", + "gtceu.placeholder_editor.unclosed_escape": ")\"],\"( ǝdɐɔsǝ pǝsoןɔu∩", + "gtceu.placeholder_editor.unclosed_escapes": "pǝsoןɔun ǝɹɐ )\"],\"( sǝdɐɔsǝ %d", + "gtceu.placeholder_editor.write_in_if": "˙\"}}\">ǝpoɔ‾ǝsןǝ<\" \">ǝpoɔ<\" >uoıʇıpuoɔ< ɟı{ ןɐʌǝ{\" ǝsn 'sıɥʇ pıoʌɐ o⟘\n˙ʇndʇno ǝuoʇspǝɹ ǝɔnpoɹd ןןıʍ \"}}ϛƖ ʇǝs ǝuoʇspǝɹ{ 0 ɟı{\" 'ǝןdɯɐxǝ ɹoɟ 'ʇɐɥʇ suɐǝɯ sıɥ⟘\n˙uoıʇıpuoɔ ǝɥʇ ɟo ssǝןpɹɐbǝɹ pǝʇnɔǝxǝ ǝɹɐ }ɟı{ ǝpısuı sɹǝpןoɥǝɔɐןԀ", "gtceu.placeholder_info.active.0": "˙ǝsıʍɹǝɥʇo 0 'ǝdıɔǝɹ ɐ buıuunɹ ʎןʇuǝɹɹnɔ sı oʇ pǝɥɔɐʇʇɐ sı ɹǝʌoɔ ǝɥʇ ʞɔoןq ǝɥʇ ɟı Ɩ ɐ suɹnʇǝᴚ", "gtceu.placeholder_info.active.1": ":ǝbɐs∩", "gtceu.placeholder_info.active.2": "ǝdıɔǝɹ buıuunɹ ʎןʇuǝɹɹnɔ ɐ s,ǝɹǝɥʇ ɹǝɥʇǝɥʍ >- }ǝʌıʇɔɐ{ ", @@ -3601,13 +3654,14 @@ "gtceu.placeholder_info.count.2": "ʇsɹıɟ ǝɥʇ oʇ ןɐnbǝ ǝɹɐ ʇɐɥʇ sʇuǝɯnbɹɐ ɟo ʇunoɯɐ ǝɥʇ >- }˙˙˙ ]ㄣbɹɐ[ ]Ɛbɹɐ[ ]ᄅbɹɐ[ >Ɩbɹɐ< ʇunoɔ{ ", "gtceu.placeholder_info.data.0": "˙sʇoןs ǝɥʇ ɟo ǝuo uı )ǝןnpoɯ/qɹo/ʞɔıʇs ɐʇɐp( ɯǝʇı ɐʇɐp ɐ ɯoɹɟ ɐʇɐp ǝɯos sǝʌǝıɹʇǝɹ ɹo sǝɹoʇS", "gtceu.placeholder_info.data.1": "˙)ʇqu ɯǝʇı ɐʇɐp ǝɥʇ uı pǝɹoʇs sı ʇɐɥʇ )Ɩ - ʎʇıɔɐdɐɔ( oʇ 0 ɯoɹɟ ɹǝbǝʇuı uɐ sı d( d ǝnןɐʌ ǝɥʇ ɥʇıʍ pǝɔɐןdǝɹ ǝq ןןıʍ ʇı 'ʎʇdɯǝ ʇuǝɯnbɹɐ >xǝpuı< ǝɥʇ ǝʌɐǝן noʎ ɟI", - "gtceu.placeholder_info.data.2": ":ǝbɐs∩", - "gtceu.placeholder_info.data.3": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ >- }>xǝpuı< >ʇoןs< ʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.4": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ sʇǝs >- }>ǝnןɐʌ< >xǝpuı< >ʇoןs< ʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.5": "d >- }>ʇoןs< dʇǝb ɐʇɐp{ ", - "gtceu.placeholder_info.data.6": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'd sʇǝs >- }>ǝnןɐʌ< >ʇoןs< dʇǝs ɐʇɐp{ ", - "gtceu.placeholder_info.data.7": "0 oʇ d sʇǝs 'ʎʇıɔɐdɐɔ oʇ ןɐnbǝ ɹo uɐɥʇ ǝɹoɯ sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔuı >- }>ʇoןs< ɔuı ɐʇɐp{ ", - "gtceu.placeholder_info.data.8": ")Ɩ - ʎʇıɔɐdɐɔ( oʇ d sʇǝs '0 uɐɥʇ ssǝן sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔǝp >- }>ʇoןs< ɔǝp ɐʇɐp{ ", + "gtceu.placeholder_info.data.2": "˙ɥɔʇɐɥ ɐʇɐp ɐ ǝpısuı ǝןnpoɯ ʇxǝʇ sıɥʇ ʎq pǝʇǝbɹɐʇ ʎןʇuǝɹɹnɔ sı ʇɐɥʇ ʞɔıʇs ɐʇɐp ǝɥʇ ǝʇɐןndıuɐɯ ןןıʍ ɹǝpןoɥǝɔɐןd sıɥʇ '0 oʇ ןɐnbǝ sı ʇuǝɯnbɹɐ ʇoןs ǝɥʇ ɟI", + "gtceu.placeholder_info.data.3": ":ǝbɐs∩", + "gtceu.placeholder_info.data.4": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ >- }>xǝpuı< >ʇoןs< ʇǝb ɐʇɐp{ ", + "gtceu.placeholder_info.data.5": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'ʇoןs pǝıɟıɔǝds ǝɥʇ uı ɯǝʇı ǝɥʇ uı pǝɹoʇs ɐʇɐp ǝɥʇ sʇǝs >- }>ǝnןɐʌ< >xǝpuı< >ʇoןs< ʇǝs ɐʇɐp{ ", + "gtceu.placeholder_info.data.6": "d >- }>ʇoןs< dʇǝb ɐʇɐp{ ", + "gtceu.placeholder_info.data.7": "buıɹʇs ʎʇdɯǝ uɐ suɹnʇǝɹ 'd sʇǝs >- }>ǝnןɐʌ< >ʇoןs< dʇǝs ɐʇɐp{ ", + "gtceu.placeholder_info.data.8": "0 oʇ d sʇǝs 'ʎʇıɔɐdɐɔ oʇ ןɐnbǝ ɹo uɐɥʇ ǝɹoɯ sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔuı >- }>ʇoןs< ɔuı ɐʇɐp{ ", + "gtceu.placeholder_info.data.9": ")Ɩ - ʎʇıɔɐdɐɔ( oʇ d sʇǝs '0 uɐɥʇ ssǝן sǝɯoɔǝq d ɟı 'Ɩ ʎq d sʇuǝɯǝɹɔǝp >- }>ʇoןs< ɔǝp ɐʇɐp{ ", "gtceu.placeholder_info.displayTarget.0": "˙ʞuıן ʎɐןdsıp ɐ buısn ɹǝʌoɔ sıɥʇ oʇ pǝʇʇıɯsuɐɹʇ sɐʍ ʇɐɥʇ ǝuıן pǝıɟıɔǝds ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.displayTarget.1": ":ǝbɐs∩", "gtceu.placeholder_info.displayTarget.2": ")00Ɩ-Ɩ sı ɹǝqɯnu ǝuıן( ǝuıן pǝıɟıɔǝds ǝɥʇ uo ʇxǝʇ ǝɥʇ >- }>ɹǝqɯnu‾ǝuıן< ʇǝbɹɐ⟘ʎɐןdsıp{ ", @@ -3704,12 +3758,20 @@ "gtceu.placeholder_info.setImage.0": "ʇoןs pǝıɟıɔǝds ǝɥʇ uı ǝןnpoɯ ǝbɐɯı uɐ uı Ꞁᴚ∩ ǝbɐɯı ǝɥʇ sʇǝS", "gtceu.placeholder_info.setImage.1": ":ǝbɐs∩", "gtceu.placeholder_info.setImage.2": "buıɹʇs ʎʇdɯǝ >- }>ןɹn< >ʇoןs< ǝbɐɯIʇǝs{ ", + "gtceu.placeholder_info.setTargetSlot.0": "˙ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ sʇǝS", + "gtceu.placeholder_info.setTargetSlot.1": "˙sǝʇnɔǝxǝ ɹǝpןoɥǝɔɐןd sıɥʇ ɹǝʇɟɐ ʎןǝʇɐıpǝɯɯı ʇɔǝɟɟǝ ǝʞɐʇ ןןıʍ ǝbuɐɥɔ ǝɥ⟘", + "gtceu.placeholder_info.setTargetSlot.2": ")ʇǝbɹɐʇ ʍǝu ǝɥʇ ǝɔuǝɹǝɟǝɹ ןןıʍ sɹǝpןoɥǝɔɐןd ɹǝɥʇɹnℲ(", + "gtceu.placeholder_info.setTargetSlot.3": ":ǝbɐs∩", + "gtceu.placeholder_info.setTargetSlot.4": "buıɹʇs ʎʇdɯǝ >- }>ʇoןs< ʇoןSʇǝbɹɐ⟘ʇǝs{ ", "gtceu.placeholder_info.strike.0": "ʇno pǝssoɹɔ sɐʍ ʇı ɟı sɐ ʇı buıʎɐןdsıp 'ʇxǝʇ ʇsɹıɟ ǝɥʇ ɯoɹɟ ʇxǝʇ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.strike.1": ":ǝbɐs∩", "gtceu.placeholder_info.strike.2": "ʇxǝʇ ʇno-pǝssoɹɔ >- }>ʇxǝʇ< ǝʞıɹʇs{ ", "gtceu.placeholder_info.subList.0": ")0 ɯoɹɟ buıʇɹɐʇs( )ǝʌısnןɔxǝ( ɹ oʇ )ǝʌısnןɔuı( ן ɯoɹɟ sǝxǝpuı ɥʇıʍ ɯoɹɟ sʇuǝɯnbɹɐ suɹnʇǝᴚ", "gtceu.placeholder_info.subList.1": ":ǝbɐs∩", "gtceu.placeholder_info.subList.2": "sǝɔɐds ʎq pǝʇɐɹɐdǝs ɹ oʇ ן ɯoɹɟ sǝxǝpuı ɥʇıʍ sʇuǝɯnbɹɐ ןןɐ >- }˙˙˙ ]Ɩbɹɐ[ ]0bɹɐ[ >ʇɥbıɹ< >ʇɟǝן< ʇsıꞀqns{ ", + "gtceu.placeholder_info.targetSlot.0": "ʇoןs ɥɔʇɐɥ ɐʇɐp pǝʇǝbɹɐʇ ǝɥʇ ɟo xǝpuı ǝɥʇ suɹnʇǝᴚ", + "gtceu.placeholder_info.targetSlot.1": ":ǝbɐs∩", + "gtceu.placeholder_info.targetSlot.2": ")9Ɩ/6/ㄣ oʇ Ɩ ɯoɹɟ( >ʇoןs< >- }ʇoןSʇǝbɹɐʇ{ ", "gtceu.placeholder_info.tick.0": "˙pǝɔɐןd sɐʍ ɹǝʌoɔ sıɥʇ uǝɥʍ ɯoɹɟ pǝssɐd sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.tick.1": ":ǝbɐs∩", "gtceu.placeholder_info.tick.2": "sʞɔıʇ ɟo ʇunoɯɐ ǝɥʇ >- }ʞɔıʇ{ ", @@ -3732,6 +3794,7 @@ "gtceu.plasma_generator": "ɹoʇɐɹǝuǝ⅁ ɐɯsɐןԀ", "gtceu.polarizer": "ɹǝzıɹɐןoԀ", "gtceu.primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", + "gtceu.provider.computer_monitor_cover.error.no_target": "dnoɹb ɹoʇıuoɯ ǝɥʇ ɹoɟ pǝʇɔǝןǝs ʇǝbɹɐʇ oN", "gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", "gtceu.recipe.byproduct_tier": "+ɹ§%s ɯoɹɟ sʇɔnpoɹdʎᗺ", "gtceu.recipe.category.arc_furnace_recycling": "buıddɐɹɔS ɔɹⱯ", @@ -3780,7 +3843,6 @@ "gtceu.recipe_modifier.default_fail": "ןıɐℲ ɹǝıɟıpoW ǝdıɔǝᴚ", "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "uoıʇɔɐǝᴚ uoısnℲ ǝʇɐıʇıuI oʇ ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI", "gtceu.recipe_modifier.insufficient_voltage": "ʍoꞀ oo⟘ ɹǝı⟘ ǝbɐʇןoΛ", - "gtceu.recipe_type.show_recipes": "sǝdıɔǝᴚ ʍoɥS", "gtceu.rei.group.potion_fluids": "spınןℲ uoıʇoԀ", "gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", "gtceu.rock_breaker": "ɹǝʞɐǝɹᗺ ʞɔoᴚ", @@ -4267,6 +4329,7 @@ "item.gtceu.gray_glass_lens": ")ʎɐɹ⅁( suǝꞀ ssɐן⅁", "item.gtceu.green_dye_spray_can": ")uǝǝɹ⅁( uɐƆ ʎɐɹdS", "item.gtceu.green_glass_lens": ")uǝǝɹ⅁( suǝꞀ ssɐן⅁", + "item.gtceu.gui_module": "ǝןnpoW ın⅁", "item.gtceu.hammer_extruder_mold.tooltip": "sɹǝɯɯɐH buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", "item.gtceu.hazmat_boots": "sʇooᗺ ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", "item.gtceu.hazmat_chestpiece": "ǝɔǝıdʇsǝɥƆ ʇınS sןɐıɹǝʇɐW snopɹɐzɐH", @@ -5734,6 +5797,8 @@ "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "metaarmor.message.step_assist.disabled": "ɟɟOɔ§ :ʇsıssⱯ-dǝʇSq§", + "metaarmor.message.step_assist.enabled": "uOɐ§ :ʇsıssⱯ-dǝʇSq§", "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", @@ -5947,14 +6012,6 @@ "tagprefix.wire_gt_quadruple": "ǝɹıM %s xㄣ", "tagprefix.wire_gt_single": "ǝɹıM %s xƖ", "tagprefix.wrench_tip": "dı⟘ ɥɔuǝɹM %s", - "tile.gtceu.brittle_charcoal.name": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", - "tile.gtceu.brittle_charcoal.tooltip.0": "˙ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ ǝɥʇ ʎq pǝɔnpoɹԀ", - "tile.gtceu.brittle_charcoal.tooltip.1": "˙ןɐoɔɹɐɥƆ ʇǝb oʇ sıɥʇ ǝuıW", - "tile.gtceu.foam.name": "ɯɐoℲ", - "tile.gtceu.petrified_foam.name": "ɯɐoℲ pǝıɟıɹʇǝԀ", - "tile.gtceu.reinforced_foam.name": "ɯɐoℲ pǝɔɹoɟuıǝᴚ", - "tile.gtceu.reinforced_stone.name": "ǝuoʇS pǝɔɹoɟuıǝᴚ", - "tile.gtceu.seal.name": "ʞɔoןᗺ pǝןɐǝS", "tooltip.gtceu.antidote.description": "sןıɐʇǝp ʍoɥs oʇ ʇɟıɥS pןoHㄥ§ ǝʇopıʇuⱯɐ§", "tooltip.gtceu.antidote.description.effect_removed": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo %s%% sǝʌoɯǝᴚ", "tooltip.gtceu.antidote.description.effect_removed.all": "sʇɔǝɟɟǝ ,suoıʇıpuoɔ ʇuǝɹɹnɔ ɟo ןןɐ sǝʌoɯǝᴚ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 3acb3a2c285..b81d0623f85 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -14,7 +14,6 @@ "behavior.portable_scanner.debug_lag_count": "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server.", "behavior.portable_scanner.debug_machine": "Meta-ID: %s", "behavior.portable_scanner.debug_machine_invalid": " invalid!", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " null!", "behavior.portable_scanner.debug_machine_valid": " valid", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Max IN: %s (%s) EU at %s A", @@ -1140,6 +1139,8 @@ "block.gtceu.substation_capacitor.tooltip_filled": "§cEnergy Capacity: §f%d EU", "block.gtceu.superconducting_coil": "Superconducting Coil Block", "block.gtceu.tempered_glass": "Tempered Glass", + "block.gtceu.test_mui": "Test Mui", + "block.gtceu.test_mui_new": "Test Mui New", "block.gtceu.the_end_marker": "The End", "block.gtceu.the_nether_marker": "The Nether", "block.gtceu.titanium_crate": "Titanium Crate", @@ -1764,7 +1765,6 @@ "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", "config.gtceu.option.allowedImageDomains": "allowedImageDomains", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", @@ -1785,7 +1785,9 @@ "config.gtceu.option.coloredWireOutline": "coloredWireOutline", "config.gtceu.option.compat": "compat", "config.gtceu.option.createCompat": "createCompat", + "config.gtceu.option.cursorColor": "cursorColor", "config.gtceu.option.debug": "debug", + "config.gtceu.option.debugUI": "debugUI", "config.gtceu.option.debugWorldgen": "debugWorldgen", "config.gtceu.option.defaultPaintingColor": "defaultPaintingColor", "config.gtceu.option.defaultUIColor": "defaultUIColor", @@ -1813,6 +1815,7 @@ "config.gtceu.option.energyUsageMultiplier": "energyUsageMultiplier", "config.gtceu.option.environmentalHazardDecayRate": "environmentalHazardDecayRate", "config.gtceu.option.environmentalHazards": "environmentalHazards", + "config.gtceu.option.escRestoresLastText": "escRestoresLastText", "config.gtceu.option.euToFeRatio": "euToFeRatio", "config.gtceu.option.extractorRecyclingYield": "extractorRecyclingYield", "config.gtceu.option.feToEuRatio": "feToEuRatio", @@ -1864,6 +1867,7 @@ "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", "config.gtceu.option.minerSpeed": "minerSpeed", "config.gtceu.option.minimap": "minimap", + "config.gtceu.option.mui": "mui", "config.gtceu.option.nanoSaber": "nanoSaber", "config.gtceu.option.nanoSaberBaseDamage": "nanoSaberBaseDamage", "config.gtceu.option.nanoSaberDamageBoost": "nanoSaberDamageBoost", @@ -1884,6 +1888,7 @@ "config.gtceu.option.oreVeinGridSize": "oreVeinGridSize", "config.gtceu.option.oreVeinRandomOffset": "oreVeinRandomOffset", "config.gtceu.option.oreVeins": "oreVeins", + "config.gtceu.option.outlineColor": "outlineColor", "config.gtceu.option.ownerOPBypass": "ownerOPBypass", "config.gtceu.option.prospectorEnergyUseMultiplier": "prospectorEnergyUseMultiplier", "config.gtceu.option.quantumTank": "quantumTank", @@ -1897,14 +1902,28 @@ "config.gtceu.option.renderGrowingPlants": "renderGrowingPlants", "config.gtceu.option.renderer": "renderer", "config.gtceu.option.replaceMinedBlocksWith": "replaceMinedBlocksWith", + "config.gtceu.option.replaceVanillaTooltips": "replaceVanillaTooltips", "config.gtceu.option.replaceWithCobbleVersion": "replaceWithCobbleVersion", "config.gtceu.option.requireGTToolsForBlocks": "requireGTToolsForBlocks", "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", "config.gtceu.option.sandOresFall": "sandOresFall", + "config.gtceu.option.scale": "scale", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", "config.gtceu.option.showDimensionTier": "showDimensionTier", + "config.gtceu.option.showExtra": "showExtra", + "config.gtceu.option.showHovered": "showHovered", + "config.gtceu.option.showOutline": "showOutline", + "config.gtceu.option.showParent": "showParent", + "config.gtceu.option.showParentOutline": "showParentOutline", + "config.gtceu.option.showParentPos": "showParentPos", + "config.gtceu.option.showParentSize": "showParentSize", + "config.gtceu.option.showParentWidgetTheme": "showParentWidgetTheme", + "config.gtceu.option.showPos": "showPos", + "config.gtceu.option.showSize": "showSize", + "config.gtceu.option.showWidgetTheme": "showWidgetTheme", "config.gtceu.option.smallBoilers": "smallBoilers", + "config.gtceu.option.smoothProgressBar": "smoothProgressBar", "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", "config.gtceu.option.solidBoilerBaseOutput": "solidBoilerBaseOutput", "config.gtceu.option.sprayCanChainLength": "sprayCanChainLength", @@ -1916,17 +1935,21 @@ "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", "config.gtceu.option.temperaturesInCelsius": "temperaturesInCelsius", + "config.gtceu.option.textColor": "textColor", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", "config.gtceu.option.toolCraftingSounds": "toolCraftingSounds", "config.gtceu.option.toolUseSounds": "toolUseSounds", "config.gtceu.option.tools": "tools", + "config.gtceu.option.tooltipPos": "tooltipPos", "config.gtceu.option.treeFellingDelay": "treeFellingDelay", "config.gtceu.option.tungstensteelBoilerHeatSpeed": "tungstensteelBoilerHeatSpeed", "config.gtceu.option.tungstensteelBoilerMaxTemperature": "tungstensteelBoilerMaxTemperature", + "config.gtceu.option.ui": "ui", "config.gtceu.option.universalHazards": "universalHazards", "config.gtceu.option.updateIntervals": "updateIntervals", + "config.gtceu.option.useDarkThemeByDefault": "useDarkThemeByDefault", "config.gtceu.option.useVBO": "useVBO", "config.gtceu.option.voltageTierAdvImpeller": "voltageTierAdvImpeller", "config.gtceu.option.voltageTierAdvNanoSuit": "voltageTierAdvNanoSuit", @@ -2037,20 +2060,18 @@ "cover.conveyor.transfer_rate": "§7items/sec", "cover.detector_base.message_inverted_state": "Monitoring Status: Inverted", "cover.detector_base.message_normal_state": "Monitoring Status: Normal", - "cover.ender_fluid_link.incomplete_hex.0": "Inputted color is incomplete!", - "cover.ender_fluid_link.incomplete_hex.1": "It will be applied once complete (all 8 hex digits)", - "cover.ender_fluid_link.incomplete_hex.2": "Closing the gui will lose edits!", "cover.ender_fluid_link.iomode.disabled": "I/O Disabled", "cover.ender_fluid_link.iomode.enabled": "I/O Enabled", - "cover.ender_fluid_link.private.tooltip.disabled.0": "Switch to private tank mode", - "cover.ender_fluid_link.private.tooltip.disabled.1": "Private mode uses the player who originally placed the cover", - "cover.ender_fluid_link.private.tooltip.enabled": "Switch to public tank mode", "cover.ender_fluid_link.title": "Ender Fluid Link", - "cover.ender_fluid_link.tooltip.channel_description": "Set channel description with input text", - "cover.ender_fluid_link.tooltip.channel_name": "Set channel name with input text", - "cover.ender_fluid_link.tooltip.clear_button": "Clear channel description", - "cover.ender_fluid_link.tooltip.list_button": "Show channel list", "cover.ender_item_link.title": "Ender Item Link", + "cover.ender_link.description_empty": "Empty Description", + "cover.ender_link.private.tooltip": "Private mode: Only accessible to the player who placed this cover", + "cover.ender_link.protected.tooltip": "Protected Mode: Accessible to players on the same team.", + "cover.ender_link.public.tooltip": "Public mode: Accessible to all players", + "cover.ender_link.tooltip.channel_description": "Channel description", + "cover.ender_link.tooltip.channel_name": "Channel ID (32-bit hexadecimal value)", + "cover.ender_link.tooltip.clear_button": "Clear channel description", + "cover.ender_link.tooltip.list_button": "Show channel list", "cover.ender_redstone_link.title": "Ender Redstone Link", "cover.filter.blacklist.disabled": "Whitelist", "cover.filter.blacklist.enabled": "Blacklist", @@ -2088,6 +2109,7 @@ "cover.item_smart_filter.filtering_mode.electrolyzer": "Electrolyzer", "cover.item_smart_filter.filtering_mode.sifter": "Sifter", "cover.item_smart_filter.title": "Smart Item Filter", + "cover.machine_controller.control": "Controller Target", "cover.machine_controller.invert.disabled.0": "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run", "cover.machine_controller.invert.enabled.0": "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run", "cover.machine_controller.inverted": "Inverted", @@ -2151,9 +2173,9 @@ "cover.voiding.voiding_mode.void_any": "Void Matching", "cover.voiding.voiding_mode.void_overflow": "Void Overflow", "curios.identifier.gtceu_magnet": "GTCEu Magnet", - "death.attack.gtceu.axe": "%s has been chopped by %s", + "death.attack.gtceu.axe": "%s was chopped by %s", "death.attack.gtceu.butchery_knife": "%s was butchered by %s", - "death.attack.gtceu.buzzsaw": "%s got buzzed by %s", + "death.attack.gtceu.buzzsaw": "%s was buzzed by %s", "death.attack.gtceu.chainsaw_lv": "%s was massacred by %s", "death.attack.gtceu.chemical": "%s had a chemical accident", "death.attack.gtceu.crowbar": "%s lost half a life to %s", @@ -2163,8 +2185,6 @@ "death.attack.gtceu.drill_lv": "%s was drilled with 32V by %s", "death.attack.gtceu.drill_mv": "%s was drilled with 128V by %s", "death.attack.gtceu.electric": "%s was electrocuted", - "death.attack.gtceu.explosion": "%s exploded", - "death.attack.gtceu.explosion.player": "%s exploded with help of %s", "death.attack.gtceu.file": "%s has been filed D for 'Dead' by %s", "death.attack.gtceu.frost": "%s explored cryogenics", "death.attack.gtceu.hammer": "%s was squashed by %s", @@ -2172,7 +2192,7 @@ "death.attack.gtceu.heat.player": "%s was boiled alive by %s", "death.attack.gtceu.hoe": "%s had their head tilled by %s", "death.attack.gtceu.knife": "%s was gently poked by %s", - "death.attack.gtceu.mallet": "%s got hammered to death by %s", + "death.attack.gtceu.mallet": "%s was hammered to death by %s", "death.attack.gtceu.medical_condition/arsenicosis": "%s got arsenic poisoning", "death.attack.gtceu.medical_condition/asbestosis": "%s got mesothelioma", "death.attack.gtceu.medical_condition/berylliosis": "%s mined emeralds a bit too greedily", @@ -2188,18 +2208,18 @@ "death.attack.gtceu.medical_condition/weak_poison": "%s ate lead", "death.attack.gtceu.mining_hammer": "%s was mistaken for Ore by %s", "death.attack.gtceu.mortar": "%s was ground to dust by %s", - "death.attack.gtceu.pickaxe": "%s got mined by %s", + "death.attack.gtceu.pickaxe": "%s was mined by %s", "death.attack.gtceu.radiation": "%s glows with joy now", "death.attack.gtceu.screwdriver": "%s has screwed with %s for the last time!", "death.attack.gtceu.screwdriver_lv": "%s had their screws removed by %s", "death.attack.gtceu.scythe": "%s had their soul taken by %s", - "death.attack.gtceu.shovel": "%s got dug up by %s", - "death.attack.gtceu.spade": "%s got excavated by %s", + "death.attack.gtceu.shovel": "%s was dug up by %s", + "death.attack.gtceu.spade": "%s was excavated by %s", "death.attack.gtceu.turbine": "%s put their head into a turbine", "death.attack.gtceu.wire_cutter": "%s has cut the cable for the Life Support Machine of %s", "death.attack.gtceu.wrench": "%s gave %s a whack with the Wrench!", "death.attack.gtceu.wrench_hv": "%s's pipes were loosened by %s", - "death.attack.gtceu.wrench_iv": "%s had a Monkey Wrench thrown into their plans by %s", + "death.attack.gtceu.wrench_iv": "%s had a wrench thrown into their plans by %s", "death.attack.gtceu.wrench_lv": "%s's pipes were loosened by %s", "effect.gtceu.weak_poison": "Weak Poison", "enchantment.damage.disjunction": "Disjunction", @@ -2245,6 +2265,10 @@ "gtceu.canner": "Canner", "gtceu.central_monitor.gui.create_group": "Create group", "gtceu.central_monitor.gui.currently_editing": "Currently editing: %s", + "gtceu.central_monitor.gui.data_slot": "Set slot number of data stick", + "gtceu.central_monitor.gui.group_editor": "Editing monitor group", + "gtceu.central_monitor.gui.group_name": "Name:", + "gtceu.central_monitor.gui.monitor_groups": "Monitor groups", "gtceu.central_monitor.gui.remove_from_group": "Remove from group", "gtceu.central_monitor.gui.set_target": "Set target", "gtceu.central_monitor.info_tooltip.0": "In order to use monitors, you have to split them into groups first. A group may only have 1 module in it.", @@ -2301,7 +2325,8 @@ "gtceu.creative.chest.ipc": "Items per Cycle", "gtceu.creative.chest.item": "Item", "gtceu.creative.chest.tpc": "Ticks per Cycle", - "gtceu.creative.computation.average": "Average Requested CWUt", + "gtceu.creative.computation.average": "Average CWU/tick: %d", + "gtceu.creative.computation.max_usage": "Max CWU/tick:", "gtceu.creative.energy.amperage": "Amperage", "gtceu.creative.energy.sink": "Sink", "gtceu.creative.energy.source": "Source", @@ -2381,10 +2406,24 @@ "gtceu.gui.adv_stocking_config.title": "Configure Automatic Stocking", "gtceu.gui.all_voiding": "§7Voiding §cAll", "gtceu.gui.auto_output.name": "auto", + "gtceu.gui.central_monitor.data_hatch_target": "If you select a data hatch as a target, you will be prompted to enter a slot number. Then the block that the data stick in the specified slot is linked to (via right-clicking a wireless transmitter cover) will be considered the target instead.", "gtceu.gui.central_monitor.group": "Group: %s", "gtceu.gui.central_monitor.group_default_name": "Group #%d", - "gtceu.gui.central_monitor.none": "none", + "gtceu.gui.central_monitor.gui_module_info": "To select a block to get the GUI from, select a target in the monitor group editor.", + "gtceu.gui.central_monitor.help": "A monitor group is a collection of any amount of monitors in the multiblock.\nFor a group to display anything, it needs 2 things:\n - you to select the monitors that you want to display something on\n - an inserted and configured monitor module\nA module must be inserted in the slot to the right of the group name textbox.\nWhen you insert it, a button will appear to configure the module (for example just enter the text to display)\nThen you have to select at least 1 monitor in the grid below the group name textbox, here are types of selections:", + "gtceu.gui.central_monitor.in_group": "Monitors selected this way are added to the group, and will be used to display stuff", + "gtceu.gui.central_monitor.in_group_and_target": "The monitor selected this way is used for displaying and as a target at the same time.", + "gtceu.gui.central_monitor.left_click": "Select/unselect a monitor by left-clicking it", + "gtceu.gui.central_monitor.module_editor_button": "Edit module", + "gtceu.gui.central_monitor.module_editor_disabled": "You recently changed the module, please re-open this GUI to edit it", + "gtceu.gui.central_monitor.pause": "Pause placeholder execution.\nText won't be updated, and code won't be run.", + "gtceu.gui.central_monitor.resume": "Unpause placeholder execution.", + "gtceu.gui.central_monitor.right_click": "Select a block by right-clicking it. Only 1 block can be a target.", + "gtceu.gui.central_monitor.target": "The block selected this way is considered a target, to be used with placeholders in a text module.", + "gtceu.gui.central_monitor.text_module_help": "This module displays text that can have placeholders.\nPlaceholders are strings like \"{energy}\" that when displayed, will display their value instead (in this case the amount of energy).\nThey can also do some other things, such as set a redstone output/read redstone input, run calculations, etc.\nSome placeholders, like {energy} must have a target to function. A target is basically any block that can accept covers or is part of the\ncentral monitor multiblock. For example {energy} displays the amount of energy in its target block, usually a battery buffer or a PSS.\nSelect a target in the monitor group editing window, check out the help page there for more info.\nHere's an example usage of placeholders, that displays some energy info and sends a redstone signal when energy is <50%:\n", "gtceu.gui.central_monitor.text_scale": "Text scale", + "gtceu.gui.central_monitor.update_once": "Update text and run all placeholders in it exactly once.", + "gtceu.gui.central_monitor.url": "Input image URL:", "gtceu.gui.charger_slot.tooltip.0": "§fCharger Slot§r", "gtceu.gui.charger_slot.tooltip.1": "§7Draws power from %s batteries§r", "gtceu.gui.charger_slot.tooltip.2": "§7Charges %s tools and batteries", @@ -2402,8 +2441,7 @@ "gtceu.gui.computer_monitor_cover.placeholder_reference.1": "(hover for more info)", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.0": "Input placeholder to be used in place of %s '{}' here.", "gtceu.gui.computer_monitor_cover.second_page_textbox_tooltip.1": "For example, you can have a string 'Energy: {}/{} EU' and 'energy' and 'energyCapacity' in these text boxes.", - "gtceu.gui.computer_monitor_cover.slot_tooltip.0": "A slot for items that some placeholders can reference", - "gtceu.gui.computer_monitor_cover.slot_tooltip.1": "Slot number: %d", + "gtceu.gui.computer_monitor_cover.slot_tooltip": "A slot for items that some placeholders can reference\nSlot number: %d\n", "gtceu.gui.computer_monitor_cover.update_interval": "Update interval (in ticks)", "gtceu.gui.config_slot": "§fConfig Slot§r", "gtceu.gui.config_slot.auto_pull_managed": "§4Disabled:§7 Managed by Auto-Pull", @@ -2445,8 +2483,6 @@ "gtceu.gui.fluid_amount": "Fluid Amount:", "gtceu.gui.fluid_auto_input.tooltip.disabled": "Fluid Auto-Input Disabled", "gtceu.gui.fluid_auto_input.tooltip.enabled": "Fluid Auto-Input Enabled", - "gtceu.gui.fluid_auto_output.allow_input.disabled": "disable fluids input from the output side", - "gtceu.gui.fluid_auto_output.allow_input.enabled": "allow fluids input from the output side", "gtceu.gui.fluid_auto_output.disabled": "Fluid Auto Output: §cDisabled", "gtceu.gui.fluid_auto_output.enabled": "Fluid Auto Output: §aEnabled", "gtceu.gui.fluid_auto_output.other_direction.0": "Fluid Auto Output: §6Other Direction", @@ -2456,6 +2492,8 @@ "gtceu.gui.fluid_auto_output.tooltip.enabled": "Fluid Auto-Output Enabled", "gtceu.gui.fluid_auto_output.unselected.0": "Fluid Auto Output", "gtceu.gui.fluid_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", + "gtceu.gui.fluid_input_from_output.disabled": "Allow Fluid Input from Output Side: §cDisabled", + "gtceu.gui.fluid_input_from_output.enabled": "Allow Fluid Input from Output Side: §aEnabled", "gtceu.gui.fluid_lock.tooltip.disabled": "Fluid Locking Disabled", "gtceu.gui.fluid_lock.tooltip.enabled": "Fluid Locking Enabled", "gtceu.gui.fluid_voiding": "§7Voiding §9Fluids", @@ -2464,8 +2502,6 @@ "gtceu.gui.fuel_amount": "Fuel Amount:", "gtceu.gui.item_auto_input.tooltip.disabled": "Item Auto-Input Disabled", "gtceu.gui.item_auto_input.tooltip.enabled": "Item Auto-Input Enabled", - "gtceu.gui.item_auto_output.allow_input.disabled": "disable items input from the output side", - "gtceu.gui.item_auto_output.allow_input.enabled": "allow items input from the output side", "gtceu.gui.item_auto_output.disabled": "Item Auto Output: §cDisabled", "gtceu.gui.item_auto_output.enabled": "Item Auto Output: §aEnabled", "gtceu.gui.item_auto_output.other_direction.0": "Item Auto Output: §6Other Direction", @@ -2475,6 +2511,9 @@ "gtceu.gui.item_auto_output.tooltip.enabled": "Item Auto-Output Enabled", "gtceu.gui.item_auto_output.unselected.0": "Item Auto Output", "gtceu.gui.item_auto_output.unselected.1": "§7Select a side of the machine to configure its output.", + "gtceu.gui.item_collector.range": "Range: ", + "gtceu.gui.item_input_from_output.disabled": "Allow Item Input from Output Side: §cDisabled", + "gtceu.gui.item_input_from_output.enabled": "Allow Item Input from Output Side: §aEnabled", "gtceu.gui.item_lock.tooltip.disabled": "Item Locking Disabled", "gtceu.gui.item_lock.tooltip.enabled": "Item Locking Enabled", "gtceu.gui.item_voiding": "§7Voiding §6Items", @@ -2484,8 +2523,13 @@ "gtceu.gui.machinemode.tab_tooltip": "Change active Machine Mode", "gtceu.gui.machinemode.title": "Active Machine Mode", "gtceu.gui.me_bus.auto_pull_button": "Click to toggle automatic item pulling from ME", + "gtceu.gui.me_network.auto_pull_toggle": "Toggle Auto-Pull", + "gtceu.gui.me_network.empty": "Empty", + "gtceu.gui.me_network.min_stack_size": "Min Stack Size:", "gtceu.gui.me_network.offline": "Network Status: §4Offline§r", "gtceu.gui.me_network.online": "Network Status: §2Online§r", + "gtceu.gui.me_network.stocking_settings": "Stocking Settings", + "gtceu.gui.me_network.ticks_per_cycle": "Ticks Per Cycle:", "gtceu.gui.multiblock.voiding_mode": "Voiding Mode:", "gtceu.gui.no_voiding": "§7Voiding Nothing", "gtceu.gui.output_setting.title": "Output Settings", @@ -2500,6 +2544,7 @@ "gtceu.gui.overclock.off": "X", "gtceu.gui.overclock.range": "Available Tiers [%s, %s]", "gtceu.gui.overclock.title": "Overclock Tier", + "gtceu.gui.pattern_buffer.set_custom_name": "Set Custom Name: ", "gtceu.gui.silktouch.disabled.0": "Silk Touch Disabled: Click to Enable.", "gtceu.gui.silktouch.disabled.1": "§7Switching requires an idle machine.", "gtceu.gui.silktouch.enabled.0": "Silk Touch Enabled: Click to Disable.", @@ -2513,11 +2558,13 @@ "gtceu.gui.toggle_view.disabled": "Toggle View (Fluids)", "gtceu.gui.toggle_view.enabled": "Toggle View (Items)", "gtceu.gui.waiting_list": "Sending Queue:", + "gtceu.gui.waiting_list_empty": "Sending Queue: §2Empty", "gtceu.implosion_compressor": "Implosion Compressor", "gtceu.io.both": "Both", "gtceu.io.export": "Export", "gtceu.io.import": "Import", "gtceu.io.none": "None", + "gtceu.item.tooltip.image_url": "Image URL: %s", "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", "gtceu.item_list.item_stored": "§7Stored: %d", @@ -2626,6 +2673,7 @@ "gtceu.jei.ore_vein_diagram.spawn_range": "Spawn Range:", "gtceu.jei.ore_vein_diagram.weight": "Weight: %s", "gtceu.jei.programmed_circuit": "Programmed Circuit Page", + "gtceu.journeymap.options.layers": "Prospection layers", "gtceu.key.armor_charging": "Armor Charging to Inventory Toggle", "gtceu.key.armor_hover": "Armor Hover Toggle", "gtceu.key.armor_mode_switch": "Armor Mode Switch", @@ -3040,19 +3088,16 @@ "gtceu.machine.me_import_item_hatch.configs.tooltip": "Keeps 16 item types in stock", "gtceu.machine.miner.chunkradius": "Chunk Radius: %d", "gtceu.machine.miner.fluid_usage": "Uses §f%d mB/t §7of §f%s§7, doubled per overclock.", - "gtceu.machine.miner.minex": "mX: %d", - "gtceu.machine.miner.miney": "mY: %d", - "gtceu.machine.miner.minez": "mZ: %d", "gtceu.machine.miner.multi.description": "A multiblock mining machine that covers a large area and produces huge quantity of ore.", "gtceu.machine.miner.multi.modes": "Has Silk Touch and Chunk Aligned Modes.", "gtceu.machine.miner.multi.production": "Produces §f3x§7 more crushed ore than a §fMacerator§7.", "gtceu.machine.miner.per_block": "§7takes §f%ds §7per Block", "gtceu.machine.miner.progress": "Progress: %d/%d", "gtceu.machine.miner.radius": "Radius: %d", - "gtceu.machine.miner.startx": "sX: %d", - "gtceu.machine.miner.starty": "sY: %d", - "gtceu.machine.miner.startz": "sZ: %d", "gtceu.machine.miner.tooltip": "§7Mines ores below the Miner! Starts as §f%sx%s §7area", + "gtceu.machine.miner.x": "sX: %d, mX: %d", + "gtceu.machine.miner.y": "sY: %d, mY: %d", + "gtceu.machine.miner.z": "sZ: %d, mZ: %d", "gtceu.machine.muffle.off": "Sound Muffling: Disabled", "gtceu.machine.muffle.on": "Sound Muffling: Enabled", "gtceu.machine.muffler_hatch.tooltip.0": "Recovers waste from machines", @@ -3107,6 +3152,7 @@ "gtceu.machine.opv_gas_collector.tooltip": "§7Collects Gas from the universe depending on the dimension", "gtceu.machine.opv_rock_crusher.tooltip": "§7Volcanic Formation Chamber", "gtceu.machine.parallel_hatch.display": "Adjust the maximum parallel of the multiblock", + "gtceu.machine.parallel_hatch.parallel_ui": "Parallels", "gtceu.machine.parallel_hatch_mk5.tooltip": "Allows to run up to 4 recipes in parallel.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Allows to run up to 16 recipes in parallel.", "gtceu.machine.parallel_hatch_mk7.tooltip": "Allows to run up to 64 recipes in parallel.", @@ -3330,10 +3376,9 @@ "gtceu.multiblock.hpca.info_bridging_disabled": "Bridging Disabled", "gtceu.multiblock.hpca.info_bridging_enabled": "Bridging Enabled", "gtceu.multiblock.hpca.info_coolant_name": "PCB Coolant", + "gtceu.multiblock.hpca.info_cooling_demand": "Cooling Demand: %s / %d", "gtceu.multiblock.hpca.info_max_computation": "Max CWU/t: %s", "gtceu.multiblock.hpca.info_max_coolant_required": "Coolant Needed: %s", - "gtceu.multiblock.hpca.info_max_cooling_available": "Cooling Available: %s", - "gtceu.multiblock.hpca.info_max_cooling_demand": "Cooling Demand: %s", "gtceu.multiblock.hpca.temperature": "Temperature: %s", "gtceu.multiblock.hpca.warning_low_cooling": "- Not enough cooling", "gtceu.multiblock.hpca.warning_multiple_bridges": "- Multiple bridges in structure (provides no additional benefit)", @@ -3486,9 +3531,9 @@ "gtceu.multiblock.turbine.rotor_durability": "Rotor Durability: %s%%", "gtceu.multiblock.turbine.rotor_speed": "Rotor Speed: %s/%s RPM", "gtceu.multiblock.universal.distinct": "Distinct Buses:", + "gtceu.multiblock.universal.distinct.disabled": "Distinct Buses: §eDisabled", + "gtceu.multiblock.universal.distinct.enabled": "Distinct Buses: §eEnabled", "gtceu.multiblock.universal.distinct.info": "If enabled, each Item Input Bus will be treated as fully distinct from each other for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc.", - "gtceu.multiblock.universal.distinct.no": "No", - "gtceu.multiblock.universal.distinct.yes": "Yes", "gtceu.multiblock.universal.has_problems": "Has Maintenance Problems!", "gtceu.multiblock.universal.has_problems_header": "Fix the following issues in a Maintenance Hatch:", "gtceu.multiblock.universal.muffler_obstructed": "Muffler Hatch is Obstructed!", @@ -3519,6 +3564,14 @@ "gtceu.packer": "Packer", "gtceu.part_sharing.disabled": "Multiblock Sharing §4Disabled", "gtceu.part_sharing.enabled": "Multiblock Sharing §aEnabled", + "gtceu.placeholder_editor.constant_value": "This expression always evaluates to the same result.\nConsider replacing it with a constant.", + "gtceu.placeholder_editor.extra_closing_bracket": "Extra closing bracket", + "gtceu.placeholder_editor.no_placeholder": "Placeholder with name '%s' does not exist", + "gtceu.placeholder_editor.unclosed_bracket": "Unclosed bracket (\"}\")", + "gtceu.placeholder_editor.unclosed_brackets": "%d brackets (\"}\") are unclosed", + "gtceu.placeholder_editor.unclosed_escape": "Unclosed escape (\"']\")", + "gtceu.placeholder_editor.unclosed_escapes": "%d escapes (\"']\") are unclosed", + "gtceu.placeholder_editor.write_in_if": "Placeholders inside {if} are executed regardless of the condition.\nThis means that, for example, \"{if 0 {redstone set 15}}\" will produce redstone output.\nTo avoid this, use \"{eval {if \"\" \"\"}}\".", "gtceu.placeholder_info.active.0": "Returns a 1 if the block the cover is attached to is currently running a recipe, 0 otherwise.", "gtceu.placeholder_info.active.1": "Usage:", "gtceu.placeholder_info.active.2": " {active} -> whether there's a currently running recipe", @@ -3601,13 +3654,14 @@ "gtceu.placeholder_info.count.2": " {count [arg2] [arg3] [arg4] ...} -> the amount of arguments that are equal to the first", "gtceu.placeholder_info.data.0": "Stores or retrieves some data from a data item (data stick/orb/module) in one of the slots.", "gtceu.placeholder_info.data.1": "If you leave the argument empty, it will be replaced with the value p (p is an integer from 0 to (capacity - 1) that is stored in the data item nbt).", - "gtceu.placeholder_info.data.2": "Usage:", - "gtceu.placeholder_info.data.3": " {data get } -> the data stored in the item in the specified slot", - "gtceu.placeholder_info.data.4": " {data set } -> sets the data stored in the item in the specified slot, returns an empty string", - "gtceu.placeholder_info.data.5": " {data getp } -> p", - "gtceu.placeholder_info.data.6": " {data setp } -> sets p, returns an empty string", - "gtceu.placeholder_info.data.7": " {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0", - "gtceu.placeholder_info.data.8": " {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)", + "gtceu.placeholder_info.data.2": "If the slot argument is equal to 0, this placeholder will manipulate the data stick that is currently targeted by this text module inside a data hatch.", + "gtceu.placeholder_info.data.3": "Usage:", + "gtceu.placeholder_info.data.4": " {data get } -> the data stored in the item in the specified slot", + "gtceu.placeholder_info.data.5": " {data set } -> sets the data stored in the item in the specified slot, returns an empty string", + "gtceu.placeholder_info.data.6": " {data getp } -> p", + "gtceu.placeholder_info.data.7": " {data setp } -> sets p, returns an empty string", + "gtceu.placeholder_info.data.8": " {data inc } -> increments p by 1, if p becomes more than or equal to capacity, sets p to 0", + "gtceu.placeholder_info.data.9": " {data dec } -> decrements p by 1, if p becomes less than 0, sets p to (capacity - 1)", "gtceu.placeholder_info.displayTarget.0": "Returns the specified line that was transmitted to this cover using a display link.", "gtceu.placeholder_info.displayTarget.1": "Usage:", "gtceu.placeholder_info.displayTarget.2": " {displayTarget } -> the text on the specified line (line number is 1-100)", @@ -3704,12 +3758,20 @@ "gtceu.placeholder_info.setImage.0": "Sets the image URL in an image module in the specified slot", "gtceu.placeholder_info.setImage.1": "Usage:", "gtceu.placeholder_info.setImage.2": " {setImage } -> empty string", + "gtceu.placeholder_info.setTargetSlot.0": "Sets the index of the targeted data hatch slot.", + "gtceu.placeholder_info.setTargetSlot.1": "The change will take effect immediately after this placeholder executes.", + "gtceu.placeholder_info.setTargetSlot.2": "(Further placeholders will reference the new target)", + "gtceu.placeholder_info.setTargetSlot.3": "Usage:", + "gtceu.placeholder_info.setTargetSlot.4": " {setTargetSlot } -> empty string", "gtceu.placeholder_info.strike.0": "Returns the text from the first text, displaying it as if it was crossed out", "gtceu.placeholder_info.strike.1": "Usage:", "gtceu.placeholder_info.strike.2": " {strike } -> crossed-out text", "gtceu.placeholder_info.subList.0": "Returns arguments from with indexes from l (inclusive) to r (exclusive) (starting from 0)", "gtceu.placeholder_info.subList.1": "Usage:", "gtceu.placeholder_info.subList.2": " {subList [arg0] [arg1] ...} -> all arguments with indexes from l to r separated by spaces", + "gtceu.placeholder_info.targetSlot.0": "Returns the index of the targeted data hatch slot", + "gtceu.placeholder_info.targetSlot.1": "Usage:", + "gtceu.placeholder_info.targetSlot.2": " {targetSlot} -> (from 1 to 4/9/16)", "gtceu.placeholder_info.tick.0": "Returns the amount of ticks passed from when this cover was placed.", "gtceu.placeholder_info.tick.1": "Usage:", "gtceu.placeholder_info.tick.2": " {tick} -> the amount of ticks", @@ -3732,6 +3794,7 @@ "gtceu.plasma_generator": "Plasma Generator", "gtceu.polarizer": "Polarizer", "gtceu.primitive_blast_furnace": "Primitive Blast Furnace", + "gtceu.provider.computer_monitor_cover.error.no_target": "No target selected for the monitor group", "gtceu.pyrolyse_oven": "Pyrolyse Oven", "gtceu.recipe.byproduct_tier": "Byproducts from %s§r+", "gtceu.recipe.category.arc_furnace_recycling": "Arc Scrapping", @@ -3780,7 +3843,6 @@ "gtceu.recipe_modifier.default_fail": "Recipe Modifier Fail", "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "Insufficient Energy to Initiate Fusion Reaction", "gtceu.recipe_modifier.insufficient_voltage": "Voltage Tier Too Low", - "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", "gtceu.research_station": "Research Station", "gtceu.rock_breaker": "Rock Breaker", @@ -4267,6 +4329,7 @@ "item.gtceu.gray_glass_lens": "Glass Lens (Gray)", "item.gtceu.green_dye_spray_can": "Spray Can (Green)", "item.gtceu.green_glass_lens": "Glass Lens (Green)", + "item.gtceu.gui_module": "Gui Module", "item.gtceu.hammer_extruder_mold.tooltip": "§7Extruder Shape for making Hammers", "item.gtceu.hazmat_boots": "Hazardous Materials Suit Boots", "item.gtceu.hazmat_chestpiece": "Hazardous Materials Suit Chestpiece", @@ -5949,14 +6012,6 @@ "tagprefix.wire_gt_quadruple": "4x %s Wire", "tagprefix.wire_gt_single": "1x %s Wire", "tagprefix.wrench_tip": "%s Wrench Tip", - "tile.gtceu.brittle_charcoal.name": "Brittle Charcoal", - "tile.gtceu.brittle_charcoal.tooltip.0": "Produced by the Charcoal Pile Igniter.", - "tile.gtceu.brittle_charcoal.tooltip.1": "Mine this to get Charcoal.", - "tile.gtceu.foam.name": "Foam", - "tile.gtceu.petrified_foam.name": "Petrified Foam", - "tile.gtceu.reinforced_foam.name": "Reinforced Foam", - "tile.gtceu.reinforced_stone.name": "Reinforced Stone", - "tile.gtceu.seal.name": "Sealed Block", "tooltip.gtceu.antidote.description": "§aAntidote §7Hold Shift to show details", "tooltip.gtceu.antidote.description.effect_removed": "Removes %s%% of current conditions' effects", "tooltip.gtceu.antidote.description.effect_removed.all": "Removes all of current conditions' effects", @@ -5969,4 +6024,4 @@ "tooltip.gtceu.hazard_trigger.skin_contact": "Skin contact", "tooltip.gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:" -} +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index b4c1d4f19c6..cec496eab60 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -15,13 +15,13 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.data.tag.TagUtil; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.TagPrefixItem; import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.component.*; import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.common.data.materials.GTFoods; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index dff1cc89f4b..71bf452cbe1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -6,13 +6,13 @@ import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.GTCapability; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index 27b7ed6a1c5..82ecdbe5842 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; +import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.widgets.prospector.ProspectorMapHandler; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -159,8 +159,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData guiData, PanelSyncManag return true; } return false; - })) - ); + }))); return panel; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java index ee4d722b6b4..126293073c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java @@ -106,7 +106,8 @@ private DynamicSyncHandler createListSyncHandler() { return new ButtonWidget<>().widgetTheme(IThemeApi.BUTTON) .onMousePressed((x, y, button) -> { - if (button == InputConstants.MOUSE_BUTTON_LEFT || button == InputConstants.MOUSE_BUTTON_RIGHT) { + if (button == InputConstants.MOUSE_BUTTON_LEFT || + button == InputConstants.MOUSE_BUTTON_RIGHT) { this.texture.setSelected(uniqueId); return true; } @@ -229,9 +230,8 @@ private void addOresToList(T[][][] data) { } // If the cursor is over an ore use its name - T[] hoveredItem = this.texture.data - [chunkX * mode.cellSize + (offsetX * mode.cellSize / 16)] - [chunkZ * mode.cellSize + (offsetZ * mode.cellSize / 16)]; + T[] hoveredItem = this.texture.data[chunkX * mode.cellSize + (offsetX * mode.cellSize / 16)][chunkZ * + mode.cellSize + (offsetZ * mode.cellSize / 16)]; if (hoveredItem != null && hoveredItem.length != 0) { String uniqueId = mode.getUniqueId(hoveredItem[0]); Component name = mode.getDescription(hoveredItem[0]); @@ -243,7 +243,8 @@ private void addOresToList(T[][][] data) { if (mode == ProspectorMode.ORE) { var veins = GTClientCache.instance.getNearbyVeins(player.level().dimension(), pos, 32); if (veins.isEmpty()) { - return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), 0xFF990000); + return new WaypointItem(pos, null, Component.translatable("gtceu.minimap.ore_vein.depleted"), + 0xFF990000); } veins.sort((o1, o2) -> { int o1Dist = (int) o1.center().distToCenterSqr(x, o1.center().getY(), z); diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 37b2c532d39..3cf1d8497af 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -137,22 +137,22 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget // player rotation & red lines are drawn separately /* - - TransformTexture arrow = ARROW.rotate(this.direction / 2); - arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); - - // draw red vertical line - if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); - } - // draw red horizontal line - if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); - } else { - DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); - } + * + * TransformTexture arrow = ARROW.rotate(this.direction / 2); + * arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); + * + * // draw red vertical line + * if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { + * DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); + * } else { + * DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); + * } + * // draw red horizontal line + * if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { + * DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); + * } else { + * DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); + * } */ } From 1e47c9b6b5c987baaac2af7fd5f1fa25137b1f03 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 16:34:57 +0300 Subject: [PATCH 09/15] Repackage (again) --- .../component}/prospector/ProspectingUpdatePacket.java | 2 +- .../{mui => item/component}/prospector/ProspectorMode.java | 2 +- src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java | 2 +- .../gtceu/common/item/behavior/PortableScannerBehavior.java | 2 +- .../gtceu/common/item/behavior/ProspectorScannerBehavior.java | 2 +- .../common/mui/widgets/prospector/ProspectorMapHandler.java | 4 ++-- .../common/mui/widgets/prospector/ProspectorMapTexture.java | 4 ++-- .../packets/prospecting/SPacketProspectBedrockFluid.java | 2 +- .../packets/prospecting/SPacketProspectBedrockOre.java | 2 +- .../gregtechceu/gtceu/integration/map/GenericMapRenderer.java | 2 +- .../gtceu/integration/map/GroupingMapRenderer.java | 2 +- .../gtceu/integration/map/cache/client/GTClientCache.java | 2 +- .../gtceu/integration/map/cache/fluid/FluidCache.java | 2 +- .../gtceu/integration/map/ftbchunks/FTBChunksRenderer.java | 2 +- .../integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java | 2 +- .../gtceu/integration/map/journeymap/JourneymapRenderer.java | 2 +- .../gtceu/integration/map/layer/builtin/FluidRenderLayer.java | 2 +- .../gtceu/integration/map/xaeros/XaerosRenderer.java | 2 +- .../map/xaeros/minimap/fluid/FluidChunkHighlighter.java | 2 +- .../map/xaeros/worldmap/fluid/FluidChunkHighlighter.java | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) rename src/main/java/com/gregtechceu/gtceu/api/{mui => item/component}/prospector/ProspectingUpdatePacket.java (96%) rename src/main/java/com/gregtechceu/gtceu/api/{mui => item/component}/prospector/ProspectorMode.java (99%) diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java rename to src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java index 5bdae9a72ca..793328b392b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectingUpdatePacket.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectingUpdatePacket.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.mui.prospector; +package com.gregtechceu.gtceu.api.item.component.prospector; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java rename to src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java index 906bc84c76a..860431e71d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/prospector/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.mui.prospector; +package com.gregtechceu.gtceu.api.item.component.prospector; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index cec496eab60..2a3b59b29f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -21,7 +21,7 @@ import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.component.*; import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.common.data.materials.GTFoods; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index 71bf452cbe1..a17c77ddc8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index 82ecdbe5842..bca1e9b798f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.widgets.prospector.ProspectorMapHandler; import com.gregtechceu.gtceu.config.ConfigHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java index 126293073c7..a5eef929300 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.common.mui.widgets.prospector; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectingUpdatePacket; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectingUpdatePacket; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.common.mui.drawable.BorderDrawable; import com.gregtechceu.gtceu.integration.map.WaypointManager; import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 3cf1d8497af..54f08a46ded 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.mui.widgets.prospector; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectingUpdatePacket; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectingUpdatePacket; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.utils.GradientUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java index c3a7b25a6f0..84208265d84 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockFluid.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.network.packets.prospecting; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.cache.client.GTClientCache; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java index 6c9687b38b2..d2fb9ed9638 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java +++ b/src/main/java/com/gregtechceu/gtceu/common/network/packets/prospecting/SPacketProspectBedrockOre.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.network.packets.prospecting; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java index c343ede62be..98b8254cd24 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GenericMapRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.MapRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java index b28f7f116a4..503a75e913c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/GroupingMapRenderer.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksRenderer; import com.gregtechceu.gtceu.integration.map.journeymap.JourneymapRenderer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java index 6504dff1c17..e720f305187 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/client/GTClientCache.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.cache.client; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.cache.DimensionCache; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java index 00ae1f3dea7..ca21683da90 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/cache/fluid/FluidCache.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.map.cache.fluid; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java index b393c8ab866..8deac8ca970 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/FTBChunksRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.ftbchunks; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.fluid.FluidVeinIcon; import com.gregtechceu.gtceu.integration.map.ftbchunks.veins.ore.OreVeinIcon; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java index 8c47a5ad0ca..82de9fa941d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/fluid/FluidVeinIcon.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.ftbchunks.veins.fluid; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksOptions; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java index 7fa18f4f82b..7dc05241163 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/journeymap/JourneymapRenderer.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.WaypointManager; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java index 2cd2af6253a..8dd081eabbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/layer/builtin/FluidRenderLayer.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.map.layer.builtin; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.MapRenderLayer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java index 59ba7294d88..b5e80d2b364 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/XaerosRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.map.xaeros; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GenericMapRenderer; import com.gregtechceu.gtceu.integration.map.xaeros.common.ore.OreVeinElement; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java index 4711a0810c7..d5ab2171c7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/fluid/FluidChunkHighlighter.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java index 300e7564c6a..8ab37bc0e47 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/fluid/FluidChunkHighlighter.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.mui.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; import com.gregtechceu.gtceu.integration.map.xaeros.XaerosRenderer; From 8ad8186428b989d268a7faf5b93670e9e4142812 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 18:17:08 +0300 Subject: [PATCH 10/15] It works now --- .../component/prospector/ProspectorMode.java | 18 +-- .../gtceu/api/mui/IItemUIHolder.java | 20 ++-- .../gtceu/common/data/GTItems.java | 2 +- .../behavior/PortableScannerBehavior.java | 2 +- .../behavior/ProspectorScannerBehavior.java | 86 ++++++-------- .../prospector/ProspectorMapHandler.java | 109 +++++++++--------- .../prospector/ProspectorMapTexture.java | 37 +++--- 7 files changed, 127 insertions(+), 147 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java index 860431e71d4..9538e895924 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/prospector/ProspectorMode.java @@ -35,7 +35,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidStack; -import brachy.modularui.api.drawable.IIcon; +import brachy.modularui.api.drawable.IDrawable; import brachy.modularui.drawable.FluidDrawable; import brachy.modularui.drawable.GuiDraw; import brachy.modularui.drawable.ItemDrawable; @@ -60,7 +60,7 @@ public abstract class ProspectorMode { private static final String MATERIAL_PREFIX = "material_"; private final Map> BLOCK_CACHE = new HashMap<>(); - private final Map, IIcon> ICON_CACHE = new HashMap<>(); + private final Map, IDrawable> ICON_CACHE = new HashMap<>(); @Override public void scan(Either[][][] storage, LevelChunk chunk) { @@ -93,7 +93,7 @@ public int getItemColor(Either item) { } @Override - public IIcon getItemIcon(Either item) { + public IDrawable getItemIcon(Either item) { return ICON_CACHE.computeIfAbsent(item, either -> { List items = either.map(material -> { List oreItems = ChemicalHelper.getItems(new MaterialEntry(TagPrefix.rawOre, material)); @@ -120,7 +120,7 @@ public IIcon getItemIcon(Either item) { .map(ItemDrawable::new) .toArray(ItemDrawable[]::new); - return new CycleDrawable(drawables).asIcon().size(12); + return new CycleDrawable(drawables); }); } @@ -248,8 +248,8 @@ public int getItemColor(FluidInfo item) { } @Override - public IIcon getItemIcon(FluidInfo item) { - return new FluidDrawable(item.asStack()).asIcon(); + public IDrawable getItemIcon(FluidInfo item) { + return new FluidDrawable(item.asStack()); } @Override @@ -332,7 +332,7 @@ public int getItemColor(BedrockOreInfo item) { } @Override - public IIcon getItemIcon(BedrockOreInfo item) { + public IDrawable getItemIcon(BedrockOreInfo item) { Material material = item.material; ItemStack stack = GTUtil.getFirstNonEmpty( ChemicalHelper.get(TagPrefix.get(ConfigHolder.INSTANCE.machines.bedrockOreDropTagPrefix), material), @@ -340,7 +340,7 @@ public IIcon getItemIcon(BedrockOreInfo item) { ChemicalHelper.get(TagPrefix.gem, material), ChemicalHelper.get(TagPrefix.ore, material), ChemicalHelper.get(TagPrefix.dust, material)); - return new ItemDrawable(stack).asIcon().size(12); + return new ItemDrawable(stack); } @Override @@ -402,7 +402,7 @@ public void appendTooltips(List items, List tooltip public abstract int getItemColor(T item); - public abstract IIcon getItemIcon(T item); + public abstract IDrawable getItemIcon(T item); public abstract Component getDescription(T item); diff --git a/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java b/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java index 21a2154c7a5..3a259070d63 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/mui/IItemUIHolder.java @@ -27,20 +27,22 @@ default boolean shouldOpenUI() { @Override default InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { - if (!shouldOpenUI()) - return IInteractionItem.super.use(item, level, player, usedHand); - if (level.isClientSide) - PlayerInventoryUIFactory.INSTANCE.openFromHandClient(usedHand); + if (!shouldOpenUI()) return IInteractionItem.super.use(item, level, player, usedHand); + + if (!level.isClientSide) { + PlayerInventoryUIFactory.INSTANCE.openFromHand(player, usedHand); + } return InteractionResultHolder.sidedSuccess(player.getItemInHand(usedHand), level.isClientSide); } @Override default InteractionResult useOn(UseOnContext context) { - if (!shouldOpenUI()) - return IInteractionItem.super.useOn(context); - if (context.getLevel().isClientSide) - PlayerInventoryUIFactory.INSTANCE.openFromHandClient(context.getHand()); - return InteractionResult.SUCCESS; + if (!shouldOpenUI()) return IInteractionItem.super.useOn(context); + + if (!context.getLevel().isClientSide) { + PlayerInventoryUIFactory.INSTANCE.openFromHand(context.getPlayer(), context.getHand()); + } + return InteractionResult.sidedSuccess(context.getLevel().isClientSide); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 2a3b59b29f7..fafef5889c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -20,8 +20,8 @@ import com.gregtechceu.gtceu.api.item.TagPrefixItem; import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.component.*; -import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; import com.gregtechceu.gtceu.common.data.materials.GTFoods; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index a17c77ddc8e..2b6b7f3e896 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -8,11 +8,11 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java index bca1e9b798f..fcef5ba3df2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ProspectorScannerBehavior.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; +import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.widgets.prospector.ProspectorMapHandler; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -21,16 +21,15 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import brachy.modularui.api.IThemeApi; -import brachy.modularui.drawable.DynamicDrawable; -import brachy.modularui.drawable.UITexture; import brachy.modularui.factory.PlayerInventoryGuiData; import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; +import brachy.modularui.utils.Alignment; +import brachy.modularui.value.BoolValue; import brachy.modularui.value.StringValue; import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.ButtonWidget; import brachy.modularui.widgets.DynamicSyncedWidget; +import brachy.modularui.widgets.ToggleButton; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -42,11 +41,6 @@ public class ProspectorScannerBehavior implements IItemUIHolder, IInteractionItem, IAddInformation { - private static final UITexture DARK_MODE_BUTTON_INACTIVE = GTGuiTextures.PROGRESS_BAR_SOLAR_STEEL - .getSubArea(0, 0.5f, 1, 0.5f); - private static final UITexture DARK_MODE_BUTTON_ACTIVE = GTGuiTextures.PROGRESS_BAR_SOLAR_STEEL - .getSubArea(0, 0, 1, 0.5f); - private final int radius; private final long cost; private final ProspectorMode[] modes; @@ -117,50 +111,42 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List buildUI(PlayerInventoryGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { ProspectorMode mode = getMode(guiData.getPlayer().getItemInHand(InteractionHand.MAIN_HAND)); - final int diameter = radius * 2 - 1; StringValue searchValue = new StringValue(""); + DynamicSyncedWidget searchList = new DynamicSyncedWidget<>(); - DynamicSyncedWidget searchList; + ProspectorMapHandler mapHandler = new ProspectorMapHandler<>(mode, this.radius, 1, searchValue, searchList, + panelSyncManager, guiData.getPlayer()); - var panel = ModularPanel.defaultPanel("prospector_scanner", 332, 200) + return ModularPanel.defaultPanel("prospector_scanner", 332, 200) .margin(4) - .child(Flow.col() - .leftRel(1.0f) - .child(new TextFieldWidget() - .value(searchValue) - .height(16) - .widthRel(1f) - .autoUpdateOnChange(true)) - .child(searchList = new DynamicSyncedWidget<>())); - - ProspectorMapHandler mapHandler = new ProspectorMapHandler<>(mode, radius, 1, searchValue, searchList, - panelSyncManager); - - panel.child(Flow.col() - .topRel(0.5f).leftRel(0.0f) - .size(diameter) - .margin(2) - .background(GTGuiTextures.BACKGROUND_INVERSE) - .child(mapHandler) - .child(new ButtonWidget<>().widgetTheme(IThemeApi.BUTTON) - .top(0).leftRelAnchor(0.0f, 1.0f) - .margin(2) - .backgroundOverlay(new DynamicDrawable(() -> { - if (mapHandler.getTexture().isDarkMode()) { - return DARK_MODE_BUTTON_ACTIVE; - } else { - return DARK_MODE_BUTTON_INACTIVE; - } - })) - .onMousePressed((mouseX, mouseY, button) -> { - if (button == 0 || button == 1) { - mapHandler.getTexture().toggleDarkMode(); - return true; - } - return false; - }))); - - return panel; + .child(new ToggleButton() + .size(18) + .top(4).leftRelAnchor(0f, 1f) + .decoration() + .stateBackground(GTGuiTextures.PROGRESS_BAR_SOLAR_STEEL) + .value(new BoolValue.Dynamic(mapHandler.getTexture()::isDarkMode, + mapHandler.getTexture()::setDarkMode))) + .child(Flow.row() + .childPadding(10) + .margin(6) + .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN) + .crossAxisAlignment(Alignment.CrossAxis.START) + .child(mapHandler + .verticalCenter().left(0)) + .child(Flow.col() + .coverChildrenWidth(136) + .top(0).right(0) + .child(new TextFieldWidget() + .value(searchValue) + .right(0) + .widthRel(1f).height(16) + .autoUpdateOnChange(true)) + .child(searchList + .right(0) + .padding(2) + .expanded() + .widthRel(1f) + .background(GTGuiTextures.BACKGROUND_INVERSE)))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java index a5eef929300..8a3e2b5217c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapHandler.java @@ -22,25 +22,21 @@ import brachy.modularui.api.IThemeApi; import brachy.modularui.api.drawable.IKey; import brachy.modularui.api.widget.Interactable; -import brachy.modularui.drawable.DynamicDrawable; +import brachy.modularui.drawable.GuiTextures; import brachy.modularui.utils.Alignment; +import brachy.modularui.value.BoolValue; import brachy.modularui.value.StringValue; import brachy.modularui.value.sync.DynamicSyncHandler; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.widget.Widget; -import brachy.modularui.widgets.ButtonWidget; -import brachy.modularui.widgets.DynamicSyncedWidget; -import brachy.modularui.widgets.ListWidget; -import brachy.modularui.widgets.ScrollingTextWidget; +import brachy.modularui.widgets.*; import brachy.modularui.widgets.layout.Flow; -import com.mojang.blaze3d.platform.InputConstants; -import info.journeymap.shaded.org.eclipse.jetty.util.ConcurrentHashSet; +import com.google.common.base.Strings; import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.LinkedBlockingQueue; public class ProspectorMapHandler extends Widget> implements Interactable { @@ -63,15 +59,14 @@ public class ProspectorMapHandler extends Widget> imp private final ProspectorMapTexture texture; // runtime - private final Queue> packetQueue = new LinkedBlockingQueue<>(); - private final Set items = new ConcurrentHashSet<>(); - - // runtime + @Getter + private @Nullable String selected = null; + private final Set items = new HashSet<>(); private int chunkIndex = 0; public ProspectorMapHandler(ProspectorMode mode, int chunkRadius, int scanInterval, StringValue searchValue, DynamicSyncedWidget searchListWidget, - PanelSyncManager panelSyncManager) { + PanelSyncManager panelSyncManager, Player player) { super(); this.mode = mode; this.chunkRadius = chunkRadius; @@ -80,66 +75,65 @@ public ProspectorMapHandler(ProspectorMode mode, int chunkRadius, int scanInt this.searchValue = searchValue; this.syncHandler = createListSyncHandler(); searchListWidget.syncHandler(this.syncHandler); - panelSyncManager.onServerTick(this::scanOres); - this.player = panelSyncManager.getPlayer(); + this.player = player; this.playerChunkPos = player.chunkPosition(); - this.texture = new ProspectorMapTexture<>(this, this.player.chunkPosition()); + this.texture = new ProspectorMapTexture<>(this); background(this.texture); + size(this.texture.getImageWidth(), this.texture.getImageHeight()); + + panelSyncManager.onServerTick(this::scanOres); } private DynamicSyncHandler createListSyncHandler() { return new DynamicSyncHandler() .widgetProvider((syncManager, buf) -> { ProspectingUpdatePacket packet = ProspectingUpdatePacket.read(this.mode, buf); - this.texture.updateTexture(packet); + if (syncManager.isClient()) { + this.texture.updateTexture(packet); + } this.addOresToList(packet.data); return new ListWidget<>() .collapseDisabledChildren() .expanded() - .widthRel(1f) + .sizeRel(1f) .children(this.items, item -> { String uniqueId = mode.getUniqueId(item); Component description = mode.getDescription(item); - return new ButtonWidget<>().widgetTheme(IThemeApi.BUTTON) - .onMousePressed((x, y, button) -> { - if (button == InputConstants.MOUSE_BUTTON_LEFT || - button == InputConstants.MOUSE_BUTTON_RIGHT) { - this.texture.setSelected(uniqueId); + BoolValue.Dynamic selected = new BoolValue.Dynamic( + () -> Objects.equals(this.getSelected(), uniqueId), + v -> this.setSelected(v ? uniqueId : null, syncManager.isClient())); + + return new ToggleButton().widgetTheme(IThemeApi.TOGGLE_BUTTON) + .value(selected) + .widthRel(1f).height(18) + .background(GuiTextures.BUTTON_CLEAN) + .selectedBackground(WHITE_BORDER) + .setEnabledIf(w -> { + String searched = searchValue.getStringValue(); + if (Strings.isNullOrEmpty(searched)) { return true; - } - return false; - }) - .backgroundOverlay(new DynamicDrawable(() -> { - if (Objects.equals(this.texture.getSelected(), uniqueId)) { - return WHITE_BORDER; } else { - return null; + return description.getString().toLowerCase().contains(searched); } - })) + }) .child(Flow.row() - .height(15).widthRel(1f) - .padding(2) - .marginBottom(-1) - .widgetTheme(IThemeApi.BUTTON) + .sizeRel(1f) + .padding(4, 0) + // .marginBottom(-1) .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN) - .setEnabledIf(w -> { - String searched = searchValue.getStringValue(); - if (searched == null) { - return true; - } else { - return description.getString().toLowerCase().contains(searched); - } - }) - .child(mode.getItemIcon(item).asWidget()) + .child(mode.getItemIcon(item).asWidget() + .verticalCenter().leftRel(0f) + .size(12)) .child(new ScrollingTextWidget(IKey.lang(description)) - .widgetTheme(IThemeApi.BUTTON) - .textAlign(Alignment.CENTER) - .expanded() - .height(16) + .textAlign(Alignment.CenterLeft) + .verticalCenter() + // .expanded() + .margin(1) + .left(20).right(2) .invisible())); }); }); @@ -151,7 +145,7 @@ private void scanOres() { Level level = this.player.level(); int chunkDiameter = this.chunkRadius * 2 - 1; - if (getContext().getTick() % this.scanInterval == 0 && this.chunkIndex < chunkDiameter * chunkDiameter) { + if (this.player.tickCount % this.scanInterval == 0 && this.chunkIndex < chunkDiameter * chunkDiameter) { int row = this.chunkIndex / chunkDiameter; int column = this.chunkIndex % chunkDiameter; @@ -164,8 +158,7 @@ private void scanOres() { } ProspectingUpdatePacket packet = new ProspectingUpdatePacket<>(this.playerChunkPos.x + ox, - this.playerChunkPos.z + oz, - mode); + this.playerChunkPos.z + oz, mode); mode.scan(packet.data, chunk); this.syncHandler.notifyUpdate(packet::writePacketData); @@ -181,6 +174,16 @@ private void addOresToList(T[][][] data) { } } + public void setSelected(@Nullable String uniqueID, boolean isClient) { + if (!Objects.equals(this.selected, uniqueID)) { + this.selected = uniqueID; + + if (isClient) { + this.texture.loadToImage(); + } + } + } + @Override public @NotNull Result onMousePressed(double mouseX, double mouseY, int button) { if (!WaypointManager.isActive()) return Result.IGNORE; @@ -218,10 +221,10 @@ private void addOresToList(T[][][] data) { BlockPos pos = new BlockPos(x, y, z); // If the ores are filtered use its name - if (this.texture.getSelected() != null) { + if (this.getSelected() != null) { for (T item : this.items) { String uniqueId = mode.getUniqueId(item); - if (!this.texture.getSelected().equals(uniqueId)) continue; + if (!this.getSelected().equals(uniqueId)) continue; Component name = mode.getDescription(item); int color = mode.getItemColor(item); diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 54f08a46ded..e6e153ceb90 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -7,7 +7,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.world.level.ChunkPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -19,11 +18,9 @@ import com.mojang.blaze3d.platform.TextureUtil; import com.mojang.blaze3d.systems.RenderSystem; import lombok.Getter; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.lang.reflect.Array; -import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -39,16 +36,14 @@ public class ProspectorMapTexture extends AbstractTexture implements IDrawabl private final int imageHeight; public final T[][][] data; - @Getter - private @Nullable String selected = null; @Getter private boolean darkMode = false; - public ProspectorMapTexture(ProspectorMapHandler mapHandler, ChunkPos playerChunkPos) { + public ProspectorMapTexture(ProspectorMapHandler mapHandler) { this.mapHandler = mapHandler; - int diameter = mapHandler.getChunkRadius() * 2 - 1; ProspectorMode mode = mapHandler.getMode(); + int diameter = mapHandler.getChunkRadius() * 2 - 1; this.imageWidth = this.imageHeight = diameter * 16; // noinspection unchecked @@ -56,10 +51,6 @@ public ProspectorMapTexture(ProspectorMapHandler mapHandler, ChunkPos playerC diameter * mode.cellSize, diameter * mode.cellSize, 0); } - public void toggleDarkMode() { - this.darkMode = !this.darkMode; - } - public void updateTexture(ProspectingUpdatePacket packet) { int ox = packet.chunkX - mapHandler.getPlayerChunkPos().x; int oz = packet.chunkZ - mapHandler.getPlayerChunkPos().z; @@ -86,16 +77,21 @@ private NativeImage getImage() { for (int x = 0; x < this.imageWidth; x++) { for (int z = 0; z < this.imageHeight; z++) { T[] items = this.data[x * mode.cellSize / 16][z * mode.cellSize / 16]; - // draw background color - image.setPixelRGBA(x, z, (darkMode ? 0xFF666666 : 0xFFFFFFFF)); + boolean drewColor = false; // draw items for (T item : items) { - if (selected != null && !selected.equals(mode.getUniqueId(item))) continue; + if (mapHandler.getSelected() == null || mapHandler.getSelected().equals(mode.getUniqueId(item))) { + int color = mode.getItemColor(item); + image.setPixelRGBA(x, z, GradientUtil.argbToAbgr(color) | 0xFF000000); - int color = mode.getItemColor(item); - image.setPixelRGBA(x, z, GradientUtil.argbToAbgr(color) | 0xFF000000); - break; + drewColor = true; + break; + } + } + if (!drewColor) { + // draw background color + image.setPixelRGBA(x, z, (darkMode ? 0xFF666666 : 0xFFFFFFFF)); } // draw grid if (x % 16 == 0 || z % 16 == 0) { @@ -165,11 +161,4 @@ public void setDarkMode(boolean darkMode) { loadToImage(); } } - - public void setSelected(String uniqueID) { - if (!Objects.equals(this.selected, uniqueID)) { - this.selected = uniqueID; - loadToImage(); - } - } } From d6e53b5f5c1ff7e7fde2791e44a978bb4f0492e0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 18:43:09 +0300 Subject: [PATCH 11/15] Also draw the player location arrow & lines --- .../gtceu/client/GuiSpriteManager.java | 1 + .../prospector/ProspectorMapTexture.java | 49 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/GuiSpriteManager.java b/src/main/java/com/gregtechceu/gtceu/client/GuiSpriteManager.java index 8a9611e67f0..552d32bdc98 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/GuiSpriteManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/GuiSpriteManager.java @@ -16,6 +16,7 @@ * Note that the atlas JSON should be kept, as MC 1.21 only adds textures in gui/sprites to the atlas. We want * all of them. */ +// TODO delete, handled in MUI public class GuiSpriteManager extends TextureAtlasHolder { public static final ResourceLocation LOCATION_GUI = GTCEu.id("textures/atlas/gui.png"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index e6e153ceb90..3ea566992fd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -7,17 +7,24 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ChunkPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import brachy.modularui.api.drawable.IDrawable; import brachy.modularui.drawable.GuiDraw; +import brachy.modularui.drawable.GuiTextures; +import brachy.modularui.drawable.UITexture; import brachy.modularui.screen.viewport.GuiContext; import brachy.modularui.theme.WidgetTheme; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.TextureUtil; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import lombok.Getter; +import org.joml.Quaternionf; import java.io.IOException; import java.lang.reflect.Array; @@ -29,6 +36,9 @@ @OnlyIn(Dist.CLIENT) public class ProspectorMapTexture extends AbstractTexture implements IDrawable { + private static final UITexture ARROW = GuiTextures.PLAY; + private static final Quaternionf rotationQuat = new Quaternionf(); + private final ProspectorMapHandler mapHandler; @Getter private final int imageWidth; @@ -131,25 +141,26 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget } } - // player rotation & red lines are drawn separately - /* - * - * TransformTexture arrow = ARROW.rotate(this.direction / 2); - * arrow.draw(graphics, 0, 0, x + playerXGui - 20, y + playerYGui - 20, 40, 40); - * - * // draw red vertical line - * if (playerXGui % 16 > 7 || playerXGui % 16 == 0) { - * DrawerHelper.drawSolidRect(graphics, x + playerXGui - 1, y, 1, imageHeight, ColorPattern.RED.color); - * } else { - * DrawerHelper.drawSolidRect(graphics, x + playerXGui, y, 1, imageHeight, ColorPattern.RED.color); - * } - * // draw red horizontal line - * if (playerYGui % 16 > 7 || playerYGui % 16 == 0) { - * DrawerHelper.drawSolidRect(graphics, x, y + playerYGui - 1, imageWidth, 1, ColorPattern.RED.color); - * } else { - * DrawerHelper.drawSolidRect(graphics, x, y + playerYGui, imageWidth, 1, ColorPattern.RED.color); - * } - */ + Player player = this.mapHandler.getPlayer(); + ChunkPos playerChunkPos = player.chunkPosition(); + int chunkRadius = this.mapHandler.getChunkRadius(); + + float playerRotationDeg = (player.getVisualRotationYInDegrees() + 180f) / 2f; + int playerXGui = player.getBlockX() - (playerChunkPos.x - chunkRadius + 1) * 16; + int playerYGui = player.getBlockZ() - (playerChunkPos.z - chunkRadius + 1) * 16; + + // these are the same colors the F3 debug overlay uses for X and Z + // draw red vertical line + GuiDraw.drawRect(context.getGraphics(), x + playerXGui, y, 1, imageHeight, 0xFFFF0000); + // draw bluish horizontal line + GuiDraw.drawRect(context.getGraphics(), x, y + playerYGui, imageWidth, 1, 0xFF7F7FFF); + + PoseStack poseStack = context.graphicsPose(); + + poseStack.pushPose(); + poseStack.mulPose(rotationQuat.rotationZ(Mth.DEG_TO_RAD * playerRotationDeg)); + ARROW.draw(context, x + playerXGui - 20, y + playerYGui - 20, 40, 40); + poseStack.popPose(); } @Override From 743a57c5520369f7eb637856834703de8f3f213f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 18:46:50 +0300 Subject: [PATCH 12/15] Default to dark mode so people see their tin veins --- .../common/mui/widgets/prospector/ProspectorMapTexture.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 3ea566992fd..8209cebc83b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -47,7 +47,7 @@ public class ProspectorMapTexture extends AbstractTexture implements IDrawabl public final T[][][] data; @Getter - private boolean darkMode = false; + private boolean darkMode = true; public ProspectorMapTexture(ProspectorMapHandler mapHandler) { this.mapHandler = mapHandler; From 792bca3c68ea8306e390cfe50cba595a9257b708 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 19:04:11 +0300 Subject: [PATCH 13/15] Fix the player rotation marker being rotated from the wrong location --- .../mui/widgets/prospector/ProspectorMapTexture.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 8209cebc83b..47104233127 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -25,6 +25,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import lombok.Getter; import org.joml.Quaternionf; +import org.lwjgl.opengl.GL11; import java.io.IOException; import java.lang.reflect.Array; @@ -157,10 +158,18 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget PoseStack poseStack = context.graphicsPose(); + RenderSystem.disableDepthTest(); + RenderSystem.depthFunc(GL11.GL_ALWAYS); + poseStack.pushPose(); + poseStack.translate(x + playerXGui, y + playerYGui, 0f); poseStack.mulPose(rotationQuat.rotationZ(Mth.DEG_TO_RAD * playerRotationDeg)); - ARROW.draw(context, x + playerXGui - 20, y + playerYGui - 20, 40, 40); + poseStack.translate(4, 0, 0); + ARROW.draw(context, -10, -10, 20, 20); poseStack.popPose(); + + RenderSystem.enableDepthTest(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); } @Override From 1ddc316453ce0ad6f515138e4800f018f1e0e3de Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 5 May 2026 19:08:19 +0300 Subject: [PATCH 14/15] Spotless --- .../common/mui/widgets/prospector/ProspectorMapTexture.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 47104233127..447f9b0298a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -154,7 +154,7 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget // draw red vertical line GuiDraw.drawRect(context.getGraphics(), x + playerXGui, y, 1, imageHeight, 0xFFFF0000); // draw bluish horizontal line - GuiDraw.drawRect(context.getGraphics(), x, y + playerYGui, imageWidth, 1, 0xFF7F7FFF); + GuiDraw.drawRect(context.getGraphics(), x, y + playerYGui, imageWidth, 1, 0xFF7F7FFF); PoseStack poseStack = context.graphicsPose(); From 597850184757e0d32f864a5ea75506154bafbe4b Mon Sep 17 00:00:00 2001 From: YoungOnionMC Date: Tue, 5 May 2026 15:15:54 -0600 Subject: [PATCH 15/15] fix up the player arrow a bit --- .../widgets/prospector/ProspectorMapTexture.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java index 447f9b0298a..fbd012b3a45 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/prospector/ProspectorMapTexture.java @@ -146,16 +146,10 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget ChunkPos playerChunkPos = player.chunkPosition(); int chunkRadius = this.mapHandler.getChunkRadius(); - float playerRotationDeg = (player.getVisualRotationYInDegrees() + 180f) / 2f; + float playerRotationDeg = ((player.getVisualRotationYInDegrees() % 360.0f) + 180f) - 90.0f; int playerXGui = player.getBlockX() - (playerChunkPos.x - chunkRadius + 1) * 16; int playerYGui = player.getBlockZ() - (playerChunkPos.z - chunkRadius + 1) * 16; - // these are the same colors the F3 debug overlay uses for X and Z - // draw red vertical line - GuiDraw.drawRect(context.getGraphics(), x + playerXGui, y, 1, imageHeight, 0xFFFF0000); - // draw bluish horizontal line - GuiDraw.drawRect(context.getGraphics(), x, y + playerYGui, imageWidth, 1, 0xFF7F7FFF); - PoseStack poseStack = context.graphicsPose(); RenderSystem.disableDepthTest(); @@ -164,8 +158,9 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget poseStack.pushPose(); poseStack.translate(x + playerXGui, y + playerYGui, 0f); poseStack.mulPose(rotationQuat.rotationZ(Mth.DEG_TO_RAD * playerRotationDeg)); - poseStack.translate(4, 0, 0); - ARROW.draw(context, -10, -10, 20, 20); + poseStack.translate(-5.f, -5.f, 0.0f); + + ARROW.draw(context, 0, 0, 10, 10); poseStack.popPose(); RenderSystem.enableDepthTest();