Registro de varios tipos de bloques en Minecraft -- java campo con minecraft camp codereview Relacionados El problema

Registering various kinds of blocks in Minecraft


4
vote

problema

Español

Después de mirar algunos tutoriales sobre cómo hacer que los mods de Minecraft llegué hasta la clase de mis propios bloques y la clase 998877766555443333 se ve horrible e ingobernable, especialmente cuando se agregan más bloques:

  public class ModBlocks {  public static BlockPlatinum blockPlatinum; public static BlockNickel blockNickel;  public static void init() {     registerPlatinum();      registerNickel();  }  @SideOnly(Side.CLIENT) public static void initClient(ItemModelMesher mesher) {     registerClientPlatinum(mesher);     registerClientNickel(mesher); }  private static void registerClientNickel(ItemModelMesher mesher) {     Item item = Item.getItemFromBlock(blockNickel);     ModelResourceLocation model = new ModelResourceLocation(ModMetaData.RESOURCE_PREFIX + References.NICKEL_BLOCK,             "inventory");     ModelLoader.registerItemVariants(item, model);     mesher.register(item, 0, model); }  private static void registerClientPlatinum(ItemModelMesher mesher) {     Item item = Item.getItemFromBlock(blockPlatinum);     ModelResourceLocation model = new ModelResourceLocation(ModMetaData.RESOURCE_PREFIX + References.PLATINUM_BLOCK,             "inventory");     ModelLoader.registerItemVariants(item, model);     mesher.register(item, 0, model); }  private static void registerNickel() {     ResourceLocation location = new ResourceLocation(ModMetaData.MODID, References.NICKEL_BLOCK);     blockNickel = new BlockNickel();     blockNickel.setRegistryName(location);     GameRegistry.register(blockNickel);     GameRegistry.register(new ItemBlock(blockNickel), location); }  private static void registerPlatinum() {     ResourceLocation location = new ResourceLocation(ModMetaData.MODID, References.PLATINUM_BLOCK);     blockPlatinum = new BlockPlatinum();     blockPlatinum.setRegistryName(location);     GameRegistry.register(blockPlatinum);     GameRegistry.register(new ItemBlock(blockPlatinum), location); }  }   

Ya he intentado extraer las clases Block* y colocarlos en una lista estática y luego refactorar los métodos de inicio de inicio y cliente para iterar sobre la lista, pero que produce bloques invisibles.

Estoy seguro de que este es un problema desde hace mucho tiempo que resuelto por Minecraft Mod Devs, por lo que si alguien tiene alguna guía que sería increíble.

Original en ingles

After looking at a few tutorials on making minecraft mods i got as far as making my own blocks and the ModBlocks class to me looks awful and unruly especially when more blocks are added:

public class ModBlocks {  public static BlockPlatinum blockPlatinum; public static BlockNickel blockNickel;  public static void init() {     registerPlatinum();      registerNickel();  }  @SideOnly(Side.CLIENT) public static void initClient(ItemModelMesher mesher) {     registerClientPlatinum(mesher);     registerClientNickel(mesher); }  private static void registerClientNickel(ItemModelMesher mesher) {     Item item = Item.getItemFromBlock(blockNickel);     ModelResourceLocation model = new ModelResourceLocation(ModMetaData.RESOURCE_PREFIX + References.NICKEL_BLOCK,             "inventory");     ModelLoader.registerItemVariants(item, model);     mesher.register(item, 0, model); }  private static void registerClientPlatinum(ItemModelMesher mesher) {     Item item = Item.getItemFromBlock(blockPlatinum);     ModelResourceLocation model = new ModelResourceLocation(ModMetaData.RESOURCE_PREFIX + References.PLATINUM_BLOCK,             "inventory");     ModelLoader.registerItemVariants(item, model);     mesher.register(item, 0, model); }  private static void registerNickel() {     ResourceLocation location = new ResourceLocation(ModMetaData.MODID, References.NICKEL_BLOCK);     blockNickel = new BlockNickel();     blockNickel.setRegistryName(location);     GameRegistry.register(blockNickel);     GameRegistry.register(new ItemBlock(blockNickel), location); }  private static void registerPlatinum() {     ResourceLocation location = new ResourceLocation(ModMetaData.MODID, References.PLATINUM_BLOCK);     blockPlatinum = new BlockPlatinum();     blockPlatinum.setRegistryName(location);     GameRegistry.register(blockPlatinum);     GameRegistry.register(new ItemBlock(blockPlatinum), location); }  } 

