Potentially fixes ComputerCraft related NPE with syncing EMC values on world join, and added a button to the tablet GUI that allows a player to switch the sort order (ascending/descending)

This commit is contained in:
Pahimar 2015-05-04 22:36:39 -04:00
parent 6e3014a371
commit f98760d49b
10 changed files with 237 additions and 167 deletions

View file

@ -88,6 +88,7 @@ public class GuiTransmutationTablet extends GuiBase
}
}
};
sortOrderButton = new ElementStatefulButton(this, 151, 58, "sortOrder", 0, 0, 0, 0, 18, 0, 18, 18, 36, 18, Textures.Gui.Elements.BUTTON_SORT_ORDER)
{
@Override
@ -98,11 +99,11 @@ public class GuiTransmutationTablet extends GuiBase
{
if (getState() == SORT_ASCENDING)
{
drawTexturedModalRect(posX, posY, 36, 0, sizeX, sizeY);
drawTexturedModalRect(posX, posY, 0, 0, sizeX, sizeY);
}
else if (getState() == SORT_DESCENDING)
{
drawTexturedModalRect(posX, posY, 0, 0, sizeX, sizeY);
drawTexturedModalRect(posX, posY, 18, 0, sizeX, sizeY);
}
}
}

View file

@ -4,6 +4,7 @@ import com.pahimar.ee3.inventory.element.IElementButtonHandler;
import com.pahimar.ee3.inventory.element.IElementTextFieldHandler;
import com.pahimar.ee3.item.ItemAlchemicalTome;
import com.pahimar.ee3.knowledge.TransmutationKnowledgeRegistry;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.util.FilterUtils;
import com.pahimar.ee3.util.ItemHelper;
import cpw.mods.fml.relauncher.Side;
@ -30,7 +31,7 @@ public class ContainerAlchemicalTome extends ContainerEE implements IElementButt
public ContainerAlchemicalTome(EntityPlayer entityPlayer, ItemStack itemStack)
{
TreeSet<ItemStack> knownTransmutations = new TreeSet<ItemStack>(ItemHelper.displayNameComparator);
TreeSet<ItemStack> knownTransmutations = new TreeSet<ItemStack>(Comparators.displayNameComparator);
if (itemStack.getItem() instanceof ItemAlchemicalTome && ItemHelper.hasOwnerUUID(itemStack))
{
@ -181,7 +182,7 @@ public class ContainerAlchemicalTome extends ContainerEE implements IElementButt
this.requiresUpdate = true;
boolean shouldUpdateInventory = false;
ItemStack[] newInventory = new ItemStack[80];
List<ItemStack> filteredList = new ArrayList(FilterUtils.filterByNameContains(inventoryAlchemicalTome.getKnownTransmutations(), searchTerm, ItemHelper.displayNameComparator));
List<ItemStack> filteredList = new ArrayList(FilterUtils.filterByNameContains(inventoryAlchemicalTome.getKnownTransmutations(), searchTerm, Comparators.displayNameComparator));
maxPageOffset = filteredList.size() / 80;
if (pageOffset > maxPageOffset)

View file

@ -44,7 +44,7 @@ public class ContainerTransmutationTablet extends ContainerEE implements IElemen
{
this.tileEntityTransmutationTablet = tileEntityTransmutationTablet;
TreeSet<ItemStack> knownTransmutations = new TreeSet<ItemStack>(ItemHelper.displayNameComparator);
TreeSet<ItemStack> knownTransmutations = new TreeSet<ItemStack>(Comparators.displayNameComparator);
if (tileEntityTransmutationTablet.getStackInSlot(TileEntityTransmutationTablet.ALCHEMICAL_TOME_INDEX) != null)
{
ItemStack itemStack = tileEntityTransmutationTablet.getStackInSlot(TileEntityTransmutationTablet.ALCHEMICAL_TOME_INDEX);
@ -158,8 +158,12 @@ public class ContainerTransmutationTablet extends ContainerEE implements IElemen
{
scrollBarPosition = updatedValue;
}
else if (valueType == 4)
{
sortOrder = updatedValue;
}
if (valueType >= 0 && valueType <= 3)
if (valueType >= 0 && valueType <= 4)
{
updateInventory();
}
@ -203,9 +207,38 @@ public class ContainerTransmutationTablet extends ContainerEE implements IElemen
int adjustedStartIndex = (int) ((scrollBarPosition / 187f) * filteredList.size());
if (sortOption >= 0 && sortOption < Comparators.itemComparators.length)
if (sortOption == 0)
{
Collections.sort(filteredList, Comparators.itemComparators[sortOption]);
if (sortOrder == 0)
{
Collections.sort(filteredList, Comparators.displayNameComparator);
}
else
{
Collections.sort(filteredList, Comparators.reverseDisplayNameComparator);
}
}
else if (sortOption == 1)
{
if (sortOrder == 0)
{
Collections.sort(filteredList, Comparators.energyValueItemStackComparator);
}
else
{
Collections.sort(filteredList, Comparators.reverseEnergyValueComparator);
}
}
else if (sortOption == 2)
{
if (sortOrder == 0)
{
Collections.sort(filteredList, Comparators.idComparator);
}
else
{
Collections.sort(filteredList, Comparators.reverseIdComparator);
}
}
if (filteredList.size() <= 30)
@ -408,16 +441,23 @@ public class ContainerTransmutationTablet extends ContainerEE implements IElemen
}
}
}
else if (elementName.equals("sortOption"))
else if (elementName.equals("sortOrder"))
{
if (sortOrder == 0)
{
sortOrder = 1;
}
else if (sortOrder == 1)
{
sortOrder = 0;
}
}
for (Object crafter : this.crafters)
{
ICrafting iCrafting = (ICrafting) crafter;
iCrafting.sendProgressBarUpdate(this, 2, sortOption);
iCrafting.sendProgressBarUpdate(this, 3, sortOrder);
iCrafting.sendProgressBarUpdate(this, 4, sortOrder);
}
}

