ES_UsingTheAPI - MMonkeyKiller/CustomBlocks GitHub Wiki

Utilizando la API

Este apartado es solo para desarrolladores.

Utilizando la API tienes más control de como funcionarán los bloques custom, desde su asignación, funcionamiento, hasta incluso interacción

Implementando CustomBlocks como una dependencia maven

Añade la siguientes lineas en tu pom.xml en donde correspondan

<dependency>
	<groupId>com.github.MMonkeyKiller</groupId>
    <artifactId>CustomBlocks</artifactId>
    <version>VERSION</version>
	<scope>provided</scope>
</dependency>

¡Recuerda especificar la versión a utilizar!

...
<repository>
    <id>jitpack.io</id>
	<url>https://jitpack.io</url>
</repository>
...

Por último, añade CustomBlocks como una dependencia en tu plugin.yml

depend: [CustomBlocks]

Utilizando la API

Una vez incluida como dependencia, debemos utilizarla correctamente en nuestro proyecto

Primero, sobreescribiremos el registro de los bloques en memoria y agregaremos los nuestros propios (ignoraremos completamente la lista de bloques custom del config.yml)

public class myPlugin extends JavaPlugin {

	@Override
	public void onEnable() {
		System.out.println("Example plugin enabled!");
		registerCBlocks();
	}

	public void registerCBlocks() {
		CustomBlocksAPI api = new CustomBlocksAPI();
        api.clearRegistry();
	}
}

Hay que tener en cuenta que, al especificarlo como dependencia en el plugin.yml, nos aseguramos de que nuestro plugin cargue después de CustomBlocks

Listo! Con esto estamos limpiando la lista de bloques custom generadas por el plugin del config.yml, pero aún hay un problema.

Si en el servidor se utiliza el /cb reload, la configuración volverá a cargar, por lo que necesitamos volver a limpiar el registro con cada reload

Para esto haremos uso de un evento de la api, CBLoadEvent. Para utilizarlo lo registraremos como cualquier evento bukkit

	// no olvides que esto debe estar en una clase implementando Listener

	@EventHandler
	private void onCBLoad(CBLoadEvent event) {
		System.out.println("CustomBlocks reload detected! Registering blocks...");
		registerCBlocks();
	}

	@EventHandler
	private void onPluginEnable(PluginEnableEvent event) {
		if (event.getPlugin().getName().equalsIgnoreCase("CustomBlocks"))
			registerCBlocks();
		// Con este evento recargamos los bloques si el plugin se recarga por condiciones externas (ex. Plugman)
	}

Ahora, por último, crearemos nuestro bloque personalizado, para ello creamos una clase hija de CustomBlock

public class myEpicBlock extends CustomBlock {
	public myEpicBlock() throws Exception {
        super("myplugin:my_epic_block", 1000, Instrument.BANJO, 1, false);
		//	id, modelData, instrument, pitch, powered, [item material]
    }
}

También crearemos un bloque direccional (actualmente solo disponible usando la API). Necesitamos crear una clase hija de DirectionalCustomBlock

Los bloques direccionales aún estan siendo diseñados, quizas la forma de crear uno cambie en el futuro

public class myDirectionalBlock extends DirectionalCustomBlock {
	public myDirectionalBlock() throws Exception {
		// On directional blocks, the instrument, the pitch, and the powered state will be overwritten by the directional variants, you can put any value on these fields
		super("myplugin:my_directional_block", 1001, Instrument.BANJO, 2, false, new HashMap<BlockFace CustomBlockData>() {{
            put(BlockFace.NORTH, new CustomBlockData(Instrument.BANJO, 2, false));
            put(BlockFace.SOUTH, new CustomBlockData(Instrument.BANJO, 3, false));
            put(BlockFace.EAST,  new CustomBlockData(Instrument.BANJO, 4, false));
            put(BlockFace.WEST,  new CustomBlockData(Instrument.BANJO, 5, false));
            put(BlockFace.UP,    new CustomBlockData(Instrument.BANJO, 6, false));
            put(BlockFace.DOWN,  new CustomBlockData(Instrument.BANJO, 7, false));
        }});
		//	id, modelData, instrument, pitch, powered, [item material]
	}
}

La forma de crearlos es un poco diferente a la de un bloque simple. En el momento de llamar al constructor, se te pedirán el instrumento, el tono y el estado de alimentación. Esto no importa ya que luego será sobreescrito por la variación según la orientación.

Se agregó un nuevo parámetro obligatorio en el constructor, un HashMap<BlockFace, CustomBlockData>, que deberá de tener un CustomBlockData asignado para NORTH, SOUTH, EAST, WEST, UP, DOWN.

Luego de crear una clase para cada bloque, los añadiremos al registro

public void registerCBlocks() {
	CustomBlocksAPI api = new CustomBlocksAPI();
    api.clearRegistry();
	try {
		api.register(
			new myEpicBlock(),
			new myDirectionalBlock()
		);
	} catch (Exception ex) {
		e.printStackTrace();
	}
}

También podemos añadirle una función al hacerle click derecho, por ejemplo:

public class myEpicBlock extends CustomBlock implements Interactable {
	public myEpicBlock() throws Exception {
        super("myplugin:my_epic_block", 1000, Instrument.BANJO, 1, false);
		//	id, modelData, instrument, pitch, powered, [item material]
    }

	@Override
    public void onInteract(@NotNull Player player, @NotNull Block block) {
        player.sendMessage("Hey!");
    }
}

Cabe recalcar que no es necesario hacer el clearRegistry(), yo lo hago porque me gusta registrar cada bloque a nivel de código, asi tengo un mayor control de su funcionamiento

Felicidades! Estás haciendo un uso básico de la API! Más adelante voy a enriquecer esta página para usos más avanzados de la API

⚠️ **GitHub.com Fallback** ⚠️