With Project Fruit I built around the Lemon Land mod and added a whole new dimension that's made of fruit. When you enter the fruit dimension you'll see four different biomes. The lemon biome, the lime biome, orange biome and the blueberry biome.
Be sure to follow me on twitter to see the latest news and pics.
Installation:
1: Download and install Forge.
2: Download Project Fruit.
3: Move “Project Fruit x.x.x.jar/.zip” to your mods folder inside your .minecraft folder.
We are not looking for anyone to help texture or code. We are looking for people to report bugs and give us ideas! So if you find a bug, please report it here. If you have an idea, please submit it here and mark it as a enhancement. Thank you!
This mod (plugin, a patch to Minecraft source, henceforth "Mod" or "The Mod"), by the terms of http://www.minecraft.net/copyright.jsp is sole property of the Mod author (, henceforth "Owner" or "The Owner"). By default it may only be distributed on minecraftforums.net, planetminecraft.com. It may only be mirrored or reposted with advance written permission of the Owner. Electronic Mail is fine if you wait for a response. URL shorteners or other attempts to make money off The Owner's Mod are strictly forbidden without advance written permission
TERMS AND CONDITIONS 0. USED TERMS MOD - modification, plugin, a piece of software that interfaces with the Minecraft client to extend, add, change or remove original capabilities. MOJANG - Mojang AB OWNER - , Original author(s) of the MOD. Under the copyright terms accepted when purchasing Minecraft (http://www.minecraft.net/copyright.jsp) the OWNER has full rights over their MOD despite use of MOJANG code. USER - End user of the mod, person installing the mod.
1. LIABILITY THIS MOD IS PROVIDED 'AS IS' WITH NO WARRANTIES, IMPLIED OR OTHERWISE. THE OWNER OF THIS MOD TAKES NO RESPONSIBILITY FOR ANY DAMAGES INCURRED FROM THE USE OF THIS MOD. THIS MOD ALTERS FUNDAMENTAL PARTS OF THE MINECRAFT GAME, PARTS OF MINECRAFT MAY NOT WORK WITH THIS MOD INSTALLED. ALL DAMAGES CAUSED FROM THE USE OR MISUSE OF THIS MOD FALL ON THE USER.
2. USE Use of this MOD to be installed, manually or automatically, is given to the USER without restriction.
3. REDISTRIBUTION This MOD may only be distributed where uploaded, mirrored, or otherwise linked to by the OWNER solely. All mirrors of this mod must have advance written permission from the OWNER. ANY attempts to make money off of this MOD (selling, selling modified versions, adfly, sharecash, etc.) are STRICTLY FORBIDDEN, and the OWNER may claim damages or take other action to rectify the situation.
4. DERIVATIVE WORKS/MODIFICATION This mod is provided freely and may be decompiled and modified for private use, either with a decompiler or a bytecode editor. Public distribution of modified versions of this MOD require advance written permission of the OWNER and may be subject to certain terms.
I checked and they don't seem to have anything in there for registering biomes. So i'm gonna guess I need to wait for them to add something like it again or try to find a workaround.
Hello, I'm trying to update my mod to 1.7.2 and I have everything working except for my custom biome. I'm not sure how to register it anymore being that GameRegistry.addBiome() seems to be gone. I tried using BiomeDictionary.registerBiomeType() but that didn't seem to work.
Is there a replacement for GameRegistry.addBiome() or do I need to wait for forge to add something else?
Hello, when I go to my custom dimension and I break the portal and try to build a new one it doesn't work. I have looked through my BlockFruitPortal code and I don't see anything wrong. If you have any ideas let me know.
package net.fruitdimension.main;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBreakable;
import net.minecraft.block.BlockPortal;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemMonsterPlacer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockFruitPortal extends BlockBreakable {
public BlockFruitPortal(int par1) {
super(par1, "portal", Material.portal, false);
this.setTickRandomly(true);
this.setHardness(-1.0F);
this.setStepSound(soundGlassFootstep);
this.setLightValue(0.75F);
}
/**
* Ticks the block if it's been scheduled
*/
public void updateTick(World par1World, int par2, int par3, int par4,
Random par5Random) {
super.updateTick(par1World, par2, par3, par4, par5Random);
if (par1World.provider.isSurfaceWorld()
&& par5Random.nextInt(2000) < par1World.difficultySetting) {
int l;
for (l = par3; !par1World.doesBlockHaveSolidTopSurface(par2, l,
par4) && l > 0; --l) {
;
}
if (l > 0 && !par1World.isBlockNormalCube(par2, l + 1, par4)) {
Entity entity = ItemMonsterPlacer.spawnCreature(par1World, 57,
(double) par2 + 0.5D, (double) l + 1.1D,
(double) par4 + 0.5D);
if (entity != null) {
entity.timeUntilPortal = entity.getPortalCooldown();
}
}
}
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this
* box can change after the pool has been cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World,
int par2, int par3, int par4) {
return null;
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y,
* z
*/
public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess,
int par2, int par3, int par4) {
float f;
float f1;
if (par1IBlockAccess.getBlockId(par2 - 1, par3, par4) != this.blockID
&& par1IBlockAccess.getBlockId(par2 + 1, par3, par4) != this.blockID) {
f = 0.125F;
f1 = 0.5F;
this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F,
0.5F + f1);
} else {
f = 0.5F;
f1 = 0.125F;
this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F,
0.5F + f1);
}
}
/**
* Is this block (a) opaque and (B) a full 1m cube? This determines whether
* or not to render the shared face of two adjacent blocks and also whether
* the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube() {
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False
* (examples: signs, buttons, stairs, etc)
*/
@Override
public boolean renderAsNormalBlock() {
return false;
}
/**
* Checks to see if this location is valid to create a portal and will
* return True if it does. Args: world, x, y, z
*/
public boolean tryToCreatePortal(World par1World, int par2, int par3,
int par4) {
byte b0 = 0;
byte b1 = 0;
if (par1World.getBlockId(par2 - 1, par3, par4) == FruitDimension.lemonBrick.blockID
|| par1World.getBlockId(par2 + 1, par3, par4) == FruitDimension.lemonBrick.blockID) {
b0 = 1;
}
if (par1World.getBlockId(par2, par3, par4 - 1) == FruitDimension.lemonBrick.blockID
|| par1World.getBlockId(par2, par3, par4 + 1) == FruitDimension.lemonBrick.blockID) {
b1 = 1;
}
if (b0 == b1) {
return false;
} else {
if (par1World.getBlockId(par2 - b0, par3, par4 - b1) == 0) {
par2 -= b0;
par4 -= b1;
}
int l;
int i1;
for (l = -1; l <= 2; ++l) {
for (i1 = -1; i1 <= 3; ++i1) {
boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3;
if (l != -1 && l != 2 || i1 != -1 && i1 != 3) {
int j1 = par1World.getBlockId(par2 + b0 * l, par3 + i1,
par4 + b1 * l);
if (flag) {
if (j1 != FruitDimension.lemonBrick.blockID) {
return false;
}
} else if (j1 != 0
&& j1 != FruitDimension.lemonadeBlock.blockID) {
return false;
}
}
}
}
for (l = 0; l < 2; ++l) {
for (i1 = 0; i1 < 3; ++i1) {
par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l,
FruitDimension.fruitPortal.blockID, 0, 2);
}
}
return true;
}
}
/**
* Lets the block know when one of its neighbor changes. Doesn't know which
* neighbor changed (coordinates passed are their own) Args: x, y, z,
* neighbor blockID
*/
public void onNeighborBlockChange(World par1World, int par2, int par3,
int par4, int par5) {
byte b0 = 0;
byte b1 = 1;
if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID
|| par1World.getBlockId(par2 + 1, par3, par4) == this.blockID) {
b0 = 1;
b1 = 0;
}
int i1;
for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == this.blockID; --i1) {
;
}
if (par1World.getBlockId(par2, i1 - 1, par4) != FruitDimension.lemonBrick.blockID) {
par1World.setBlockToAir(par2, par3, par4);
} else {
int j1;
for (j1 = 1; j1 < 4
&& par1World.getBlockId(par2, i1 + j1, par4) == this.blockID; ++j1) {
;
}
if (j1 == 3
&& par1World.getBlockId(par2, i1 + j1, par4) == FruitDimension.lemonBrick.blockID) {
boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == this.blockID
|| par1World.getBlockId(par2 + 1, par3, par4) == this.blockID;
boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == this.blockID
|| par1World.getBlockId(par2, par3, par4 + 1) == this.blockID;
if (flag && flag1) {
par1World.setBlockToAir(par2, par3, par4);
} else {
if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != FruitDimension.lemonBrick.blockID || par1World
.getBlockId(par2 - b0, par3, par4 - b1) != this.blockID)
&& (par1World
.getBlockId(par2 - b0, par3, par4 - b1) != FruitDimension.lemonBrick.blockID || par1World
.getBlockId(par2 + b0, par3, par4 + b1) != this.blockID)) {
par1World.setBlockToAir(par2, par3, par4);
}
}
} else {
par1World.setBlockToAir(par2, par3, par4);
}
}
}
@SideOnly(Side.CLIENT)
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess,
int par2, int par3, int par4, int par5) {
if (par1IBlockAccess.getBlockId(par2, par3, par4) == this.blockID) {
return false;
} else {
boolean flag = par1IBlockAccess.getBlockId(par2 - 1, par3, par4) == this.blockID
&& par1IBlockAccess.getBlockId(par2 - 2, par3, par4) != this.blockID;
boolean flag1 = par1IBlockAccess.getBlockId(par2 + 1, par3, par4) == this.blockID
&& par1IBlockAccess.getBlockId(par2 + 2, par3, par4) != this.blockID;
boolean flag2 = par1IBlockAccess.getBlockId(par2, par3, par4 - 1) == this.blockID
&& par1IBlockAccess.getBlockId(par2, par3, par4 - 2) != this.blockID;
boolean flag3 = par1IBlockAccess.getBlockId(par2, par3, par4 + 1) == this.blockID
&& par1IBlockAccess.getBlockId(par2, par3, par4 + 2) != this.blockID;
boolean flag4 = flag || flag1;
boolean flag5 = flag2 || flag3;
return flag4 && par5 == 4 ? true : (flag4 && par5 == 5 ? true
: (flag5 && par5 == 2 ? true : flag5 && par5 == 3));
}
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random par1Random) {
return 0;
}
/**
* Triggered whenever an entity collides with this block (enters into the
* block). Args: world, x, y, z, entity
*/
public void onEntityCollidedWithBlock(World par1World, int par2, int par3,
int par4, Entity par5Entity) {
if ((par5Entity.ridingEntity == null)
&& (par5Entity.riddenByEntity == null)
&& ((par5Entity instanceof EntityPlayerMP))) {
EntityPlayerMP thePlayer = (EntityPlayerMP) par5Entity;
if (thePlayer.timeUntilPortal > 0) {
thePlayer.timeUntilPortal = 10;
} else if (thePlayer.dimension != FruitDimension.dimID) {
thePlayer.timeUntilPortal = 10;
thePlayer.mcServer
.getConfigurationManager()
.transferPlayerToDimension(
thePlayer,
FruitDimension.dimID,
new FruitDimensionTeleporter(
thePlayer.mcServer
.worldServerForDimension(FruitDimension.dimID)));
} else {
thePlayer.timeUntilPortal = 10;
thePlayer.mcServer.getConfigurationManager()
.transferPlayerToDimension(
thePlayer,
0,
new FruitDimensionTeleporter(thePlayer.mcServer
.worldServerForDimension(0)));
}
}
}
@SideOnly(Side.CLIENT)
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
public int getRenderBlockPass() {
return 1;
}
@SideOnly(Side.CLIENT)
/**
* A randomly called display update to be able to add particles or other items for display
*/
public void randomDisplayTick(World par1World, int par2, int par3,
int par4, Random par5Random) {
if (par5Random.nextInt(100) == 0) {
par1World.playSound((double) par2 + 0.5D, (double) par3 + 0.5D,
(double) par4 + 0.5D, "portal.portal", 0.5F,
par5Random.nextFloat() * 0.4F + 0.8F, false);
}
for (int l = 0; l < 4; ++l) {
double d0 = (double) ((float) par2 + par5Random.nextFloat());
double d1 = (double) ((float) par3 + par5Random.nextFloat());
double d2 = (double) ((float) par4 + par5Random.nextFloat());
double d3 = 0.0D;
double d4 = 0.0D;
double d5 = 0.0D;
int i1 = par5Random.nextInt(2) * 2 - 1;
d3 = ((double) par5Random.nextFloat() - 0.5D) * 0.5D;
d4 = ((double) par5Random.nextFloat() - 0.5D) * 0.5D;
d5 = ((double) par5Random.nextFloat() - 0.5D) * 0.5D;
if (par1World.getBlockId(par2 - 1, par3, par4) != this.blockID
&& par1World.getBlockId(par2 + 1, par3, par4) != this.blockID) {
d0 = (double) par2 + 0.5D + 0.25D * (double) i1;
d3 = (double) (par5Random.nextFloat() * 2.0F * (float) i1);
} else {
d2 = (double) par4 + 0.5D + 0.25D * (double) i1;
d5 = (double) (par5Random.nextFloat() * 2.0F * (float) i1);
}
par1World.spawnParticle("portal", d0, d1, d2, d3, d4, d5);
}
}
@SideOnly(Side.CLIENT)
/**
* only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
*/
public int idPicked(World par1World, int par2, int par3, int par4) {
return 0;
}
}
0
Change log:
- Fixed a bug that made the game crash when trying to craft lemon bricks.
- Changed the drop rate of the lemon when breaking lemon leaves.
- Changed the amount of hunger the lemon fills.
0
0
Change log:
- Fixed a problem with all of the tools not breaking certain blocks properly.
0
Change log:
- Fixed the lemon stone block not dropping lemonstone.
- Fixed the lemon pickaxe not breaking things properly.
0
Change log:
- Updated to work with Minecraft 1.7.10.
0
Changelog
- Fixed a problem with trees not generating in the fruit dimension.
- Fixed a problem with the fruit portal not breaking properly.
0
Thanks!
1
Be sure to follow me on twitter to see the latest news and pics.
Installation:
2: Download Project Fruit.
3: Move “Project Fruit x.x.x.jar/.zip” to your mods folder inside your .minecraft folder.
4. Enjoy the mod!
All of the info can be found on my website!
How you can help:
1
How To Install
Find all of the info on my website!
Credits
Copyright
TERMS AND CONDITIONS 0. USED TERMS MOD - modification, plugin, a piece of software that interfaces with the Minecraft client to extend, add, change or remove original capabilities. MOJANG - Mojang AB OWNER - , Original author(s) of the MOD. Under the copyright terms accepted when purchasing Minecraft (http://www.minecraft.net/copyright.jsp) the OWNER has full rights over their MOD despite use of MOJANG code. USER - End user of the mod, person installing the mod.
1. LIABILITY THIS MOD IS PROVIDED 'AS IS' WITH NO WARRANTIES, IMPLIED OR OTHERWISE. THE OWNER OF THIS MOD TAKES NO RESPONSIBILITY FOR ANY DAMAGES INCURRED FROM THE USE OF THIS MOD. THIS MOD ALTERS FUNDAMENTAL PARTS OF THE MINECRAFT GAME, PARTS OF MINECRAFT MAY NOT WORK WITH THIS MOD INSTALLED. ALL DAMAGES CAUSED FROM THE USE OR MISUSE OF THIS MOD FALL ON THE USER.
2. USE Use of this MOD to be installed, manually or automatically, is given to the USER without restriction.
3. REDISTRIBUTION This MOD may only be distributed where uploaded, mirrored, or otherwise linked to by the OWNER solely. All mirrors of this mod must have advance written permission from the OWNER. ANY attempts to make money off of this MOD (selling, selling modified versions, adfly, sharecash, etc.) are STRICTLY FORBIDDEN, and the OWNER may claim damages or take other action to rectify the situation.
4. DERIVATIVE WORKS/MODIFICATION This mod is provided freely and may be decompiled and modified for private use, either with a decompiler or a bytecode editor. Public distribution of modified versions of this MOD require advance written permission of the OWNER and may be subject to certain terms.
0
0
0
1
Is there a replacement for GameRegistry.addBiome() or do I need to wait for forge to add something else?
0
0