I have already tried extracting the Block* classes and putting them into a static list and then refactoring the init and client init methods to iterate over the list but that produces invisible blocks.

I am sure this is a problem long since solved by Minecraft mod devs, so if anyone has any guidance that would be awesome.

     

Lista de respuestas

1
 
vote

Su versión actualizada es bastante buena. Como en, "usted está hecho básicamente, no hay necesidad de hacer más cambios". (Vea la nota en la parte inferior).

Lo único que hice de manera diferente (aparte de la creación de métodos de registro no normales, así que sí, que hicieron todo tipo de cosas) fue tomar dos clases que ya tenía y le doy el register Función: ClienteProxy y CommoneProxy.

Mi configuración es tal que ClientProxy.register Llamadas Súper (que llama 9988777665544332 para el bloque, así como para crear y registrar el itemblock) y luego llama 99887776655443333 Para el artículo (o registrartemvagarts para elementos de variante de bloque, u otros métodos para otras vías).

Más adelante moví este código en un paquete de biblioteca que ya tenía (centralizar las ganancias y evitar la duplicación), agregó algunos métodos estáticos (en los comunes) a medida que los ayudantes se redirigieran y terminaron con esta clase que puede ser hervida a estos Dos métodos para los bloques básicos sin sentido:

  public void _registerBlockWithItem(Block block, String registryname) {     super._registerBlockWithItem(block, registryname);     _registerBlockResources(block); }  private void _registerBlockResources(Block block) {     Item item = Item.getItemFromBlock(block);     ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(block.getRegistryName(),"normal")); }   

El primer método equivalente a su método register que llama a su registerClient solo en el lado del cliente, que luego nos permite fusionar init y initClient .

Esto hizo que mis modsbloques (Bueno, la clase principal de mod en mi caso) Muy Slim Cuando se trata de registrar bloques y elementos. ¡Se ve casi 1.7ish!

Todavía hay algunas mejoras menores que podrían hacerse, pero en dos, tres líneas por bloque, es una gran mejora sobre sus líneas originales trece por bloque.

NOTA: También debe marcar registerClient como ClientProxy.register0 : ese método aún se refiere a una clase que no existe en El servidor ( ClientProxy.register11 ) y puede bloquear el servidor dedicado cuando el JVM intenta cargar su clase de Modblocks.

 

Your updated version is pretty darn good. As in, "You're basically done, no need to make any further changes." (See note at the bottom).

The only thing I did differently (aside from creating non-normal registration methods as well that do all sorts of things) was to take two classes I already had and give them the register function: ClientProxy and CommonProxy.

My setup is such that ClientProxy.register calls super (which calls GameRegistry.register for the block as well as creating and registering the itemblock) and then calls ModelLoader.setCustomModelResourceLocation for the item (or registerItemVariants for block-variant items, or other methods for other pathways).

I later moved this code over into a library package I already had (centralizing the gains and avoiding duplication), added some static methods (in the Common) as helper redirects and ended up with this class which can be boiled down to these two methods for the basic no-nonsense blocks:

public void _registerBlockWithItem(Block block, String registryname) {     super._registerBlockWithItem(block, registryname);     _registerBlockResources(block); }  private void _registerBlockResources(Block block) {     Item item = Item.getItemFromBlock(block);     ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(block.getRegistryName(),"normal")); } 

The first method being equivalent to your register method which self-calls your registerClient only on the client side, which then allows us to merge init and initClient.

This made my ModBlocks (well, main mod class in my case) very slim when it comes to registering blocks and items. Looks almost 1.7ish!

There are still some minor improvements which could be made, but at two-three lines per block it's a vast improvement over your original thirteen lines per block.

