| package ic2.api.crops; | 
 |  | 
 | import net.minecraft.client.renderer.texture.IconRegister; | 
 | import net.minecraft.entity.Entity; | 
 | import net.minecraft.entity.EntityLivingBase; | 
 | import net.minecraft.entity.player.EntityPlayer; | 
 | import net.minecraft.item.ItemStack; | 
 | import net.minecraft.util.Icon; | 
 |  | 
 | import cpw.mods.fml.relauncher.Side; | 
 | import cpw.mods.fml.relauncher.SideOnly; | 
 |  | 
 | /** | 
 |  * Base agriculture crop. | 
 |  *  | 
 |  * Any crop extending this can be registered using registerCrop to be added into the game. | 
 |  */ | 
 | public abstract class CropCard | 
 | { | 
 | 	/** | 
 | 	 * Plant name. Will be displayed to the player. | 
 | 	 *  | 
 | 	 * @return Plant name | 
 | 	 */ | 
 | 	public abstract String name(); | 
 |  | 
 | 	/** | 
 | 	 * Your name here, will be shown in "Discovered by:" when analyzing seeds. | 
 | 	 *  | 
 | 	 * @return Your name | 
 | 	 */ | 
 | 	public String discoveredBy() {return "Alblaka";} | 
 |  | 
 | 	/** | 
 | 	 * Description of your plant. Keep it short, a few characters per line for up to two lines. | 
 | 	 * Default is showing attributes of your plant, 2 per line. | 
 | 	 *  | 
 | 	 * @param i line to get, starting from 0 | 
 | 	 * @return The line | 
 | 	 */ | 
 | 	public String desc(int i) | 
 | 	{ | 
 | 		String[] att = attributes(); | 
 | 		if (att == null || att.length==0) return ""; | 
 | 		if (i == 0) | 
 | 		{ | 
 | 			String s = att[0]; | 
 | 			if (att.length >= 2) | 
 | 			{ | 
 | 				s+=", "+att[1]; | 
 | 				if (att.length >= 3) s+=","; | 
 | 			} | 
 | 			return s; | 
 | 		} | 
 | 		else | 
 | 		{ | 
 | 			if (att.length < 3) return ""; | 
 | 			String s = att[2]; | 
 | 			if (att.length >= 4) s+=", "+att[3]; | 
 | 			return s; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Tier of the plant. Ranges from 1 to 16, 0 is Weed. | 
 | 	 * Valuable and powerful crops have higher tiers, useless and weak ones have lower tiers. | 
 | 	 *  | 
 | 	 * @return Tier | 
 | 	 */ | 
 | 	public abstract int tier(); | 
 |  | 
 | 	/** | 
 | 	 * Describe the plant through a set of stats, influencing breeding. | 
 | 	 * Plants sharing stats and attributes will tend to cross-breed more often. | 
 | 	 *  | 
 | 	 * Stats: | 
 | 	 * - 0: Chemistry (Industrial uses based on chemical plant components) | 
 | 	 * - 1: Consumable (Food, potion ingredients, stuff meant to be eaten or similarly used) | 
 | 	 * - 2: Defensive (Plants with defense capabilities (damaging, explosive, chemical) or special abilities in general) | 
 | 	 * - 3: Colorful (How colorful/aesthetically/beautiful is the plant, like dye-plants or plants without actual effects) | 
 | 	 * - 4: Weed (Is this plant weed-like and rather unwanted/quick-spreading? Rare super-breed plants should have low values here) | 
 | 	 *  | 
 | 	 * @param n index of the requested stat | 
 | 	 * @return The requested value of the stats | 
 | 	 */ | 
 | 	public abstract int stat(int n); | 
 |  | 
 | 	/** | 
 | 	 * Additional attributes of the plant, also influencing breeding. | 
 | 	 * Plants sharing stats and attributes will tend to cross-breed more often. | 
 | 	 *  | 
 | 	 * @return Attributes as an array of strings | 
 | 	 */ | 
 | 	public abstract String[] attributes(); | 
 |  | 
 | 	/** | 
 | 	 * Determine the max crop size. | 
 | 	 *  | 
 | 	 * Currently only used for texture allocation. | 
 | 	 */ | 
 | 	public abstract int maxSize(); | 
 |  | 
 | 	/** | 
 | 	 * Instantiate your Icons here. | 
 | 	 *  | 
 | 	 * This method will get called by IC2, don't call it yourself. | 
 | 	 */ | 
 | 	@SideOnly(Side.CLIENT) | 
 | 	public void registerSprites(IconRegister iconRegister) { | 
 | 		textures = new Icon[maxSize()]; | 
 |  | 
 | 		for (int i = 1; i <= textures.length; i++) { | 
 | 			textures[i-1] = iconRegister.registerIcon("ic2:crop/blockCrop."+name()+"."+i); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Sprite the crop is meant to be rendered with. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return 0-255, representing the sprite index on the crop's spritesheet. | 
 | 	 */ | 
 | 	@SideOnly(Side.CLIENT) | 
 | 	public Icon getSprite(ICropTile crop) { | 
 | 		if (crop.getSize() <= 0 || crop.getSize() > textures.length) return null; | 
 |  | 
 | 		return textures[crop.getSize() - 1]; | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Get the crop's spritesheet. | 
 | 	 * Per default crops_0.png of ic2-sprites | 
 | 	 * @return Texture file path | 
 | 	 */ | 
 | 	public String getTextureFile() { | 
 | 		return "/ic2/sprites/crops_0.png"; | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Amount of growth points needed to increase the plant's size. | 
 | 	 * Default is 200 * tier. | 
 | 	 */ | 
 | 	public int growthDuration(ICropTile crop) | 
 | 	{ | 
 | 		return tier()*200; | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Check whether the plant can grow further. | 
 | 	 *  | 
 | 	 * Consider: | 
 | 	 * - Humidity, nutrients and air quality | 
 | 	 * - Current size | 
 | 	 * - Light level | 
 | 	 * - Special biomes or conditions, accessible through crop.worldObj | 
 | 	 *  | 
 | 	 * This method will be called upon empty upgraded crops to check whether a neighboring plant can cross onto it! Don't check if the size is greater than 0 and if the ID is real. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Whether the crop can grow | 
 | 	 */ | 
 | 	public abstract boolean canGrow(ICropTile crop); | 
 |  | 
 | 	/** | 
 | 	 * Calculate the influence for the plant to grow based on humidity, nutrients and air. | 
 | 	 * Normal behavior is rating the three stats "normal", with each of them ranging from 0-30. | 
 | 	 * Basic rule: Assume everything returns 10. All together must equal 30. Add the factors to your likings, for example (humidity*0.7)+(nutrients*0.9)+(air*1.4) | 
 | 	 *  | 
 | 	 * Default is humidity + nutrients + air (no factors). | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @param humidity ground humidity, influenced by hydration | 
 | 	 * @param nutrients nutrient quality in ground, based on fertilizers | 
 | 	 * @param air air quality, influences by open gardens and less crops surrounding this one | 
 | 	 * @return 0-30 | 
 | 	 */ | 
 | 	public int weightInfluences(ICropTile crop, float humidity, float nutrients, float air) | 
 | 	{ | 
 | 		return (int) (humidity+nutrients+air); | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Used to determine whether the plant can crossbreed with another crop. | 
 | 	 * Default is allow crossbreeding if the size is greater or equal than 3. | 
 | 	 *  | 
 | 	 * @param crop crop to crossbreed with | 
 | 	 */ | 
 | 	public boolean canCross(ICropTile crop) | 
 | 	{ | 
 | 		return crop.getSize() >= 3; | 
 | 	} | 
 |  | 
 |  | 
 | 	/** | 
 | 	 * Called when the plant is rightclicked by a player. | 
 | 	 * Default action is harvesting. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @param player player rightclicking the crop | 
 | 	 * @return Whether the plant has changed | 
 | 	 */ | 
 | 	public boolean rightclick(ICropTile crop, EntityPlayer player) | 
 | 	{ | 
 | 		return crop.harvest(true); | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Check whether the crop can be harvested. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Whether the crop can be harvested in its current state. | 
 | 	 */ | 
 | 	public abstract boolean canBeHarvested(ICropTile crop); | 
 |  | 
 | 	/** | 
 | 	 * Base chance for dropping the plant's gains, specify values greater than 1 for multiple drops. | 
 | 	 * Default is 0.95^tier. | 
 | 	 *  | 
 | 	 * @return Chance to drop the gains | 
 | 	 */ | 
 | 	public float dropGainChance() | 
 | 	{ | 
 | 		float base = 1F; | 
 | 		for (int i = 0; i < tier(); i++) {base*=0.95;} | 
 | 		return base; | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Item obtained from harvesting the plant. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Item obtained | 
 | 	 */ | 
 | 	public abstract ItemStack getGain(ICropTile crop); | 
 |  | 
 | 	/** | 
 | 	 * Get the size of the plant after harvesting. | 
 | 	 * Default is 1. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Plant size after harvesting | 
 | 	 */ | 
 | 	public byte getSizeAfterHarvest(ICropTile crop) {return 1;} | 
 |  | 
 |  | 
 | 	/** | 
 | 	 * Called when the plant is leftclicked by a player. | 
 | 	 * Default action is picking the plant. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @param player player leftclicked the crop | 
 | 	 * @return Whether the plant has changed | 
 | 	 */ | 
 | 	public boolean leftclick(ICropTile crop, EntityPlayer player) | 
 | 	{ | 
 | 		return crop.pick(true); | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Base chance for dropping seeds when the plant is picked. | 
 | 	 * Default is 0.5*0.8^tier with a bigger chance for sizes greater than 2 and absolutely no chance for size 0. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Chance to drop the seeds | 
 | 	 */ | 
 | 	public float dropSeedChance(ICropTile crop) | 
 | 	{ | 
 | 		if (crop.getSize() == 1) return 0; | 
 | 		float base = 0.5F; | 
 | 		if (crop.getSize() == 2) base/=2F; | 
 | 		for (int i = 0; i < tier(); i++) {base*=0.8;} | 
 | 		return base; | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Obtain seeds dropped when the plant is picked. | 
 | 	 * Multiple drops of the returned ItemStack can occur. | 
 | 	 * Default action is generating a seed from this crop. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Seeds | 
 | 	 */ | 
 | 	public ItemStack getSeeds(ICropTile crop) | 
 | 	{ | 
 | 		return crop.generateSeeds(crop.getID(), crop.getGrowth(), crop.getGain(), crop.getResistance(), crop.getScanLevel()); | 
 | 	} | 
 |  | 
 | 	/** | 
 | 	 * Called when a neighbor block to the crop has changed. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 */ | 
 | 	public void onNeighbourChange(ICropTile crop){} | 
 |  | 
 | 	/** | 
 | 	 * Check if the crop should emit redstone. | 
 | 	 *  | 
 | 	 * @return Whether the crop should emit redstone | 
 | 	 */ | 
 | 	public int emitRedstone(ICropTile crop){return 0;} | 
 |  | 
 | 	/** | 
 | 	 * Called when the crop is destroyed. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 */ | 
 | 	public void onBlockDestroyed(ICropTile crop){} | 
 |  | 
 | 	/** | 
 | 	 * Get the light value emitted by the plant. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Light value emitted | 
 | 	 */ | 
 | 	public int getEmittedLight(ICropTile crop) {return 0;} | 
 |  | 
 | 	/** | 
 | 	 * Default is true if the entity is an EntityLiving in jumping or sprinting state. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @param entity entity colliding | 
 | 	 * @return Whether trampling calculation should happen, return false if the plant is no longer valid. | 
 | 	 */ | 
 | 	public boolean onEntityCollision(ICropTile crop, Entity entity) | 
 | 	{ | 
 | 		if (entity instanceof EntityLivingBase) | 
 | 		{ | 
 | 			return ((EntityLivingBase)entity).isSprinting(); | 
 | 		} | 
 | 		return false; | 
 | 	} | 
 |  | 
 |  | 
 | 	/** | 
 | 	 * Called every time the crop ticks. | 
 | 	 * Should be called every 256 ticks or around 13 seconds. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 */ | 
 | 	public void tick(ICropTile crop) {} | 
 |  | 
 | 	/** | 
 | 	 * Check whether this plant spreads weed to surrounding tiles. | 
 | 	 * Default is true if the plant has a high growth stat (or is weeds) and size greater or equal than 2. | 
 | 	 *  | 
 | 	 * @param crop reference to ICropTile | 
 | 	 * @return Whether the plant spreads weed | 
 | 	 */ | 
 | 	public boolean isWeed(ICropTile crop) | 
 | 	{ | 
 | 		return crop.getSize()>=2 && (crop.getID()==0 || crop.getGrowth()>=24); | 
 | 	} | 
 |  | 
 |  | 
 | 	/** | 
 | 	 * Get this plant's ID. | 
 | 	 *  | 
 | 	 * @return ID of this CropCard or -1 if it's not registered | 
 | 	 */ | 
 | 	public final int getId() | 
 | 	{ | 
 | 		return Crops.instance.getIdFor(this); | 
 | 	} | 
 |  | 
 | 	@SideOnly(Side.CLIENT) | 
 | 	protected Icon textures[]; | 
 | } |