Home

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               # 加载器文件夹
├── 📂 ...                  # 别的加载器
└── 📜 ...                  # 其他文件

用于同步的文件夹:

全局级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 IFIF-ELSE表达式
EXCLUDE黑名单
ONLY白名单
ONEWAY单向同步
RENAME重命名文件

注释符号

布尔表达式

可以使用上述关键字进行组合

左部省略时自动补充$$ ==

最终计算时会替换掉变量

示例:

变量

变量名类型示例
$$String加载器版本文件夹名称1.20.1forge
$folderString文件所在文件夹名称
$loaderString加载器名称(小写)forge
$fileNameString文件名称(带后缀)test.java
$fileNameWithoutExtensionString文件名称(无后缀)test

IF-ELSE

示例:

    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

输出调试,主要用于变量的调试

示例

// 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中的修改同步到CD

单向同步

[!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文件夹内的更改

如果要添加别的加载器文件夹,请对着文件夹右键选择将文件夹...设置为监听的加载器

别名替换

视图-工具窗口-Alias Tool

示例:

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;
}