package de.take_weiland.mods.commons.util;
import com.google.common.collect.Multimap;
import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import de.take_weiland.mods.commons.Unsafe;
import de.take_weiland.mods.commons.reflect.*;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureObject;
import net.minecraft.entity.EntityTracker;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.packet.Packet;
import net.minecraft.util.IntHashMap;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Timer;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import static de.take_weiland.mods.commons.asm.MCPNames.*;
/**
* Accessor interface for various private fields and methods around the Minecraft code.<br />
* If the field/method to access is static, the instance parameter is ignored, null can be passed.<br />
*
* @see de.take_weiland.mods.commons.reflect.SCReflection
*/
public interface SCReflector {
SCReflector instance = SCReflection.createAccessor(SCReflector.class);
/**
* For cleaner code use {@link de.take_weiland.mods.commons.nbt.NBT#asList(net.minecraft.nbt.NBTTagList)}
*/
@Unsafe
@Getter(field = F_TAG_LIST, srg = true)
<T extends NBTBase> List<T> getWrappedList(NBTTagList list);
@Unsafe
@Getter(field = F_TAG_MAP, srg = true)
Map<String, NBTBase> getWrappedMap(NBTTagCompound nbt);
@SideOnly(Side.CLIENT)
@Getter(field = F_FOV_MODIFIER_HAND, srg = true)
float getFovHand(EntityRenderer e);
@SideOnly(Side.CLIENT)
@Setter(field = F_FOV_MODIFIER_HAND, srg = true)
void setFovHand(EntityRenderer e, float fov);
@SideOnly(Side.CLIENT)
@Getter(field = F_FOV_MODIFIER_HAND_PREV, srg = true)
float getFovHandPrev(EntityRenderer e);
@SideOnly(Side.CLIENT)
@Setter(field = F_FOV_MODIFIER_HAND_PREV, srg = true)
void setFovHandPrev(EntityRenderer e, float fovPrev);
@SideOnly(Side.CLIENT)
@Getter(field = F_TIMER, srg = true)
Timer getTimer(Minecraft mc);
@Getter(field = F_TRACKED_ENTITY_IDS, srg = true)
IntHashMap getTrackerMap(EntityTracker tracker);
@SideOnly(Side.CLIENT)
@Getter(field = F_MAP_TEXTURE_OBJECTS, srg = true)
Map<ResourceLocation, TextureObject> getTexturesMap(TextureManager manager);
@Unsafe
@Getter(field = F_PACKET_CLASS_TO_ID_MAP, srg = true, target = Packet.class)
Map<Class<? extends Packet>, Integer> getClassToIdMap();
@SideOnly(Side.CLIENT)
@Getter(field = F_BUTTON_LIST, srg = true)
List<GuiButton> getButtonList(GuiScreen screen);
@Getter(field = F_ITEM_DAMAGE, srg = true)
int getRawDamage(ItemStack stack);
@Getter(field = F_UNLOCALIZED_NAME_BLOCK, srg = true)
String getRawUnlocalizedName(Block block);
@Invoke(method = M_SET_HAS_SUBTYPES, srg = true)
Item setHasSubtypes(Item item, boolean value);
@Getter(field = F_ICON_STRING, srg = true)
String getRawIconName(Item item);
@Getter(field = F_UNLOCALIZED_NAME_ITEM, srg = true)
String getRawUnlocalizedName(Item item);
@Getter(field = F_TEXTURE_NAME_BLOCK, srg = true)
String getRawIconName(Block block);
@SideOnly(Side.CLIENT)
@Invoke(method = M_GET_ICON_STRING, srg = true)
String getIconName(Item item);
@SideOnly(Side.CLIENT)
@Invoke(method = M_GET_TEXTURE_NAME, srg = true)
String getIconName(Block block);
@SideOnly(Side.CLIENT)
@Invoke(method = M_ACTION_PERFORMED, srg = true)
void actionPerformed(GuiScreen screen, GuiButton button);
@SideOnly(Side.CLIENT)
@Getter(field = F_Z_LEVEL, srg = true)
float getZLevel(Gui gui);
@Invoke(method = M_ADD_SLOT_TO_CONTAINER, srg = true)
Slot addSlot(Container container, Slot slot);
@Invoke(method = M_MERGE_ITEM_STACK, srg = true)
boolean mergeItemStack(Container container, ItemStack stack, int slotStart, int slotEnd, boolean direction);
@Getter(field = F_CRAFTERS, srg = true)
List<ICrafting> getCrafters(Container container);
@Invoke(method = M_NBT_WRITE, srg = true)
void write(NBTBase nbt, DataOutput out) throws IOException;
@Invoke(method = M_NBT_LOAD, srg = true)
void load(NBTBase nbt, DataInput in, int depth) throws IOException;
@Getter(field = F_ITEM_DAMAGE, srg = true)
int getRawItemDamage(ItemStack stack);
@Setter(field = F_ITEM_DAMAGE, srg = true)
void setRawDamage(ItemStack stack, int damage);
@Unsafe
@Getter(field = "clientPacketHandlers")
Multimap<String, IPacketHandler> getClientPacketHandlers(NetworkRegistry instance);
@Unsafe
@Getter(field = "serverPacketHandlers")
Multimap<String, IPacketHandler> getServerPacketHandlers(NetworkRegistry instance);
@Unsafe
@Getter(field = "universalPacketHandlers")
Multimap<String, IPacketHandler> getUniversalPacketHandlers(NetworkRegistry instance);
@Unsafe
@Construct
String createStringShared(char[] arr, boolean dummy);
}