/*
* 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.packets;
import matteroverdrive.api.network.IMatterNetworkConnection;
import matteroverdrive.api.network.IMatterNetworkDispatcher;
import matteroverdrive.api.network.MatterNetworkTask;
import matteroverdrive.api.network.MatterNetworkTaskState;
import matteroverdrive.data.BlockPos;
import matteroverdrive.matter_network.MatterNetworkPacket;
import matteroverdrive.matter_network.MatterNetworkPacketQueue;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.HashSet;
/**
* Created by Simeon on 4/20/2015.
*/
public class MatterNetworkTaskPacket extends MatterNetworkPacket
{
private long taskID;
private byte queueID = -1;
public MatterNetworkTaskPacket()
{
super();
}
public MatterNetworkTaskPacket(IMatterNetworkDispatcher sender,long taskID,byte queueID,ForgeDirection port)
{
this(sender.getPosition(), taskID,queueID,port);
}
public MatterNetworkTaskPacket(IMatterNetworkDispatcher sender,MatterNetworkTask task,byte queueID,ForgeDirection port)
{
this(sender.getPosition(), task.getId(),queueID,port);
}
public MatterNetworkTaskPacket(IMatterNetworkDispatcher sender,MatterNetworkTask task,byte queueID,ForgeDirection port,NBTTagCompound filter)
{
this(sender.getPosition(), task.getId(),queueID,port,filter);
}
public MatterNetworkTaskPacket(BlockPos sender, long taskID, byte queueID, ForgeDirection port)
{
this(sender, taskID,queueID,port,null);
}
public MatterNetworkTaskPacket(BlockPos sender, long taskID, byte queueID, ForgeDirection port, NBTTagCompound filter)
{
super(sender,port);
this.taskID = taskID;
this.queueID = queueID;
this.filter = filter;
}
public MatterNetworkTaskPacket copy(IMatterNetworkConnection connection)
{
MatterNetworkTaskPacket newPacket = new MatterNetworkTaskPacket(senderPos,taskID,queueID,senderPos.orientation,filter);
newPacket.path = new HashSet<>(path);
addToPath(connection,ForgeDirection.UNKNOWN);
return newPacket;
}
public MatterNetworkTask getTask(World world)
{
IMatterNetworkConnection sender = getSender(world);
if (sender != null && sender instanceof IMatterNetworkDispatcher) {
return ((IMatterNetworkDispatcher)(sender)).getTaskQueue(queueID).getWithID(taskID);
}
return null;
}
@Override
public void readFromNBT(NBTTagCompound tagCompound)
{
super.readFromNBT(tagCompound);
if (tagCompound != null) {
taskID = tagCompound.getLong("TaskID");
queueID = tagCompound.getByte("QueueID");
}
}
@Override
public void writeToNBT(NBTTagCompound tagCompound)
{
super.writeToNBT(tagCompound);
if (tagCompound != null)
{
tagCompound.setLong("TaskID", taskID);
tagCompound.setByte("QueueID",queueID);
}
}
public boolean isValid(World world)
{
return queueID >= (byte)0 && getTask(world) != null && getTask(world).getState() != MatterNetworkTaskState.INVALID;
}
@Override
public String getName()
{
return "Task Packet";
}
@Override
public void tickAlive(World world,boolean isAlive)
{
super.tickAlive(world,isAlive);
getTask(world).setAlive(isAlive);
}
@Override
public void onAddedToQueue(World world,MatterNetworkPacketQueue packetQueue,int queueID)
{
super.onAddedToQueue(world, packetQueue, queueID);
MatterNetworkTask task = getTask(world);
if (task != null)
{
if (task.getState().below(MatterNetworkTaskState.QUEUED) && task.getState().above(MatterNetworkTaskState.INVALID))
{
task.setState(MatterNetworkTaskState.QUEUED);
}
}
}
}