@Override public boolean canBearFruit() { return genome.getPrimary().getSuitableFruit().contains(genome.getFruitProvider().getFamily()); }
IAlleleTreeSpecies primary = genome.getPrimary(); IAlleleTreeSpecies secondary = genome.getSecondary(); if (!isPureBred(EnumTreeChromosome.SPECIES)) { list.add(TextFormatting.BLUE + Translator.translateToLocal("for.trees.hybrid").replaceAll("%PRIMARY", primary.getAlleleName()).replaceAll("%SECONDARY", secondary.getAlleleName())); String sappiness = TextFormatting.GOLD + "S: " + genome.getActiveAllele(EnumTreeChromosome.SAPPINESS).getAlleleName(); String maturation = TextFormatting.RED + "M: " + genome.getActiveAllele(EnumTreeChromosome.MATURATION).getAlleleName(); String height = TextFormatting.LIGHT_PURPLE + "H: " + genome.getActiveAllele(EnumTreeChromosome.HEIGHT).getAlleleName(); String girth = TextFormatting.AQUA + "G: " + String.format("%sx%s", genome.getGirth(), genome.getGirth()); String saplings = TextFormatting.YELLOW + "S: " + genome.getActiveAllele(EnumTreeChromosome.FERTILITY).getAlleleName(); String yield = TextFormatting.WHITE + "Y: " + genome.getActiveAllele(EnumTreeChromosome.YIELD).getAlleleName(); list.add(String.format("%s, %s", saplings, maturation)); list.add(String.format("%s, %s", height, girth)); list.add(String.format("%s, %s", yield, sappiness)); IAlleleBoolean primaryFireproof = (IAlleleBoolean) genome.getActiveAllele(EnumTreeChromosome.FIREPROOF); if (primaryFireproof.getValue()) { list.add(TextFormatting.RED + Translator.translateToLocal("for.gui.fireresist")); IAllele fruit = getGenome().getActiveAllele(EnumTreeChromosome.FRUITS); if (fruit != AlleleFruits.fruitNone) { String strike = ""; strike = TextFormatting.STRIKETHROUGH.toString(); list.add(strike + TextFormatting.GREEN + "F: " + genome.getFruitProvider().getDescription());
@Override public int getResilience() { int base = (int) (getGenome().getFertility() * getGenome().getSappiness() * 100); return (base > 1 ? base : 1) * 10; }
@Override public boolean trySpawnFruitBlock(ITreeGenome genome, World world, Random rand, BlockPos pos) { if (rand.nextFloat() > genome.getSappiness()) { return false; } IAlleleFruit activeAllele = (IAlleleFruit) genome.getActiveAllele(EnumTreeChromosome.FRUITS); return TreeManager.treeRoot.setFruitBlock(world, genome, activeAllele, genome.getYield(), pos); }
@Override public boolean isPureBred(EnumTreeChromosome chromosome) { return genome.getActiveAllele(chromosome).getUID().equals(genome.getInactiveAllele(chromosome).getUID()); }
final IAlleleTreeSpecies treeSpecies = genome.getPrimary(); final int w = 144; final int h = 176; IFruitProvider fruitProvider = genome.getFruitProvider(); ResourceLocation fruitSprite = fruitProvider.getSprite(genome, world, BlockPos.ORIGIN, 100); if (fruitSprite != null && !treeSpecies.getUID().equals("forestry.treeOak")) { new ControlText(contents, new Area(w2, y, w3, th), genome.getHeight() + "x", TextJustification.MIDDLE_LEFT); y += th; new ControlText(contents, new Area(0, y, w2, th), syst.getChromosomeShortName(EnumTreeChromosome.FERTILITY) + " : ", TextJustification.MIDDLE_RIGHT); new ControlText(contents, new Area(w2, y, w3, th), genome.getFertility() + "x", TextJustification.MIDDLE_LEFT); y += th; List<ItemStack> fruits = new ArrayList<>(products.keySet()); new ControlText(contents, new Area(w2, y, w3, th), genome.getYield() + "x", TextJustification.MIDDLE_LEFT); y += th; new ControlText(contents, new Area(0, y, w2, th), syst.getChromosomeShortName(EnumTreeChromosome.SAPPINESS) + " : ", TextJustification.MIDDLE_RIGHT); new ControlText(contents, new Area(w2, y, w3, th), genome.getSappiness() + "x", TextJustification.MIDDLE_LEFT); y += th; new ControlText(contents, new Area(0, y, w2, th), syst.getChromosomeShortName(EnumTreeChromosome.MATURATION) + " : ", TextJustification.MIDDLE_RIGHT); new ControlText(contents, new Area(w2, y, w3, th), genome.getMaturationTime() + "x", TextJustification.MIDDLE_LEFT); y += th; new ControlText(contents, new Area(0, y, w2, th), syst.getChromosomeShortName(EnumTreeChromosome.GIRTH) + " : ", TextJustification.MIDDLE_RIGHT); new ControlText(contents, new Area(w2, y, w3, th), genome.getGirth() + "x" + genome.getGirth(), TextJustification.MIDDLE_LEFT); y += th; contents.setSize(new Point(contents.getSize().xPos(), y));
@Override public EnumPlantType getPlantType(IBlockAccess world, BlockPos pos) { return genome.getPrimary().getPlantType(); }
int speciesDominance0 = guiAlyzer.getColorCoding(tree.getGenome().getPrimary().isDominant()); int speciesDominance1 = guiAlyzer.getColorCoding(tree.getGenome().getSecondary().isDominant()); String fireproofActive = StringUtil.readableBoolean(tree.getGenome().getFireproof(), yes, no); String fireproofInactive = StringUtil.readableBoolean(((AlleleBoolean) tree.getGenome().getInactiveAllele(EnumTreeChromosome.FIREPROOF)).getValue(), yes, no); textLayout.drawLine(Translator.translateToLocal("for.gui." + tree.getGenome().getPrimary().getPlantType().toString().toLowerCase(Locale.ENGLISH)), GuiAlyzer.COLUMN_1, speciesDominance0); textLayout.drawLine(Translator.translateToLocal("for.gui." + tree.getGenome().getSecondary().getPlantType().toString().toLowerCase(Locale.ENGLISH)), GuiAlyzer.COLUMN_2, speciesDominance1); List<IFruitFamily> families0 = new ArrayList<>(tree.getGenome().getPrimary().getSuitableFruit()); List<IFruitFamily> families1 = new ArrayList<>(tree.getGenome().getSecondary().getSuitableFruit()); int fruitDominance0 = guiAlyzer.getColorCoding(tree.getGenome().getActiveAllele(EnumTreeChromosome.FRUITS).isDominant()); int fruitDominance1 = guiAlyzer.getColorCoding(tree.getGenome().getInactiveAllele(EnumTreeChromosome.FRUITS).isDominant()); IAllele fruit0 = tree.getGenome().getActiveAllele(EnumTreeChromosome.FRUITS); if (!tree.canBearFruit() && fruit0 != AlleleFruits.fruitNone) { strike = TextFormatting.STRIKETHROUGH.toString(); textLayout.drawLine(strike + tree.getGenome().getFruitProvider().getDescription(), GuiAlyzer.COLUMN_1, fruitDominance0); IAlleleFruit fruit1 = (IAlleleFruit) tree.getGenome().getInactiveAllele(EnumTreeChromosome.FRUITS); if (!tree.getGenome().getSecondary().getSuitableFruit().contains(fruit1.getProvider().getFamily()) && fruit1 != AlleleFruits.fruitNone) { strike = TextFormatting.STRIKETHROUGH.toString(); IFruitFamily primary = tree.getGenome().getFruitProvider().getFamily(); IFruitFamily secondary = ((IAlleleFruit) tree.getGenome().getInactiveAllele(EnumTreeChromosome.FRUITS)).getProvider().getFamily();
@Override @SideOnly(Side.CLIENT) public int addBiologyPages(ITree tree, IWidget parent, int y, IAnalystManager analystManager) { IBreedingSystem treeSystem = Binnie.GENETICS.getSystem(TreeManager.treeRoot); String alleleName = treeSystem.getAlleleName(EnumTreeChromosome.SAPPINESS, tree.getGenome().getActiveAllele(EnumTreeChromosome.SAPPINESS)); new ControlTextCentered(parent, y, TextFormatting.ITALIC + I18N.localise(AnalystConstants.BIOLOGY_KEY + ".sappiness", alleleName)) .setColor(parent.getColor()); y += 20; int fertility = (int) (1.0f / tree.getGenome().getFertility()); if (fertility > 1) { new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".fertility.leaves", fertility)) .setColor(parent.getColor()); } else { new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".fertility.leaf")) .setColor(parent.getColor()); } y += 22; int butterflySpawn = Math.round(Constants.SPAWN_KOEF / (tree.getGenome().getSappiness() * tree.getGenome().getYield() * 0.5f)); new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".mothSpawn.perLeaf", TimeUtil.getTimeString(butterflySpawn))) .setColor(parent.getColor()); y += 34; new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".plantTypes")).setColor(parent.getColor()); y += 12; new ControlTextCentered(parent, y, TextFormatting.ITALIC + tree.getGenome().getPrimary().getPlantType().toString()) .setColor(parent.getColor()); return y; } }
@Override public boolean setLeaves(ITreeGenome genome, World world, @Nullable GameProfile owner, BlockPos pos, Random rand) { if (owner == null && genome.matchesTemplateGenome()) { IFruitProvider fruitProvider = genome.getFruitProvider(); String speciesUid = genome.getPrimary().getUID(); IBlockState defaultLeaves; if (fruitProvider.isFruitLeaf(genome, world, pos) && rand.nextFloat() <= fruitProvider.getFruitChance(genome, world, pos)) {
@Override public NonNullList<ItemStack> produceStacks(World world, BlockPos pos, int ripeningTime) { return genome.getFruitProvider().getFruits(genome, world, pos, ripeningTime); } }
@Override public void createElements(IDatabaseElement container, ITree tree, ItemStack itemStack) { IAlleleTreeSpecies primarySpecies = tree.getGenome().getPrimary(); IAlleleTreeSpecies species = mode == DatabaseMode.ACTIVE ? primarySpecies : tree.getGenome().getSecondary(); ITextStyle speciesStyle = GuiElementFactory.INSTANCE.getStateStyle(species.isDominant()); container.addLine(Translator.translateToLocal("for.gui.native"), Translator.translateToLocal("for.gui." + tree.getGenome().getPrimary().getPlantType().toString().toLowerCase(Locale.ENGLISH)), species.isDominant()); List<IFruitFamily> families = new ArrayList<>(tree.getGenome().getPrimary().getSuitableFruit()); IAlleleFruit fruit = (IAlleleFruit) (mode == DatabaseMode.ACTIVE ? tree.getGenome().getActiveAllele(EnumTreeChromosome.FRUITS) : tree.getGenome().getInactiveAllele(EnumTreeChromosome.FRUITS)); ITextStyle textStyle = GuiElementFactory.INSTANCE.getStateStyle(tree.getGenome().getActiveAllele(EnumTreeChromosome.FRUITS).isDominant());
y += 12; IBreedingSystem treeSystem = Binnie.GENETICS.getSystem(TreeManager.treeRoot); String yieldAlleleName = treeSystem.getAlleleName(EnumTreeChromosome.YIELD, ind.getGenome().getActiveAllele(EnumTreeChromosome.YIELD)); new ControlTextCentered(this, y, TextFormatting.ITALIC + I18N.localise(AnalystConstants.FRUIT_KEY + ".yield") + ": " + yieldAlleleName).setColor(getColor()); y += 20; specialties.addAll(ind.getSpecialties().keySet()); try { if (ind.getGenome().getFruitProvider() instanceof FruitProviderPod) { FruitProviderPod pod = (FruitProviderPod) ind.getGenome().getFruitProvider(); Field f = FruitProviderPod.class.getDeclaredField("drops"); f.setAccessible(true); y += 12; Collection<IAllele> fruitAlleles = Binnie.GENETICS.getChromosomeMap(TreeManager.treeRoot).get(EnumTreeChromosome.FRUITS); for (IFruitFamily fam : ind.getGenome().getPrimary().getSuitableFruit()) { Collection<ItemStack> stacks = new UniqueItemStackSet(); for (IAllele a : fruitAlleles) {
new ControlTextCentered(this, y, TextFormatting.UNDERLINE + getTitle()).setColor(getColor()); y += 12; if (((IAlleleBoolean) ind.getGenome().getActiveAllele(EnumTreeChromosome.FIREPROOF)).getValue()) { new ControlIconDisplay(this, (getWidth() - 16) / 2, y, analystManager.getIcons().getIconNoFire()).addTooltip(I18N.localise(AnalystConstants.WOOD_KEY + ".fireproof")); } else { Collection<ItemStack> products = new UniqueItemStackSet(); IAlleleTreeSpecies treeSpecies = genome.getPrimary(); ItemStack stackWood = treeSpecies.getWoodProvider().getWoodStack(); if (!stackWood.isEmpty()) {
IAlleleTreeSpecies primary = genome.getPrimary(); ITreekeepingMode treekeepingMode = TreeManager.treeRoot.getTreekeepingMode(world); float sappinessModifier = treekeepingMode.getSappinessModifier(genome, 1f); float sappiness = genome.getSappiness() * sappinessModifier;
@Override public boolean trySpawnFruitBlock(ITreeGenome genome, World world, Random rand, BlockPos pos) { if (rand.nextFloat() > getFruitChance(genome, world, pos)) { return false; } if (type == EnumPodType.COCOA) { return BlockUtil.tryPlantCocoaPod(world, pos); } else { IAlleleFruit activeAllele = (IAlleleFruit) genome.getActiveAllele(EnumTreeChromosome.FRUITS); return TreeManager.treeRoot.setFruitBlock(world, genome, activeAllele, genome.getYield(), pos); } }
if (rand.nextFloat() >= tree.getGenome().getSappiness() * tree.getGenome().getYield()) { return false;
@Override public List<ITree> getSaplings(World world, @Nullable GameProfile playerProfile, BlockPos pos, float modifier) { List<ITree> prod = new ArrayList<>(); float chance = genome.getFertility() * modifier; if (world.rand.nextFloat() <= chance) { if (mate == null) { prod.add(TreeManager.treeRoot.getTree(world, new TreeGenome(genome.getChromosomes()))); } else { prod.add(createOffspring(world, mate, playerProfile, pos)); } } return prod; }
@Override public boolean setLogBlock(ITreeGenome genome, World world, BlockPos pos, EnumFacing facing) { AlleleBoolean fireproofAllele = (AlleleBoolean) genome.getActiveAllele(EnumTreeChromosome.FIREPROOF); boolean fireproof = fireproofAllele.getValue(); IBlockState logBlock = TreeManager.woodAccess.getBlock(woodType, WoodBlockKind.LOG, fireproof); BlockLog.EnumAxis axis = BlockLog.EnumAxis.fromFacingAxis(facing.getAxis()); return world.setBlockState(pos, logBlock.withProperty(BlockLog.LOG_AXIS, axis)); }
/** * The chance that this leaves contains fruits or the chance that a pod block spawns. * * @param genome The genome of the tree of the pod / leaves block. * @return The chance that this leaves contains fruits or the chance that a pod block spawns. */ default float getFruitChance(ITreeGenome genome, World world, BlockPos pos) { ITreeRoot treeRoot = TreeManager.treeRoot; if (treeRoot == null) { return 0.0F; } float yieldModifier = treeRoot.getTreekeepingMode(world).getYieldModifier(genome, 1.0F); return genome.getYield() * yieldModifier * 2.5F; }