ES_UsingTheAPI - MMonkeyKiller/CustomBlocks GitHub Wiki
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
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]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