模組製作

目錄:

  • 環境

  • 模組架構

  • java主程式

  • 文字翻譯系統

環境

  • 安裝java(21)

  • 安裝gradle

  • 安裝vscode

安裝java

  • 請點擊        下載jdk21(windows版本)
  • 執行後點Next,跑完點close
  • 左下角電腦搜尋環境變數
  • 點擊環境變數
  • 在使用者變數點選Path
  • 點選編輯
  • 選新增
  • 輸入C:\Program Files\Java\jdk-21\bin

  • Enter後一直按確定

安裝gradle

  • 請點擊        下載gradle二進位版(windows版)
  • 解壓縮至C:Gradle
  • 左下角電腦搜尋環境變數
  • 點擊環境變數
  • 在使用者變數點選Path
  • 點選編輯
  • 選新增
  • 輸入C:\Gradle\gradle-8.13\bin

  • Enter後一直按確定

安裝vscode

  • 請點擊        下載vscode(windows版)
  • 執行安裝檔
  • 選取同意後持續點擊下一步
  • 點擊安裝
  • 點擊完成
  • 進入點及左下方的擴充功能
  • 搜尋欄搜尋java
  • 安裝Extension Pack for Java

模組架構

 工作區/

         build.gradle  
         settings.gradle
         gradle.properties

         src/main/
                         java/模組名稱資料夾/
                                           模組名稱.java  
                         resources/
                                       fabric.mod.json

                                       assets/模組名稱/

                                                            lang/

​​

gradle

一個建構工具

把檔案做成可以放進minecraft的jar檔

build.gradle

plugins:會使用到的插件

plugins {
    id 'fabric-loom' version '1.10-SNAPSHOT'
    id 'maven-publish'
}

dependencies:會用到的函式庫

dependencies {
    minecraft "com.mojang:minecraft:${project.minecraft_version}"
    mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
}

tasks:要執行的任務

tasks.withType(JavaCompile).configureEach {
    it.options.encoding = "UTF-8"
    it.options.release = 21
}

gradle.properties

一次設定好各個插件的版本

org.gradle.jvmargs=-Xmx2G
minecraft_version=1.21.5
yarn_mappings=1.21.5+build.1
loader_version=0.16.13
fabric_version=0.120.0+1.21.5
dependencies {
    minecraft "com.mojang:minecraft:${project.minecraft_version}"
    mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
}

settings.gradle

pluginManagement:告訴它這個區塊在設定插件

repositories:告訴它插件的位置

pluginManagement {
    repositories {
        mavenCentral()  // 從 Maven Central 下載
        maven {         
            name = 'Fabric'
            url = 'https://maven.fabricmc.net/'  // 從 Fabric 下載
        }
    }
}

這三個都寫好後就可以免費開啟minecraft嘿嘿

fabric.mod.json

設定模組的資料

schemaVersion fabric讀取資料的方式
id 電腦辨識模組空間的id
version 此模組的版本
name 模組名稱
authors 作者
entrypoints 模組初始化的程式位置
environment 模組運行的地方
depends 需要用到外部程式版本
{
    "schemaVersion": 1,
    "id": "testmod", 
    "version": "1.0.0",
    "name": "example_mod",
    "description": "A mod example",
    "authors": "Felix",
    "environment": "*",
    "entrypoints": {
        "main": [
        "example.testmod"
      ]
    },
    "depends": {
        "fabricloader": ">=0.16.13",
        "fabric-api": "*",
        "minecraft": "1.21.5"
    }
  }
  

Java語法

public class HelloWorld{

      public static void main(String[]args){

            System.out.println("Hello! World!");

      }

}

常用變數型別

變數型別 意義 位元數 表示方法
int 整數 32 數值
long 常整數 64 數值L
float 浮點數 ​32 數值f
double 精度浮點數 64 數值d
boolean 布林值 true/false
char 字元 16 '字母'或Unicode編碼

類別裡面有變數和函式

類別class

在main中可以取用類別中的函式

package starter;//所在資料夾

class PwP {
    PwP(){
        System.out.println("class PwP is running");
    }
    void hello(){
        System.out.println("Hello everyone.");
    }
    static void minecraftMovie(){
    	System.out.println("I ~~~  am steve.");
    }
}

public class QAQ {
    public static void main(String[]args){
        PwP person = new PwP();
        person.hello();
        PwP.minecraftMovie();
        
    }
}

每個java程式自己本身都是一個類別,

且類別名稱須跟檔名一樣

函數(方法)

public class hello {
    static void hello(){
        System.out.println("Hello World!");
    }
    public static void main(String[] args) {
        hello();
    }
}

