模組製作
輸入C:\Program Files\Java\jdk-21\bin
輸入C:\Gradle\gradle-8.13\bin
工作區/
build.gradle
settings.gradle
gradle.properties
src/main/
java/模組名稱資料夾/
模組名稱.java
resources/
fabric.mod.json
assets/模組名稱/
lang/
一個建構工具
把檔案做成可以放進minecraft的jar檔
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
}一次設定好各個插件的版本
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.5dependencies {
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}"
}pluginManagement:告訴它這個區塊在設定插件
repositories:告訴它插件的位置
pluginManagement {
repositories {
mavenCentral() // 從 Maven Central 下載
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/' // 從 Fabric 下載
}
}
}
這三個都寫好後就可以免費開啟minecraft嘿嘿
設定模組的資料
| 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"
}
}
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編碼 |
類別裡面有變數和函式
在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" //圖片路徑
}
}函式庫查詢
https://maven.fabricmc.net/docs/yarn-1.21.5+build.1/
版本在這裡改
也可以從fabric wiki看