添加Pseudo注解,使得runclient时不添加通用终端依赖也能正常运行

This commit is contained in:
GaLi 2025-08-11 16:59:16 +08:00
parent 05492e2ffe
commit 3f2f24c4f9
5 changed files with 6 additions and 176 deletions

View File

@ -1,113 +0,0 @@
# ExtendedAE Plus 实现总结
## 已实现的功能
### 1. 槽位数量增加 ✅
- **PartExPatternProviderMixin**: 将`PartExPatternProvider`的槽位从36个增加到108个
- **TileExPatternProviderMixin**: 将`TileExPatternProvider`的槽位从36个增加到108个
- 使用`@ModifyConstant`注解参考GTLCore的实现方式
### 2. 翻页功能 ✅
- **ContainerExPatternProviderMixin**: 实现翻页逻辑
- 使用`@GuiSync`同步页码状态
- 通过`showPage()`方法重新计算槽位位置
- 使用`setActive()`控制槽位可见性
- **GuiExPatternProviderMixin**: 添加翻页UI
- 添加前进/后退按钮
- 显示页码信息(第 X/Y 页)
- 动态控制按钮可见性
### 3. 技术实现细节
#### 翻页核心逻辑
```java
@Unique
public void showPage() {
List<Slot> slots = this.getSlots(SlotSemantics.ENCODED_PATTERN);
int slot_id = 0;
for (Slot s : slots) {
int page_id = slot_id / 36; // 每36个槽位为一页
if (page_id > 0 && page_id == this.page) {
// 将当前页的槽位移动到前36个槽位的位置
// 使用反射修改槽位坐标
}
((AppEngSlot) s).setActive(page_id == this.page); // 设置槽位激活状态
++slot_id;
}
}
```
#### 页码计算
- 总槽位数108个
- 每页显示36个槽位
- 总页数3页108 ÷ 36 = 3
#### 状态同步
- 使用`@GuiSync(11451)`注解同步页码状态
- 客户端和服务器端自动同步
## 文件结构
```
src/main/java/com/extendedae_plus/
├── mixin/
│ ├── PartExPatternProviderMixin.java # 修改PartExPatternProvider槽位数
│ ├── TileExPatternProviderMixin.java # 修改TileExPatternProvider槽位数
│ ├── ContainerExPatternProviderMixin.java # 翻页逻辑实现
│ └── GuiExPatternProviderMixin.java # 翻页UI实现
├── network/
│ └── UpdatePagePacket.java # 网络包处理(备用)
└── ExampleMod.java # 主模组类
src/main/resources/
├── extendedae_plus.mixins.json # Mixin配置
└── META-INF/
└── mods.toml # 模组配置
```
## 使用方法
1. **安装模组**将生成的jar文件放入mods文件夹
2. **启动游戏**:模组会自动生效
3. **使用扩展样板供应器**
- 默认显示36个槽位第一页
- 点击左右箭头按钮翻页
- 查看页码信息了解当前位置
## 技术特点
### 优势
- ✅ 完全兼容ExtendedAE
- ✅ 使用Mixin技术无需修改原版代码
- ✅ 支持翻页功能,用户体验良好
- ✅ 状态自动同步,无需额外配置
### 创新点
- 使用槽位位置重映射而不是隐藏
- 通过`setActive()`控制槽位状态
- 使用反射处理槽位坐标修改
- 集成ExtendedAE的UI组件
## 构建状态
- ✅ 编译成功
- ✅ 所有Mixin正常工作
- ✅ 依赖配置正确
- ✅ 模组信息完整
## 下一步计划
1. **测试功能**:在游戏中测试翻页功能
2. **优化性能**:优化反射调用性能
3. **添加配置**:支持自定义槽位数量
4. **改进UI**:优化翻页按钮样式
## 注意事项
- 模组依赖ExtendedAE 1.4.2+
- 需要Forge 47+
- 使用Java 17
- 支持Minecraft 1.20.1

View File

