use of mekanism.common.capabilities.chemical.BoxedChemicalHandler in project Mekanism by mekanism.
the class BoxedChemicalNetwork method tickEmit.
private <CHEMICAL extends Chemical<CHEMICAL>, STACK extends ChemicalStack<CHEMICAL>> long tickEmit(@Nonnull STACK stack) {
ChemicalType chemicalType = ChemicalType.getTypeFor(stack);
Collection<Map<Direction, LazyOptional<BoxedChemicalHandler>>> acceptorValues = acceptorCache.getAcceptorValues();
ChemicalHandlerTarget<CHEMICAL, STACK, IChemicalHandler<CHEMICAL, STACK>> target = new ChemicalHandlerTarget<>(stack, acceptorValues.size() * 2);
for (Map<Direction, LazyOptional<BoxedChemicalHandler>> acceptors : acceptorValues) {
for (LazyOptional<BoxedChemicalHandler> lazyAcceptor : acceptors.values()) {
lazyAcceptor.ifPresent(acceptor -> {
IChemicalHandler<CHEMICAL, STACK> handler = acceptor.getHandlerFor(chemicalType);
if (handler != null && ChemicalUtil.canInsert(handler, stack)) {
target.addHandler(handler);
}
});
}
}
return EmitUtils.sendToAcceptors(target, stack.getAmount(), stack);
}
use of mekanism.common.capabilities.chemical.BoxedChemicalHandler in project Mekanism by mekanism.
the class BoxedChemicalAcceptorCache method isChemicalAcceptorAndListen.
public boolean isChemicalAcceptorAndListen(@Nullable TileEntity tile, Direction side) {
// TODO: Improve this to make it easier to add more chemical types
Direction opposite = side.getOpposite();
LazyOptional<IGasHandler> gasAcceptor = CapabilityUtils.getCapability(tile, Capabilities.GAS_HANDLER_CAPABILITY, opposite);
LazyOptional<IInfusionHandler> infusionAcceptor = CapabilityUtils.getCapability(tile, Capabilities.INFUSION_HANDLER_CAPABILITY, opposite);
LazyOptional<IPigmentHandler> pigmentAcceptor = CapabilityUtils.getCapability(tile, Capabilities.PIGMENT_HANDLER_CAPABILITY, opposite);
LazyOptional<ISlurryHandler> slurryAcceptor = CapabilityUtils.getCapability(tile, Capabilities.SLURRY_HANDLER_CAPABILITY, opposite);
if (gasAcceptor.isPresent() || infusionAcceptor.isPresent() || pigmentAcceptor.isPresent() || slurryAcceptor.isPresent()) {
BoxedChemicalHandler chemicalHandler = new BoxedChemicalHandler();
if (gasAcceptor.isPresent()) {
chemicalHandler.addGasHandler(gasAcceptor);
}
if (infusionAcceptor.isPresent()) {
chemicalHandler.addInfusionHandler(infusionAcceptor);
}
if (pigmentAcceptor.isPresent()) {
chemicalHandler.addPigmentHandler(pigmentAcceptor);
}
if (slurryAcceptor.isPresent()) {
chemicalHandler.addSlurryHandler(slurryAcceptor);
}
// Update the cached acceptor and if it changed, add a listener to it to listen for invalidation
updateCachedAcceptorAndListen(side, tile, chemicalHandler);
return true;
}
return false;
}
Aggregations