public final class TestPlugin extends JavaPlugin implements Listener
{
private final Map<Player, ItemStack[]> items = new WeakHashMap<>();
@Override
public void onEnable()
{
this.getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onDeath(PlayerDeathEvent event)
{
// Удаляем из дропа всё, что можно сохранить
event.getDrops().removeIf(TestPlugin::needSave);
// Удаляем из инвентаря всё, что нельзя сохранить
Inventory inv = event.getEntity().getInventory();
for (int i = 0; i < inv.getSize(); i++)
{
ItemStack item = inv.getItem(i);
if (item != null && !needSave(item))
inv.setItem(i, null);
}
// Запоминаем инвентарь
this.items.put(event.getEntity(), inv.getContents());
}
@EventHandler
public void onRespawn(PlayerRespawnEvent event)
{
Player player = event.getPlayer();
ItemStack[] oldArr = this.items.remove(player); // Удаляем инвентарь и сохраняем ссылку на него в переменную
if (oldArr != null)
{
Inventory inv = player.getInventory();
ItemStack[] newArr = inv.getContents();
mergeOrDrop(player.getLocation(), newArr, oldArr); // Добавляем сохранённые предметы в инвентарь к игроку или дропаем их, если слоты уже заняты
inv.setContents(newArr);
}
}
private static boolean needSave(ItemStack item)
{
return item != null && item.hasItemMeta() && item.getItemMeta().hasLore();
}
private static void mergeOrDrop(Location location, ItemStack[] newArr, ItemStack[] oldArr)
{
int length = Math.min(newArr.length, oldArr.length);
for (int i = 0; i < length; i++)
{
ItemStack item = oldArr[i];
if (item != null)
if (newArr[i] == null)
newArr[i] = item; // Добавляем предмет
else
location.getWorld().dropItem(location, item); // Дропаем предмет, если слот занят
}
}
}