/*
* 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 cpw.mods.fml.relauncher.Side;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.inventory.UpgradeTypes;
import matteroverdrive.api.network.IMatterNetworkClient;
import matteroverdrive.api.network.IMatterNetworkConnection;
import matteroverdrive.api.network.IMatterNetworkFilter;
import matteroverdrive.data.BlockPos;
import matteroverdrive.data.Inventory;
import matteroverdrive.machines.IMachineComponent;
import matteroverdrive.machines.MOTileEntityMachine;
import matteroverdrive.machines.MachineNBTCategory;
import matteroverdrive.matter_network.MatterNetworkPacket;
import matteroverdrive.matter_network.MatterNetworkPacketQueue;
import matteroverdrive.matter_network.handlers.AbstractMatterNetworkPacketHandler;
import matteroverdrive.matter_network.handlers.PacketHandlerBasicConnections;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import org.apache.logging.log4j.Level;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
/**
* Created by Simeon on 7/15/2015.
*/
public abstract class MatterNetworkComponentClient<T extends MOTileEntityMachine & IMatterNetworkConnection> implements IMatterNetworkClient, IMachineComponent<T>
{
protected static PacketHandlerBasicConnections BASIC_CONNECTIONS_HANDLER = new PacketHandlerBasicConnections();
protected List<AbstractMatterNetworkPacketHandler> handlers;
protected MatterNetworkPacketQueue<MatterNetworkPacket> packetQueue;
protected T rootClient;
public MatterNetworkComponentClient(T rootClient)
{
this.rootClient = rootClient;
packetQueue = new MatterNetworkPacketQueue(rootClient);
handlers = new ArrayList<>();
}
@Override
public void queuePacket(MatterNetworkPacket packet, ForgeDirection from)
{
if (canPreform(packet) && packet.isValid(getWorldObj()))
{
getPacketQueue(0).queue(packet);
packet.tickAlive(getWorldObj(), true);
packet.onAddedToQueue(getWorldObj(),getPacketQueue(0),0);
}
}
protected void manageTopPacket()
{
for (int i = 0;i < getPacketQueueCount();i++)
{
if (getPacketQueue(i).peek() != null)
{
try {
executePacket(getPacketQueue(i).peek());
}catch (Exception e)
{
MatterOverdrive.log.log(Level.ERROR,e,"There was a problem while executing packet %s from queue %s",getPacketQueue(i).peek(),i);
}finally
{
getPacketQueue(i).dequeue();
getPacketQueue(i).tickAllAlive(getWorldObj(),true);
}
}
}
}
protected void executePacket(MatterNetworkPacket packet)
{
for (AbstractMatterNetworkPacketHandler handler : handlers)
{
handler.processPacket(packet,new AbstractMatterNetworkPacketHandler.Context(getWorldObj(),rootClient));
}
}
public int onNetworkTick(World world, TickEvent.Phase phase)
{
if (phase == TickEvent.Phase.END)
{
manageTopPacket();
}
return 0;
}
@Override
public boolean canPreform(MatterNetworkPacket packet)
{
if (packet.getFilter() != null)
{
NBTTagList connectionsList = packet.getFilter().getTagList(IMatterNetworkFilter.CONNECTIONS_TAG, Constants.NBT.TAG_COMPOUND);
for (int i = 0;i < connectionsList.tagCount();i++)
{
BlockPos filterPos = new BlockPos(connectionsList.getCompoundTagAt(i));
if (filterPos.equals(getPosition()))
{
return true;
}
}
return false;
}
return true;
}
//region Getters and Setters
@Override
public BlockPos getPosition()
{
return rootClient.getPosition();
}
@Override
public boolean canConnectFromSide(ForgeDirection side)
{
return rootClient.canConnectFromSide(side);
}
@Override
public MatterNetworkPacketQueue<MatterNetworkPacket> getPacketQueue(int queueID)
{
return packetQueue;
}
public World getWorldObj()
{
return rootClient.getWorldObj();
}
@Override
public int getPacketQueueCount()
{
return 1;
}
//endregion
//Machine Component
@Override
public void readFromNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories)
{
if (categories.contains(MachineNBTCategory.DATA))
{
packetQueue.readFromNBT(nbt);
}
}
@Override
public void writeToNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories, boolean toDisk)
{
if (categories.contains(MachineNBTCategory.DATA) && toDisk)
{
packetQueue.writeToNBT(nbt);
}
}
@Override
public void registerSlots(Inventory inventory) {
}
@Override
public void update(T machine) {
}
@Override
public boolean isAffectedByUpgrade(UpgradeTypes type) {
return false;
}
@Override
public boolean isActive() {
return false;
}
@Override
public void onActiveChange(T machine) {
}
@Override
public void onAwake(T machine, Side side) {
}
@Override
public void onPlaced(World world, EntityLivingBase entityLiving, T machine) {
}
//endregion
}