minecraft
Creazione di un elemento base con Forge
Ricerca…
introduzione
Creare un oggetto semplice con Forge è uno dei primi compiti che un aspirante modder dovrà imparare. Come farlo è cambiato rispetto alle varie versioni di Minecraft ed è probabilmente in una difficoltà "moderata" dopo 1.7.10 a causa del numero di errori facili da fare, in particolare con il rendering corretto.
Osservazioni
Se qualcosa va storto e il tuo oggetto personalizzato ha una trama mancante (nero / viola) o un modello (cubo predefinito troppo grande quando è trattenuto) controlla il registro. I problemi di questo tipo compariranno quasi sempre nel registro, a condizione che tu abbia registrato le cose correttamente.
La prima cosa che verrà mostrata è la riga "Exception loading model for variant..."
o simile, che ti dice quale blocco o oggetto non è stato caricato correttamente. Dopo una dozzina di linee che iniziano con at...
sarà un'altra linea di partenza Caused by...
Questa linea "Causato da" è importante, ti dirà quale file non è stato caricato correttamente e può essere uno dei vari errori, come ad esempio:
- JSON malformato (il tuo file JSON non è valido e ha un errore di battitura)
- File non trovato (il file che Minecraft sta cercando non è correttamente chiamato o nel posto giusto)
- Eccezione Variant mancante (il tuo JSON BlockState è incompleto)
Potresti anche ottenere più di un errore di errore per un singolo errore! Se non sai qual è il problema, commenta ogni blocco e elemento che sai funzionare, riduci l'elenco degli errori fino al blocco (o ai blocchi) in questione. Potrebbe essere necessario farlo più volte.
Inoltre, una texture di mixaggio mostra in modo diverso come un semplice elenco tutte le risorse mancanti per un dato dominio (mod ID).
Classe dell'oggetto
Questa parte non è cambiata rispetto alle versioni di Minecraft, sebbene ci siano state alcune mutazioni nelle firme dei metodi esatti e nella gerarchia delle classi. Un oggetto di base (uno che non ha funzionalità, come un bastone o un lingotto: è vero, entrambi sono articoli da niente!)
public class CustomItem extends Item {
public CustomItem () {
super();
this.setMaxDamage(0);
this.setCreativeTab(CreativeTabs.MISC);
}
}
A questo punto non c'è molto spazio per la personalizzazione, a differenza dei blocchi. Tutto quello che possiamo fare è cambiare se l'oggetto può subire danni (gli strumenti lo usano) e quale scheda creativa esisterà in. Nome e consistenza che tratteremo quando registreremo l'oggetto con GameRegistry.
Tuttavia, questo è tutto ciò che è necessario per tenere, trasportare, rilasciare, creare, annusare e utilizzare altrimenti l'oggetto. Alcuni oggetti in Minecraft (come i bastoni) non hanno nemmeno una classe unica e semplicemente usano il new Item()
. Potremmo farlo qui, tuttavia qualsiasi elemento con funzionalità aggiuntive avrà bisogno di una classe.
Modello di articolo
Come per i blocchi, anche gli oggetti necessitano di modelli.
{
"parent": "item/generated",
"textures": {
"layer0": "example:items/basic"
}
}
Questo è praticamente tutto ciò che è necessario per farlo funzionare una volta che l'elemento è registrato. L'unica cosa importante è che il nome del file corrisponda al nome del registro usato per registrare il blocco e debba essere in minuscolo (i nomi dei file 1.11+ devono essere in minuscolo, prima di questo è solo la distinzione tra maiuscole e minuscole).
Nota che "layer0" è l'unica trama necessaria ed è altamente improbabile che venga specificata qualsiasi altra texture (anche se alcuni oggetti come pozioni e armature di cuoio hanno un "layer1"). Tutti i nomi sono definiti da item/builtin
(il modello principale interno per gli oggetti), diversamente dai blocchi.
Denominare il file JSON del modello my_item.json
(corrispondente al nome del registro che verrà assegnato in seguito) e salvarlo su src\main\resources\assets\example\models\item\
(dove l' example
è l'ID mod specificato nel @Mod annotazione della tua classe mod principale).
Inoltre crea una texture per il tuo oggetto, basic.png
e salvalo in src\main\resources\assets\example\textures\items\
Il modello di articolo qui usa un genitore di oggetto / generato, il che significa che verrà utilizzata la singola trama fornita (come nella maggior parte degli oggetti non bloccati) e verrà mantenuta nella mano del giocatore con un orientamento predefinito. C'è anche un articolo / palmare che specifica i diversi orientamenti di visualizzazione (per gli strumenti). Gli articoli possono anche fornire il proprio attributo "display", ignorando quelli del genitore, ma non sono necessari nel 99,9% degli usi.
Registrazione dell'oggetto
La registrazione degli elementi viene eseguita dalla classe mod principale, o un metodo di classe ModItems richiamato dalla classe mod principale durante preInit.
Item item = new CustomItem();
string registryname = "my_item";
item.setRegistryName(registryname);
item.setUnlocalizedName(item.getRegistryName().toString());
GameRegistry.register(item);
C'è un motivo importante per usare item.setUnlocalizedName(item.getRegistryName().toString());
anche! Garantisce che il nome non localizzato del tuo oggetto contenga l'ID mod per evitare conflitti tra i file di lingua tra le mod.
Ora l'articolo ha bisogno anche di un modello, ed è qui che le cose si sono messe in difficoltà dopo il 1.7.10, il che implicava solo comunicare a Minecraft il nome della trama da caricare e potrebbe essere specificato nel costruttore dell'articolo.
final ModelResourceLocation fullModelLocation = new ModelResourceLocation(item.getRegistryName().toString(), "inventory");
ModelBakery.registerItemVariants(item, fullModelLocation);
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition()
{
public ModelResourceLocation getModelLocation(ItemStack stack)
{
return fullModelLocation;
}
});
Si noti che questa sezione deve trovarsi solo sul lato client (ovvero il proxy client) poiché molte delle classi di riferimento non esistono sul server dedicato.
La registrazione di elementi con varianti, ad esempio Saplings, deve essere eseguita in modo diverso, utilizzando ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation)
sebbene ci consenta di utilizzare un file Blockstate per specificare le nostre varianti (che è molto preferibile all'alternativa). Il nostro articolo non usa varianti, quindi abbiamo finito.