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;
}
Creating the basic item is done. Now this is a normal diamond sword that we created, but what if we wanted something more interesting? What about enchanting and naming our sword? We can use Keys#APPLIED_ENCHANTMENTS to give our sword some enchantments. The following example will give our sword every enchantment in the game, to level 1000.
import java.util.List;
import java.util.stream.Collectors;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.meta.ItemEnchantment
import org.spongepowered.api.item.Enchantment;
public void withThousandEnchantmentLevel(ItemStack superMegaAwesomeSword){
List<Enchantment> enchantments = RegistryTypes
.ENCHANTMENT_TYPE
.get()
.stream()
.filter(type -> type.canBeAppliedToStack(superMegaAwesomeSword))
.map(type -> Enchantment.of(type, 1000))
.collect(Collectors.toList());
superMegaAwesomeSword.offer(Keys.APPLIED_ENCHANTMENTS);
}
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 net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.spongepowered.api.data.Keys;
import org.spongepowered.api.item.ItemTypes;
superMegaAwesomeSword.offer(Keys.DISPLAY_NAME, TextComponent.ofChildren(
Component.text("SUPER ", NamedTextColor.BLUE),
Component.text("MEGA ", NamedTextColor.GOLD),
Component.text("AWESOME ", NamedTextColor.DARK_AQUA),
ItemTypes.DIAMOND_SWORD.get().asComponent().color(NamedTextColor.AQUA));
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
Sure, we can simply put the sword into a player’s inventory, but what if we wanted to throw it out into the open world
and spawn the item? This is where entity spawning comes into play. Since the in-game
graphical representation of an ItemStack
is Item, we can spawn it in similarly to a normal
Entity. The EntityType will simply be EntityTypes#ITEM and we will need to specify
that the Entity
will represent our ItemStack
. This can be done using the Keys#REPRESENTED_ITEM key.
An example is shown below:
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;
import org.spongepowered.api.event.CauseStackManager.StackFrame;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.server.ServerWorld;
import java.util.Optional;
public void spawnItem(ItemStack superMegaAwesomeSword, ServerLocation spawnLocation) {
ServerWorld world = spawnLocation.world();
Item item = world.createEntity(EntityTypes.ITEM, spawnLocation.getPosition());
item.offer(Keys.REPRESENTED_ITEM, superMegaAwesomeSword.createSnapshot());
try (StackFrame frame = Sponge.server().causeStackManager().pushCauseFrame()) {
frame.addContext(EventContextKeys.SPAWN_TYPE, SpawnTypes.PLACEMENT);
word.spawnEntity(item);
}
}
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();
}