2013-05-07 22:12:07 +02:00
|
|
|
package ic2.api.crops;
|
|
|
|
|
|
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
|
|
import net.minecraft.entity.EntityLiving;
|
|
|
|
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 EntityLiving)
|
|
|
|
{
|
|
|
|
return ((EntityLiving)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);
|
|
|
|
}
|
2013-05-28 06:29:29 +02:00
|
|
|
|
2013-05-07 22:12:07 +02:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
protected Icon textures[];
|
|
|
|
}
|