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);
}
}