use of org.cubeengine.module.itemduct.data.DuctData in project modules-extra by CubeEngine.
the class ItemDuctListener method onBreak.
@Listener
public void onBreak(ChangeBlockEvent.Break event) {
for (Transaction<BlockSnapshot> trans : event.getTransactions()) {
if (!trans.getOriginal().getLocation().isPresent()) {
continue;
}
BlockType type = trans.getOriginal().getState().getType();
Location<World> loc = trans.getOriginal().getLocation().get();
if (isEndPointType(type)) {
Direction dir = trans.getOriginal().get(Keys.DIRECTION).orElse(Direction.NONE);
Optional<DuctData> data = loc.getRelative(dir).get(DuctData.class);
if (data.isPresent()) {
data.get().remove(dir.getOpposite());
if (data.get().getFilters().isEmpty()) {
loc.getRelative(dir).remove(DuctData.class);
} else {
loc.getRelative(dir).offer(data.get());
}
}
}
}
}
use of org.cubeengine.module.itemduct.data.DuctData in project modules-extra by CubeEngine.
the class ItemDuctTransferListener method activate.
private void activate() {
List<Network> networks = new ArrayList<>();
for (Iterator<Location<World>> it = this.promptedActivations.keySet().iterator(); it.hasNext(); ) {
Location<World> loc = it.next();
if (this.promptedActivations.get(loc) - 1000 > System.currentTimeMillis()) {
promptedActivations.clear();
continue;
}
it.remove();
// Check if data is still present
Optional<DuctData> data = loc.get(DuctData.class);
if (data.isPresent()) {
for (Direction dir : Direction.values()) {
if (dir.isCardinal() || dir.isUpright()) {
BlockType type = loc.getRelative(dir).getBlockType();
if (STICKY_PISTON.equals(type) || OBSERVER.equals(type)) {
Optional<List<ItemStack>> filters = data.get().get(dir);
if (filters.isPresent()) {
Network network = manager.findNetwork(loc.getRelative(dir));
TileEntity te = loc.getTileEntity().get();
Inventory inventory = ((Carrier) te).getInventory();
if (te instanceof Chest) {
inventory = ((Chest) te).getDoubleChestInventory().orElse(inventory);
}
network.activate(inventory, filters.get());
networks.add(network);
}
}
}
}
}
}
for (Network network : networks) {
for (Location<World> exitLoc : network.exitPoints.keySet()) {
Direction exitDir = exitLoc.get(Keys.DIRECTION).orElse(Direction.NONE).getOpposite();
exitLoc = exitLoc.getRelative(exitDir.getOpposite());
promptActivation(exitLoc.getTileEntity().filter(t -> t instanceof Carrier).map(Carrier.class::cast).orElse(null), true, null);
}
}
if (promptedActivations.isEmpty()) {
task.cancel();
}
}
use of org.cubeengine.module.itemduct.data.DuctData in project modules-extra by CubeEngine.
the class Network method activate.
public void activate(Inventory inventory, List<ItemStack> filters) {
if (isStorage()) {
pullFromStorage(inventory, filters);
return;
}
for (Map.Entry<Location<World>, DuctData> entry : exitPoints.entrySet()) {
Inventory pollFrom = inventory;
Location<World> loc = entry.getKey();
DuctData data = entry.getValue();
Direction dir = loc.get(Keys.DIRECTION).orElse(Direction.NONE).getOpposite();
Location<World> targetLoc = loc.getRelative(dir.getOpposite());
TileEntity te = targetLoc.getTileEntity().get();
Inventory target = ((Carrier) te).getInventory();
if (te instanceof Dropper) {
Network nw = manager.findNetwork(targetLoc);
nw.transferToStorage(queryFiltered(filters, inventory), data.get(dir).get());
continue;
}
if (te instanceof Chest) {
target = ((Chest) te).getDoubleChestInventory().orElse(target);
}
Optional<List<ItemStack>> targetFilter = data.get(dir);
if (targetFilter.isPresent()) {
if (// Only allow to extract items in the filter
!filters.isEmpty()) {
// TODO more filters
pollFrom = queryFiltered(filters, inventory);
}
Inventory pollFromTo = pollFrom;
if (// Only allow to insert items in the filter
!targetFilter.get().isEmpty()) {
// TODO more filters
pollFromTo = queryFiltered(targetFilter.get(), inventory);
}
// For all filtered slots
doTransfer(pollFromTo, target);
}
}
}
use of org.cubeengine.module.itemduct.data.DuctData in project modules-extra by CubeEngine.
the class ItemDuctManager method setup.
public void setup(PluginContainer plugin, ItemductConfig config) {
if (!this.init) {
DataRegistration.<DuctData, ImmutableDuctData>builder().dataClass(DuctData.class).immutableClass(ImmutableDuctData.class).builder(new DuctDataBuilder()).manipulatorId("duct").dataName("CubeEngine ItemDuct Data").buildAndRegister(plugin);
DuctData.FILTERS.getQuery();
Ingredient hopper = Ingredient.of(ItemTypes.HOPPER);
activatorItem = ItemStack.of(ItemTypes.HOPPER, 1);
activatorItem.offer(Keys.ITEM_ENCHANTMENTS, singletonList(Enchantment.builder().type(EnchantmentTypes.LOOTING).level(1).build()));
activatorItem.offer(Keys.DISPLAY_NAME, Text.of(TextColors.GOLD, "ItemDuct Activator"));
activatorItem.offer(Keys.HIDE_ENCHANTMENTS, true);
activatorItem.offer(new DuctData(config.activatorUses));
activatorItem.offer(Keys.ITEM_LORE, Collections.singletonList(Text.of("Uses: ", config.activatorUses)));
this.recipe = CraftingRecipe.shapedBuilder().rows().row(hopper, hopper, hopper).row(hopper, Ingredient.of(ItemTypes.DIAMOND), hopper).row(hopper, hopper, hopper).result(activatorItem.copy()).build("ItemDuctActivator", plugin);
Sponge.getRegistry().getCraftingRecipeRegistry().register(this.recipe);
activatorItem.offer(new DuctData(config.superActivatorUses));
activatorItem.offer(Keys.ITEM_LORE, Collections.singletonList(Text.of("Uses: Infinite")));
activatorItem.offer(Keys.DISPLAY_NAME, Text.of(TextColors.GOLD, "ItemDuct Super Activator"));
this.superRecipe = CraftingRecipe.shapedBuilder().rows().row(hopper, hopper, hopper).row(hopper, Ingredient.of(ItemTypes.NETHER_STAR), hopper).row(hopper, hopper, hopper).result(activatorItem.copy()).build("ItemDuctSuperActivator", plugin);
Sponge.getRegistry().getCraftingRecipeRegistry().register(this.superRecipe);
}
this.reload(config);
this.init = true;
}
use of org.cubeengine.module.itemduct.data.DuctData in project modules-extra by CubeEngine.
the class ItemDuctFilterListener method onInteractPiston.
@Listener
public void onInteractPiston(InteractBlockEvent.Secondary.MainHand event, @Root Player player) {
event.getTargetBlock().getLocation().ifPresent(loc -> {
Direction dir = loc.get(Keys.DIRECTION).orElse(Direction.NONE);
Location<World> te = loc.getRelative(dir);
Optional<DuctData> ductData = te.get(DuctData.class);
Optional<ItemStack> itemInHand = player.getItemInHand(HandTypes.MAIN_HAND);
if (ductData.isPresent() && !itemInHand.isPresent() && player.get(Keys.IS_SNEAKING).orElse(false)) {
openFilter(player, ductData.get(), dir.getOpposite(), te);
}
});
}
Aggregations