Creando un ItemStack
Si quieres crear tus propios artículos, necesita pasar por varios pasos. Veamos un ejemplo básico y creemos una espada de diamante encantada.
Para crear un ItemStack, primero necesitamos tomar el constructor del ItemStack
. Esto es hecho con el método ItemStack#builder(). En el constructor, podemos especificar cosas como el ItemType o la cantidad de artículos. En nuestro ejemplo, estaremos creando una espada de diamante que contiene encantamientos, un nombre personalizado, y es irrompible. Si quieres una espada simple sin ningún otro dato, entonces esto es todo lo que necesitas hacer:
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;
public ItemStack generateSword() {
ItemStack superMegaAwesomeSword = ItemStack.builder()
.itemType(ItemTypes.DIAMOND_SWORD).build();
return superMegaAwesomeSword;
}
La creación del articulo básico esta hecha. Ahora esta es una espada de diamante normal que creamos, pero ¿que si queremos crear algo mas interesante? ¿Que tal si encantamos y le damos nombre a nuestra espada? Podemos usar EnchantmentData para darle algunos encantamientos a nuestra espada. El siguiente ejemplo le dará a nuestra espada cada encantamiento en el juego, a nivel 1000. Asegúrate de incluir todo esto antes de return superMegaAwesomeSword;
.
import java.util.List;
import java.util.stream.Collectors;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.manipulator.mutable.item.EnchantmentData;
import org.spongepowered.api.data.meta.ItemEnchantment
import org.spongepowered.api.item.Enchantment;
EnchantmentData enchantmentData = superMegaAwesomeSword
.getOrCreate(EnchantmentData.class).get();
final List<Enchantment> enchantments = Sponge.getRegistry()
.getAllOf(Enchantment.class).stream().collect(Collectors.toList());
for (Enchantment enchantment : enchantments) {
enchantmentData.set(enchantmentData.enchantments()
.add(new ItemEnchantment(enchantment, 1000)));
}
superMegaAwesomeSword.offer(enchantmentData);
Ahora digamos que queremos darle un nombre genial a nuestra espada super poderosa. Aquí, directamente podemos ofrecerle una clave al ItemStack
. Usando esta clave, podemos cambiar el nombre del ItemStack
a «SUPER MEGA ASOMBROSA Espada de Diamante»
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.format.TextColors;
superMegaAwesomeSword.offer(Keys.DISPLAY_NAME, Text.of(
TextColors.BLUE, "SUPER ",
TextColors.GOLD, "MEGA ",
TextColors.DARK_AQUA, "AWESOME ",
TextColors.AQUA, "Diamond Sword"));
Finalmente, para hacer la espada irrompible, podemos usar las claves de nuevo:
superMegaAwesomeSword.offer(Keys.UNBREAKABLE, true);
Eso es todo. Ahora tienes una espada completamente encantada, irrompible, y hermosamente nombrada la cual le puedes dar a los jugadores.
Generando el Articulo
Claro que podemos simplemente poner la espada en el inventario de un jugador, pero ¿y si quisiéramos arrojarla al mundo abierto y generar el objeto? Aquí es donde entra en juego entidad spawning. Ya que la representación gráfica del juego de un `` ItemStack`` es Item, podemos generarlo de manera similar a uno normal: javadoc:` Entity`. El EntityType simplemente será: javadoc:` EntityTypes # ITEM` y necesitaremos especificar que `` Entity`` representará nuestra `` ItemStack``. Esto puede hacerse usando la clave: javadoc:Keys # REPRESENTED_ITEM. Un ejemplo es mostrado a continuación:
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.entity.spawn.EntitySpawnCause;
import org.spongepowered.api.event.cause.entity.spawn.SpawnTypes;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.extent.Extent;
import java.util.Optional;
public void spawnItem(ItemStack superMegaAwesomeSword, Location<World> spawnLocation) {
Extent extent = spawnLocation.getExtent();
Optional<Entity> optional = extent
.createEntity(EntityTypes.ITEM, spawnLocation.getPosition());
if (optional.isPresent()) {
Entity item = optional.get();
item.offer(Keys.REPRESENTED_ITEM, superMegaAwesomeSword.createSnapshot());
extent.spawnEntity(item, Cause.source(EntitySpawnCause.builder()
.entity(item).type(SpawnTypes.PLUGIN).build()).build());
}
}
Creando un ItemStack Desde un Bloque
Un ItemStack
para un bloque puede ser creado usando el método ItemStack.Builder#itemType(ItemType) de forma similar a los artículos normales, pero ¿que si queremos crear un ItemStack
desde un BlockState? Para crear un ItemStack
desde un BlockState
, necesitarias usar el método ItemStack.Builder#fromBlockState(BlockState) en el constructor ItemStack
. En ejemplo de esto es mostrado a continuación:
import org.spongepowered.api.block.BlockState;
public ItemStack createStack(BlockState state) {
return ItemStack.builder().fromBlockState(state).build();
}