@ -1,61 +0,0 @@
# ExtendedAE Plus
一个为ExtendedAE模组添加额外功能的Minecraft模组。
## 功能特性
### 1. 扩展样板供应器分页功能
- **自动分页**当样板槽位超过36个时自动启用分页功能
- **循环翻页**:支持从第一页向前翻到最后一页,从最后一页向后翻到第一页
- **智能定位**确保所有样板槽位都正确显示在前4行中
- **页码显示**:显示当前页码和总页数
### 2. 扩展样板管理终端隐藏功能
- **隐藏样板槽位**:添加了一个切换按钮,可以隐藏所有样板供应器的样板槽位
- **只显示名称**:隐藏模式下只显示样板供应器的名称,不显示其内部的样板
- **实时切换**:点击按钮即可实时切换显示模式
- **状态同步**:按钮状态与隐藏模式保持同步
## 安装说明
1. 确保已安装ExtendedAE模组
2. 将此模组的JAR文件放入mods文件夹
3. 启动游戏
## 兼容性
- **Minecraft版本**1.20.1
- **Forge版本**NeoForge
- **依赖模组**ExtendedAE 1.4.2+
## 使用方法
### 扩展样板供应器
1. 放置扩展样板供应器
2. 当槽位超过36个时会自动显示翻页按钮
3. 使用左右箭头按钮进行翻页
4. 页码信息显示在界面右上角
### 扩展样板管理终端
1. 打开扩展样板管理终端
2. 在左侧工具栏中找到隐藏按钮(眼睛图标)
3. 点击按钮切换显示模式:
- **显示模式**:显示所有样板供应器的名称和样板槽位
- **隐藏模式**:只显示样板供应器的名称,隐藏所有样板槽位
## 技术实现
- 使用Mixin技术修改ExtendedAE的GUI和容器
- 通过反射访问私有字段和方法
- 支持混淆环境下的稳定运行
- 使用@GuiSync进行客户端-服务器数据同步
## 开发信息
- **开发环境**Minecraft 1.20.1 + NeoForge
- **构建工具**Gradle + Architectury Loom
- **主要技术**Mixin、反射、GUI修改
## 许可证
本项目遵循与原ExtendedAE模组相同的许可证。

View File

@ -10,6 +10,7 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -21,6 +22,7 @@ import java.util.function.Consumer;
/**
* 为通用无线样板访问终端AE2WTlib 集成容器注册通用动作CGenericPacket 分发
*/
@Pseudo
@Mixin(ContainerUWirelessExPAT.class)
public abstract class ContainerUWirelessExPatternTerminalMixin implements IActionHolder {

View File

@ -10,6 +10,7 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -21,6 +22,7 @@ import java.util.function.Consumer;
/**
* 为无线样板访问终端容器注册通用动作CGenericPacket 分发
*/
@Pseudo
@Mixin(ContainerWirelessExPAT.class)
public abstract class ContainerWirelessExPatternTerminalMixin implements IActionHolder {
@ -31,7 +33,7 @@ public abstract class ContainerWirelessExPatternTerminalMixin implements IAction
private Player epp$player;
// 明确目标构造签名<init>(int, Inventory, HostWirelessExPAT)
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lcom/glodblock/github/extendedae/common/me/itemhost/HostWirelessExPAT;)V", at = @At("TAIL"))
@Inject(method = "<init>(ILnet/minecraft/world/entity/player/Inventory;Lcom/glodblock/github/extendedae/common/me/itemhost/HostWirelessExPAT;)V", at = @At("TAIL"), require = 0)
private void init(int id, net.minecraft.world.entity.player.Inventory playerInventory, HostWirelessExPAT host, CallbackInfo ci) {
this.epp$player = playerInventory.player;
// 注册上传动作参数顺序必须与客户端 CGenericPacket 保持一致

View File

@ -1,5 +1,5 @@
{
"required": true,
"required": false,
"package": "com.extendedae_plus.mixin",
"compatibilityLevel": "JAVA_17",
"minVersion": "0.8",