package net.glowstone.inventory;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
/**
* Tracker for when the equipment of an entity is changed.
*/
public final class EquipmentMonitor {
/**
* The entity whose equipment is being monitored.
*/
private final LivingEntity entity;
/**
* The previous equipment.
*/
private final ItemStack[] slots = new ItemStack[5];
/**
* All changes between the previous equipment.
*/
private final List<Entry> changes = new LinkedList<>();
/**
* Whether the {@link #changes} have been calculated for this tick.
*/
private boolean changesCalculated;
/**
* Create a new monitor for the given entity.
* @param entity The entity whose equipment to monitor.
*/
public EquipmentMonitor(LivingEntity entity) {
this.entity = entity;
}
/**
* Get the item in the inventory.
* Slot 0 is the item in the hand.
* Slot 1 to 4 is armor (boots to helmet).
* @return The item in that slot.
*/
private ItemStack getItem(int slot) {
EntityEquipment equipment = entity.getEquipment();
if (equipment == null) {
return null;
}
if (slot == 0) {
return equipment.getItemInHand();
} else {
return equipment.getArmorContents()[slot - 1];
}
}
/**
* Update the given slot with the current value from the inventory.
* @param slot The slot to update.
*/
private void updateItem(int slot) {
ItemStack source = getItem(slot);
slots[slot] = source == null ? null : source.clone();
}
/**
* Check for changes in the inventory view.
* @return The list of changed items.
*/
public List<Entry> getChanges() {
if (!changesCalculated) {
for (int i = 0; i < 5; ++i) {
ItemStack item = getItem(i);
if (!Objects.equals(slots[i], item)) {
changes.add(new Entry(i, item));
}
}
changesCalculated = true;
}
return changes;
}
/**
* Reset all cached changes and update latest content.
*/
public void resetChanges() {
changes.clear();
changesCalculated = false;
for (int i = 0; i < 5; i++) {
updateItem(i);
}
}
/**
* Get the entity whose equipment is being monitored.
* @return The entity equipment.
*/
public LivingEntity getEntity() {
return entity;
}
/**
* An entry which has been changed.
*/
public static class Entry {
public final int slot;
public final ItemStack item;
public Entry(int slot, ItemStack item) {
this.slot = slot;
this.item = item;
}
}
}