feat: 调整翻倍限制输入框样式为ae输入框样式
This commit is contained in:
parent
00ff25cc05
commit
75817040a2
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.extendedae_plus.api;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于在 AEBaseScreen.drawBG 中渲染输入框背景的回调接口
|
||||||
|
*/
|
||||||
|
public interface IInputBackgroundRenderer {
|
||||||
|
/**
|
||||||
|
* 在背景层绘制输入框外部背景
|
||||||
|
* @param guiGraphics 图形上下文
|
||||||
|
*/
|
||||||
|
void eap$renderInputBackground(GuiGraphics guiGraphics);
|
||||||
|
}
|
||||||
|
|
@ -2,8 +2,11 @@ package com.extendedae_plus.mixin.advancedae.client.gui;
|
||||||
|
|
||||||
import appeng.api.config.YesNo;
|
import appeng.api.config.YesNo;
|
||||||
import appeng.client.gui.AEBaseScreen;
|
import appeng.client.gui.AEBaseScreen;
|
||||||
|
import appeng.client.gui.Icon;
|
||||||
import appeng.client.gui.style.ScreenStyle;
|
import appeng.client.gui.style.ScreenStyle;
|
||||||
|
import appeng.client.gui.widgets.AETextField;
|
||||||
import appeng.client.gui.widgets.SettingToggleButton;
|
import appeng.client.gui.widgets.SettingToggleButton;
|
||||||
|
import com.extendedae_plus.api.IInputBackgroundRenderer;
|
||||||
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
||||||
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
||||||
import com.extendedae_plus.init.ModNetwork;
|
import com.extendedae_plus.init.ModNetwork;
|
||||||
|
|
@ -11,9 +14,8 @@ import com.extendedae_plus.network.provider.SetPerProviderScalingLimitC2SPacket;
|
||||||
import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket;
|
import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket;
|
||||||
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
||||||
import com.extendedae_plus.util.GuiUtil;
|
import com.extendedae_plus.util.GuiUtil;
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
import net.minecraft.client.gui.components.Button;
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.components.EditBox;
|
|
||||||
import net.minecraft.client.gui.components.Tooltip;
|
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import net.pedroksl.advanced_ae.client.gui.AdvPatternProviderScreen;
|
import net.pedroksl.advanced_ae.client.gui.AdvPatternProviderScreen;
|
||||||
|
|
@ -24,31 +26,35 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
||||||
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
* 为高级ae样板供应器界面添加"高级阻挡模式"按钮。
|
||||||
* - 位于左侧工具栏
|
* - 位于左侧工具栏
|
||||||
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
||||||
*/
|
*/
|
||||||
@Mixin(AdvPatternProviderScreen.class)
|
@Mixin(AdvPatternProviderScreen.class)
|
||||||
public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatternProviderMenu> {
|
public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatternProviderMenu> implements IInputBackgroundRenderer {
|
||||||
// 高级阻挡模式切换按钮
|
// 高级阻挡模式切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
||||||
// 智能翻倍切换按钮
|
// 智能翻倍切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
||||||
// 智能翻倍上限输入框
|
// 智能翻倍上限输入框
|
||||||
@Unique private EditBox eap$PerProviderLimitInput;
|
@Unique private AETextField eap$PerProviderLimitInput;
|
||||||
|
|
||||||
// 当前高级阻挡模式是否启用
|
// 当前高级阻挡模式是否启用
|
||||||
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
||||||
// 当前智能翻倍是否启用
|
// 当前智能翻倍是否启用
|
||||||
@Unique private boolean eap$SmartDoublingEnabled = false;
|
@Unique private boolean eap$SmartDoublingEnabled = false;
|
||||||
// 当前智能翻倍上限
|
// 当前智能翻倍上限
|
||||||
@Unique private int eap$PerProviderScalingLimit = 0;
|
@Unique private int eap$PerProviderScalingLimit = 0;
|
||||||
|
@Unique private int eap$inputBgX;
|
||||||
|
@Unique private int eap$inputBgY;
|
||||||
|
@Unique private int eap$inputBgW;
|
||||||
|
@Unique private int eap$inputBgH;
|
||||||
|
|
||||||
public AdvPatternProviderScreenMixin(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
public AdvPatternProviderScreenMixin(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
||||||
super(menu, playerInventory, title, style);
|
super(menu, playerInventory, title, style);
|
||||||
|
|
@ -104,15 +110,14 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
|
||||||
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
||||||
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
||||||
|
|
||||||
// 缩放上限输入框(使用 GuiUtil 抽离)
|
// 缩放上限输入框
|
||||||
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.font, this.eap$PerProviderScalingLimit, limit -> {
|
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.style, this.font, this.eap$PerProviderScalingLimit, limit -> {
|
||||||
this.eap$PerProviderScalingLimit = limit;
|
this.eap$PerProviderScalingLimit = limit;
|
||||||
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
||||||
});
|
});
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------- 注入点 ---------------------------- */
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void eap$onInit(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
private void eap$onInit(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||||
// 初始化时同步服务端状态并创建控件
|
// 初始化时同步服务端状态并创建控件
|
||||||
|
|
@ -165,31 +170,43 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.eap$SmartDoublingEnabled) {
|
if (this.eap$SmartDoublingEnabled) {
|
||||||
// 智能翻倍启用时,确保输入框可见
|
|
||||||
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
// 未聚焦且内容为空时,显示0
|
|
||||||
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
||||||
this.eap$PerProviderLimitInput.setValue("0");
|
this.eap$PerProviderLimitInput.setValue("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定位输入框到智能翻倍按钮左侧
|
|
||||||
Button ref = eap$SmartDoublingToggle;
|
Button ref = eap$SmartDoublingToggle;
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
int ex = ref.getX() - this.eap$PerProviderLimitInput.getWidth() - 5;
|
int visualWidth = this.eap$PerProviderLimitInput.getWidth() + 4 + this.font.width("_");
|
||||||
int ey = ref.getY() + 2;
|
int visualHeight = 16;
|
||||||
this.eap$PerProviderLimitInput.setX(ex);
|
int padding = 2;
|
||||||
this.eap$PerProviderLimitInput.setY(ey);
|
int ex = ref.getX() - visualWidth - 5 - padding;
|
||||||
|
int ey = ref.getY() + (ref.getHeight() - visualHeight) / 2 - padding + 4;
|
||||||
|
this.eap$PerProviderLimitInput.setX(ex + padding);
|
||||||
|
this.eap$PerProviderLimitInput.setY(ey + padding);
|
||||||
|
this.eap$inputBgX = ex;
|
||||||
|
this.eap$inputBgY = ey;
|
||||||
|
this.eap$inputBgW = visualWidth + padding * 2;
|
||||||
|
this.eap$inputBgH = visualHeight + padding * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置 tooltip
|
|
||||||
String cur = this.eap$PerProviderLimitInput.getValue();
|
String cur = this.eap$PerProviderLimitInput.getValue();
|
||||||
if (cur.isBlank()) cur = "0";
|
if (cur.isBlank()) cur = "0";
|
||||||
this.eap$PerProviderLimitInput.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
this.eap$PerProviderLimitInput.setTooltipMessage(Collections.singletonList(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
||||||
} else {
|
} else {
|
||||||
// 智能翻倍未启用时,移除输入框
|
|
||||||
this.removeWidget(this.eap$PerProviderLimitInput);
|
this.removeWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void eap$renderInputBackground(GuiGraphics guiGraphics) {
|
||||||
|
if (this.eap$SmartDoublingEnabled
|
||||||
|
&& this.eap$PerProviderLimitInput != null && this.eap$PerProviderLimitInput.isVisible()) {
|
||||||
|
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter()
|
||||||
|
.dest(this.eap$inputBgX - 5, this.eap$inputBgY - 3, this.eap$inputBgW + 6, this.eap$inputBgH - 2)
|
||||||
|
.blit(guiGraphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,11 @@ package com.extendedae_plus.mixin.advancedae.client.gui;
|
||||||
|
|
||||||
import appeng.api.config.YesNo;
|
import appeng.api.config.YesNo;
|
||||||
import appeng.client.gui.AEBaseScreen;
|
import appeng.client.gui.AEBaseScreen;
|
||||||
|
import appeng.client.gui.Icon;
|
||||||
import appeng.client.gui.style.ScreenStyle;
|
import appeng.client.gui.style.ScreenStyle;
|
||||||
|
import appeng.client.gui.widgets.AETextField;
|
||||||
import appeng.client.gui.widgets.SettingToggleButton;
|
import appeng.client.gui.widgets.SettingToggleButton;
|
||||||
|
import com.extendedae_plus.api.IInputBackgroundRenderer;
|
||||||
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
||||||
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
||||||
import com.extendedae_plus.init.ModNetwork;
|
import com.extendedae_plus.init.ModNetwork;
|
||||||
|
|
@ -11,9 +14,8 @@ import com.extendedae_plus.network.provider.SetPerProviderScalingLimitC2SPacket;
|
||||||
import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket;
|
import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket;
|
||||||
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
||||||
import com.extendedae_plus.util.GuiUtil;
|
import com.extendedae_plus.util.GuiUtil;
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
import net.minecraft.client.gui.components.Button;
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.components.EditBox;
|
|
||||||
import net.minecraft.client.gui.components.Tooltip;
|
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import net.pedroksl.advanced_ae.client.gui.SmallAdvPatternProviderScreen;
|
import net.pedroksl.advanced_ae.client.gui.SmallAdvPatternProviderScreen;
|
||||||
|
|
@ -25,31 +27,35 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
||||||
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
* 为高级ae样板供应器界面添加"高级阻挡模式"按钮。
|
||||||
* - 位于左侧工具栏
|
* - 位于左侧工具栏
|
||||||
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
||||||
*/
|
*/
|
||||||
@Mixin(SmallAdvPatternProviderScreen.class)
|
@Mixin(SmallAdvPatternProviderScreen.class)
|
||||||
public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<SmallAdvPatternProviderMenu> {
|
public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<SmallAdvPatternProviderMenu> implements IInputBackgroundRenderer {
|
||||||
// 高级阻挡模式切换按钮
|
// 高级阻挡模式切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
||||||
// 智能翻倍切换按钮
|
// 智能翻倍切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
||||||
// 智能翻倍上限输入框
|
// 智能翻倍上限输入框
|
||||||
@Unique private EditBox eap$PerProviderLimitInput;
|
@Unique private AETextField eap$PerProviderLimitInput;
|
||||||
|
|
||||||
// 当前高级阻挡模式是否启用
|
// 当前高级阻挡模式是否启用
|
||||||
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
||||||
// 当前智能翻倍是否启用
|
// 当前智能翻倍是否启用
|
||||||
@Unique private boolean eap$SmartDoublingEnabled = false;
|
@Unique private boolean eap$SmartDoublingEnabled = false;
|
||||||
// 当前智能翻倍上限
|
// 当前智能翻倍上限
|
||||||
@Unique private int eap$PerProviderScalingLimit = 0;
|
@Unique private int eap$PerProviderScalingLimit = 0;
|
||||||
|
@Unique private int eap$inputBgX;
|
||||||
|
@Unique private int eap$inputBgY;
|
||||||
|
@Unique private int eap$inputBgW;
|
||||||
|
@Unique private int eap$inputBgH;
|
||||||
|
|
||||||
public SmallAdvPatternProviderScreenMixin(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
public SmallAdvPatternProviderScreenMixin(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
||||||
super(menu, playerInventory, title, style);
|
super(menu, playerInventory, title, style);
|
||||||
|
|
@ -105,15 +111,14 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
|
||||||
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
||||||
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
||||||
|
|
||||||
// 缩放上限输入框(使用 GuiUtil 抽离)
|
// 缩放上限输入框
|
||||||
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.font, this.eap$PerProviderScalingLimit, limit -> {
|
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.style, this.font, this.eap$PerProviderScalingLimit, limit -> {
|
||||||
this.eap$PerProviderScalingLimit = limit;
|
this.eap$PerProviderScalingLimit = limit;
|
||||||
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
||||||
});
|
});
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------- 注入点 ---------------------------- */
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void eap$onInit(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
private void eap$onInit(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||||
// 初始化时同步服务端状态并创建控件
|
// 初始化时同步服务端状态并创建控件
|
||||||
|
|
@ -166,31 +171,43 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.eap$SmartDoublingEnabled) {
|
if (this.eap$SmartDoublingEnabled) {
|
||||||
// 智能翻倍启用时,确保输入框可见
|
|
||||||
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
// 未聚焦且内容为空时,显示0
|
|
||||||
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
||||||
this.eap$PerProviderLimitInput.setValue("0");
|
this.eap$PerProviderLimitInput.setValue("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定位输入框到智能翻倍按钮左侧
|
|
||||||
Button ref = eap$SmartDoublingToggle;
|
Button ref = eap$SmartDoublingToggle;
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
int ex = ref.getX() - this.eap$PerProviderLimitInput.getWidth() - 5;
|
int visualWidth = this.eap$PerProviderLimitInput.getWidth() + 4 + this.font.width("_");
|
||||||
int ey = ref.getY() + 2;
|
int visualHeight = 16;
|
||||||
this.eap$PerProviderLimitInput.setX(ex);
|
int padding = 2;
|
||||||
this.eap$PerProviderLimitInput.setY(ey);
|
int ex = ref.getX() - visualWidth - 5 - padding;
|
||||||
|
int ey = ref.getY() + (ref.getHeight() - visualHeight) / 2 - padding + 4;
|
||||||
|
this.eap$PerProviderLimitInput.setX(ex + padding);
|
||||||
|
this.eap$PerProviderLimitInput.setY(ey + padding);
|
||||||
|
this.eap$inputBgX = ex;
|
||||||
|
this.eap$inputBgY = ey;
|
||||||
|
this.eap$inputBgW = visualWidth + padding * 2;
|
||||||
|
this.eap$inputBgH = visualHeight + padding * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置 tooltip
|
|
||||||
String cur = this.eap$PerProviderLimitInput.getValue();
|
String cur = this.eap$PerProviderLimitInput.getValue();
|
||||||
if (cur.isBlank()) cur = "0";
|
if (cur.isBlank()) cur = "0";
|
||||||
this.eap$PerProviderLimitInput.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
this.eap$PerProviderLimitInput.setTooltipMessage(Collections.singletonList(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
||||||
} else {
|
} else {
|
||||||
// 智能翻倍未启用时,移除输入框
|
|
||||||
this.removeWidget(this.eap$PerProviderLimitInput);
|
this.removeWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void eap$renderInputBackground(GuiGraphics guiGraphics) {
|
||||||
|
if (this.eap$SmartDoublingEnabled
|
||||||
|
&& this.eap$PerProviderLimitInput != null && this.eap$PerProviderLimitInput.isVisible()) {
|
||||||
|
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter()
|
||||||
|
.dest(this.eap$inputBgX - 5, this.eap$inputBgY - 3, this.eap$inputBgW + 6, this.eap$inputBgH - 2)
|
||||||
|
.blit(guiGraphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import appeng.client.gui.style.ScreenStyle;
|
||||||
import appeng.client.gui.style.Text;
|
import appeng.client.gui.style.Text;
|
||||||
import appeng.menu.slot.AppEngSlot;
|
import appeng.menu.slot.AppEngSlot;
|
||||||
import com.extendedae_plus.api.IExPatternPage;
|
import com.extendedae_plus.api.IExPatternPage;
|
||||||
|
import com.extendedae_plus.api.IInputBackgroundRenderer;
|
||||||
import com.extendedae_plus.content.ClientPatternHighlightStore;
|
import com.extendedae_plus.content.ClientPatternHighlightStore;
|
||||||
import com.extendedae_plus.init.ModNetwork;
|
import com.extendedae_plus.init.ModNetwork;
|
||||||
import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor;
|
import com.extendedae_plus.mixin.ae2.accessor.AEBaseScreenAccessor;
|
||||||
|
|
@ -226,4 +227,12 @@ public abstract class AEBaseScreenMixin {
|
||||||
guiGraphics.pose().popPose();
|
guiGraphics.pose().popPose();
|
||||||
} catch (Throwable ignored) {}
|
} catch (Throwable ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "drawBG", at = @At("TAIL"), remap = false)
|
||||||
|
private void eap$renderInputBackground(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, int mouseY, float partialTicks, CallbackInfo ci) {
|
||||||
|
Object self = this;
|
||||||
|
if (self instanceof IInputBackgroundRenderer renderer) {
|
||||||
|
renderer.eap$renderInputBackground(guiGraphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,14 @@ package com.extendedae_plus.mixin.ae2.client.gui.patternProvider;
|
||||||
|
|
||||||
import appeng.api.config.YesNo;
|
import appeng.api.config.YesNo;
|
||||||
import appeng.client.gui.AEBaseScreen;
|
import appeng.client.gui.AEBaseScreen;
|
||||||
|
import appeng.client.gui.Icon;
|
||||||
import appeng.client.gui.implementations.PatternProviderScreen;
|
import appeng.client.gui.implementations.PatternProviderScreen;
|
||||||
import appeng.client.gui.style.ScreenStyle;
|
import appeng.client.gui.style.ScreenStyle;
|
||||||
|
import appeng.client.gui.widgets.AETextField;
|
||||||
import appeng.client.gui.widgets.SettingToggleButton;
|
import appeng.client.gui.widgets.SettingToggleButton;
|
||||||
import appeng.menu.implementations.PatternProviderMenu;
|
import appeng.menu.implementations.PatternProviderMenu;
|
||||||
import com.extendedae_plus.api.IExPatternButton;
|
import com.extendedae_plus.api.IExPatternButton;
|
||||||
|
import com.extendedae_plus.api.IInputBackgroundRenderer;
|
||||||
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync;
|
||||||
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync;
|
||||||
import com.extendedae_plus.init.ModNetwork;
|
import com.extendedae_plus.init.ModNetwork;
|
||||||
|
|
@ -15,9 +18,8 @@ import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket;
|
||||||
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket;
|
||||||
import com.extendedae_plus.util.GuiUtil;
|
import com.extendedae_plus.util.GuiUtil;
|
||||||
import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider;
|
import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider;
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
import net.minecraft.client.gui.components.Button;
|
import net.minecraft.client.gui.components.Button;
|
||||||
import net.minecraft.client.gui.components.EditBox;
|
|
||||||
import net.minecraft.client.gui.components.Tooltip;
|
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
@ -26,32 +28,36 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
import static com.extendedae_plus.util.GuiUtil.createToggle;
|
||||||
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为 AE2 原版样板供应器界面添加“智能系列”按钮。
|
* 为 AE2 原版样板供应器界面添加"智能系列"按钮。
|
||||||
* - 位于左侧工具栏
|
* - 位于左侧工具栏
|
||||||
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
* - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定
|
||||||
*/
|
*/
|
||||||
@Mixin(PatternProviderScreen.class)
|
@Mixin(PatternProviderScreen.class)
|
||||||
public abstract class PatternProviderSmartFeaturesMixin<C extends PatternProviderMenu> extends AEBaseScreen<C> {
|
public abstract class PatternProviderSmartFeaturesMixin<C extends PatternProviderMenu> extends AEBaseScreen<C> implements IInputBackgroundRenderer {
|
||||||
|
|
||||||
// 高级阻挡模式切换按钮
|
// 高级阻挡模式切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$AdvancedBlockingToggle;
|
||||||
// 智能翻倍切换按钮
|
// 智能翻倍切换按钮
|
||||||
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
@Unique private SettingToggleButton<YesNo> eap$SmartDoublingToggle;
|
||||||
// 智能翻倍上限输入框
|
// 智能翻倍上限输入框
|
||||||
@Unique private EditBox eap$PerProviderLimitInput;
|
@Unique private AETextField eap$PerProviderLimitInput;
|
||||||
|
|
||||||
// 当前高级阻挡模式是否启用
|
// 当前高级阻挡模式是否启用
|
||||||
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
@Unique private boolean eap$AdvancedBlockingEnabled = false;
|
||||||
// 当前智能翻倍是否启用
|
// 当前智能翻倍是否启用
|
||||||
@Unique private boolean eap$SmartDoublingEnabled = false;
|
@Unique private boolean eap$SmartDoublingEnabled = false;
|
||||||
// 当前智能翻倍上限
|
// 当前智能翻倍上限
|
||||||
@Unique private int eap$PerProviderScalingLimit = 0;
|
@Unique private int eap$PerProviderScalingLimit = 0;
|
||||||
|
@Unique private int eap$inputBgX;
|
||||||
|
@Unique private int eap$inputBgY;
|
||||||
|
@Unique private int eap$inputBgW;
|
||||||
|
@Unique private int eap$inputBgH;
|
||||||
|
|
||||||
public PatternProviderSmartFeaturesMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
public PatternProviderSmartFeaturesMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
||||||
super(menu, playerInventory, title, style);
|
super(menu, playerInventory, title, style);
|
||||||
|
|
@ -107,15 +113,14 @@ public abstract class PatternProviderSmartFeaturesMixin<C extends PatternProvide
|
||||||
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO);
|
||||||
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
this.addToLeftToolbar(this.eap$SmartDoublingToggle);
|
||||||
|
|
||||||
// 缩放上限输入框(使用 GuiUtil 抽离)
|
// 缩放上限输入框
|
||||||
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.font, this.eap$PerProviderScalingLimit, limit -> {
|
this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.style, this.font, this.eap$PerProviderScalingLimit, limit -> {
|
||||||
this.eap$PerProviderScalingLimit = limit;
|
this.eap$PerProviderScalingLimit = limit;
|
||||||
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit));
|
||||||
});
|
});
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------- 注入点 ---------------------------- */
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
private void eap$onInit(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
private void eap$onInit(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) {
|
||||||
// 初始化时同步服务端状态并创建控件
|
// 初始化时同步服务端状态并创建控件
|
||||||
|
|
@ -169,30 +174,32 @@ public abstract class PatternProviderSmartFeaturesMixin<C extends PatternProvide
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.eap$SmartDoublingEnabled) {
|
if (this.eap$SmartDoublingEnabled) {
|
||||||
// 智能翻倍启用时,确保输入框可见
|
|
||||||
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
if (!this.renderables.contains(this.eap$PerProviderLimitInput)) {
|
||||||
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
this.addRenderableWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
// 未聚焦且内容为空时,显示0
|
|
||||||
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
if (!focused && this.eap$PerProviderLimitInput.getValue().trim().isEmpty()) {
|
||||||
this.eap$PerProviderLimitInput.setValue("0");
|
this.eap$PerProviderLimitInput.setValue("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定位输入框到智能翻倍按钮左侧
|
|
||||||
Button ref = eap$SmartDoublingToggle;
|
Button ref = eap$SmartDoublingToggle;
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
int ex = ref.getX() - this.eap$PerProviderLimitInput.getWidth() - 5;
|
int visualWidth = this.eap$PerProviderLimitInput.getWidth() + 4 + this.font.width("_");
|
||||||
int ey = ref.getY() + 2;
|
int visualHeight = 16;
|
||||||
this.eap$PerProviderLimitInput.setX(ex);
|
int padding = 2;
|
||||||
this.eap$PerProviderLimitInput.setY(ey);
|
int ex = ref.getX() - visualWidth - 5 - padding;
|
||||||
|
int ey = ref.getY() + (ref.getHeight() - visualHeight) / 2 - padding + 4;
|
||||||
|
this.eap$PerProviderLimitInput.setX(ex + padding);
|
||||||
|
this.eap$PerProviderLimitInput.setY(ey + padding);
|
||||||
|
this.eap$inputBgX = ex;
|
||||||
|
this.eap$inputBgY = ey;
|
||||||
|
this.eap$inputBgW = visualWidth + padding * 2;
|
||||||
|
this.eap$inputBgH = visualHeight + padding * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置 tooltip
|
|
||||||
String cur = this.eap$PerProviderLimitInput.getValue();
|
String cur = this.eap$PerProviderLimitInput.getValue();
|
||||||
if (cur.isBlank()) cur = "0";
|
if (cur.isBlank()) cur = "0";
|
||||||
this.eap$PerProviderLimitInput.setTooltip(Tooltip.create(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
this.eap$PerProviderLimitInput.setTooltipMessage(Collections.singletonList(Component.translatable("extendedae_plus.gui.per_provider_limit.tooltip", cur)));
|
||||||
} else {
|
} else {
|
||||||
// 智能翻倍未启用时,移除输入框
|
|
||||||
this.removeWidget(this.eap$PerProviderLimitInput);
|
this.removeWidget(this.eap$PerProviderLimitInput);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -221,4 +228,14 @@ public abstract class PatternProviderSmartFeaturesMixin<C extends PatternProvide
|
||||||
this.setTextContent(AEBaseScreen.TEXT_ID_DIALOG_TITLE, t);
|
this.setTextContent(AEBaseScreen.TEXT_ID_DIALOG_TITLE, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void eap$renderInputBackground(GuiGraphics guiGraphics) {
|
||||||
|
if (this.eap$SmartDoublingEnabled
|
||||||
|
&& this.eap$PerProviderLimitInput != null && this.eap$PerProviderLimitInput.isVisible()) {
|
||||||
|
Icon.TOOLBAR_BUTTON_BACKGROUND.getBlitter()
|
||||||
|
.dest(this.eap$inputBgX - 5, this.eap$inputBgY - 3, this.eap$inputBgW + 6, this.eap$inputBgH - 2)
|
||||||
|
.blit(guiGraphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ import appeng.api.crafting.PatternDetailsHelper;
|
||||||
import appeng.api.stacks.GenericStack;
|
import appeng.api.stacks.GenericStack;
|
||||||
import appeng.client.gui.me.patternaccess.PatternContainerRecord;
|
import appeng.client.gui.me.patternaccess.PatternContainerRecord;
|
||||||
import appeng.client.gui.me.patternaccess.PatternSlot;
|
import appeng.client.gui.me.patternaccess.PatternSlot;
|
||||||
|
import appeng.client.gui.style.ScreenStyle;
|
||||||
|
import appeng.client.gui.widgets.AETextField;
|
||||||
import appeng.client.gui.widgets.SettingToggleButton;
|
import appeng.client.gui.widgets.SettingToggleButton;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.Font;
|
import net.minecraft.client.gui.Font;
|
||||||
|
|
@ -208,14 +210,16 @@ public class GuiUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建用于每个提供者缩放上限的输入框,包含值清洗与回调处理
|
* 创建用于每个提供者缩放上限的输入框,使用 AE2 原生样式
|
||||||
|
* @param style ScreenStyle 用于获取颜色配置
|
||||||
* @param font 字体对象
|
* @param font 字体对象
|
||||||
* @param initialValue 初始数值
|
* @param initialValue 初始数值
|
||||||
* @param onCommit 当值解析成功后回调(以 int 形式提供)
|
* @param onCommit 当值解析成功后回调(以 int 形式提供)
|
||||||
*/
|
*/
|
||||||
public static EditBox createPerProviderLimitInput(Font font, int initialValue, IntConsumer onCommit) {
|
public static AETextField createPerProviderLimitInput(ScreenStyle style, Font font, int initialValue, IntConsumer onCommit) {
|
||||||
EditBox input = new EditBox(font, 0, 0, 28, 12, Component.literal("Limit"));
|
AETextField input = new AETextField(style, font, 0, 0, 32, 16);
|
||||||
input.setMaxLength(6);
|
input.setMaxLength(6);
|
||||||
|
input.setBordered(false);
|
||||||
input.setValue(String.valueOf(initialValue));
|
input.setValue(String.valueOf(initialValue));
|
||||||
input.setResponder(s -> {
|
input.setResponder(s -> {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user