Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions src/main/java/com/listmore/config/ListMoreConfigGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,42 @@
import com.listmore.ListMore;

import fi.dy.masa.malilib.gui.GuiConfigsBase;
import fi.dy.masa.malilib.gui.button.ButtonBase;
import fi.dy.masa.malilib.gui.button.ButtonGeneric;
import fi.dy.masa.malilib.gui.button.IButtonActionListener;
import fi.dy.masa.malilib.util.StringUtils;

public class ListMoreConfigGui extends GuiConfigsBase {
private static ConfigTab tab = ConfigTab.GENERIC;

public ListMoreConfigGui() {
super(10, 50, ListMore.MOD_ID, null, "listmore.gui.title");
}

@Override
public void initGui() {
super.initGui();
this.clearOptions();

int x = 10;
for (ConfigTab currentTab : ConfigTab.values()) {
x += this.createButton(x, 26, -1, currentTab) + 2;
}
}

private int createButton(int x, int y, int width, ConfigTab configTab) {
ButtonGeneric button = new ButtonGeneric(x, y, width, 20, configTab.getDisplayName());
button.setEnabled(tab != configTab);
this.addButton(button, new ButtonListener(configTab, this));
return button.getWidth();
}

@Override
protected int getConfigWidth() {
if (tab == ConfigTab.GENERIC) {
return 200;
}

return 200;
}

Expand All @@ -21,8 +49,40 @@ protected int getBrowserHeight() {
return this.height - 70;
}

@Override
protected boolean useKeybindSearch() {
return tab == ConfigTab.ALL;
}

@Override
public List<ConfigOptionWrapper> getConfigs() {
return ConfigOptionWrapper.createFor(ListMoreConfigs.Generic.OPTIONS);
}

private record ButtonListener(ConfigTab tab, ListMoreConfigGui parent) implements IButtonActionListener {
@Override
public void actionPerformedWithButton(ButtonBase button, int mouseButton) {
ListMoreConfigGui.tab = this.tab;
this.parent.reCreateListWidget();
if (this.parent.getListWidget() != null) {
this.parent.getListWidget().resetScrollbarPosition();
}
this.parent.initGui();
}
}

private enum ConfigTab {
ALL("malilib.gui.title.all"),
GENERIC("listmore.gui.tab.generic");

private final String translationKey;

ConfigTab(String translationKey) {
this.translationKey = translationKey;
}

public String getDisplayName() {
return StringUtils.translate(this.translationKey);
}
}
}
84 changes: 9 additions & 75 deletions src/main/java/com/listmore/render/InvalidFurnaceInputRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,10 @@
//$$ import com.mojang.blaze3d.buffers.GpuBufferSlice;
//#endif
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.MeshData;
import com.listmore.config.ListMoreConfigs;
import com.listmore.utils.WorldRenderUtils;

import fi.dy.masa.malilib.interfaces.IRenderer;
import fi.dy.masa.malilib.render.MaLiLibPipelines;
import fi.dy.masa.malilib.render.RenderContext;
import fi.dy.masa.malilib.render.RenderUtils;
import fi.dy.masa.malilib.util.data.Color4f;

