diff --git a/translated/it_it/contributing.md b/translated/it_it/contributing.md index 21a3e5bd1..a8cd5ee4b 100644 --- a/translated/it_it/contributing.md +++ b/translated/it_it/contributing.md @@ -51,8 +51,8 @@ Se vuoi sviluppare localmente, dovrai installare [Git](https://git-scm.com/). Dopo di che, clona la tua fork della repository con: ```sh -# assicurati di sostituire "nome-utente" con il tuo nome utente -git clone https://github.com/nome-utente/fabric-docs.git +# make sure to replace "your-username" with your actual username +git clone https://github.com/your-username/fabric-docs.git ``` #### localmente Installare le Dipendenze {#install-dependencies} @@ -125,7 +125,7 @@ Framework si riferisce alla struttura interna del sito, ogni pull request che mo Dovresti davvero fare pull request riguardanti il framework solo dopo esserti consultato con il team della documentazione nel [Discord di Fabric](https://discord.gg/v6v4pMv) o tramite un'issue. -::: info +:::info Modificare i file nella sidebar e la configurazione della barra di navigazione non conta come pull request riguardante il framework. ::: @@ -147,13 +147,13 @@ Ricordati anche di aggiungere il tuo nome utente GitHub ad `authors` nel frontma ```md --- -title: Titolo della Pagina -description: Questa è la descrizione della pagina. +title: Title of the Page +description: This is the description of the page. authors: - - nome-utente + - your-username --- -# Titolo della Pagina {#title-of-the-page} +# Title of the Page {#title-of-the-page} ... ``` @@ -163,7 +163,7 @@ authors: Ogni intestazione deve avere un'ancora, che viene utilizzata per collegarsi a quell'intestazione: ```md -# Questa È un'Intestazione {#questa-e-un-intestazione} +# This Is a Heading {#this-is-a-heading} ``` L'ancora deve usare caratteri minuscoli, numeri e trattini. @@ -225,18 +225,18 @@ Per esempio, per inserire un link alla pagina `/players/index.md` dalla pagina ` ::: code-group ```md:no-line-numbers [✅ Correct] -Questo è un link relativo! -[Pagina](../players/index) +This is a relative link! +[Page](../players/index) ``` ```md:no-line-numbers [❌ Wrong] -Questo è un link assoluto. -[Pagina](/players/index) +This is an absolute link. +[Page](/players/index) ``` ```md:no-line-numbers [❌ Wrong] -Questo link relativo ha l'estensione del file. -[Pagina](../players/index.md) +This relative link has the file extension. +[Page](../players/index.md) ``` ::: diff --git a/translated/it_it/develop/codecs.md b/translated/it_it/develop/codecs.md index 5a629cdd1..73b3eef08 100644 --- a/translated/it_it/develop/codecs.md +++ b/translated/it_it/develop/codecs.md @@ -6,15 +6,15 @@ authors: - Syst3ms --- -# Codec +# Codec {#codecs} Un codec è un sistema per serializzare facilmente oggetti Java, ed è incluso nella libreria DataFixerUpper (DFU) di Mojang, che è inclusa in Minecraft. Nel contesto del modding essi possono essere usati come un'alternativa a GSON e Jankson quando si leggono e si scrivono file json personalizzati, anche se hanno cominciato a diventare sempre più rilevanti, visto che Mojang sta riscrivendo molto suo codice in modo che usi i Codec. I Codec vengono usati assieme a un'altra API da DFU, `DynamicOps`. Un codec definisce la struttura di un oggetto, mentre i dynamic ops vengono usati per definire un formato da cui e a cui essere serializzato, come json o NBT. Questo significa che qualsiasi codec può essere usato con qualsiasi dynamic ops, e viceversa, permettendo una grande flessibilità. -## Usare i Codec +## Usare i Codec {#using-codecs} -### Serializzazione e Deserializzazione +### Serializzazione e Deserializzazione {#serializing-and-deserializing} L'utilizzo basilare di un codec è serializzare e deserializzare oggetti da e a un formato specifico. @@ -51,13 +51,13 @@ BlockPos pos = result.resultOrPartial(LOGGER::error).orElseThrow(); LOGGER.info("Deserialized BlockPos: {}", pos); ``` -### Codec Predefiniti +### Codec Predefiniti {#built-in-codecs} Come menzionato in precedenza, Mojang ha già definito codec per tante classi Java vanilla e standard, incluse, ma non solo, `BlockPos`, `BlockState`, `ItemStack`, `Identifier`, `Text`, e `Pattern` regex. I Codec per le classi di Mojang si trovano solitamente come attributi static chiamati `CODEC` della classe stessa, mentre molte altre sono mantenute nella classe `Codecs`. Bisogna anche sottolineare che tutte le registry vanilla contengono un metodo `getCodec()`, per esempio, puoi usare `Registries.BLOCK.getCodec()` per ottenere un `Codec` che serializza all'id del blocco e viceversa. L'API stessa dei Codec contiene anche alcuni codec per tipi primitivi, come `Codec.INT` e `Codec.STRING`. Queste sono disponibili come statici nella classe `Codec`, e sono solitamente usate come base per codec più complessi, come spiegato sotto. -## Costruire Codec +## Costruire Codec {#building-codecs} Ora che abbiamo visto come usare i codec, vediamo come possiamo costruircene di nostri. Supponiamo di avere la seguente classe, e di voler deserializzare le sue istanze da file json: @@ -97,7 +97,7 @@ Possiamo creare un codec per questa classe mettendo insieme tanti codec più pic Possiamo ottenere il primo dal codec primitivo nella classe `Codec` menzionato in precedenza, nello specifico `Codec.INT`. Mentre il secondo può essere ottenuto dalla registry `Registries.ITEM`, che ha un metodo `getCodec()` che restituisce un `Codec`. Non abbiamo un codec predefinito per `List`, ma possiamo crearne uno a partire da `BlockPos.CODEC`. -### Liste +### Liste {#lists} `Codec#listOf` può essere usato per creare una versione lista di qualsiasi codec: @@ -107,7 +107,7 @@ Codec> listCodec = BlockPos.CODEC.listOf(); Bisogna sottolineare che i codec creati così verranno sempre deserializzati a un'`ImmutableList`. Se invece ti servisse una lista mutabile, puoi usare [xmap](#tipi-convertibili-mutualmente-e-tu) per convertirla ad una durante la deserializzazione. -### Unire i Codec per Classi Simili ai Record +### Unire i Codec per Classi Simili ai Record {#merging-codecs-for-record-like-classes} Ora che abbiamo codec separati per ciascun attributo, possiamo combinarli a formare un singolo codec per la nostra classe usando un `RecordCodecBuilder`. Questo suppone che la nostra classe abbia un costruttore che contiene ogni attributo che vogliamo serializzare, e che ogni attributo ha un metodo getter corrispondente. Questo lo rende perfetto per essere usato assieme ai record, ma può anche essere usato con classi regolari. @@ -126,7 +126,7 @@ Ogni linea nel gruppo specifica un codec, il nome di un attributo, e un metodo g Puoi anche usare `Codec#optionalFieldOf` in questo contesto per rendere un attributo opzionale, come spiegato nella sezione [Attributi Opzionali](#attributi-opzionali). -### MapCodec, Da Non Confondere Con Codec<Map> {#mapcodec} +### MapCodec, Da Non Confondere Con Codec&lt;Map&gt; {#mapcodec} La chiamata a `Codec#fieldOf` convertirà un `Codec` in un `MapCodec`, che è una variante, ma non una diretta implementazione di `Codec`. I `MapCodec`, come suggerisce il loro nome garantiscono la serializzazione a una mappa chiave-valore, o al suo equivalente nella `DynamicOps` usata. Alcune funzioni ne potrebbero richiedere uno invece di un codec normale. @@ -146,7 +146,7 @@ Ma quando viene convertito in un `MapCodec` usando `BlockPos.CODEC.fie Anche se i Map Codec vengono più frequentemente usati per essere uniti ad altri Map Codec per costruire un codec per l'intero insieme di attributi di una classe, come spiegato nella sezione [Unire i Codec per Classi simili ai Record](#unire-i-codec-per-classi-simili-ai-record) sopra, essi possono anche essere ritrasformati in codec normali usando `MapCodec#codec`, che darà lo stesso risultato di incapsulare il loro valore di input. -#### Attributi Opzionali +#### Attributi Opzionali {#optional-fields} `Codec#optionalFieldOf` può essere usato per create una mappa codec opzionale. Esso, quando l'attributo indicato non è presente nel container durante la deserializzazione, verrà o deserializzato come un `Optional` vuoto oppure con un valore predefinito indicato. @@ -162,9 +162,9 @@ Nota che gli attributi opzionali ignoreranno silenziosamente qualsiasi errore ch **A partire da 1.20.2**, Minecraft stesso (non DFU!) fornisce `Codecs#createStrictOptionalFieldCodec`, che fallisce del tutto nel deserializzare se il valore dell'attributo non è valido. -### Costanti, Vincoli, e Composizione +### Costanti, Vincoli, e Composizione {#constants-constraints-composition} -#### Unità +#### Unità {#unit} `Codec.unit` può essere usato per creare un codec che verrà sempre deserializzato a un valore costante, indipendentemente dall'input. Durante la serializzazione, non farà nulla. @@ -172,7 +172,7 @@ Nota che gli attributi opzionali ignoreranno silenziosamente qualsiasi errore ch Codec theMeaningOfCodec = Codec.unit(42); ``` -#### Intervalli Numerici +#### Intervalli Numerici {#numeric-ranges} `Codec.intRange` e compagnia, `Codec.floatRange` e `Codec.doubleRange` possono essere usati per creare un codec che accetta soltanto valori numerici all'interno di un intervallo **inclusivo** specificato. Questo si applica sia alla serializzazione sia alla deserializzazione. @@ -181,7 +181,7 @@ Codec theMeaningOfCodec = Codec.unit(42); Codec amountOfFriendsYouHave = Codec.intRange(0, 2); ``` -#### Coppia +#### Coppia {#pair} `Codec.pair` unisce due codec, `Codec` e `Codec`, in un `Codec>`. Tieni a mente che funziona correttamente soltanto con codec che serializzano a un attributo specifico, come [MapCodec convertiti](#mapcodec) oppure [Codec di Record](#unire-i-codec-per-classi-simili-ai-record). Il codec risultante serializzerà a una mappa contenente gli attributi di entrambi i codec usati. @@ -209,12 +209,12 @@ Restituirà il seguente json: } ``` -#### Either +#### Either {#either} `Codec.either` unisce due codec, `Codec` e `Codec`, in un `Codec>`. Il codec risultante tenterà, durante la deserializzazione, di usare il primo codec, e _solo se quello fallisce_, tenterà di usare il secondo. Se anche il secondo fallisse, l'errore del _secondo_ codec verrà restituito. -#### Mappe +#### Mappe {#maps} Per gestire mappe con chiavi arbitrarie, come `HashMap`, `Codec.unboundedMap` può essere usato. Questo restituisce un `Codec>` per un dato `Codec` e `Codec`. Il codec risultante serializzerà a un oggetto json oppure a qualsiasi equivalente disponibile per il dynamic ops corrente. @@ -242,9 +242,9 @@ Questo restituirà il json seguente: Come puoi vedere, questo funziona perché `Identifier.CODEC` serializza direttamente a un valore di tipo stringa. Un effetto simile può essere ottenuto per oggetti semplici che non serializzano a stringhe usando [xmap e compagnia](#tipi-convertibili-mutualmente-e-tu) per convertirli. -### Tipi Convertibili Mutualmente e Tu +### Tipi Convertibili Mutualmente e Tu {#mutually-convertible-types} -#### `xmap` +#### `xmap` {#xmap} Immagina di avere due classi che possono essere convertite l'una nell'altra e viceversa, ma che non hanno un legame gerarchico genitore-figlio. Per esempio, un `BlockPos` vanilla e un `Vec3d`. Se avessimo un codec per uno, possiamo usare `Codec#xmap` per creare un codec per l'altro specificando una funzione di conversione per ciascuna direzione. @@ -265,7 +265,7 @@ Codec blockPosCodec = Vec3d.CODEC.xmap( // nella tua chiamata ad `xmap`. ``` -#### flatComapMap, comapFlatMap, e flatXMap +#### flatComapMap, comapFlatMap, e flatXMap {#flatcomapmap-comapflatmap-flatxmap} `Codec#flatComapMap`, `Codec#comapFlatMap` e `flatXMap` sono simili a xmap, ma permettono a una o a entrambe le funzioni di conversione di restituire un DataResult. Questo è utile nella pratica perché un'istanza specifica di un oggetto potrebbe non essere sempre valida per la conversione. @@ -301,7 +301,7 @@ Anche se questi metodi sono molto d'aiuto, i loro nomi possono confondere un po' | `Codec#flatComapMap` | Sì | No | | `Codec#flatXMap` | No | No | -### Dispatch della Registry +### Dispatch della Registry {#registry-dispatch} `Codec#dispatch` ci permette di definire una registry di codec e di fare dispatch ad uno di essi in base al valore di un attributo nei dati serializzati. Questo è molto utile durante la deserializzazione di oggetti che hanno attributi diversi a seconda del loro tipo, ma che rappresentano pur sempre la stessa cosa. @@ -348,7 +348,7 @@ Il nostro nuovo codec serializzerà fagioli a json così, prendendo solo attribu } ``` -### Codec Ricorsivi +### Codec Ricorsivi {#recursive-codecs} A volte è utile avere un codec che utilizza _sé stesso_ per decodificare attributi specifici, per esempio quando si gestiscono certe strutture dati ricorsive. Nel codice vanilla, questo è usato per gli oggetti `Text`, che potrebbero contenere altri `Text` come figli. Un codec del genere può essere costruito usando `Codec#recursive`. diff --git a/translated/it_it/develop/commands/arguments.md b/translated/it_it/develop/commands/arguments.md index e1223ab38..1f7ff0d07 100644 --- a/translated/it_it/develop/commands/arguments.md +++ b/translated/it_it/develop/commands/arguments.md @@ -3,7 +3,7 @@ title: Parametri dei Comandi description: Impara come creare comandi con parametri complessi. --- -# Parametri dei Comandi +# Parametri dei Comandi {#command-arguments} La maggior parte dei comandi usa i parametri. A volte possono essere opzionali, il che significa che se non viene fornito quel parametri, il comando verrà eseguito comunque. Ogni nodo può avere tipi di parametri multipli, ma ricorda che c'è una possibilità di ambiguità, che dovrebbe essere evitata. diff --git a/translated/it_it/develop/commands/basics.md b/translated/it_it/develop/commands/basics.md index b12b87b05..645fa7809 100644 --- a/translated/it_it/develop/commands/basics.md +++ b/translated/it_it/develop/commands/basics.md @@ -17,13 +17,15 @@ authors: - xpple --- -# Creare Comandi +# Creare Comandi {#creating-commands} Creare comandi può permettere a uno sviluppatore di mod di aggiungere funzionalità che possono essere usate attraverso un comando. Questo tutorial ti insegnerà come registrare comandi e qual è la struttura generale dei comandi di Brigadier. -:::info -Brigadier è un parser e un dispatcher di comandi scritto da Mojang per Minecraft. È una libreria comandi basata su una gerarchia dove costruisci un albero di comandi e parametri. Brigadier è open-source: -::: +::: info +Brigadier is a command parser and dispatcher written by Mojang for Minecraft. It is a tree-based command library where +you build a tree of commands and arguments. + +Brigadier è open-source: https://github.com/Mojang/brigadier ## L'interface `Command` @@ -43,7 +45,7 @@ Command command = context -> { L'intero può essere considerato il risultato del comando. Di solito valori minori o uguali a zero indicano che un comando è fallito e non farà nulla. Valori positivi indicano che il comando ha avuto successo e ha fatto qualcosa. Brigadier fornisce una costante per indicare il successo; `Command#SINGLE_SUCCESS`. -### Cosa Può Fare la `ServerCommandSource`? +### Cosa Può Fare la `ServerCommandSource`? {#what-can-the-servercommandsource-do} Una `ServerCommandSource` fornisce del contesto aggiuntivo dipendente dall'implementazione quando un comando viene eseguito. Questo include la possibilità di ottenere l'entità che ha eseguito il comando, il mondo in cui esso è stato eseguito o il server su cui è stato eseguito. @@ -92,7 +94,7 @@ Se vuoi, puoi anche assicurarti che un comando venga registrato solo sotto circo @[code lang=java highlight={2} transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -### Requisiti dei Comandi +### Requisiti dei Comandi {#command-requirements} Immagina di avere un comando e vuoi che solo gli operatori lo possano eseguire. Questo è dove il metodo `requires()` entra in gioco. Il metodo `requires()` ha un solo argomento `Predicate` che fornirà una `ServerCommandSource` con cui testare e determinare se la `CommandSource` può eseguire il comando. @@ -102,7 +104,7 @@ Questo comando verrà eseguito solo se la fonte del comando è un operatore di l Questo ha l'effetto collaterale di non mostrare il comando se si completa con tab a nessuno eccetto operatori di livello 2. Inoltre è il motivo per cui non puoi completare molti dei comandi con tab senza abilitare i comandi. -### Sotto Comandi +### Sotto Comandi {#sub-commands} Per aggiungere un sotto comando, devi registrare il primo nodo letterale del comando normalmente. Per avere un sotto comando, devi aggiungere il nodo letterale successivo al nodo esistente. @@ -112,13 +114,13 @@ Similarmente agli argomenti, i nodi dei sotto comandi possono anch'essi essere o @[code lang=java highlight={2,8} transcludeWith=:::8](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -## Comandi Lato Client +## Comandi Lato Client {#client-commands} L'API di Fabric ha un `ClientCommandManager` nel package `net.fabricmc.fabric.api.client.command.v2` che può essere usato per registrare comandi lato client. Il codice dovrebbe esistere solo nel codice lato client. @[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) -## Reindirizzare Comandi +## Reindirizzare Comandi {#command-redirects} I comandi reindirizzati - anche noti come alias - sono un modo di reindirizzare la funzionalità di un comando a un altro. Questo è utile quando vuoi cambiare il nome di un comando, ma vuoi comunque supportare il vecchio nome. @@ -126,9 +128,7 @@ I comandi reindirizzati - anche noti come alias - sono un modo di reindirizzare ## Domande Frequenti (FAQ) -
- -### Perché il Mio Codice Non Viene Compilato? +### Perché il Mio Codice Non Viene Compilato? {#why-does-my-code-not-compile} - Catturare o lanciare una `CommandSyntaxException` - `CommandSyntaxException` non è una `RuntimeException`. Se la lanci, dovresti farlo in metodi che lanciano una `CommandSyntaxException` nelle firme dei metodi, oppure dovresti catturarla. Brigadier gestirà le eccezioni controllate e ti inoltrerà il messaggio d'errore effettivo nel gioco. @@ -140,7 +140,7 @@ I comandi reindirizzati - anche noti come alias - sono un modo di reindirizzare - Un Command dovrebbe restituire un intero - Quando registri comandi, il metodo `executes()` accetta un oggetto `Command`, che è solitamente una lambda. La lambda dovrebbe restituire un intero, anziché altri tipi. -### Posso Registrare Comandi al Runtime? +### Posso Registrare Comandi al Runtime? {#can-i-register-commands-at-runtime} ::: warning You can do this, but it is not recommended. You would get the `CommandManager` from the server and add anything commands @@ -151,7 +151,7 @@ Dopo averlo fatto, devi nuovamente inviare l'albero di comandi a ogni giocatore Questo è necessario perché il client mantiene una cache locale dell'albero dei comandi che riceve durante il login (o quando i pacchetti per operatori vengono mandati) per suggerimenti locali e messaggi di errore ricchi. ::: -### Posso De-Registrare Comandi al Runtime? +### Posso De-Registrare Comandi al Runtime? {#can-i-unregister-commands-at-runtime} ::: warning You can also do this, however, it is much less stable than registering commands at runtime and could cause unwanted side diff --git a/translated/it_it/develop/commands/suggestions.md b/translated/it_it/develop/commands/suggestions.md index ba7c0de3f..cf1fab58f 100644 --- a/translated/it_it/develop/commands/suggestions.md +++ b/translated/it_it/develop/commands/suggestions.md @@ -5,7 +5,7 @@ authors: - IMB11 --- -# Suggerimenti dei Comandi +# Suggerimenti dei Comandi {#command-suggestions} Minecraft ha un potente sistema di suggerimento comandi che viene usato in molti posti, come nel comando `/give`. Questo sistema ti permette di suggerire valori per argomenti dei comandi all'utente, da cui possono poi selezionare - è un ottimo modo per rendere i tuoi comandi più user-friendly ed ergonomici. diff --git a/translated/it_it/develop/entities/damage-types.md b/translated/it_it/develop/entities/damage-types.md index fcde53532..a2a26a2ab 100644 --- a/translated/it_it/develop/entities/damage-types.md +++ b/translated/it_it/develop/entities/damage-types.md @@ -7,7 +7,7 @@ authors: - mattidragon --- -# Tipi di Danno +# Tipi di Danno {#damage-types} I tipi di danno definiscono tipi di danno che le entità possono subire. A partire da Minecraft 1.19.4, la creazione di nuovi tipi di danno è basata sui dati, per cui essi sono creati tramite file JSON. @@ -31,7 +31,7 @@ Affidati alla [Minecraft Wiki](https://minecraft.wiki/w/Damage_type#JSON_format) ::: -### Accedere ai Tipi di Danno Tramite Codice +### Tipi di Danno Accedere ai Tipi di Danno Tramite Codice Usare i Tipi di Danno Quando abbiamo bisogno di accedere al nostro tipo di danno personalizzato tramite codice, useremo la sua `RegistryKey` per costruire un'istanza di `DamageSource`. @@ -39,7 +39,7 @@ La `RegistryKey` può essere ottenuta nel modo seguente: @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/damage/FabricDocsReferenceDamageTypes.java) -### Usare i Tipi di Danno +### Usare i Tipi di Danno {#using-damage-types} Per mostrare l'utilizzo dei tipi di danno personalizzati, useremo un blocco personalizzato chiamato _Blocco di Tater_. Facciamo in modo che quando un'entità calpesta un _Blocco di Tater_, esso causa danno _Tater_. diff --git a/translated/it_it/develop/entities/effects.md b/translated/it_it/develop/entities/effects.md index c47299d21..498bb3853 100644 --- a/translated/it_it/develop/entities/effects.md +++ b/translated/it_it/develop/entities/effects.md @@ -34,11 +34,7 @@ Come nella registrazione di blocchi e oggetti, usiamo `Registry.register` per re @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/FabricDocsReferenceEffects.java) -### Traduzioni e Texture - -Puoi assegnare un nome al tuo effetto di stato e fornire un'icona che apparirà nello schermo dell'inventario del giocatore. - -#### **Texture** +### **Texture** L'icona dell'effetto è un PNG 18x18. Posiziona la tua icona personalizzata in: @@ -46,25 +42,24 @@ L'icona dell'effetto è un PNG 18x18. Posiziona la tua icona personalizzata in: resources/assets/fabric-docs-reference/textures/mob_effect/tater.png ``` -![Effetto nell'inventario del giocatore](/assets/develop/tater-effect.png) + -#### **Traduzioni** +### **Traduzioni** Come ogni altra traduzione, puoi aggiungere una voce con formato ID `"effect..": "Valore"` al file di lingua. -::: code-group - -```json[assets/fabric-docs-reference/lang/en_us.json] +```json { "effect.fabric-docs-reference.tater": "Tater" } ``` -### Fase di Test +### Fase di Test {#testing} Usa il comando `/effect give @p fabric-docs-reference:tater` per dare al giocatore il nostro effetto Tater. Usa `/effect clear @p fabric-docs-reference:tater` per rimuovere l'effetto. +:::info ::: info Per creare una pozione che usa questo effetto, per favore vedi la guida [Pozioni](../items/potions). ::: diff --git a/translated/it_it/develop/events.md b/translated/it_it/develop/events.md index 93a87e74a..9eebd7ee5 100644 --- a/translated/it_it/develop/events.md +++ b/translated/it_it/develop/events.md @@ -39,8 +39,6 @@ Tutti le interfacce callback degli eventi fornite dall'API di Fabric possono ess ## Ascoltare gli Eventi -### Un Semplice Esempio - Questo esempio registra un `AttackBlockCallback` per danneggiare il giocatore quando egli colpisce dei blocchi che non droppano un oggetto se rotti senza strumenti. @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/event/FabricDocsReferenceEvents.java) diff --git a/translated/it_it/develop/getting-started/introduction-to-fabric-and-modding.md b/translated/it_it/develop/getting-started/introduction-to-fabric-and-modding.md index 51643525f..ec5c16136 100644 --- a/translated/it_it/develop/getting-started/introduction-to-fabric-and-modding.md +++ b/translated/it_it/develop/getting-started/introduction-to-fabric-and-modding.md @@ -33,7 +33,7 @@ Prima di cominciare, chiariamo alcuni termini che incontrerai nel moddare con Fa - **Offuscamento**: Il processo di rendere il codice difficile da comprendere, usato da Mojang per proteggere il codice di Minecraft. - **Remapping**: Il processo di rimappare codice offuscato a codice leggibile. -## Cos'è Fabric? +## Cos'è Fabric? {#what-is-fabric} Fabric è una toolchain di modding leggera per Minecraft: Java Edition. @@ -46,7 +46,7 @@ Dovresti conoscere le quattro componenti principali di Fabric: - **API di Fabric**: Un insieme di API e di strumenti per sviluppatori di mod da usare quando si creano mod. - **Yarn**: Un insieme di mapping Minecraft aperti, gratuiti per tutti da usare sotto la licenza Creative Commons Zero. -## Perché È Necessario Fabric per Moddare Minecraft? +## Perché È Necessario Fabric per Moddare Minecraft? {#why-is-fabric-necessary-to-mod-minecraft} > Il modding è il processo di modifica del gioco per cambiarne il comportamento o per aggiungere nuove funzionalità - nel caso di Minecraft, questo può essere qualsiasi cosa dall'aggiungere nuovi oggetti, blocchi, o entità, al cambiare le meccaniche del gioco o aggiungere nuove modalità di gioco. @@ -56,7 +56,7 @@ Loom rimappa il codice offuscato a un formato leggibile usando questi mapping, r Loom ti permette di sviluppare e compilare mod facilmente in riferimento a codice rimappato, e il Loader di Fabric ti permette di caricare queste mod nel gioco. -## Cosa Fornisce l'API di Fabric, e Perché È Necessaria? +## Cosa Fornisce l'API di Fabric, e Perché È Necessaria? {#what-does-fabric-api-provide-and-why-is-it-needed} > L'API di Fabric è un insieme di API e di strumenti per sviluppatori di mod da usare quando si creano mod. diff --git a/translated/it_it/develop/getting-started/setting-up-a-development-environment.md b/translated/it_it/develop/getting-started/setting-up-a-development-environment.md index 15afef45f..44877445e 100644 --- a/translated/it_it/develop/getting-started/setting-up-a-development-environment.md +++ b/translated/it_it/develop/getting-started/setting-up-a-development-environment.md @@ -22,9 +22,9 @@ authors-nogithub: Per iniziare a sviluppare mod con Fabric, avrai bisogno d'impostare un ambiente di sviluppo usando IntelliJ IDEA. -## Installare JDK 17 +## Installare JDK 21 {#installing-jdk-21} -Per sviluppare mod per Minecraft 1.20.4, avrai bisogno del JDK 17. +Per sviluppare mod per Minecraft 1.21, avrai bisogno del JDK 21. Se ti serve aiuto nell'installare Java, puoi fare riferimento alle varie guide per installazione di Java nella [sezione guide per il giocatore](../../players/index). diff --git a/translated/it_it/develop/items/potions.md b/translated/it_it/develop/items/potions.md new file mode 100644 index 000000000..68f530ea3 --- /dev/null +++ b/translated/it_it/develop/items/potions.md @@ -0,0 +1,48 @@ +--- +title: Pozioni +description: Impara come aggiungere pozioni personalizzate per vari effetti di stato. +authors: + - dicedpixels + - PandoricaVi + - Drakonkinst +--- + +# Pozioni {#potions} + +Le pozioni sono oggetti consumabili che conferiscono un effetto a un'entità. Un giocatore può preparare delle pozioni usando l'Alambicco oppure ottenerle come oggetti attraverso varie meccaniche di gioco. + +## Pozioni Personalizzate {#custom-potions} + +Proprio come gli oggetti e i blocchi, le pozioni devono essere registrate. + +### Creare la Pozione {#creating-the-potion} + +Iniziamo dichiarando un attributo per conservare la tua istanza `Potion`. Useremo direttamente la classe dell'initializer per conservarla. + +@[code lang=java transclude={21-29}](@/reference/latest/src/main/java/com/example/docs/potion/FabricDocsReferencePotions.java) + +Passiamo una istanza di `StatusEffectInstance`, che prende 3 parametri: + +- `RegistryEntry type` - Un effetto. Qui usiamo il nostro effetto personalizzato. In alternativa puoi accedere agli effetti vanilla attraverso la classe vanilla `StatusEffects`. +- `int duration` - Durata dell'effetto espressa in tick di gioco. +- `int amplifier` - Un amplificatore per l'effetto. Per esempio, Sollecitudine II avrebbe un amplificatore di 1. + +:::info +Per creare il tuo effetto personalizzato per la pozione, per favore guarda la guida [Effetti](../entities/effects). +::: + +### Registrare la Pozione + +Nel nostro initializer, useremo l'evento `FabricBrewingRecipeRegistryBuilder.BUILD` per registrare la nostra pozione usando il metodo `BrewingRecipeRegistry.registerPotionRecipe`. + +@[code lang=java transclude={33-42}](@/reference/latest/src/main/java/com/example/docs/potion/FabricDocsReferencePotions.java) + +`registerPotionRecipe` prende 3 parametri: + +- `RegistryEntry input` - L'entry della registry della pozione iniziale. Solitamente questa può essere una Ampolla d'Acqua o una Pozione Strana. +- `Item item` - L'oggetto che rappresenta l'ingrediente principale della pozione. +- `RegistryEntry output` - L'entry della registry della pozione risultante. + +Una volta registrato, puoi distillare una pozione Tater usando una patata. + +![Effetto nell'inventario del giocatore](/assets/develop/tater-potion.png) diff --git a/translated/it_it/develop/rendering/basic-concepts.md b/translated/it_it/develop/rendering/basic-concepts.md new file mode 100644 index 000000000..8a1e135d2 --- /dev/null +++ b/translated/it_it/develop/rendering/basic-concepts.md @@ -0,0 +1,162 @@ +--- +title: Concetti Base del Rendering +description: Impara i concetti base del rendering usando il motore grafico di Minecraft. +authors: + - IMB11 + - "0x3C50" +--- + +# Concetti Base del Rendering + +::: warning +Although Minecraft is built using OpenGL, as of version 1.17+ you cannot use legacy OpenGL methods to render your own things. Instead, you must use the new `BufferBuilder` system, which formats rendering data and uploads it to OpenGL to draw. + +Per riassumere, devi usare il sistema di rendering di Minecraft, o crearne uno tuo che usa `GL.glDrawElements()`. +::: + +Questa pagina tratterà le basi del rendering usando il nuovo sistema, presentando terminologia e concetti chiave. + +Anche se molto del rendering in Minecraft viene astratto attraverso i vari metodi `DrawContext`, e probabilmente non ti servirà toccare nulla di quel che viene menzionato qui, è comunque importante capire le basi di come funziona il rendering. + +## Il `Tessellator` + +Il `Tessellator` è la principale classe usata per renderizzare le cose in Minecraft. È un singleton, cioè solo un'istanza è presente in gioco. Puoi ottenere l'istanza usando `Tessellator.getInstance()`. + +## Il `BufferBuilder` + +Il `BufferBuilder` è la classe usata per formattare e caricare i dati di rendering su OpenGL. Viene usata per creare un buffer, che viene caricato su OpenGL per essere disegnato. + +Il `Tessellator` viene usato per creare un `BufferBuilder`, che viene usato per formattare e caricare i dati di rendering su OpenGL. + +### Inizializzare il `BufferBuilder` + +Prima di poter scrivere al `BufferBuilder`, devi inizializzarlo. Questo viene fatto usando `Tessellator#begin(...)`, che prende un `VertexFormat` e una modalità di disegno e restituisce un `BufferBuilder`. + +#### Formati dei Vertici {#vertex-formats} + +Il `VertexFormat` definisce gli elementi che includiamo nel nostro buffer di dati e precisa come questi elementi debbano essere trasmessi a OpenGL. + +I seguenti elementi `VertexFormat` sono disponibili: + +| Elemento | Formato | +| --------------------------------------------- | --------------------------------------------------------------------------------------- | +| `BLIT_SCREEN` | `{ position (3 floats: x, y and z), uv (2 floats), color (4 ubytes) }` | +| `POSITION_COLOR_TEXTURE_LIGHT_NORMAL` | `{ position, color, texture uv, texture light (2 shorts), texture normal (3 sbytes) }` | +| `POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL` | `{ position, color, texture uv, overlay (2 shorts), texture light, normal (3 sbytes) }` | +| `POSITION_TEXTURE_COLOR_LIGHT` | `{ position, texture uv, color, texture light }` | +| `POSITION` | `{ position }` | +| `POSITION_COLOR` | `{ position, color }` | +| `LINES` | `{ position, color, normal }` | +| `POSITION_COLOR_LIGHT` | `{ position, color, light }` | +| `POSITION_TEXTURE` | `{ position, uv }` | +| `POSITION_COLOR_TEXTURE` | `{ position, color, uv }` | +| `POSITION_TEXTURE_COLOR` | `{ position, uv, color }` | +| `POSITION_COLOR_TEXTURE_LIGHT` | `{ position, color, uv, light }` | +| `POSITION_TEXTURE_LIGHT_COLOR` | `{ position, uv, light, color }` | +| `POSITION_TEXTURE_COLOR_NORMAL` | `{ position, uv, color, normal }` | + +#### Modalità di Disegno + +La modalità di disegno definisce come sono disegnati i dati. Sono disponibili le seguenti modalità di disegno: + +| Modalità di Disegno | Descrizione | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `DrawMode.LINES` | Ogni elemento è fatto da 2 vertici ed è rappresentato come una linea singola. | +| `DrawMode.LINE_STRIP` | Il primo elemento richiede 2 vertici. Elementi addizionali vengono disegnati con un solo nuovo vertice, creando una linea continua. | +| `DrawMode.DEBUG_LINES` | Simile a `DrawMode.LINES`, ma la linea è sempre esattamente larga un pixel sullo schermo. | +| `DrawMode.DEBUG_LINE_STRIP` | Come `DrawMode.LINE_STRIP`, ma le linee sono sempre larghe un pixel. | +| `DrawMode.TRIANGLES` | Ogni elemento è fatto da 3 vertici, formando un triangolo. | +| `DrawMode.TRIANGLE_STRIP` | Inizia con 3 vertici per il primo triangolo. Ogni vertice aggiuntivo forma un nuovo triangolo con gli ultimi due vertici. | +| `DrawMode.TRIANGLE_FAN` | Inizia con 3 vertici per il primo triangolo. Ogni vertice aggiuntivo forma un triangolo con il primo e l'ultimo vertice. | +| `DrawMode.QUADS` | Ogni elemento è fatto da 4 vertici, formando un quadrilatero. | + +### Scrivere al `BufferBuilder` + +Una volta che il `BufferBuilder` è inizializzato, puoi scriverci dei dati. + +Il `BufferBuilder` permette di costruire il nostro buffer, un vertice dopo l'altro. Per aggiungere un vertice, usiamo il metodo `buffer.vertex(matrix, float, float, float)`. Il parametro `matrix` è la matrice di trasformazione, che discuteremo più dettagliatamente in seguito. I tre parametri float rappresentano le coordinate (x, y, z) della posizione del vertice. + +Questo metodo restituisce un costruttore di vertice, che possiamo usare per specificare informazioni addizionali per il vertice. È cruciale seguire l'ordine del nostro `VertexFormat` definito quando aggiungiamo questa informazione. Se non lo facciamo, OpenGL potrebbe non interpretare i nostri dati correttamente. Dopo aver finito la costruzione di un vertice, se vuoi puoi continuare ad aggiungere altri vertici e dati al buffer. + +Importante è anche capire il concetto di culling. Il culling è il processo con cui si rimuovono facce di una forma 3D che non sono visibili dalla prospettiva dell'osservatore. Se i vertici per una faccia sono specificati nell'ordine sbagliato, la faccia potrebbe non essere renderizzata correttamente a causa del culling. + +#### Cos'è una Matrice di Trasformazione? Formati di Vertici + +Una matrice di trasformazione è una matrice 4x4 che viene usata per trasformare un vettore. In Minecraft, la matrice di trasformazione sta solo trasformando le coordinate che diamo nella chiamata del vertice. Le trasformazioni possono scalare il nostro modello, muoverlo e ruotarlo. + +A volte viene chiamata anche matrice di posizione, o matrice modello. + +Solitamente è ottenuta dalla classe `MatrixStack`, che può essere ottenuta attraverso l'oggetto `DrawContext`: + +```java +drawContext.getMatrices().peek().getPositionMatrix(); +``` + +#### Un Esempio Pratico: Renderizzare una Striscia di Triangoli + +Spiegare come scrivere al `BufferBuilder` è più semplice con un esempio pratico. Immaginiamo di voler renderizzare qualcosa usando la modalità di disegno `DrawMode.TRIANGLE_STRIP` e il formato vertice `POSITION_COLOR`. + +Disegneremo vertici nelle seguenti posizioni sul HUD (in ordine): + +```txt +(20, 20) +(5, 40) +(35, 40) +(20, 60) +``` + +Questo dovrebbe darci un diamante carino - siccome stiamo usando la modalità di disegno `TRIANGLE_STRIP`, il renderizzatore eseguirà i seguenti passaggi: + +![Quattro passaggi che mostrano il posizionamento dei vertici sullo schermo per formare due triangoli](/assets/develop/rendering/concepts-practical-example-draw-process.png) + +Siccome stiamo disegnando sulla HUD in questo esempio, useremo l'evento `HudRenderCallback`: + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +Questo risulta nel seguente disegno sul HUD: + +![Risultato Finale](/assets/develop/rendering/concepts-practical-example-final-result.png) + +:::tip +Prova a giocare coi colori e le posizioni dei vertici per vedere che succede! Puoi anche provare a usare modalità di disegno e formati vertice differenti. +::: + +## La `MatrixStack` + +Dopo aver imparato come scrivere al `BufferBuilder`, ti starai chiedendo come trasformare il tuo modello - anche animarlo magari. Qui è dove entra in gioco la classe `MatrixStack`. + +La classe `MatrixStack` ha i seguenti metodi: + +- `push()` - Spinge una nuova matrice sullo stack. +- `pop()` - Elimina la matrice in cima allo stack. +- `peek()` - Restituisce la matrice in cima allo stack. +- `translate(x, y, z)` - Trasla la matrice in cima allo stack. +- `scale(x, y, z)` - Scala la matrice in cima allo stack. + +Puoi anche moltiplicare la matrice in cima allo stack usando i quaternioni, che tratteremo nella prossima sezione. + +Usando l'esempio di prima, possiamo ingrandire e rimpicciolire il nostro diamante usando la `MatrixStack` e il `tickDelta` - che è il tempo passato dall'ultimo frame. + +::: warning +You must first push the matrix stack and then pop it after you're done with it. If you don't, you'll end up with a broken matrix stack, which will cause rendering issues. + +Assicurati di spingere lo stack di matrici prima di prendere una matrice di trasformazione! +::: + +@[code lang=java transcludeWith=:::2](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +![Un video che mostra il diamante ingrandito e rimpicciolito](/assets/develop/rendering/concepts-matrix-stack.webp) + +## Quaternioni (Cose che Ruotano) + +I quaternioni sono un modo di rappresentare rotazioni in uno spazio 3D. Vengono usate per ruotare la matrice in cima al `MatrixStack` usando il metodo `multiply(Quaternion, x, y, z)`. + +Difficilmente dovrai usare una classe Quaternion direttamente, siccome Minecraft fornisce varie istanze Quaternion pre-costruite nella sua classe di utilità `RotationAxis`. + +Immaginiamo di voler ruotare il nostro diamante attorno all'asse z. Possiamo farlo usando il `MatrixStack` e il metodo `multiply(Quaternion, x, y, z)`. + +@[code lang=java transcludeWith=:::3](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +Il risultato è il seguente: + +![Un video che mostra il diamante che ruota attorno all'asse z](/assets/develop/rendering/concepts-quaternions.webp) diff --git a/translated/it_it/develop/rendering/draw-context.md b/translated/it_it/develop/rendering/draw-context.md index 42f94246b..1f0f36e64 100644 --- a/translated/it_it/develop/rendering/draw-context.md +++ b/translated/it_it/develop/rendering/draw-context.md @@ -39,7 +39,7 @@ Possiamo usare i metodi `DrawContext.drawHorizontalLine(...)` e `DrawContext.dra ![Linee](/assets/develop/rendering/draw-context-lines.png) -## Il Gestore di Tagli +## Il Gestore di Tagli {#the-scissor-manager} La classe `DrawContext` ha un gestore di tagli predefinito. Questo ti permette di ritagliare il rendering a un'area specifica. Questo è utile per renderizzare cose come consigli, o altri elementi che non dovrebbero essere renderizzati al di fuori di un'area specifica. diff --git a/translated/it_it/develop/rendering/hud.md b/translated/it_it/develop/rendering/hud.md new file mode 100644 index 000000000..7f73672ef --- /dev/null +++ b/translated/it_it/develop/rendering/hud.md @@ -0,0 +1,30 @@ +--- +title: Rendering nel Hud +description: Impara a usare l'evento HudRenderCallback per renderizzare sul hud. +authors: + - IMB11 +--- + +# Rendering nel Hud + +Abbiamo già parlato brevemente di come renderizzare cose sulla Hud nelle pagine [Concetti di Rendering di Base](./basic-concepts) e [Usare il Drawing Context](./draw-context), per cui in questa pagina ci concentreremo sull'evento `HudRenderCallback` e sul parametro `deltaTick`. + +## HudRenderCallback + +L'evento `HudRenderCallback` - fornito dall'API di Fabric - viene chiamato ogni frame, e viene usato per renderizzare cose sul HUD. + +Per registrarsi a questo evento, puoi semplicemente chiamare `HudRenderCallback.EVENT.register` e passare una lambda che prende come parametri un `DrawContext` e un `float` (deltaTick). + +Il contesto di disegno può essere usato per accedere a varie utilità di rendering fornite dal gioco, e per accedere allo stack di matrici puro. + +Dovresti dare un'occhiata alla pagina [Usare il Contesto di Disegno](./draw-context) per saperne di più riguardo al contesto di disegno. + +### DeltaTick + +Il `deltaTick` è il tempo trascorso dall'ultimo frame, in secondi. Questo può essere usato per fare animazioni e altri effetti basati sul tempo. + +Per esempio, immagina di voler interpolare linearmente un colore nel tempo. Puoi usare il `deltaTickManager` per ottenere il deltaTick, e memorizzarlo nel tempo per interpolare il colore: + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/HudRenderingEntrypoint.java) + +![Interpolare un colore nel tempo](/assets/develop/rendering/hud-rendering-deltatick.webp) diff --git a/translated/it_it/develop/rendering/particles/creating-particles.md b/translated/it_it/develop/rendering/particles/creating-particles.md index 9afde755f..4e4d395b0 100644 --- a/translated/it_it/develop/rendering/particles/creating-particles.md +++ b/translated/it_it/develop/rendering/particles/creating-particles.md @@ -5,7 +5,7 @@ authors: - Superkat32 --- -# Creare Particelle Personalizzate +# Creare Particelle Personalizzate {#creating-custom-particles} Le particelle sono uno strumento potente. Possono aggiungere atmosfera a una bella scena, o aggiungere tensione durante una battaglia contro il boss. Aggiungiamone una! @@ -32,7 +32,7 @@ You can see all the particle factories by looking at all the implementations of - Combinazione per IntelliJ: Ctrl+Alt+B - Combinazione per Visual Studio Code: Ctrl+F12 -::: + ::: ## Creare un file JSON e aggiungere le texture diff --git a/translated/it_it/develop/sounds/custom.md b/translated/it_it/develop/sounds/custom.md index ea95c6dbd..d8789ca84 100644 --- a/translated/it_it/develop/sounds/custom.md +++ b/translated/it_it/develop/sounds/custom.md @@ -46,7 +46,7 @@ Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle" SoundEvent.of(new Identifier(MOD_ID, "metal_whistle"))); ``` -## Ripulire il Disordine +## Ripulire il Disordine {#cleaning-up-the-mess} A seconda di quante voci ci sono nella Registry, le cose potrebbero presto sfuggire di mano. Per evitare che ciò accada, possiamo fare uso di una nuova classe di supporto. diff --git a/translated/it_it/develop/sounds/using-sounds.md b/translated/it_it/develop/sounds/using-sounds.md index 20a56ceb0..78981450f 100644 --- a/translated/it_it/develop/sounds/using-sounds.md +++ b/translated/it_it/develop/sounds/using-sounds.md @@ -3,7 +3,7 @@ title: Riprodurre Suoni description: Impara come riprodurre eventi sonori. --- -# Riprodurre Suoni +# Riprodurre Suoni {#playing-sounds} Minecraft ha una grande selezione di suoni da cui puoi scegliere. Controlla la classe `SoundEvents` per vedere tutte le istanze di eventi sonori vanilla che Mojang ha predisposto. diff --git a/translated/it_it/index.md b/translated/it_it/index.md index da56364ce..c3dcb8f9f 100644 --- a/translated/it_it/index.md +++ b/translated/it_it/index.md @@ -20,7 +20,7 @@ features:
-## Vuoi Contribuire? +## Vuoi Contribuire? {#contribute} Se vuoi contribuire alla Documentazione di Fabric, puoi trovare il codice sorgente su [GitHub](https://github.com/FabricMC/fabric-docs), e le corrispondenti [linee guida per la contribuzione](./contributing). diff --git a/translated/it_it/players/faq.md b/translated/it_it/players/faq.md index 5802e7bc5..2c2d05928 100644 --- a/translated/it_it/players/faq.md +++ b/translated/it_it/players/faq.md @@ -7,25 +7,23 @@ description: Domande frequenti riguardanti Fabric per giocatori e admin di serve Ci sono molte domande che vengono poste di frequente, quindi ne abbiamo compilato una lista qui. -## Domande Generali - -### Quali Versioni di Minecraft Supporta Fabric? +## Quali Versioni di Minecraft Supporta Fabric? Domande Generali Ufficialmente, Fabric supporta tutte le versioni di Minecraft a partire da snapshot `18w43b` e seguenti, e dalla release `1.14` e superiori. -### Dove Posso Scaricare le Mod Fabric Pubblicate? +## Dove Posso Scaricare le Mod Fabric Pubblicate? {#where-can-i-download-published-fabric-mods} :::info Dovresti sempre controllare che le mod provengano da una fonte affidabile. Dai un occhiata alla guida [Trovare Mod Affidabili](./finding-mods) per più informazioni. ::: -La maggior parte degli autori pubblica le loro mod su [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) e [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods&gameVersionTypeId=4), anche se altri potrebbero aver deciso di caricarle sui loro siti personali o su altre piattaforme come le repository di GitHub. +La maggior parte degli autori pubblica le loro mod su [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) e [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods\&gameVersionTypeId=4), anche se altri potrebbero aver deciso di caricarle sui loro siti personali o su altre piattaforme come le repository di GitHub. -### Dove Posso Trovare Modpack Fabric Prefabbricati? +## Dove Posso Trovare Modpack Fabric Prefabbricati? {#where-can-i-find-premade-fabric-modpacks} Puoi trovare modpack Fabric prefabbricati su varie piattaforme, come: - [Modrinth](https://modrinth.com/modpacks?g=categories:%27fabric%27) -- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks&gameVersionTypeId=4) +- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks\&gameVersionTypeId=4) - [Feed The Beast](https://www.feed-the-beast.com/ftb-app) - [Technic](https://www.technicpack.net/modpacks) diff --git a/translated/it_it/players/finding-mods.md b/translated/it_it/players/finding-mods.md index b03f13fb7..b221d814a 100644 --- a/translated/it_it/players/finding-mods.md +++ b/translated/it_it/players/finding-mods.md @@ -9,19 +9,19 @@ authors: Anzitutto, la fiducia è soggettiva, e dovresti sempre affidarti al tuo giudizio quando scarichi mod. Tuttavia, ci sono alcune cose che puoi fare che ti aiutano a trovare mod affidabili. -## 1. Usa una Fonte Nota per Essere Affidabile +## 1. Usa una Fonte Nota per Essere Affidabile {#trustworthy-source} -La maggior parte degli autori pubblica le loro mod su [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) e [CurseForge](https://www.curseforge.com/minecraft/search?page=1&pageSize=20&sortType=1&class=mc-mods&gameFlavorsIds=4). +La maggior parte degli autori pubblica le loro mod su [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) e [CurseForge](https://www.curseforge.com/minecraft/search?page=1\&pageSize=20\&sortType=1\&class=mc-mods\&gameFlavorsIds=4). Questi siti controllano che le mod siano quello che dicono di essere, e che non contengano codice maligno. Puoi anche segnalare mod sospette su quei siti, ed essi agiranno in modo relativamente veloce. -## 2. Controlla con gli Altri! +## 2. Controlla con gli Altri! {#with-others} Se stai scaricando una mod da una fonte che non è nota per essere affidabile, dovresti controllare con gli altri per vedere se loro l'hanno scaricata prima dalla posizione da cui la stai scaricando tu, e se hanno avuto problemi con essa. Se hai dubbi, sentiti libero di chiedere nel [Discord di Fabric](https://discord.gg/v6v4pMv) nel canale `#player-support`. -## 3. Evita Siti Comuni Maligni! +## 3. Evita Siti Comuni Maligni! {#avoid-malware} :::info I siti maligni potrebbero non essere ovvi per tutti. Se non sei sicuro, dovresti chiedere l'opinione di altri o evitare il sito completamente e affidarti solo a fonti fidate, come Modrinth e CurseForge. diff --git a/translated/it_it/players/installing-fabric.md b/translated/it_it/players/installing-fabric.md index f67aaac73..25e60c74e 100644 --- a/translated/it_it/players/installing-fabric.md +++ b/translated/it_it/players/installing-fabric.md @@ -3,6 +3,8 @@ title: Installare Fabric description: Una guida passo per passo su come installare Fabric. authors: - IMB11 + - Benonardo + - modmuss50 --- # Installare Fabric @@ -42,14 +44,12 @@ Per installare Fabric, semplicemente scegli la versione di gioco dal menu a tend **Assicurati che `Crea Profilo` sia selezionato.** -## 3. Hai Finito! +## 3. Hai Finito! {#3-you-re-done} Una volta che l'installer ha finito, puoi aprire il Launcher di Minecraft e selezionare il profilo Fabric dal menu a tendina in basso a sinistra e premere Gioca! ![Launcher di Minecraft con il profilo Fabric selezionato](/assets/players/installing-fabric/launcher-screen.png) -## Prossimi Passi - Ora che hai installato Fabric, puoi aggiungere le mod al tuo gioco! Dai un occhiata alla guida [Trovare Mod Affidabili](./finding-mods) per più informazioni. Se incontri dei problemi seguendo questa guida, puoi chiedere aiuto nel [Discord di Fabric](https://discord.gg/v6v4pMv) nel canale `#player-support`. diff --git a/translated/it_it/players/installing-java/linux.md b/translated/it_it/players/installing-java/linux.md index c18fd5d16..3e81421a1 100644 --- a/translated/it_it/players/installing-java/linux.md +++ b/translated/it_it/players/installing-java/linux.md @@ -7,7 +7,7 @@ authors: # Installare Java su Linux -Questa guida ti spiegherà come installare Java 17 su Linux. +Questa guida ti spiegherà come installare Java 21 su Linux. ## 1. Controlla se Java è già installato @@ -16,12 +16,12 @@ Apri un terminale, scrivi `java -version` e premi Invio. ![Terminale con scritto "java -version"](/assets/players/installing-java/linux-java-version.png) :::warning -Per usare la maggior parte delle versioni moderne di Minecraft, ti servirà almeno Java 17 installato. Se questo comando mostra una versione inferiore a 17, allora dovrai aggiornare la versione di Java già esistente. +Per usare Minecraft 1.21, ti servirà almeno Java 21 installato. Se questo comando mostra una versione inferiore a 21, allora dovrai aggiornare la versione di Java già esistente. ::: -## 2. Scaricare e Installare Java 17 +## 2. Scaricare e Installare Java 21 {#2-downloading-and-installing-java} -Raccomandiamo l'uso di OpenJDK 17, che è disponibile per la maggior parte delle distribuzioni Linux. +Raccomandiamo l'uso di OpenJDK 21, che è disponibile per la maggior parte delle distribuzioni Linux. ### Arch Linux @@ -49,31 +49,31 @@ sudo pacman -S jdk-openjdk ### Debian/Ubuntu -Puoi installare Java 17 usando `apt` con i comandi seguenti: +Puoi installare Java 21 usando `apt` con i comandi seguenti: ```sh sudo apt update -sudo apt install openjdk-17-jdk +sudo apt install openjdk-21-jdk ``` ### Fedora -Puoi installare Java 17 usando `dnf` con i comandi seguenti: +Puoi installare Java 21 usando `dnf` con i comandi seguenti: ```sh -sudo dnf install java-17-openjdk +sudo dnf install java-21-openjdk ``` Se non hai bisogno di un'interfaccia grafica, puoi installare la versione headless: ```sh -sudo dnf install java-17-openjdk-headless +sudo dnf install java-21-openjdk-headless ``` Se pensi di sviluppare delle mod, ti servirà invece il JDK: ```sh -sudo dnf install java-17-openjdk-devel +sudo dnf install java-21-openjdk-devel ``` ### Altre Distribuzioni Linux @@ -82,9 +82,9 @@ Se la tua distribuzione non è fra quelle elencate sopra, puoi scaricare il JRE Dovresti fare riferimento a una guida alternativa per la tua distribuzione se vuoi sviluppare delle mod. -## 3. Verifica che Java 17 Sia Installato +## 3. Verifica che Java 21 Sia Installato {#3-verify-that-java-is-installed} -Quando l'installazione è stata completata, puoi verificare che Java 17 sia installato aprendo il terminale e scrivendo `java -version`. +Quando l'installazione è stata completata, puoi verificare che Java 21 sia installato aprendo il terminale e scrivendo `java -version`. Se il comando funziona correttamente, vedrai qualcosa simile a quello mostrato prima, dove è mostrata la versione di Java: diff --git a/translated/it_it/players/installing-java/windows.md b/translated/it_it/players/installing-java/windows.md index 60a77b7c7..4d589cac3 100644 --- a/translated/it_it/players/installing-java/windows.md +++ b/translated/it_it/players/installing-java/windows.md @@ -7,7 +7,7 @@ authors: # Installare Java su Windows -Questa guida ti spiegherà come installare Java 17 su Windows. +Questa guida ti spiegherà come installare Java 21 su Windows. Il Launcher di Minecraft ha la sua versione di Java installata, quindi questa sezione è rilevante solo se vuoi usare l'installer `.jar` di Fabric, oppure se vuoi usare il `.jar` del Server di Minecraft. @@ -26,12 +26,12 @@ Se il comando funziona correttamente, vedrai qualcosa come questo. Se il comando ![Il prompt dei comandi con scritto "java -version"](/assets/players/installing-java/windows-java-version.png) :::warning -Per usare la maggior parte delle versioni moderne di Minecraft, ti servirà almeno Java 17 installato. Se questo comando mostra una versione inferiore a 17, allora dovrai aggiornare la versione di Java già esistente. +Per usare Minecraft 1.21, ti servirà almeno Java 21 installato. Se questo comando mostra una versione inferiore a 21, allora dovrai aggiornare la versione di Java già esistente. ::: -## 2. Scarica l'Installer per Java 17 +## 2. Scarica l'Installer per Java 21 {#2-download-the-java-installer} -Per installare Java 17, dovrai scaricare l'installer da [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows&package=jdk&version=17). +Per installare Java 21, dovrai scaricare l'installer da [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows\&package=jdk\&version=21). Dovrai scaricare la versione `Windows Installer (.msi)`: @@ -41,20 +41,20 @@ Dovresti scegliere `x86` se il tuo sistema operativo è a 32-bit, oppure `x64` s La maggior parte dei computer moderni ha un sistema operativo a 64-bit. Se non sei sicuro, prova a usare il download 64-bit. -## 3. Esegui l'Installer! +## 3. Esegui l'Installer! {#3-run-the-installer} -Segui le istruzioni per installare Java 17. Quando arrivi a questa pagina, dovresti selezionare "L'intera funzionalità verrà installata sul disco rigido locale" per le seguenti funzionalità: +Segui le istruzioni per installare Java 21. Quando arrivi a questa pagina, dovresti selezionare "L'intera funzionalità verrà installata sul disco rigido locale" per le seguenti funzionalità: - `Imposta JAVA_HOME come variabile d'ambiente` - Questo verrà aggiunto al tuo PATH. - `JavaSoft (Oracle) registry keys` -![Installer Java 17 con "Set JAVA_HOME variable" e "JavaSoft (Oracle) registry keys" evidenziati](/assets/players/installing-java/windows-wizard-screenshot.png) +![Installer Java 21 con "Set JAVA\_HOME variable" e "JavaSoft (Oracle) registry keys" evidenziati](/assets/players/installing-java/windows-wizard-screenshot.png) Quando hai finito, puoi cliccare su `Avanti` e continuare con l'installazione. -## 4. Verifica che Java 17 Sia Installato +## 4. Verifica che Java 21 Sia Installato {#4-verify-that-java-is-installed} -Quando l'installazione è stata completata, puoi verificare che Java 17 è installato aprendo il prompt dei comandi e scrivendo `java -version`. +Quando l'installazione è stata completata, puoi verificare che Java 21 è installato aprendo il prompt dei comandi e scrivendo `java -version`. Se il comando funziona correttamente, vedrai qualcosa simile a quello mostrato prima, dove è mostrata la versione di Java: diff --git a/translated/it_it/players/installing-mods.md b/translated/it_it/players/installing-mods.md index 3eda77a1a..4b9b2b48e 100644 --- a/translated/it_it/players/installing-mods.md +++ b/translated/it_it/players/installing-mods.md @@ -51,7 +51,7 @@ Una volta che hai trovato la cartella `mods`, puoi muovere i file `.jar` della m ![Mod installate nella cartella mods](/assets/players/installing-mods.png) -## 3. Hai Finito! +## 3. Hai Finito! {#3-you-re-done} Una volta che hai spostato le mod nella cartella `mods`, puoi aprire il Launcher di Minecraft e selezionare il profilo Fabric dal menu a tendina nell'angolo in basso a sinistra e premere gioca! diff --git a/translated/it_it/players/troubleshooting/crash-reports.md b/translated/it_it/players/troubleshooting/crash-reports.md index 1ab6414ea..22323c641 100644 --- a/translated/it_it/players/troubleshooting/crash-reports.md +++ b/translated/it_it/players/troubleshooting/crash-reports.md @@ -5,7 +5,7 @@ authors: - IMB11 --- -# Segnalazioni dei Crash +# Segnalazioni dei Crash {#crash-reports} :::tip Se hai difficoltà nel trovare la causa del crash, puoi chiedere aiuto nel [Discord di Fabric](https://discord.gg/v6v4pMv) nei canali `#player-support` o `#server-admin-support`. @@ -43,6 +43,17 @@ Le segnalazioni di crash sono molto lunghe, e possono causare confusione nella l Per questa guida, useremo [questa segnalazione di crash come esempio](https://github.com/FabricMC/fabric-docs/blob/main/public/assets/players/crash-report-example.txt). +:::details Segnalazioni dei Crash + +at snownee.snow.block.ShapeCaches.get(ShapeCaches.java:51) +at snownee.snow.block.SnowWallBlock.method_9549(SnowWallBlock.java:26) // [!code focus] +... +at me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache.shouldDrawSide(BlockOcclusionCache.java:52) +at link.infra.indium.renderer.render.TerrainBlockRenderInfo.shouldDrawFaceInner(TerrainBlockRenderInfo.java:31) +... + +::: + ### Sezioni della Segnalazione di Crash Le segnalazioni di crash consistono di varie sezioni, ciascuna separata con un'intestazione: @@ -62,14 +73,9 @@ Lo stack trace nella sezione `---- Minecraft Crash Report ----` è il più impor Con la quantità di mod menzionata nello stack trace, può essere difficile puntare il dito, ma la prima cosa da fare è cercare la mod che ha causato il crash. -```:no-line-numbers -at snownee.snow.block.ShapeCaches.get(ShapeCaches.java:51) -at snownee.snow.block.SnowWallBlock.method_9549(SnowWallBlock.java:26) // [!code focus] -... -at me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache.shouldDrawSide(BlockOcclusionCache.java:52) -at link.infra.indium.renderer.render.TerrainBlockRenderInfo.shouldDrawFaceInner(TerrainBlockRenderInfo.java:31) -... -``` + + +<<< @/public/assets/players/crash-report-example.txt{8-9,14-15 log} In questo caso, la mod che ha causato il crash è `snownee`, poiché è la prima mod menzionata nello stack trace. @@ -100,5 +106,5 @@ Questo permetterà all'autore della mod d'investigare il crash, potenzialmente d Paste site comuni usati frequentemente per le segnalazioni di crash sono: - [GitHub Gist](https://gist.github.com/) -- [Pastebin](https://pastebin.com/) - [mclo.gs](https://mclo.gs/) +- [Pastebin](https://pastebin.com/) diff --git a/translated/it_it/players/troubleshooting/uploading-logs.md b/translated/it_it/players/troubleshooting/uploading-logs.md index 7694b10b4..1e610e42f 100644 --- a/translated/it_it/players/troubleshooting/uploading-logs.md +++ b/translated/it_it/players/troubleshooting/uploading-logs.md @@ -5,11 +5,11 @@ authors: - IMB11 --- -# Caricare i Log +# Caricare i Log {#uploading-logs} Quando stai tentando di risolvere problemi, spesso è necessario fornire i log per aiutare a identificare la causa del problema. -## Perché Dovrei Caricare i Log? +## Perché Dovrei Caricare i Log? {#why-should-i-upload-logs} Caricare i log permette agli altri di aiutarti a risolvere i tuoi problemi molto più velocemente che non semplicemente incollare i log in una chat o in un post su un forum. Ti permette anche di condividere i tuoi log con altri senza doverli copiare e incollare. @@ -45,7 +45,7 @@ I log sono posizionati nella cartella `logs` della directory del gioco, la direc Il log più recente si chiama `latest.log`, e log precedenti usano lo schema di denominazione `aaaa-mm-gg_numero.log.gz`. -## Caricare i Log +## Caricare i Log Online {#uploading-logs-online} I log possono essere caricati su vari servizi, come: diff --git a/translated/it_it/players/updating-fabric.md b/translated/it_it/players/updating-fabric.md index 40cd02233..8af0f0319 100644 --- a/translated/it_it/players/updating-fabric.md +++ b/translated/it_it/players/updating-fabric.md @@ -14,7 +14,7 @@ Per launcher di terze parti, dovresti consultare la loro documentazione. Aggiornare Fabric è un processo molto simile all'installazione di Fabric, per cui alcune parti di questa guida saranno uguali a quelle della guida [Installare Fabric](./installing-fabric). -## Perché Dovrei Aggiornare il Loader di Fabric? +## Perché Dovrei Aggiornare il Loader di Fabric? {#why-should-i-update-fabric-loader} Mod più recenti potrebbero richiedere una versione più moderna del Loader di Fabric per funzionare, quindi è importante tenerlo aggiornato per assicurarti di poter usare le mod più recenti. @@ -24,7 +24,9 @@ Mod più recenti potrebbero richiedere una versione più moderna del Loader di F Per aggiornare Fabric, assicurati semplicemente che la versione del gioco e quella del Loader siano corrette poi clicca `Installa`. +:::important **Assicurati di deselezionare 'Crea Profilo' quando esegui l'installer, altrimenti creerà un nuovo profilo, che in questo caso non ci serve.** +::: ## 3. Apri il Profilo nel Launcher di Minecraft @@ -34,7 +36,7 @@ Sostituisci la versione con la nuova versione del Loader di Fabric che hai appen ![Aggiornare la versione del Loader di Fabric nel Launcher di Minecraft](/assets/players/updating-fabric.png) -## 4. Hai Finito! +## 4. Hai Finito! {#4-you-re-done} Appena avrai completato i passaggi potrai tornare alla scheda `Gioca`, selezionare il profilo Fabric dal menu a tendina nell'angolo in basso a sinistra e premere gioca! diff --git a/translated/it_it/sidebar_translations.json b/translated/it_it/sidebar_translations.json index 52659aad6..91fb5479f 100644 --- a/translated/it_it/sidebar_translations.json +++ b/translated/it_it/sidebar_translations.json @@ -20,7 +20,16 @@ "develop.gettingStarted.projectStructure": "Struttura del Progetto", "develop.gettingStarted.launchGame": "Avviare il Gioco", "develop.items": "Oggetti", + "develop.items.first-item": "Creare il Tuo Primo Oggetto", + "develop.items.food": "Alimenti", + "develop.items.custom-armor": "Armature Personalizzate", + "develop.items.custom-tools": "Utensili Personalizzati", + "develop.items.custom-item-groups": "Gruppi di Oggetti Personalizzati", + "develop.items.custom-item-interactions": "Interazioni tra Oggetti Personalizzate", "develop.items.potions": "Pozioni", + "develop.blocks": "Blocchi", + "develop.blocks.first-block": "Creare il Tuo Primo Blocco", + "develop.blocks.blockstates": "Stati di un Blocco", "develop.entities": "Entità", "develop.entities.effects": "Effetti di Stato", "develop.entities.damage-types": "Tipi di Danno", @@ -40,6 +49,7 @@ "develop.misc": "Pagine Varie", "develop.misc.codecs": "Codec", "develop.misc.events": "Eventi", + "develop.misc.text-and-translations": "Testo e Traduzioni", "develop.sounds": "Suoni", "develop.sounds.using-sounds": "Riprodurre Suoni", "develop.sounds.custom": "Creare Suoni Personalizzati" diff --git a/translated/ko_kr/index.md b/translated/ko_kr/index.md index b107ef1eb..4762b771a 100644 --- a/translated/ko_kr/index.md +++ b/translated/ko_kr/index.md @@ -20,7 +20,7 @@ features:
-## 이 프로젝트에 기여하고 싶으신가요? +## 이 프로젝트에 기여하고 싶으신가요? {#contribute} Fabric 문서에 기여하고 싶다면, [GitHub](https://github.com/FabricMC/fabric-docs)에서 소스 코드를 볼 수 있으며, 기여시에는 [기여 가이드라인](./contributing)을 준수하시기 바랍니다. diff --git a/translated/ko_kr/players/faq.md b/translated/ko_kr/players/faq.md index 22e4f7ca0..6fd1ba9ba 100644 --- a/translated/ko_kr/players/faq.md +++ b/translated/ko_kr/players/faq.md @@ -7,25 +7,23 @@ description: Fabric 관련 서버 관리자와 플레이어가 자주 묻는 질 자주 언급되는 질문이 여럿 있으므로, 아래에 간단히 정리했습니다. -## 일반적인 질문 - -### Fabric이 지원하는 Minecraft 버전은 무엇인가요? +## Fabric이 지원하는 Minecraft 버전은 무엇인가요? 일반적인 질문 공식적으로, Fabric은 스냅숏 `18w43b` (`1.14` 이상) 의 모든 버전을 지원합니다. -### 어디서 Fabric 모드를 다운로드 할 수 있나요? +## 어디서 Fabric 모드를 다운로드 할 수 있나요? {#where-can-i-download-published-fabric-mods} :::info 항상 모드를 다운로드한 사이트가 안전한지 확인하세요. [안전한 모드 찾기](./finding-mods) 에서 더 많은 정보를 확인할 수 있습니다. ::: -대부분의 모드 개발자는 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 또는 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods&gameVersionTypeId=4) 에 모드를 업로드 합니다. +대부분의 모드 개발자는 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 또는 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods\&gameVersionTypeId=4) 에 모드를 업로드 합니다. -### 먼저 생성된 Fabric 모드팩은 어디에서 찾을 수 있나요? +## 먼저 생성된 Fabric 모드팩은 어디에서 찾을 수 있나요? {#where-can-i-find-premade-fabric-modpacks} Fabric 모드팩은 다음과 같이 여러 플랫폼에서 찾을 수 있습니다. - [Modrinth](https://modrinth.com/modpacks?g=categories:%27fabric%27) -- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks&gameVersionTypeId=4) +- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks\\&gameVersionTypeId=4) - [Feed The Beast](https://www.feed-the-beast.com/ftb-app) - [Technic](https://www.technicpack.net/modpacks) diff --git a/translated/ko_kr/website_translations.json b/translated/ko_kr/website_translations.json new file mode 100644 index 000000000..f1c26f94a --- /dev/null +++ b/translated/ko_kr/website_translations.json @@ -0,0 +1,46 @@ +{ + "authors.heading": "페이 작성자", + "authors.nogithub": "%s (Github에 없음)", + "banner": "Fabric 문서화가 진행 중입니다. %s 또는 %s에 이슈를 보고하십시오.", + "description": "마인크래프트를 위한 모딩 툴체인, Fabric을 위한 포괄적인 문서입니다.", + "footer.next": "다음 페이지", + "footer.prev": "이전 페이지", + "github_edit": "GitHub에서 이 페이지 편집", + "lang_switcher": "언어 변경", + "last_updated": "마지막 업데이트", + "mode_dark": "다크 모드로 전환", + "mode_light": "라이트 모드로 전환", + "mode_switcher": "외관", + "nav.contribute": "기여하기", + "nav.contribute.api": "Fabric API", + "nav.download": "다운로드", + "nav.home": "메인", + "outline": "이 페이지에서", + "return_to_top": "맨 위로 돌아가기", + "search.back": "검색 닫기", + "search.button": "검색", + "search.display_details": "상세목록표시", + "search.footer.close": "으로 닫기", + "search.footer.close.key": "Esc 키", + "search.footer.down.key": "아래 방향키", + "search.footer.navigate": "으로 탐색", + "search.footer.up.key": "위 방향키", + "search.footer.select": "으로 선택", + "search.footer.select.key": "엔터 키", + "search.no_results": "다음에 대한 검색 결과가 존재하지 않습니다.", + "search.reset": "검색 초기화", + "sidebar_menu": "메뉴", + "social.discord": "Discord", + "social.github": "GitHub", + "title": "Fabric 문서", + "version_switcher": "버전 선택", + "404.code": "404", + "404.crowdin_link": "Crowdin에서 번역하기", + "404.crowdin_link.label": "Crowdin 편집기 열기", + "404.english_link": "영어로 읽기", + "404.english_link.label": "영어 버전 열기", + "404.link": "메인 페이지", + "404.link.label": "메인 페이지로 돌아가기", + "404.quote": "이 페이지가 용암에 빠졌습니다", + "404.title": "페이지를 찾을 수 없습니다" +} \ No newline at end of file diff --git a/translated/pt_br/develop/entities/damage-types.md b/translated/pt_br/develop/entities/damage-types.md index b427b17d6..a617f4058 100644 --- a/translated/pt_br/develop/entities/damage-types.md +++ b/translated/pt_br/develop/entities/damage-types.md @@ -1,5 +1,5 @@ --- -title: Tipos de Dano +title: Tipos de dano description: Aprenda a adicionar tipos de dano personalizados. authors: - dicedpixels @@ -7,7 +7,7 @@ authors: - mattidragon --- -# Tipos de Dano +# Tipos de Dano {#damage-types} Os tipos de dano definem os tipos de dano que as entidades podem sofrer. A partir do Minecraft 1.19.4, a criação de novos tipos de dano passou a ser baseada em dados, o que significa que eles são criados usando arquivos JSON. @@ -39,7 +39,7 @@ A `RegistryKey` pode ser obtida da seguinte maneira: @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/damage/FabricDocsReferenceDamageTypes.java) -### Usando Tipos de Dano +### Usando Tipos de Dano {#using-damage-types} Para demonstrar o uso de tipos de dano personalizados, usaremos um bloco personalizado chamado _Tater Block_. Façamos com que quando uma entidade viva pisar em um _Tater Block_, ele causará dano de _Tater_. diff --git a/translated/pt_br/develop/entities/effects.md b/translated/pt_br/develop/entities/effects.md index f835b06ac..c47a15c49 100644 --- a/translated/pt_br/develop/entities/effects.md +++ b/translated/pt_br/develop/entities/effects.md @@ -22,7 +22,7 @@ O comando `/effect` pode ser usado para aplicar efeitos numa entidade. Neste tutorial adicionaremos um novo efeito personalizado chamado _Tater_, que lhe dará um ponto de experiência a cada tick do jogo. -### Estenda `StatusEffect` +### Estenda `StatusEffect` {#extend-statuseffect} Vamos criar uma classe de efeito personalizado estendendo `StatusEffect`, sendo uma classe base para todos os efeitos. @@ -34,27 +34,21 @@ Similar a registração de blocos e itens, usamos `Registry.register` para regis @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/FabricDocsReferenceEffects.java) -### Traduções e Texturas +### Textura -Você pode atribuir um nome ao seu efeito e providenciar uma textura de ícone que aparecerá na tela de inventário do jogador. - -#### Textura - -O ícone de textura é um PNG de 18x18. Coloque seu ícone personalizado em: +Estenda `StatusEffect` Traduções e Texturas Você pode atribuir um nome ao seu efeito e providenciar uma textura de ícone que aparecerá na tela de inventário do jogador. O ícone de textura é um PNG de 18x18. Coloque seu ícone personalizado em: ```:no-line-numbers resources/assets/fabric-docs-reference/textures/mob_effect/tater.png ``` -![Efeito no inventário do jogador](/assets/develop/tater-effect.png) + -#### Traduções +### Traduções Assim como outras traduções, você pode adicionar uma entrada com o formato de ID `"effect..": "Value"` ao arquivo de idioma. -::: code-group - -```json[assets/fabric-docs-reference/lang/en_us.json] +```json { "effect.fabric-docs-reference.tater": "Tater" } @@ -65,6 +59,7 @@ Assim como outras traduções, você pode adicionar uma entrada com o formato de Uso o comando `/effect give @p fabric-docs-reference:tater` para dar ao jogador nosso efeito Tater. Use `/effect clear @p fabric-docs-reference:tater` para remover o efeito. +:::info ::: info Para criar uma poção que utiliza este efeito, consulte o [guia de Poções](../items/potions). ::: diff --git a/translated/ru_ru/develop/commands/basics.md b/translated/ru_ru/develop/commands/basics.md new file mode 100644 index 000000000..7ccbc3c1f --- /dev/null +++ b/translated/ru_ru/develop/commands/basics.md @@ -0,0 +1,162 @@ +--- +title: Создание команд +description: Создавайте команды со сложными аргументами и действиями. +authors: + - dicedpixels + - i509VCB + - pyrofab + - natanfudge + - Juuxel + - solidblock + - modmuss50 + - technici4n + - atakku + - haykam + - mschae23 + - treeways + - xpple +--- + +# Создание команд + +Создание команд позволяет разработчику мода добавлять функционал, который может быть использован при вызове команд. Это руководство научит вас регистрировать команды и общую структуру команд Brigadier. + +::: info +Brigadier is a command parser and dispatcher written by Mojang for Minecraft. It is a tree-based command library where +you build a tree of commands and arguments. + +Исходный код библиотеки Brigadier: https://github.com/Mojang/brigadier +::: + +## Интерфейс `Command` {#the-command-interface} + +`com.mojang.brigadier.Command` это функциональный интерфейс, который запускает конкретный код, и исключает `CommandSyntaxException` в определённых случаях. Он имеет общий тип `S`, который определяет тип _источник команды_. +Источник команды предоставляет контекст, в котором была запущена команда. В Майнкрафт, источником команды является `ServerCommandSource` который может представлять сервер, командному блоку, удалённому соединению(RCON), игроку или сущности. + +Единственный метод в `Command`, это `run(CommandContext)` он берёт `CommandContext` в качестве единственного аргумента и возвращает целое число. Командный контекст содержит источник вашей команды как `S` и позволяет получить аргументы, посмотрите на разобранные командные ноды и увидите вводные данные, используемые в этой команде. + +Как и другие функциональные интерфейсы, этот используется постоянно как лямбда или ссылка на метод: + +```java +Command command = context -> { + return 0; +}; +``` + +Целое число может быть результатом команды. Обычно значения меньше или равные нулю означают, что команда не выполнена и ничего не сделает. Позитивные значения означают, что команда успешно выполнилась и что-то выполнила. Brigadier предоставляет константу для обозначения успеха; `Command#SINGLE_SUCCESS`. + +### Что может делать \`ServerCommandSource? + +`ServerCommandSource` предоставляет дополнительный контекст когда команда выполняется. Это добавляет возможность получить сущность которая выполнила команду, мир в котором команда выполнилась команда или сервер на котором запустилась команда. + +Вы можете получить командный источник из командного контекста при вызове `getSource()` в экземпляре `CommandContext`. + +```java +Command command = context -> { + ServerCommandSource source = context.getSource(); + return 0; +}; +``` + +## Регистрация основной команды {#registering-a-basic-command} + +Команды регистрируются в `CommandRegistrationCallback`, предоставляемый Fabric API. + +:::info +Сведения о регистрации обратных вызовов смотрите в [События](../events). +::: + +Событие следует регистрировать в инициализаторе вашего мода. + +Обратный вызов имеет три аргумента: + +- `CommandDispatcher dispatcher` - используется для регистрации, парсинга и выполнения команд. `S` - это тип источника команд, который поддерживает диспатчер команд. +- `CommandRegistryAccess registryAccess` - предоставляет абстракцию которую можно передать определённой команде методы аргументов +- `CommandManager.RegistrationEnvironment environment` - Определяет тип сервера, на котором регистрируются команды. + +В инициализации мода, мы просто регистрируем простую команду: + +@[code lang=java transcludeWith=:::_1](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) + +В методе`sendFeedback()`, первый аргумент это текст для отправки, который является `Supplier`, чтобы избежать создание экземпляров текстовых объектов когда они не нужны. + +Второй аргумент определяет, следует ли транслировать обратную связь с другими операторами. Обычно, если команда предназначена для запроса чего-либо без затрагивания мира, например запросить текущее время или счёт игрока, оно должно быть `false`. Если команда делает что-либо, например изменение времени или изменение чего-либо счёт, оно должно быть `true`. + +Если команда не выполняется, вместо вызова `sendFeedback()`, вы напрямую можете выбросить любое исключение и сервер или клиент справится с этим соответствующим образом. + +`CommandSyntaxException` обычно выбрасывается для обозначения синтаксических ошибок в команде или в аргументах. Вы можете так же имплементировать своё исключение. + +Чтобы выполнить эту команды, вы должны ввести `/foo` с учётом регистра. + +### Регистрационная среда {#registration-environment} + +При желании вы так же можете сделать так, чтобы когда команда регистрировалась с определёнными условиями, например только в выделенной среде: + +@[code lang=java highlight={2} transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) + +### Требования к команде {#command-requirements} + +Допустим, что у вас есть команда и вы хотите чтобы её могли выполнять только операторы. Здесь метод `requires()` вступает в игру. Метод `requires()` имеет один аргумент `Predicate` который будет предоставлять `ServerCommandSource` для проверки возможности `CommandSource` выполнять команду. + +@[code lang=java highlight={3} transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) + +Команда выполнится только, если источник команды имеет второй уровень минимально, включая команду блоков. Иначе, команда не зарегистрируется. + +Побочным эффектом этого является то, что эта команда не показывается при завершение всем игрокам кто не имеет второй уровень оператора. Это также объясняет почему вы не можете выполнить большинство команда, когда не включены читы. + +### Подкоманды {#sub-commands} + +Чтобы добавить подкоманду, вы должны зарегистрировать первый литеральный нод команды. Чтобы иметь подкоманду, вы должны добавить следующий литеральный нод к существующему ноду. + +@[code lang=java highlight={3} transcludeWith=:::7](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) + +Подобно аргументам, ноды подкоманд могут также быть опциональными. В следующем случае оба `/subtater` и `/subtater subcommand` будут правильными. + +@[code lang=java highlight={2,8} transcludeWith=:::8](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) + +## Клиентские команды {#client-commands} + +Fabric API имеет `ClientCommandManager` в пакете`net.fabricmc.fabric.api.client.command.v2` который можно использовать для регистрации команд на клиентской стороне. Код должен существовать только в коде клиентской стороны. + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) + +## Перенаправление команд {#command-redirects} + +Перенаправление команд - также известное как псевдонимы - это способ перенаправить функционал одной команды к другой. Это полезно, если вы хотите изменить название команды, но всё равно хотите поддерживать старое название. + +@[code lang=java transcludeWith=:::12](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) + +## FAQ {#faq} + +### Почему мой код не компилируется? {#why-does-my-code-not-compile} + +- Словите или выбросите `CommandSyntaxException` - `CommandSyntaxException`- это не `RuntimeException`. Если вы выбросите это, то оно должно быть в методах, которые выбрасывают `CommandSyntaxException` в сигнатурном методе, или его нужно будет поймать. + Brigadier обработает проверенные исключение и отправит вам сообщение об ошибке в игре. + +- Время от времени у вас могут возникать проблемы с джинериками. Если вы регистрируете серверные команды (в большинстве случаев), убедитесь, что вы используете `CommandManager.literal` или `CommandManager.argument` вместо `LiteralArgumentBuilder.literal` или `RequiredArgumentBuilder.argument`. + +- Проверьте метод `sendFeedback()` - Возможно вы забыли указать логическое значение как второй аргумент. Также помните что, начиная с версии Майнкрафта 1.20, первым аргументом должен быть `Supplier` вместо `Text`. + +- Команда должна возвращать целое число - При регистрации команд, метод `executes()` принимает объект `Command`, обычно это лямбда. Лямбда должна возвращать только целое число. + +### Могу я зарегистрировать команды во время выполнения? {#can-i-register-commands-at-runtime} + +::: warning +You can do this, but it is not recommended. You would get the `CommandManager` from the server and add anything commands +you wish to its `CommandDispatcher`. + +После этого вам нужно опять отправить команду tree ко всем игрокам используя `CommandManager.sendCommandTree(ServerPlayerEntity)`. + +Это необходимо, поскольку клиент локально кэширует команду tree, которую он получает во время логина (или когда пакеты оператора отправлены) для локальных сообщений об ошибках с большим дополнением. +::: + +### Могу я отменить регистрацию команд во время выполнения? {#can-i-unregister-commands-at-runtime} + +::: warning +You can also do this, however, it is much less stable than registering commands at runtime and could cause unwanted side +effects. + +Для простоты, вы должны использовать отражение Brigadier и удалить ноды. После этого, вам нужно отправить команду tree каждому игроку заново используя `sendCommandTree(ServerPlayerEntity)`. + +Если вы не будете отправлять обновления команде tree, клиент может всё ещё подумать, что команда существует, хотя сервер провалит его выполнение. +::: diff --git a/translated/ru_ru/develop/entities/effects.md b/translated/ru_ru/develop/entities/effects.md index b7387df72..e6da9949e 100644 --- a/translated/ru_ru/develop/entities/effects.md +++ b/translated/ru_ru/develop/entities/effects.md @@ -28,17 +28,13 @@ authors-nogithub: @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/TaterEffect.java) -### Регистрация нашего эффекта +### Регистрация своего эффекта Схожим с регистрацией блоков и предметов образом, мы используем `Registry.register`, чтобы зарегистрировать наш эффект в реестре `STATUS_EFFECT`. Это можно сделать в нашем инициализаторе. @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/FabricDocsReferenceEffects.java) -### Переводы и текстуры - -Вы можете назначить имя вашему эффекту состояния и дать ему иконку, которая будет отображаться в инвентаре игрока. - -#### Текстура +### Текстура Иконка эффекта состояния представляет собой PNG-файл размером 18×18 пикселей. Поместите свою иконку в папку: @@ -46,15 +42,13 @@ authors-nogithub: resources/assets/fabric-docs-reference/textures/mob_effect/tater.png ``` -![Эффект в инвентаре игрока](/assets/develop/tater-effect.png) + -#### Переводы +### Переводы Как и с любыми другими переводами, вы можете добавить запись формата `"effect..": "Значение"` в языковой файл. -::: code-group - -```json[assets/fabric-docs-reference/lang/en_us.json] +```json { "effect.fabric-docs-reference.tater": "Tater" } @@ -65,6 +59,7 @@ resources/assets/fabric-docs-reference/textures/mob_effect/tater.png Используйте команду `/effect give @p fabric-docs-reference:tater`, чтобы дать игроку наш эффект Tater. Используйте команду `/effect clear @p fabric-docs-reference:tater`, чтобы удалить эффект. +:::info ::: info Чтобы узнать, как создать зелье, накладывающее этот эффект, ознакомьтесь с руководством по [зельям](../items/potions). ::: diff --git a/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md b/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md index 758ea236b..6806f5a6a 100644 --- a/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md +++ b/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md @@ -4,13 +4,13 @@ description: "Краткое знакомство с Fabric и создание authors: - IMB11 - itsmiir +authors-nogithub: + - basil4088 --- - - # Введение в Fabric и создание модов -## Подготовка +## Предварительные условия {#prerequisites} Перед тем как начать, вам следует иметь базовые знания разработки на Java и понимание концепций объектно-ориентированного программирования (ООП). @@ -21,7 +21,7 @@ authors: - [W3: Java в ООП](https://www.w3schools.com/java/java_oop.asp) - [Medium: Введение в ООП](https://medium.com/@Adekola_Olawale/beginners-guide-to-object-oriented-programming-a94601ea2fbd) -### Термины +### Терминология {#terminology} Прежде чем начнём, давайте рассмотрим некоторые термины, с которыми вы столкнётесь при создании мода на Fabric: @@ -33,7 +33,7 @@ authors: - **Обфускация**: Процесс усложнения кода для его затруднённого понимания, используемый Mojang для защиты кода Minecraft. - **Remapping**: Процесс преобразования обфусцированного кода в тот, который будет читаем для людей. -## Что такое Fabric? +## Что такое Fabric? {#what-is-fabric} Fabric — лёгкий инструмент для создания модов для Minecraft: Java Edition. @@ -46,7 +46,7 @@ Fabric — лёгкий инструмент для создания модов - **Fabric API**: набор API и инструментов для разработчиков модов, которые можно использовать при создании модов. - **Yarn**: набор открытых маппингов Minecraft, свободных для использования под лицензией Creative Commons Zero. -## Почему Fabric необходим для модификации Minecraft? +## Почему Fabric необходим для модификации Minecraft? Fabric использует его для сборки своих модов. > Модификация игры — это процесс изменения игры с целью изменения её поведения или добавления новых возможностей. В случае Minecraft это может включать в себя всё, от добавления новых предметов, блоков или существ до изменения механик игры или добавления новых режимов игры. @@ -56,7 +56,7 @@ Loom преобразует обфусцированный код в читае Loom позволяет легко разрабатывать и компилировать моды на основе кода, над которым провели remapping, а загрузчик Fabric позволяет загружать эти моды в игру. -## Что даёт Fabric API и зачем это нужно? +## Что даёт Fabric API и зачем это нужно? {#what-does-fabric-api-provide-and-why-is-it-needed} > Fabric API — это набор API и инструментов для разработчиков модов, которые можно использовать при создании модов. diff --git a/translated/ru_ru/develop/getting-started/launching-the-game.md b/translated/ru_ru/develop/getting-started/launching-the-game.md new file mode 100644 index 000000000..f1a7df087 --- /dev/null +++ b/translated/ru_ru/develop/getting-started/launching-the-game.md @@ -0,0 +1,63 @@ +--- +title: Запуск игры +description: Узнайте как использовать разные профили для запуска и отладки ваших модов в игровой среде. +authors: + - IMB11 +--- + +# Запуск игры {#launching-the-game} + +Fabric Loom предоставляет различные варианты профилей запуска для помощи вам при запуске и отладке ваших модов в игровой сфере. В этом руководстве будут рассмотрены различные профили для запуска и способы их использовать для отладки и тестирования ваших модов. + +## Профили запуска {#launch-profiles} + +Если вы используете IntelliJ IDEA, то вы можете найти профили запуска в правом верхнем углу окна. Кликните на раскрывающееся меню, чтобы увидеть доступные профили запуска. + +Должен быть профиль клиента и сервера, с возможностью его запуска или в режиме отладки: + +![Запуск профилей](/assets/develop/getting-started/launch-profiles.png) + +## Таски Gradle {#gradle-tasks} + +Если вы используете командную строку, то вы можете использовать следующие команды Gradle, для запуска игры: + +- `./gradlew runClient` - Запустить игру в режиме клиента. +- `./gradlew runServer` - Запустить игру в режиме сервера. + +Единственная проблема в том, что вы не можете легко отладить свой код. Если вы хотите отладить свой код, вам нужно использовать профили запуска в IntelliJ IDEA или в интеграции Gradle с IDE. + +## Замена классов в режиме отладки {#hotswapping-classes} + +Когда вы запускаете игру в режиме отладки, вы можете заменять ваши классы без перезагрузки игры. Это полезно для быстрого тестирования изменений в вашем коде. + +Однако вы всё ещё ограничены: + +- Вы не можете добавлять или удалять методы +- Вы не можете изменять аргументы методов +- Вы не можете добавлять или удалять поля + +## Замена Mixin во время запуска {#hotswapping-mixins} + +Если вы используете Mixin'ы, вы можете заменять классы с вашими Mixin'ами без перезагрузки игры. Это полезно для быстрого тестирования изменений в ваших Mxin'ах. + +Однако для этого вам нужно установить Mixin Java. + +### 1. Найдите jar файл библиотеки Mixin {#1-locate-the-mixin-library-jar} + +В IntelliJ IDEA, вы можете найти jar файл Mixin во "External Libraries" в разделе "Project": + +![Библиотека Mixin](/assets/develop/getting-started/mixin-library.png) + +Вам нужно копировать jar файл "Absolute Path" для следующего шага. + +### 2. Добавьте аргумент VM `-javaagent` {#2-add-the--javaagent-vm-argument} + +Запустите конфигурацию "Minecraft Client" или "Minecraft Server" и добавьте следующие VM аргументы: + +```:no-line-numbers +-javaagent:"Путь к jar файлу библиотеки Mixin" +``` + +![Скриншот VM аргументов](/assets/develop/getting-started/vm-arguments.png) + +Теперь вы сможете изменять контекст методов Mixin во время отладки, и изменения вступят в силу без перезагрузки игры. diff --git a/translated/ru_ru/develop/getting-started/project-structure.md b/translated/ru_ru/develop/getting-started/project-structure.md new file mode 100644 index 000000000..28198d5d7 --- /dev/null +++ b/translated/ru_ru/develop/getting-started/project-structure.md @@ -0,0 +1,59 @@ +--- +title: Структура проекта +description: Обзор структуры проекта Fabric мода. +authors: + - IMB11 +--- + +# Структура проекта {#project-structure} + +На этой странице будет рассмотрена структура проекта Fabric мода, и назначение каждого файла и папки в проекте. + +## `fabric.mod.json` {#fabric-mod-json} + +Файл `fabric.mod.json` - это главный файл который описывает ваш мод загрузчику Fabric. Он содержит такую информацию как идентификатор мода, версию и зависимости. + +Важнейшие поля в файле `fabric.mod.json`: + +- `id`: Идентификатор мода (должен быть уникальным). +- `name`: Название мода. +- `environment`: Среда выполнения которую запускает ваш мод, например `client`, `server`, или `*` для обоих. +- `entrypoints`: Точки входа вашего мода, например `main` или `client`. +- `depends`: Зависимости вашего мода. +- `mixins`: Миксины, которые предоставляет ваш мод. + +Ниже вы можете увидеть пример файла `fabric.mod.json`, этот файл `fabric.mod.json` для примерного проекта, лежащего в основе этого сайта документации. + +:::details Примерный проект `fabric.mod.json` +@[code lang=json](@/reference/latest/src/main/resources/fabric.mod.json) +::: + +## Точки входа {#entrypoints} + +Как упоминалось ранее, файл `fabric.mod.json` имеет внутри поле `entrypoint`, это поле используется для указания точек входа, которые предоставляет ваш мод. + +Создатель шаблонов создает обе точки входа `main` и `client` по умолчанию, точка входа `main` используется для общего кода, а точка входа `client` используется для клиентоориентированного кода. Эти точки входа вызывается, когда игра запускается. + +@[code lang=java transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java) + +Выше приведён пример простой точки входа `main`, который записывает сообщение в консоль, когда игра запускается. + +## `src/main/resources` {#src-main-resources} + +Папка `src/main/resources` используется для хранения ресурсов которые использует ваш мод, например текстуры, модели, и звуки. + +Это так же папка хранения `fabric.mod.json` и все файлы конфигурации, которые использует ваш мод. + +Ресурсы хранятся в структуре, которые отражают структуру пакетов ресурсов, например, текстуре блока будет храниться в `assets/modid/textures/block/block.png`. + +## `src/client/resources` {#src-client-resources} + +Папка `src/client/resources` используется для хранения клиентоориентированных ресурсов. + +## `src/main/java` {#src-main-java} + +Папка `src/main/java` используется для хранения исходного кода вашего мода, она существует на клиентской так и на серверной среде. + +## `src/client/java` {#src-client-java} + +Папка `src/client/java` используется для хранения клиентоориентированного исходного кода, например код рендеринга или логика на стороне клиента - например предоставляемый цвет блока. diff --git a/translated/ru_ru/develop/items/custom-item-groups.md b/translated/ru_ru/develop/items/custom-item-groups.md new file mode 100644 index 000000000..2db1745b2 --- /dev/null +++ b/translated/ru_ru/develop/items/custom-item-groups.md @@ -0,0 +1,38 @@ +--- +title: Собственные вкладки предметов +description: Вы узнаете как создавать собственные вкладки предметов и как в них добавлять предметы. +authors: + - IMB11 +--- + +# Собственные вкладки предметов {#custom-item-groups} + +Вкладки предметов - это вкладки в творческом инвентаре в которых хранятся предметы. Вы можете создать собственную вкладку предметов, чтобы хранить предметы на отдельной вкладке. Это очень полезно, если ваш мод добавляет много предметов и вы хотите хранить их в одном месте, чтобы все игроки могли их легко получить. + +## Создание вкладки с предметами {#creating-the-item-group} + +Создавать вкладку с предметами очень легко. Просто создайте новое статическое конечное поле в классе с вашими предметами, чтобы хранить вкладку с предметами и ключа реестра для неё, затем вы можете использовать событие вкладки с предметами аналогично тому, как вы добавляете предметы в ванильную вкладку с предметами: + +@[code transcludeWith=:::9](@/reference/latest/src/main/java/com/example/docs/item/ModItems.java) + +@[code transcludeWith=:::_12](@/reference/latest/src/main/java/com/example/docs/item/ModItems.java) + +
+ +Теперь вы можете увидеть вкладку с предметами в меню творчества. Однако он не переведён - вам необходимо добавить ключ перевода в файл с переводами, так же как и вы перевели свой первый предмет. + +![Вкладка с предметами без перевода в меню творчества](/assets/develop/items/itemgroups_0.png) + +## Добавление ключа перевода {#adding-a-translation-key} + +Если вы используете `Text.translatable` для конструктора метода `displayName` во вкладке с предмета, вам нужно добавить перевод в файл вашего языка. + +```json +{ + "itemGroup.fabric_docs_reference": "Fabric Docs Reference" +} +``` + +Теперь как вы видите у вкладки с предметами правильное название: + +![Полностью сделанная вкладка с предметами с переводом и предметами](/assets/develop/items/itemgroups_1.png) diff --git a/translated/ru_ru/develop/items/custom-item-interactions.md b/translated/ru_ru/develop/items/custom-item-interactions.md new file mode 100644 index 000000000..09441a996 --- /dev/null +++ b/translated/ru_ru/develop/items/custom-item-interactions.md @@ -0,0 +1,71 @@ +--- +title: Собственные интерактивные предметы +description: Вы научитесь создавать предметы, которые используют ванильные события. +authors: + - IMB11 +--- + +# Собственные интерактивные предметы {#custom-item-interactions} + +Базовые предметы могут зайти так далеко, что вы можете добавить предмет, который имеет интерактивность с миром при использовании. + +Есть несколько ключевых классов которые вы должны понять, прежде чем будете рассматривать события с ванильными предметами. + +## TypedActionResult {#typedactionresult} + +Для предметов более распространённым `TypedActionResult` является `ItemStacks` - этот класс говорит игре, что нужно заменять (или не заменять) после того, как событие произошло. + +Если в событие ничего не произошло, вам нужно будет использовать метод `TypedActionResult#pass(stack)`, где `stack` это текущий стек предметов. + +Вы можете получить текущий стек предметов, получая стек из руки игрока. Обычно события, требующие `TypedActionResult`, передают эту функцию методу события. + +```java +TypedActionResult.pass(user.getStackInHand(hand)) +``` + +Если вы передадите текущий стек, тогда ничего не изменится, независимо от того, объявите ли вы событие неудавшимся, прошедшим/проигнорируемым или успехом. + +Если вы хотите удалить текущий стек, вам следует передать пустой. То же самое сказать про уменьшение, вы извлекаете текущий стек и уменьшаете его на количество которое вы хотите: + +```java +ItemStack heldStack = user.getStackInHand(hand); +heldStack.decrement(1); +TypedActionResult.success(heldStack); +``` + +## ActionResult {#actionresult} + +Аналогичным образом, `ActionResult` говорит игре статус события, не смотря было ли оно пройдено/проигнорированно, неудачно или успешно. + +## Переопределяемые события {#overridable-events} + +К счастью, класс предмета имеет множество методам, которые можно переопределить, чтобы добавить дополнительную функциональность вашим предметам. + +:::info +Отличный пример использование этих событие вы можете найти на странице [Воспроизведение SoundEvents](../sounds/using-sounds), где событие `useOnBlock` воспроизводит звук когда игрок кликает правой кнопкой мыши по блоку. +::: + +| Метод | Информация | +| --------------- | ------------------------------------------------------------------------------------- | +| `postHit` | Вызывается когда игрок, ударяет сущность. | +| `postMine` | Вызывается когда игрок, ломает блок. | +| `inventoryTick` | Вызывается каждый тик когда предмет находится в инвентаре. | +| `onCraft` | Вызывается когда предмет, создаётся. | +| `useOnBlock` | Вызывается когда игрок кликает правой кнопкой мыши предметом на блок. | +| `use` | Вызывается когда игрок кликает правой кнопкой мыши предметом. | + +## Событие `use()`{#use-event} + +Допустим, что вы хотите сделать предмет, который вызывает молнию перед игроком, вам нужно будет создать отдельный класс. + +@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/item/custom/LightningStick.java) + +Событие `use`, вероятно, самое полезное из всех, вы можете использовать это событие, чтобы призвать молнию, вы должны создать её перед игроками в 10 блоков от направления. + +@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/item/custom/LightningStick.java) + +Как обычно, вам необходимо зарегистрировать свой предмет, добавьте модель и текстуру. + +Как видите, молния должна появиться в 10 блоках перед вами, игроком. + + diff --git a/translated/ru_ru/develop/sounds/custom.md b/translated/ru_ru/develop/sounds/custom.md new file mode 100644 index 000000000..c3e5d53c8 --- /dev/null +++ b/translated/ru_ru/develop/sounds/custom.md @@ -0,0 +1,63 @@ +--- +title: Создание своих звуков +description: Вы научите добавлять и использовать новые звуки с реестром. +authors: + - JR1811 +--- + +# Создание своих звуков {#creating-custom-sounds} + +## Подготовка аудиофайла {#preparing-the-audio-file} + +Нужно отформатировать ваш аудиофайл определённым образом. OGG Vorbis - это открытый формат для мультимедийных данных, например аудио, и используется в качестве звуковых файлов Minecraft. Чтобы избежать проблем с тем, как Minecraft обрабатывает дистанцию, вашему аудио нужно иметь только один канал (Mono). + +Многие современные программы ЦЗРС (Цифровая звуковая рабочая станция) могут импортировать и экспортировать файлы этого формата. В следующем примере для приведения файла в правильный формат будет использован "[Audacity](https://www.audacityteam.org/)", или любая другая ЦЗРС программа. + +![Неподготовленный файл в Audacity](/assets/develop/sounds/custom_sounds_0.png) + +В этом примере звук [свисток](https://freesound.org/people/strongbot/sounds/568995/) был импортирован в Audacity. Обычно он сохраняется как файл `.wav` и имеет два аудио канала (Stereo). Отредактируйте звук по своему вкусу и удалите один из каналов, используя раскрывающийся элемент наверху "track head". + +![Разделение Стерео трека](/assets/develop/sounds/custom_sounds_1.png) + +![Удаление одного из каналов](/assets/develop/sounds/custom_sounds_2.png) + +Когда вы экспортируете или рендерите аудиофайл, выберите формат файла OGG. Некоторые ЦЗРС, например REAPER, могут поддерживать несколько форматов слоёв OGG. В этом случае OGG Vorbis должен работать нормально. + +![Экспорт как OGG файл](/assets/develop/sounds/custom_sounds_3.png) + +Также имейте в виду, что аудиофайлы могут значительно увеличить размер вашего мода. При необходимости сожмите звук, когда редактируйте и экспортируйте файл, чтобы свести размер файла к минимуму. + +## Загрузка аудиофайла {#loading-the-audio-file} + +Добавьте новую директорию `resources/assets//sounds` для звуков в вашем моду, и положите в неё экспортированный аудиофайл `metal_whistle.ogg`. + +Дальше создайте файл `resources/assets//sounds.json`, если он не существует и добавьте ваш звук в звуковые записи. + +@[code lang=json](@/reference/latest/src/main/resources/assets/fabric-docs-reference/sounds.json) + +Запись подписи предоставляет больше контекста для игрока. Название подписи используется в языковых файлах в директории `resources/assets//lang` и будет показываться, если включена настройка и звук воспроизводиться. + +## Регистрация своего звука {#registering-the-custom-sound} + +Чтобы добавить собственный звук в мод, зарегистрируете в классе SoundEvent, который имплементирует точку входа `ModInitializer`. + +```java +Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle"), + SoundEvent.of(new Identifier(MOD_ID, "metal_whistle"))); +``` + +## Чистка беспорядка {#cleaning-up-the-mess} + +В зависимости насколько много записей реестра находится, это может превратиться в беспорядок. Чтобы обойти это, мы должны сделать использование нового класса помощника. + +Добавьте два новых метода для ранее созданного класса помощника. Первый регистрирует все звуки и используется для инициализации этого класса на первом месте. После этого вы можете добавить в новый статический класс `SoundEvent` нужные переменные. + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/sound/CustomSounds.java) + +`ModInitializer` имплементируют точки входа которые нужны классу, чтобы имплементировать весь реестр с собственными SoundEvents. + +@[code lang=java transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/sound/FabricDocsReferenceSounds.java) + +## Используйте собственные SoundEvent'ы {#using-the-custom-soundevent} + +Используйте класс помощник для доступа к собственному SoundEvent. Просмотрите страницу [Воспроизводящиеся SoundEvent'ы](./using-sounds), чтобы научиться как воспроизводить звуки. diff --git a/translated/ru_ru/index.md b/translated/ru_ru/index.md index ed447a984..782590773 100644 --- a/translated/ru_ru/index.md +++ b/translated/ru_ru/index.md @@ -20,7 +20,7 @@ features:
-## Хотите внести свой вклад? +## Хотите внести свой вклад? {#contribute} Если вы хотите внести свой вклад в документацию Fabric, вы можете найти её исходный код на [GitHub](https://github.com/FabricMC/fabric-docs) и ознакомиться с соответствующим [руководством по внесению вклада](./contributing). diff --git a/translated/ru_ru/sidebar_translations.json b/translated/ru_ru/sidebar_translations.json index caa1037a9..fc55723ef 100644 --- a/translated/ru_ru/sidebar_translations.json +++ b/translated/ru_ru/sidebar_translations.json @@ -20,7 +20,16 @@ "develop.gettingStarted.projectStructure": "Структура проекта", "develop.gettingStarted.launchGame": "Запуск игры", "develop.items": "Предметы", + "develop.items.first-item": "Создание вашего первого предмета", + "develop.items.food": "Еда", + "develop.items.custom-armor": "Собственная броня", + "develop.items.custom-tools": "Собственные инструменты", + "develop.items.custom-item-groups": "Собственные вкладки с предметами", + "develop.items.custom-item-interactions": "Собственная интерактивность с предметами", "develop.items.potions": "Зелья", + "develop.blocks": "Блоки", + "develop.blocks.first-block": "Создание вашего первого блока", + "develop.blocks.blockstates": "Состояние блоков", "develop.entities": "Сущности", "develop.entities.effects": "Эффекты состояния", "develop.entities.damage-types": "Типы урона", @@ -40,8 +49,8 @@ "develop.misc": "Прочие страницы", "develop.misc.codecs": "Кодеки", "develop.misc.events": "События", + "develop.misc.text-and-translations": "Текст и переводы", "develop.sounds": "Звуки", "develop.sounds.using-sounds": "Воспроизведение SoundEvents", - "develop.sounds.custom": "Создание своих звуков", - "github.edit": "Отредактировать эту страницу на GitHub" + "develop.sounds.custom": "Создание своих звуков" } \ No newline at end of file diff --git a/translated/ru_ru/website_translations.json b/translated/ru_ru/website_translations.json index f032c36bf..06aae9a15 100644 --- a/translated/ru_ru/website_translations.json +++ b/translated/ru_ru/website_translations.json @@ -1,8 +1,46 @@ { + "authors.heading": "Страница авторов", + "authors.nogithub": "%s (не на GitHub)", + "banner": "Работа над документацией Fabric находится в процессе. Сообщите об ошибках здесь %s или тут %s.", + "description": "Полная документация Fabric, набор инструментов моддинга для Minecraft.", + "footer.next": "Следующая страница", + "footer.prev": "Предыдущая страница", + "github_edit": "Отредактируйте эту страницу на Guthub", + "lang_switcher": "Изменить язык", + "last_updated": "Последнее обновление", + "mode_dark": "Сменить на тёмную тему", + "mode_light": "Сменить на светлую тему", + "mode_switcher": "Внешний вид", + "nav.contribute": "Внести вклад", + "nav.contribute.api": "Fabric API", + "nav.download": "Загрузить", + "nav.home": "Главная страница", + "outline": "На этой странице", + "return_to_top": "Вернуться наверх", + "search.back": "Закрыть поиск", + "search.button": "Поиск", + "search.display_details": "Отобразить подробный список", + "search.footer.close": "закрыть", + "search.footer.close.key": "Выход", + "search.footer.down.key": "Стрелка вниз", + "search.footer.navigate": "навигация", + "search.footer.up.key": "Стрелка вверх", + "search.footer.select": "выбрать", + "search.footer.select.key": "Ввод", + "search.no_results": "Нет результатов", + "search.reset": "Сбросить поиск", + "sidebar_menu": "Меню", + "social.discord": "Discord", + "social.github": "GitHub", "title": "Документация Fabric", - "home": "Главная", - "download": "Скачать", - "contribute": "Внести вклад", - "contribute.api": "Fabric API", - "version_switcher": "Сменить версию" + "version_switcher": "Сменить версию", + "404.code": "Ошибка 404", + "404.crowdin_link": "Локализируйте на Crowdin", + "404.crowdin_link.label": "Открыть редактор Crowdin", + "404.english_link": "Прочитать на Английском", + "404.english_link.label": "Открыть Английскую версию", + "404.link": "Вернуться на главную", + "404.link.label": "Перейти на домашнюю страницу", + "404.quote": "Эта страница пыталась поплавать в лаве", + "404.title": "Страница не найдена" } \ No newline at end of file diff --git a/translated/zh_cn/contributing.md b/translated/zh_cn/contributing.md index fa8dddc2e..c23b0affa 100644 --- a/translated/zh_cn/contributing.md +++ b/translated/zh_cn/contributing.md @@ -1,28 +1,71 @@ -# Fabric 文档贡献指南 +--- +title: 贡献指南 +description: Fabric 文档贡献指南 +--- -此网站使用 [VitePress](https://vitepress.dev/) 从多个 Markdown 文件生成静态 HTML 网页。 您应该熟悉 VitePress 所支持的 Markdown 扩展语法,参见[此链接](https://vitepress.dev/guide/markdown#features)。 +# 贡献指南{#contributing} -## 目录 +此网站使用 [VitePress](https://vitepress.dev/) 从多个 Markdown 文件生成静态 HTML 网页。 您应该熟悉 VitePress 所支持的 Markdown 扩展语法,参见[此链接](https://vitepress.dev/guide/markdown.html#features)。 -- [Fabric 文档贡献指南](#fabric-documentation-contribution-guidelines) - - [如何贡献](#how-to-contribute) - - [贡献网页框架](#contributing-framework) - - [贡献内容](#contributing-content) - - [风格指南](#style-guidelines) - - [扩展指南](#guidance-for-expansion) - - [内容验证](#content-verification) - - [清理](#cleanup) - - [翻译文档](#translating-documentation) +贡献此网站有三种方法: -## 如何贡献 +- [翻译文档](#translating-documentation) +- [贡献内容](#contributing-content) +- [贡献网页框架](#contributing-framework) -建议您在存储库的分支上为您发出的每个拉取请求创建一个新分支。 这样一次性管理多个拉取请求将更简单。 +所有贡献应该遵守我们的[样式指南](#style-guidelines)。 -**如果您需要本地预览您的更改,您需要安装 [Node.js 18+](https://nodejs.org/en/)** +## 翻译文档{#translating-documentation} -在运行这些指令之前,请确保运行 `npm install` 以安装所有依赖。 +如果想将文档翻译为你的语言,可以在 [Fabric Crowdin 页面](https://zh.crowdin.com/project/fabricmc)翻译。 -**运行开发服务器:** +## 贡献内容{#contributing-content} + +贡献内容是贡献 Fabric 文档的主要方式。 + +所有内容贡献都会经历三个阶段: + +1. 扩展指南(如果可能) +2. 内容验证 +3. 清理(语法等) + +所有的内容都应当遵循我们的[样式指南](#style-guidelines)。 + +### 1. 准备你的更改{#1-prepare-your-changes} + +网站是开源的,在 GitHub 仓库中开发,意味着我们依赖 GitHub 工作流。 + +1. [复刻 GitHub 仓库](https://github.com/FabricMC/fabric-docs/fork) +2. 为你的复刻创建新分支 +3. 在那个分支上做出更改 +4. 在源仓库开拉取请求 + +可以在[这里](https://docs.github.com/en/get-started/using-github/github-flow)了解更多关于 GitHub 流。 + +可以在 GitHub 网站界面上做出更改,也可以本地开发和预览网站。 + +#### 本地克隆你的复刻{#clone-your-fork} + +如果想要本地克隆复刻,需要安装 [Git](https://git-scm.com/)。 + +然后,用以下代码克隆仓库的复刻: + +```sh +# make sure to replace "your-username" with your actual username +git clone https://github.com/your-username/fabric-docs.git +``` + +#### 本地安装依赖{#install-dependencies} + +**如果想要本地预览更改,需要安装 [Node.js 18+](https://nodejs.org/en/)** + +然后,确保用以下代码安装所有依赖: + +```sh +npm install +``` + +#### 本地运行开发服务器{#run-the-development-server} 这将允许您在本地地址 `localhost:3000` 预览您的更改,并自动在修改时重载页面。 @@ -30,152 +73,170 @@ npm run dev ``` -**构建网站:** +现在可以从浏览器访问 `http://localhost:5173` 打开和浏览网站。 + +#### 本地构建网站{#building-the-website} -这将编译所有 Markdown 文件为静态 HTML 页面并保存至 `.vitepress/dist` +这会把所有 Markdown 文件编译为静态 HTML 文件并保存至 `.vitepress/dist`: ```sh npm run build ``` -**预览已构建的网站:** +#### 本地预览构建的网站{#previewing-the-built-website} -这将在端口 3000 启动本地服务器并展示 `.vitepress/dist` 中的网页 +这将在端口 `4173` 启动本地服务器并展示 `.vitepress/dist` 中的网页: ```sh npm run preview ``` -## 贡献网页框架 +#### 本地打开拉取请求{#opening-a-pull-request} + +对你的更改满意了,就可以 `推送(push)` 你的更改。 + +```sh +git add . +git commit -m "Description of your changes" +git push +``` + +然后,跟随 `git push` 的输出打开拉取请求。 + +### 2. 需要时扩展指南{#2-guidance-for-expansion-if-needed} + +如果文档团队认为你需要扩展拉取请求,团队的成员会给你的拉取请求添加 `can-expand` 标签,并附上一条评论解释为什么他认为可以扩展。 如果同意建议,可以扩展你的拉取请求。 + +不用为扩展拉取请求感觉到压力。 如果不想扩展您的拉取请求,可以简单地请求移除 `can-expansion` 标签。 + +如果不想扩展您的拉取请求,但乐于让其他人在未来扩展它,最好在[议题页面](https://github.com/FabricMC/fabric-docs/issues)创建议题,并解释您想如何扩展。 + +### 3. 内容验证{#3-content-verification} + +所有添加内容的拉取请求都会经过内容验证,这是最重要的阶段,因为这能确保内容准确且遵循 Fabric 文档的样式指南。 + +### 4. 清理{#4-cleanup} + +这个阶段是文档团队会修正任何语法问题并在合并拉取请求之前进行他们认为必要的任何其他修改的时候! + +## 贡献网页框架{#contributing-framework} “框架”指的是网站的内部结构,任何修改网站框架的拉取请求都应该用 `framework` 标签标记。 您应该在咨询了 [Fabric Discord](https://discord.gg/v6v4pMv) 上的文档团队或通过一个 issue 后再发起框架相关的拉取请求。 -**注意:修改侧边栏文件和导航栏配置不算作框架拉取请求。** +:::info +修改侧边栏文件和导航栏配置不算作框架拉取请求。 +::: -## 贡献内容 +## 样式指南{#style-guidelines} -贡献内容是最主要的向 Fabric 文档贡献的方式。 +如果有任何疑问,请在 [Fabric Discord](https://discord.gg/v6v4pMv) 或 GitHub Discussions 中提出。 -所有的内容都应当遵循我们的风格指南。 +### 用美式英语写原文{#write-the-original-in-american-english} -### 风格指南 +所有原始文档都使用英文书写,遵循美国的语法规则。 -在 Fabric 文档网站中的所有页面都应该遵循风格指南。 如果你有任何疑问,请在 [Fabric Discord](https://discord.gg/v6v4pMv) 或 GitHub Discussions 中提出。 +可以使用 [LanguageTool](https://languagetool.org/) 检查你的语法,不要过于担心。 我们的文档团队会在清理阶段审查并纠正语法。 不过,一开始就努力做到正确可以为我们节省时间。 -风格指南如下: +### 给 Frontmatter 添加数据{#add-data-to-the-frontmatter} -1. 所有页面必须在 frontmatter 中有一个标题和描述。 +所有页面必须在 frontmatter 中有 `title` 和 `description`。 - ```md - --- - title: 这是页面的标题 - description: 这是页面的描述 - authors: - - 这是GitHub用户名 - --- +记得还要在 Markdown 文件的 frontmatter 中的 `authors` 添加你的 GitHub 用户名! 这种方式可以给你适当的致谢。 - # ... - ``` +```md +--- +title: Title of the Page +description: This is the description of the page. +authors: + - your-username +--- -2. 如果您创建或修改了包含代码的页面,请将代码放置在参考模组内的适当位置(位于存储库的 `/reference` 文件夹中)。 然后使用 [VuePress 提供的代码片段功能](https://vitepress.dev/zh/guide/markdown#import-code-snippets) 来嵌入代码。如果您需要更大范围的控制,可以使用 [来自 `markdown-it-vuepress-code-snippet-enhanced` 的 transclude 功能](https://github.com/fabioaanthony/markdown-it-vuepress-code-snippet-enhanced)。 +# Title of the Page {#title-of-the-page} - **例如:** +... +``` - ```md - <<< @/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java{15-21 java} - ``` +### 给标题添加锚点{#add-anchors-to-headings} - 这会嵌入参考模组中 `FabricDocsReference.java` 的第 15-21 行。 +每个标题都必须要有个锚点,用于链接至那个标题: - 最终的代码片段将看起来像这样: +```md +# This Is a Heading {#this-is-a-heading} +``` - ```java - @Override - public void onInitialize() { - // This code runs as soon as Minecraft is in a mod-load-ready state. - // However, some things (like resources) may still be uninitialized. - // Proceed with mild caution. +锚点必须使用小写字母、数字和横杠 - LOGGER.info("Hello Fabric world!"); - } - ``` +### 将代码置于 `/reference` 模组中{#place-code-within-the-reference-mod} - **Transclude 示例** +如果创建或修改包含代码的页面,将代码置于参考模组(位于目录的 `/reference` 文件夹内)的适当位置。 然后,使用[由 VitePress 提供的代码片段功能](https://vitepress.dev/guide/markdown#import-code-snippets)来嵌入代码。 - ```md - @[code transcludeWith=#test_transclude](@/reference/.../blah.java) - ``` +例如,高亮参考模组中的 `FabricDocsReference.java` 的第 15-21 行: - 这将嵌入标记有 `#test_transclude` 标签的 `blah.java` 文件中的部分。 +::: code-group - 例如: +```md +<<< @/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java{15-21} +``` - ```java - public final String test = "Bye World!" +<<< @/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java{15-21}[java] - // #test_transclude - public void test() { - System.out.println("Hello World!"); - } - // #test_transclude - ``` +::: - 只有 `#test_transclude` 标签之间的代码会被嵌入。 +如果需要更大范围的控制,可以使用[来自 `markdown-it-vuepress-code-snippet-enhanced` 的 transclude 功能](https://github.com/fabioaanthony/markdown-it-vuepress-code-snippet-enhanced)。 - ```java - public void test() { - System.out.println("Hello World!"); - } - ``` +例如,这会嵌入上面的文件中被标记 `#entrypoint` 标签的部分: -3. 所有原始文档都使用英文书写,跟随美国的语法规则。 虽然你可以使用 [LanguageTool](https://languagetool.org/) 检查你的语法,但不要过于担心。 我们的文档团队会在清理阶段审查并纠正语法。 不过,一开始就努力做到正确可以为我们节省时间。 +::: code-group -4. 如果您正在创建新的部分,您应当在 `.vitepress/sidebars` 文件夹中创建新的侧边栏,并将它添加到 `config.mts` 文件中。 如果您需要帮助,请在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#docs` 频道提问。 +```md +@[code transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java) +``` -5. 创建新页面时,您应当将其添加到 `.vitepress/sidebars` 文件夹中相关的侧边栏中。 重复,如果您需要帮助,请在 Fabric Discord 的 `#docs` 频道提问。 +@[code transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java) -6. 任何图片都应该放在 `/assets` 文件夹中的适当位置。 +::: -7. ⚠️ **当链接其他页面时,使用相对链接。** ⚠️ +### 为每个新段落创建侧边栏{#create-a-sidebar-for-each-new-section} - 这是因为现有的版本控制系统会预处理链接,以便事先添加版本号。 如果您使用绝对链接,版本号将不会添加到链接中。 +如果创建新章节,你应该在 `.vitepress/sidebars` 文件夹中创建新的侧边栏,并添加到 `i18n.mts` 文件。 - 例如,对于 `/players` 文件夹中的页面,要链接到位于 `/players/installing-fabric.md` 的 `installing-fabric` 页面,您需要进行以下操作: +如果这个需要帮助,请在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#docs` 频道提问。 - ```md - [这是一个其他页面的链接](./installing-fabric) - ``` +### 将新页面添加到相关的侧边栏{#add-new-pages-to-the-relevant-sidebars} - 您**不**应当进行以下操作: +写新页面时,应该将其添加到 `.vitepress/sidebars` 文件夹中的相关侧边栏。 - ```md - [这是一个其他页面的链接](/players/installing-fabric) - ``` +还是那句,如果需要帮助,请在 Fabric Discord 的 `#docs` 频道提问。 -所有内容贡献都会经历三个阶段: +### 把媒体放在 `/assets` 中{#place-media-in-assets} -1. 扩展指南(如果可能) -2. 内容验证 -3. 清理(语法等) - -### 扩展指南 +任何图片都应该放在 `/assets` 文件夹中的适当位置。 -如果文档团队认为您需要拓展您的拉去请求,团队成员将添加 `expansion` 标签到您的拉去请求,并附上一条评论解释为什么他认为可以拓展。 如果你同意这条建议,你可以拓展你的拉取请求。 +### 使用相对链接! {#use-relative-links} -**不要对拓展拉取请求感到有压力。** 如果您不想拓展您的拉取请求,您可以简单地请求移除 `expansion` 标签。 +这是因为现有的版本控制系统会预处理链接,以便事先添加版本号。 如果您使用绝对链接,版本号将不会添加到链接中。 -如果您不想拓展您的拉取请求,但您乐于让其他人在未来拓展它,最好在 [Issues page](https://github.com/FabricMC/fabric-docs/issues) 创建一个 issue,并解释您想如何拓展。 +你也不能够给链接添加扩展名。 -### 内容验证 +例如,要从页面 `/players/index.md` 链接到位于 `/players/installing-fabric.md` 的页面,需要进行以下操作: -所有添加内容的拉取请求都会经过内容验证,这是最重要的阶段,因为它确保内容准确且遵循Fabric文档的风格指南。 +::: code-group -### 清理 +```md:no-line-numbers [✅ Correct] +This is a relative link! +[Page](../players/index) +``` -这个阶段是文档团队会修正任何语法问题并在合并拉取请求之前进行他们认为必要的任何其他修改的时候! +```md:no-line-numbers [❌ Wrong] +This is an absolute link. +[Page](/players/index) +``` -## 翻译文档 +```md:no-line-numbers [❌ Wrong] +This relative link has the file extension. +[Page](../players/index.md) +``` -如果您想将该文档翻译为您的语言,您可以在 [Fabric Crowdin 页面](https://crowdin.com/project/fabricmc) 做这件事。 +::: diff --git a/translated/zh_cn/develop/blocks/blockstates.md b/translated/zh_cn/develop/blocks/blockstates.md new file mode 100644 index 000000000..3767095d0 --- /dev/null +++ b/translated/zh_cn/develop/blocks/blockstates.md @@ -0,0 +1,127 @@ +--- +title: 方块状态 +description: 学习为什么方块状态是一个向你的方块添加可视化功能的好方法。 +authors: + - IMB11 +--- + +# 方块状态{#block-states} + +方块状态是附加到 Minecraft 世界中的单个方块上的一段数据,包含属性形式的方块块信息——原版存储在方块状态中的属性的一些示例: + +- Rotation:主要用于原木方块和其他自然方块中。 +- Activated:主要用于红石装置方块和类似于熔炉、烟熏炉的方块中。 +- Age:用于农作物、植物、树苗、海带等方块中使用。 + +你可能看出了为什么方块状态有用——避免了在方块实体中存储 NBT 数据的需要——这既减小了世界大小,也防止产生 TPS 问题! + +方块状态的定义能在 `assets//blockstates` 文件夹中找到。 + +## 示例:柱方块{#pillar-block} + + + +Minecraft 已经有些自定义的类,允许你快速创建特定类型的方块——这个例子会通过创建“Condensed Oak Log”方块来带你创建带有 `axis` 属性的方块。 + +原版的 `PillarBlock` 允许方块按 X、Y 或 Z 轴放置。 + +@[code transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java) + +柱方块有两个纹理,顶部(`top`)和侧面(`side`),使用 `block/cube_column` 模型。 + +同样,纹理文件可以在 `assets//textures/block` 中找到。 + + + +由于柱方块有两个位置,水平和垂直,我们需要创建两个单独的模型文件: + +- `condensed_oak_log_horizontal.json`,继承 `block/cube_column_horizontal` 模型。 +- `condensed_oak_log.json`,继承 `block/cube_column` 模型。 + +`condensed_oak_log_horizontal.json` 文件的示例: + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/models/block/condensed_oak_log_horizontal.json) + +--- + +::: info +Remember, blockstate files can be found in the `assets//blockstates` folder, the name of the blockstate file should match the block ID used when registering your block in the `ModBlocks` class. For instance, if the block ID is `condensed_oak_log`, the file should be named `condensed_oak_log.json`. + +更加深入了解方块状态文件中可用的所有修饰器,可看看 [Minecraft Wiki - 模型(方块状态)](https://zh.minecraft.wiki/w/Tutorial:模型/方块状态)页面。 +::: + +然后,我们需要创建方块状态文件。 方块状态文件就是魔法发生的地方——柱方块有三个轴,所以我们使用以下情形中的特定模型: + +- `axis=x` - 方块沿 X 轴放置时,旋转模型以朝向正 X 方向。 +- `axis=y` - 方块沿 Y 轴旋转时,使用正常的垂直模型。 +- `axis=z` - 方块沿Z 轴放置时,旋转模型以朝向正 X 方向。 + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/blockstates/condensed_oak_log.json) + +同样,需要为你的方块创建翻译,以及继承了这两个模型中的任意一个的物品模型。 + +![游戏内的柱方块的示例](/assets/develop/blocks/blockstates_1.png) + +## 自定义方块状态{#custom-block-states} + +如果你的方块有独特的属性,那么自定义方块状态会非常不错——有时你会发现你的方块可以复用原版的属性。 + +这个例子会创建一个叫做 `activated` 的独特属性——玩家右键单击方块时,方块会由 `activated=false` 变成 `activated-true` 并相应改变纹理。 + +### 创建属性{#creating-the-property} + +首先,需要创建属性本身——因为是个布尔值,所以使用 `BooleanProperty.of` 方法。 + +@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/custom/PrismarineLampBlock.java) + +然后,需要在 `appendProperties` 方法中将属性添加到 blockstate manager\` 中。 需要覆盖此方法以访问 builder: + +@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/block/custom/PrismarineLampBlock.java) + +你还需要在你的自定义方块的构造函数中,设置 `activated` 属性的默认状态。 + +@[code transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/block/custom/PrismarineLampBlock.java) + +:::warning +别忘了注册方块时使用自定义的类而不是 `Block`! +::: + +### 使用属性{#using-the-property} + +这个例子会在玩家与方块交互时,翻转 `activated` 属性的布尔值。 我们可以为此覆盖 `onUse` 方法: + +@[code transcludeWith=:::4](@/reference/latest/src/main/java/com/example/docs/block/custom/PrismarineLampBlock.java) + +### 视觉呈现属性{#visualizing-the-property} + +创建方块状态前,我们需要为方块的激活的和未激活的状态都提供纹理,以及方块模型。 + + + +用你的方块模型知识,创建方块的两个模型:一个用于激活的状态,一个用于未激活的状态。 完成后,就可以开始创建方块状态文件了。 + +因为创建了新的属性,所以需要为方块更新方块状态文件以使用那个属性。 + +如果方块有多个属性,那么会需要包含所有可能的组合。 例如,`activated` 和 `axis` 可能就会导致 6 个组合(`activated` 有两个可能的值,`axis` 有三个可能的值)。 + +因为方块只有一个属性(`activated`),只有两个变种,所以方块状态 JSON 看起来应该像这样: + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/blockstates/prismarine_lamp.json) + +--- + +因为这个示例方块是灯,所以还需要让它在 `activated` 属性为 true 时发光。 可以通过在注册方块时传入构造器的 block settings 来完成。 + +可以使用 `luminance` 方法设置方块放出的光,可以在 `PrismarineLampBlock` 类中创建一个静态方法,从而根据 `activated` 属性返回光照等级,并将其作为方法引入传入 `luminance` 方法中。 + +@[code transcludeWith=:::5](@/reference/latest/src/main/java/com/example/docs/block/custom/PrismarineLampBlock.java) + +@[code transcludeWith=:::4](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java) + +--- + + + +一切完成后,最终的结果应该看起来像这样: + + diff --git a/translated/zh_cn/develop/blocks/first-block.md b/translated/zh_cn/develop/blocks/first-block.md new file mode 100644 index 000000000..24339321d --- /dev/null +++ b/translated/zh_cn/develop/blocks/first-block.md @@ -0,0 +1,166 @@ +--- +title: 创建你的第一个方块 +description: 学习如何在 Minecraft 中创建你的第一个自定义的方块。 +authors: + - IMB11 +--- + +# 创建你的第一个方块{#creating-your-first-block} + +方块是构成 Minecraft 世界的主要组成部分——和 Minecraft 的其他一切一样,是储存在注册表中的。 + +## 准备你的 Blocks 类{#preparing-your-blocks-class} + +如果你已经完成了[创建你的第一个物品](../items/first-item),那么这一过程会非常熟悉——你会需要创建一个注册方块以及方块物品的方法。 + +你应该把这个方块放在叫做 `ModBlocks` 的类中(也可以是其他你想要的名称)。 + +Mojang 对原版方块的处理方法和这个也非常相似,你可以参考 `Blocks` 类看看他们是怎么做的。 + +@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java) + +--- + +像物品一样,你需要确保类被加载,这样所有包含方块实体的静态字段都会初始化。 + +要做到这样,你可以创建占位的 `initialize` 方法,并在模组初始化器中调用以触发静态初始化。 + +:::info +如果不知道什么是静态初始化,那么这里说下,这是初始化类中的所有静态字段的过程。 JVM 加载类时,以及创建类的任何实例之前,都会完成这一过程。 +::: + +```java +public class ModBlocks { + // ... + + public static void initialize() {} +} +``` + +@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/FabricDocsReferenceBlocks.java) + +## 创建并注册你的方块{#creating-and-registering-your-block} + +和物品类似,方块会在构造函数中接收一个 `Block.Settings` 类,指定了方块的属性,例如其声音效果和挖掘等级。 + +我们不会在这里提到所有选项——可以查看类本身来看看各种选项,应该能解释清楚的。 + +这里为作举例,我们会创建一个拥有和泥土的相同属性但材料不同的方块。 + +:::tip +可以使用 `AbstractBlock.Settings.copy(AbstractBlock block)` 从已存在的方块中复制 settings,这种情况下,可以使用 `Blocks.DIRT` 以从泥土中复制 settings,但是为作举例,我们使用 builder。 +::: + +@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java) + +我们上一步创建过 `regisger` 方法,要自动创建方块物品,我们在方法的 `shouldRegisterItem` 参数中传入 `true`。 + +### 将方块添加到物品组{#adding-your-block-to-an-item-group} + +由于 `BlockItem` 是自动创建和注册的,要将其添加到物品组中,必须使用 `Block.asItem()` 方法来获得 `BlockItem` 实例。 + +例如,我们使用在[自定义物品组](../items/custom-item-groups)页面中创建的自定义物品组。 + +@[code transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java) + +--- + +你应该注意到,你的方块现在在创造模式物品栏中,并且可以放在世界中! + +![世界内没有模型和纹理的方块](/assets/develop/blocks/first_block_0.png) + +但是还有点问题——方块物品没有命名,方块没有纹理、方块模型和物品模型。 + +## 添加方块翻译{#adding-block-translations} + +要添加翻译,必须在你的翻译文件——`assets//lang/en_us.json` 中创建翻译键。(类似地,中文翻译可添加到 `assets/<0>/lang/zh_cn.json`。) + +Minecraft 会在创造模式物品栏中,以及其他显示方块名称的地方(例如命令反馈)中显示这个翻译。 + +```json +{ + "block.mod_id.condensed_dirt": "Condensed Dirt" +} +``` + +你可以重启游戏,或者构建你的模组然后按 F3 + T 以应用更改——你应该看到方块在创造模式物品栏中以及其他地方(例如统计屏幕)中有个名字了。 + +## 模型和纹理{#models-and-textures} + +所有方块纹理都可以在 `assets//textures/block` 文件夹中找到——“Condensed Dirt”方块的示例纹理可以自由使用。 + + + +要确保模型在游戏内显示,必须创建方块和物品模型,“Condensed Dirt”方块的方块和物品模型分别可以在下列地方找到: + +- `assets//models/block/condensed_dirt.json` +- `assets//models/item/condensed_dirt.json` + +物品模型很简单,只需要继承方块模型即可,因为大多数方块模型都支持在 GUI 中渲染。 + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/models/item/condensed_dirt.json) + +但是,在我们的例子中,方块模型就必须继承 `block/cube_all` 模型。 + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/models/block/condensed_dirt.json) + +载入游戏,你可能会发现模型还是缺失。 这是因为,你还需要添加方块状态定义。 + +## 创建方块状态定义{#creating-the-block-state-definition} + +方块状态定义用于指示游戏基于当前方块的状态要渲染哪个模型。 + +示例方块没有复杂的方块状态,只需要定义一项。 + +这个方块应该位于 `assets/mod_id/blockstates` 文件夹内,名字应该匹配在 `ModBlocks` 类中注册方块时使用的方块 ID。 例如,方块 ID 是 `condensed_dirt`,那么文件名称就是 `condensed_dirt.json`。 + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/blockstates/condensed_dirt.json) + +方块状态很复杂,会在之后的页面[方块状态](./blockstates)中详述。 + +重启游戏,或者通过F3 + T重新加载以应用更改——你应该能够看到方块在物品栏内的纹理以及在世界中呈现: + +![世界内有适当的纹理和模型的方块](/assets/develop/blocks/first_block_4.png) + +## 添加方块掉落物{#adding-block-drops} + +在生存模式下破坏方块时,你可能看到方块不会掉落——你可能想要这个功能,但是要让方块被破坏时掉落为物品,必须要实现其战利品表——战利品表文件应置于 `data//loot_tables/blocks/` 文件夹中。 + +:::info +对战利品表的更深入理解,可参考 [Minecraft Wiki - 战利品表](https://zh.minecraft.wiki/w/战利品表)页面。 +::: + +@[code](@/reference/latest/src/main/resources/data/fabric-docs-reference/loot_tables/blocks/condensed_dirt.json) + +这个战利品表提供了方块在被破坏以及被爆炸破坏时掉落的单个方块物品。 + +## 推荐挖掘工具{#recommending-a-harvesting-tool} + +你可能也想要让方块只能被特定类型的方块挖掘——例如,可能想让你的方块用锹挖掘更快。 + +所有的工具标签都位于 `data/minecraft/tags/mineable/` 文件夹内——其中文件的名称取决于使用的工具的类型,是以下之一: + +- `hoe.json`(锄) +- `axe.json`(斧) +- `pickaxe.json`(镐) +- `shovel.json`(锹) + +文件的内容很简单,是要添加到标签中的物品的列表。 + +这个例子会将“Condensed Dirt”方块添加到 `shovel` 标签中。 + +@[code](@/reference/latest/src/main/resources/data/minecraft/tags/mineable/shovel.json) + +## 挖掘等级{#mining-levels} + +类似地,相同的文件夹内也可以找到挖掘等级,并遵循以下格式: + +- `needs_stone_tool.json` - 最低需要石质工具 +- `needs_iron_tool.json` - 最低需要铁质工具 +- `needs_diamond_tool.json` - 最低需要钻石工具 + +文件与挖掘工具文件的格式相同——要添加到标签中的物品的列表。 + +## 备注{#extra-notes} + +如果将多个方块添加到你的模组中,可能需要考虑使用[数据生成](https://fabricmc.net/wiki/tutorial:datagen_setup)来自动化创建方块和物品模型、方块状态定义和战利品表。 diff --git a/translated/zh_cn/develop/codecs.md b/translated/zh_cn/develop/codecs.md index ace8bf204..af04843d3 100644 --- a/translated/zh_cn/develop/codecs.md +++ b/translated/zh_cn/develop/codecs.md @@ -8,7 +8,7 @@ authors: # Codec -Codec 是一个为了简单地解析 Java 对象的系统,它被包含在 Mojang 的 DataFixerUpper (DFU) 库中,DFU 被包含在 Minecraft 中。 在模组环境中,当读取和写入自定义 JSON 文件时,codec 可用作 GSON 和 Jankson 的替代品,尽管这些开始越来越相关,因为 Mojang 正在重写大量旧代码以使用 Codec。 +Codec 是用于简单地解析 Java 对象的系统,被包含在 Minecraft 所包含的 Mojang 的 DataFixerUpper (DFU) 库中。 在模组环境中,当读取和写入自定义 JSON 文件时,codec 可用作 GSON 和 Jankson 的替代品,尽管这些开始越来越相关,因为 Mojang 正在重写大量旧代码以使用 Codec。 Codec 与 DFU 的另一个 API `DynamicOps` 一起使用。 一个 codec 定义一个对象的结构,而 dynamic ops 用于定义一个序列化格式,例如 json 或 NBT。 这意味着任何 codec 都可以与任何 dynamic ops 一起使用,反之亦然,这样使其极其灵活。 @@ -18,9 +18,9 @@ Codec 与 DFU 的另一个 API `DynamicOps` 一起使用。 一个 codec 定义 Codec 的基本用法是将对象序列化为特定格式或反序列化为特定格式。 -一些原版的类已经定义了 codec,这些我们可以用作例子。 Mojang 默认提供了两个动态操作类 `JsonOps` 和 `NbtOps`,它们可以涵盖大部分的使用场景。 +一些原版的类已经定义了 codec,这些我们可以用作例子。 Mojang 默认提供了两个 dynamic ops 类,`JsonOps` 和 `NbtOps`,涵盖大部分的使用场景。 -假设现在我们要把一个 `BlockPos` 对象序列化成 json 再反序列化回对象。 我们可以分别使用 `BlockPos.CODEC` 中的静态方法 `Codec#encodeStart` 和 `Codec#parse`。 +现在,假设我们要把一个 `BlockPos` 对象序列化成 json 再反序列化回对象。 我们可以分别使用 `BlockPos.CODEC` 中的静态方法 `Codec#encodeStart` 和 `Codec#parse`。 ```java BlockPos pos = new BlockPos(1, 2, 3); @@ -55,11 +55,11 @@ LOGGER.info("Deserialized BlockPos: {}", pos); 正如之前所说,Mojang 已经为几个原版和标准 Java 类定义了 codec,包括但不限于 `BlockPos`、`BlockState`、`ItemStack`、`Identifier`、`Text` 和正则表达式 `Pattern`。 Mojang 自己的 codec 通常可以在类内找到名为 `CODEC` 的静态字段,其他的保持在 `Codecs` 类。 还要注意,所有原版注册表都包含 `getCodec()` 方法,例如,你可以使用 `Registries.BLOCK.getCodec()` 获取一个 `Codec`,可用于序列化为方块 id 或是反过来。 -Codec API 自己包含了一些 基础类型的 codec,就像 `Codec.INT` 和 `Codec.STRING`。 这些都在 `Codec` 类中作为静态字段存在,通常用作更多复杂 codec 的基础,会在下方做出解释。 +Codec API 自己也包含一些基础类型的 codec,例如 `Codec.INT` 和 `Codec.STRING`。 这些都在 `Codec` 类中作为静态字段存在,通常用作更多复杂 codec 的基础,会在下方做出解释。 ## 构建 Codec -现在我们已经知道如何使用 codec,让我们看看我们如何构建自己的 codec。 例如,让我们尝试序列化单链列表。 这种表示列表的方式由一组节点组成,这些节点既包含一个值,也包含对列表中下一个节点的引用。 然后列表由其第一个节点表示,遍历列表是通过跟随下一个节点来完成的,直到没有剩余节点。 以下是存储整数的节点的简单实现。 +现在我们已经知道如何使用 codec,让我们看看我们如何构建自己的 codec。 假设我们有以下类,希望从 json 文件中反序列化其实例: ```java public class CoolBeansClass { @@ -89,7 +89,7 @@ public class CoolBeansClass { } ``` -我们可以通过将多个较小的 Codec 组合成一个较大的 Codec 来为此类制作一个 Codec。 在这种情况下,我们的每个字段都需要: +我们可以将多个较小的 codec 组合成较大的 codec,从而为这个类制作 codec。 在这种情况下,我们的每个字段都需要: - 一个 `Codec` - 一个 `Codec` @@ -97,7 +97,7 @@ public class CoolBeansClass { 第一个可以从前面提到的 `Codec` 类中的基本类型 codec 中得到,也就是 `Codec.INT`。 而第二个可以从 `Registries.ITEM` 注册表中获取,它有 `getCodec()` 方法,返回 `Codec`。 我们没有用于 `List` 的默认 codec,但我们可以从 `BlockPos.CODEC` 制作一个。 -### List +### 列表{#lists} `Codec#listOf` 可用于创建任意 codec 的列表版本。 @@ -107,9 +107,9 @@ Codec> listCodec = BlockPos.CODEC.listOf(); 应该注意的是,以这种方式创建的 codec 总是会反序列化为一个 `ImmutableList`。 如果需要的是可变的列表,可以利用 [xmap](#mutually-convertible-types)在反序列化期间转换为可变列表。 -### 合并用于类似 Record 类的 Codec +### 合并用于类似 Record 类的 Codec{#merging-codecs-for-record-like-classes} -现在我们有每个字段单独的 codec,我们可以为我们的类使用 `RecordCodecBuilder` 合并它们为一个 codec。 假定我们的类有一个包含想序列化的所有字段的构造方法,并且每个字段都有相应的 getter 方法。 所以与 record 一起使用会非常适合,但也可以用于常规类。 +现在每个字段都有了单独的 codec,我们可以使用 `RecordCodecBuilder` 为我们的类将其合并为一个 codec。 假定我们的类有一个包含想序列化的所有字段的构造方法,并且每个字段都有相应的 getter 方法。 所以与 record 一起使用会非常适合,但也可以用于常规类。 来看看如何为我们的 `CoolBeansClass` 创建一个 codec: @@ -122,16 +122,16 @@ public static final Codec CODEC = RecordCodecBuilder.create(inst ).apply(instance, CoolBeansClass::new)); ``` -在 group 中的每一行指定 codec、字段名称和 getter 方法。 在 group 中的每一行指定一个 codec,一个字段名和一个 getter 方法。 `Codec#fieldOf` 调用用于将编解码器转换为 [map codec](#mapcodec),而 `forGetter` 调用指定了用于从类的实例中检索字段值的 `getter` 方法。 与此同时,`apply` 调用指定了用于创建新实例的构造函数。 需要注意的是在 group 中的字段顺序需要和构造方法的参数顺序保持一致。 同时,调用 `apply` 则指定了用于创建新实例的构造函数。 注意 group 中的字段的顺序应与构造函数中参数的顺序相同。 +在 group 中的每一行指定 codec、字段名称和 getter 方法。 调用 `Codec#fieldOf` 是为将 codec 转换为 [map codec](#mapcodec),调用 `forGetter` 则是指定了从类的实例中检索字段值的 getter 方法。 同时,调用 `apply` 则指定了用于创建新实例的构造函数。 注意 group 中的字段的顺序应与构造函数中参数的顺序相同。 -这里也可以使用 `Codec#optionalFieldOf` 使字段可选,在 [可选字段](#optional-fields) 章节会有解释。 +这里也可以使用 `Codec#optionalFieldOf` 使字段可选,在[可选字段](#optional-fields)章节会有解释。 ### 不要将 MapCodec 与 Codec&lt;Map&gt; 混淆 {#mapcodec} 调用 `Codec#fieldOf` 会将 `Codec` 转换成 `MapCodec`,这是 `Codec` 的一个变体,但不是直接实现。 正如其名称所示,`MapCodec` 保证序列化为 键到值的映射,或所使用的 `DynamicOps` 类似类型。 一些函数可能需要使用 `MapCodec` 而不是常规的 codec。 -这种创建 `MapCodec` 的特殊方式本质上是在一个映射中封装源 codec 的值,并使用给定的字段名作为键。 这种创建 `MapCodec` 的特殊方式本质上是在一个map中封装源 codec 的值,使用给定的字段名作为键。 例如,一个 `Codec` 序列化为 json 时看起来像是这样: 例如,一个 `Codec` 序列化为 json 时看起来像是这样: +这种创建 `MapCodec` 的特殊方式本质上是在一个映射中封装源 codec 的值,并使用给定的字段名作为键。 例如,一个 `Codec` 序列化为 json 时看起来像是这样: ```json [1, 2, 3] @@ -147,7 +147,7 @@ public static final Codec CODEC = RecordCodecBuilder.create(inst 虽然 map codec 最常见的用途是与其他 map codec 合并以构造一个完整类字段的 codec,如前文的 [合并用于类似 Record 类的 Codec](#merging-codecs-for-record-like-classes) 章节所述,但也可以通过使用 `MapCodec#codec` 再次转换成常规的 codec,这将保持封装输入值的相同行为。 -#### 可选字段 +#### 可选字段{#optional-fields} `Codec#optionalFieldOf` 可用于创建一个可选的 map codec。 反序列化过程中,当特定字段不存在于容器中时,反序列化为一个空的 `Optional`,或指定的默认值。 @@ -159,33 +159,34 @@ MapCodec> optionalCodec = BlockPos.CODEC.optionalFieldOf("pos MapCodec optionalCodec = BlockPos.CODEC.optionalFieldOf("pos", BlockPos.ORIGIN); ``` -需要注意,可选字段会默默忽略可能发生的任何错误。 这意味着如果这个字段存在,但值无效,该字段总是会被反序列化为默认值。 +需要注意,可选字段会忽略反序列化过程中可能发生的任何错误而不报错。 这意味着如果这个字段存在,但值无效,该字段总是会被反序列化为默认值。 **从 1.20.2 开始**,Minecraft 自己 (不是 DFU!) 却确实提供`Codecs#createStrictOptionalFieldCodec`, 如果字段值无效,则反序列化失败。 -### 常量、约束和组合 +### 常量、约束和组合{#constants-constraints-composition} -#### Unit +#### Unit{#unit} -`Codec.unit` 可被用于创建一个总是反序列化为一个常量值的 codec,无论输入如何。 序列化时什么也不做。 +`Codec.unit` 可用于创建一个无论输入什么都总是反序列化为常量值的 codec。 序列化时什么也不做。 ```java Codec theMeaningOfCodec = Codec.unit(42); ``` -#### 数值范围 +#### 数值范围{#numeric-ranges} -`Codec.intRange` 及其伙伴 `Codec.floatRange` 和 `Codec.doubleRange` 可用于创建一个只接受在指定**包含**范围内的数字值的 codec。 这适用于序列化和反序列化。 这适用于序列化和反序列化。 这适用于序列化和反序列化。 +`Codec.intRange` 及其伙伴 `Codec.floatRange` 和 `Codec.doubleRange` 可用于创建只接受在指定的**包含两端的**范围内的数字值的 codec, 这适用于序列化和反序列化。 ```java // 不能大于 2 Codec amountOfFriendsYouHave = Codec.intRange(0, 2); ``` -#### Pair +#### Pair{#pair} -`Codec.pair` 将两个 codec `Codec` 和 `Codec` 合并为 `Codec>`。 `Codec#dispatch` 让我们可以定义一个 codec 的注册表,并根据序列化数据中字段的值分派到一个特定的 codec。 当反序列化具有不同字段的对象,这些字段依赖于它们的类型,但仍代表相同的事物时,这非常有用。 当反序列化具有不同字段的对象,这些字段依赖于它们的类型,但仍代表相同的事物时,这非常有用。 +`Codec.pair` 将两个 codec `Codec` 和 `Codec` 合并为 `Codec>`。 请记住,它只能与序列化到特定字段的Codec配合使用,例如[转换的`MapCodec`](#mapcodec)或 +[记录Codec](#merging-codecs-for-record-like-classes)。 结果 codec 将序列化为结合了两个使用的 codec 字段的 map。 例如,运行这些代码: @@ -211,16 +212,16 @@ DataResult result = pairCodec.encodeStart(JsonOps.INSTANCE, Pair.of } ``` -#### Either +#### Either{#either} -`Codec.either` 将两个 codec `Codec` 和 `Codec` 组合为 `Codec>`。 当使用 codec 的时候,结果以 `DataResult` 的形式返回。 这是一个可以代表成功或者失败的包装。 我们可以通过几种方式使用这个:如果我们只想要我们序列化的值, `DataResult#result` 会简单地返回一个包含我们值的 `Optional` ,而 `DataResult#resultOrPartial` 还允许我们提供一个函数来处理可能发生的任何错误。 后者对于自定义数据包资源尤其有用,因为我们想要记录错误,而不会在其他地方引起问题。 +`Codec.either` 将两个 codec `Codec` 和 `Codec` 组合为 `Codec>`。 产生的 codec 会在反序列化过程中尝试使用第一个 codec,并且_仅当失败时_才尝试使用第二个。 如果第二个也失败,则会返回第二个 codec 的错误。 -#### Map +#### Map{#maps} -对于处理具有任意键的 map,如 `HashMaps`,可以使用 `Codec.unboundedMap`。 引用 生成的 codec 将序列化为 JSON 对象,或当前 dynamic ops 可用的任何等效对象。 +要处理有任意键的 map,如 `HashMap`,可以使用 `Codec.unboundedMap`。 这将返回给定 `Codec` 和 `Codec` 的 `Codec>`。 生成的 codec 将序列化为 JSON 对象,或当前 dynamic ops 可用的任何等效对象。 -由于JSON和NBT的限制,使用的密钥Codec必须序列化为字符串。 这包含类型不是 string 但序列化为他们自身的 codec,例如 `Identifier.CODEC`。 在下面的示例中: 这包括类型自身不是字符串但会序列化为字符串的 codec,例如 `Identifier.CODEC`。 看看下面的例子: +由于 json 和 nbt 的限制,使用的键的 codec _必须_序列化为字符串。 这包括类型自身不是字符串但会序列化为字符串的 codec,例如 `Identifier.CODEC`。 看看下面的例子: ```java // 创建一个 Identifier 到 Integer 的 map 的 codec @@ -242,11 +243,11 @@ DataResult result = mapCodec.encodeStart(JsonOps.INSTANCE, Map.of( } ``` -正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以这样做有效。 正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以可以工作。 对于无法序列化为字符串的简单对象,可以使用[XMAP及其友元](#mutually-convertible-types-and-you)进行转换,从而实现类似的效果。 +正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以这样做有效。 对于无法序列化为字符串的简单对象,可以使用[xmap 及其友元](#mutually-convertible-types)进行转换,从而实现类似的效果。 -### 相互可转换的类型与您 +### 相互可转换的类型{#mutually-convertible-types} -#### `xmap` +#### `xmap`{#xmap} 我们有两个可以互相转换的类,但没有继承关系。 例如,原版的 `BlockPos` 和 `Vec3d`。 如果我们有其中一个 codec,我们可以使用 `Codec#xmap` 创建一个双向的特定转换函数。 @@ -265,14 +266,12 @@ Codec blockPosCodec = Vec3d.CODEC.xmap( // 并且使用在您的 `xmap` 调用中使用方法引用 ``` -#### flatComapMap、comapFlatMap 与 flatXMap +#### flatComapMap、comapFlatMap 与 flatXMap{#flatcomapmap-comapflatmap-flatxmap} -`flatComapMap`、`comapFlatMap` 与 `flatXMap` 类似于 xmap,但是他们允许一个或多个转换函数返回 DataResult。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 +`flatComapMap`、`comapFlatMap` 与 `flatXMap` 类似于 xmap,但允许一个或多个转换函数返回 DataResult。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 -以原版的 `Identifier` 为例。 以原版的 `Identifier` 为例。 以原版的 `Identifier` 为例。 虽然所有的标识符都可以转换为字符串,但并不是所有的字符串都是有效的标识符,所以使用 xmap 意味着当转换失败时会抛出不雅观的异常。 -正因为此,它的内置编解码器实际上是 `Codec.STRING` 上的一个 `comapFlatMap`,很好地说明了如何使用它: -正因为此,它的内置编解码器实际上是 `Codec.STRING` 上的一个 `comapFlatMap`,很好地说明了如何使用它: -正因为此,它的内置编解码器实际上是 `Codec.STRING` 上的一个 `comapFlatMap`,很好地说明了如何使用它: +以原版的 `Identifier` 为例。 虽然所有的 identifier 都可以转换为字符串,但并不是所有的字符串都是有效的 identifier,所以使用 xmap 意味着转换失败就会抛出难看的异常。 +正因此,其内置 codec 实际上是 `Codec.STRING` 上的 `comapFlatMap`,很好地说明了如何使用: ```java public class Identifier { @@ -289,7 +288,7 @@ public class Identifier { return DataResult.error("Not a valid resource location: " + id + " " + e.getMessage()); } } - + // ... } ``` @@ -303,7 +302,7 @@ public class Identifier { | `Codec#flatComapMap` | 是 | 否 | | `Codec#flatXMap` | 否 | 否 | -### 注册表分派 +### 注册表分派{#registry-dispatch} `Codec#dispatch` 让我们可以定义一个 codec 的注册表,并根据序列化数据中字段的值分派到一个特定的 codec。 当反序列化有不同字段的对象,而这些字段依赖于类型,但不同类型仍代表相同的事物时,这非常有用。 @@ -350,9 +349,11 @@ Codec beanCodec = beanTypeCodec.dispatch("type", Bean::getType, BeanType:: } ``` -### 递归Codec +### 递归 Codec{#recursive-codecs} + + +有时,使用_自身_来解码特定字段的 codec 很有用,例如在处理某些递归数据结构时。 在原版代码中,这用于 `Text` 对象,可能会存储其他的 `Text` 作为子对象。 可以使用 `Codec#recursive` 构建这样的 codec。 -有时,使用自身来解码特定字段的Codec很有用,例如在处理某些递归数据结构时。 在原始代码中,这用于`Text`对象,它可以将其他`Text`存储为子对象。 可以使用`Codec#recursive`构建这样的Codec。 在原版代码中,这用于 `Text` 对象,可能会存储其他的 `Text` 作为子对象。 可以使用 `Codec#recursive` 构建这样的 codec。 例如,让我们尝试序列化单链列表。 列表是由一组节点的表示的,这些节点既包含一个值,也包含对列表中下一个节点的引用。 然后列表由其第一个节点表示,遍历列表是通过跟随下一个节点来完成的,直到没有剩余节点。 以下是存储整数的节点的简单实现。 @@ -360,19 +361,21 @@ Codec beanCodec = beanTypeCodec.dispatch("type", Bean::getType, BeanType:: public record ListNode(int value, ListNode next) {} ``` -我们无法通过普通方法为此构建codec,因为我们会对`next`字段使用什么codec? 我们需要一个`Codec`,这就是我们正在构建的! `Codec#recursive` 让我们使用一个神奇的 lambda 来实现这一点: 我们需要一个 `Codec`,这就是我们还在构建的! 序列化与反序列化 + +我们无法通过普通方法为此构建 codec,因为对 `next` 字段要使用什么 codec? 我们需要一个 `Codec`,这就是我们还在构建的! `Codec#recursive` 能让我们使用看上去像魔法的 lambda 来达到这点。 + ```java Codec codec = Codec.recursive( "ListNode", // codec的名称 selfCodec -> { - // 这里,`selfCodec` 代表 `Codec`,就像它已经构造好了一样 - // 这个 lambda 应该返回我们从一开始就想要使用的codec, - // 通过`selfCodec`引用自身 + // 这里,`selfCodec` 代表 `Codec`,就像已经构造好了一样 + // 这个 lambda 应该返回我们从一开始就想要使用的 codec, + // 通过 `selfCodec` 引用自身 return RecordCodecBuilder.create(instance -> instance.group( Codec.INT.fieldOf("value").forGetter(ListNode::value), - // `next`字段将使用自编解码器递归处理 + // `next`字段将使用自己 codec 递归处理 Codecs.createStrictOptionalFieldCodec(selfCodec, "next", null).forGetter(ListNode::next) ).apply(instance, ListNode::new) ); @@ -396,5 +399,5 @@ Codec codec = Codec.recursive( ## 参考{#references} -- 关于编解码器及相关API的更全面的文档,可以在[非官方DFU JavaDoc](https://kvverti.github.io/Documented-DataFixerUpper/snapshot/com/mojang/serialization/Codec)中找到。 +- 关于 codec 及相关 API 的更全面的文档,可以在[非官方 DFU JavaDoc](https://kvverti.github.io/Documented-DataFixerUpper/snapshot/com/mojang/serialization/Codec) 中找到。 - 本指南的总体结构受到了 [Forge 社区 Wiki 关于 Codec 的页面](https://forge.gemwire.uk/wiki/Codecs)的重大启发,这是对同一主题的更具 Forge 特色的解读。 diff --git a/translated/zh_cn/develop/commands/arguments.md b/translated/zh_cn/develop/commands/arguments.md index c0ef3c77a..9d6cb7bdb 100644 --- a/translated/zh_cn/develop/commands/arguments.md +++ b/translated/zh_cn/develop/commands/arguments.md @@ -3,27 +3,27 @@ title: 命令参数 description: 学习如何创建带有复杂参数的命令。 --- -# 命令参数 +# 命令参数{#command-arguments} -大多数的命令都有参数。 有些时候他们是可选的,这意味着如果你不提供这些参数命令照样可以工作 一个节点可能有多种参数类型,此时有可能使用户困惑,请注意避免这个问题。 +大多数命令都使用了参数。 有时参数是可选的,也就是说如果你不提供此参数,命令仍能运行。 一个节点可以有多个参数类型,但是注意有可能出现二义性,这是需要避免的。 @[code lang=java highlight={3} transcludeWith=:::4](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -在这个情况里,在命令`/argtater`之后,您应该输入一个整型数字。 举个例子,如果您输入了`/argtater 3`,您应该会收到一条消息:`Called /argtater with value = 3`。 如果您输入了 `/argtataer` 并且没有任何参数,那么这个命令将不会被正确解析。 +在这个例子中,在命令文本 `/argtater` 之后,你需要输入一个整数。 例如,如果运行 `/argtater 3`,会收到消息 `Called /argtater with value = 3`。 如果你输入 \`/argtater 不带参数,命令无法正确解析。 接下来我们将添加第二个可选的参数: @[code lang=java highlight={3,13} transcludeWith=:::5](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -现在您可以输入一个或者两个整型数字了。 如果您提供了一个整型数字,那么会打印单个值的反馈文本。 如果您提供了两个整型数字,那么会打印有两个值的反馈文本。 +现在你可以输入一个或者两个整数了。 如果提供了一个整数,那么会打印单个值的反馈文本。 如果提供了两个整数,那么会打印有两个值的反馈文本。 -您可能会发现没有必要指定两次相似的执行。 因此,我们可以创建一个方法同时用于两种执行。 +你可能发现,两次指定类似的执行内容有些不太必要。 因此,我们可以创建一个在两个执行中都使用的方法。 @[code lang=java highlight={3,5,6,7} transcludeWith=:::6](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -## 自定义参数类型 +## 自定义参数类型{#custom-argument-types} -如果原版并没有提供您想要的命令参数类型,您可以创建您自己的类型。 为此,您需要创建一个继承`ArgumentType < T >` 接口的类,其中 `T` 是参数的类型。 +如果原版没有你想要的参数类型,可以自己创建一个。 为此,创建一个类并继承 `ArgumentType` 接口,其中 `T` 是参数的类型。 您需要实现 `parse` 这个方法,这个方法会把输入的字符串解析为期望的类型。 @@ -31,26 +31,26 @@ description: 学习如何创建带有复杂参数的命令。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/command/BlockPosArgumentType.java) -### 注册自定义参数类型 +### 注册自定义参数类型{#registering-custom-argument-types} :::warning -您需要同时在服务端和客户端注册您的自定义参数类型,否则您的命令将不会工作! +您需要在服务端和客户端都注册自定义参数类型,否则命令不会生效! ::: -您可以在您的模组的初始化方法 `onInitialize` 中使用 `ArgumentTypeRegistry` 类来注册: +您可以在你的模组的初始化方法 `onInitialize` 中使用 `ArgumentTypeRegistry` 类来注册: @[code lang=java transcludeWith=:::11](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -### 使用自定义参数类型 +### 使用自定义参数类型{#using-custom-argument-types} 我们可以在命令中使用我们的自定义参数类型──通过在 command builder 中传递实例到 `.argument` 方法。 @[code lang=java transcludeWith=:::10 highlight={3}](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -运行命令,我们可以测试我们的参数类型是否可以正常工作: +运行命令,我们可以测试参数类型是否生效: -![Invalid argument](/assets/develop/commands/custom-arguments_fail.png) +![无效参数](/assets/develop/commands/custom-arguments_fail.png) -![Valid argument](/assets/develop/commands/custom-arguments_valid.png) +![有效参数](/assets/develop/commands/custom-arguments_valid.png) -![Command result](/assets/develop/commands/custom-arguments_result.png) +![命令结果](/assets/develop/commands/custom-arguments_result.png) diff --git a/translated/zh_cn/develop/commands/basics.md b/translated/zh_cn/develop/commands/basics.md index dc1f259cc..683900be2 100644 --- a/translated/zh_cn/develop/commands/basics.md +++ b/translated/zh_cn/develop/commands/basics.md @@ -21,18 +21,20 @@ authors: 创建命令可以允许模组开发者添加一些可以通过命令使用的功能。 这个指南将会教会你如何注册命令和 Brigadier 的一般命令结构。 -:::info -Brigadier是一款由Mojang为Minecraft编写的命令解析器和调度器。 它是一款基于树的命令库,让您可以通过构建树的方式来构建您的命令和参数。 Brigadier是开源的: -::: +::: info +Brigadier is a command parser and dispatcher written by Mojang for Minecraft. It is a tree-based command library where +you build a tree of commands and arguments. + +Brigadier 是开源的:https://github.com/Mojang/brigadier -## `Command` 接口 +## `Command` 接口{#the-command-interface} -`com.mojang.brigadier.Command` 是一个可以执行指定行为的函数式接口, 并且在某些情况下会抛出 `CommandSyntaxException` 异常。 它有一个泛型参数 `S`,定义了_命令来源_的类型。 -命令来源提供了命令运行的上下文。 在 Minecraft 中,命令来源通常是代表服务器的 `ServerCommandSource`,命令方块,远程连接(RCON),玩家或者实体。 +`com.mojang.brigadier.Command` 是一个可以执行指定行为的函数式接口,在某些情况下会抛出 `CommandSyntaxException` 异常。 命令有一个泛型 `S`,定义了_命令来源_的类型。 +命令来源提供了命令运行的上下文。 在 Minecraft 中,命令来源通常是 `ServerCommandSource`,代表服务器、命令方块、远程连接(RCON)、玩家或者实体。 -`Command` 中的单个方法 `run(CommandContext)` 将 `CommandContext` 作为唯一参数并返回一个整型数字。 命令上下文持有来自 `S` 命令来源类型并允许您获取参数,查看解析的命令节点并查看此命令中使用的输入。 +`Command` 中的单个方法 `run(CommandContext)`,接收一个 `CommandContext` 作为唯一参数,并返回一个整数。 命令上下文存储命令来源 `S`,并允许你获取参数、查看已解析的命令节点,并查看此命令中使用的输入。 -像是其他的函数式接口,它一般用作 lambda 或者方法引用: +就像其他的函数型接口那样,命令通常用作 lambda 或者方法引用: ```java Command command = context -> { @@ -40,125 +42,120 @@ Command command = context -> { }; ``` -该整型数字可以被认为是命令的执行结果。 通常,小于或等于零的值表示命令失败并将继续执行并且什么也不做。 大于零的值则意味着命令被成功执行并做了某些事情。 Brigadier 提供了一个常量来表示执行成功: `Command#SINGLE_SUCCESS`。 +这个整数相当于命令的结果。 通常,小于或等于零的值表示命令失败,什么也不做。 正数则表示命令执行成功并做了一些事情。 Brigadier 提供了一个常量来表示执行成功:`Command#SINGLE_SUCCESS`。 -### `ServerCommandSource` 可以做什么? +### `ServerCommandSource` 可以做什么? {#what-can-the-servercommandsource-do} -当执行时 `ServerCommandSource` 提供了一些额外的特殊实现的上下文。 它有获得执行命令的实体、在哪个世界运行或者在哪个服务器上运行的能力。 +`ServerCommandSource` 提供了命令运行时的一些额外的上下文,有特定实现, 包括获取运行这个命令的实体、命令执行时所在的世界以及服务器。 -您可以通过在 `CommandContext` 实例上调用 `getSource()` 方法来获得命令上下文中的命令源。 +可以通过在 `CommandContext` 实例上调用 `getSource()` 方法来获得命令上下文中的命令来源。 ```java Command command = context -> { - ServerCommandSource source = context.getSource(); + ServerCommandSource source = context.getSource(); return 0; }; ``` -## 注册一个基本命令 +## 注册一个基本命令{#registering-a-basic-command} 可以通过 Fabric API 提供的 `CommandRegistrationCallback` 来注册命令 。 :::info -更多注册回调的信息,请查看 [事件](../events) 指南。 +关于如何注册回调,请查看[事件](../events) 指南。 ::: -该事件应该在您的 mod 的初始化程序中注册。 +这个事件必须在你的模组的初始化器中注册。 -回调一共有三个参数: +这个回调有三个参数: -- `CommandDispatcher dispatcher` - 用于注册,解析,执行命令。 `S` 是分发器支持的命令源类型。 -- `CommandRegistryAccess registryAccess` - 为可传递给某些命令参数方法的注册表提供一个抽象概念 -- `CommandManager.RegistrationEnvironment environment` - 标识注册命令的服务器类型。 +- `CommandDispatcher dispatcher` - 用于注册、解析和执行命令。 `S` 是命令派发器支持的命令源的类型。 +- `CommandRegistryAccess registryAccess` - 为可能传入特定命令参数的注册表提供抽象方法 +- `CommandManager.RegistrationEnvironment environment` - 识别命令将要注册到的服务器的类型。 -在 mod 初始化程序中,我们只注册两个简单的命令: +在模组的初始化器中,我们只注册两个简单的命令: @[code lang=java transcludeWith=:::_1](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -在 `sendFeedback()` 方法之中,第一个参数是要发送的文本, 并且这是一个 `Supplier` 可以用于避免在不必要的时候实例化 Text 对象。 +在 `sendFeedback()` 方法之中,第一个参数是要发送的文本, 是 `Supplier`,以避免在不必要时实例化 Text 对象。 -第二个参数决定是否广播反馈给其他的管理员。 一般来讲,如果一个命令只是查询一些东西而不会改变世界,比如说查询世界的时间或者玩家的分数,它应该是 `false` 的。 如果一个命令做了一些事情,比如说改变时间或者修改一些人的分数,它应该是 `true`。 +第二个参数决定是否广播反馈给其他的管理员。 一般来讲,如果命令是查询一些东西而不实际改变世界,比如查询世界的时间或者玩家的分数,则应该是 `false`。 如果命令实际上做了些事情,例如改变时间或者修改一些人的分数,则应该是 `true`。 -如果一个命令失败了,您可以直接抛出任何异常而不是调用 `sendFeedback()`,服务器会妥善处理。 +如果命令失败,可以不必调用 `sendFeedback()`,而是直接抛出任何异常,服务器和客户端会适当处理。 -通常抛出 `CommandSyntaxException` 异常来指示语法异常或者参数异常。 你也可以实现一个专属的异常类型。 +通常抛出 `CommandSyntaxException` 异常来指示命令或参数中的语法错误。 你也可以实现你自己的异常。 -为了执行这个命令,您必须输入大小写敏感的 `/foo`。 +要执行这个命令,必须 `/foo`,这是大小写敏感的。 -### 注册环境 +### 注册环境{#registration-environment} -如果需要,您还可以确保仅在某些特定情况下注册命令,例如仅在专用环境中: +如有需要,你可以确保命令仅在一些特定情况下注册,例如仅在专用的环境中: @[code lang=java highlight={2} transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -### 命令需求 +### 命令要求{#command-requirements} -假设您有一个只希望管理员可以执行的命令。 有一个 `requires()` 方法可以做到这一点。 `requires()` 方法有一个 `Predicate` 参数,它将提供一个 `ServerCommandSource` 测试并确定 `CommandSource` 是否可以执行该命令。 +假如说你希望命令只有管理员可以执行, 这时就要用到 `requires()` 方法。 `requires()` 方法有一个 `Predicate` 参数,提供一个 `ServerCommandSource` 以检测并确定 `CommandSource` 能否执行命令。 @[code lang=java highlight={3} transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -这个命令只会在命令源至少为 2 级管理员(包括命令方块)时才会执行。 在其他情况下,命令并不会被注册。 +这个命令只会在命令源至少为 2 级管理员(包括命令方块)时才会执行, 否则,命令不会被注册。 -这样做的副作用是不会向不具备 2 级管理员的人显示此命令。 这也是您为什么在未开启作弊模式的情况下不能使用 tab 补全绝大多数命令的原因。 +这样做的副作用就是,非 2 级管理员会看到命令不会被 tab 补全, 这也就是为什么没有启用作弊时不能够 tab 补全大多数命令。 -### 子命令 +### 子命令{#sub-commands} -要添加子命令,通常需要注册该命令的第一个字面量节点。 为了添加一个子命令,您必须将下一个字面量节点添加到一个已经存在的节点上。 +要添加子命令,你需要先照常注册第一个字面节点。 为拥有子命令,需要把下一个节点追加到已经存在的节点后面。 @[code lang=java highlight={3} transcludeWith=:::7](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -类似参数,子命令也可被设置为可选。 在以下情况下,`/subtater` 和 `/subtater subcommand` 都是有效的。 +类似于参数,子命令节点也可以设置为可选的。 在下面这个例子中,`/subtater` 和 `/subtater subcommand` 都是有效的。 @[code lang=java highlight={2,8} transcludeWith=:::8](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -## 客户端命令 +## 客户端命令{#client-commands} -Fabric API 有一个存在于 `net.fabricmc.fabric.api.client.command.v2` 包中的 `ClientCommandManager`,可以帮助您注册客户端端的命令。 代码应当仅存在于客户端端的代码中。 +Fabric API 有个 `ClientCommandManager`,位于 `net.fabricmc.fabric.api.client.command.v2` 包中,可用于注册客户端命令。 代码应该仅存在于客户端的代码中。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) -## 命令重定向 +## 命令重定向{#command-redirects} 命令重定向(也称为别名)是将一个命令的功能重定向到另一个命令的方法。 这在您想更改命令名称但仍希望支持旧名称时非常有用。 @[code lang=java transcludeWith=:::12](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) -## 常见问题 +## 常见问题{#faq} -
+### 为什么我的代码为什么不编译? {#why-does-my-code-not-compile} -### 为什么我的代码不可以被编译? +- 捕捉或抛出 `CommandSyntaxException` - `CommandSyntaxException` 不是 `RuntimeException`, 如果抛出,则抛出的地方所在方法必须在方法签名中也抛出 `CommandSyntaxException`,或者捕获。 + Brigadier 会处理已检查的异常,并在游戏内为你转发适当的错误消息。 -- 捕捉或者抛出 `CommandSyntaxException` - `CommandSyntaxException` 并不是一个 `RuntimeException`。 如果你抛出了它, 抛出它的地方应该是在方法签名中抛出 `CommandSyntaxException` 的方法中,或者被捕获。 - Brigadier 将处理已检查的异常并为您转发游戏中正确的错误消息。 如果抛出异常, - 那么应该在方法签名中声明该方法会抛出 `CommandSyntaxException`,或者应该对其进行捕获处理。 - Brigadier 将处理已检查的异常并为您转发游戏中正确的错误消息。 +- 泛型问题 -你可能遇到了泛型问题。 如果你在注册服务器命令(大多数情况都是如此),确保你在静态导入中使用 `CommandManager.literal` 或 `CommandManager.argument` 而不是`LiteralArgumentBuilder.literal` 或 `RequiredArgumentBuilder.argument`。 -- 泛型问题──您可能有时候会遇到泛型的问题。 泛型问题──您可能有时候会遇到泛型的问题。 如果您要注册服务器命令(大多数情况),请确保使用 `CommandManager.literal` 或者 `CommandManager.argument` 而不是 `LiteralArgumentBuilder.literal` 或者 `RequiredArgumentBuilder.argument`。 +- 检查 `sendFeedback()` 方法 - 你可能忘记了提供第二个参数(一个布尔值)。 还需要注意,从 Minecraft 1.20 开始,第一个参数是 `Supplier` 而不是 `Text`。 -- 检查 `sendFeedback()` 方法 - 您可能忘记提供布尔值作为第二个参数。 检查 `sendFeedback()` 方法 - 您可能忘记提供布尔值作为第二个参数。 请您谨记,自从 Minecraft 1.20 版本开始, 第一个参数是类型 `Supplier` 而不是 `Text`。 +- 命令应该返回整数:注册命令时,`executes()` 方法接受一个 `Command` 对象,通常是 lambda。 这个 lambda 应该返回整数,而不是其他的类型。 -- 命令应当返回一个整型数字 - 注册命令时,`executes()` 方法接受一个 `Command` 对象,该对象通常是 lambda。 lambda 应该返回一个整型数字,而不是其他类型。 lambda 应该返回一个整型数字,而不是其他类型。 - -### 我可以在运行时注册命令吗? +### 可以运行时注册命令吗? {#can-i-register-commands-at-runtime} ::: warning You can do this, but it is not recommended. You would get the `CommandManager` from the server and add anything commands you wish to its `CommandDispatcher`. -之后,需要使用 `CommandManager.sendCommandTree(ServerPlayerEntity)` 将命令树再次发送给每个玩家。 +然后需要通过 `CommandManager.sendCommandTree(ServerPlayerEntity)` 向每个玩家再次发送命令树。 -这是必须的,因为客户端只会在玩家登录时本地缓存命令树(或者发送操作包时)以完成丰富的错误信息补全。 +这是必需的,因为客户端已经缓存了命令树并在登录过程中(或发出管理员数据包时)使用,以用于本地的补全和错误消息。 ::: -### 我可以在运行时注销命令吗? +### 可以在运行时取消注册命令吗? {#can-i-unregister-commands-at-runtime} ::: warning You can also do this, however, it is much less stable than registering commands at runtime and could cause unwanted side effects. -为了保持事情简单,你需要对 Brigadier 使用反射来移除节点。 为了保持事情简单,你需要对 Brigadier 使用反射来移除节点。 在那之后,您需要使用 `sendCommandTree(ServerPlayerEntity)` 将命令树再次发送给所有玩家。 +为简化事情,你需要在 brigadier 中使用反射并移除这个节点, 然后还需要再次使用 `sendCommandTree(ServerPlayerEntity)` 向每个玩家发送命令树。 -如果您不发送更新后的命令树,客户端可能认为命令依然存在,即使服务器会执行失败。 -::: +如果不发送更新的命令树,客户端可能还是会认为命令依然存在,即使服务器无法执行。 ::: diff --git a/translated/zh_cn/develop/commands/suggestions.md b/translated/zh_cn/develop/commands/suggestions.md index 69f21159a..56914076e 100644 --- a/translated/zh_cn/develop/commands/suggestions.md +++ b/translated/zh_cn/develop/commands/suggestions.md @@ -1,45 +1,45 @@ --- -title: 命令提示 -description: 学习如何向用户提示命令参数的值。 +title: 命令建议 +description: 学习如何向用户建议命令参数的值。 authors: - IMB11 --- -# 命令提示 +# 命令建议{#command-suggestions} -Minecraft 有一个使用在了很多地方的十分强大的命令建议系统,比如说 `/give` 命令。 该系统允许您向用户提示命令参数的值,然后他们可以从中选择 —— 这是使您的命令更加用户友好且符合人体工学的好办法。 该系统允许您向用户提示命令参数的值,然后他们可以从中选择 —— 这是使您的命令更加用户友好且符合人体工学的好办法。 +Minecraft 有个强大的命令建议系统,用在很多地方,例如 `/give` 命令中。 该系统允许您向用户建议命令参数的值,然后他们可以从中选择——这是使你的命令更加用户友好且用起来舒适的好办法。 -## 提示提供器 +## 建议提供器{#suggestion-providers} -提示所有可用的战利品表。 `SuggestionProvider` 用于创建发送给客户端的提示列表。 提示提供器是一个函数式接口,它使用 `CommandContext` 和 `SuggestionBuilder` 并返回 `Suggestions`。 `SuggestionProvider` 返回 `CompletableFuture` 因为提示可能不会立即可用。 `SuggestionProvider` 返回 `CompletableFuture` 因为提示可能不会立即可用。 +`SuggestionProvider` 用于制作将会发送至客户端的建议的列表。 建议提供器是一个函数式接口,接收一个 `CommandContext` 和 `SuggestionBuilder` 并返回 `Suggestions`。 `SuggestionProvider` 返回 `CompletableFuture`,因为这些建议并不一定立即可用。 -## 使用提示提供器 +## 使用建议提供器{#using-suggestion-providers} -要使用提示提供器,您可以在参数构造器上调用 `suggests` 方法。 此方法接受一个 `SuggestionProvider`,返回一个新的参数构造器,并附加提示提供器。 此方法接受一个 `SuggestionProvider`,返回一个新的参数构造器,并附加提示提供器。 +要使用建议提供器,你需要在 argument builder 中调用 `suggests` 方法。 此方法接收一个 `SuggestionProvider`,返回一个附加了新的建议提供器的 argument builder。 @[code java transcludeWith=:::9 highlight={4}](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -## 内建的提示提供器 +## 内置的建议提供器{#built-in-suggestion-providers} -您可以使用一些内建的提示提供器: +你可以使用一些内置的建议提供器: -| 提示提供器 | 描述 | +| 建议提供器 | 描述 | | ----------------------------------------- | ------------ | -| `SuggestionProviders.SUMMONABLE_ENTITIES` | 提示所有可被召唤的实体。 | -| `SuggestionProviders.AVAILABLE_SOUNDS` | 提示所有可被播放的声音。 | -| `LootCommand.SUGGESTION_PROVIDER` | 提示所有可用的战利品表。 | -| `SuggestionProviders.ALL_BIOMES` | 提示所有可用的生物群系。 | +| `SuggestionProviders.SUMMONABLE_ENTITIES` | 建议所有可召唤的实体。 | +| `SuggestionProviders.AVAILABLE_SOUNDS` | 建议所有可播放的声音。 | +| `LootCommand.SUGGESTION_PROVIDER` | 建议所有可用的战利品表。 | +| `SuggestionProviders.ALL_BIOMES` | 建议所有可用的生物群系。 | -## 创建一个自定义的提示提供器 +## 创建自定义的建议提供器{#creating-a-custom-suggestion-provider} -如果内建的提供器无法满足您的需要,您可以创建您自己的提示提供器。 为此,您需要创建一个实现 `SuggestionProvider` 接口的类,并重写 `getSuggestions` 方法。 为此,您需要创建一个实现 `SuggestionProvider` 接口的类,并重写 `getSuggestions` 方法。 +如果内置的建议提供器无法满足你的需要,可以创建自己的建议提供器。 为此,需要创建一个实现 `SuggestionProvider` 接口的类,并重写 `getSuggestions` 方法。 -对此示例,我们需要制作一个提示提供器提示所有在服务器上的玩家的名称。 +对此示例,我们需要制作一个建议提供器,建议所有在服务器上的玩家的名称。 @[code java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/command/PlayerSuggestionProvider.java) -要使用该提示提供器,您只需将它的实例传递到参数构造器的 `.suggests` 方法。 +要使用这个建议提供器,只需将一个实例传递到参数构造器的 `.suggests` 方法。 -显然,建议提供者可能更复杂,因为它们还可以读取命令上下文以根据命令的状态(例如已经提供的参数)提供建议。 +显然,建议提供器能够更复杂,因为还可以读取命令上下文以根据命令的状态(例如已经提供的参数)提供建议。 这可以是读取玩家的背包或提示玩家附近的物品或实体的形式。 diff --git a/translated/zh_cn/develop/entities/damage-types.md b/translated/zh_cn/develop/entities/damage-types.md index ba20b6ebb..82b39025b 100644 --- a/translated/zh_cn/develop/entities/damage-types.md +++ b/translated/zh_cn/develop/entities/damage-types.md @@ -7,23 +7,23 @@ authors: - mattidragon --- -# 伤害类型 +# 伤害类型{#damage-types} -有些伤害类型能够无视护甲,无视状态效果等等。 伤害类型的这些属性是由标签控制的。 有些伤害类型能够无视护甲,无视状态效果等等。 伤害类型的这些属性是由标签控制的。 伤害类型定义了实体能受到的伤害的种类。 从 Minecraft 1.19.4 开始,创建新的伤害类型的方式已经变为数据驱动的,也就是说它们由 JSON 文件创建。 +伤害类型定义了实体能受到的伤害的种类。 从 Minecraft 1.19.4 开始,创建新的伤害类型的方式已是数据驱动,也就是说由 JSON 文件创建。 -## 创建一种伤害类型 +## 创建伤害类型{#creating-a-damage-type} -让我们创建一种叫 _土豆_ 的伤害类型。 让我们创建一种叫 _土豆_ 的伤害类型。 我们先从为你的自定义伤害创建 JSON 文件开始。 这个文件将被放在你的模组的 `data` 目录下的 `damage_type` 子目录。 这个文件将被放在你的模组的 `data` 目录下的 `damage_type` 子目录。 +让我们创建一种叫 _土豆_ 的伤害类型。 我们先从为你的自定义伤害创建 JSON 文件开始。 这个文件放在你的模组的 `data` 目录下的 `damage_type` 子目录。 ```:no-line-numbers resources/data/fabric-docs-reference/damage_type/tater.json ``` -它有以下的结构: +其结构如下: @[code lang=json](@/reference/latest/src/main/generated/data/fabric-docs-reference/damage_type/tater.json) -这个自定义伤害类型在玩家每次受到来自非玩家的生物(例:方块)造成的伤害时增加 0.1 [消耗度](https://zh.minecraft.wiki/w/饥饿#饥饿因素)。 此外,造成的伤害量将随存档难度而变化。 此外,造成的伤害量将随存档难度而变化。 此外,造成的伤害量将随存档难度而变化。 +这个自定义伤害类型在玩家每次受到来自非玩家的生物(例:方块)造成的伤害时增加 0.1 [消耗度](https://zh.minecraft.wiki/w/饥饿#饥饿因素)。 此外,造成的伤害量将随世界难度而变化。 ::: info @@ -31,17 +31,17 @@ resources/data/fabric-docs-reference/damage_type/tater.json ::: -### 通过代码访问伤害类型 +### 通过代码访问伤害类型{#accessing-damage-types-through-code} -当我们需要在代码中访问我们的自定义伤害类型时,我们将用它的 `RegistryKey` 来创建一个 `DamageSource` 实例。 +当需要在代码中访问我们的自定义伤害类型时,可以用它的 `RegistryKey` 来创建一个 `DamageSource` 实例。 -所需的 `RegistryKey` 可用以下方式获取: +这个 `RegistryKey` 可用以下方式获取: @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/damage/FabricDocsReferenceDamageTypes.java) -### 使用伤害类型 +### 使用伤害类型{#using-damage-types} -为了演示自定义伤害类型如何使用,我们将使用一个自定义方块 _土豆块_ 。 让我们实现当生物踩在 _土豆块_ 上时,它会对生物造成 _土豆_ 伤害。 +为了演示自定义伤害类型如何使用,我们将使用一个自定义方块 _土豆块_ 。 让我们实现生物踩在 _土豆块_ 上时会造成 _土豆_ 伤害。 你可以重写 `onSteppedOn` 方法来造成这个伤害。 @@ -49,7 +49,7 @@ resources/data/fabric-docs-reference/damage_type/tater.json @[code lang=java transclude={21-24}](@/reference/latest/src/main/java/com/example/docs/damage/TaterBlock.java) -然后,我们调用 `entity.damage()` 并传入 我们的 `DamageSource` 和伤害量。 +然后,调用 `entity.damage()` 并传入我们的 `DamageSource` 和伤害量。 @[code lang=java transclude={25-25}](@/reference/latest/src/main/java/com/example/docs/damage/TaterBlock.java) @@ -57,9 +57,9 @@ resources/data/fabric-docs-reference/damage_type/tater.json @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/damage/TaterBlock.java) -现在,每当生物踩在我们的自定义方块上时,它将受到使用我们的自定义伤害类型的 5 点伤害(2.5 颗心)。 +现在,每当生物踩在我们的自定义方块上时,都将受到使用我们的自定义伤害类型的 5 点伤害(2.5 颗心)。 -### 自定义死亡信息 +### 自定义死亡消息{#custom-death-message} 你可以在你的模组的 `en_us.json` 文件中以 `death.attack.` 的格式定义伤害类型的死亡信息。 @@ -69,9 +69,9 @@ resources/data/fabric-docs-reference/damage_type/tater.json ![玩家物品栏内的效果](/assets/develop/tater-damage-death.png) -### 伤害类型标签 +### 伤害类型标签{#damage-type-tags} -有些伤害类型能够无视护甲,无视状态效果等等。 伤害类型的这些属性是由标签控制的。 +有些伤害类型能够无视护甲、无视状态效果等等。 伤害类型的这些属性是由标签控制的。 你可以在 `data/minecraft/tags/damage_type` 中找到既有的伤害类型标签。 @@ -83,7 +83,7 @@ resources/data/fabric-docs-reference/damage_type/tater.json 让我们把我们的土豆伤害类型加入伤害类型标签 `bypasses_armor`。 -为了把我们的伤害类型加入这些标签,我们需要在 `minecraft` 命名空间下创建一个 JSON 文件。 +要将我们的伤害类型加入这些标签,需要在 `minecraft` 命名空间下创建一个 JSON 文件。 ```:no-line-numbers data/minecraft/tags/damage_type/bypasses_armor.json diff --git a/translated/zh_cn/develop/entities/effects.md b/translated/zh_cn/develop/entities/effects.md index 805cd3ca4..73727f1e2 100644 --- a/translated/zh_cn/develop/entities/effects.md +++ b/translated/zh_cn/develop/entities/effects.md @@ -12,59 +12,53 @@ authors-nogithub: - tao0lu --- -# 状态效果 +# 状态效果{#status-effects} -状态效果,又称效果,是一种可以影响实体的条件。 它们的性质可以是正面的,负面的或者中性的。 游戏本体通过许多不同的方式应用这些效果,如食物和药水等等。 +状态效果,又称效果,是一种可以影响实体的状况, 可以是正面、负面或中性的。 游戏本体通过许多不同的方式应用这些效果,如食物和药水等等。 -命令 `/effect` 可被用于给实体应用效果。 +命令 `/effect` 可用来给实体应用效果。 -## 自定义状态效果 +## 自定义状态效果{#custom-status-effects} -在这篇教程中我们将加入一个叫 _土豆_ 的新状态效果,它会每游戏刻给你 1 点经验。 +在这篇教程中我们将加入一个叫 _土豆_ 的新状态效果,每游戏刻给你 1 点经验。 -### 继承 `StatusEffect` +### 继承 `StatusEffect`{#extend-statuseffect} 让我们通过继承所有状态效果的基类 `StatusEffect` 来创建一个自定义状态效果类。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/TaterEffect.java) -### 注册你的自定义状态效果 +### 注册你的自定义状态效果{#registering-your-custom-effect} -与注册方块和物品类似,我们使用 `Registry.register` 将我们的自定义状态效果注册到 `STATUS_EFFECT` 注册表。 这可以在我们的模组入口点内完成。 这可以在我们的模组入口点内完成。 +与注册方块和物品类似,我们使用 `Registry.register` 将我们的自定义状态效果注册到 `STATUS_EFFECT` 注册表。 这可以在我们的初始化器内完成。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/effect/FabricDocsReferenceEffects.java) -### 本地化与纹理 +### 纹理{#texture} -您可以为您的状态效果指定名称并提供一个纹理(texture)图标,这将显示在玩家背包中。 - -#### **纹理** - -状态效果图标是 18x18 的 PNG。 将您的自定义图标放在: 将您的自定义图标放在: +状态效果的图片是一个 18x18 的 PNG,显示在玩家的背包中。 将你的自定义图标放在: ```:no-line-numbers resources/assets/fabric-docs-reference/textures/mob_effect/tater.png ``` -![在玩家背包中的效果](/assets/develop/tater-effect.png) - -#### **翻译** + -像其它翻译一样,您可以添加一个 ID 格式的条目 `"effect..": "Value"` 到语言文件中。 +### 翻译{#translations} -::: code-group +像其它翻译一样,你可以在语言文件中添加一个 ID 格式的条目 `"effect..": "Value"`。 -```json[assets/fabric-docs-reference/lang/en_us.json] +```json { "effect.fabric-docs-reference.tater": "Tater" } ``` -### 测试 +### 测试{#testing} 使用命令 `/effect give @p fabric-docs-reference:tater` 为玩家提供 Tater 效果。 -使用命令 `/effect give @p fabric-docs-reference:tater` 为玩家提供 Tater 效果。 使用 `/effect clear` 移除该效果。 +使用 `/effect clear @p fabric-docs-reference:tater` 移除效果。 -::: info +:::info 要创建使用此效果的药水,请参阅[药水](../items/potions)指南。 ::: diff --git a/translated/zh_cn/develop/events.md b/translated/zh_cn/develop/events.md new file mode 100644 index 000000000..cf8a449ba --- /dev/null +++ b/translated/zh_cn/develop/events.md @@ -0,0 +1,122 @@ +--- +title: 事件 +description: Fabric API 提供的事件的使用指南。 +authors: + - dicedpixels + - mkpoli + - daomephsta + - solidblock + - draylar + - jamieswhiteshirt + - PhoenixVX + - Juuxel + - YanisBft + - liach + - natanfudge +authors-nogithub: + - stormyfabric +--- + +# 事件{#events} + +Fabric API 提供了一个系统,允许模组对行为或发生的事(也被定义为游戏中发生的_事件_)做出反应。 + +事件是一种 Hook ,可满足常见的使用情况,并且增强和优化多个模组间对于同一代码区间的 Hook 的兼容性。 使用事件往往就可以替代 mixin 的使用。 + +Fabric API 为 Minecraft 代码库中的重要区域提供事件,许多模组制作者可能有兴趣将其接入。 + +事件由 `net.fabricmc.fabric.api.event.Event` 实例表示,该实例存储并调用_回调(CallBack)_。 一个回调通常只有一个事件实例,存储在回调接口的静态字段 `EVENT` 中,但也有其他可能。 例如,`ClientTickEvents` 会为多个相关连的事件分组。 + +## 回调{#callbacks} + +回调是作为参数传递给事件的一段代码。 当游戏触发事件时,将执行所传递的代码。 + +### 回调接口{#callback-interfaces} + +每个事件都有一个对应的回调接口,通常命名为 `Callback`。 回调是通过在事件实例上调用 `register()` 方法注册的,其参数为一个回调接口的实例。 + +Fabric API 提供的所有事件回调接口,可见 `net.fabricmc.fabric.api.event` 包。 + +## 监听事件{#listening-to-events} + +这个例子注册一个 `AttackBlockCallback`,当玩家徒手击打不掉落物品的方块时,伤害玩家。 + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/event/FabricDocsReferenceEvents.java) + +### 将物品添加到已存在的战利品表{#adding-items-to-existing-loot-tables} + +有时,你可能需要向战利品表中添加物品。 例如,为原版方块或实体添加掉落物。 + +最简单的解决方案是替换战利品表文件,但这可能会破坏其他模组的兼容性: 如果他们也想修改呢? 让我们来看看如何在不覆盖战利品表的情况下将物品添加到战利品表中。 + +我们将会把添加鸡蛋到煤炭矿石的战利品表里。 + +#### 监听战利品表加载{#listening-to-loot-table-loading} + +Fabric API 有一个在加载战利品表时触发的事件,即 `LootTableEvents.MODIFY`。 你可以在模组初始化入口点中为它注册一个回调。 我们还要检查一下监听的战利品表是否是煤炭矿石战利品表。 + +@[code lang=java transclude={38-40}](@/reference/latest/src/main/java/com/example/docs/event/FabricDocsReferenceEvents.java) + +#### 将物品添加到战利品表{#adding-items-to-the-loot-table} + +在战利品表中,物品存储在_战利品池条目_,条目存储在_战利品池_。 要添加物品,我们需要在战利品表中添加一个带有物品条目的池。 + +我们可以使用 `LootPool#builder` 来创建一个战利品池,并将其添加到战利品表中。 + +我们的战利品池中没有任何项目,因此我们将使用 `ItemEntry#builder` 创建一个物品条目,并将其添加到战利品池中。 + +@[code highlight={6-7} transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/event/FabricDocsReferenceEvents.java) + +## 自定义事件{#custom-events} + +游戏中某些区域并没有 Fabric API 提供的事件,因此需要使用 mixin 或者创建自己的事件。 + +我们将创建一个在羊剪毛时触发的事件。 创建事件的过程是: + +- 创建事件回调接口 +- 从 mixin 触发事件 +- 创建测试实现 + +### 创建事件回调接口{#creating-the-event-callback-interface} + +事件回调接口描述了您监听的事件必须实现哪些功能, 同时也描述了我们如何从 mixin 中调用这个事件。 通常在回调接口中创建一个 `Event` 字段作为我们实际事件的唯一标识符。 + +对于我们 `Event` 的实现,我们选择用数组来存储他们。 该数组将包含所有监听这个事件的监听器。 + +我们实现这个事件时,将依次调用这个数组中的所有监听器,直到某个监听器返回非 `ActionResult.PASS`。 这意味着一个监听器可以使用返回值表明“_取消_”、“_批准_”或者“_无所谓,交给下一个监听器处理_”。 + +使用 `ActionResult` 作为返回值是各个事件处理器之间的常规协作方式。 + +您将需要创建一个带有 `Event` 实例和响应实现方法的接口。 一个典型的剪羊毛回调像是这样: + +@[code lang=java transcludeWith=:::](@/reference/latest/src/main/java/com/example/docs/event/SheepShearCallback.java) + +让我们更深入地看看。 当 invoker 被调用时,我们将遍历所有监听器: + +@[code lang=java transclude={21-22}](@/reference/latest/src/main/java/com/example/docs/event/SheepShearCallback.java) + +然后在监听器上调用我们的方法(在本例中为 `interact`)来获取响应: + +@[code lang=java transclude={33-33}](@/reference/latest/src/main/java/com/example/docs/event/SheepShearCallback.java) + +如果监听器决定我们必须取消(`ActionResult.FAIL`)或者完成(`ActionResult.SUCCESS`)这个事件,回调将返回这个结果,并且结束循环。 `ActionResult.PASS` 将继续触发下一个监听器,并且在绝大多数没有注册多个监听器的情况下都应该返回 `ActionResult.SUCCESS`: + +@[code lang=java transclude={25-30}](@/reference/latest/src/main/java/com/example/docs/event/SheepShearCallback.java) + +我们可以在回调类的顶部添加 Javadoc 注释注明每一种 `ActionResult` 的作用。 在本例中,它应该是这样的: + +@[code lang=java transclude={9-16}](@/reference/latest/src/main/java/com/example/docs/event/SheepShearCallback.java) + +### 从 mixin 中触发事件{#triggering-the-event-from-a-mixin} + +我们现在有基本的事件框架了,但还需要触发它。 我们希望在玩家试图剪羊毛时调用事件,所以我们要在当 `SheepEntity#interactMob` 中的`sheared()` 被调用时去调用事件的 `invoker`(例如:羊可以被剪毛且玩家手持剪刀) + +@[code lang=java transcludeWith=:::](@/reference/latest/src/main/java/com/example/docs/mixin/event/SheepEntityMixin.java) + +### 创建测试实现{#creating-a-test-implementation} + +现在我们需要测试一下我们的事件。 你可以在初始化方法(如果需要,在其他区域也可以)中注册监听器,并在其中添加自定义逻辑。 这里有一个例子——羊的脚上掉落的不是羊毛,而是一颗钻石: + +@[code lang=java transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/event/FabricDocsReferenceEvents.java) + +如果你进入游戏并剪羊毛,掉落的应该是钻石而不是羊毛。 diff --git a/translated/zh_cn/develop/getting-started/creating-a-project.md b/translated/zh_cn/develop/getting-started/creating-a-project.md index a3a636323..2af4732ad 100644 --- a/translated/zh_cn/develop/getting-started/creating-a-project.md +++ b/translated/zh_cn/develop/getting-started/creating-a-project.md @@ -63,6 +63,6 @@ git clone https://github.com/FabricMC/fabric-example-mod/ my-mod-project - 修改项目的 `gradle.properties` 文件,把 `maven_group` 和 `archive_base_name` 修改为匹配你的模组的信息。 - 修改项目中的 `fabric.mod.json` 文件,把 `id`、`name` 和 `description` 修改为匹配你的模组的信息。 -- 确保修改你的项目的Minecraft的版本,映射,Fabric模组加载器和Fabric loom——所有这些都可以通过https://fabricmc.net/develop/查询,以匹配您希望的目标版本。 +- 确保更新 Minecraft、映射、Fabric Loader 和 Fabric Loom 的版本——所有这些都可以通过 https://fabricmc.net/develop/ 查询,以匹配你希望的目标版本。 你还可以修改包名和模组的主类来匹配你的模组的细节。 diff --git a/translated/zh_cn/develop/getting-started/setting-up-a-development-environment.md b/translated/zh_cn/develop/getting-started/setting-up-a-development-environment.md index b0ccf89e1..38b69bb85 100644 --- a/translated/zh_cn/develop/getting-started/setting-up-a-development-environment.md +++ b/translated/zh_cn/develop/getting-started/setting-up-a-development-environment.md @@ -22,9 +22,9 @@ authors-nogithub: 要开始使用 Fabric 开发模组,需要使用 IntelliJ IDEA 设置开发环境。 -## 安装 JDK 17{#installing-jdk-17} +## 安装 JDK 21 {#installing-jdk-21} -为 Minecraft 1.20.4 开发模组需要 JDK 17。 +为 Minecraft 1.21 开发模组,需要 JDK 21。 如果需要安装 Java 方面的帮助,可以参考[玩家指南部分](../../players/index)中的各种 Java 安装指南。 @@ -50,6 +50,6 @@ IntelliJ IDEA 的社区版是免费且开源的,是使用 Fabric 开发模组 Minecraft Development 插件为使用 Fabric 开发模组提供支持,是要安装的最重要的插件。 -如要安装,可以打开 IntelliJ IDEA,然后在搜索栏中导航到 `文件 > 设置 > 插件 > Marketplace T标签页` - 在搜索框中搜索 `Minecraft Development`,然后点击 `安装` 按钮。 +如要安装,可以打开 IntelliJ IDEA,然后在搜索栏中导航到 `文件 > 设置 > 插件 > Marketplace 标签页` - 在搜索框中搜索 `Minecraft Development`,然后点击 `安装` 按钮。 -或者你可以从[插件页面](https://plugins.jetbrains.com/plugin/8327-minecraft-development) 下载它,然后依次点击 `文件 > 设置 > 插件 > 从硬盘上安装插件` 来安装。 +或者你可以从[插件页面](https://plugins.jetbrains.com/plugin/8327-minecraft-development)下载,然后依次点击 `文件 > 设置 > 插件 > 从硬盘上安装插件` 来安装。 diff --git a/translated/zh_cn/develop/items/custom-armor.md b/translated/zh_cn/develop/items/custom-armor.md new file mode 100644 index 000000000..505e7bbfd --- /dev/null +++ b/translated/zh_cn/develop/items/custom-armor.md @@ -0,0 +1,146 @@ +--- +title: 自定义盔甲 +description: 学习如何创建自己的盔甲集。 +authors: + - IMB11 +--- + +# 自定义盔甲{#custom-armor} + +盔甲增强玩家的防御,抵御来自生物和其他玩家的攻击。 + +## 创建盔甲材料类{#creating-an-armor-materials-class} + +和类似于物品和方块类似,盔甲材料也需要注册。 为了组织好,我们创建一个 `ModArmorMaterials` 类存储我们的自定义盔甲材料。 + +需要为这个类添加一个静态的 `initialize()` 方法,并从模组的初始化器中调用,从而注册这些材料。 + +```java +// Within the ModArmorMaterials class +public static void initialize() {}; +``` + +:::warning +确保在注册你的物品**之前**调用这个方法,因为需要注册了材料才能创建物品。 +::: + +```java +@Override +public void onInitialize() { + ModArmorMaterials.initialize(); +} +``` + +--- + +在这个 `ModArmorMaterials` 类中,你还会需要创建一个静态方法,注册盔甲材料。 这个方块应该会返回材料的一个注册表项,因为这个项会用于 ArmorItem 的构造方法中创建盔甲物品。 + +@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/item/armor/ModArmorMaterials.java) + +## 盔甲材料属性{#armor-material-properties} + +:::tip +如果不清楚这些属性的哪些值合适的话,考虑看看 `ArmorMaterials` 中的原版盔甲材料。 +::: + +创建盔甲材料时,你会需要定义以下属性: + +### 防御点{#defense-points} + +:::warning +确保为创建的每种盔甲部分的类型都赋一个值,并注册为物品。 如果为盔甲部分制作物品但没有设置防御点值,游戏会崩溃。 +::: + +`defensePoints` 映射用于定义每个盔甲物品会提供的防御点的数量。 数字越高,盔甲部分提供的保护越多。 这个映射应该包含每个盔甲部分的类型的项。 + +### 附魔能力{#enchantability} + +`enchantability` 属性定义了物品被附魔有多容易。 数字越高,盔甲可以接受更高的附魔。 + +### 装备声音{#equip-sound} + +`equipmentSound` 属性是盔甲装备时会播放的声音。 这个声音应该是 `SoundEvent` 的注册表项。 如果你考虑创建自定义的声音,而不是依靠 `SoundEvents` 类中的原版声音,可以考虑看看[自定义声音事件](../sounds/custom)页面。 + +### 修复原料{#repair-ingredient} + +`repairingIngredientSupplier` 属性是用于修复盔甲的 `Ingredient`(原料)的 supplier。 这个原料什么都可以是,推荐将其保持与事实上用于合成盔甲物品的合成原料相同的材料。 + +### 坚硬度{#toughness} + +`toughness` 属性定义了盔甲会吸收多少伤害。 数字越高,盔甲吸收的伤害越多。 + +### 击退抗性{#knockback-resistance} + +`knockbackResistance` 属性定义了玩家被击中时会反弹多少击退。 数字越高,玩家接收的击退越少。 + +### 可染色{#dyeable} + +`dyable` 属性是布尔值,定义了盔甲是否可染色。 如果设置为 `true`,那么盔甲可以使用染料在工作台中染色。 + +如果选择让你的盔甲可染色,就必须将你的盔甲层和物品纹理_设计为可染色_,因为染料会叠加在纹理上,而不是替代纹理。 看看原版的皮革装备作为示例,纹理是灰度的,染色应用为叠加层,使盔甲改变颜色。 + +## 注册盔甲材料{#registering-the-armor-material} + +现在创建好了注册盔甲材料的实用方法,可以注册你的自定义盔甲材料了,作为 `ModArmorMaterials` 类的静态字段。 + +看这个例子,我们创建 Guidite 盔甲,有以下属性: + +@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/item/armor/ModArmorMaterials.java) + +## 创建盔甲物品{#creating-the-armor-items} + +现在材料已经注册了,就可以在你的 `ModItems` 类中创建盔甲物品。 + +显然,盔甲集并不需要满足每种类型,可以让你的集只有靴或护腿等——原版的海龟壳头盔就是个例子,盔甲集缺了部分槽位。 + +@[code transcludeWith=:::6](@/reference/latest/src/main/java/com/example/docs/item/ModItems.java) + +如果需要让物品能从创造模式物品栏获取的话,还需要**给将物品添加到物品组**。 + +就像所有物品一样,要为这些物品创建翻译键。 + +## 给予纹理和模型{#texturing-and-modelling} + +你会需要创建两套纹理: + +- 用于物品本身的纹理和模型。 +- 盔甲穿在实体身上时可见的真正盔甲模型。 + +### 物品纹理和模型{#item-textures-and-model} + +这些纹理和其他物品没有区别——必须创建纹理、创建一般的 generated 的物品模型,这在[创建你的第一个物品](./first-item#adding-a-texture-and-model)指南中有讲到。 + +例如,你可以使用下面的纹理和模型 JSON 作为参考。 + + + +:::info +你需要所有物品的模型 JSON 文件,不只是头盔,这原则和其他物品模型一样。 +::: + +@[code](@/reference/latest/src/main/resources/assets/fabric-docs-reference/models/item/guidite_helmet.json) + +可以看到,游戏内的盔甲物品应该有合适的模型: + +![盔甲物品模型](/assets/develop/items/armor_1.png) + +## 盔甲纹理和模型{#armor-textures-and-model} + +实体穿着你的盔甲时,现在显示的还是缺失纹理: + +![玩家身上的损坏的盔甲模型](/assets/develop/items/armor_2.png). + +盔甲纹理有两层,都要有。 + +因为我们这个例子中,盔甲的材料名称是 `guidite`,所以文本的位置会是: + +- `assets//textures/models/armor/guidite_layer_1.png` +- `assets//textures/models/armor/guidite_layer_2.png` + + + +第一层包含头盔和胸甲的纹理,第二层包含护腿和靴的纹理。 + +这些纹理存在时,你应该能够看到实体穿着的盔甲了: + +![玩家身上的生效的盔甲模型](/assets/develop/items/armor_3.png). diff --git a/translated/zh_cn/develop/items/custom-item-groups.md b/translated/zh_cn/develop/items/custom-item-groups.md new file mode 100644 index 000000000..eac0abd2d --- /dev/null +++ b/translated/zh_cn/develop/items/custom-item-groups.md @@ -0,0 +1,38 @@ +--- +title: 自定义物品组 +description: 学习如何创建自己的物品组,并往里面添加物品。 +authors: + - IMB11 +--- + +# 自定义物品组{#custom-item-groups} + +物品组是创造模式物品栏内存储物品的标签页。 你可以创建自己的物品组,从而在单独的标签页内存储物品。 如果你的模组添加许多物品,需要保持组织在你的玩家容易访问的一个位置中,这就非常有用。 + +## 创建物品组{#creating-the-item-group} + +创建物品组极其容易。 只要在你的物品类中简单创建一个新的 static final 字段,存储物品组以及注册表键,就可以使用物品组事件,类型于给原版物品组添加物品的方式: + +@[code transcludeWith=:::9](@/reference/latest/src/main/java/com/example/docs/item/ModItems.java) + +@[code transcludeWith=:::_12](@/reference/latest/src/main/java/com/example/docs/item/ModItems.java) + +
+ +你现在应该可以在物品栏菜单内看到物品组了。 然而还没有翻译——必须给你的翻译文件添加翻译键——类似于翻译你的第一个物品的方式。 + +![创建模式菜单内没有翻译的物品组](/assets/develop/items/itemgroups_0.png) + +## 添加翻译键{#adding-a-translation-key} + +如果在物品组的 builder 内,为 `displayName` 方法使用了 `Text.translatable`,就需要往语言文件添加翻译。 + +```json +{ + "itemGroup.fabric_docs_reference": "Fabric Docs Reference" +} +``` + +现在可以看到,物品组应该被正确命名了。 + +![完全完成的物品组,有翻译和物品](/assets/develop/items/itemgroups_1.png) diff --git a/translated/zh_cn/develop/items/first-item.md b/translated/zh_cn/develop/items/first-item.md index 71fbd78b1..0fc176129 100644 --- a/translated/zh_cn/develop/items/first-item.md +++ b/translated/zh_cn/develop/items/first-item.md @@ -51,7 +51,7 @@ If you want to change your item's stack size, you can use the `maxCount` method ## 将物品添加到物品组{#adding-the-item-to-an-item-group} :::info -如果想要将物品添加到自定义的 `ItemGroup`,请参阅[自定义物品组](./item-groups)页面以了解更多。 +如果想要将物品添加到自定义的 `ItemGroup`,请参阅[自定义物品组](./custom-item-groups)页面以了解更多。 ::: 这里为举例,我们将这个物品添加到原材料物品组中,你需要使用 Fabric API 的 item group event——也就是 `ItemGroupEvents.modifyEntriesEvent`。 diff --git a/translated/zh_cn/develop/items/potions.md b/translated/zh_cn/develop/items/potions.md new file mode 100644 index 000000000..e8dfb37e1 --- /dev/null +++ b/translated/zh_cn/develop/items/potions.md @@ -0,0 +1,48 @@ +--- +title: 药水 +description: 学习如何加入多种状态效果的自定义药水。 +authors: + - dicedpixels + - PandoricaVi + - Drakonkinst +--- + +# 药水{#potions} + +药水是能为实体提供效果的消耗品。 玩家可以使用酿造台酿造药水,或者从其他游戏机制中以物品形式获取。 + +## 自定义药水{#custom-potions} + +和物品和方块一样,药水需要注册。 + +### 创建物品{#creating-the-potion} + +让我们从声明一个用于储存你的 `Potion` 实例的字段开始。 我们将直接使用入口点类来持有这个字段。 + +@[code lang=java transclude={21-29}](@/reference/latest/src/main/java/com/example/docs/potion/FabricDocsReferencePotions.java) + +我们传入一个 `StatusEffectInstance` 实例,它的构造方法接收以下 3 个参数: + +- `RegistryEntry 类型` - 效果。 我们在这里使用我们的自定义效果。 你也可以通过原版的 `StatusEffects` 类访问原版效果。 +- `int duration` - 状态效果的持续时间(以刻计算)。 +- `int amplifier` - 状态效果的增幅。 比如 急迫 II 的增幅是 1。 + +:::info +要创建自己的药水效果,请使用[效果](../entities/effects)指南。 +::: + +### 注册药水{#registering-the-potion} + +在我们的初始化器中,我们将使用 `FabricBrewingRecipeRegistryBuilder.BUILD` 事件,使用 `BrewingRecipeRegistry.registerPotionRecipe` 方法注册我们的药水。 + +@[code lang=java transclude={33-42}](@/reference/latest/src/main/java/com/example/docs/potion/FabricDocsReferencePotions.java) + +`registerPotionRecipe` 接收以下 3 个参数: + +- `RegistryEntry 输入` - 初始药水的注册表项。 通常可以是水瓶或粗制的药水。 +- `Item item` - 作为药水主要原料的物品。 +- `RegistryEntry 输出` - 结果药水的注册表项。 + +注册完成后,你就可以用马铃薯酿造土豆药水。 + +![玩家物品栏内的效果](/assets/develop/tater-potion.png) diff --git a/translated/zh_cn/develop/rendering/basic-concepts.md b/translated/zh_cn/develop/rendering/basic-concepts.md new file mode 100644 index 000000000..df9fc44ac --- /dev/null +++ b/translated/zh_cn/develop/rendering/basic-concepts.md @@ -0,0 +1,162 @@ +--- +title: 基本渲染概念 +description: 学习 Minecraft 渲染引擎的基本概念。 +authors: + - IMB11 + - "0x3C50" +--- + +# 基本渲染概念{#basic-rendering-concepts} + +::: warning +Although Minecraft is built using OpenGL, as of version 1.17+ you cannot use legacy OpenGL methods to render your own things. Instead, you must use the new `BufferBuilder` system, which formats rendering data and uploads it to OpenGL to draw. + +总的来说,您应该使用 Minecraft 的渲染系统,否则就得利用 `GL.glDrawElements()` 来构建自己的。 +::: + +本文会介绍使用新系统渲染的一些基础,并解释一些关键术语和概念。 + +尽管 Minecraft 的许多渲染都通过 `DrawContext` 中的各种方法抽象出来,且您很可能并不需要接触这里提到的任何内容,但是了解渲染的基础实现依然很重要。 + +## 镶嵌器 `Tessellator`{#the-tessellator} + +镶嵌器 `Tessellator` 是 Minecraft 中用于渲染东西的主类。 它是一个单例,这意味着游戏中只有它的一个实例。 您可以通过 `Tessellator.getInstance()` 获取这个实例。 + +## 缓冲构建器 `BufferBuilder`{#the-bufferbuilder} + +缓冲构建器 `BufferBuilder` 是用来将渲染数据格式化并上传到 OpenGL 的类。 用于创建缓冲,随后也会将这个缓冲上传到 OpenGL 用于绘制。 + +镶嵌器 `Tessellator` 负责创建一个缓冲构建器 `BufferBuilder`,用于将渲染数据格式化并上传到 OpenGL。 + +### 初始化 `BufferBuilder`{#initializing-the-bufferbuilder} + +必须先初始化 `BufferBuilder`,才能往里面写入任何东西。 方法就是使用 `Tessellator#begin(...)` 方法,接收一个 `VertexFormat` 和绘制模式,并返回 `BufferBuilder`。 + +#### 顶点格式{#vertex-formats} + +顶点格式 `VertexFormat` 定义了我们在我们的数据缓冲中包含的元素,并规定了这些元素将如何被转发到 OpenGL。 + +可用的 `VertexFormat` 元素如下: + +| 元素 | 格式 | +| --------------------------------------------- | --------------------------------------------------------------------------------------- | +| `BLIT_SCREEN` | `{ position (3 floats: x, y and z), uv (2 floats), color (4 ubytes) }` | +| `POSITION_COLOR_TEXTURE_LIGHT_NORMAL` | `{ position, color, texture uv, texture light (2 shorts), texture normal (3 sbytes) }` | +| `POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL` | `{ position, color, texture uv, overlay (2 shorts), texture light, normal (3 sbytes) }` | +| `POSITION_TEXTURE_COLOR_LIGHT` | `{ position, texture uv, color, texture light }` | +| `POSITION` | `{ position }` | +| `POSITION_COLOR` | `{ position, color }` | +| `LINES` | `{ position, color, normal }` | +| `POSITION_COLOR_LIGHT` | `{ position, color, light }` | +| `POSITION_TEXTURE` | `{ position, uv }` | +| `POSITION_COLOR_TEXTURE` | `{ position, color, uv }` | +| `POSITION_TEXTURE_COLOR` | `{ position, uv, color }` | +| `POSITION_COLOR_TEXTURE_LIGHT` | `{ position, color, uv, light }` | +| `POSITION_TEXTURE_LIGHT_COLOR` | `{ position, uv, light, color }` | +| `POSITION_TEXTURE_COLOR_NORMAL` | `{ position, uv, color, normal }` | + +#### 绘制模式{#draw-modes} + +绘制模式定义了如何绘制数据。 可用的绘制模式如下: + +| 绘制模式 | 描述 | +| --------------------------- | ------------------------------------------------ | +| `DrawMode.LINES` | 每个元素由 2 个顶点构成,代表一条直线。 | +| `DrawMode.LINE_STRIP` | 第一个元素需要 2 个顶点。 附加的元素只需要 1 个新的顶点就能绘制,创建出一条连续的线。 | +| `DrawMode.DEBUG_LINES` | 与 `DrawMode.LINES` 类似,但线在屏幕上总是保持 1 像素宽。 | +| `DrawMode.DEBUG_LINE_STRIP` | 与 `DrawMode.LINE_STRIP` 相同,但线总是保持 1 像素宽。 | +| `DrawMode.TRIANGLES` | 每个元素都由 3 个顶点组成,形成一个三角形。 | +| `DrawMode.TRIANGLE_STRIP` | 前 3 个顶点形成第一个三角形。 每个新增的顶点与前两个顶点形成一个新的三角形。 | +| `DrawMode.TRIANGLE_FAN` | 前 3 个顶点形成第一个三角形。 每个新增的顶点与第一个顶点和最后的一个顶点形成一个新的三角形。 | +| `DrawMode.QUADS` | 每个元素由 4 个顶点构成,形成一个四边形。 | + +### 向 `BufferBuilder` 写入{#writing-to-the-bufferbuilder} + +`BufferBuilder` 初始化完成后,您就可以向它写入数据。 + +`BufferBuilder` 允许我们一个顶点一个顶点地构造我们的缓冲。 我们调用 `buffer.vertex(matrix, float, float, float)` 方法来添加一个顶点。 参数 `matrix` 是变换矩阵,具体细节我们将在后文中讨论。 3 个 `float` 参数代表顶点坐标的 (x, y, z)。 + +这个方法返回一个顶点构建器(vertex builder),可以用来为这个顶点指定附加信息。 附加这些信息时,按照我们先前定义的顶点格式 `VertexFormat` 是至关重要的。 如果不这么做,OpenGL 可能无法正确解释我们的数据。 完成构建顶点后,只需要给缓冲继续添加更多顶点和数据,直到完成。 + +“剔除”的概念也值得我们理解。 剔除是从 3D 形状中移除那些在观察者视角不可见的面的过程。 如果一个面的顶点指定顺序错误,这个面可能会因为剔除而无法正确渲染。 + +#### 什么是变换矩阵? {#what-is-a-transformation-matrix} + +一个变换矩阵是一个 4×4 的矩阵,用于变换一个向量。 在 Minecraft 中,变换矩阵只是变换我们传入顶点调用的坐标。 这些变换可以放缩、平移和旋转我们的模型。 + +有时称为位置矩阵,或模型矩阵。 + +通常是通过 `MatrixStack` 类获取的, `MatrixStack` 实例可以从 `DrawContext` 对象获取: + +```java +drawContext.getMatrices().peek().getPositionMatrix(); +``` + +#### 渲染三角条纹{#rendering-a-triangle-strip} + +用实际案例来解释如何向 `BufferBuilder` 写入会更轻松一些。 不妨让我们尝试用绘制模式 `DrawMode.TRIANGLE_STRIP` 和顶点格式 `POSITION_COLOR` 来渲染一些东西。 + +我们将在平视显示器(HUD)上的以下几个点按顺序绘制顶点: + +```txt +(20, 20) +(5, 40) +(35, 40) +(20, 60) +``` + +这应当给出一个漂亮的菱形——因为我们在使用绘制模式 `TRIANGLE_STRIP`,渲染器将执行以下几步: + +![四个步骤展示顶点在屏幕上的放置是如何形成两个三角形的](/assets/develop/rendering/concepts-practical-example-draw-process.png) + +因为在这个例子中我们在平视显示器(HUD)上绘制,我们将使用 `HudRenderCallback` 事件: + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +在平视显示器(HUD)上绘制的结果如下: + +![最终结果](/assets/develop/rendering/concepts-practical-example-final-result.png) + +:::tip +尝试给顶点随机的颜色和位置,看看会发生什么! 您也可以尝试使用不同的绘制模式和顶点格式。 +::: + +## 矩阵栈 `MatrixStack`{#the-matrixstack} + +在学习完如何向 `BufferBuilder` 写入后,您可能会好奇如何变换你的模型——或者甚至让它动起来。 这时就需要引入 `MatrixStack` 类。 + +`MatrixStack` 类有以下方法: + +- `push()` - 向栈压入一个新的矩阵。 +- `pop()` - 从栈中弹出一个矩阵。 +- `peek()` - 返回栈顶的矩阵。 +- `translate(x, y, z)` - 平移栈顶的矩阵。 +- `scale(x, y, z)` - 放缩栈顶的矩阵。 + +您也可以使用四元数对栈顶的矩阵做叉乘,这些内容会在下一节讲到。 + +从我们上面的案例出发,我们可以用 `MatrixStack` 和 `tickDelta`(从上一帧到现在经过的时间)让我们的菱形放大和缩小。 + +::: warning +You must first push the matrix stack and then pop it after you're done with it. If you don't, you'll end up with a broken matrix stack, which will cause rendering issues. + +在获取变换矩阵前,请确保向矩阵栈压入一个新的矩阵! +::: + +@[code lang=java transcludeWith=:::2](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +![一段展示菱形放大和缩小的视频](/assets/develop/rendering/concepts-matrix-stack.webp) + +## 四元数 `Quaternion`(旋转物体){#quaternions-rotating-things} + +四元数是三维空间中的旋转的一种表示方法, 用于通过 `multiply(Quaternion, x, y, z)` 方法旋转 `MatrixStack` 栈顶的矩阵。 + +您几乎不太可能需要直接使用 `Quaternion` 类,因为 Minecraft 在工具类 `RotationAxis` 中提供了许多预先定义的 `Quaternion` 实例。 + +不妨让我们尝试绕 z 轴旋转我们的菱形。 我们可以通过 `MatrixStack` 和 `multiply(Quaternion, x, y, z)` 方法来实现。 + +@[code lang=java transcludeWith=:::3](@/reference/latest/src/client/java/com/example/docs/rendering/RenderingConceptsEntrypoint.java) + +这会产生如下结果: + +![一段展示菱形绕 z 轴旋转的视频](/assets/develop/rendering/concepts-quaternions.webp) diff --git a/translated/zh_cn/develop/rendering/draw-context.md b/translated/zh_cn/develop/rendering/draw-context.md index 2a31aad9e..49910329d 100644 --- a/translated/zh_cn/develop/rendering/draw-context.md +++ b/translated/zh_cn/develop/rendering/draw-context.md @@ -5,63 +5,63 @@ authors: - IMB11 --- -# 使用绘制上下文 +# 使用绘制上下文{#using-the-drawing-context} 本文假设您已经看过[基本渲染概念](./basic-concepts)。 -`DrawContext` 是控制渲染的核心类。 它提供了诸多渲染图形、文字、纹理的方法,此外还用来操纵 `MatrixStack` 和 `BufferBuilder`。 +`DrawContext` 类是用于在游戏内渲染的主类。 用于渲染图形、文字、纹理,而且之前也见过,用于操纵 `MatrixStack` 和使用 `BufferBuilder`。 -## 绘制图形 +## 绘制图形{#drawing-shapes} -使用 `DrawContext` 绘制**矩形**十分容易。 如果您想绘制三角形或其他不规则图形,您需要使用 `BufferBuilder` 手动添加图形顶点信息。 +使用 `DrawContext` 绘制**矩形**十分容易。 如果想绘制三角形或其他非矩形的图形,需要使用 `BufferBuilder`。 -### 绘制矩形 +### 绘制矩形{#drawing-rectangles} -您可以使用 `DrawContext#fill` 方法来绘制一个实心矩形。 +可以使用 `DrawContext.fill(...)` 方法绘制一个实心矩形。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) ![矩形](/assets/develop/rendering/draw-context-rectangle.png) -### 绘制边框 +### 绘制轮廓和边框{#drawing-outlines-borders} -假设我们想勾勒出我们刚才绘制的矩形的轮廓。 我们可以使用 `DrawContext#drawBorder` 方法来绘制轮廓。 +假设我们想勾勒出刚刚绘制的矩形的轮廓。 我们可以使用 `DrawContext.drawBorder(...)` 方法来绘制轮廓。 @[code lang=java transcludeWith=:::2](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) ![带边框的矩形](/assets/develop/rendering/draw-context-rectangle-border.png) -### 绘制线条 +### 绘制独立线条{#drawing-individual-lines} -我们可以使用 `DrawContext#drawHorizontalLine` 和 `DrawContext#drawVerticalLine` 来绘制线条。 +我们可以使用 `DrawContext.drawHorizontalLine(...)` 和 `DrawContext drawVerticalLine(...)` 来绘制线条。 @[code lang=java transcludeWith=:::3](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) ![线条](/assets/develop/rendering/draw-context-lines.png) -## 裁剪 +## 裁剪管理器{#the-scissor-manager} -`DrawContext` 有一套内建的裁剪功能。 它可以用来裁剪渲染区域。 这个功能在绘制某些元素时十分有用,比如悬浮提示,或者其他不应该超出指定渲染区域的界面元素。 +`DrawContext` 有一套内建的裁剪功能。 可以用来把渲染裁剪为特定区域。 这个功能在绘制某些元素时十分有用,比如悬浮提示,或者其他不应该超出指定渲染区域的界面元素。 -### 使用裁剪功能 +### 使用裁剪管理器{#using-the-scissor-manager} :::tip -裁剪区域可以内嵌! 但是请一定配对 `enableScissor` 和 `disableScissor`,否则错误的裁剪区域将影响到其他界面元素。 +裁剪区域可以嵌套! 但是请一定配对 `enableScissor` 和 `disableScissor`,否则错误的裁剪区域将影响到其他界面元素。 ::: -要启用裁剪功能,只需调用 `DrawContext#enableScissor` 方法。 同样地,调用 `DrawContext#disableScissor` 方法以禁用裁剪功能。 +要启用裁剪管理器,只需使用 `DrawContext.enableScissor(...)` 方法。 同样地,要禁用裁剪管理器,使用 `DrawContext.disableScissor()` 方法。 @[code lang=java transcludeWith=:::4](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) ![裁剪区域](/assets/develop/rendering/draw-context-scissor.png) -如您所见,即使我们让游戏尝试用渐变色铺满整个界面,它却只能在裁剪区域内绘制。 +如您所见,即使我们告诉游戏用渐变色铺满整个屏幕,也只在裁剪区域内渲染。 -## 绘制纹理 +## 绘制纹理{#drawing-textures} -注意,不存在唯一“正确”的绘制纹理的方法,因为 `drawTexture` 有很多重载。 本节内容只会涵盖最常用的方法。 +在屏幕上绘制纹理没有唯一“正确”的方法,因为 `drawTexture(...)` 方法有很多不同的重载。 本节内容只会涵盖最常用的方法。 -### 绘制整个纹理 +### 绘制整个纹理{#drawing-an-entire-texture} 一般来说,我们推荐您使用需要指定 `textureWidth` 和 `textureHeight` 参数的 `drawTexture` 方法重载。 因为如果使用不指定的重载, `DrawContext` 会假设您的纹理文件尺寸是 256x256,而您的纹理文件不一定是这个尺寸,于是渲染结果就不一定正确。 @@ -69,7 +69,7 @@ authors: ![绘制整个纹理](/assets/develop/rendering/draw-context-whole-texture.png) -### 绘制纹理的一部分 +### 绘制纹理的一部分{#drawing-a-portion-of-a-texture} 在这个情形中,我们需要指定纹理区域的 `u` 和 `v`。 这俩参数用于指定纹理区域左上角的坐标。另外,`regionWidth` 和 `regionHeight` 参数用于指定纹理区域的尺寸。 @@ -81,13 +81,13 @@ authors: @[code lang=java transcludeWith=:::6](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) -![绘制纹理的一部分](/assets/develop/rendering/draw-context-region-texture.png) +![区域纹理](/assets/develop/rendering/draw-context-region-texture.png) -## 绘制文字 +## 绘制文字{#drawing-text} -`DrawContext` 提供了许多不言自明的渲染文字的方法,您可以自行尝试,此处不再赘述。 +`DrawContext` 提供了许多渲染文字的方法,都解释得很清楚,您可以自行尝试,此处不再赘述。 -假设我们想在界面上绘制 `Hello World`。 我们可以使用 `DrawContext#drawText` 方法来完成。 +假设我们想在屏幕中绘制“Hello World”。 我们可以使用 `DrawContext.drawText(...)` 方法来完成。 @[code lang=java transcludeWith=:::7](@/reference/latest/src/client/java/com/example/docs/rendering/DrawContextExampleScreen.java) diff --git a/translated/zh_cn/develop/rendering/gui/custom-screens.md b/translated/zh_cn/develop/rendering/gui/custom-screens.md index 6dd5cd5a7..55be5bb5a 100644 --- a/translated/zh_cn/develop/rendering/gui/custom-screens.md +++ b/translated/zh_cn/develop/rendering/gui/custom-screens.md @@ -5,7 +5,7 @@ authors: - IMB11 --- -# 自定义界面 +# 自定义界面{#custom-screens} :::info 本文所述均指一般的、未涉及同步的界面,这类界面是由玩家独自在客户端打开的,不需要服务端的参与。 @@ -15,7 +15,7 @@ authors: 您可以创建自己的界面来展示自定义内容、自定义配置目录等。 -## 创建界面 +## 创建界面{#creating-a-screen} 要创建界面,您需要继承 `Screen` 类并覆写 `init` 方法。您可能还需要覆写 `render` 方法,但是请保证调用 `super.render`, 否则背景和组件都不会渲染。 @@ -32,7 +32,7 @@ authors: ![自定义界面 1](/assets/develop/rendering/gui/custom-1-example.png) -## 打开界面 +## 打开界面{#opening-the-screen} 您可以使用 `MinecraftClient` 类的 `setScreen` 方法来打开您的界面。您可以在许多地方做这件事,比如当一个按键触发时,当一条命令执行时,或者当客户端收到一个网络包时。 @@ -42,7 +42,7 @@ MinecraftClient.getInstance().setScreen( ); ``` -## 关闭界面 +## 关闭界面{#closing-the-screen} 当您想要关闭界面时,只需将界面设为 `null` 即可: diff --git a/translated/zh_cn/develop/rendering/gui/custom-widgets.md b/translated/zh_cn/develop/rendering/gui/custom-widgets.md index a0f1bf8b2..c52128eeb 100644 --- a/translated/zh_cn/develop/rendering/gui/custom-widgets.md +++ b/translated/zh_cn/develop/rendering/gui/custom-widgets.md @@ -5,30 +5,30 @@ authors: - IMB11 --- -# 自定义组件 +# 自定义组件{#custom-widgets} -组件是一类容器化的界面元素,它们可以被添加到界面上供玩家交互,交互方式包括鼠标点击、键盘输入等。 +组件本质上是容器化的界面元素,可以被添加到屏幕中供玩家交互,交互方式包括鼠标点击、键盘输入等。 -## 创建组件 +## 创建组件{#creating-a-widget} -有很多种创建组件的方式,最常用的是继承自 `ClickableWidget`。 这个类提供了许多实用功能,比如控制组件的尺寸和位置,以及接收用户输入事件。事实上这些功能由 `Drawable`、`Element`、`Narratable`、`Selectable` 接口规定: +有很多种创建组件的方式,例如继承 `ClickableWidget`。 这个类提供了许多实用功能,比如控制组件的尺寸和位置,以及接收用户输入事件。事实上这些功能由 `Drawable`、`Element`、`Narratable`、`Selectable` 接口规定: -- `Drawable` 用于指定渲染逻辑。当一个组件实现此接口时,您可以通过 `Screen#addDrawableChild` 将组件对象添加至界面中。 -- `Element` 用于接收用户输入事件,比如鼠标点击、键盘输入等。 -- `Narratable` 用于提供无障碍信息,无障碍功能(如复述)通过此接口访问组件内容。 -- `Selectable` 用于聚焦组件,实现此接口后组件可以由 `Tab` 键选中,这也是一种无障碍功能。 +- `Drawable` 用于渲染,需要通过 `Screen#addDrawableChild` 将组件注册到屏幕中。 +- `Element` 用于事件,比如鼠标点击、键盘输入等,需要这个来处理事件。 +- `Narratable` 用于无障碍,让组件能够通过屏幕阅读器或其他无障碍工具访问。 +- `Selectable` 用于选择,实现此接口后组件可以由 Tab 键选中,这也能帮助无障碍。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/screens/CustomWidget.java) -## 将组件添加至界面 +## 将组件添加到屏幕{#adding-the-widget-to-the-screen} 如同其他组件,您需要使用 `Screen#addDrawableChild` 来将组件添加到界面中。 请确保这一步在 `Screen#init` 方法中完成。 @[code lang=java transcludeWith=:::3](@/reference/latest/src/client/java/com/example/docs/rendering/screens/CustomScreen.java) -![界面上的自定义组件](/assets/develop/rendering/gui/custom-widget-example.png) +![屏幕中的自定义组件](/assets/develop/rendering/gui/custom-widget-example.png) -## 用户输入事件 +## 组件事件{#widget-events} 您可以自定义用户输入事件的处理逻辑,比如覆写 `onMouseClicked`、`onMouseReleased`、`onKeyPressed` 等方法。 diff --git a/translated/zh_cn/develop/rendering/hud.md b/translated/zh_cn/develop/rendering/hud.md new file mode 100644 index 000000000..c35870bed --- /dev/null +++ b/translated/zh_cn/develop/rendering/hud.md @@ -0,0 +1,30 @@ +--- +title: 在 Hud 中渲染 +description: 学习如何使用 HudRenderCallback 事件来渲染Hud。 +authors: + - IMB11 +--- + +# 渲染 Hud{#rendering-in-the-hud} + +在 [基本渲染概念](./basic-concepts) 页面和[使用绘制上下文](./draw-context) 中,我们已经简要介绍了如何将内容渲染到 Hud,因此在本页中,我们将重点介绍 `HudRenderCallback` 事件和 `deltaTick` 参数。 + +## HudRenderCallback{#hudrendercallback} + +由 Fabric API 提供的 `HudRenderCallback` 事件每帧都会被调用,用于向 HUD 渲染内容。 + +要注册此事件,只需调用 `HudRenderCallback.EVENT.register` 并传入一个以 `DrawContext` 和一个 `float` (deltaTick) 为参数的 lambda 表达式即可。 + +绘制上下文可用于访问游戏提供的各种渲染工具,并访问原始矩阵堆栈。 + +要了解有关绘制上下文的更多信息,应该查看[使用绘制上下文](./draw-context)页面。 + +### DeltaTick{#deltatick} + +`deltaTick` 是指距上一帧的时间,单位为秒。 这可以用来制作动画和其他基于时间的效果。 + +例如,假设要让颜色随时间变化。 可以使用 `deltaTickManager` 获得 deltaTick,并随时间存储以变化颜色。 + +@[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/HudRenderingEntrypoint.java) + +![](/assets/develop/rendering/hud-rendering-deltatick.webp) diff --git a/translated/zh_cn/develop/rendering/particles/creating-particles.md b/translated/zh_cn/develop/rendering/particles/creating-particles.md new file mode 100644 index 000000000..7bfae6598 --- /dev/null +++ b/translated/zh_cn/develop/rendering/particles/creating-particles.md @@ -0,0 +1,72 @@ +--- +title: 创建自定义粒子 +description: 学习如何使用 Fabric API 创建自定义粒子。 +authors: + - Superkat32 +--- + +# 创建自定义粒子{#creating-custom-particles} + +粒子是一种强大的工具, 可以为美丽的场景增添氛围,也可以为你的 boss 战添加紧张感。 让我们创建一个自定义粒子吧! + +## 注册自定义粒子{#register-a-custom-particle} + +我们会添加新的火花粒子,模仿末地烛的粒子移动。 + +首先需要在你的模组初始化类中,使用你的模组 id,创建一个 `ParticleType`。 + +@[code lang=java transcludeWith=#particle_register_main](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java) + +小写字母“sparkle_particle”是粒子纹理的 JSON 路径。 稍后就会以这个名字,创建新的 JSON 文件。 + +## 客户端注册{#client-side-registration} + +将粒子注册到 `ModInitializer` 入口点后,还需要将粒子注册到 `ClientModInitializer` 入口点。 + +@[code lang=java transcludeWith=#particle_register_client](@/reference/latest/src/client/java/com/example/docs/FabricDocsReferenceClient.java) + +在这个例子中,我们在客户端注册我们的粒子。 使用末地烛粒子的 factory,给予粒子一些移动。 这意味着,我们的粒子就会像末地烛那样移动。 + +::: tip +You can see all the particle factories by looking at all the implementations of the `ParticleFactory` interface. This is helpful if you want to use another particle's behaviour for your own particle. + +- IntelliJ 的快捷键:Ctrl+Alt+B +- Visual Studio Code 的快捷键:Ctrl+F12 + ::: + +## 创建 JSON 文件并添加纹理{#creating-a-json-file-and-adding-textures} + +你需要在你的 `resources/assets//` 文件夹中创建两个文件夹。 + +| 文件夹路径 | 说明 | +| -------------------- | ----------------------------- | +| `/textures/particle` | `particle` 文件夹会包含你的所有粒子的纹理。 | +| `/particles` | `particle` 文件夹会包含你的所有 json 文件 | + +例如,我们在 `textures/particle` 中只有一个纹理,叫做 `sparkle_particle_texture.png`。 + +然后,在 `particles` 中创建新的 JSON 文件,名称与用于创建你的 ParticleType 的 JSON 路径相同。 例如,我们需要创建 `sparkle_particle.json`。 这个文件很重要,因为让 Minecraft 知道我们的粒子应该使用哪个纹理。 + +@[code lang=json](@/reference/latest/src/main/resources/assets/fabric-docs-reference/particles/sparkle_particle.json) + +:::tip +可以给 `textures` 数组添加更多纹理以创建粒子动画。 粒子会在这个数组中循环纹理,以第一个纹理开始。 +::: + +## 测试新的粒子{#testing-the-new-particle} + +完成了 JSON 文件并保存你的作品后,就能够载入 Minecraft 并测试好一切了! + +可以输入以下命令,看看是否一切正常: + +```mcfunction +/particle :sparkle_particle ~ ~1 ~ +``` + +![粒子的展示](/assets/develop/rendering/particles/sparkle-particle-showcase.png) + +:::info +用这个命令,粒子会生成在玩家内。 你可能需要往后走才能实际看到。 +::: + +你也可以使用相同命令,用命令方块召唤粒子。 diff --git a/translated/zh_cn/develop/sounds/custom.md b/translated/zh_cn/develop/sounds/custom.md index ca0352f0b..0feb9e645 100644 --- a/translated/zh_cn/develop/sounds/custom.md +++ b/translated/zh_cn/develop/sounds/custom.md @@ -1,33 +1,33 @@ --- -title: 创建自定义音效 -description: 了解如何通过注册表添加和使用新音效。 +title: 创建自定义声音 +description: 了解如何通过注册表添加和使用新声音。 authors: - JR1811 --- -# 创建自定义音效 +# 创建自定义声音{#creating-custom-sounds} -## 准备音频文件 +## 准备音频文件{#preparing-the-audio-file} -你的音频文件需要转化为特定格式。 你的音频文件需要转化为特定格式。 OGG Vorbis 是一种用于音频等多媒体数据的开放式容器格式,Minecraft 的声音文件就使用了这种格式。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道 (Mono)。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道 (Mono)。 +你的音频文件需要转化为特定格式。 OGG Vorbis 是一种用于音频等多媒体数据的开放式容器格式,Minecraft 的声音文件就使用了这种格式。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道(Mono)。 -整理工作 大部分现代 DAW (数字音频工作站) 软件都可以使用这种格式进行导入和导出。 在下面的例子中,我们将使用免费开源软件“[Audacity](https://www.audacityteam.org/)”将音频文件转换成规定的格式,当然其他的 DAW 也可以做到。 +许多现代 DAW(数字音频工作站)软件都可以使用这种格式导入和导出。 在下面的例子中,我们将使用免费开源软件“[Audacity](https://www.audacityteam.org/)”将音频文件转换成正确的格式,当然其他的 DAW 也可以做到。 ![Audacity 中未准备好的音频文件](/assets/develop/sounds/custom_sounds_0.png) -在本例中,[哨声](https://freesound.org/people/strongbot/sounds/568995/) 被作为例子导入 Audacity。 它目前被保存为`.wav`格式的文件,有两个音频通道 (立体声) 。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 它目前被保存为`.wav`格式的文件,有两个音频通道 (立体声) 。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 +在本例中,将[哨声](https://freesound.org/people/strongbot/sounds/568995/)作为例子导入 Audacity。 这个声音目前保存为 `.wav` 文件,有两个音频通道(立体声)。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 ![分割立体声轨](/assets/develop/sounds/custom_sounds_1.png) ![删除一个音频通道](/assets/develop/sounds/custom_sounds_2.png) -导出或渲染音频文件时,请确认选择的是 OGG 文件格式。 有些 DAW (如 REAPER) 可能支持多种 OGG 音频层格式。 在这种情况下,选择 OGG Vorbis 即可。 根据注册表项的数量,入口点类可能很快就会变得十分杂乱。 为了避免这种情况,我们可以使用一个新的辅助类。 在这种情况下,选择 OGG Vorbis 即可。 +导出或渲染音频文件时,请确认选择的是 OGG 文件格式。 有些 DAW(如 REAPER)可能支持多种 OGG 音频层格式。 在这种情况下,选择 OGG Vorbis 即可。 ![导出为 OGG 文件](/assets/develop/sounds/custom_sounds_3.png) -另外,音频文件过大会导致模组文件也更大。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 +另外,记住,音频文件可能显著增加你的模组的大小。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 -## 加载音频文件 +## 加载音频文件{#loading-the-audio-file} 要在你的模组中使用音频文件,要添加新的 `resources/assets//sounds` 目录,并将导出的音频文件 `metal_whistle.ogg` 放入该目录中。 @@ -35,22 +35,22 @@ authors: @[code lang=json](@/reference/latest/src/main/resources/assets/fabric-docs-reference/sounds.json) -声音字幕 (subtitle) 条目为玩家提供了更多的关于该声音的信息。 声音字幕 (subtitle) 条目为玩家提供了更多的关于该声音的信息。 声音字幕翻译键会在 `resources/assets//lang` 目录下的语言文件中用到,如果游戏内字幕设置已打开且正在播放自定义声音,则会显示该翻译键在语言文件内对应的值,如果找不到,那么会直接显示该声音字幕的翻译键。 +字幕(subtitle)条目为玩家提供了更多的关于该声音的信息。 在 `resources/assets//lang` 目录下的语言文件中会用到声音文件,如果游戏内字幕设置已打开且正在播放自定义声音,则会显示这个字幕。 -## 注册自定义音效 +## 注册自定义声音{#registering-the-custom-sound} -要将自定义音效添加到模组里,请在实现了 `ModInitializer` 入口点的类中注册一个 SoundEvent。 +要将自定义声音添加到模组中,请在实现了 `ModInitializer` 入口点的类中注册一个 SoundEvent。 ```java Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle"), SoundEvent.of(new Identifier(MOD_ID, "metal_whistle"))); ``` -## 规范化 +## 整理整理{#cleaning-up-the-mess} 根据注册表项的数量,入口点类可能很快就会变得十分杂乱。 为了避免这种情况,我们可以使用一个新的辅助类。 -在新创建的辅助类中添加两个新方法: 一个用于注册所有音效,一个用于初始化该类。 之后就可以根据需要,添加新的自定义 `SoundEvent` 常量了。 +在新创建的辅助类中添加两个新方法: 一个用于注册所有声音,一个用于初始化该类。 之后就可以根据需要,添加新的自定义 `SoundEvent` 常量了。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/sound/CustomSounds.java) @@ -58,6 +58,6 @@ Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle" @[code lang=java transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/sound/FabricDocsReferenceSounds.java) -## 使用自定义的 SoundEvent +## 使用自定义的 SoundEvent{#using-the-custom-soundevent} -使用辅助类去访问自定义的 SoundEvent。 查看 [播放声音事件(SoundEvent)](./using-sounds) 页面,了解如何播放声音。 +使用辅助类去访问自定义的 SoundEvent。 查看[播放声音事件(SoundEvent)](./using-sounds)页面,了解如何播放声音。 diff --git a/translated/zh_cn/develop/sounds/using-sounds.md b/translated/zh_cn/develop/sounds/using-sounds.md index dd884fbbe..6aa2327c2 100644 --- a/translated/zh_cn/develop/sounds/using-sounds.md +++ b/translated/zh_cn/develop/sounds/using-sounds.md @@ -1,13 +1,13 @@ --- -title: 播放声音事件(SoundEvent) +title: 播放声音 description: 学习如何播放声音事件(SoundEvent)。 --- -# 播放声音事件(SoundEvent) +# 播放声音{#playing-sounds} Minecraft 有大量的声音供您选择。 查看 `SoundEvents` 类以查看 Mojang 提供的所有原版声音事件实例。 -## 在您的模组中使用声音 +## 在您的模组中使用声音{#using-sounds} 使用声音时请确保在逻辑服务端执行 `playSound()` 方法。 @@ -15,18 +15,18 @@ Minecraft 有大量的声音供您选择。 查看 `SoundEvents` 类以查看 Mo @[code lang=java transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/item/CustomSoundItem.java) -`playerSound()` 方法与 `LivingEntity` 对象一起使用。 只需要指定 SoundEvent、音量(volume)和音高(pitch)。 您还可以使用世界实例中的 `playSound()` 方法以获得更高级别的控制。 +播放声音事件(SoundEvent) 只需要指定 SoundEvent、音量(volume)和音高(pitch)。 `playerSound()` 方法与 `LivingEntity` 对象一起使用。 只需要指定 SoundEvent、音量(volume)和音高(pitch)。 您还可以使用世界实例中的 `playSound()` 方法以获得更高级别的控制。 @[code lang=java transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/item/CustomSoundItem.java) -### 声音事件与声音组(SoundCategory) +### 声音事件与声音组(SoundCategory){#soundevent-and-soundcategory} -声音事件定义了播放哪个声音。 您也可以[注册您自己的声音事件](./custom)以包含您自己的声音。 +播放声音事件(SoundEvent) 声音事件定义了播放哪个声音。 您也可以[注册您自己的声音事件](./custom)以包含您自己的声音。 Minecraft 在游戏设置中有多个音频滑块。 `SoundCategory` 枚举类用于确定哪个滑块可以调整您声音的音量。 -### 音量和音高 +### 音量和音调{#volume-and-pitch} -音量参数可能有些误导。 在 `0.0f - 1.0f` 的范围内可以改变声音的实际音量。 如果数字大于这个范围,将使用 `1.0f` 的音量,并且仅使用您所在的距离。可以听到声音,进行调整。 通过 `volume * 16` 可以粗略算出方块距离。 +音量参数可能有些误导。 在 `0.0f - 1.0f` 的范围内可以改变声音的实际音量。 如果数字大于这个范围,将使用 `1.0f` 的音量,并且仅调整声音能听到的距离。 通过 `volume * 16` 可以粗略算出方块距离。 音高参数会增加或减少音高数值,还会改变声音的持续时间。 在 `(0.5f - 1.0f)` 范围内,音高和速度会减小,而较大的数字会增加音高和速度。 `0.5f` 以下的数字将保持 `0.5f`。 diff --git a/translated/zh_cn/develop/text-and-translations.md b/translated/zh_cn/develop/text-and-translations.md new file mode 100644 index 000000000..3663b0309 --- /dev/null +++ b/translated/zh_cn/develop/text-and-translations.md @@ -0,0 +1,101 @@ +--- +title: 文本和翻译 +description: Minecraft 处理格式化文本和翻译的全面文档。 +authors: + - IMB11 +--- + +# 文本和翻译{#text-and-translations} + +Minecraft 在游戏内显示文本,不论何时,都是使用 `Text` 对象定义的。 +使用这种自定义的类型而非 `String`,是为了允许更多高级的格式化,包括颜色、加粗、混淆和点击事件。 这样还能够访问翻译系统,使得将任何界面元素翻译成不同语言都变得容易。 + +如果以前有做过数据包和函数,应该看到用于displayName、书、告示牌等内容的就是用的 json 文本格式。 不难猜到,这就是 `Text` 对象的 json 呈现,可以使用 `Text.Serializer` 互相转换。 + +制作模组时,最好直接在代码中构造你的 `Text` 对象,并随时利用翻译。 + +## 字面文本{#text-literals} + +这是创建 `Text` 对象最简单的方式,创建字面值。 这就是会照样显示的字符串,默认没有任何格式化。 + +这些是使用 `Text.of` 或 `Text.literal` 方法创建的,这两个行为有点不同。 `Text.of` 接受 null 输入,返回 `Text` 实例。 `Text.literal` 不同,不能有空输入,返回的是 `MutableText`,是 `Text` 的字类,可以轻易地格式化和连接。 这个后面会有更多。 + +```java +Text literal = Text.of("Hello, world!"); +MutableText mutable = Text.literal("Hello, world!"); +// Keep in mind that a MutableText can be used as a Text, making this valid: +Text mutableAsText = mutable; +``` + +## 可翻译文本{#translatable-text} + +给相同的文本字符串提供多个翻译时,可以使用 `Text.translatable` 方法,引用语言文件中的任意翻译键。 如果翻译键不存在,则字面转换翻译键。 + +```java +Text translatable = Text.translatable("my_mod.text.hello"); + +// Similarly to literals, translatable text can be easily made mutable. +MutableText mutable = Text.translatable("my_mod.text.bye"); +``` + +语言文件,`en_us.json`,看上去应该像这样: + +```json +{ + "my_mod.text.hello": "Hello!", + "my_mod.text.bye": "Goodbye :(" +} +``` + +## 序列化文本{#serializing-text} + + + +前面提到过,可以使用 text codec 将文本序列化为 JSON。 更多关于 codec 的信息,请看 [Codec](./codecs) 页面。 + +@[code transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/TextTests.java) + +这会产生可用于数据包、命令和其他接受 JSON 格式文本而非字面或可翻译文本的地方的 JSON。 + +## 反序列化文本{#deserializing-text} + +要将 JSON 文本对象反序列化为 `Text` 类,还是使用 codec。 + +@[code transcludeWith=:::2](@/reference/latest/src/client/java/com/example/docs/rendering/TextTests.java) + +## 格式化文本{#formatting-text} + +你应该熟悉 Minecraft 的格式化标准: + +可以对 `MutableText` 类使用 `Formatting` 枚举以应用这些格式。 + +```java +MutableText result = Text.literal("Hello World!") + .formatted(Formatting.AQUA, Formatting.BOLD, Formatting.UNDERLINE); +``` + + + + + + + + + + + + + + + + + + + + + + + + + +
颜色名称聊天代码MOTD 代码十六进制代码
黑色(black)§0\u00A70#000000
深蓝色(dark_blue)§1\u00A71#0000AA
深绿色(dark_green)§2\u00A72#00AA00
深青色(dark_aqua)§3\u00A73#00AAAA
深红色(dark_red)§4\u00A74#AA0000
深紫色(dark_purple)§5\u00A75#AA00AA
金色(gold)§6\u00A76#FFAA00
灰色(gray)§7\u00A77#AAAAAA
深灰色(dark_gray)§8\u00A78#555555
蓝色(blue)§9\u00A79#5555FF
绿色(green)§a\u00A7a#55FF55
青色(aqua)§b\u00A7b#55FFFF
红色(red)§c\u00A7c#FF5555
淡紫色(light_purple)§d\u00A7d#FF55FF
黄色(yellow)§e\u00A7e#FFFF55
白色(white)§f\u00A7f#FFFFFF
重置§r
加粗§l
删除线§m
下划线§n
斜体§o
混淆§k
diff --git a/translated/zh_cn/index.md b/translated/zh_cn/index.md index f8d0498e7..7eff4f7a2 100644 --- a/translated/zh_cn/index.md +++ b/translated/zh_cn/index.md @@ -1,10 +1,10 @@ --- title: Fabric 文档 -description: 为 Fabric —— 一套 Minecraft 模组工具链 —— 精心撰写的官方文档。 +description: 为 Minecraft 的一个模组制作工具链 Fabric 精心撰写的官方文档。 layout: home hero: name: Fabric 文档 - tagline: 为 Fabric —— 一套 Minecraft 模组工具链 —— 精心撰写的官方文档。 + tagline: 为 Minecraft 的一个模组制作工具链 Fabric 精心撰写的官方文档。 features: - title: 开发者指南 icon: 🛠️ @@ -20,8 +20,8 @@ features:
-## 如何贡献? {#contribute} +## 想要贡献? {#contribute} -如果您想给 Fabric 文档做贡献,您可以在[GitHub](https://github.com/FabricMC/fabric-docs) 找到本项目的源码,以及相关的[贡献指南](./contributing)。 +如果想给 Fabric 文档做贡献,可以在 [GitHub](https://github.com/FabricMC/fabric-docs) 找到源代码,以及相关的[贡献指南](./contributing)。
diff --git a/translated/zh_cn/players/faq.md b/translated/zh_cn/players/faq.md index f4f699057..275896ae8 100644 --- a/translated/zh_cn/players/faq.md +++ b/translated/zh_cn/players/faq.md @@ -3,29 +3,27 @@ title: 玩家常见问题 description: 玩家和服务器管理员有关 Fabric 的常见问题。 --- -# 玩家常见问题 +# 常规问题 -有很多问题经常被问到,因此我们在此整理了一份问题清单。 +有很多问题经常问到,因此我们在此整理了一份清单。 -## 常规问题 - -### Fabric支持哪些Minecraft版本? +## Fabric 支持哪些 Minecraft 版本? {#what-minecraft-versions-does-fabric-support} Fabric 官方支持从快照 `18w43b` 和正式版 `1.14` 及以上的所有 Minecraft 版本。 -### 在哪里可以下载已发布的 Fabric 模组? +## 在哪里可以下载已发布的 Fabric 模组? {#where-can-i-download-published-fabric-mods} :::info -您应始终检查模组是否来自可信的来源。 您应始终检查模组是否来自可信的来源。 如果你想要获取更多信息,请查看 [寻找可受信的模组](./finding-mods) 指南。 +您应始终检查模组是否来自可信的来源。 更多信息请查看[寻找可信的模组](./finding-mods)指南。 ::: -大多数作者都会将自己的模组发布到 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 和 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods&gameVersionTypeId=4) 上,但也有一些作者会选择将它们上传到个人网站或其他平台,如 GitHub 仓库。 +大多数作者都会将自己的模组发布到 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 和 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods\\&gameVersionTypeId=4) 上,但也有一些作者会选择将模组上传到个人网站或其他平台,如 GitHub 仓库。 -### 在哪里可以找到现成的 Fabric 整合包? +## 在哪里可以找到现成的 Fabric 整合包? {#where-can-i-find-premade-fabric-modpacks} 您可以在各种平台上找到现成的 Fabric 整合包,例如 - [Modrinth](https://modrinth.com/modpacks?g=categories:%27fabric%27) -- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks&gameVersionTypeId=4) +- [CurseForge](https://www.curseforge.com/minecraft/search?class=modpacks\\&gameVersionTypeId=4) - [Feed The Beast](https://www.feed-the-beast.com/ftb-app) - [Technic](https://www.technicpack.net/modpacks) diff --git a/translated/zh_cn/players/finding-mods.md b/translated/zh_cn/players/finding-mods.md index 65de5786c..a8c0078f3 100644 --- a/translated/zh_cn/players/finding-mods.md +++ b/translated/zh_cn/players/finding-mods.md @@ -1,15 +1,15 @@ --- -title: 寻找可信赖的模组 -description: 本指南教你如何使用可信任的来源找到 Fabric 模组 +title: 寻找可信的模组 +description: 本指南教你如何使用可信来源找到 Fabric 模组。 authors: - IMB11 --- -# 寻找可信赖的模组{#finding-mods} +# 寻找可信的模组{#finding-mods} -首先,信任是主观的,当下载模组时你应该始终根据自己的判断。 但是,有一些方法可以帮助你找到可信赖的模组。 +首先,信任是主观的,当下载模组时你应该始终根据自己的判断。 但是,有一些方法可以帮助你找到可信的模组。 -## 1. 使用众所周知的可信任来源{#trustworthy-source} +## 1. 使用众所周知的可信来源{#trustworthy-source} 大部分作者都将他们的模组发布在 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 和 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods\\&gameVersionTypeId=4) 上。 @@ -17,7 +17,7 @@ authors: ## 2. 与其他人讨论! {#with-others} -如果要从并非已知可靠的来源下载模组,应该先向他人询问,看看他们是否曾从你下载的地方下载过该模组,以及他们是否遇到过任何问题。 +如果要从并非已知可信的来源下载模组,应该先向他人询问,看看他们是否曾从你下载的地方下载过该模组,以及他们是否遇到过任何问题。 如遇问题,欢迎在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#player-support` 频道提问。 diff --git a/translated/zh_cn/players/installing-fabric.md b/translated/zh_cn/players/installing-fabric.md index 5a916a80f..ad74322e6 100644 --- a/translated/zh_cn/players/installing-fabric.md +++ b/translated/zh_cn/players/installing-fabric.md @@ -3,6 +3,8 @@ title: 安装 Fabric description: 如何安装 Fabric 的手把手指南。 authors: - IMB11 + - Benonardo + - modmuss50 --- # 安装 Fabric{#installing-fabric} @@ -11,15 +13,15 @@ authors: 对于第三方启动器,你应该查阅它们的文档。 -## 1. 下载 Fabric 安装程序{#1-download-the-fabric-installer} +## 1. 下载 Fabric 安装器{#1-download-the-fabric-installer} -可以从 [Fabric 网站](https://fabricmc.net/use/) 下载 Fabric 的安装程序。 +可以从 [Fabric 网站](https://fabricmc.net/use/) 下载 Fabric 安装器。 如果使用 Windows,下载 `.exe` 版本 (`Download For Windows`),因为不需要你的系统已安装 Java, 而是使用官方启动器附带的 Java。 对于 macOS 和 Linux,您应该下载 `.jar` 版本。 有时,此步骤之前需要安装 Java。 -## 2. 运行 Fabric 安装程序{#2-run-the-fabric-installer} +## 2. 运行 Fabric 安装器{#2-run-the-fabric-installer} :::warning 在安装之前,请先关闭 Minecraft 和 Minecraft Launcher。 @@ -29,14 +31,14 @@ authors: 在 macOS 上,可能需要右键点击下载目录中的 `.jar`,然后点击 `Open` 来运行。 -![Fabric 安装程序中的 MacOS 上下文菜单](/assets/players/installing-fabric/macos-downloads.png) +![Fabric 安装器中的 MacOS 上下文菜单](/assets/players/installing-fabric/macos-downloads.png) 问到“Are you sure you want to open it?”时,再次点击 `Open`。 ::: 打开安装器后,应该会看到这样的屏幕: -![高亮 "Install" 的 Fabric 安装程序](/assets/players/installing-fabric/installer-screen.png) +![高亮 "Install" 的 Fabric 安装器](/assets/players/installing-fabric/installer-screen.png) 要安装 Fabric,只需从下拉列表中选择您的游戏版本,然后单击 `Install`。 @@ -44,10 +46,10 @@ authors: ## 3. 搞定! {#3-you-re-done} -安装程序完成后,可以打开 Minecraft Launcher,从左下角的下拉列表中选择 Fabric 配置文件,然后按下 `Play`! +安装器完成后,可以打开 Minecraft Launcher,从左下角的下拉列表中选择 Fabric 配置文件,然后按下 `Play`! ![选中了 Fabric 配置的 Minecraft Launcher](/assets/players/installing-fabric/launcher-screen.png) -现在安装好了 Fabric,就可以向你的游戏添加模组了! 更多信息请查看[寻找可信赖的模组](./finding-mods)指南。 +现在安装好了 Fabric,就可以向你的游戏添加模组了! 更多信息请查看[寻找可信的模组](./finding-mods)指南。 如果在遵循本指南时遇到任何问题,可以在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#player-support` 频道中寻求帮助。 diff --git a/translated/zh_cn/players/installing-java/linux.md b/translated/zh_cn/players/installing-java/linux.md index 87ef196d0..234231a3f 100644 --- a/translated/zh_cn/players/installing-java/linux.md +++ b/translated/zh_cn/players/installing-java/linux.md @@ -5,25 +5,25 @@ authors: - IMB11 --- -# 在 Linux 上安装 Java +# 在 Linux 上安装 Java{#installing-java-on-linux} -这个指南将会指引您在 Linux 上安装 Java 17。 +这个指南将会指引您在 Linux 上安装 Java 21。 -## 1. 验证 Java 是否已经安装 +## 1. 检查 Java 是否已经安装{#1-check-if-java-is-already-installed} 打开终端输入 `java -version` 并按下 `回车`。 ![输入 "java -version" 的终端](/assets/players/installing-java/linux-java-version.png) :::warning -要使用大多数现代 Minecraft 版本,您至少需要安装 Java 17。 如果此命令显示版本低于 17,您需要更新您的现有 Java。 +要使用 Minecraft 1.21,你需要安装至少 Java 21。 如果运行该命令后显示 Java 版本低于 21,你需要更新设备上现有 Java。 ::: -## 2. 下载并安装 Java 17 +## 2. 下载并安装 Java 21{#2-downloading-and-installing-java} -我们推荐使用 OpenJDK 17,他可以在大多数 Linux 发行版中可用。 +我们推荐使用 OpenJDK 21,可以在大多数 Linux 发行版中可用。 -### Arch Linux +### Arch Linux{#arch-linux} :::info 更多在 Arch Linux 上安装 Java 的信息可以参考 [Arch Linux 中文维基](https://wiki.archlinuxcn.org/wiki/Java)。 @@ -47,45 +47,45 @@ sudo pacman -S jre-openjdk-headless sudo pacman -S jdk-openjdk ``` -### Debian/Ubuntu +### Debian/Ubuntu{#debian-ubuntu} -您可以用以下命令使用 `apt` 安装 Java17: +您可以用以下命令使用 `apt` 安装 Java 21: ```sh sudo apt update -sudo apt install openjdk-17-jdk +sudo apt install openjdk-21-jdk ``` -### Fedora +### Fedora{#fedora} -您可以用以下命令使用 `dnf` 安装 Java17: +您可以用以下命令使用 `dnf` 安装 Java 21: ```sh -sudo dnf install java-17-openjdk +sudo dnf install java-21-openjdk ``` 如果您不需要图形化接口,您可以安装 headless 版本: ```sh -sudo dnf install java-17-openjdk-headless +sudo dnf install java-21-openjdk-headless ``` 如果您计划开发模组,您需要安装 JDK: ```sh -sudo dnf install java-17-openjdk-devel +sudo dnf install java-21-openjdk-devel ``` -### 其他 Linux 发行版 +### 其他 Linux 发行版{#other-linux-distributions} 如果您的发行版未在上文列出,您可以从 [Adoptium](https://adoptium.net/zh-CN/temurin/) 下载最新版 JRE。 如果您计划开发模组,您应该参考您的发行版的替代指南。 -## 3. 验证是否已安装 Java 17 +## 3. 验证是否已安装 Java 21{#3-verify-that-java-is-installed} -安装完成后,您可以打开终端并输入 `java -version` 来验证 Java 17 是否已安装。 +安装完成后,您可以打开终端并输入 `java -version` 来验证 Java 21 是否已安装。 -如果指令成功执行,您可以看到类似前文所示的内容,java 版本被展示出来: +如果命令成功执行,你可以看到类似前文所示的内容,Java 版本被显示出来: ![输入 "java -version" 的终端](/assets/players/installing-java/linux-java-version.png) diff --git a/translated/zh_cn/players/installing-java/windows.md b/translated/zh_cn/players/installing-java/windows.md index 09a74d9d8..190c24c7a 100644 --- a/translated/zh_cn/players/installing-java/windows.md +++ b/translated/zh_cn/players/installing-java/windows.md @@ -7,11 +7,11 @@ authors: # 在 Windows 上安装 Java -这个指南将会指引您在 Windows 上安装 Java 17。 +这个指南将会指引您在 Windows 上安装 Java 21。 -Minecraft 启动器附带了自己的 Java 安装,因此这部分只在你想使用 Fabric 的 `.jar` 安装程序,或者你想使用 Minecraft 服务器的 `.jar` 时有关。 +Minecraft 启动器附带了自己的 Java 安装,因此这部分只在你想使用 Fabric 的 `.jar` 安装器,或者你想使用 Minecraft 服务器的 `.jar` 时有关。 -## 1. 检查 Java 是否已被安装 +## 1. 检查 Java 是否已经安装{#1-check-if-java-is-already-installed} 要检查 Java 是否已安装,你首先必须打开命令提示符。 @@ -26,12 +26,12 @@ Minecraft 启动器附带了自己的 Java 安装,因此这部分只在你想 ![命令提示符中输入了「java -version」](/assets/players/installing-java/windows-java-version.png) :::warning -要使用较新的 Minecraft (1.19.x 及以上) 版本,你至少需要安装版本 ≥ 17 的 Java。 如果运行该命令后显示 Java 版本低于 17,你需要更新设备上现有 Java。 +要使用 Minecraft 1.21,你需要安装至少 Java 21。 如果运行该命令后显示 Java 版本低于 21,你需要更新设备上现有 Java。 ::: -## 2. 下载 Java 17 安装程序 +## 2. 下载 Java 21 安装程序{#2-download-the-java-installer} -要安装 Java 17,你需要从 [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows&package=jdk&version=17) 下载安装程序。 +要安装 Java 21,你需要从 [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows\&package=jdk\&version=21) 下载安装程序。 你需要下载 `Windows Installer (.msi)` 版本: @@ -41,20 +41,20 @@ Minecraft 启动器附带了自己的 Java 安装,因此这部分只在你想 现代大多数电脑都运行 64 位操作系统。 如果你不确定,请尝试使用 64 位的下载。 -## 3. 运行安装程序! +## 3. 运行安装程序! {#3-run-the-installer} -按照安装程序的步骤安装 Java 17。 当你到达这个页面时,你应该将以下功能设置为「整个功能将安装在本机硬盘上」: +按照安装程序的步骤安装 Java 21。 当你到达这个页面时,你应该将以下功能设置为「整个功能将安装在本机硬盘上」: - `Set JAVA_HOME environment variable` - 这将加入到你的PATH中。 - `JavaSoft (Oracle) registry keys` -![Java 17 安装程序,具有「Set JAVA_HOME variable」和「JavaSoft (Oracle) registry keys」](/assets/players/installing-java/windows-wizard-screenshot.png) +![Java 21 安装程序,具有「Set JAVA\_HOME variable」和「JavaSoft (Oracle) registry keys」](/assets/players/installing-java/windows-wizard-screenshot.png) 完成后,你可以按 `下一步` 继续安装。 -## 4. 检查 Java 17 是否已被正确安装 +## 4. 验证是否已安装 Java 21{#4-verify-that-java-is-installed} -安装完成后,您可以打开终端并输入 `java -version` 来验证 Java 17 是否已安装。 +安装完成后,您可以打开命令提示符并输入 `java -version` 来验证 Java 21 是否已安装。 如果命令成功执行,你可以看到类似前文所示的内容,Java 版本被显示出来: diff --git a/translated/zh_cn/players/installing-mods.md b/translated/zh_cn/players/installing-mods.md index 6a9776704..2d3808e68 100644 --- a/translated/zh_cn/players/installing-mods.md +++ b/translated/zh_cn/players/installing-mods.md @@ -14,7 +14,7 @@ authors: ## 1. 下载模组{#1-download-the-mod} :::warning -你应该只从你信任的来源下载模组。 关于寻找模组的更多信息,请看[寻找可信任的模组](./finding-mods)指南。 +你应该只从你信任的来源下载模组。 关于寻找模组的更多信息,请看[寻找可信的模组](./finding-mods)指南。 ::: 大多数模组都需要 Fabric API,可从 [Modrinth](https://modrinth.com/mod/fabric-api) 或 [CurseForge](https://curseforge.com/minecraft/mc-mods/fabric-api) 下载。 diff --git a/translated/zh_cn/players/troubleshooting/crash-reports.md b/translated/zh_cn/players/troubleshooting/crash-reports.md index cf100898c..7b1aa6981 100644 --- a/translated/zh_cn/players/troubleshooting/crash-reports.md +++ b/translated/zh_cn/players/troubleshooting/crash-reports.md @@ -1,25 +1,25 @@ --- title: 崩溃报告 -description: 学习如何处理崩溃报告以及如何阅读它们。 +description: 学习如何处理崩溃报告以及如何阅读。 authors: - IMB11 --- -# 崩溃报告 +# 崩溃报告{#crash-reports} :::tip -如果你在查找崩溃原因时遇到困难,可以在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#player-support` 或 `#server-admin-support` 频道中寻求帮助。 +如果在查找崩溃原因时遇到任何困难,可以在 [Fabric Discord](https://discord.gg/v6v4pMv) 的 `#player-support` 或 `#server-admin-support` 频道中寻求帮助。 ::: -崩溃报告是解决游戏或服务器问题的重要部分。 它包含大量关于崩溃的信息,可以帮助你找到崩溃的原因。 它包含大量关于崩溃的信息,可以帮助你找到崩溃的原因。 +崩溃报告是解决游戏或服务器问题的重要部分, 包含大量关于崩溃的信息,可以帮助你找到崩溃的原因。 -## 寻找崩溃报告 +## 寻找崩溃报告{#finding-crash-reports} -它们位于游戏根目录中的 `crash-reports` 文件夹中。 如果是服务器,它们会存储在服务器实例根目录下的 `crash-reports` 文件夹中。 如果是服务器,它们会存储在服务器实例根目录下的 `crash-reports` 文件夹中。 +崩溃报告存储在游戏目录中的 `crash-reports` 文件夹中。 如果是服务器,则存储在服务器目录中的 `crash-reports` 文件夹中。 对于第三方启动器,你应该参考其文档,了解在哪里可以找到崩溃报告。 -崩溃报告可能在以下位置被找到: +以下位置能找到崩溃报告: ::: code-group @@ -37,53 +37,54 @@ authors: ::: -## 阅读崩溃报告 +## 阅读崩溃报告{#reading-crash-reports} -崩溃报告的篇幅很长,读起来十分费解。 但无论怎样,它包含着大量关于崩溃的信息,可以帮助你找到崩溃的原因,因此你不得不阅读它。 但无论怎样,它包含着大量关于崩溃的信息,可以帮助你找到崩溃的原因,因此你不得不阅读它。 +崩溃报告的篇幅很长,读起来可能十分费解, 然而包含大量关于崩溃的信息,可以帮助你找到崩溃的原因。 在本指南中,我们将以 [该崩溃报告](https://github.com/FabricMC/fabric-docs/blob/main/public/assets/players/crash-report-example.txt) 为例。 -### 崩溃报告的各部分 +:::details 显示崩溃报告 -崩溃报告由几个部分组成,每个部分都用标题来分隔: +<<< @/public/assets/players/crash-report-example.txt{log} -- `---- Minecraft Crash Report ----`,报告摘要部分。 该部分包含导致崩溃的主要错误原因、发生时间和相关堆栈跟踪。 这是崩溃报告中最重要的部分,因为堆栈跟踪通常会提及到导致崩溃的模组。 该部分包含导致崩溃的主要错误原因、发生时间和相关堆栈跟踪。 这是崩溃报告中最重要的部分,因为堆栈跟踪通常会提及到导致崩溃的模组。 -- `-- Last Reload --`,除非崩溃发生在资源重载过程中 (F3+T) ,否则这部分并没有什么用处。 该部分将包含上次重载的发生时间,以及重载过程中出现的任何错误的相关堆栈跟踪。 这些错误通常是由资源包引起的,可以忽略不计,除非它们导致游戏出现问题。 -- `-- System Details --`,本部分包含有关设备的信息,如操作系统、Java 版本和分配给游戏的内存量。 该部分有助于确定你使用的 Java 版本是否正确,以及是否为游戏分配了足够的内存。 该部分有助于确定你使用的 Java 版本是否正确,以及是否为游戏分配了足够的内存。 - - 在此部分中,Fabric 将插入一些自定义内容,其标题为 `Fabric Mods:`,后面是所有已安装模组的列表。 该部分有助于判断模组之间是否有可能发生冲突。 该部分有助于判断模组之间是否有可能发生冲突。 +::: + +### 崩溃报告的各部分{#crash-report-sections} + +崩溃报告由几个部分组成,每个部分用标题分隔: -### 分解崩溃报告 +- `---- Minecraft Crash Report ----`,报告的摘要。 该部分包含导致崩溃的主要错误原因、发生时间和相关堆栈跟踪。 这是崩溃报告中最重要的部分,因为堆栈跟踪通常会提及到导致崩溃的模组。 +- `-- Last Reload --`,这部分不太有用,除非崩溃发生在资源重载过程中(F3+T)。 该部分将包含上次重载的发生时间,以及重载过程中出现的任何错误的相关堆栈跟踪。 这些错误通常是由资源包引起的,可以忽略,除非是这些资源包导致的游戏出现问题。 +- `-- System Details --`,本部分包含有关系统的信息,如操作系统、Java 版本和分配给游戏的内存量。 该部分有助于确定你使用的 Java 版本是否正确,以及是否为游戏分配了足够的内存。 + - 在此部分中,Fabric 将插入一些自定义内容,其标题为 `Fabric Mods:`,后面是所有已安装模组的列表。 该部分有助于判断模组之间是否可能已发生冲突。 -既然我们已经知道崩溃报告的每个部分代表着什么,我们就可以开始分解崩溃报告并找出崩溃原因。 +### 分解崩溃报告{#breaking-down-the-crash-report} + +既然已经知道崩溃报告的每个部分是什么,就可以开始分解崩溃报告并找出崩溃原因。 利用上面链接的崩溃示例,我们可以分析崩溃报告并找到崩溃原因,包括导致崩溃的模组。 -`-- Last Reload --`,除非崩溃发生在资源重载过程中 (F3+T) ,否则这部分并没有什么用处。 该部分将包含上次重载的发生时间,以及重载过程中出现的任何错误的相关堆栈跟踪。 这些错误通常是由资源包引起的,可以忽略不计,除非它们导致游戏出现问题。 在这种情况下,`---- Minecraft Crash Report ----` 部分中的堆栈跟踪最为重要,因为它包含导致崩溃的主要错误。 在这里,错误为`java.lang.NullPointerException: Cannot invoke "net.minecraft.class_2248.method_9539()" because "net.minecraft.class_2248.field_10540" is null`. +在这个情形中,`---- Minecraft Crash Report ---- ` 部分中的堆栈跟踪最重要,因为包含导致崩溃的主要错误。 在这里,错误为`java.lang.NullPointerException: Cannot invoke "net.minecraft.class_2248.method_9539()" because "net.minecraft.class_2248.field_10540" is null`. -由于堆栈跟踪中提到了大量的模组,因此很难指认崩溃"凶手",不过,首先要做的是查找导致崩溃的部分。 +堆栈跟踪中提到了大量模组,因此很难指出原因,不过,首先要做的是查找导致崩溃的模组。 -```:no-line-numbers -at snownee.snow.block.ShapeCaches.get(ShapeCaches.java:51) -at snownee.snow.block.SnowWallBlock.method_9549(SnowWallBlock.java:26) // [!code focus] -... -at me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache.shouldDrawSide(BlockOcclusionCache.java:52) -at link.infra.indium.renderer.render.TerrainBlockRenderInfo.shouldDrawFaceInner(TerrainBlockRenderInfo.java:31) -... -``` + + +<<< @/public/assets/players/crash-report-example.txt{8-9,14-15 log} 在这里,导致崩溃的模组是 `snownee`,因为它是堆栈跟踪中提到的第一个模组。 -不过,从堆栈追踪中提到的模组数量来看,这可能意味着模组之间存在一些兼容性问题,导致崩溃的模组可能并不是出错的模组。 在这种情况下,最好向模组作者报告崩溃情况,让他们调查崩溃原因。 在这种情况下,最好向模组作者报告崩溃情况,让他们调查崩溃原因。 +不过,提到的模组有很多,可能意味着模组之间存在一些兼容性问题,导致崩溃的模组可能并不是出错的模组。 在这种情况下,最好向模组作者报告崩溃情况,让他们调查崩溃原因。 -## Mixin崩溃 +## Mixin 崩溃{#mixin-crashes} :::info -Mixin 是一种修改游戏的方式,使模组无需破坏性的直接修改游戏的源代码。 它被许多模组使用,对于开发者来说是一款非常强大的工具。 它被许多模组使用,对于开发者来说是一款非常强大的工具。 +Mixin 是一种修改游戏而无需修改游戏的源代码的方式。 许多模组都用了 mixin,这对于开发者来说是非常强大的工具。 ::: -当有 Mixin 引起的崩溃时,通常会在堆栈跟踪中提到该 Mixin 类以及该 Mixin 类修改的类。 +当有 mixin 崩溃时,通常会在堆栈跟踪中提到该 mixin 类以及该 mixin 类修改的类。 -方法 Mixin 的标识 `modid$handlerName` 将被包含在堆栈跟踪中,其中 `modid` 是模组的 ID,而 `handlerName` 是 Mixin 处理部分的名称。 +方法 mixin 会在堆栈跟踪中包含 `modid$handlerName`,其中 `modid` 是模组的 ID,`handlerName` 是 mixin 处理器的名称。 ```:no-line-numbers ... net.minecraft.class_2248.method_3821$$$modid$handlerName() ... // [!code focus] @@ -91,14 +92,14 @@ Mixin 是一种修改游戏的方式,使模组无需破坏性的直接修改 你可以使用此信息找到导致崩溃的模组,并向模组作者报告崩溃情况。 -## 如何处理崩溃报告 +## 如何处理崩溃报告{#what-to-do-with-crash-reports} -处理崩溃报告的最佳方法是将其上传到在线粘贴板网站,然后在问题追踪处或通过某种联系方式 (Discord 等) 向修改器作者提供崩溃报告网站链接。 +处理崩溃报告的最佳方法是将其上传到在线粘贴板网站,然后将链接分享给模组作者,可以是在他们的问题追踪器,或通过某种联系方式(Discord 等)。 -这可以让模组作者调查崩溃原因、重现崩溃状况并解决导致崩溃的问题。 +这可以让模组作者调查崩溃、复现崩溃并解决导致崩溃的问题。 常用的崩溃报告粘贴网站有: - [GitHub Gist](https://gist.github.com/) -- [Pastebin](https://pastebin.com/) - [mclo.gs](https://mclo.gs/) +- [Pastebin](https://pastebin.com/) diff --git a/translated/zh_cn/players/troubleshooting/uploading-logs.md b/translated/zh_cn/players/troubleshooting/uploading-logs.md index 19a4db55c..42cdf78aa 100644 --- a/translated/zh_cn/players/troubleshooting/uploading-logs.md +++ b/translated/zh_cn/players/troubleshooting/uploading-logs.md @@ -5,27 +5,27 @@ authors: - IMB11 --- -# 上传日志 +# 上传日志{#uploading-logs} 在进行疑难解答时,通常需要提供日志以帮助寻找问题的原因。 -## 为什么我应该上传日志? +## 为什么我应该上传日志? {#why-should-i-upload-logs} -上传日志可以让其他人更快地帮助您疑难解答,而不是简单地将日志粘贴到聊天或论坛帖子中。 它还允许你与其他人分享你的日志,而无需拷贝和粘贴它们。 它还允许你与其他人分享你的日志,而无需拷贝和粘贴它们。 +上传日志可以让其他人更快地帮助您疑难解答,而不是简单地将日志粘贴到聊天或论坛帖子中, 还允许你与其他人分享你的日志,而无需复制和粘贴。 -有些文本分享网站还为日志提供语法高亮显示,使日志更容易阅读,但可能会审查敏感信息,如用户名或系统信息。 +有些粘贴网站还为日志提供语法高亮,使日志更容易阅读,但可能会审查敏感信息,如用户名或系统信息。 -## 崩溃报告 +## 崩溃报告{#crash-reports} -当游戏崩溃时,会自动生成崩溃报告。 它们只包含崩溃信息,而不包含游戏的实际日志。 它们位于游戏目录中的 `crash-reports` 文件夹中。 它们只包含崩溃信息,而不包含游戏的实际日志。 它们位于游戏目录中的 `crash-reports` 文件夹中。 +游戏崩溃时会自动生成崩溃报告。 崩溃报告只包含崩溃信息,不包含游戏的实际日志。 崩溃报告位于游戏目录中的 `crash-reports` 文件夹中。 有关崩溃报告的更多信息,请参阅[崩溃报告](./crash-reports)。 -## 寻找日志 +## 找到日志{#locating-logs} 本指南涵盖了官方 Minecraft 启动器(通常称为“原版启动器”),对于第三方启动器,你应该参阅其文档。 -日志位于游戏目录下的 logs 文件夹中,游戏目录可以在以下位置找到,具体取决于你的操作系统: +日志位于游戏目录下的 `logs` 文件夹中,游戏目录可以在以下位置找到,具体取决于你的操作系统: ::: code-group @@ -45,7 +45,7 @@ authors: 最新的日志文件名为 `latest.log`,先前的日志使用命名格式 `yyyy-mm-dd_number.log.gz`。 -## 上传日志 +## 在线上传日志{#uploading-logs-online} 日志可以上传到各种服务,例如: diff --git a/translated/zh_cn/players/updating-fabric.md b/translated/zh_cn/players/updating-fabric.md index 1b120ef62..0868ce6cf 100644 --- a/translated/zh_cn/players/updating-fabric.md +++ b/translated/zh_cn/players/updating-fabric.md @@ -22,7 +22,7 @@ authors: -更新 Fabric,简单地确认游戏版本和加载器版本是正确的,然后点击 `安装` 。 +更新 Fabric,简单确认游戏版本和 Loader 版本是正确的,然后点击 `安装` 。 :::important **运行安装程序时,请确保没有选中“创建新的启动器配置”,否则将创建新的配置文件,而这种情况下我们不需要。** @@ -30,11 +30,11 @@ authors: ## 3. 在 Minecraft 启动器中打开配置{#3-open-the-profile-in-the-minecraft-launcher} -安装程度完成后,可以打开 Minecraft 启动器并前往 `Installations(安装)` 选项。 您应当前往您的 Fabric 配置并打开编辑界面。 +安装器完成后,可以打开 Minecraft 启动器并前往 `Installations(安装)` 选项。 您应当前往您的 Fabric 配置并打开编辑界面。 -将该版本替换为刚才安装的 Fabric 加载器版本并点击 `保存`。 +将该版本替换为刚才安装的 Fabric Loader 版本并点击 `保存`。 -![在 Minecraft 启动器中更新 Fabric](/assets/players/updating-fabric.png) +![在 Minecraft 启动器中更新 Fabric Loader 版本](/assets/players/updating-fabric.png) ## 4. 搞定! {#4-you-re-done} diff --git a/translated/zh_cn/sidebar_translations.json b/translated/zh_cn/sidebar_translations.json index 740e6369f..17e71f3e8 100644 --- a/translated/zh_cn/sidebar_translations.json +++ b/translated/zh_cn/sidebar_translations.json @@ -6,7 +6,7 @@ "players.installingJava.macOS": "macOS", "players.installingJava.linux": "Linux", "players.installingFabric": "安装 Fabric", - "players.findingMods": "寻找可信赖的模组", + "players.findingMods": "寻找可信的模组", "players.installingMods": "安装模组", "players.troubleshooting": "疑难解答", "players.troubleshooting.uploadingLogs": "上传你的日志", @@ -27,6 +27,9 @@ "develop.items.custom-item-groups": "自定义物品组", "develop.items.custom-item-interactions": "自定义物品交互", "develop.items.potions": "药水", + "develop.blocks": "方块", + "develop.blocks.first-block": "创建你的第一个方块", + "develop.blocks.blockstates": "方块状态", "develop.entities": "实体", "develop.entities.effects": "状态效果", "develop.entities.damage-types": "伤害类型", @@ -48,6 +51,6 @@ "develop.misc.events": "事件", "develop.misc.text-and-translations": "文本和翻译", "develop.sounds": "声音", - "develop.sounds.using-sounds": "播放声音事件", + "develop.sounds.using-sounds": "播放声音", "develop.sounds.custom": "创建自定义声音" } \ No newline at end of file diff --git a/translated/zh_cn/website_translations.json b/translated/zh_cn/website_translations.json new file mode 100644 index 000000000..5fc258d07 --- /dev/null +++ b/translated/zh_cn/website_translations.json @@ -0,0 +1,46 @@ +{ + "authors.heading": "页面作者", + "authors.nogithub": "%s(不在 GitHub)", + "banner": "Fabric 文档仍在进展中,请在 %s 或 %s 报告问题。", + "description": "Minecraft 的模组开发工具链 Fabric 的全面文档。", + "footer.next": "下一页", + "footer.prev": "上一页", + "github_edit": "在 GitHub 编辑此页", + "lang_switcher": "更改语言", + "last_updated": "上次更新于", + "mode_dark": "切换到深色主题", + "mode_light": "切换到浅色主题", + "mode_switcher": "外观", + "nav.contribute": "贡献", + "nav.contribute.api": "Fabric API", + "nav.download": "下载", + "nav.home": "首页", + "outline": "在本页", + "return_to_top": "回到顶部", + "search.back": "关闭搜索", + "search.button": "搜索", + "search.display_details": "显示详细列表", + "search.footer.close": "关闭", + "search.footer.close.key": "Escape", + "search.footer.down.key": "下箭头", + "search.footer.navigate": "导航", + "search.footer.up.key": "上箭头", + "search.footer.select": "选择", + "search.footer.select.key": "Enter", + "search.no_results": "没有以下的结果", + "search.reset": "重置搜索", + "sidebar_menu": "菜单", + "social.discord": "Discord", + "social.github": "GitHub", + "title": "Fabric 文档", + "version_switcher": "切换版本", + "404.code": "404", + "404.crowdin_link": "在 Crowdin 中本地化", + "404.crowdin_link.label": "打开 Crowdin 编辑器", + "404.english_link": "用英语阅读", + "404.english_link.label": "打开英文版", + "404.link": "返回主页", + "404.link.label": "前往主页", + "404.quote": "这个页面试图在熔岩里游泳", + "404.title": "未找到页面" +} \ No newline at end of file diff --git a/translated/zh_tw/develop/getting-started/creating-a-project.md b/translated/zh_tw/develop/getting-started/creating-a-project.md new file mode 100644 index 000000000..6bd42c2cd --- /dev/null +++ b/translated/zh_tw/develop/getting-started/creating-a-project.md @@ -0,0 +1,68 @@ +--- +title: 建立一個專案 +description: 關於如何使用 Fabric 模組模板生成器來製作新的模組專案的逐步指南。 +authors: + - IMB11 +--- + +# 建立一個專案 {#creating-a-project} + +Fabric 提供了使用 Fabric 模組模板生成器創建新模組專案的簡單方法。 —— 如果你願意,也可以使用範例模組儲存庫手動創建一個新專案,請參閱 [手動創建專案](#manual-project-creation) 章節。 + +## 生成專案 {#generating-a-project} + +你可以使用 [Fabric Template Mod Generator](https://fabricmc.net/develop/template/) 來生成你的新模組專案 —— 你需要填寫必要的部分,比如套件名稱和模組名稱,還有你想開發的模組的 Minecraft 版本。 + +![Preview of the generator](/assets/develop/getting-started/template-generator.png) + +如果你想要使用 Kotlin 進行開發,或是想增加 data generators ,可以在 `Advanced Options` 部分勾選對應的選項。 + +![Advanced options section](/assets/develop/getting-started/template-generator-advanced.png) + +必要的部分輸入完成後,點擊 `Generate` 按鈕,生成器會以 zip 檔的形式產生新專案給你使用。 + +你需要把這個 zip 檔解壓縮到你想要的位置,然後從 IntelliJ IDEA 打開解壓縮後的資料夾: + +![Open Project Prompt](/assets/develop/getting-started/open-project.png) + +## 導入專案 {#importing-the-project} + +在 IntelliJ IDEA 打開專案後, IDE 會自動載入專案的 Gradle 配置並執行必要的初始化任務。 + +如果你收到了一個關於 Gradle 構建腳本的通知,你應該點擊 `Import Gradle Project` 按鈕: + +![Gradle Prompt](/assets/develop/getting-started/gradle-prompt.png) + +專案導入完成後,你就可以在專案資源管理器中看到專案的文件,就能開始開發你的模組了。 + +## 手動建立專案 {#manual-project-creation} + +:::warning +你會需要安裝 [Git](https://git-scm.com/) 來複製範例模組儲存庫。 +::: + +如果你無法使用 Fabric 模組模板生成器,可以按照以下步驟手動建立新專案。 + +首先,使用 Git 複製範例模組儲存庫: + +```sh +git clone https://github.com/FabricMC/fabric-example-mod/ my-mod-project +``` + +這會把儲存庫複製到一個叫 `my-mod-porject` 的新資料夾。 + +你應該從複製的存儲庫中刪除 `.git` 資料夾,然後在 IntelliJ IDEA 中打開專案。 如果 `.git` 資料夾沒有顯示,你應該在檔案總管中開啟 `顯示隱藏的項目` 。 + +在 IntelliJ IDEA 中打開專案後,它應該會自動載入專案的 Gradle 配置並執行必要的初始化任務。 + +再次強調,如果你收到了一個關於 Gradle 構建腳本的通知,你應該點擊 `Import Gradle Project` 按鈕。 + +### 修改模板 {#modifying-the-template} + +專案導入後,你應該修改專案的細節,以符合你的模組的資訊: + +- 修改專案中的 `gradle.properties` 檔案,把 `maven_group` 和 `archive_base_name` 修改成與你的模組的資訊相符。 +- 修改 `fabric.mod.json` 文件,將 `id`、`name` 和 `description` 屬性改為成與你的模組的資訊相符。 +- 請確保更新Minecraft的版本、映射、Loader和Loom的版本,你可以透過 \ 查詢這些資訊,以確保它們符合你希望的目標版本。 + +你也可以修改套件名稱和模組的主類別來符合你的模組的細節。 diff --git a/translated/zh_tw/develop/getting-started/introduction-to-fabric-and-modding.md b/translated/zh_tw/develop/getting-started/introduction-to-fabric-and-modding.md new file mode 100644 index 000000000..ffb2c03b3 --- /dev/null +++ b/translated/zh_tw/develop/getting-started/introduction-to-fabric-and-modding.md @@ -0,0 +1,65 @@ +--- +title: Fabric 和模組簡介 +description: "Minecraft: Java Edition 中 Fabric 和模組的簡單介紹。" +authors: + - IMB11 + - itsmiir +authors-nogithub: + - basil4088 +--- + +# Fabric和模組開發簡介 {#introduction-to-fabric-and-modding} + +## 先決條件 {#prerequisites} + +在開始學習之前,你應該對 Java 有基本的了解,並對物件導向程式設計 (OOP) 有所理解。 + +如果你不熟悉這些概念,你可能需要再開始開發模組前先了解一些關於 Java 和 OOP 的教學。以下是一些可以用來學習 Java 和 OOP 的資源: + +- [W3: Java Tutorials](https://www.w3schools.com/java/) +- [Codecademy: Learn Java](https://www.codecademy.com/learn/learn-java) +- [W3: Java OOP](https://www.w3schools.com/java/java_oop.asp) +- [Medium: Introduction to OOP](https://medium.com/@Adekola_Olawale/beginners-guide-to-object-oriented-programming-a94601ea2fbd) + +### 術語 {#terminology} + +在開始前,先來看看使用 Fabric 開發模組時會遇到的一些術語: + +- **Mod**: 對遊戲進行修改,增加或改變現有的功能。 +- **Mod Loader**: 將模組載入遊戲的工具,例如 Fabric Loader。 +- **Mixin**: 在運行時修改遊戲程式碼的工具 - 更多資信請參閱 [Mixin Introduction](https://fabricmc.net/wiki/tutorial:mixin_introduction)。 +- **Gradle**: 用於構建和編譯模組的自動化構建工具,Fabric 用它來構建模組。 +- **Mappings**: 將被混淆的程式碼轉化為人類可讀程式碼的映射集合。 +- **Obfuscation**: 讓程式碼變得難以理解的過程,Mojang 用它來保護 Minecraft 的原始碼。 +- **Remapping**: 將被混淆的程式碼映射成人類可讀程式碼的過程。 + +## 甚麼是 Fabric? {#what-is-fabric} + +Fabric 是用於 Minecraft: Java Edition 的輕量級模組開發工具鏈。 + +它被設計成一個簡單易用的模組開發平台。 Fabric 是由社群驅動的專案,而且是開源的,這代表任何人都可以為此專案做出貢獻。 + +你應該了解組成 Fabric 的四個主要部分: + +- **Fabric Loader**: 一個靈活、跨平台的模組載入器,專為 Minecraft 和其他遊戲及應用程式設計。 +- **Fabric Loom**: Gradle 插件,能讓開發者輕鬆的開發模組和進行除錯。 +- **Fabric API**: 一套給模組開發者創建模組時使用的 API 和工具。 +- **Yarn**: 一套開放的 Minecraft 映射表,在 Creative Commons Zero 授權條款下讓所有人使用。 + +## 為什麼開發 Minecraft 模組需要 Fabric ? {#why-is-fabric-necessary-to-mod-minecraft} + +> Modding 是指修改遊戲以改變其行為或增加新功能的過程,以 Minecraft 來說,這可以是加入新物品、方塊或實體,改變遊戲機制或增加遊戲模式等。 + +Minecraft: Java Edition 被 Mojang 混淆,因此很難單獨修改。 不過,在模組開發工具 (例如 Fabric ) 的幫助下,修改變得容易許多。 有幾個映射系統可以協助進行這個過程。 + +Loom 使用這些映射將被混淆的程式碼重新映射成人類看得懂的格式,讓模組開發者更容易理解和修改遊戲程式碼。 在這部分, Yarn 是一個受歡迎且優秀的映射選擇,但也有其它的選擇。 每個映射表專案都有自己的優勢和專注的地方。 + +Loom 可以讓你輕鬆的開發和編譯模組,針對重新映射的程式碼進行操作,而 Fabric Loader 則能讓你將這些模組加載到遊戲中。 + +## Fabric API 提供哪些功能,為甚麼需要它? {#what-does-fabric-api-provide-and-why-is-it-needed} + +> Fabric API 是一套給模組開發者在創建模組時使用的 API 和工具。 + +Fabric API 在 Minecraft 現有功能的基礎上提供了一系列使開發更方便的 API。例如,提供新的 Hook 和事件供開發者使用,或提供新的實用程式和工具讓修改遊戲內容變得更容易,例如訪問加寬器 (Access Wideners) 和訪問內部註冊表 (如可堆肥物品註冊表) 的能力。 + +雖然 Fabric API 提供了強大的功能,但有些任務,例如基本的方塊註冊表,可以在不使用 Fabric API 的情況下完成。 diff --git a/translated/zh_tw/develop/getting-started/launching-the-game.md b/translated/zh_tw/develop/getting-started/launching-the-game.md new file mode 100644 index 000000000..38496a043 --- /dev/null +++ b/translated/zh_tw/develop/getting-started/launching-the-game.md @@ -0,0 +1,63 @@ +--- +title: 啟動遊戲 +description: 學習如何利用各種啟動設定檔在即時遊戲環境中啟動和偵錯你的模組。 +authors: + - IMB11 +--- + +# 啟動遊戲 {#launching-the-game} + +Fabric Loom 提供了多種啟動配置檔案,以幫助你在實時遊戲環境中啟動模組和進行除錯。 本指南將介紹各種啟動配置檔案以及如何用它們來除錯和在遊戲中測試你的模組。 + +## 啟動配置檔案 {#launch-profiles} + +如果你使用的是 IntelliJ IDEA,你可以在視窗的右上角找到啟動配置檔案。 點擊下拉選單可以查看可用的啟動配置檔案。 + +應該有一個客戶端和伺服器端配置檔案,可以選擇正常執行或在除錯模式下執行它: + +![Launch Profiles](/assets/develop/getting-started/launch-profiles.png) + +## Gradle 任務 {#gradle-tasks} + +如果你使用的是命令行,則可以用以下 Gradle 指令啟動遊戲: + +- `./gradlew runClient` - 以客戶端啟動遊戲。 +- `./gradlew runServer` - 以伺服器端啟動遊戲。 + +這種方法的唯一問題是無法輕鬆為程式碼除錯。 如果想要進行程式碼除錯,你需要使用 IntelliJ IDEA 中的啟動配置檔案,或者通過你的 IDE 的 Gradle 集成來進行。 + +## 熱調換類別 {#hotswapping-classes} + +在除錯模式下運行遊戲時,可以熱調換你的類別而無需重啟遊戲。 這對於快速測試程式碼的更改很有用。 + +但你仍然會受到很大的限制: + +- 你無法新增或刪除函式 +- 你無法修改函式參數 +- 你無法添加或刪除字段 + +## 熱調換 Mixins {#hotswapping-mixins} + +如果正在使用 Mixin,則可以熱調換 Mixin 類別而無須重啟遊戲。 這對於快速測試 Mixin 的更改很有用。 + +但是需要安裝 Mixin Java 代理才能正常用作。 + +### 1. 找到 Mixin 資料庫 Jar {#1-locate-the-mixin-library-jar} + +在 IntelliJ IDEA,你可以在 "Project" 部分的 "External Libraries" 部分找到 mixin 資料庫 jar: + +![Mixin Library](/assets/develop/getting-started/mixin-library.png) + +你需要複製 jar 的 "絕對路徑" 已供下一步使用。 + +### 2. 加入 `-javaagent` VM 參數 {#2-add-the--javaagent-vm-argument} + +在你的 "Minecraft Client" 和/或 "Minecraft Server" 啟動配置中,將以下內容加進 VM 參數選項: + +```:no-line-numbers +-javaagent:"此處為 mixin 資料庫 jar 的路徑" +``` + +![VM Arguments Screenshot](/assets/develop/getting-started/vm-arguments.png) + +現在,你應該能夠在除錯期間修改 mixin 函式的內容,並且無須重啟遊戲即可使修改生效。 diff --git a/translated/zh_tw/develop/getting-started/project-structure.md b/translated/zh_tw/develop/getting-started/project-structure.md new file mode 100644 index 000000000..d89317159 --- /dev/null +++ b/translated/zh_tw/develop/getting-started/project-structure.md @@ -0,0 +1,59 @@ +--- +title: 專案結構 +description: Fabric 模組專案結構概述 +authors: + - IMB11 +--- + +# 專案結構 {#project-structure} + +本頁將介紹 Fabric 模組專案的結構和專案中每個檔案和資料夾的用途。 + +## `fabric.mod.json` {#fabric-mod-json} + +`fabric.mod.json` 是向 Fabric Loader 描述你的模組的主要檔案。 這包含了模組的 ID、版本和前置等訊息。 + +`fabric.mod.json` 檔案中最重要的部分是: + +- `id`: 模組的ID,應該要是獨一無二的。 +- `name`: 模組的名稱。 +- `environment`: 模組運行環境,可以是 `client` ,可以是 `server`,或是 `*`。 +- `entrypoints`: 模組的進入點,例如 `main` 或 `client` 。 +- `depends`: 你的模組所需要的前置模組。 +- `mixins`: 模組提供的 Mixin。 + +下方是一個範例 `fabric.mod.json` 檔案 —— 這是此文檔網站的參考專案的 `fabric.mod.json` 檔案。 + +:::details 參考專案 `fabric.mod.json` +@[code lang=json](@/reference/latest/src/main/resources/fabric.mod.json) +::: + +## Entrypoints {#entrypoints} + +如前所述,`fabric.mod.json` 檔案包含 —— 個名為 `entrypoints` 的欄位 - 這個欄位用來指定你的模組提供的進入點。 + +模板模組生成器預設會創建一個 `main` 和一個 `client` 進入點 —— `main` 進入點用於共用的程式碼,而 `client` 進入點則用於客戶端特定的程式碼。 這些進入點會在遊戲啟動時分別被調用。 + +@[code lang=java transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java) + +上面是一個簡單的 `main` 進入點範例,在遊戲啟動時向控制台記錄一條訊息。 + +## `src/main/resources` {#src-main-resources} + +`src/main/resources` 資料夾用於儲存模組的資源檔案,例如材質、模型和音效。 + +它也是 `fabric.mod.json` 和模組使用的 Mixin 配置檔案存放的位置。 + +資源檔案儲存在與資源包結構相似的結構中-例如,方塊的材質會存放在 `assets/modid/textures/block/block.png` 中。 + +## `src/client/resources` {#src-client-resources} + +`src/client/resources` 資料夾用於儲存客戶端特定的資源檔案,例如僅在客戶端使用的材質、模型和音效。 + +## `src/main/java` {#src-main-java} + +`src/main/java` 資料夾用來存放模組的 Java 原始碼 —— 它存在於客戶端和伺服器端環境中。 + +## `src/client/java` {#src-client-java} + +`src/client/java` 資料夾用於存放特定於客戶端的 Java 原始碼 —— 例如渲染程式碼或客戶端邏輯,如方塊顏色提供程式。 diff --git a/translated/zh_tw/develop/getting-started/setting-up-a-development-environment.md b/translated/zh_tw/develop/getting-started/setting-up-a-development-environment.md new file mode 100644 index 000000000..c08ebd60e --- /dev/null +++ b/translated/zh_tw/develop/getting-started/setting-up-a-development-environment.md @@ -0,0 +1,55 @@ +--- +title: 建置開發環境 +description: 關於建置 Fabric 開發環境的逐步指南。 +authors: + - IMB11 + - andrew6rant + - SolidBlock-cn + - modmuss50 + - daomephsta + - liach + - telepathicgrunt + - 2xsaiko + - natanfudge + - mkpoli + - falseresync + - asiekierka +authors-nogithub: + - siglong +--- + +# 建置開發環境 {#setting-up-a-development-environment} + +要開始用 Fabric 開發模組,需要使用 IntelliJ IDEA 建置開發環境。 + +## 安裝 JDK 21 {#installing-jdk-21} + +要開發 Minecraft 1.21 的模組,你需要 JDK 21。 + +如果你需要安裝 Java 的幫助,可以參考 [player guides section](../../players/index) 中的各種 Java 安裝指南。 + +## 安裝 IntelliJ IDEA {#installing-intellij-idea} + +:::info +你當然可以使用其他 IDE,如 Eclipse 或 Visual Studio Code,但本文檔站上的大多數頁面都假設你使用的是 IntelliJ IDEA。如果你使用其他 IDE,請參考該 IDE 的文檔。 +::: + +如果沒有安裝 IntelliJ IDEA,你可以從 [官網](https://www.jetbrains.com/idea/download/) 下載 - 按照你的作業系統的安裝步驟操作。 + +IntelliJ IDEA 的 Community 版本是免費且開源的,是使用 Fabric 開發模組的推薦版本。 + +你可能需要向下滑動才能找到 Community 版的下載連結 - 如下圖所示: + +![IDEA Community Edition Download Prompt](/assets/develop/getting-started/idea-community.png) + +## 安裝 IDEA 插件 {#installing-idea-plugins} + +雖然這些插件並不是必要的,但可以讓使用 Fabric 開發模組更加容易 - 你應該考慮安裝它們。 + +### Minecraft Development {#minecraft-development} + +Minecraft Development 插件提供對 Fabric 模組開發提供支援,是要安裝的最重要的插件。 + +你可以通過打開IntelliJ IDEA,然後前往 `File > Settings > Plugins > Marketplace Tab` - 在搜索欄中搜尋 `Minecraft Development`,然後點擊 `Install` 按鈕來安裝它。 + +或者你可以從 [plugin page](https://plugins.jetbrains.com/plugin/8327-minecraft-development) 下載它,然後點擊 `File > Settings > Plugins > Install Plugin From Disk` 來安裝。 diff --git a/translated/zh_tw/index.md b/translated/zh_tw/index.md index 26baaa307..5eb15e4e9 100644 --- a/translated/zh_tw/index.md +++ b/translated/zh_tw/index.md @@ -13,14 +13,14 @@ features: linkText: 開始使用 - title: 玩家指南 icon: 📚 - details: 你是一位希望使用由 Fabric 驅動的模組的玩家嗎?我們的玩家指南可以滿足你的需求。這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 我們的玩家指南可以滿足你的需求。 這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 + details: 你是一位希望使用由 Fabric 驅動的模組的玩家嗎? 我們的玩家指南可以滿足你的需求。 這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 link: ./players/index linkText: 閱讀更多 ---
-## 想要貢獻嗎? +## 想要貢獻嗎? {#contribute} 如果你想為 Fabric 文件做出貢獻,你可以在 [GitHub](https://github.com/FabricMC/fabric-docs) 找到原始碼,以及相關的[貢獻指南](./contributing)。 diff --git a/translated/zh_tw/sidebar_translations.json b/translated/zh_tw/sidebar_translations.json index d1631f521..a7f1f1578 100644 --- a/translated/zh_tw/sidebar_translations.json +++ b/translated/zh_tw/sidebar_translations.json @@ -20,7 +20,16 @@ "develop.gettingStarted.projectStructure": "專案結構", "develop.gettingStarted.launchGame": "啟動你的遊戲", "develop.items": "物品", + "develop.items.first-item": "建立你的第一個物品", + "develop.items.food": "食物物品", + "develop.items.custom-armor": "自訂盔甲", + "develop.items.custom-tools": "自訂工具", + "develop.items.custom-item-groups": "自訂物品組", + "develop.items.custom-item-interactions": "自訂物品交互", "develop.items.potions": "藥水", + "develop.blocks": "方塊", + "develop.blocks.first-block": "建立你的第一個方塊", + "develop.blocks.blockstates": "方塊狀態", "develop.entities": "實體", "develop.entities.effects": "狀態效果", "develop.entities.damage-types": "傷害類型", @@ -40,8 +49,8 @@ "develop.misc": "雜項頁面", "develop.misc.codecs": "解編碼器", "develop.misc.events": "事件", + "develop.misc.text-and-translations": "文本和翻譯", "develop.sounds": "音效", "develop.sounds.using-sounds": "撥放音效事件", - "develop.sounds.custom": "建立自訂音效", - "github.edit": "在 GitHub 上編輯此頁面" + "develop.sounds.custom": "建立自訂音效" } \ No newline at end of file diff --git a/translated/zh_tw/website_translations.json b/translated/zh_tw/website_translations.json new file mode 100644 index 000000000..e27d69bca --- /dev/null +++ b/translated/zh_tw/website_translations.json @@ -0,0 +1,46 @@ +{ + "authors.heading": "頁面作者", + "authors.nogithub": "%s(不在 GitHub)", + "banner": "Fabric 文件仍在進展中,請在 %s 或 %s 回報問題。", + "description": "Minecraft 的模組製作工具鏈 Fabric 的全面文件。", + "footer.next": "下一頁", + "footer.prev": "上一頁", + "github_edit": "在 GitHub 上編輯此頁面", + "lang_switcher": "更改語言", + "last_updated": "上次更新於", + "mode_dark": "切換至深色主題", + "mode_light": "切換至淺色主題", + "mode_switcher": "外觀", + "nav.contribute": "貢獻", + "nav.contribute.api": "Fabric API", + "nav.download": "下載", + "nav.home": "主頁", + "outline": "在本頁", + "return_to_top": "返回頂部", + "search.back": "關閉搜尋", + "search.button": "搜尋", + "search.display_details": "顯示詳細清單", + "search.footer.close": "關閉", + "search.footer.close.key": "Escape", + "search.footer.down.key": "向下箭頭", + "search.footer.navigate": "導航", + "search.footer.up.key": "向上箭頭", + "search.footer.select": "選取", + "search.footer.select.key": "Enter", + "search.no_results": "沒有關於此項目的搜尋結果:", + "search.reset": "重設搜尋", + "sidebar_menu": "選單", + "social.discord": "Discord", + "social.github": "GitHub", + "title": "Fabric 文件", + "version_switcher": "切換版本", + "404.code": "404", + "404.crowdin_link": "在 Crowdin 中本地化", + "404.crowdin_link.label": "打開 Crowdin 編輯器", + "404.english_link": "用英語閱讀", + "404.english_link.label": "打開英文版", + "404.link": "返回主頁", + "404.link.label": "前往主頁", + "404.quote": "這個頁面試圖在熔岩裡游泳", + "404.title": "找不到頁面" +} \ No newline at end of file