Package forestry.mail.gui

Source Code of forestry.mail.gui.ContainerCatalogue

/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.mail.gui;

import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ICrafting;

import forestry.api.mail.ITradeStation;
import forestry.api.mail.PostManager;
import forestry.api.mail.TradeStationInfo;
import forestry.api.mail.IMailAddress;
import forestry.api.mail.EnumAddressee;
import forestry.mail.network.PacketLetterInfo;
import forestry.mail.EnumStationState;
import forestry.core.gui.ContainerForestry;
import forestry.core.gui.IGuiSelectable;
import forestry.core.network.PacketIds;
import forestry.core.network.PacketPayload;
import forestry.core.network.PacketUpdate;
import forestry.core.proxy.Proxies;

public class ContainerCatalogue extends ContainerForestry implements IGuiSelectable {

  private final EntityPlayer player;
  private final LinkedHashMap<IMailAddress, ITradeStation> stations;
  private TradeStationInfo currentTrade = null;
  private Iterator<ITradeStation> iterator = null;

  private int maxItPos = 0;
  private int currentItPos = 0;

  private boolean needsSynch = true;
  private int currentFilter = 1;

  private static final String[] FILTER_NAMES = new String[] { "all", "online", "offline" };
  @SuppressWarnings({"unchecked", "rawtypes"})
  private static final Set<EnumStationState>[] FILTERS = new EnumSet[] {
    EnumSet.noneOf(EnumStationState.class),
    EnumSet.of(EnumStationState.OK),
    EnumSet.of(EnumStationState.INSUFFICIENT_OFFER, EnumStationState.INSUFFICIENT_TRADE_GOOD, EnumStationState.INSUFFICIENT_BUFFER, EnumStationState.INSUFFICIENT_PAPER, EnumStationState.INSUFFICIENT_STAMPS)
  };

  public ContainerCatalogue(EntityPlayer player) {
    super(player.inventory);
    this.player = player;

    // Filter out any trade stations which do not actually offer anything.
    stations = new LinkedHashMap<IMailAddress, ITradeStation>();
    rebuildStationsList();
  }

  public int getMaxCount() { return maxItPos; }
  public int getCurrentPos() { return currentItPos; }

  public String getFilterIdent() { return FILTER_NAMES[currentFilter]; }

  private void rebuildStationsList() {
    stations.clear();
    for(ITradeStation station : PostManager.postRegistry.getPostOffice(player.worldObj).getActiveTradeStations(player.worldObj).values()) {
      TradeStationInfo info = station.getTradeInfo();
      if(info.tradegood == null)
        continue;

      if(!FILTERS[currentFilter].isEmpty()) {
        if(!FILTERS[currentFilter].contains(info.state))
          continue;
      }

      stations.put(station.getAddress(), station);
    }
    maxItPos = stations.size();
    resetIteration();

  }

  private void resetIteration() {
    if(!stations.isEmpty()) {
      iterator = stations.values().iterator();
      updateTradeInfo(iterator.next());
    } else
      updateTradeInfo(null);

    currentItPos = 1;
  }

  public void advanceIteration() {

    if(!Proxies.common.isSimulating(player.worldObj)) {
      sendSelection(true);
      return;
    }

    if(stations.isEmpty())
      return;

    if(iterator.hasNext()) {
      currentItPos++;
      updateTradeInfo(iterator.next());
    } else
      resetIteration();
  }

  public void regressIteration() {

    if(!Proxies.common.isSimulating(player.worldObj)) {
      sendSelection(false);
      return;
    }

    if(stations.isEmpty())
      return;

    iterator = stations.values().iterator();
    ITradeStation previous = null;
    currentItPos = 0;

    while(iterator.hasNext()) {
      ITradeStation current = iterator.next();
      if(!current.getAddress().equals(currentTrade.address)) {
        currentItPos++;
        previous = current;
        continue;
      }

      if(previous == null) {
        Iterator<ITradeStation> it = stations.values().iterator();
        currentItPos = stations.size();
        while(it.hasNext())
          previous = it.next();

      }
      updateTradeInfo(previous);
      break;
    }
  }

  public void cycleFilter() {
    if(!Proxies.common.isSimulating(player.worldObj)) {
      PacketPayload payload = new PacketPayload(1, 0, 0);
      payload.intPayload[0] = 2;
      PacketUpdate packet = new PacketUpdate(PacketIds.GUI_SELECTION_CHANGE, payload);
      Proxies.net.sendToServer(packet);
      return;
    }

    if(currentFilter < FILTERS.length -1)
      currentFilter++;
    else
      currentFilter = 0;

    rebuildStationsList();
  }

  private void sendSelection(boolean advance) {
    PacketPayload payload = new PacketPayload(1, 0, 0);
    payload.intPayload[0] = advance ? 0 : 1;
    PacketUpdate packet = new PacketUpdate(PacketIds.GUI_SELECTION_CHANGE, payload);
    Proxies.net.sendToServer(packet);
  }

  /* Managing Trade info */
  public void updateTradeInfo(ITradeStation station) {
    // Updating is done by the server.
    if (!Proxies.common.isSimulating(player.worldObj))
      return;

    if(station != null)
      setTradeInfo(station.getTradeInfo());
    else
      setTradeInfo(null);
    needsSynch = true;
  }

  public void handleTradeInfoUpdate(PacketLetterInfo packet) {
    setTradeInfo(packet.tradeInfo);
  }

  public TradeStationInfo getTradeInfo() {
    return currentTrade;
  }

  private void setTradeInfo(TradeStationInfo info) {
    currentTrade = info;
  }

  @Override
  public void detectAndSendChanges() {
    super.detectAndSendChanges();

    if(needsSynch) {
      for (int i = 0; i < crafters.size(); i++) {
        ICrafting crafter = (ICrafting)crafters.get(i);
        crafter.sendProgressBarUpdate(this, 0, currentItPos);
        crafter.sendProgressBarUpdate(this, 1, maxItPos);
        crafter.sendProgressBarUpdate(this, 2, currentFilter);
      }

      Proxies.net.sendToPlayer(new PacketLetterInfo(PacketIds.LETTER_INFO, EnumAddressee.TRADER, currentTrade, null), player);
      needsSynch = false;
    }
  }

  @Override
  public void updateProgressBar(int i, int j) {
    switch(i) {
    case 0:
      currentItPos = j;
      break;
    case 1:
      maxItPos = j;
      break;
    case 2:
      currentFilter = j;
      break;
    }
  }

  @Override
  public void handleSelectionChange(EntityPlayer player, PacketUpdate packet) {

    if (packet.payload.intPayload[0] == 0) {
      advanceIteration();
    } else if(packet.payload.intPayload[0] == 1)
      regressIteration();
    else if(packet.payload.intPayload[0] == 2)
      cycleFilter();

    needsSynch = true;
  }

  @Override
  public void setSelection(PacketUpdate packet) {
  }

}
TOP

Related Classes of forestry.mail.gui.ContainerCatalogue

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.