Merge branch 'master' into fix/multiple-bugs-and-tweaks

This commit is contained in:
C-H716 2025-08-31 16:55:50 +08:00
commit 477a5ffee7
10 changed files with 180 additions and 9 deletions

2
.gitignore vendored
View File

@ -4,7 +4,7 @@ build/
out/ out/
classes/ classes/
source/ source/
Applied-Energistics-2-forge-1.20.1/
# Eclipse # Eclipse
*.tmp *.tmp
*.bak *.bak

107
CHANGELOG.md Normal file
View File

@ -0,0 +1,107 @@
# Changelog
## [Unreleased]
## [1.4.0]
### Added
- 添加智能倍增模式:一次性发配够需求量,降低后期下单卡顿
- 增加模组配置 UI 界面,可配置相关属性
- 供应器支持启用/禁用智能倍增
- 扩展样板管理终端中添加按钮,可打开样板供应器对应机器的 UI 界面
- 无线收发器适配 Jade 显示信息
- 合成进度界面Shift+左键跳转到对应机器 UIShift+右键跳转到对应供应器 UI
- 新增样板供应器状态控制器方块,连接到 ME 网络后可全局调整所有样板供应器三个模式的启用状态
## [1.3.3]
### Added
- ME 扩展样板管理终端:搜索命中槽位增加 18x18 边框与彩虹流转高亮
- 装配矩阵:新增锻造台与切石机配方上传
- 在 AE2 与 ExtendedAE 的终端与供应器中显示样板生产数量
- 增加并行处理单元系列,最高 1024 并行
- 新增JEI 书签界面按 F 键自动搜索物品到 AE 终端
### Fixed
- 修复同方块多样板供应器贴片误选供应器问题
- 修复多人游戏下智能阻挡按钮属性值显示不同步
### Docs
- 重要:与 modern ae2 additions 模组不兼容(加装后智能阻挡无效)
## [1.3.2]
### Added
- 增加映射修改便捷功能(输入名称即可删除并重新添加)
- 供应器新增高级阻挡模式:相同配方不再阻挡,直至该配方完成清空容器后再发配下一种(支持输入总成;总成内电路不受影响;催化剂槽内不可放置任意一个样板的输入物品)
### Fixed
- 修复石英切割刀 Shift+右键复制名称功能,且支持格雷大型机器不同配方类型子名称
### Docs
- 与 modernae 模组存在兼容性问题:同时安装不报错,但高级阻挡模式会失效
- 高级阻挡模式需同时开启“原版阻挡模式”和“高级阻挡模式”方可生效
## [1.3.1]
### Added
- 无线收发器支持:放下后默认从端、频率 1支持镐子挖掘支持 AE2 扳手 Shift+右键快速拆除;扳手右键可锁定/解锁收发器(锁定后无法更改主从与频道)
- 石英切割刀Shift+右键实体可复制其名称到剪切板,便于命名样板供应器
### Fixed
- 修复 JEI 作弊模式下 Shift+左键无法获取物品的问题
- 修复同名供应器中其中一个满了不会上传到其他的问题(建议打开“未满且可见”模式)
### Changed
- 无线收发器默认行为与交互方式调整(见 Added
## [1.3.0]
### Added
- 为处理样板添加快速上传功能
- 自动搜索改为采用映射表实现
### Docs
- 可在 `/config/extendedae-plus/recipe_type_names.json` 修改映射名称
## [1.2.2]
### Added
- JEI 中 Shift+左键自动拉取物品到背包;若 AE 中没有但可自动化合成,则跳转到下单界面
- 上传样板到装配矩阵:新增已有样板检测;已有则不再上传,并在左下角提示玩家
### Fixed
- 修复上传样板到装配矩阵偶发失败的问题
- 修复一个可能引发偶发崩端的问题
## [1.2.1-fix]
### Added
- 编码样板终端:编写合成样板时自动上传到装配矩阵(网络需有装配矩阵)
- 鼠标中键点击某方块:若 AE 网络有库存,自动拉取到手上
- JEI 中对着物品鼠标中键:若网络有该物品的自动化方案,自动跳转到下单界面
- 支持在 Curios 槽位使用通用终端;量子卡可随时随地进行下单与拉取
### Changed
- 优化交互逻辑(减少奇怪的交互问题)
### Docs
- 上述“中键拉取/跳转”功能需携带无线终端(放饰品槽也支持)
## [1.2.0-a]
### Added
- 新增无线收发器方块:可无线传输 ME 频道,支持跨维度(主方块区块需设置强加载)
- 为无线收发器添加抗卸载机制(重启后无需手动更新主端状态)
### Changed
- 更改扩展样板管理终端:打开 UI 时默认隐藏所有样板
### Fixed
- 修复 JEI 无法正常搜索到物品的问题
### Performance
- 提升网络稳定性:无线收发器抗卸载机制
### Docs
- 操作方法空手右键切换主从Shift+右键频道+1Shift+左键频道-1主端发信从端收信
## [1.1.3-b]
### Added
- 配置项 `pageMultiplier`
- 打开样板编码终端时自动填充空白样板
### Fixed
- 修复其他 AE 物品 UI 显示异常

View File

@ -58,6 +58,7 @@ repositories {
} }
} }
maven { url "https://repo.spongepowered.org/maven" } maven { url "https://repo.spongepowered.org/maven" }
maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" }
} }
dependencies { dependencies {
@ -104,11 +105,16 @@ dependencies {
//mae2 //mae2
// modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6342203" modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6827727"
modCompileOnly "curse.maven:modern-ae2-additions-1028068:6342203" modCompileOnly "curse.maven:modern-ae2-additions-1028068:6827727"
//advancedae //aea
modCompileOnly "curse.maven:advancedae-1084104:5957960" modImplementation "curse.maven:advancedae-1084104:6939473"
//geckolib
modRuntimeOnly "curse.maven:geckolib-388172:6920925"
//mclib运行时
forgeRuntimeLibrary "com.eliotlash.mclib:mclib:20"
} }
allprojects { allprojects {

View File

@ -13,7 +13,7 @@ minecraft_version = 1.20.1
# Dependencies # Dependencies
forge_version = 1.20.1-47.4.3 forge_version = 1.20.1-47.4.3
glodium_version=5006780 glodium_version=5006780
ae2_version=15.4.2 ae2_version=15.4.5
guideme_version=20.1.7 guideme_version=20.1.7
wireless_terminals_version=5162352 wireless_terminals_version=5162352
jei_version=15.19.5.99 jei_version=15.19.5.99

View File

@ -17,6 +17,7 @@ public class ModConfigScreen extends Screen {
private EditBox wirelessMaxRangeBox; private EditBox wirelessMaxRangeBox;
private CycleButton<Boolean> crossDimToggle; private CycleButton<Boolean> crossDimToggle;
private CycleButton<Boolean> providerRoundRobinToggle; private CycleButton<Boolean> providerRoundRobinToggle;
private CycleButton<Boolean> showEncoderToggle;
public ModConfigScreen(Screen parent) { public ModConfigScreen(Screen parent) {
super(Component.translatable("screen.extendedae_plus.title")); super(Component.translatable("screen.extendedae_plus.title"));
@ -56,6 +57,10 @@ public class ModConfigScreen extends Screen {
providerRoundRobinToggle = this.addRenderableWidget(createToggle(rightX, y + row * rowHeight, boxWidth, 20, ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.get())); providerRoundRobinToggle = this.addRenderableWidget(createToggle(rightX, y + row * rowHeight, boxWidth, 20, ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.get()));
row++; row++;
// show encoder pattern player toggle
showEncoderToggle = this.addRenderableWidget(createToggle(rightX, y + row * rowHeight, boxWidth, 20, ModConfigs.SHOW_ENCOD_PATTERN_PLAYER.get()));
row++;
// 按钮保存返回 // 按钮保存返回
int btnW = 100; int btnW = 100;
int gap = 8; int gap = 8;
@ -76,12 +81,14 @@ public class ModConfigScreen extends Screen {
double maxRange = clamp(parseDoubleOrDefault(wirelessMaxRangeBox.getValue(), ModConfigs.WIRELESS_MAX_RANGE.get()), 1.0, 4096.0); double maxRange = clamp(parseDoubleOrDefault(wirelessMaxRangeBox.getValue(), ModConfigs.WIRELESS_MAX_RANGE.get()), 1.0, 4096.0);
boolean crossDim = crossDimToggle.getValue(); boolean crossDim = crossDimToggle.getValue();
boolean providerRoundRobin = providerRoundRobinToggle.getValue(); boolean providerRoundRobin = providerRoundRobinToggle.getValue();
boolean showEncoder = showEncoderToggle.getValue();
// 应用到 Forge 配置值 // 应用到 Forge 配置值
ModConfigs.PAGE_MULTIPLIER.set(pageMul); ModConfigs.PAGE_MULTIPLIER.set(pageMul);
ModConfigs.WIRELESS_MAX_RANGE.set(maxRange); ModConfigs.WIRELESS_MAX_RANGE.set(maxRange);
ModConfigs.WIRELESS_CROSS_DIM_ENABLE.set(crossDim); ModConfigs.WIRELESS_CROSS_DIM_ENABLE.set(crossDim);
ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.set(providerRoundRobin); ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.set(providerRoundRobin);
ModConfigs.SHOW_ENCOD_PATTERN_PLAYER.set(showEncoder);
// Forge 会在合适的时机写回到配置文件部分改动可能需要重启游戏或世界才完全生效 // Forge 会在合适的时机写回到配置文件部分改动可能需要重启游戏或世界才完全生效
onClose(); onClose();
@ -119,6 +126,7 @@ public class ModConfigScreen extends Screen {
g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessMaxRange_with_range"), leftX, y + 1 * rowHeight + 6, labelColor, false); g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessMaxRange_with_range"), leftX, y + 1 * rowHeight + 6, labelColor, false);
g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessCrossDimEnable"), leftX, y + 2 * rowHeight + 6, labelColor, false); g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessCrossDimEnable"), leftX, y + 2 * rowHeight + 6, labelColor, false);
g.drawString(this.font, Component.translatable("config.extendedae_plus.providerRoundRobinEnable"), leftX, y + 3 * rowHeight + 6, labelColor, false); g.drawString(this.font, Component.translatable("config.extendedae_plus.providerRoundRobinEnable"), leftX, y + 3 * rowHeight + 6, labelColor, false);
g.drawString(this.font, Component.translatable("config.extendedae_plus.showEncoderPatternPlayer"), leftX, y + 4 * rowHeight + 6, labelColor, false);
} }
private static int parseIntOrDefault(String s, int def) { private static int parseIntOrDefault(String s, int def) {

View File

@ -7,6 +7,7 @@ public final class ModConfigs {
public static final ForgeConfigSpec.IntValue PAGE_MULTIPLIER; public static final ForgeConfigSpec.IntValue PAGE_MULTIPLIER;
public static final ForgeConfigSpec.DoubleValue WIRELESS_MAX_RANGE; public static final ForgeConfigSpec.DoubleValue WIRELESS_MAX_RANGE;
public static final ForgeConfigSpec.BooleanValue WIRELESS_CROSS_DIM_ENABLE; public static final ForgeConfigSpec.BooleanValue WIRELESS_CROSS_DIM_ENABLE;
public static final ForgeConfigSpec.BooleanValue SHOW_ENCOD_PATTERN_PLAYER;
public static final ForgeConfigSpec.BooleanValue PROVIDER_ROUND_ROBIN_ENABLE; public static final ForgeConfigSpec.BooleanValue PROVIDER_ROUND_ROBIN_ENABLE;
static { static {
@ -34,6 +35,13 @@ public final class ModConfigs {
"开启后,从端可连接到不同维度的主端(忽略距离限制)") "开启后,从端可连接到不同维度的主端(忽略距离限制)")
.define("wirelessCrossDimEnable", true); .define("wirelessCrossDimEnable", true);
SHOW_ENCOD_PATTERN_PLAYER = builder
.comment(
"是否显示样板编码玩家",
"开启后将在样板 HoverText 上添加样板的编码玩家"
)
.define("showEncoderPatternPlayer", true);
// 智能倍增后是否在样板供应器间轮询分配请求量开启 provider 均分关闭不拆分 // 智能倍增后是否在样板供应器间轮询分配请求量开启 provider 均分关闭不拆分
PROVIDER_ROUND_ROBIN_ENABLE = builder PROVIDER_ROUND_ROBIN_ENABLE = builder
.comment( .comment(

View File

@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.ModifyConstant;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(value = CraftingCPUCluster.class, remap = false) @Mixin(value = CraftingCPUCluster.class, remap = false, priority = 2000)
public abstract class CraftingCPUClusterMixin { public abstract class CraftingCPUClusterMixin {
// 1) 提升单方块线程上限的常量避免抛出 IAE IllegalArgumentException // 1) 提升单方块线程上限的常量避免抛出 IAE IllegalArgumentException
@ModifyConstant( @ModifyConstant(
@ -25,7 +25,8 @@ public abstract class CraftingCPUClusterMixin {
method = "addBlockEntity(Lappeng/blockentity/crafting/CraftingBlockEntity;)V", method = "addBlockEntity(Lappeng/blockentity/crafting/CraftingBlockEntity;)V",
at = @At( at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lappeng/blockentity/crafting/CraftingBlockEntity;getAcceleratorThreads()I" target = "Lappeng/blockentity/crafting/CraftingBlockEntity;getAcceleratorThreads()I",
ordinal = 1
) )
) )
private int extendedae_plus$onGetThreadsForLimitCheck(CraftingBlockEntity te) { private int extendedae_plus$onGetThreadsForLimitCheck(CraftingBlockEntity te) {

View File

@ -0,0 +1,29 @@
package com.extendedae_plus.mixin.ae2;
import appeng.crafting.pattern.EncodedPatternItem;
import com.extendedae_plus.config.ModConfigs;
import net.minecraft.ChatFormatting;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
@Mixin(EncodedPatternItem.class)
public class EncodedPatternItemMixin {
// 客户端 HoverText 显示样板的编码玩家
@Inject(method = "appendHoverText", at = @At("TAIL"))
public void epp$appendHoverText(ItemStack stack, Level level, List<Component> lines, TooltipFlag advancedTooltips, CallbackInfo ci){
if (stack.hasTag() && ModConfigs.SHOW_ENCOD_PATTERN_PLAYER.get()) {
CompoundTag tag = stack.getOrCreateTag();
String name = tag.getString("encodePlayer");
lines.add(Component.translatable("extendedae_plus.pattern.hovertext.player", name).withStyle(ChatFormatting.GRAY));
}
}
}

View File

@ -9,6 +9,7 @@ import com.glodblock.github.glodium.network.packet.sync.IActionHolder;
import com.glodblock.github.glodium.network.packet.sync.Paras; import com.glodblock.github.glodium.network.packet.sync.Paras;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@ -16,6 +17,7 @@ import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -110,4 +112,12 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo
} catch (Throwable ignored) { } catch (Throwable ignored) {
} }
} }
// 服务器端在构造样板返回前插入编码玩家的名称
@Inject(method = "encodePattern", at = @At("TAIL"), remap = false, cancellable = true)
private void eap$writeEncodePlayerToPattern(CallbackInfoReturnable<ItemStack> cir) {
ItemStack itemStack = cir.getReturnValue();
itemStack.getOrCreateTag().putString("encodePlayer", this.epp$player.getGameProfile().getName());
cir.setReturnValue(itemStack);
}
} }

View File

@ -15,6 +15,7 @@
"extendedae_plus.screen.add_mapping": "增加映射", "extendedae_plus.screen.add_mapping": "增加映射",
"extendedae_plus.screen.cn_name": "中文名", "extendedae_plus.screen.cn_name": "中文名",
"extendedae_plus.button.choose_provider":"上传样板", "extendedae_plus.button.choose_provider":"上传样板",
"extendedae_plus.pattern.hovertext.player": "由 %s 编码",
"block.extendedae_plus.4x_crafting_accelerator": "4x并行处理单元", "block.extendedae_plus.4x_crafting_accelerator": "4x并行处理单元",
"block.extendedae_plus.16x_crafting_accelerator": "16x并行处理单元", "block.extendedae_plus.16x_crafting_accelerator": "16x并行处理单元",
@ -47,6 +48,7 @@
"config.extendedae_plus.providerRoundRobinEnable": "启用样板供应器轮询分配(智能翻倍)", "config.extendedae_plus.providerRoundRobinEnable": "启用样板供应器轮询分配(智能翻倍)",
"config.extendedae_plus.state_on": "开", "config.extendedae_plus.state_on": "开",
"config.extendedae_plus.state_off": "关", "config.extendedae_plus.state_off": "关",
"config.extendedae_plus.showEncoderPatternPlayer": "显示样板编码玩家",
"block.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "block.extendedae_plus.network_pattern_controller": "样板供应器状态控制器",
"item.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "item.extendedae_plus.network_pattern_controller": "样板供应器状态控制器",
"gui.extendedae_plus.global.toggle_blocking": "切换阻挡模式", "gui.extendedae_plus.global.toggle_blocking": "切换阻挡模式",