View file

@ -1,7 +1,7 @@
package com.pahimar.ee3.inventory;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.reference.Names;
import com.pahimar.ee3.util.ItemHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@ -23,7 +23,7 @@ public class InventoryAlchemicalTome implements IInventory
}
else
{
this.knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
this.knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
}
inventory = knownTransmutations.toArray(inventory);
}

View file

@ -1,7 +1,7 @@
package com.pahimar.ee3.inventory;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.reference.Names;
import com.pahimar.ee3.util.ItemHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@ -22,7 +22,7 @@ public class InventoryTransmutationTablet implements IInventory
{
inventory = new ItemStack[30];
this.knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
this.knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
if (knownTransmutations != null)
{
this.knownTransmutations.addAll(knownTransmutations);

View file

@ -7,8 +7,8 @@ import com.pahimar.ee3.api.AbilityRegistryProxy;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.exchange.OreStack;
import com.pahimar.ee3.exchange.WrappedStack;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.reference.Files;
import com.pahimar.ee3.util.ItemHelper;
import com.pahimar.ee3.util.LogHelper;
import com.pahimar.ee3.util.SerializationHelper;
import net.minecraft.item.ItemStack;
@ -30,7 +30,7 @@ public class AbilityRegistry implements JsonSerializer<AbilityRegistry>, JsonDes
private boolean hasBeenModified;
private Set<WrappedStack> notLearnableSet;
private Set<WrappedStack> notRecoverableSet;
private SortedSet<ItemStack> allLearnableItemStacks = new TreeSet<ItemStack>(ItemHelper.idComparator);
private SortedSet<ItemStack> allLearnableItemStacks = new TreeSet<ItemStack>(Comparators.idComparator);
private AbilityRegistry()
{
@ -58,7 +58,7 @@ public class AbilityRegistry implements JsonSerializer<AbilityRegistry>, JsonDes
public void discoverAllLearnableItemStacks()
{
this.allLearnableItemStacks = new TreeSet<ItemStack>(ItemHelper.idComparator);
this.allLearnableItemStacks = new TreeSet<ItemStack>(Comparators.idComparator);
for (WrappedStack wrappedStack : EnergyValueRegistry.getInstance().getStackValueMap().keySet())
{
if (isLearnable(wrappedStack) && EnergyValueRegistry.getInstance().getEnergyValue(wrappedStack) != null)

View file

@ -4,6 +4,7 @@ import com.google.gson.*;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.pahimar.ee3.exchange.JsonItemStack;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.reference.Names;
import com.pahimar.ee3.util.FilterUtils;
import com.pahimar.ee3.util.INBTTaggable;
@ -26,7 +27,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
public TransmutationKnowledge()
{
this(new TreeSet<ItemStack>(ItemHelper.idComparator));
this(new TreeSet<ItemStack>(Comparators.idComparator));
}
public TransmutationKnowledge(Collection<ItemStack> knownTransmutations)
@ -37,7 +38,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
public TransmutationKnowledge(Collection<ItemStack> knownTransmutations, boolean canTransmuteEverything)
{
this.canTransmuteEverything = canTransmuteEverything;
this.knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
this.knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
this.knownTransmutations.addAll(knownTransmutations);
hasBeenModified = false;
}
@ -50,7 +51,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
public TransmutationKnowledge(NBTTagCompound nbtTagCompound)
{
canTransmuteEverything = false;
this.knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
this.knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
this.readFromNBT(nbtTagCompound);
hasBeenModified = false;
}
@ -150,7 +151,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
if (nbtTagCompound.hasKey(Names.NBT.ITEM_TRANSMUTATION_KNOWLEDGE))
{
NBTTagList tagList = nbtTagCompound.getTagList(Names.NBT.ITEM_TRANSMUTATION_KNOWLEDGE, 10);
knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
for (int i = 0; i < tagList.tagCount(); ++i)
{
NBTTagCompound tagCompound = tagList.getCompoundTagAt(i);
@ -160,7 +161,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
}
else
{
knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
}
if (nbtTagCompound.hasKey(Names.NBT.CAN_TRANSMUTE_ANYTHING))
@ -174,7 +175,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
}
else
{
knownTransmutations = new TreeSet<ItemStack>(ItemHelper.idComparator);
knownTransmutations = new TreeSet<ItemStack>(Comparators.idComparator);
canTransmuteEverything = false;
}
}
@ -245,7 +246,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer<Tran
JsonObject jsonObject = (JsonObject) json;
boolean canTransmuteEverything;
Set<ItemStack> itemStacks = new TreeSet<ItemStack>(ItemHelper.idComparator);
Set<ItemStack> itemStacks = new TreeSet<ItemStack>(Comparators.idComparator);
if (jsonObject.has("canTransmuteEverything") && jsonObject.get("canTransmuteEverything").isJsonPrimitive())
{

View file

@ -1,13 +1,14 @@
package com.pahimar.ee3.reference;
import com.pahimar.ee3.util.ItemHelper;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.util.Comparator;
public class Comparators
{
public static final Comparator[] itemComparators = {ItemHelper.displayNameComparator, ItemHelper.energyValueItemStackComparator, ItemHelper.idComparator};
public static Comparator<String> stringComparator = new Comparator<String>()
{
@Override
@ -16,4 +17,163 @@ public class Comparators
return string1.compareToIgnoreCase(string2);
}
};
public static Comparator<ItemStack> idComparator = new Comparator<ItemStack>()
{
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
// Sort on itemID
if (Item.getIdFromItem(itemStack1.getItem()) - Item.getIdFromItem(itemStack2.getItem()) == 0)
{
// Sort on item
if (itemStack1.getItem() == itemStack2.getItem())
{
// Then sort on meta
if ((itemStack1.getItemDamage() == itemStack2.getItemDamage()) || itemStack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || itemStack2.getItemDamage() == OreDictionary.WILDCARD_VALUE)
{
// Then sort on NBT
if (itemStack1.hasTagCompound() && itemStack2.hasTagCompound())
{
// Then sort on stack size
if (ItemStack.areItemStackTagsEqual(itemStack1, itemStack2))
{
return (itemStack1.stackSize - itemStack2.stackSize);
}
else
{
return (itemStack1.getTagCompound().hashCode() - itemStack2.getTagCompound().hashCode());
}
}
else if (!(itemStack1.hasTagCompound()) && itemStack2.hasTagCompound())
{
return -1;
}
else if (itemStack1.hasTagCompound() && !(itemStack2.hasTagCompound()))
{
return 1;
}
else
{
return (itemStack1.stackSize - itemStack2.stackSize);
}
}
else
{
return (itemStack1.getItemDamage() - itemStack2.getItemDamage());
}
}
else
{
return itemStack1.getItem().getUnlocalizedName(itemStack1).compareToIgnoreCase(itemStack2.getItem().getUnlocalizedName(itemStack2));
}
}
else
{
return Item.getIdFromItem(itemStack1.getItem()) - Item.getIdFromItem(itemStack2.getItem());
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
public static Comparator<ItemStack> reverseIdComparator = new Comparator<ItemStack>()
{
@Override
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
return idComparator.compare(itemStack1, itemStack2) * -1;
}
};
public static Comparator<ItemStack> displayNameComparator = new Comparator<ItemStack>()
{
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
if (itemStack1.getDisplayName().equalsIgnoreCase(itemStack2.getDisplayName()))
{
return idComparator.compare(itemStack1, itemStack2);
}
else
{
return itemStack1.getDisplayName().compareToIgnoreCase(itemStack2.getDisplayName());
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
public static Comparator<ItemStack> reverseDisplayNameComparator = new Comparator<ItemStack>()
{
@Override
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
return displayNameComparator.compare(itemStack1, itemStack2) * -1;
}
};
public static Comparator<ItemStack> energyValueItemStackComparator = new Comparator<ItemStack>()
{
@Override
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
if (EnergyValueRegistry.getInstance().hasEnergyValue(itemStack1) && EnergyValueRegistry.getInstance().hasEnergyValue(itemStack2))
{
return Float.compare(EnergyValueRegistry.getInstance().getEnergyValue(itemStack1).getValue(), EnergyValueRegistry.getInstance().getEnergyValue(itemStack2).getValue());
}
else
{
return idComparator.compare(itemStack1, itemStack2);
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
public static Comparator<ItemStack> reverseEnergyValueComparator = new Comparator<ItemStack>()
{
@Override
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
return energyValueItemStackComparator.compare(itemStack1, itemStack2) * -1;
}
};
}

View file

@ -2,6 +2,7 @@ package com.pahimar.ee3.util;
import com.pahimar.ee3.api.EnergyValue;
import com.pahimar.ee3.api.EnergyValueRegistryProxy;
import com.pahimar.ee3.reference.Comparators;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
@ -11,7 +12,7 @@ public class FilterUtils
{
public static Set<ItemStack> filterForItemBlock(Set<ItemStack> unfilteredItemStackSet)
{
return filterForItemBlock(unfilteredItemStackSet, ItemHelper.idComparator);
return filterForItemBlock(unfilteredItemStackSet, Comparators.idComparator);
}
public static Set<ItemStack> filterForItemBlock(Set<ItemStack> unfilteredItemStackSet, Comparator comparator)
@ -31,7 +32,7 @@ public class FilterUtils
public static Set<ItemStack> filterByNameStartsWith(Set<ItemStack> unfilteredItemStackSet, String filterString)
{
return filterByNameStartsWith(unfilteredItemStackSet, filterString, ItemHelper.idComparator);
return filterByNameStartsWith(unfilteredItemStackSet, filterString, Comparators.idComparator);
}
public static Set<ItemStack> filterByNameStartsWith(Set<ItemStack> unfilteredItemStackSet, String filterString, Comparator comparator)

View file

@ -1,13 +1,11 @@
package com.pahimar.ee3.util;
import com.pahimar.ee3.exchange.EnergyValueRegistry;
import com.pahimar.ee3.reference.Comparators;
import com.pahimar.ee3.reference.Names;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.util.Comparator;
import java.util.UUID;
public class ItemHelper
@ -19,138 +17,6 @@ public class ItemHelper
return clonedItemStack;
}
public static Comparator<ItemStack> idComparator = new Comparator<ItemStack>()
{
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
// Sort on itemID
if (Item.getIdFromItem(itemStack1.getItem()) - Item.getIdFromItem(itemStack2.getItem()) == 0)
{
// Sort on item
if (itemStack1.getItem() == itemStack2.getItem())
{
// Then sort on meta
if ((itemStack1.getItemDamage() == itemStack2.getItemDamage()) || itemStack1.getItemDamage() == OreDictionary.WILDCARD_VALUE || itemStack2.getItemDamage() == OreDictionary.WILDCARD_VALUE)
{
// Then sort on NBT
if (itemStack1.hasTagCompound() && itemStack2.hasTagCompound())
{
// Then sort on stack size
if (ItemStack.areItemStackTagsEqual(itemStack1, itemStack2))
{
return (itemStack1.stackSize - itemStack2.stackSize);
}
else
{
return (itemStack1.getTagCompound().hashCode() - itemStack2.getTagCompound().hashCode());
}
}
else if (!(itemStack1.hasTagCompound()) && itemStack2.hasTagCompound())
{
return -1;
}
else if (itemStack1.hasTagCompound() && !(itemStack2.hasTagCompound()))
{
return 1;
}
else
{
return (itemStack1.stackSize - itemStack2.stackSize);
}
}
else
{
return (itemStack1.getItemDamage() - itemStack2.getItemDamage());
}
}
else
{
return itemStack1.getItem().getUnlocalizedName(itemStack1).compareToIgnoreCase(itemStack2.getItem().getUnlocalizedName(itemStack2));
}
}
else
{
return Item.getIdFromItem(itemStack1.getItem()) - Item.getIdFromItem(itemStack2.getItem());
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
public static Comparator<ItemStack> displayNameComparator = new Comparator<ItemStack>()
{
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
if (itemStack1.getDisplayName().equalsIgnoreCase(itemStack2.getDisplayName()))
{
return idComparator.compare(itemStack1, itemStack2);
}
else
{
return itemStack1.getDisplayName().compareToIgnoreCase(itemStack2.getDisplayName());
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
public static Comparator<ItemStack> energyValueItemStackComparator = new Comparator<ItemStack>()
{
@Override
public int compare(ItemStack itemStack1, ItemStack itemStack2)
{
if (itemStack1 != null && itemStack2 != null)
{
if (EnergyValueRegistry.getInstance().hasEnergyValue(itemStack1) && EnergyValueRegistry.getInstance().hasEnergyValue(itemStack2))
{
return Float.compare(EnergyValueRegistry.getInstance().getEnergyValue(itemStack1).getValue(), EnergyValueRegistry.getInstance().getEnergyValue(itemStack2).getValue());
}
else
{
return idComparator.compare(itemStack1, itemStack2);
}
}
else if (itemStack1 != null)
{
return -1;
}
else if (itemStack2 != null)
{
return 1;
}
else
{
return 0;
}
}
};
/**
* Compares two ItemStacks for equality, testing itemID, metaData, stackSize, and their NBTTagCompounds (if they are
* present)
@ -161,7 +27,7 @@ public class ItemHelper
*/
public static boolean equals(ItemStack first, ItemStack second)
{
return (idComparator.compare(first, second) == 0);
return (Comparators.idComparator.compare(first, second) == 0);
}
public static boolean equalsIgnoreStackSize(ItemStack itemStack1, ItemStack itemStack2)
@ -200,7 +66,7 @@ public class ItemHelper
public static int compare(ItemStack itemStack1, ItemStack itemStack2)
{
return idComparator.compare(itemStack1, itemStack2);
return Comparators.idComparator.compare(itemStack1, itemStack2);
}
public static String toString(ItemStack itemStack)