Saltar al contenido principal

Items custom

Vamos a hablar de ejemplos reales con items y NBT custom.

Data simple

Hacer items simples con data NBT.

Vouchers

Guardar la información de un voucher dentro del tag de un item, envés de compararlo con una larga cantidad de items.

private Map<String, List<String>> vouchers = new HashMap();

public ItemStack setVoucher(ItemStack item, String voucherId) {
return RtagItem.edit(item, tag -> {
tag.set(voucherId, "voucher");
});
}

public String getVoucherId(ItemStack item) {
return new RtagItem(item).get("voucher");
}

public boolean handleVoucher(Player player, ItemStack item) {
final String id = getVoucherId(item);
if (id == null || !vouchers.containsKey(id)) {
return false;
}
for (String cmd : vouchers.get(id)) {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", player.getName));
}
return true;
}

Conteo de número

Contar algún número dentro del tag del item.

public ItemStack addCount(ItemStack item, int amount) {
return RtagItem.edit(item, tag -> {
int i = tag.getOptional("myplugin", "count").or(0);
i = i + amount;
tag.set(i, "myplugin", "count");
});
}

public int getCount(ItemStack item) {
return new RtagItem(item).getOptional("myplugin", "count").or(0);
}

Dueño del item

Guardar información sobre el dueño del item en un tag custom.

public ItemStack setOwner(ItemStack item, OfflinePlayer player) {
return RtagItem.edit(item, tag -> {
tag.set(player.getName(), "owner", "name");
tag.set(player.getUniqueId(), "owner", "uuid");
});
}

public String getOwnerName(ItemStack item) {
return new RtagItem(item).get("owner", "name");
}

public UUID getOwnerUuid(ItemStack item) {
return new RtagItem(item).getOptional("owner", "uuid").asUuid();
}

Interacciones

Modificar las interacciones con el item utilizando data en NBT además de manejo de eventos.

Guardar item al morir

Ahora hagamos un tag custom como keepItem, que al ponerlo en true se guarde el item al morir.

public ItemStack setKeepItem(ItemStack item, boolean value) {
return RtagItem.edit(item, tag -> {
tag.set(value, "keepItem");
});
}

public boolean keepItem(ItemStack item) {
return new RtagItem(item).getOptional("keepItem").or(false);
}

Y manejar los eventos PlayerDeathEvent y PlayerRespawnEvent.

private final Map<String, List<ItemStack>> savedItems = new HashMap<>();

@EventHandler
public void onDeath(PlayerDeathEvent e) {
if (e.getKeepInventory()) {
return;
}

List<ItemStack> matches = new ArrayList<>();
e.getDrops().forEach(item -> {
if (keepItem(item)) {
matches.add(item);
}
});

if (matches.isEmpty()) {
return;
}

String name = e.getEntity().getName();
if (savedItems.containsKey(name)) {
savedItems.get(name).addAll(matches);
} else {
savedItems.put(name, matches);
}

e.getDrops().removeAll(matches);
}

@EventHandler
public void onRespawn(PlayerRespawnEvent e) {
String name = e.getPlayer().getName();
if (savedItems.containsKey(name)) {
e.getPlayer().getInventory().addItem(savedItems.get(name).toArray(new ItemStack[0]));
savedItems.remove(name);
}
}