package joshie.progression;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.crafting.Crafter;
import joshie.progression.crafting.CraftingRegistry;
import joshie.progression.crafting.CraftingUnclaimed;
import joshie.progression.handlers.APICache;
import joshie.progression.helpers.MCClientHelper;
import joshie.progression.helpers.PlayerHelper;
import joshie.progression.lib.GuiIDs;
import joshie.progression.network.PacketClaimed;
import joshie.progression.network.PacketHandler;
import joshie.progression.player.PlayerTracker;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
import java.util.UUID;
public class ItemProgression extends Item {
private static TIntObjectMap<ItemMeta> map;
public static ItemStack getStackFromMeta(ItemMeta meta) {
return new ItemStack(Progression.item, 1, meta.ordinal());
}
public static ItemMeta getMetaFromStack(ItemStack stack) {
//If we haven't setup the data yet, let's do it now
if (map == null) {
map = new TIntObjectHashMap<ItemMeta>();
for (ItemMeta meta: ItemMeta.values()) {
map.put(meta.ordinal(), meta);
}
}
return map.get(Math.max(0, Math.min(map.size() - 1, stack.getItemDamage())));
}
public enum ItemMeta {
criteria, claim, book, edit, booleanValue, clearInventory, clearOrReceiveOrBlockCriteria, fallResistance,
ifCriteriaCompleted, ifDayOrNight, ifHasAchievement, ifHasBoolean, ifHasPoints, ifIsAtCoordinates,
ifIsBiome, ifRandom, onChangeDimension, onLogin, onReceivedAchiement, onReceivedBoolean,
onReceivedPoints, onSecond, onSentMessage, points, speed, showTab, showLayer, sun, moon, stepAssist,
attackPlayer, onGUIChange, eat, click, breaking, craft, kill, completed, openBook;
}
public static CreativeTabs tab;
public ItemProgression() {
final Item item = this;
tab = new CreativeTabs("progression") {
private ItemStack stack = new ItemStack(item, 1, ItemMeta.book.ordinal());
@Override
public String getTranslatedTabLabel() {
return "Progression";
}
@Override
public boolean hasSearchBar() {
return true;
}
@Override
public Item getTabIconItem() {
return item;
}
@Override
public int getIconItemDamage() {
return ItemMeta.book.ordinal();
}
};
setHasSubtypes(true);
setMaxStackSize(1);
setCreativeTab(tab);
}
public static ICriteria getCriteriaFromStack(ItemStack stack, boolean isClient) {
if (!stack.hasTagCompound()) return null;
if (stack.getItemDamage() != ItemMeta.criteria.ordinal()) return null;
String uuid = stack.getTagCompound().getString("Criteria");
if (uuid.matches("[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}")) {
return APICache.getCache(isClient).getCriteria(UUID.fromString(uuid));
} else return null;
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
if (stack.getItemDamage() == ItemMeta.criteria.ordinal()) {
ICriteria criteria = getCriteriaFromStack(stack, FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT);
return criteria == null ? "BROKEN ITEM" : criteria.getLocalisedName();
} else return Progression.translate("item." + getMetaFromStack(stack).name());
}
@Override
public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
if (stack.getItemDamage() == ItemMeta.book.ordinal() || stack.getItemDamage() == ItemMeta.edit.ordinal()) {
int guiid = player.isSneaking() ? GuiIDs.GROUP : GuiIDs.EDITOR;
if (world.isRemote) {
if (stack.getItemDamage() == ItemMeta.edit.ordinal()) MCClientHelper.FORCE_EDIT = true;
else MCClientHelper.FORCE_EDIT = false;
}
player.openGui(Progression.instance, guiid, null, 0, 0, 0);
return EnumActionResult.SUCCESS;
}
if (world.isRemote || player == null || stack == null) return EnumActionResult.PASS;
if (stack.getItemDamage() == ItemMeta.claim.ordinal()) {
TileEntity tile = world.getTileEntity(pos);
if (tile != null) {
Crafter crafter = CraftingRegistry.get(world.isRemote).getCrafterFromTile(tile);
if (crafter == CraftingUnclaimed.INSTANCE) {
PlayerTracker.setTileOwner(tile, PlayerHelper.getUUIDForPlayer(player));
PacketHandler.sendToClient(new PacketClaimed(pos.getX(), pos.getY(), pos.getZ()), (EntityPlayerMP) player);
return EnumActionResult.SUCCESS;
}
}
} else {
ICriteria criteria = getCriteriaFromStack(stack, world.isRemote);
if (criteria != null) {
Result completed = PlayerTracker.getServerPlayer(PlayerHelper.getUUIDForPlayer(player)).getMappings().forceComplete(criteria);
if (!player.capabilities.isCreativeMode && completed == Result.ALLOW) {
stack.stackSize--;
return EnumActionResult.SUCCESS;
}
}
}
return EnumActionResult.PASS;
}
@Override
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) {
if (stack.getItemDamage() == ItemMeta.book.ordinal() || stack.getItemDamage() == ItemMeta.edit.ordinal()) {
int guiid = player.isSneaking() ? GuiIDs.GROUP : GuiIDs.EDITOR;
if (world.isRemote) {
if (stack.getItemDamage() == ItemMeta.edit.ordinal()) MCClientHelper.FORCE_EDIT = true;
else MCClientHelper.FORCE_EDIT = false;
}
player.openGui(Progression.instance, guiid, null, 0, 0, 0);
return new ActionResult(EnumActionResult.SUCCESS, stack);
} else if (!world.isRemote) {
ICriteria criteria = getCriteriaFromStack(stack, world.isRemote);
if (criteria != null) {
Result completed = PlayerTracker.getServerPlayer(PlayerHelper.getUUIDForPlayer(player)).getMappings().forceComplete(criteria);
if (!player.capabilities.isCreativeMode && completed == Result.ALLOW) {
stack.stackSize--;
return new ActionResult(EnumActionResult.SUCCESS, stack);
}
}
}
return new ActionResult(EnumActionResult.PASS, stack);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List<String> list, boolean debug) {
if (stack.getItemDamage() == ItemMeta.claim.ordinal()) {
list.add("Right click me on tiles");
list.add("to claim them as yours");
} else if (stack.getItemDamage() == ItemMeta.book.ordinal() || stack.getItemDamage() == ItemMeta.edit.ordinal()) {
list.add(TextFormatting.ITALIC + "Hold Shift to Edit Team");
if (player.capabilities.isCreativeMode || stack.getItemDamage() == ItemMeta.edit.ordinal()) {
list.add("");
list.add("Right click me to open");
list.add("'Progression editor'");
}
}
}
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs tab, List<ItemStack> list) {
list.add(new ItemStack(item, 1, ItemMeta.book.ordinal()));
list.add(new ItemStack(item, 1, ItemMeta.edit.ordinal()));
list.add(new ItemStack(item, 1, ItemMeta.claim.ordinal()));
if (APICache.getClientCache() != null) {
for (ICriteria c : APICache.getClientCache().getCriteriaSet()) {
ItemStack stack = new ItemStack(item);
stack.setTagCompound(new NBTTagCompound());
stack.getTagCompound().setString("Criteria", c.getUniqueID().toString());
list.add(stack);
}
}
}
}