diff --git a/.gitignore b/.gitignore index 16b0b3c..37b19ff 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ build/ out/ classes/ source/ - +Applied-Energistics-2-forge-1.20.1/ # Eclipse *.tmp *.bak diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..97831b4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,107 @@ +# Changelog + +## [Unreleased] + +## [1.4.0] +### Added +- 添加智能倍增模式:一次性发配够需求量,降低后期下单卡顿 +- 增加模组配置 UI 界面,可配置相关属性 +- 供应器支持启用/禁用智能倍增 +- 扩展样板管理终端中添加按钮,可打开样板供应器对应机器的 UI 界面 +- 无线收发器适配 Jade 显示信息 +- 合成进度界面:Shift+左键跳转到对应机器 UI,Shift+右键跳转到对应供应器 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+右键频道+1;Shift+左键频道-1;主端发信,从端收信 + +## [1.1.3-b] +### Added +- 配置项 `pageMultiplier` +- 打开样板编码终端时自动填充空白样板 + +### Fixed +- 修复其他 AE 物品 UI 显示异常 diff --git a/build.gradle b/build.gradle index d87ef60..d0c7699 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,7 @@ repositories { } } maven { url "https://repo.spongepowered.org/maven" } + maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" } } dependencies { @@ -79,7 +80,7 @@ dependencies { annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" - modCompileOnly "curse.maven:applied-flux-965012:${applied_flux_version}" + modCompileOnly "curse.maven:applied-flux-965012:${applied_flux_version}" modCompileOnly "curse.maven:mega-cells-622112:${mega_cells_version}" modCompileOnly "curse.maven:jade-324717:${jade_version}" @@ -104,11 +105,16 @@ dependencies { //mae2 -// modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6342203" - modCompileOnly "curse.maven:modern-ae2-additions-1028068:6342203" + modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6827727" + modCompileOnly "curse.maven:modern-ae2-additions-1028068:6827727" - //advancedae - modCompileOnly "curse.maven:advancedae-1084104:5957960" + //aea + modImplementation "curse.maven:advancedae-1084104:6939473" + + //geckolib + modRuntimeOnly "curse.maven:geckolib-388172:6920925" + //mclib运行时 + forgeRuntimeLibrary "com.eliotlash.mclib:mclib:20" } allprojects { diff --git a/gradle.properties b/gradle.properties index 231efe7..36a9b07 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ minecraft_version = 1.20.1 # Dependencies forge_version = 1.20.1-47.4.3 glodium_version=5006780 -ae2_version=15.4.2 +ae2_version=15.4.5 guideme_version=20.1.7 wireless_terminals_version=5162352 jei_version=15.19.5.99 diff --git a/src/main/java/com/extendedae_plus/client/ModConfigScreen.java b/src/main/java/com/extendedae_plus/client/ModConfigScreen.java index 62ffe64..3c78002 100644 --- a/src/main/java/com/extendedae_plus/client/ModConfigScreen.java +++ b/src/main/java/com/extendedae_plus/client/ModConfigScreen.java @@ -17,6 +17,7 @@ public class ModConfigScreen extends Screen { private EditBox wirelessMaxRangeBox; private CycleButton crossDimToggle; private CycleButton providerRoundRobinToggle; + private CycleButton showEncoderToggle; public ModConfigScreen(Screen parent) { 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())); 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 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); boolean crossDim = crossDimToggle.getValue(); boolean providerRoundRobin = providerRoundRobinToggle.getValue(); + boolean showEncoder = showEncoderToggle.getValue(); // 应用到 Forge 配置值 ModConfigs.PAGE_MULTIPLIER.set(pageMul); ModConfigs.WIRELESS_MAX_RANGE.set(maxRange); ModConfigs.WIRELESS_CROSS_DIM_ENABLE.set(crossDim); ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.set(providerRoundRobin); + ModConfigs.SHOW_ENCOD_PATTERN_PLAYER.set(showEncoder); // Forge 会在合适的时机写回到配置文件;部分改动可能需要重启游戏或世界才完全生效 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.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.showEncoderPatternPlayer"), leftX, y + 4 * rowHeight + 6, labelColor, false); } private static int parseIntOrDefault(String s, int def) { diff --git a/src/main/java/com/extendedae_plus/config/ModConfigs.java b/src/main/java/com/extendedae_plus/config/ModConfigs.java index 8689d7e..b1689b1 100644 --- a/src/main/java/com/extendedae_plus/config/ModConfigs.java +++ b/src/main/java/com/extendedae_plus/config/ModConfigs.java @@ -7,6 +7,7 @@ public final class ModConfigs { public static final ForgeConfigSpec.IntValue PAGE_MULTIPLIER; public static final ForgeConfigSpec.DoubleValue WIRELESS_MAX_RANGE; 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; static { @@ -34,6 +35,13 @@ public final class ModConfigs { "开启后,从端可连接到不同维度的主端(忽略距离限制)") .define("wirelessCrossDimEnable", true); + SHOW_ENCOD_PATTERN_PLAYER = builder + .comment( + "是否显示样板编码玩家", + "开启后将在样板 HoverText 上添加样板的编码玩家" + ) + .define("showEncoderPatternPlayer", true); + // 智能倍增后,是否在样板供应器间轮询分配请求量(开启:按 provider 均分;关闭:不拆分) PROVIDER_ROUND_ROBIN_ENABLE = builder .comment( diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/CraftingCPUClusterMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/CraftingCPUClusterMixin.java index f7b267b..8faf483 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/CraftingCPUClusterMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/CraftingCPUClusterMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; 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 { // 1) 提升“单方块线程上限”的常量,避免抛出 IAE 的 IllegalArgumentException @ModifyConstant( @@ -25,7 +25,8 @@ public abstract class CraftingCPUClusterMixin { method = "addBlockEntity(Lappeng/blockentity/crafting/CraftingBlockEntity;)V", at = @At( 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) { diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java new file mode 100644 index 0000000..122d074 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/EncodedPatternItemMixin.java @@ -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 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)); + } + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java index c334559..c2a5b31 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/ContainerPatternEncodingTermMenuMixin.java @@ -9,6 +9,7 @@ import com.glodblock.github.glodium.network.packet.sync.IActionHolder; import com.glodblock.github.glodium.network.packet.sync.Paras; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; 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.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; import java.util.function.Consumer; @@ -110,4 +112,12 @@ public abstract class ContainerPatternEncodingTermMenuMixin implements IActionHo } catch (Throwable ignored) { } } + + // 服务器端:在构造样板返回前插入编码玩家的名称 + @Inject(method = "encodePattern", at = @At("TAIL"), remap = false, cancellable = true) + private void eap$writeEncodePlayerToPattern(CallbackInfoReturnable cir) { + ItemStack itemStack = cir.getReturnValue(); + itemStack.getOrCreateTag().putString("encodePlayer", this.epp$player.getGameProfile().getName()); + cir.setReturnValue(itemStack); + } } diff --git a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json index 8d1a562..930f4a2 100644 --- a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json +++ b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json @@ -15,6 +15,7 @@ "extendedae_plus.screen.add_mapping": "增加映射", "extendedae_plus.screen.cn_name": "中文名", "extendedae_plus.button.choose_provider":"上传样板", + "extendedae_plus.pattern.hovertext.player": "由 %s 编码", "block.extendedae_plus.4x_crafting_accelerator": "4x并行处理单元", "block.extendedae_plus.16x_crafting_accelerator": "16x并行处理单元", @@ -47,6 +48,7 @@ "config.extendedae_plus.providerRoundRobinEnable": "启用样板供应器轮询分配(智能翻倍)", "config.extendedae_plus.state_on": "开", "config.extendedae_plus.state_off": "关", + "config.extendedae_plus.showEncoderPatternPlayer": "显示样板编码玩家", "block.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "item.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "gui.extendedae_plus.global.toggle_blocking": "切换阻挡模式",