/* * 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.tile; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import matteroverdrive.MatterOverdrive; import matteroverdrive.api.inventory.UpgradeTypes; import matteroverdrive.api.network.IMatterNetworkBroadcaster; import matteroverdrive.api.network.IMatterNetworkClient; import matteroverdrive.api.network.IMatterNetworkDispatcher; import matteroverdrive.data.BlockPos; import matteroverdrive.data.ItemPattern; import matteroverdrive.machines.MOTileEntityMachine; import matteroverdrive.machines.MachineNBTCategory; import matteroverdrive.machines.components.ComponentMatterNetworkConfigs; import matteroverdrive.matter_network.MatterNetworkPacket; import matteroverdrive.matter_network.MatterNetworkPacketQueue; import matteroverdrive.matter_network.MatterNetworkTaskQueue; import matteroverdrive.matter_network.components.MatterNetworkComponentPatternMonitor; import matteroverdrive.matter_network.tasks.MatterNetworkTaskReplicatePattern; import matteroverdrive.network.packet.client.PacketPatternMonitorSync; import matteroverdrive.util.TimeTracker; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import static matteroverdrive.util.MOBlockHelper.getOppositeSide; /** * Created by Simeon on 4/26/2015. */ public class TileEntityMachinePatternMonitor extends MOTileEntityMachine implements IMatterNetworkDispatcher, IMatterNetworkClient, IMatterNetworkBroadcaster { public static final int BROADCAST_WEATING_DELAY = 80; public static final int SEARCH_DELAY = 20; public static final int VALIDATE_DELAY = 120; public static final int TASK_QUEUE_SIZE = 16; List<ItemPattern> guiPatterns = new ArrayList<>(); HashSet<BlockPos> databases; MatterNetworkTaskQueue<MatterNetworkTaskReplicatePattern> taskQueue; TimeTracker searchDelayTracker; private MatterNetworkComponentPatternMonitor networkComponent; private ComponentMatterNetworkConfigs componentMatterNetworkConfigs; public TileEntityMachinePatternMonitor() { super(4); taskQueue = new MatterNetworkTaskQueue<>(this,TASK_QUEUE_SIZE); databases = new HashSet<>(); searchDelayTracker = new TimeTracker(); playerSlotsHotbar = true; } @Override protected void registerComponents() { super.registerComponents(); componentMatterNetworkConfigs = new ComponentMatterNetworkConfigs(this); networkComponent = new MatterNetworkComponentPatternMonitor(this); addComponent(componentMatterNetworkConfigs); addComponent(networkComponent); } @Override public String getSound() { return null; } @Override public boolean hasSound() { return false; } @Override public boolean getServerActive() { return false; } @Override public float soundVolume() { return 0; } public boolean isAffectedByUpgrade(UpgradeTypes type) { return false; } //region Matter Network Functions @Override public int onNetworkTick(World world, TickEvent.Phase phase) { return networkComponent.onNetworkTick(world,phase); } @Override public MatterNetworkTaskQueue<MatterNetworkTaskReplicatePattern> getTaskQueue(int id) { return taskQueue; } @Override public int getTaskQueueCount() { return 1; } public void SyncDatabasesWithClient() { MatterOverdrive.packetPipeline.sendToAllAround(new PacketPatternMonitorSync(this), this, 64); } @Override public void writeCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories, boolean toDisk) { super.writeCustomNBT(nbt, categories, toDisk); if (categories.contains(MachineNBTCategory.DATA) && toDisk) { taskQueue.writeToNBT(nbt); } } @Override protected void onActiveChange() { } @Override public void readCustomNBT(NBTTagCompound nbt, EnumSet<MachineNBTCategory> categories) { super.readCustomNBT(nbt, categories); if (categories.contains(MachineNBTCategory.DATA)) { taskQueue.readFromNBT(nbt); } } @Override protected void onAwake(Side side) { } @Override public BlockPos getPosition() { return new BlockPos(xCoord, yCoord, zCoord); } @Override public boolean canConnectFromSide(ForgeDirection side) { int meta = worldObj.getBlockMetadata(xCoord,yCoord,zCoord); return getOppositeSide(meta) == side.ordinal(); } //endregion public void queuePatternRequest(List<ItemPattern> request) { networkComponent.queuePatternRequest(request); } public HashSet<BlockPos> getDatabases() { return databases; } public void setDatabases(HashSet<BlockPos> blockPositions) { databases = blockPositions; } public void forceSearch(boolean refresh) { networkComponent.setNeedsSearchRefresh(refresh); } public void queueSearch() { if (searchDelayTracker.hasDelayPassed(worldObj,SEARCH_DELAY)) { forceSearch(true); } } public boolean needsRefresh() { return networkComponent.getNeedsSearchRefresh(); } @Override public boolean canPreform(MatterNetworkPacket packet) { return networkComponent.canPreform(packet); } @Override public void queuePacket(MatterNetworkPacket packet, ForgeDirection from) { networkComponent.queuePacket(packet,from); } @Override public MatterNetworkPacketQueue getPacketQueue(int queueID) { return networkComponent.getPacketQueue(queueID); } @Override public int getPacketQueueCount() { return networkComponent.getPacketQueueCount(); } @Override public boolean shouldRenderInPass(int pass) { return pass == 1; } @Override public void onAdded(World world, int x, int y, int z) { } @Override public void onPlaced(World world, EntityLivingBase entityLiving) { } @Override public void onDestroyed() { } @Override public NBTTagCompound getFilter() { return componentMatterNetworkConfigs.getFilter(); } public ComponentMatterNetworkConfigs getComponentMatterNetworkConfigs() { return componentMatterNetworkConfigs; } @SideOnly(Side.CLIENT) public List<ItemPattern> getGuiPatterns() { return guiPatterns; } public void setGuiPatterns(List<ItemPattern> patterns) { this.guiPatterns = patterns; } }