最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

[MMS]《Fabric進階開發(fā)指南》其一::訪問加寬器

2023-06-24 22:14 作者:偶系夏柒楓  | 我要投稿

Fabric CN Wiki地址:fabricmc.net/wiki/zh_cn:tutorial:accesswideners

本教程使用 Yarn 映射,集成開發(fā)環(huán)境為 IntelliJ IDEA。

概述

????關(guān)于訪問加寬器是什么,Wiki 已經(jīng)給出了通俗易懂的解釋,并且對于它的使用時機也提供了一些建議,在這里我就用自己的話簡單轉(zhuǎn)述一下——

????訪問加寬器(Access Wideners)可以訪問并修改已經(jīng)存在或是已經(jīng)編譯好的類、方法、字段(即變量和常量)的訪問權(quán)限,它彌補了 Mixin 無法修改或訪問私有類以及 final 定義的字段的缺點。

????關(guān)于訪問加寬器的使用時機,Wiki 上也給出了建議:注入代碼時應(yīng)優(yōu)先使用 Mixin,在遇到無法訪問或修改的私有對象時才可使用加寬器。

????為了更直觀地方便理解,我在這里舉一個例子——

????你編寫了一個名為?ExampleMenuScreen?的類,并讓其繼承?net.minecraft.client.gui.screen?包內(nèi)的?Screen?類,你想在游戲運行時動態(tài)修改?Screen?內(nèi)?drawableChild?的渲染順序,最簡單的方法就是對?Screen?類內(nèi)的?drawables?進行重排序,但是當(dāng)你看到?private final List<Drawable> drawables = Lists.newArrayList()?這條語句時你就已經(jīng)知道,ExampleMenuScreen?類作為?Screen?類的子類是沒有權(quán)限訪問?drawables?這個字段的,final?修飾符也在說明它更無從修改。(這里排除自己定義一個新的?List<Drawable>?并實現(xiàn)?render()?方法)遇到這種類似情況時訪問加寬器就可以將?drawables?變?yōu)?public?并刪去?final?修飾符使其可以訪問并修改。

????相信很多 modders 看到 Wiki 也是一頭霧水,接下來我將會按照操作順序逐步講解訪問加寬器。

需求

  • Fabric-loader 0.8.0 或更高

  • Loom 0.2.7 或更高

開始開發(fā)!

????1.新建 Access Widener 文件

????訪問加寬器的本體是一個后綴名為 .accesswidener 的文件,這個文件里定義了我們想要更改的類、方法或字段,該文件必須位于項目中的 /resources/ 文件夾中,與 fabric.mod.json 位于同一層級。

????右鍵項目中的 /resources/ 文件夾,在【新建】側(cè)拉菜單中單機【文件】,如圖1.1。

圖1.1

????鍵盤鍵入進行命名。文件名應(yīng)為?modid.accesswidener,其中?modid?應(yīng)為你的模組 ID(一說也稱命名空間),如圖1.2。

圖1.2

????此時你的 /resources/ 文件夾根目錄應(yīng)該會有你新建的 .accesswidener 文件,此時它應(yīng)該是空的,因為我們并沒有向其中輸入任何內(nèi)容。

????2.編寫第一行

????雙擊打開我們剛剛新建的?.accesswidener 文件,在文件首行鍵入:accessWidener ? v1 ?named,如圖2.1。任何空白字符都會作為 .accesswidener 文件的分隔符,推薦制表符 Tab鍵。其中,named?可以換成?intermediary?,它們的區(qū)別是?named?為 Yarn 命名,即模組混淆命名空間(可以說是模組ID),intermediary?為中間命名,一般不常用。

圖2.1

????3.將 .accesswidener 文件添加進項目編譯

????打開 build.gradle 文件,依據(jù)自己的 loom 版本在文件末尾添加代碼塊:

loom 0.9 或更高版本:

????loom?{
? ?????accessWidenerPath = file("src/main/resources/modid.accesswidener")
????}

loom 0.8 或更低版本:

????loom {

????????accessWidener = file("src/main/resources/modid.accesswidener")

????}

????,如圖3.1。其中,file()?方法內(nèi)的變量為你的 .accesswidener 文件的路徑。

圖3.1

????接下來打開 fabric.mod.json,在大括號內(nèi)添加代碼塊:

????"accessWidener": "modid.accesswidener"

????,如圖3.2。其中,"accessWidener" 為 JSON KEY,"visualnovellib.accesswidener"?即為 JSON VALUE,將它更改為你自己的 .accesswidener 文件名。

圖3.2

????完成以上兩步后你需要重新構(gòu)建 Gradle 項目。點擊 build.gradle 文件右上角的?旋? 轉(zhuǎn)? 大? 象 按鈕(如圖3.3),或是單擊菜單欄中的【構(gòu)建】,在下拉選單中單擊【重新構(gòu)建項目】(如圖3.4),等待項目構(gòu)建完成后再進行下一步。

圖3.3
圖3.4

????4.正式編寫 .accesswidener 文件

????打開 .accesswidener 文件,就可以按照 Wiki 上的教程進行編寫了。Wiki 上的教程非常詳細,請移步那里去看,我在這里也不多說了,只將截圖貼過來并講解一些地方。

