/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.matter_network.components; import matteroverdrive.Reference; import matteroverdrive.api.network.IMatterNetworkClient; import matteroverdrive.api.network.MatterNetworkTask; import matteroverdrive.api.network.MatterNetworkTaskState; import matteroverdrive.data.ItemPattern; import matteroverdrive.matter_network.MatterNetworkPacket; import matteroverdrive.matter_network.packets.MatterNetworkRequestPacket; import matteroverdrive.matter_network.packets.MatterNetworkTaskPacket; import matteroverdrive.matter_network.tasks.MatterNetworkTaskStorePattern; import matteroverdrive.tile.TileEntityMachinePatternStorage; import matteroverdrive.util.MatterDatabaseHelper; import matteroverdrive.util.MatterNetworkHelper; import matteroverdrive.util.TimeTracker; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; /** * Created by Simeon on 7/15/2015. */ public class MatterNetworkComponentPatternStorage extends MatterNetworkComponentClient<TileEntityMachinePatternStorage> { private TimeTracker taskProcessingTracker; public MatterNetworkComponentPatternStorage(TileEntityMachinePatternStorage patternStorage) { super(patternStorage); taskProcessingTracker = new TimeTracker(); handlers.add(BASIC_CONNECTIONS_HANDLER); } @Override protected void executePacket(MatterNetworkPacket packet) { super.executePacket(packet); if (packet instanceof MatterNetworkTaskPacket) { MatterNetworkTask task = ((MatterNetworkTaskPacket)packet).getTask(getWorldObj()); if (task != null) { executeTasks((MatterNetworkTaskPacket) packet, task); } }else if (packet instanceof MatterNetworkRequestPacket) { executeRequests((MatterNetworkRequestPacket) packet); } } protected void executeTasks(MatterNetworkTaskPacket packet, MatterNetworkTask task) { if (taskProcessingTracker.hasDelayPassed(rootClient.getWorldObj(), rootClient.TASK_PROCESS_DELAY) && task.getState().belowOrEqual(MatterNetworkTaskState.QUEUED)) { if (task instanceof MatterNetworkTaskStorePattern) { if (rootClient.addItem(((MatterNetworkTaskStorePattern) task).getItemStack(), ((MatterNetworkTaskStorePattern) task).getProgress(), false, null)) { //if the task is finished and the item is in the database task.setState(MatterNetworkTaskState.FINISHED); } else { //if the item could not be added to the database for some reason, and has passed the canProcess check //then reset the task and set it to waiting //task.setState(MatterNetworkTaskState.WAITING); } } } } protected void executeRequests(MatterNetworkRequestPacket packet) { if (packet.getRequestType() == Reference.PACKET_REQUEST_PATTERN_SEARCH) { if (packet.getRequest() instanceof ItemPattern) { ItemPattern packPattern = (ItemPattern) packet.getRequest(); ItemPattern storagePattern = rootClient.getPattern(packPattern); if (storagePattern != null && packet.getSender(rootClient.getWorldObj()) instanceof IMatterNetworkClient) { NBTTagCompound patternNBT = new NBTTagCompound(); storagePattern.writeToNBT(patternNBT); MatterNetworkHelper.respondToRequest(getWorldObj(), rootClient, packet, Reference.PACKET_RESPONCE_VALID, patternNBT); } } }else if (packet.getRequestType() == Reference.PACKET_REQUEST_VALID_PATTERN_DESTINATION) { if (packet.getRequest() instanceof ItemPattern) { ItemPattern packetPattern = (ItemPattern)packet.getRequest(); ItemPattern storagePattern = rootClient.getPattern(packetPattern); NBTTagCompound packetPatternNBT = new NBTTagCompound(); packetPattern.writeToNBT(packetPatternNBT); if (storagePattern != null) { //return not valid when there is already a pattern in storage with full progress MatterNetworkHelper.respondToRequest(getWorldObj(), rootClient, packet,storagePattern.getProgress() >= MatterDatabaseHelper.MAX_ITEM_PROGRESS ? Reference.PACKET_RESPONCE_INVALID : Reference.PACKET_RESPONCE_VALID, packetPatternNBT); }else { ItemStack itemStack = packetPattern.toItemStack(false); boolean canAddItem = rootClient.addItem(itemStack,20,true,null); if (canAddItem) { MatterNetworkHelper.respondToRequest(getWorldObj(), rootClient, packet, Reference.PACKET_RESPONCE_VALID, packetPatternNBT); } } } } } @Override public boolean canPreform(MatterNetworkPacket packet) { return super.canPreform(packet) && rootClient.getRedstoneActive(); } }