package joshie.progression.handlers;
import com.google.common.collect.HashMultimap;
import joshie.progression.Progression;
import joshie.progression.api.ProgressionAPI;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.api.event.ActionEvent;
import joshie.progression.crafting.ActionType;
import joshie.progression.crafting.Crafter;
import joshie.progression.crafting.CraftingRegistry;
import joshie.progression.gui.core.GuiCore;
import joshie.progression.helpers.*;
import joshie.progression.lib.GuiIDs;
import joshie.progression.network.PacketHandler;
import joshie.progression.network.PacketSyncUsernameCache;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.client.event.GuiScreenEvent.DrawScreenEvent;
import net.minecraftforge.common.UsernameCache;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Set;
import static joshie.progression.gui.core.GuiList.*;
public class ProgressionEvents {
public static Checker checker = new Checker();
public static class Checker {
public boolean isRunnable(GuiScreen screen) {
return screen instanceof GuiCore;
}
}
@SubscribeEvent
public void onPlayerLoggedIn(PlayerLoggedInEvent event) {
RemappingHandler.onPlayerConnect((EntityPlayerMP) event.player);
//Send to everybody
PacketHandler.sendToEveryone(new PacketSyncUsernameCache(UsernameCache.getMap()));
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onGuiPost(DrawScreenEvent.Pre event) {
if (checker.isRunnable(event.getGui())) {
LAST.clear();
}
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onGuiPost(DrawScreenEvent.Post event) {
if (checker.isRunnable(event.getGui())) {
LAST.run();
}
}
@SubscribeEvent
public void onAttemptToObtainItem(ActionEvent event) {
if (event.stack == null) return;
if (event.world != null) {
World world = event.world;
Crafter crafter = event.player != null ? CraftingRegistry.get(world.isRemote).getCrafterFromPlayer(event.player) : CraftingRegistry.get(world.isRemote).getCrafterFromTile(event.tile);
if (crafter.canDoAnything()) return;
if (!crafter.canUseItemWithAction(world, event.type, event.stack)) {
event.setCanceled(true);
}
}
}
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onItemTooltipEvent(final ItemTooltipEvent event) {
if (event.getItemStack() == null || event.getItemStack().getItem() == null || event.getEntityPlayer() == null || CraftingRegistry.get(event.getEntityPlayer().worldObj.isRemote) == null) return;
try {
//No real way to cache correctly, without creating tons of objects
HashMultimap<ActionType, ICriteria> requirements = HashMultimap.create();
for (ActionType type: ActionType.values()) {
Set<ICriteria> required = CraftingRegistry.get(event.getEntityPlayer().worldObj.isRemote).getRequirements(type, event.getItemStack());
if (required.size() == 0) continue;;
Set<ICriteria> completed = ProgressionAPI.player.getCompletedCriteriaList(PlayerHelper.getClientUUID(), true);
if (completed.contains(required)) continue; //Don't add this as a requirement if it's already completed
requirements.get(type).addAll(required);
}
//Option 1
if (requirements.size() >= 1) {
event.getToolTip().add(TextFormatting.AQUA + "Actions Currently Locked");
if (GuiScreen.isShiftKeyDown()) {
for (ActionType type : requirements.keySet()) {
event.getToolTip().add(TextFormatting.WHITE + "• " + type.getDisplayName());
event.getToolTip().add(TextFormatting.GOLD + " " + TextFormatting.ITALIC + "Criteria Required");
StringBuilder builder = new StringBuilder();
boolean first = true;
for (ICriteria criteria : requirements.get(type)) {
if (first) {
first = false;
builder.append(" " + criteria.getLocalisedName());
} else builder.append(", " + criteria.getLocalisedName());
}
String[] split = SplitHelper.splitStringEvery(builder.toString(), 45);
for (String s : split) {
event.getToolTip().add(s);
}
}
} else {
event.getToolTip().add("Hold" + TextFormatting.BLUE + " " + TextFormatting.ITALIC + "Shift" + TextFormatting.RESET + " to see details");
event.getToolTip().add("Hold" + TextFormatting.GOLD + " " + TextFormatting.ITALIC + "Ctrl" + TextFormatting.RESET + " to open criteria");
if (GuiScreen.isCtrlKeyDown()) {
for (ICriteria c: requirements.values()) {
MCClientHelper.FORCE_EDIT = false;
CORE.setEditor(CRITERIA_EDITOR);
CRITERIA_EDITOR.set(c);
event.getEntityPlayer().openGui(Progression.instance, GuiIDs.EDITOR, event.getEntityPlayer().worldObj, 0, 0, 0);
break;
}
}
}
}
} catch (Exception e) { e.printStackTrace(); }
}
public static boolean isEventCancelled(EntityPlayer player, ActionType usageAction, ItemStack usageStack, ActionType craftingAction, ItemStack craftingStack) {
if (!CraftingHelper.canPerformAction(usageAction, player, usageStack)) {
return true;
} else {
if (!CraftingHelper.canPerformAction(craftingAction, player, craftingStack)) {
return true;
}
}
return false;
}
}