/*
* 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 cpw.mods.fml.common.gameevent.TickEvent;
import matteroverdrive.Reference;
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.MatterNetworkResponsePacket;
import matteroverdrive.matter_network.packets.MatterNetworkTaskPacket;
import matteroverdrive.matter_network.tasks.MatterNetworkTaskReplicatePattern;
import matteroverdrive.tile.TileEntityMachineReplicator;
import matteroverdrive.util.MatterNetworkHelper;
import matteroverdrive.util.TimeTracker;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
* Created by Simeon on 7/13/2015.
*/
public class MatterNetworkComponentReplicator extends MatterNetworkComponentClientDispatcher<MatterNetworkTaskReplicatePattern,TileEntityMachineReplicator>
{
private TimeTracker patternSearchTracker;
public MatterNetworkComponentReplicator(TileEntityMachineReplicator replicator)
{
super(replicator, TickEvent.Phase.END);
patternSearchTracker = new TimeTracker();
handlers.add(BASIC_CONNECTIONS_HANDLER);
}
@Override
public boolean canPreform(MatterNetworkPacket packet)
{
if (super.canPreform(packet)) {
if (packet instanceof MatterNetworkTaskPacket) {
if (((MatterNetworkTaskPacket) packet).getTask(rootClient.getWorldObj()) instanceof MatterNetworkTaskReplicatePattern) {
return rootClient.getTaskQueue(0).remaintingCapacity() > 0;
}
}
return true;
}else
{
return false;
}
}
@Override
protected void executePacket(MatterNetworkPacket packet)
{
super.executePacket(packet);
if (packet instanceof MatterNetworkTaskPacket)
{
executeTasks((MatterNetworkTaskPacket)packet,((MatterNetworkTaskPacket)packet).getTask(getWorldObj()));
}else if (packet instanceof MatterNetworkResponsePacket)
{
executeResponses((MatterNetworkResponsePacket)packet);
}
}
protected void executeTasks(MatterNetworkTaskPacket packet,MatterNetworkTask task)
{
if (task instanceof MatterNetworkTaskReplicatePattern)
{
if (rootClient.getTaskQueue(0).queue((MatterNetworkTaskReplicatePattern)task))
{
task.setSender(rootClient);
task.setState(MatterNetworkTaskState.PROCESSING);
task.setAlive(true);
rootClient.forceSync();
}
}
}
protected void executeResponses(MatterNetworkResponsePacket packet)
{
//Request pattern search response
if (packet.getRequestType() == Reference.PACKET_REQUEST_PATTERN_SEARCH && packet.getResponseType() == Reference.PACKET_RESPONCE_VALID)
{
NBTTagCompound responseTag = packet.getResponse();
ItemPattern responsePattern = new ItemPattern(responseTag);
MatterNetworkTaskReplicatePattern task = rootClient.getTaskQueue(0).peek();
if (responseTag != null && responsePattern.equals(task.getPattern()))
{
if (rootClient.getInternalPatternStorage() != null)
{
//if the previous tag is the same but has a higher progress, then continue
if (rootClient.getInternalPatternStorage().equals(responsePattern) && rootClient.getInternalPatternStorage().getProgress() > responsePattern.getProgress())
{
return;
}
}
//save the pattern in the machine
rootClient.setInternalPatternStorage(responsePattern);
rootClient.forceSync();
}
}
}
@Override
public int manageTopQueue(World world,int queueID,MatterNetworkTaskReplicatePattern task)
{
int broadcasts = 0;
if (rootClient.getRedstoneActive() && !rootClient.canCompleteTask(task) && patternSearchTracker.hasDelayPassed(world,rootClient.PATTERN_SEARCH_DELAY)) {
if (task != null) {
for (int i = 0; i < 6; i++) {
MatterNetworkRequestPacket requestPacket = new MatterNetworkRequestPacket(rootClient, Reference.PACKET_REQUEST_PATTERN_SEARCH,ForgeDirection.getOrientation(i),rootClient.getFilter(), task.getPattern());
if (MatterNetworkHelper.broadcastPacketInDirection(world, requestPacket, rootClient, ForgeDirection.getOrientation(i)))
{
broadcasts++;
}
}
}
}
return broadcasts;
}
}