package nova.microblock.common; import nova.core.block.Block; import nova.core.block.Stateful; import nova.core.component.Component; import nova.core.component.Updater; import nova.core.event.bus.Event; import nova.core.network.Packet; import nova.core.network.Syncable; import nova.core.retention.Data; import nova.core.retention.Storable; import nova.microblock.micro.MicroblockContainer; import nova.microblock.operation.ContainerRemove; import java.util.Collection; /** * A block container can forward events, components and methods to their respective microblock or multiblocks * @author Calclavia */ public class BlockContainer extends Block implements Updater, Stateful, Storable, Syncable { public BlockContainer() { events.on(RemoveEvent.class).bind(evt -> ContainerRemove.interactEventHandler(this, evt)); events.on(Event.class).bind(evt -> components.getOp(MicroblockContainer.class).ifPresent(cont -> cont.microblocks().forEach(uB -> uB.block.events.publish(evt))) ); } private void printComponents(Collection<Component> components) { printComponents(components, "::"); } private void printComponents(Collection<Component> components, String prefix) { components.forEach(component -> { System.out.println(prefix + component.getClass()); if (component instanceof MicroblockContainer) { ((MicroblockContainer) component).microblocks() .forEach(microblock -> { System.out.println("+++ " + microblock.block + " +++"); printComponents(microblock.block.components(), prefix + "::"); }); } }); } @Override public void read(Packet packet) { if (packet.getID() == 0) { if (packet.readBoolean()) { components.getOrAdd(new MicroblockContainer(this)); } } components.getOp(MicroblockContainer.class).ifPresent(c -> c.read(packet)); } @Override public void write(Packet packet) { if (packet.getID() == 0) { //Write the need to add components packet.writeBoolean(components.has(MicroblockContainer.class)); } components.getOp(MicroblockContainer.class).ifPresent(c -> c.write(packet)); } @Override public void load(Data data) { if (data.containsKey("microblockContainer")) { components.getOrAdd(new MicroblockContainer(this)); } components.getOp(MicroblockContainer.class).ifPresent(c -> c.load(data)); } @Override public void save(Data data) { components.getOp(MicroblockContainer.class).ifPresent(c -> c.save(data)); } }