package net.glowstone.inventory;
import net.glowstone.util.collection.SuperList;
import net.glowstone.util.collection.SuperSet;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.InventoryHolder;
import java.util.List;
/**
* Inventory which delegate to other Inventory objects.
*/
public class GlowSuperInventory extends GlowInventory {
private List<GlowInventory> parents;
protected GlowSuperInventory() { }
public GlowSuperInventory(List<GlowInventory> parents, InventoryHolder owner, InventoryType type) {
initialize(parents, owner, type);
}
public GlowSuperInventory(List<GlowInventory> parents, InventoryHolder owner, InventoryType type, String title) {
initialize(parents, owner, type, title);
}
// Why these weird initialize methods, instead of handling everything
// in the constructors?
//
// Well, the subclass GlowDoubleChestInventory owner must be a
// DoubleChest. However, a DoubleChest takes a DoubleChestInventory as the
// only constructor parameter. However, using "this" inside a super call
// isn't possible (Java compiler complains), so stuff like
// "super(new DoubleChest(this), ...)" can't be used.
//
// Using "this" after the super call inside the constructor is possible,
// so I'm using these pseudo-constructors.
protected void initialize(List<GlowInventory> parents, InventoryHolder owner, InventoryType type) {
initialize(parents, owner, type, type.getDefaultTitle());
}
protected void initialize(List<GlowInventory> parents, InventoryHolder owner, InventoryType type, String title) {
SuperList<GlowInventorySlot> slots = new SuperList<>();
SuperSet<HumanEntity> viewers = new SuperSet<>();
for (GlowInventory parent : parents) {
slots.getParents().add(parent.getSlots());
viewers.getParents().add(parent.getViewersSet());
}
super.initialize(slots, viewers, owner, type, title);
this.parents = parents;
}
public List<GlowInventory> getParents() {
return parents;
}
}