Note: you should also mark registerClient as @SideOnly(Side.CLIENT) as well: that method is still refers to a class that doesn't exist on the server (ModelLoader) and may crash the dedicated server when the JVM tries to load your ModBlocks class.

 
 
0
 
vote

DO ClientProxy.register2 , ClientProxy.register3 , ... extender el ClientProxy.register4 clase? En caso afirmativo, puede crear ClientProxy.register5 y itera sobre ella.

  ClientProxy.register6  

Para agregar un bloque nuevo, solo necesita agregarlo:

  ClientProxy.register7  

¿Necesita bloques para ser ClientProxy.register8 ? Es mejor cambiarlos a ClientProxy.register9 y crear métodos de creates / configuradores cuando los necesite solo en esta clase.

 

Do BlockPlatinum, BlockTin,... extend the Block class? If yes, you can create Map<Reference, Block> and iterate over it.

Map<String, Block> blocksWithReferences = new HashMap<>();  ...  for(Map.Entry<String, Block> blockEntry:blocks.entrySet()){         blockEntry.getKey();//Reference in String         blockEntry.getValue();//Block object } 

For adding new block you just need to add it:

block.put(reference, Block); 

Do you need blocks to be public? It is better to change them to private and create getters/setters methods when you need them only in this class.

 
 
     
     

Relacionados problema

2  SafeBlockPopulator para garantizar que los trozos vecinos se generen antes de la población  ( Safeblockpopulator to ensure neighboring chunks are generated before population ) 
Bukkit / CraftBukkit / Spigot son extensores de servidor Minecraft que permiten crear y usar complementos. Un tipo particular de plugin es un generador, que c...

1  Documentación para un complemento de servidor Minecraft  ( Documentation for a minecraft server plugin ) 
Estoy trabajando en un complemento Minecraft para mi Spigot Minecraft Server. Tengo una clase que funciona como se esperaba. He hecho mi mejor esfuerzo pa...

3  Utilidad Minecraft Auto-Backup  ( Minecraft auto backup utility ) 
Vivo en un país donde ocurre un apagón de electricidad después de cada hora, lo que corrompe los archivos de guardado de Minecraft, así que se me ocurrió con ...

4  Plugin Vanisher para Minecraft (escrito con la API de Bukkit)  ( Vanisher plugin for minecraft written with the bukkit api ) 
¿Este código para mi complemento VAISHER para el juego Minecraft, escrito con la API de Bukkit, será optimizada y convencionalmente correcta? vaishapi: ...

4  Video Frame to Minecraft Map Colors  ( Video frame to minecraft map colors ) 
Todavía soy algo nuevo en C, así que perdóname por cualquier error tonto que he hecho. Estoy tratando de convertir los marcos de video en los colores del ma...

3  Esquema de base de datos para un complemento de registro Minecraft  ( Database schema for a minecraft logging plugin ) 
Este es mi intento de crear un esquema de base de datos para un complemento de registro Minecraft. No estoy de ninguna manera un experto en SQL, por lo que la...

7  Constructor - un clon de 2D Minecraft  ( Builder a 2d minecraft clone ) 
Me estaba asomando en mi PI de la frambuesa que no había encendido o usado en un tiempo, y me topé con este script de Python que escribí hace ~ 1.5 años, y me...

2  Plugin para encontrar bloques colocados y si están en cierta secuencia  ( Plugin for finding placed blocks and if they are in a certain sequence ) 
Esto es para un complemento que estoy haciendo para el juego llamado Minecraft. El Código es responsable de descubrir los bloques colocados por el jugador y, ...

3  Algoritmo de malla para generar caras en Minecraft  ( Meshing algorithm for generating faces in minecraft ) 
Para generar caras de un mundo similar al Minecraft desde una matriz tridimensional, desarrollé el siguiente algoritmo de malla. Las caras tienen vértices e í...

2  Aplicación Personal Minecraft Android  ( Personal minecraft android app ) 
Esto no será liberado públicamente, pero eso no significa que quiera tener hábitos de codificación de malos. No estaba demasiado lejos en esto antes de darme ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos