添加Pseudo注解,使得runclient时不添加通用终端依赖也能正常运行
This commit is contained in:
parent
05492e2ffe
commit
3f2f24c4f9
|
|
@ -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
|
||||
61
README.md
61
README.md
|
|
@ -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模组相同的许可证。
|
||||
|
|
@ -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 {
|
||||
|
||||
|
|
|
|||
|
|
@ -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 保持一致
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"required": true,
|
||||
"required": false,
|
||||
"package": "com.extendedae_plus.mixin",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"minVersion": "0.8",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user