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
,ClientOnlyProxy
和DedicatedServerProxy
。
- 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入門教程(四十八):初始化操作 CommandLineRunner和ApplicationRunner
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、