package com.sk89q.forge;
import io.netty.buffer.ByteBufInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
/**
* Manages a list of {@link Behavior}s.
*
* <p>
* Multiple behaviors can be added to this list and the events of each one will
* bubble to listeners assigned specifically to this list. In addition, any
* calls for {@link Behavior} on this method will be passed on all the behaviors
* within this list.
* </p>
*
* <p>
* Behaviors should not throw exceptions, as those are not caught by the methods
* on this list, and that may result in undefined behavior (beyond the scope of
* the failing behavior).
* </p>
*/
public class BehaviorList implements Collection<Behavior>, Behavior, BehaviorListener {
private List<Behavior> list = new ArrayList<Behavior>();
private List<BehaviorListener> listeners = new ArrayList<BehaviorListener>();
@Override
public int size() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public boolean contains(Object o) {
return list.contains(o);
}
@Override
public Iterator<Behavior> iterator() {
return list.iterator();
}
@Override
public Object[] toArray() {
return list.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return list.toArray(a);
}
@Override
public boolean add(Behavior e) {
e.addBehaviorListener(this);
return list.add(e);
}
@Override
public boolean remove(Object o) {
if (o instanceof Behavior) {
((Behavior) o).removeBehaviorListener(this);
}
return list.remove(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return list.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends Behavior> c) {
boolean changed = false;
for (Behavior e : c) {
changed = add(e) || changed;
}
return changed;
}
@Override
public boolean removeAll(Collection<?> c) {
boolean changed = false;
for (Object e : c) {
if (e instanceof Behavior) {
changed = remove(e) || changed;
}
}
return changed;
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
list.clear();
}
@Override
public boolean equals(Object o) {
return list.equals(o);
}
@Override
public int hashCode() {
return list.hashCode();
}
@Override
public void writeSaveNBT(NBTTagCompound tag) {
for (Behavior entity : this) {
entity.writeSaveNBT(tag);
}
}
@Override
public void readSaveNBT(NBTTagCompound tag) {
for (Behavior entity : this) {
entity.readSaveNBT(tag);
}
}
@Override
public void writeNetworkedNBT(NBTTagCompound tag) {
for (Behavior entity : this) {
entity.writeNetworkedNBT(tag);
}
}
@Override
public void readNetworkedNBT(NBTTagCompound tag) {
for (Behavior entity : this) {
entity.readNetworkedNBT(tag);
}
}
@Override
public void readPayload(EntityPlayer player, BehaviorPayload payload, ByteBufInputStream in) throws IOException {
for (Behavior entity : this) {
entity.readPayload(player, payload, in);
}
}
@Override
public void networkedNbt(NBTTagCompound tag) {
for (BehaviorListener listener : listeners) {
listener.networkedNbt(tag);
}
}
@Override
public void payloadSend(BehaviorPayload payload, List<EntityPlayer> player) {
for (BehaviorListener listener : listeners) {
listener.payloadSend(payload, player);
}
}
@Override
public void addBehaviorListener(BehaviorListener listener) {
listeners.add(listener);
}
@Override
public void removeBehaviorListener(BehaviorListener listener) {
listeners.remove(listener);
}
}