首頁 > Java > 主體

Minecraft 結構覆蓋現有塊 1.20

PHPz
發布: 2024-02-22 13:00:09
轉載
746 人瀏覽過

php小編柚子帶來的java問答專題將為您詳細解答Minecraft中關於結構覆蓋現有塊的問題。在遊戲中,如何有效地操作和利用這項功能,將直接影響遊戲體驗和玩法樂趣。透過本文的解讀與指導,希望能幫助您更能掌握這項技巧,從而在遊戲中取得更好的成績和體驗。

問題內容

我一直在嘗試在線尋找一種方法來修改 Minecraft Fabric 中的現有區塊及其屬性,但我所能找到的只是如何建立新區塊。 我找到的任何版本都低於 1.20。

我實際上根本找不到覆蓋現有區塊屬性的方法。覆蓋也不起作用

解決方法

您本質上想要做的是重新註冊 minecraft 已經註冊的 block 實例。但沒有人記錄如何做到這一點是有原因的:你不應該

在 minecraft 中重新註冊區塊可能會導致奇怪的問題,尤其是當您的模組將在大型模組包中使用時。這與其他模組甚至《我的世界》本身的兼容性有關。您最好希望避免這種情況。還有十幾種其他解決方案可以改變特定區塊的行為,而不會造成太多問題。它們包括但不限於:

  • 只需將您的方塊添加到minecraft 的內建標籤之一- 您甚至不需要java 程式碼,只需要資料包中的json 檔案:https://www.php.cn/link/ff7cc29289db44861ce4b3e5e56fe234 。例如,這可以使石頭可以用鏟子開採。
  • 使用 fabric api 提供的回呼之一來偵聽您想要處理的某些事件。例如,當玩家點擊它時,它可以將草塊變成泥土。
  • 建立一個所謂的“擴充塊”,它可以充當區塊的自訂狀態屬性。 ie。如果您想給minecraft:stone 一個age 屬性(無論出於何種原因可能有用),請將minecraft:stone 視為age =0 並使用age 建立自訂區塊(例如modid:ged_stone) zqb 屬性從1 到任何最大年齡擴大年齡範圍。

另一種更通用的方法是將mixin 建置到block 類別或適當的子類別中,並執行類似以下操作來定位特定區塊(在本例中為石頭):

block self = (block) (object) this;
if (builtinregistries.block.getkey(self).equals(new resourcelocation("stone"))) {
    // do something only if this block is stone
}
登入後複製

但是,如果您真的真的想完全取代區塊實例,這裡有一個建議:使用 mixin 注入 registry.register,用自訂區塊實例取代特定區塊實例:

@Mixin(Registry.class)
public class RegistryMixin {
    @Inject(
        // You may need to specify the correct signature after the method
        // name because there are two `register` methods.
        method="register",
        at=@At("HEAD"),
        cancelable=true
    )
    // Note that this is a generic method, in Mixin you'll have to use
    // Object to replace type parameters
    private static void onRegister(Registry reg, ResourceLocation id, Object value, CallbackInfoReturnable<Object> cir) {
        if (reg != BuiltInRegistries.BLOCK) return;
        if (!id.toString().equals("minecraft:stone")) return;

        // Now that you've filtered out the minecraft:stone block,
        // you can re-register it
        Block myCustomBlock = new Block(.......);
        ((WritableRegistry) reg).register(id, myCustomBlock);
        cir.setReturnValue(myCustomBlock);
    }
}
登入後複製

但再次嘗試避免這種解決方案。這裡有龍。

請注意,我尚未測試任何程式碼片段,因為在撰寫本文時我手邊沒有修改環境。它可能需要調整才能工作。 另外,我使用了 mojang 的官方映射,如果您使用 yarn 映射,名稱可能會有所不同。例如,resourcelocation 在 yarn 中被命名為 identifier

我希望這有幫助。快樂編碼!

以上是Minecraft 結構覆蓋現有塊 1.20的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板