import net.minecraft.client.Camera;
Expand Down Expand Up @@ -187,76 +183,14 @@ private static LevelChunk getLoadedChunk(ClientLevel clientLevel, ServerLevel se

// 为每个目标熔炉绘制
private static void drawMarkers(List<BlockPos> furnaces) {
//#if MC >= 26.2
//$$ Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.mainCamera().position();
//#elseif MC >= 12111
//$$ Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.getMainCamera().position();
//#else
Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
//#endif
RenderContext fillContext = new RenderContext(
() -> "listmore:invalid_furnace_input_fill",
MaLiLibPipelines.POSITION_COLOR_MASA_NO_DEPTH_NO_CULL
//#if MC >= 26.2
//$$ , 0
//#endif
);
RenderContext outlineContext = new RenderContext(
() -> "listmore:invalid_furnace_input_outline",
MaLiLibPipelines.DEBUG_LINES_MASA_SIMPLE_NO_DEPTH_NO_CULL
//#if MC >= 26.2
//$$ , 0
//#endif
Vec3 cameraPosition = WorldRenderUtils.getCameraPosition();
WorldRenderUtils.drawFilledOutlinedBlockBoxes(
"listmore:invalid_furnace_input",
furnaces,
cameraPosition,
BOX_INSET,
FILL_COLOR,
OUTLINE_COLOR
);
//#if MC < 12111
outlineContext.lineWidth(2.0F);
//#endif

try {
// 世界末尾渲染使用相对于当前相机的坐标,使标记与视角保持正确对应
BufferBuilder fillBuilder = fillContext.getBuilder();
BufferBuilder outlineBuilder = outlineContext.getBuilder();
for (BlockPos furnace : furnaces) {
float minX = (float) (furnace.getX() + BOX_INSET - cameraPosition.x);
float minY = (float) (furnace.getY() + BOX_INSET - cameraPosition.y);
float minZ = (float) (furnace.getZ() + BOX_INSET - cameraPosition.z);
float maxX = minX + 1.0F - BOX_INSET * 2.0F;
float maxY = minY + 1.0F - BOX_INSET * 2.0F;
float maxZ = minZ + 1.0F - BOX_INSET * 2.0F;

RenderUtils.drawBoxAllSidesBatchedQuads(minX, minY, minZ, maxX, maxY, maxZ, FILL_COLOR, fillBuilder);
RenderUtils.drawBoxAllEdgesBatchedLines(minX, minY, minZ, maxX, maxY, maxZ, OUTLINE_COLOR
//#if MC >= 12111
//$$ , 2.0F
//#endif
, outlineBuilder);
}

draw(fillContext, fillBuilder.build());
draw(outlineContext, outlineBuilder.build());
} finally {
closeQuietly(fillContext);
closeQuietly(outlineContext);
}
}

// 提交网格并在绘制完成后释放
private static void draw(RenderContext context, MeshData mesh) {
if (mesh == null) {
return;
}
try {
context.draw(mesh, false, true);
} finally {
mesh.close();
}
}

// 渲染上下文关闭失败时不影响后续渲染
private static void closeQuietly(RenderContext context) {
try {
context.close();
} catch (Exception ignored) {
}
}
}
62 changes: 7 additions & 55 deletions src/main/java/com/listmore/render/ProjectileLandingRenderer.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package com.listmore.render;

import com.listmore.config.ListMoreConfigs;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.MeshData;
import com.listmore.utils.WorldRenderUtils;
//#if MC >= 26.1
//$$ import com.mojang.blaze3d.buffers.GpuBufferSlice;
//#endif
import com.mojang.blaze3d.pipeline.RenderTarget;
import fi.dy.masa.malilib.interfaces.IRenderer;
import fi.dy.masa.malilib.render.MaLiLibPipelines;
import fi.dy.masa.malilib.render.RenderContext;
import fi.dy.masa.malilib.render.RenderUtils;
import fi.dy.masa.malilib.util.data.Color4f;

import net.minecraft.client.Camera;
Expand Down Expand Up @@ -165,58 +161,14 @@ private static EntityHit findEntityHit(Level level, LocalPlayer player, Vec3 sta
}

private static void drawMarker(LandingPoint landing) {
//#if MC >= 26.2
//$$ Vec3 position = landing.position.subtract(Minecraft.getInstance().gameRenderer.mainCamera().position());
//#elseif MC >= 12111
//$$ Vec3 position = landing.position.subtract(Minecraft.getInstance().gameRenderer.getMainCamera().position());
//#else
Vec3 position = landing.position.subtract(Minecraft.getInstance().gameRenderer.getMainCamera().getPosition());
//#endif
Vec3 position = landing.position.subtract(WorldRenderUtils.getCameraPosition());
Color4f color = landing.hitEntity ? new Color4f(1.0F, 0.0F, 0.0F, 0.6F) : new Color4f(0.0F, 1.0F, 0.2F, 0.6F);
RenderContext context = new RenderContext(
() -> "listmore:projectile_landing",
MaLiLibPipelines.DEBUG_LINES_MASA_SIMPLE_NO_DEPTH_NO_CULL
//#if MC >= 26.2
//$$ , 0
//#endif
WorldRenderUtils.drawOutlinedBox(
"listmore:projectile_landing",
position,
HALF_SIZE,
color
);
//#if MC < 12111
context.lineWidth(2.0F);
//#endif

try {
BufferBuilder builder = context.getBuilder();
RenderUtils.drawBoxAllEdgesBatchedLines(
(float) (position.x - HALF_SIZE), (float) (position.y - HALF_SIZE), (float) (position.z - HALF_SIZE),
(float) (position.x + HALF_SIZE), (float) (position.y + HALF_SIZE), (float) (position.z + HALF_SIZE),
color
//#if MC >= 12111
//$$ , 2.0F
//#endif
, builder
);
draw(context, builder.build());
} finally {
closeQuietly(context);
}
}

private static void draw(RenderContext context, MeshData mesh) {
if (mesh == null) {
return;
}
try {
context.draw(mesh, false, true);
} finally {
mesh.close();
}
}

private static void closeQuietly(RenderContext context) {
try {
context.close();
} catch (Exception ignored) {
}
}

private enum ProjectileSpec {
Expand Down
83 changes: 9 additions & 74 deletions src/main/java/com/listmore/render/TntExplosionPreviewRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,11 @@
//$$ import com.mojang.blaze3d.buffers.GpuBufferSlice;
//#endif
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.MeshData;
import com.listmore.config.ListMoreConfigs;
import com.listmore.config.TntExplosionPreviewMode;
import com.listmore.utils.WorldRenderUtils;

import fi.dy.masa.malilib.interfaces.IRenderer;
import fi.dy.masa.malilib.render.MaLiLibPipelines;
import fi.dy.masa.malilib.render.RenderContext;
import fi.dy.masa.malilib.render.RenderUtils;
import fi.dy.masa.malilib.util.data.Color4f;

import net.minecraft.client.Camera;
Expand Down Expand Up @@ -199,13 +195,7 @@ private static Set<BlockPos> calculateAffectedBlocks(ClientLevel level, Vec3 cen

// 半预览仅绘制红色范围,全预览额外绘制红黄
private static void drawMarkers(PreviewBlocks blocks) {
//#if MC >= 26.2
//$$ Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.mainCamera().position();
//#elseif MC >= 12111
//$$ Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.getMainCamera().position();
//#else
Vec3 cameraPosition = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
//#endif
Vec3 cameraPosition = WorldRenderUtils.getCameraPosition();
drawMarkers(blocks.conservative(), cameraPosition, "conservative", CONSERVATIVE_FILL_COLOR, CONSERVATIVE_OUTLINE_COLOR);
if (ListMoreConfigs.Generic.TNT_EXPLOSION_PREVIEW_MODE.getOptionListValue() == TntExplosionPreviewMode.FULL) {
drawMarkers(blocks.possible(), cameraPosition, "possible", POSSIBLE_FILL_COLOR, POSSIBLE_OUTLINE_COLOR);
Expand All @@ -217,69 +207,14 @@ private static void drawMarkers(Set<BlockPos> positions, Vec3 cameraPosition, St
if (positions.isEmpty()) {
return;
}

RenderContext fillContext = new RenderContext(
() -> "listmore:tnt_explosion_" + type + "_fill",
MaLiLibPipelines.POSITION_COLOR_MASA_NO_DEPTH_NO_CULL
//#if MC >= 26.2
//$$ , 0
//#endif
);
RenderContext outlineContext = new RenderContext(
() -> "listmore:tnt_explosion_" + type + "_outline",
MaLiLibPipelines.DEBUG_LINES_MASA_SIMPLE_NO_DEPTH_NO_CULL
//#if MC >= 26.2
//$$ , 0
//#endif
WorldRenderUtils.drawFilledOutlinedBlockBoxes(
"listmore:tnt_explosion_" + type,
positions,
cameraPosition,
BOX_INSET,
fillColor,
outlineColor
);
//#if MC < 12111
outlineContext.lineWidth(2.0F);
//#endif

try {
BufferBuilder fillBuilder = fillContext.getBuilder();
BufferBuilder outlineBuilder = outlineContext.getBuilder();
for (BlockPos position : positions) {
float minX = (float) (position.getX() + BOX_INSET - cameraPosition.x);
float minY = (float) (position.getY() + BOX_INSET - cameraPosition.y);
float minZ = (float) (position.getZ() + BOX_INSET - cameraPosition.z);
float maxX = minX + 1.0F - BOX_INSET * 2.0F;
float maxY = minY + 1.0F - BOX_INSET * 2.0F;
float maxZ = minZ + 1.0F - BOX_INSET * 2.0F;

RenderUtils.drawBoxAllSidesBatchedQuads(minX, minY, minZ, maxX, maxY, maxZ, fillColor, fillBuilder);
RenderUtils.drawBoxAllEdgesBatchedLines(minX, minY, minZ, maxX, maxY, maxZ, outlineColor
//#if MC >= 12111
//$$ , 2.0F
//#endif
, outlineBuilder);
}

draw(fillContext, fillBuilder.build());
draw(outlineContext, outlineBuilder.build());
} finally {
closeQuietly(fillContext);
closeQuietly(outlineContext);
}
}

// 绘制后立即释放
private static void draw(RenderContext context, MeshData mesh) {
if (mesh == null) {
return;
}
try {
context.draw(mesh, false, true);
} finally {
mesh.close();
}
}

private static void closeQuietly(RenderContext context) {
try {
context.close();
} catch (Exception ignored) {
}
}

private record PreviewBlocks(Set<BlockPos> conservative, Set<BlockPos> possible) {
Expand Down
Loading