1. 程式人生 > >Minecraft Forge程式設計入門三 “初始化專案結構和邏輯”

Minecraft Forge程式設計入門三 “初始化專案結構和邏輯”

經過前面兩個教程Minecraft Forge程式設計入門一 “環境搭建”Minecraft Forge程式設計入門二 “工藝和食譜”,我們大體知道了如何自定義合成配方,主要是在
Mod類的init方法中進行註冊,但可想而之隨著專案的進行需要註冊的內容會越來越多,全部寫在init中會顯得Mod類很臃腫。作為一個優秀的程式設計師可定不能容忍這種事情發生,那麼接下來我們對我們的工程進行一下重構。

看一下重構後的程式碼結構:

原始碼包的處理

在我的工程中,我的包名時com.zql.mc.zmod,這個大家可以自己定義。
我們先看一下ZMod.java這個類:

package
com.zql.mc.zmod; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import
net.minecraftforge.fml.common.event.FMLPreInitializationEvent; /** * *告訴FML我們的Mod的相關資訊,這裡我的modid為ZMod,版本號是1.0,名字是ZMod */ @Mod(modid = ZMod.MOD_ID, version = ZMod.VERSION, name = ZMod.MOD_NAME) public class ZMod { public static final String MOD_ID = "ZMod"; public static final String VERSION = "1.0"
; public static final String MOD_NAME = "ZMod"; //讓FML為我們初始化 @Mod.Instance(value = ZMod.MOD_ID) public static ZMod instance; //告訴FML,對於本地和服務端,proxy分別用ClientOnlyProxy和DedicatedServerProxy進行初始化。 @SidedProxy(clientSide = "com.zql.mc.zmod.ClientOnlyProxy", serverSide = "com.zql.mc.zmod.DedicatedServerProxy") public static CommonProxy proxy; //在我們的mod被載入的時候會按preInit,init和postInit的順序執行這三個方法。 //preInit主要用於讀取本地配置,建立方塊,物品等並註冊他們。 @EventHandler public void preInit(FMLPreInitializationEvent event) { proxy.preInit(); } //init主要用於構建一些我們自定義的資料型別,註冊自定義合成方法,和其它一些操作。 @EventHandler public void init(FMLInitializationEvent event) { proxy.init(); } //與其它mod進行互動,完成我們mod最後的處理 @EventHandler public void postInit(FMLPostInitializationEvent event) { proxy.postInit(); } }

對程式碼的解釋我都寫在相應位置,請仔細閱讀。
接著介紹三個類:CommonProxy,ClientOnlyProxyDedicatedServerProxy
- CommonProxy:用於初始化mod,並使它能夠正常執行。CommonProxy的程式碼同時在本地和服務端執行。
其中preInit,init和postInit分別對應Mod中的三個方法。

package com.zql.mc.zmod;

import net.minecraft.entity.player.EntityPlayer;

public abstract class CommonProxy {

    public void preInit() {
    }

    public void init() {
    }

    public void postInit() {
    }

    abstract public boolean playerIsInCreativeMode(EntityPlayer player);

}
  • ClientOnlyProxy:繼承CommonProxy,在它的基礎上做一些只有client端需要處理的事情如方塊的渲染工作等。
package com.zql.mc.zmod;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;

public class ClientOnlyProxy extends CommonProxy {

    public void preInit() {
        super.preInit();
    }

    public void init() {
        super.init();
    }

    public void postInit() {
        super.postInit();
    }

    @Override
    public boolean playerIsInCreativeMode(EntityPlayer player) {
        if (player instanceof EntityPlayerMP) {
            EntityPlayerMP entityPlayerMP = (EntityPlayerMP) player;
            return entityPlayerMP.theItemInWorldManager.isCreative();
        } else if (player instanceof EntityPlayerSP) {
            return Minecraft.getMinecraft().playerController.isInCreativeMode();
        }
        return false;
    }
}
  • DedicatedServerProxy:繼承CommonProxy,在它的基礎上做一些只有server端需要處理的事情。但大部分時間不需要擴充套件,只要完成CommonProxy的工作就行了。
package com.zql.mc.zmod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;

public class DedicatedServerProxy extends CommonProxy {

    public void preInit() {
        super.preInit();
    }

    public void init() {
        super.init();
    }

    public void postInit() {
        super.postInit();
    }

    @Override
    public boolean playerIsInCreativeMode(EntityPlayer player) {
        if (player instanceof EntityPlayerMP) {
            EntityPlayerMP entityPlayerMP = (EntityPlayerMP) player;
            return entityPlayerMP.theItemInWorldManager.isCreative();
        }
        return false;
    }
}

目前讀者如果上面的程式碼有疑惑是正常的,等後面結合例子看的時候就明朗了。下面來看資源目錄的初始化:
在src/main/resources下新建一下幾個包:
- assets.zmod.blockstates:用於自定義方塊狀態的json檔案儲存。
- assets.zmod.lang:用於自定義物品和方塊等的名稱。
- assets.zmod.models.block:用於自定義方塊模型的json檔案儲存。
- assets.zmod.models.item:用於自定義物品模型的json檔案儲存。
- assets.zmod.textures.blocks:用於自定義方塊的紋理圖片的儲存。
- assets.zmod.textures.items:用於自定義物品的紋理圖片的儲存。

以上資料夾名字是固定的,不能有任何偏差。

以上就是我們要做的準備工作,所謂工欲善其事,必先利其器。現在我們的利器已經準備完畢,接下來就可以開始我們物品和方塊的自定義之旅了。

參考資料

相關推薦

Minecraft Forge程式設計入門初始專案結構邏輯

經過前面兩個教程Minecraft Forge程式設計入門一 “環境搭建”和Minecraft Forge程式設計入門二 “工藝和食譜”,我們大體知道了如何自定義合成配方,主要是在 Mod類的init方法中進行註冊,但可想而之隨著專案的進行需要註冊的內容會越來

Spark流程式設計指引()-------------------------------------初始StreamingContext

基本概念 接下來,我們在上一節例子的基礎上,來闡述Spark Streaming的基本知識。 連結 和Spark類似,Spark Streaming也包含在maven的中央倉庫中。為了寫基於Spark Streaming的程式,你需要為你的SBT或Maven工程分別新增以

Minecraft Forge程式設計入門二 “工藝食譜”

從現在開始我們就要開始真正寫程式碼了,還沒有來得及配置環境的同學可以參考Minecraft Forge程式設計入門一 “環境搭建”這篇文章來進行環境搭建。 工藝(Craft)和食譜(Recepe) 所謂的工藝和食譜是指在Minecraft中物品的合成和合成表

[OpenCV3程式設計入門讀書筆記]常用資料結構函式(3)

點的表示:Point類 //第一種表示方式 Point point; point.x = 10; point.y = 8; //第二種表示方式 Point point = Point(10,8); 顏色的表示:Scalar類 特別注意OopenCV裡面不是RGB,是BGR,所以下面的a

Shell程式設計入門:流程控制

和Java、PHP等語言不一樣,sh的流程控制不可為空,如: public class Test{ public static void main(String[] args){ int a = 10; if(a > 5){

AntDesign 第一章(2) --------初始專案

初始化專案 現在你已經瞭解了前端開發的基本概念,開始要進入實際專案了。這一節將教會大家如何初始化一個專案,開發出一個可以展示 hello world 的專案。 這堂課程中的相關程式碼你都可以在 https://github.com/ant-design/reac

Spring Boot入門教程(四十八):初始操作 CommandLineRunnerApplicationRunner

CommandLineRunner和ApplicationRunner在SpringApplication.run()之前,在所有的beans載入完成之後執行,用於執行一些初始化操作(如載入快取、讀取配置檔案、建立執行緒池等) CommandLineRunner和Applicatio

windows全域性安裝vue-cli無法初始專案

使用官方文件全域性安裝vue-cli 1.檢視node版本(安裝後記得配置node的環境變數,才能執行下面命令) node -v 2.檢視npm版本 npm-v npm install -g vue-cli ####3. 使用全域性安裝命令前請確定安裝了node以

微信開發者工具初始專案時,進去報錯:小程式重啟耗時過久,請確認業務邏輯中是否有複雜運算,或者死迴圈

              如圖上,為錯誤原因。   之前用開發者工具用的好好地,前些日子又版本更新,升級了一下,然後開啟專案就出現上面的問題。當時以為電腦出啥問題了,也沒當回事。今天再次開啟開發者工具,發現還是出現上面的問題。一臉懵,新建專案,啥都沒做竟然出問題。網上一查同樣的問題一大堆。

使用@vue/cli初始專案

Vue CLI 的包名稱由 vue-cli 改成了 @vue/cli。 如果你已經全域性安裝了舊版本的 vue-cli (1.x 或 2.x),你需要先通過 npm uninstall vue-cli -g     解除安裝它。附上vue-cli官方文件地址 首先檢查你

Vue腳手架初始專案

Vue專案初始化 在使用webpack之前,需確保安裝好環境,因為我的專案使用npm進行初始化,所以需要先配置node.js的環境,也可以使用yarn進行專案初始化 配置node環境 首先是node.js,到node的官網下載node node.js官網 在官網中下載長期支援版

git專案初始專案常用命令

本地建立檔案目錄,執行git init 初始化git專案 git remote add origin +遠端地址 //將本地資料夾和遠端專案對應起來 git pull origin master //將遠端(origin)的master分支的程式碼拉下來 執行git status //對比本地及遠端程

深度學習筆記:tensorflow 入門 變數初始

# 變數op # 1、變數能夠持久化儲存,普通的張量op是不行的 # 2、當定義一個變數op的時候,一定要在會話當中去執行初始化 a = tf.constant([1, 2, 3, 4, 5]) var = tf.Variable(tf.random_no

Spring Boot之初始專案

最簡單的從Spring官網下載 :地址 https://start.spring.io/ 下拉選擇需要的Spring Boot版本 修改Group和Artifact  直接點選Generate Project 即可生層專案壓縮包 解壓後,maven import到本地工作空間即可 開啟src/main/ja

vue-cli初始專案並引入ElementUI

摘要: 寫過了一個我們產品的後臺管理系統,但做完專案都沒有進行總結。感覺好多還是懵懂的感覺,所以想要重新走一遍,寫一個自己的專案。讓自己理清思路 實現: 1、首先確認你的電腦中已經安裝過Node.js了,如果沒有可以百度安裝配置 2、我們來說下安裝vue,是用vue-

wepy學習之路2-初始專案及額外元件的使用

文章目錄 基礎專案生產 1、使用wepy指令生成一個空wepy專案 2、安裝npm依賴包 3、關閉eslint程式碼檢查 4、配置完成 額外元件

git idea 初始專案

3.git status 檢視git狀態,git add .新增新增修改的檔案 4.再git status 檢視新增的檔案 5.git commit -am "first commit init project" 提交修改的檔案到本地庫 6.把專案push到遠端倉庫 git remote add origin

vue2+webpack2 初始專案

準備工作 npm install --g vue-cli 專案初始化 官網給出了兩個模板: webpack-simple 和 webpack 。區別在於webpack-simple 沒有包括Eslint 等檢查功能,所以普通專案基本用webpack

關於 vue-cli 初始專案失敗的解決辦法

相信很多初學VUE的朋友很多都碰到了初始化專案報錯的情況,我也是去搜索了很多種方法來嘗試解決,不過收穫甚微,有的需要把hosts檔案還原,由於我的是更改後用來透過DNS連結google的,就沒有還原,最後只能是用了最簡單直接的辦法解決了,上圖之後我執行了①、vue init

【Java 程式設計】陣列初始的多種方式

文章目錄 1 陣列定義與初始化基本方式 2 Array 工具類 3 Stream 方式 4 Arrays 1 陣列定義與初始化基本方式 陣列定義的兩種基本方式: int[][] a1; int a2[][]; 與C、