????首先, .accesswidener 文件是支持注釋的,按照 Wiki 頁面上所說,如圖4.1。

圖4.1

????其次,對于類名包名的分隔格式 Wiki 也做了說明,如圖4.2。這里要注意一點內(nèi)部類的分隔方式的特殊性。

圖4.2

????然后,訪問加寬器支持類、方法和字段三種類型的權(quán)限修改,如圖4.3。這里要注意幾點——

????第一,訪問權(quán)是指你想要修改的結(jié)果,分別為 extendable(可繼承)、accessible(可訪問) 和 mutable(可修改),這三種訪問權(quán)分別是什么意思請見圖4.4。

????第二,訪問權(quán)雖各司其職,但可疊加。例如我們在概述舉的例子中,drawables是一個 private final 字段,如果我們給其賦予 accessible 訪問權(quán),雖然 private 變成了 public,但是 final 修飾符仍然存在,我們依然無法修改 drawables,此時我們可以在 .accesswidener 文件中再定義一行,將 mutable 訪問權(quán)賦予給 drawables 字段。

????第三,<className> 即類名,它需要填寫完整的包路徑,并需嚴格遵守以上的分隔格式,例如 Screen 類位于?net.minecraft.client.gui.screen?包下,那么 <className> 應(yīng)為?net/minecraft/client/gui/screen/Screen 。如果我們在 .accesswidener 文件首行使用了?intermediary?關(guān)鍵字而非?named?關(guān)鍵字,那么 <className>?應(yīng)為中間名稱,即 net/minecraft/class_3637 。

????第四,<methodDesc> 即方法描述符并非如字面意思可以隨意填寫,很多人只看到了“描述”二字而并沒有看到“符”字便以為這是可以隨意填寫描述的參數(shù)導(dǎo)致項目報錯。其實這里的描述符是指Java中的描述符,在這里就是參數(shù) <methodName> 的類的描述符。例如在?NamespaceResourceManager 類中的?validate() 方法為 Identifier 類型,那么 <methodDesc> 應(yīng)為?(Lnet/minecraft/util/Identifier;)V ,注意括號、分號和大寫字母 L 和 V,這是和下面的字段描述符所不同的地方,并且你應(yīng)該會很熟悉這個格式,沒錯,這是在編寫?Mixin 時所使用的類似的格式。

????第五,<fieldDesc> 即字段描述符,同上第四,例如在 Screen 類中的 drawables 字段類型為 List<Drawable> ,那么 <fieldDesc> 應(yīng)為?Ljava/util/List; ,尖括號內(nèi)的 DrawableList 的泛型,不用管他,要注意分號和大寫字母 L。

圖4.3
圖4.4

????5.重生成Minecraft源代碼以應(yīng)用訪問加寬器

????在編寫完 .accesswidener 文件后我們還需使它生效。單擊最右側(cè)邊欄的【Gradle】選項卡,并在 modid/Tasks/fabric 中雙擊【genSources】,重生成訪問加寬后的Minecraft源代碼,在該 Gradle 任務(wù)跑成功后你應(yīng)該能夠在反編譯的源碼中看到你在 .accesswidener?文件中定義的類、方法或字段已經(jīng)訪問加寬了,接下來你就可以對其為所欲為訪問修改了。

一個 .accesswidener 文件的例子

????這里有一個 .accesswidener 文件的編寫例子可供你參考(取自Lazurite Dev Wiki:lazurite.gitbook.io/lazurite-dev-wiki/modding-knowledge/access-wideners)——

1.?accessWidener ? v1 ?named

2.?# Classes

3.?accessible class net/minecraft/client/render/model/WeightedBakedModel$Entry

4.?extendable class net/minecraft/util/profiler/ProfilerTiming

5.?# Methods

6.?extendable method net/minecraft/resource/NamespaceResourceManager validate (Lnet/minecraft/util/Identifier;)V

7.?accessible method net/minecraft/resource/NamespaceResourceManager validate (Lnet/minecraft/util/Identifier;)V

8.?# Fields

9.?accessible field net/minecraft/client/render/model/WeightedBakedModel models Ljava/util/List;

10.?mutable field net/minecraft/resource/ResourceType directory Ljava/lang/String;

11.?mutable field net/minecraft/resource/DefaultResourcePack LOGGER Lorg/apache/logging/log4j/Logger;

結(jié)束

????以上就是本期訪問加寬器(Access Widener)的所有內(nèi)容了,自己去試試吧,再會!

.V2x5aHV2.

.Minecraft Modding Style.

[MMS]《Fabric進階開發(fā)指南》其一::訪問加寬器的評論 (共 條)

分享到微博請遵守國家法律
龙泉市| 万荣县| 乳源| 龙江县| 巩义市| 亳州市| 霍林郭勒市| 册亨县| 新营市| 新河县| 青河县| 正镶白旗| 新乐市| 鄂温| 长子县| 左权县| 华蓥市| 漯河市| 青州市| 封丘县| 宾阳县| 资兴市| 临海市| 章丘市| 建阳市| 长宁区| 双辽市| 马龙县| 文山县| 华蓥市| 富宁县| 西安市| 新野县| 黎川县| 邳州市| 牙克石市| 鄄城县| 邯郸县| 泰宁县| 志丹县| 许昌市|