Awesome
<p align="center"> <img src="https://raw.githubusercontent.com/kitUIN/ModMultiVersion/master/src/main/resources/META-INF/pluginIcon.svg" width="350" height="220" alt="ModMultiVersion"></a> </p> <div align="center">ModMultiVersion
✨ 多版本代码同步-Idea插件 ✨
</div> <p align="center"> <a> <img src="https://img.shields.io/badge/license-MIT-green" alt="license"> </a> <a > <img src="https://img.shields.io/github/v/release/kitUIN/ModMultiVersion" alt="release"> </a> </p> <!-- TOC --> <!-- TOC -->使用该插件开发模组
使用该插件开发的模组/插件
项目结构规范
📦 ChatImage # 项目名称
├── 📂 origin # 全局级 用于同步
├── 📂 forge # 加载器文件夹
│ ├── 📂 forge-1.20.1 # 1.20.1forge (加载器版本文件夹)
│ ├── 📂 ... # 别的版本
│ └── 📂 origin # 加载器级 用于同步
├── 📂 fabric # 加载器文件夹
├── 📂 ... # 别的加载器
├── 📂 tool # 工具文件夹(可选)
│ └── 🔧 ModMultiVersionTool.jar # 构建工具(命令行版)
└── 📜 ... # 其他文件
用于同步的文件夹:
- origin (全局级)
- {loader}/origin(加载器级)
全局级origin文件夹下的所有文件将会以相同相对路径
的方式,复制到所有
的加载器版本文件夹
下
加载器级origin文件夹同理,作用范围变为当前加载器
下
[!NOTE]
加载器origin 优先级高于 全局级origin
示例:
全局origin文件夹下有文件src/main/java/io/github/kituin/chatimage/client/ChatImageClient.java
,他将会被复制到{loader}/{loader-version}/src/main/java/io/github/kituin/chatimage/client/ChatImageClient.java
比如:复制到fabric/fabric-1.20/...../ChatImageClient.java
, forge/forge-1.18/...../ChatImageClient.java
如果origin是在加载器目录下,则只会复制到当前加载器内的版本文件夹下
语法规范
语法解析依赖于ModMultiVersionInterpreter
(
)
!
&&
||
!=
>
>=
<
<=
==
&
识别为&&
|
识别为||
=
识别为==
- 支持变量自动替换
- 左部省略自动补充
$$ ==
关键字
- 关键字必须全大写
关键字 | 说明 |
---|---|
PRINT | 调试输出 |
IF /END IF /ELSE /ELSE IF | IF-ELSE表达式 |
EXCLUDE | 黑名单 |
ONLY | 白名单 |
ONEWAY | 单向同步 |
RENAME | 重命名文件 |
注释符号
//
#
布尔表达式
可以使用上述关键字进行组合
左部省略时自动补充$$ ==
最终计算时会替换掉变量
示例:
fabric-1.16.5
会自动识别为$$ == fabric-1.16.5
>=fabric-1.16.5
会自动识别为$$ >= fabric-1.16.5
fabric-1.16.5 || fabric-1.18.2
会自动识别为$$ == fabric-1.16.5 || $$ == fabric-1.18.2
变量
变量名 | 类型 | 值 | 示例 |
---|---|---|---|
$$ | String | 加载器版本文件夹名称 | 1.20.1forge |
$folder | String | 文件所在文件夹名称 | |
$loader | String | 加载器名称(小写) | forge |
$fileName | String | 文件名称(带后缀) | test.java |
$fileNameWithoutExtension | String | 文件名称(无后缀) | test |
IF-ELSE
- 注释符号开头
- 必须以
{注释符号} IF {布尔表达式}
开头 - 必须以
{注释符号} END IF
结尾 - 允许使用
{注释符号} ELSE
,{注释符号} ELSE IF {布尔表达式}
示例:
public static void setScreen(MinecraftClient client, Screen screen) {
// IF fabric-1.16.5
// client.openScreen(screen);
// ELSE
// client.setScreen(screen);
// END IF
}
在fabric-1.16.5
文件夹中
public static void setScreen(MinecraftClient client, Screen screen) {
// IF fabric-1.16.5
client.openScreen(screen);
// ELSE
// client.setScreen(screen);
// END IF
}
其他文件夹中
public static void setScreen(MinecraftClient client, Screen screen) {
// IF fabric-1.16.5
// client.openScreen(screen);
// ELSE
client.setScreen(screen);
// END IF
}
输出调试,主要用于变量的调试
示例
// PRINT folder: $folder
// PRINT loader: $loader
手动同步
Ctrl+S
手动保存即可触发同步
右键同步到的文件点击从磁盘重新加载
有时idea的文件系统来不及检测变更,请善用从磁盘重新加载
双向同步
[!NOTE]
此为默认模式
顾名思义,你在origin文件夹内的修改会同步到版本文件夹内,你在版本文件夹内的修改也会同步到origin文件夹
需要注意的是:
📦 ChatImage
├── 📂 origin
│ └── 📜 A.java
├── 📂 forge
│ ├── 📂 forge-1.20.1
│ │ └── 📜 B.java
│ ├── 📂 forge-1.16.5
│ │ └── 📜 C.java
│ ├── 📂 forge-1.17.1
│ │ └── 📜 D.java
│ └── 📂 origin
├── 📂 fabric
├── 📂 ...
└── 📜 ...
以上示例中,如果你修改了B
,那么你需要打开一遍A
才会将你在B
中的修改同步到C
和D
中
单向同步
[!IMPORTANT]
ONEWAY必须写在文件的第一行,不然将不起作用
在文件的顶部使用关键字ONEWAY
用法:
{注释符号} ONEWAY
单向情况下,将会删除多版本代码的注释
[!IMPORTANT]
如果启用单向之后又改回双向,立刻在源文件中进行手动同步,请注意不要触发反向修改,不然会损坏原文件
示例:
public static void setScreen(MinecraftClient client, Screen screen) {
// IF fabric-1.16.5
// client.openScreen(screen);
// ELSE
// client.setScreen(screen);
// END IF
}
在fabric-1.16.5
文件夹中
public static void setScreen(MinecraftClient client, Screen screen) {
client.openScreen(screen);
}
其他文件夹中
public static void setScreen(MinecraftClient client, Screen screen) {
client.setScreen(screen);
}
黑名单
在文件的前四行使用关键字EXCLUDE
用法:
{注释符号} EXCLUDE {布尔表达式}
白名单
在文件的前四行使用关键字ONLY
用法:
{注释符号} ONLY {布尔表达式}
重命名文件
在文件的前四行使用关键字RENAME
用法:
{注释符号} RENAME {带变量的字符串}
示例:
// RENAME $fileNameWithoutExtension.json
自定义加载器
默认只监听fabric
,forge
,neoforge
,quilt
文件夹内的更改
如果要添加别的加载器文件夹,请对着文件夹右键选择将文件夹...设置为监听的加载器
- 如果使用
git
,需要上传.idea/ModMultiLoaders.xml
别名替换
- 要求:
- 本插件0.16.6+
- ModMultiVersionTool1.2.7+
- 如果使用
git
,需要上传.idea/ModAliasState.xml
视图
-工具窗口
-Alias Tool
- 如何使用
- 右键
root
新建,命名你的变量,例如Style
,会自动填充为#Style#
- 右键
Style
新建,设置条件表达式,例如> forge-1.16.5
,再输入满足条件的内容,可以添加多个
- 右键
示例:
root
├── #Style#
│ ├── > forge-1.16.5
│ │ └── net.minecraft.network.chat.Style
│ └── forge-1.16.5
└── net.minecraft.util.text.Style
// origin文件夹内
public static #Style# getStyleFromCode(ChatImageCode code) {
return #Style#.EMPTY;
}
// > forge-1.16.5
public static net.minecraft.network.chat.Style getStyleFromCode(ChatImageCode code) {
return net.minecraft.network.chat.Style.EMPTY;
}
// forge-1.16.5
public static net.minecraft.util.text.Style getStyleFromCode(ChatImageCode code) {
return net.minecraft.util.text.Style.EMPTY;
}
简化仓库代码(使用构建工具)
该段为可选,非强制使用
在开发完成后,你会发现各个版本的文件都是由origin中文件生成,所以你可以使用构建工具来简化仓库代码
- 删除所有由origin中文件复制的文件
- 下载构建工具ModMultiVersionTool.jar
- 项目在开发前先进行复制同步,可参考tool 与 init.ps1
同名快速跳转
- 要求:
- 本插件0.18.0+
对着文件右键或者在编辑器内右键