可以在函數中寫程式,當函數被呼叫就會執行函數中的程式

在有static的函數中使用的函數也要有static

判斷句

public class hello {
    public static void main(String[] args) {
    	int a=1,b=1;
        if(a==b){
        	System.out.println("a=b");
        }
    }
}

若括號內的判斷為真

則執行大括號內的程式碼

迴圈

public class hello {
    public static void main(String[] args) {
        while(true){
        	System.out.println("電腦要爆了QAQ")
        }
        for(int i = 1;i>0;i++){
        	System.out.println("炸電腦使我快樂")
        }
    }
}

While迴圈:

只要括號內條件為真就執行大括號內的程式碼

for迴圈:

括號內每隔用分號分開,

第一格為初始值,第二格為條件,

第三格為大括號內程式執行完後要做的事

只要第二格條件為真就繼續執行

package Starter
public class StarterMod implements ModInitializer {
    @Override
    public void onInitialize() {
        System.out.println("模組啟動!");
    }
}

類別名稱

(模組名稱)

onInitialize():minecraft跑的時候會執行它

ModInitializer:有onInitialize()的介面(跟類別差不多)

模組會用到的東東

初始化模組

把模組一開始要用到的東西設定好

放在src\main\java\模組資料夾名稱\模組名稱.java

模組資料夾名稱

註冊自訂物品

先自訂註冊物品的方法

final class testmodItems {
    private testmodItems() {
    }

    public static Item register
    (String path, Function<Item.Settings, Item> factory, Item.Settings settings) {
         final RegistryKey<Item> registryKey = 
         RegistryKey.of(RegistryKeys.ITEM, Identifier.of("testmod", path));
         return Items.register(registryKey, factory, settings);
    }

    public static final Item TEST_ITEM = 
    register("magicitem", Item::new, new Item.Settings());

    public static void initialize() {
    }
}

然後讓模組讀取

public class testmod implements ModInitializer {

    @Override
    public void onInitialize() {
        testmodItems.initialize();
        System.out.println("testmod is loaded!");
    }
}

增加物品的功能

class magicItem extends Item {
    public magicItem(Settings settings) {
        super(settings);
    }

    public ActionResult use(World world, PlayerEntity user, Hand hand) {
        if (!world.isClient) {
            user.heal(5.0F);
            user.getStackInHand(hand).decrement(1);
        }

        user.playSound(SoundEvents.BLOCK_WOOL_BREAK, 1.0F, 1.0F);
        return ActionResult.SUCCESS;
    }
    
}

在註冊物品時告訴它新增的物品是這個類別

public static final Item TEST_ITEM = 
    register("magicitem", magicItem::new, new Item.Settings());

新增物品的類別

從Item改成了magicItem

註冊自訂物品類別

final class testmodItemGroups {
    public static final RegistryKey<ItemGroup> TEST_GROUP_KEY = 
    RegistryKey.of(Registries.ITEM_GROUP.getKey(), Identifier.of("testmod", "test_group"));
    public static final ItemGroup TEST_GROUP = FabricItemGroup.builder()
		.icon(() -> new ItemStack(testmodItems.TEST_ITEM))
		.displayName(Text.translatable("itemGroup.testmod.test_group"))
		.build();
    public static void initialize() {
        Registry.register(Registries.ITEM_GROUP, TEST_GROUP_KEY, TEST_GROUP);
        ItemGroupEvents.modifyEntriesEvent(TEST_GROUP_KEY).register(content -> {
            content.add(testmodItems.TEST_ITEM);           //把物品加入物品類別
        });
    }
}

讓模組讀取它

public class testmod implements ModInitializer {

    @Override
    public void onInitialize() {
        testmodItemsGroups.initialize();
        System.out.println("testmod is loaded!");
    }
}

註冊物品類別

文字翻譯系統與材質

{

    "itemGroup.testmod.test_group": "測試模組",

    "item.testmod.magicitem": "神奇物品"

}

翻譯文件

位置在src\main\resources\assets\模組名稱\lang\zh_tw.json

{

    "程式中的名字": "遊戲中要顯示的文字",

    "item.testmod.magicitem": "神奇物品"

}

物品材質

物品的圖片位置在src/main/resources/assets/模組名稱/textures/item/物品id.png

物品的json位置在src/main/resources/assets/模組名稱/models/item/物品id.json

{
  "parent": "item/generated", //2d物品
  "textures": {
    "layer0": "模組名稱:item/物品id" //圖片路徑
  }
}

結束了\(OvO)/

函式庫查詢

https://maven.fabricmc.net/docs/yarn-1.21.5+build.1/

版本在這裡改

也可以從fabric wiki看

Made with Slides.com