Ir al contenido

Añadir un nuevo bloque (Guía básica)

⚠️ Esta es solo una guía muy básica y no implementa ninguna funcionalidad todavía.


Lo primero es seleccionar qué bloque quieres añadir al proyecto.

Ejemplo: En esta guía, queremos añadir los Barrotes de hierro y los Barrotes de cobre.


2. Encuentra el nombre de la clase en classes.json

Sección titulada «2. Encuentra el nombre de la clase en classes.json»

Antes de crear nuestro struct, necesitamos saber cómo llamarlo correctamente.

Dirígete al archivo:

steel-core/build/classes.json

Busca tu bloque en este archivo (en inglés). En nuestro caso:

  • Encontramos IronBarsBlock
  • Y también WeatheringCopperBarsBlock

Esto significa que necesitamos dos structs diferentes para implementar estos bloques.


Ahora crearemos un par de ficheros en:

steel-core/src/behavior/blocks/

Tienes que ser tan descriptivo como puedas con el nombre.
En nuestro caso serán:

  • iron_bars_block.rs
  • copper_bars_block.rs

Añade un struct como este en tu código:

/steel-core/src/behavior/blocks/iron_bars_block.rs
pub struct IronBarsBlock {
block: BlockRef,
}
impl IronBarsBlock {
/// Esto crea un nuevo comportamiento para el bloque elegido.
#[must_use]
pub const fn new(block: BlockRef) -> Self {
Self { block }
}
}
impl BlockBehaviour for IronBarsBlock {}

⚠️ Esta es solo una guía muy básica y no implementa ninguna funcionalidad todavía.


Añade el módulo de tu bloque a:

steel-core/src/behavior/blocks/mod.rs

Debería quedar tal que así:

/steel-core/src/behavior/blocks/mod.rs
mod iron_bars_block;
pub use iron_bars_block::IronBarsBlock;

¡Este parece un buen punto para comprobar si el nombre del struct es correcto!

Comprueba una vez más que el nombre de tu struct sea igual al encontrado en classes.json.


7. Añade el ´struct´ a los bloques generados

Sección titulada «7. Añade el ´struct´ a los bloques generados»

Ahora queremos añadir nuestro bloque a la lista de los ya generados.
Para eso, dirígete a:

steel-core/build/blocks.rs

Entender lo que hace internamente la función generate_registrations puede ser interesante, pero esto no es necesario para que tu bloque funcione.


8. Concentración en las funciones de compilado

Sección titulada «8. Concentración en las funciones de compilado»

Ahora es momento de cambiar de foco a la función build en el archivo actual.

⚠️ Importante: Solo añade codigo nuevo. No quites o modifiques el codigo existente, pues podrias romper bloques de otros contribuidores.


Primero tienes que crear un vector mutable con un nombre apropiado:

/steel-core/build/blocks.rs
let mut iron_bar_blocks = Vec::new();

Añade el nombre de tu bloque al match.
Recuerda: Solo añadir, no quitar.

/steel-core/build/blocks.rs
for block in blocks {
let const_ident = to_const_ident(&block.name);
match block.class.as_str() {
...
"IronBarsBlock" => iron_bar_blocks.push(const_ident),
_ => {}
}
}

Ahora define el identificador del tipo de bloque:

/steel-core/build/blocks.rs
let iron_bar_type = Ident::new("IronBarsBlock", Span::call_site());

Ahora, añadiremos los registros:

/steel-core/build/blocks.rs
let iron_bar_registrations =
generate_registrations(iron_bar_blocks.iter(), &iron_bar_type);

⚠️ ¡Aquí andate con ojo!

  • El # anterior al nombre de tu variable es necesario
  • Esto evita que la variable colisione con palabras clave de Rust
  • NO añadas una coma al final; este código se implementará en otro archivo.

Ejemplo:

/steel-core/build/blocks.rs
let output = quote! {
//! Asignamientos de comportamientos de bloque generados
use steel_registry::vanilla_blocks;
use crate::behavior::BlockBehaviorRegistry;
use crate::behavior::blocks::{
CraftingTableBlock,
CropBlock,
EndPortalFrameBlock,
FarmlandBlock,
FenceBlock,
RotatedPillarBlock,
BarBlock
};
pub fn register_block_behaviors(registry: &mut BlockBehaviorRegistry) {
...
#iron_bar_registrations
}
};

¡Ahora dale a compilar y deja que Rust (y tu maravilloso trabajo) haga su magia!

Tras compilarse, tu bloque debería aparecer en:

steel-core/src/behavior/generated/blocks.rs

Puedes ir y usar Ctrl + F para buscar el nombre de tu bloque.

Si aun así no encuentras tu bloque:

  1. Borra la carpeta generated

  2. Ejecuta:

    cargo clean
  3. Compila una vez más

Eso debería solucionar el problema.


Como ya ha sido indicado, el bloque actualmente no hace nada.

Para darle comportamientos, tienes que implementar los métodos requeridos en BlockBehaviour en tu archivo (ej. iron_bars_block.rs).

👉 Recomendamos echarle un vistazo a otras implementaciones de bloques con funcionalidad similar al tuyo.

Para ello, aquí tienes alguna información para que lo entiendas mejor:


Para hacerte con un block state, puedes hacer algo como esto:

let west_pos = Direction::West.relative(pos);
let west_state = world.get_block_state(&west_pos);

En dicho block state, toda la información del bloque específico es almacenada.


Modificando las propiedades de un block state

Sección titulada «Modificando las propiedades de un block state»

Esto puede ser hecho así:

state.set_value(&BlockStateProperties::WEST, true);

Puedes hacerlo al contrario para obtener el block state.


Para comprobar si el bloque colindante se trata de uno específico o pertenece a un grupo (como barrotes o muros), puedes usar esto:

let walls_tag = Identifier::vanilla_static("walls");
if REGISTRY.blocks.is_in_tag(neighbor_block, &walls_tag) {
return true;
}

Eso sería todo; con esto ya tendrías la estructura básica en su sitio para implementar su comportamiento 🚀

No disponibles 😅