From 35b9c74e65eb65b109c5081587efc2e8e059e59e Mon Sep 17 00:00:00 2001 From: Matt Caughey Date: Thu, 7 Nov 2013 13:05:04 -0500 Subject: [PATCH 1/5] Added bird model and texture --- .../biomes/BiomeDecoratorBOP.java | 2 +- .../entities/models/ModelBird.java | 125 ++++++++++++++++++ .../biomesoplenty/textures/mobs/bird.png | Bin 0 -> 2304 bytes 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 common/biomesoplenty/entities/models/ModelBird.java create mode 100644 resources/assets/biomesoplenty/textures/mobs/bird.png diff --git a/common/biomesoplenty/biomes/BiomeDecoratorBOP.java b/common/biomesoplenty/biomes/BiomeDecoratorBOP.java index 8583ccbba..19d67faa2 100644 --- a/common/biomesoplenty/biomes/BiomeDecoratorBOP.java +++ b/common/biomesoplenty/biomes/BiomeDecoratorBOP.java @@ -650,7 +650,7 @@ public class BiomeDecoratorBOP extends BiomeDecorator redwoodShrubsPerChunk = 0; koruPerChunk = 0; waspHivesPerChunk = 0; - rootsPerChunk = 7; + rootsPerChunk = 9; generateLakes = true; generateAsh = false; generateMycelium = false; diff --git a/common/biomesoplenty/entities/models/ModelBird.java b/common/biomesoplenty/entities/models/ModelBird.java new file mode 100644 index 000000000..dbc3fffea --- /dev/null +++ b/common/biomesoplenty/entities/models/ModelBird.java @@ -0,0 +1,125 @@ +package biomesoplenty.entities.models; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelBird extends ModelBase +{ + //fields + ModelRenderer Body; + ModelRenderer Stomach; + ModelRenderer Head; + ModelRenderer Beak; + ModelRenderer TuftBottom; + ModelRenderer TuftTop; + ModelRenderer Tail; + ModelRenderer WingRight; + ModelRenderer WingLeft; + ModelRenderer LegLeft; + ModelRenderer LegRight; + + public ModelBird() + { + textureWidth = 64; + textureHeight = 32; + + Body = new ModelRenderer(this, 0, 0); + Body.addBox(0F, 0F, 0F, 6, 3, 10); + Body.setRotationPoint(-3F, 20F, -5F); + Body.setTextureSize(64, 32); + Body.mirror = true; + setRotation(Body, 0F, 0F, 0F); + Stomach = new ModelRenderer(this, 0, 13); + Stomach.addBox(0F, 0F, 0F, 4, 1, 8); + Stomach.setRotationPoint(-2F, 23F, -4F); + Stomach.setTextureSize(64, 32); + Stomach.mirror = true; + setRotation(Stomach, 0F, 0F, 0F); + Head = new ModelRenderer(this, 0, 22); + Head.addBox(0F, 0F, 0F, 4, 3, 4); + Head.setRotationPoint(-2F, 19F, -9F); + Head.setTextureSize(64, 32); + Head.mirror = true; + setRotation(Head, 0F, 0F, 0F); + Beak = new ModelRenderer(this, 0, 29); + Beak.addBox(0F, 0F, 0F, 2, 1, 1); + Beak.setRotationPoint(-1F, 21F, -10F); + Beak.setTextureSize(64, 32); + Beak.mirror = true; + setRotation(Beak, 0F, 0F, 0F); + TuftBottom = new ModelRenderer(this, 28, 23); + TuftBottom.addBox(0F, 0F, 0F, 2, 1, 3); + TuftBottom.setRotationPoint(-1F, 18F, -7F); + TuftBottom.setTextureSize(64, 32); + TuftBottom.mirror = true; + setRotation(TuftBottom, 0F, 0F, 0F); + TuftTop = new ModelRenderer(this, 20, 27); + TuftTop.addBox(0F, 0F, 0F, 4, 0, 5); + TuftTop.setRotationPoint(-2F, 18F, -5F); + TuftTop.setTextureSize(64, 32); + TuftTop.mirror = true; + setRotation(TuftTop, 0F, 0F, 0F); + Tail = new ModelRenderer(this, 42, 0); + Tail.addBox(0F, 0F, 0F, 4, 0, 7); + Tail.setRotationPoint(-2F, 21F, 5F); + Tail.setTextureSize(64, 32); + Tail.mirror = true; + setRotation(Tail, 0F, 0F, 0F); + WingRight = new ModelRenderer(this, 36, 7); + WingRight.addBox(0F, 0F, 0F, 8, 0, 6); + WingRight.setRotationPoint(-11F, 20F, -4F); + WingRight.setTextureSize(64, 32); + WingRight.mirror = true; + setRotation(WingRight, 0F, 0F, 0F); + WingLeft = new ModelRenderer(this, 36, 13); + WingLeft.addBox(0F, 0F, 0F, 8, 0, 6); + WingLeft.setRotationPoint(3F, 20F, -4F); + WingLeft.setTextureSize(64, 32); + WingLeft.mirror = true; + setRotation(WingLeft, 0F, 0F, 0F); + LegLeft = new ModelRenderer(this, 33, 0); + LegLeft.addBox(0F, 0F, 0F, 1, 1, 3); + LegLeft.setRotationPoint(2F, 23F, 0F); + LegLeft.setTextureSize(64, 32); + LegLeft.mirror = true; + setRotation(LegLeft, 0F, 0F, 0F); + LegRight = new ModelRenderer(this, 33, 0); + LegRight.addBox(0F, 0F, 0F, 1, 1, 3); + LegRight.setRotationPoint(-3F, 23F, 0F); + LegRight.setTextureSize(64, 32); + LegRight.mirror = true; + setRotation(LegRight, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Body.render(f5); + Stomach.render(f5); + Head.render(f5); + Beak.render(f5); + TuftBottom.render(f5); + TuftTop.render(f5); + Tail.render(f5); + WingRight.render(f5); + WingLeft.render(f5); + LegLeft.render(f5); + LegRight.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/resources/assets/biomesoplenty/textures/mobs/bird.png b/resources/assets/biomesoplenty/textures/mobs/bird.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd2bbe4bd6f8443d39bdde89f88ebc126f8f149 GIT binary patch literal 2304 zcmV+b3IFzqP)N2bPDNB8 zb~7$DE-^7j^FlWO00?|ZL_t(&L)}?vb5qwD<_C2ef)j%*Z<4O|&Dv}WQ>Qcw69V2B zdEev(2f6}jx_+Qdo3g}sLON~Iq#ru{)@f4krp1!A*qD%XNimi!>FIMWvdNGI8w;E1 zJ9FkG{4h?1&=V>Kk_>}jeh%Ft znHlqjt_9eAAy@{o(6v(mN3Y_k%3r}bn9L6^4nJV-S%B0Kgs~?^L6_j6#Z5hND31LN zwvG_gb+d3&5uV{Z#oZREnntm-&qLom4>!H9!10^S^AFZu%?~fywh&AMY1l_HunlM7 zptbEoStyQAqv{8MZDf@>VI9`~bvQ;dyQ+X1R-FnezG5URSE~J<-)){>{Ovp`z&@6N zu4N9ohA`tQit6uE>%9vw^{ztWi*jxrf|1JpCFt8Cc~^jq`x?4q(02ypT0?TF(^6omZd#6ctA7PY&I1m5 zhSnE`y(m==qeN9A{9Xo=~{u4@tC*T`z54r4nW-=f^{$r56=-p z2r0f5R9-~swCK#NkibP`Kdfhx25Z<>O#==P#C(DhJdHEPLz|7 zEUXaTN~@|GxncdZJZI^;3yE1*>L=P_-09ka(2zMV_p(trB~4Q@LOl5LG#ms;0v(Fv zDXii=orP(5or>FDt|($zD?D-ug*8{8qL8MJ2odQ#k>A4RK00C%UDF)Q#3B_85rG5` zzxFi-G4&)+dYppMz1_o~K-&?9=M+mxYXIiH6_`6CaFS_ta~KW^Tg%PNT_M=|WAKbK z@r_XUmM{hVhzuoQU@j1-aKrtar!z7W68CeCW#v3!XR@?+$6=%rb8KvxLWxF!nSzOk z&qzghe?)7J6X>wSh>|BjkcM%0m_SI=c~{2%Mk>zBd24@y0BD^;a=c1x(3gdwEll(n zgSM6Xu|&x@p*IFgN0e4ufygU4Hnv5@FHS;vd;+Qy*I{g$VZ2A76gi0kD;sI3obqkL z%ZO9#Oq#i$ZlC5B)0m5A5lXHhlt?4`DG*%FA{Yk(H+Qh{Hp#-$YG;|Viki>R@iKJv zT?u+@h*gKctY;BMD%{?;1V!y6zTvu%AKrp7A$%Ht53b73;Bp3mB_Q%IDuBw!Eqm;w z6JF$tq4?z+C~Jy9@%%OBgUi@o^@hxY2-9jNG$=y?cn{n=9sTE=9X4tBk*)1%&xzGF5Ou7|)38?C)m>_?T{f-ML zVnryZncNwV$$tY=@f9R*1GDiI5}yExe*$xfb;LQBTlUz=&_<}+N*C{l;Tc-Jp!%}x z0f$%>#CJC1gku`dsREG#TeLBqFF2rQ(rNa3%C?qGq>Ky3FEU>sbB zo9=C4dDFGC{4wsOmiq!)h(66s-n!NWs2V~z^!yblj!xi!=bnNdnP!t2OfP0J7gHg#gP+g#G_gUKM~(--Z~zU)+{QZhCLY+_#3R zT*FesF0Z^P4CRRcit57btM7MR`Ji|I`XN3)a?^WDmXVZv&F$o{vYjkEHj8Io`Uh+4 zEEM%O^2+3flCUT(0%< zO;07qVXiR`ugRB>5_5&T$wLSq-D_9`iTBS7xU0f`85sy61@u~*FB(p a`~C+DPA=(Uo%`Vc0000 Date: Fri, 8 Nov 2013 00:31:53 +0100 Subject: [PATCH 2/5] Fixing issue #113. --- common/biomesoplenty/blocks/BlockBOPGrass.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/biomesoplenty/blocks/BlockBOPGrass.java b/common/biomesoplenty/blocks/BlockBOPGrass.java index ef66c09dc..92ee0a849 100644 --- a/common/biomesoplenty/blocks/BlockBOPGrass.java +++ b/common/biomesoplenty/blocks/BlockBOPGrass.java @@ -54,7 +54,9 @@ public class BlockBOPGrass extends Block @Override public Icon getIcon(int side, int meta) { - if (side < 0 || side >= blockIcon[meta].length) + if (meta < 0 || meta >= blockIcon.length) + meta = 1; + if (side < 0 || side >= blockIcon[meta].length) side = 1; return blockIcon[meta][side]; From 026069ac82f59c22b6a32c19051151ec93aa12a8 Mon Sep 17 00:00:00 2001 From: Matt Caughey Date: Thu, 7 Nov 2013 20:26:52 -0500 Subject: [PATCH 3/5] Added stalagmites and stalactites --- common/biomesoplenty/api/BlockReferences.java | 3 + common/biomesoplenty/api/Blocks.java | 1 + .../biomes/BiomeDecoratorBOP.java | 24 +++ .../biomes/BiomeGenOriginValley.java | 3 + .../blocks/BlockStoneFormations.java | 173 ++++++++++++++++++ .../configuration/BOPBlocks.java | 4 + .../configfile/BOPConfigurationIDs.java | 4 +- .../itemblocks/ItemBlockStoneFormations.java | 118 ++++++++++++ .../assets/biomesoplenty/lang/en_US.lang | 3 + .../textures/blocks/cragrock.png | Bin 728 -> 769 bytes .../textures/blocks/stalactite.png | Bin 0 -> 382 bytes .../textures/blocks/stalagmite.png | Bin 0 -> 389 bytes 12 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 common/biomesoplenty/blocks/BlockStoneFormations.java create mode 100644 common/biomesoplenty/itemblocks/ItemBlockStoneFormations.java create mode 100644 resources/assets/biomesoplenty/textures/blocks/stalactite.png create mode 100644 resources/assets/biomesoplenty/textures/blocks/stalagmite.png diff --git a/common/biomesoplenty/api/BlockReferences.java b/common/biomesoplenty/api/BlockReferences.java index d02d4147a..715aaf620 100644 --- a/common/biomesoplenty/api/BlockReferences.java +++ b/common/biomesoplenty/api/BlockReferences.java @@ -204,6 +204,9 @@ public class BlockReferences { bluebells (Blocks.flowers2, 5), minersdelight (Blocks.flowers2, 6), icyiris (Blocks.flowers2, 7), + + stalagmite (Blocks.stoneFormations, 0), + stalactite (Blocks.stoneFormations, 1), ; public Optional block; diff --git a/common/biomesoplenty/api/Blocks.java b/common/biomesoplenty/api/Blocks.java index 4a9135152..5bccaf088 100644 --- a/common/biomesoplenty/api/Blocks.java +++ b/common/biomesoplenty/api/Blocks.java @@ -87,6 +87,7 @@ public class Blocks public static Optional cloud = Optional.absent(); public static Optional hive = Optional.absent(); public static Optional honeyBlock = Optional.absent(); + public static Optional stoneFormations = Optional.absent(); //Nether public static Optional bones = Optional.absent(); diff --git a/common/biomesoplenty/biomes/BiomeDecoratorBOP.java b/common/biomesoplenty/biomes/BiomeDecoratorBOP.java index 19d67faa2..e4290a96a 100644 --- a/common/biomesoplenty/biomes/BiomeDecoratorBOP.java +++ b/common/biomesoplenty/biomes/BiomeDecoratorBOP.java @@ -243,6 +243,8 @@ public class BiomeDecoratorBOP extends BiomeDecorator public WorldGenerator koruGen; public WorldGenerator waspHiveGen; public WorldGenerator rootGen; + public WorldGenerator stalagmiteGen; + public WorldGenerator stalactiteGen; public WorldGenerator boneSpineGen; public WorldGenerator boneSpine2Gen; @@ -344,6 +346,8 @@ public class BiomeDecoratorBOP extends BiomeDecorator public int koruPerChunk; public int waspHivesPerChunk; public int rootsPerChunk; + public int stalagmitesPerChunk; + public int stalactitesPerChunk; public int boneSpinesPerChunk; public int boneSpines2PerChunk; @@ -555,6 +559,8 @@ public class BiomeDecoratorBOP extends BiomeDecorator redwoodShrubGen = new WorldGenRedwoodShrub(0,0); koruGen = new WorldGenTallGrass(Blocks.foliage.get().blockID, 12); rootGen = new WorldGenBOPTallGrass(Blocks.plants.get().blockID, 15); + stalagmiteGen = new WorldGenBOPTallGrass(Blocks.stoneFormations.get().blockID, 0); + stalactiteGen = new WorldGenBOPTallGrass(Blocks.stoneFormations.get().blockID, 1); pitGen = new WorldGenPit(Blocks.ash.get().blockID); waterlilyPerChunk = 0; lilyflowersPerChunk = 0; @@ -651,6 +657,8 @@ public class BiomeDecoratorBOP extends BiomeDecorator koruPerChunk = 0; waspHivesPerChunk = 0; rootsPerChunk = 9; + stalagmitesPerChunk = 3; + stalactitesPerChunk = 6; generateLakes = true; generateAsh = false; generateMycelium = false; @@ -1341,6 +1349,22 @@ public class BiomeDecoratorBOP extends BiomeDecorator rootGen.generate(currentWorld, randomGenerator, var3, var4, var5); } + for (var2 = 0; var2 < stalagmitesPerChunk; ++var2) + { + var3 = chunk_X + randomGenerator.nextInt(16) + 8; + var4 = randomGenerator.nextInt(64); + var5 = chunk_Z + randomGenerator.nextInt(16) + 8; + stalagmiteGen.generate(currentWorld, randomGenerator, var3, var4, var5); + } + + for (var2 = 0; var2 < stalactitesPerChunk; ++var2) + { + var3 = chunk_X + randomGenerator.nextInt(16) + 8; + var4 = randomGenerator.nextInt(64); + var5 = chunk_Z + randomGenerator.nextInt(16) + 8; + stalactiteGen.generate(currentWorld, randomGenerator, var3, var4, var5); + } + for (var2 = 0; var2 < waspHivesPerChunk; ++var2) { int var420 = randomGenerator.nextInt(4); diff --git a/common/biomesoplenty/biomes/BiomeGenOriginValley.java b/common/biomesoplenty/biomes/BiomeGenOriginValley.java index 277cd098b..9b172fac9 100644 --- a/common/biomesoplenty/biomes/BiomeGenOriginValley.java +++ b/common/biomesoplenty/biomes/BiomeGenOriginValley.java @@ -26,6 +26,9 @@ public class BiomeGenOriginValley extends BiomeGenBase customBiomeDecorator.sandPerChunk2 = 0; customBiomeDecorator.clayPerChunk = 0; customBiomeDecorator.rootsPerChunk = -999; + customBiomeDecorator.stalagmitesPerChunk = -999; + customBiomeDecorator.stalactitesPerChunk = -999; + customBiomeDecorator.minersDelightPerChunk = -999; } /** diff --git a/common/biomesoplenty/blocks/BlockStoneFormations.java b/common/biomesoplenty/blocks/BlockStoneFormations.java new file mode 100644 index 000000000..030bd0d6e --- /dev/null +++ b/common/biomesoplenty/blocks/BlockStoneFormations.java @@ -0,0 +1,173 @@ +package biomesoplenty.blocks; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockFlower; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import biomesoplenty.BiomesOPlenty; +import biomesoplenty.api.Blocks; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockStoneFormations extends BlockFlower +{ + private static final String[] forms = new String[] {"stalagmite", "stalactite"}; + private Icon[] textures; + + protected BlockStoneFormations(int blockID, Material material) + { + super(blockID, material); + this.setTickRandomly(true); + float var4 = 0.2F; + this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var4 * 3.0F, 0.5F + var4); + this.setCreativeTab(BiomesOPlenty.tabBiomesOPlenty); + } + + public BlockStoneFormations(int blockID) + { + this(blockID, Material.rock); + } + + @Override + public void registerIcons(IconRegister iconRegister) + { + textures = new Icon[forms.length]; + + for (int i = 0; i < forms.length; ++i) { + textures[i] = iconRegister.registerIcon("biomesoplenty:" + forms[i]); + } + } + + @Override + public Icon getIcon(int side, int meta) + { + if (meta < 0 || meta >= textures.length) { + meta = 0; + } + + return textures[meta]; + } + + @Override + public int getRenderType() + { + return 1; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int par2, int par3, int par4) + { + int meta = world.getBlockMetadata(par2, par3, par4); + + switch (meta) + { + default: + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; + } + } + + @Override + @SideOnly(Side.CLIENT) + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void getSubBlocks(int blockID, CreativeTabs creativeTabs, List list) { + for (int i = 0; i < forms.length; ++i) + { + list.add(new ItemStack(blockID, 1, i)); + } + } + + @Override + protected boolean canThisPlantGrowOnThisBlockID(int id) + { + return id == Block.stone.blockID; + } + + protected boolean canThisPlantGrowOnThisBlockID(int id, int metadata) + { + return id == Block.stone.blockID; + } + + @Override + public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side, ItemStack itemStack) + { + int idbottom = world.getBlockId(x, y - 1, z); + int idtop = world.getBlockId(x, y + 1, z); + int meta = itemStack.getItemDamage(); + //boolean sky = world.getFullBlockLightValue(x, y, z) >= 8 || world.canBlockSeeTheSky(x, y, z); + + if (itemStack.itemID == blockID) { + switch (meta) + { + case 0: // Stalagmite + return idbottom == Block.stone.blockID; + + case 1: // Stalactite + return idtop == Block.stone.blockID; + + default: + return idbottom == Block.stone.blockID; + } + } else + return this.canPlaceBlockOnSide(world, x, y, z, side); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, int neighborID) + { + //super.onNeighborBlockChange(world, x, y, z, neighborID); + this.checkFlowerChange(world, x, y, z); + } + + @Override + public int getDamageValue(World world, int x, int y, int z) + { + int meta = world.getBlockMetadata(x, y, z); + + return meta; + } + + @Override + public int damageDropped(int meta) + { + return meta & 15; + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z) + { + int meta = world.getBlockMetadata(x, y, z); + + if (world.getBlockId(x, y, z) != blockID) + { + if (meta == 1) + return this.canThisPlantGrowOnThisBlockID(world.getBlockId(x, y + 1, z)); + else + return this.canThisPlantGrowOnThisBlockID(world.getBlockId(x, y - 1, z)); + } + else + { + if (meta == 1) + return this.canThisPlantGrowOnThisBlockID(world.getBlockId(x, y + 1, z), world.getBlockMetadata(x, y, z)); + else + return this.canThisPlantGrowOnThisBlockID(world.getBlockId(x, y - 1, z), world.getBlockMetadata(x, y, z)); + } + } + + @Override + public boolean isBlockReplaceable(World world, int x, int y, int z) + { + return true; + } +} diff --git a/common/biomesoplenty/configuration/BOPBlocks.java b/common/biomesoplenty/configuration/BOPBlocks.java index 8a40eeba8..fbef66d8a 100644 --- a/common/biomesoplenty/configuration/BOPBlocks.java +++ b/common/biomesoplenty/configuration/BOPBlocks.java @@ -49,6 +49,7 @@ import biomesoplenty.blocks.BlockMud; import biomesoplenty.blocks.BlockOriginGrass; import biomesoplenty.blocks.BlockPromisedPortal; import biomesoplenty.blocks.BlockPuddle; +import biomesoplenty.blocks.BlockStoneFormations; import biomesoplenty.blocks.BlockTreeMoss; import biomesoplenty.blocks.BlockWillow; import biomesoplenty.configuration.configfile.BOPConfigurationIDs; @@ -79,6 +80,7 @@ import biomesoplenty.itemblocks.ItemBlockRedRock; import biomesoplenty.itemblocks.ItemBlockSapling; import biomesoplenty.itemblocks.ItemBlockSkystone; import biomesoplenty.itemblocks.ItemBlockSlab; +import biomesoplenty.itemblocks.ItemBlockStoneFormations; import biomesoplenty.items.ItemBOPAmethyst; import biomesoplenty.items.ItemBOPIvy; import biomesoplenty.items.ItemBOPWillow; @@ -136,6 +138,7 @@ public class BOPBlocks Blocks.plants = Optional.of((new BlockBOPPlant(BOPConfigurationIDs.plantsID)).setUnlocalizedName("bop.plants")); Blocks.flowers = Optional.of((new BlockBOPFlower(BOPConfigurationIDs.flowersID)).setHardness(0.0F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("bop.flowers")); Blocks.flowers2 = Optional.of((new BlockBOPFlower2(BOPConfigurationIDs.flowers2ID)).setHardness(0.0F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("bop.flowers2")); + Blocks.stoneFormations = Optional.of((new BlockStoneFormations(BOPConfigurationIDs.stoneFormationsID)).setHardness(0.5F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("bop.stoneFormations")); Blocks.mushrooms = Optional.of((new BlockBOPMushroom(BOPConfigurationIDs.mushroomsID)).setHardness(0.0F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("bop.mushrooms")); Blocks.coral = Optional.of((new BlockBOPCoral(BOPConfigurationIDs.coralID)).setHardness(0.0F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("bop.coral")); Blocks.willow = Optional.of((new BlockWillow(BOPConfigurationIDs.willowID)).setHardness(0.2F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("bop.willow")); @@ -228,6 +231,7 @@ public class BOPBlocks GameRegistry.registerBlock(Blocks.plants.get(), ItemBlockPlant.class, "bop.plants"); GameRegistry.registerBlock(Blocks.flowers.get(), ItemBlockFlower.class, "bop.flowers"); GameRegistry.registerBlock(Blocks.flowers2.get(), ItemBlockFlower2.class, "bop.flowers2"); + GameRegistry.registerBlock(Blocks.stoneFormations.get(), ItemBlockStoneFormations.class, "bop.stoneFormations"); GameRegistry.registerBlock(Blocks.mushrooms.get(), ItemBlockMushroom.class, "bop.mushrooms"); GameRegistry.registerBlock(Blocks.coral.get(), ItemBlockCoral.class, "bop.coral"); GameRegistry.registerBlock(Blocks.willow.get(), ItemBOPWillow.class, "bop.willow"); diff --git a/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java b/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java index 54a66f36d..6c34c2e7a 100644 --- a/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java +++ b/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java @@ -98,7 +98,8 @@ public class BOPConfigurationIDs public static int cloudID; public static int hiveID; public static int honeyBlockID; - + public static int stoneFormationsID; + public static int bonesID; public static int glassID; public static int altarID; @@ -418,6 +419,7 @@ public class BOPConfigurationIDs honeyStillID = config.get("Liquid IDs", "Honey Still ID (ID before this must be free!)", 1989, null).getInt(); honeyBlockID = config.getBlock("Honey Block ID", 1991, null).getInt(); + stoneFormationsID = config.getBlock("Stone Formations ID", 1992, null).getInt(); // Get Item ID's foodID = config.getItem("Food ID", 21003, null).getInt(); diff --git a/common/biomesoplenty/itemblocks/ItemBlockStoneFormations.java b/common/biomesoplenty/itemblocks/ItemBlockStoneFormations.java new file mode 100644 index 000000000..7fc80b71f --- /dev/null +++ b/common/biomesoplenty/itemblocks/ItemBlockStoneFormations.java @@ -0,0 +1,118 @@ +package biomesoplenty.itemblocks; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import biomesoplenty.BiomesOPlenty; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemBlockStoneFormations extends ItemBlock +{ + private static final String[] forms = new String[] {"stalagmite", "stalactite"}; + @SideOnly(Side.CLIENT) + private Icon[] textures; + + public ItemBlockStoneFormations(int par1) + { + super(par1); + setMaxDamage(0); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + int meta = itemStack.getItemDamage(); + if (meta < 0 || meta >= forms.length) { + meta = 0; + } + + return super.getUnlocalizedName() + "." + forms[meta]; + } + + @Override + public Icon getIconFromDamage(int meta) + { + return Block.blocksList[itemID].getIcon(0, meta); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isFull3D() + { + return true; + } + + @Override + public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + int id = world.getBlockId(x, y, z); + + if (id == Block.snow.blockID && (world.getBlockMetadata(x, y, z) & 7) < 1) { + side = 1; + } else if (!Block.blocksList[id].isBlockReplaceable(world, x, y, z)) + { + if (side == 0) { + --y; + } + + if (side == 1) { + ++y; + } + + if (side == 2) { + --z; + } + + if (side == 3) { + ++z; + } + + if (side == 4) { + --x; + } + + if (side == 5) { + ++x; + } + } + + if (!player.canPlayerEdit(x, y, z, side, itemStack)) + return false; + else if (itemStack.stackSize == 0) + return false; + else + { + if (world.canPlaceEntityOnSide(this.getBlockID(), x, y, z, false, side, (Entity)null, itemStack)) + { + Block block = Block.blocksList[this.getBlockID()]; + int j1 = block.onBlockPlaced(world, x, y, z, side, hitX, hitY, hitZ, 0); + + if (world.setBlock(x, y, z, this.getBlockID(), itemStack.getItemDamage(), 3)) + { + + if (world.getBlockId(x, y, z) == this.getBlockID()) + { + Block.blocksList[this.getBlockID()].onBlockPlacedBy(world, x, y, z, player, itemStack); + Block.blocksList[this.getBlockID()].onPostBlockPlaced(world, x, y, z, j1); + } + + world.playSoundEffect(x + 0.5F, y + 0.5F, z + 0.5F, block.stepSound.getPlaceSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F); + --itemStack.stackSize; + } + } + + return true; + } + } +} diff --git a/resources/assets/biomesoplenty/lang/en_US.lang b/resources/assets/biomesoplenty/lang/en_US.lang index 42103a1ba..f45c1c440 100644 --- a/resources/assets/biomesoplenty/lang/en_US.lang +++ b/resources/assets/biomesoplenty/lang/en_US.lang @@ -60,6 +60,9 @@ tile.bop.flowers2.bluebells.name=Bluebells tile.bop.flowers2.minersdelight.name=Miner's Delight tile.bop.flowers2.icyiris.name=Icy Iris +tile.bop.stoneFormations.stalagmite.name=Stalagmite +tile.bop.stoneFormations.stalactite.name=Stalactite + tile.bop.foliage.algae.name=Algae tile.bop.foliage.shortgrass.name=Short Grass tile.bop.foliage.mediumgrass.name=Medium Grass diff --git a/resources/assets/biomesoplenty/textures/blocks/cragrock.png b/resources/assets/biomesoplenty/textures/blocks/cragrock.png index ea59ce1f85facfcea1824755ea9742e8a1617b43..7f402d12b42c5c7a2d9954134e3832b4b6bbd245 100644 GIT binary patch delta 695 zcmV;o0!aPX1%U>TB#|)~3c>&Y4#EKyC`y2lQz3sbNAp5A0007gNklk|O$-5~fC|=PZTqP|xQChh<<7jzbIy55W!%j;O4^pJ z_no|7l!ooJtBOx^?PXQFyJh+=rE*s)moNn5b#4CIl14N*RljYe=eQmPX-DR_Gj<+I zhXsGP9Mz&AFW0l5HvWaa#(#R9mah`dLfTemvCUFw-@phbhLTbfFS> zXfqBg%2i0Atz$za3Tjio(6f?qqcZ6Mrn#Qp3|#alRZe`2QkIzaw7jE`*4xf`e>~&L z--Jp+s%K2G=-WBp$`~TP?w@D-=Z24mbkKjII|gNo#CY4#eWyI|#C=>_4&A@|o34re zoTmwgxUm{Fmt%Q*UmkT*UH!@s2<6D)dis?sYlmeq^iE)X2LR_{6`e3mc$lzp$lUp9 zOQJoU6bEiOY^OanZ8Vco{X(dm^9;1YH*Ow&sOGVX_H9VdyK1JT5Xf&nM%Cr8_4|Jb zatoe@5TxxrTt4}`7$$UH+C}-mNoxG1(jaHe3hF?G?b2rUxk_hUHP)Sf|C^Jt*1bh;AEs-;$o@xxgt!efIklBPc_F z!V>oTRt~}GIE2-xJ|8gC-lfWZYTR5lYlV)%4BO14*O>Leg9GIjLofq`APd|aZVP0w5p2kJ4BFLDolrRfI7;P2G|9VBnkm@Qb$4nuFf3kks%uj!vFvd!vV){sAQ2wA%8G1^m3s900Kuz zL_t(IPbHCQbDCfjh52h~8l$#`P1%wC1=$xRB4VV~v`MCEn$F~F|7s7(%pC@}+jGvP zoIIHDv#hH(=Y722sJ^v~z4rGx>ziO(T(eUn_NM5yR+p}Bu8}H^TL{BW%!NFvfBsI(oJ{njtKBMs^tmCUbAQZzS;kJ-lvrpaE}mW$ z*XNefeS=jOn6dtGNRL|xRea+^=zCcHCPiu5mZ-UyUQ)Ekm|5Vj6K|a`ns_n2!uaOx z>F(bj+7e)Zn-YH=8ln05W(;#FjM+b*S9Jp18=1$L@>?sVCP!q(7D=4}m^VdMTi_7I+5ltJuHIA==4TR^(vqOk!ag zXNX0=JO1jM`*yf=`qU*4d$djGG)}udwYUST@t3pFh?$tFkImt>a8hq>2o%0Ie^0pL z>NZD@ov-d*AGHWd8ZZpN8L6Ins|pvkB>N_{e?F1*Kxhwc(3=T~4;wI$Du$=S1s!F? zPn6gJGYq68N6|z3@cNU~iRfzYfAuSRtOORnl+XZ9NC!Ep-6EhEb&dvreHewmNEiJU l?`Vc;pbB>tMB_z^tpDrRGnr%isyhGx002ovPDHLkV1ncoHy{82 diff --git a/resources/assets/biomesoplenty/textures/blocks/stalactite.png b/resources/assets/biomesoplenty/textures/blocks/stalactite.png new file mode 100644 index 0000000000000000000000000000000000000000..ce063466d58a9dc06015a0e027972e7e95f34eb3 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kvi!&T^vI!{NGN9i&W45jbf7ef*DQ>m-&8g-XfgST z@#pe6nj9?p_BDQ7q;cu-x^o|Dq|KviEnT^vI!{O<;NbF~=o%zezM=c2{c)zx7yB2u!jqa)f}&hjw#wZIu= zhNn4OmQ~K*vUI(DPol&No%-%w>$b85io9fhQn^l*L-9(5%<+_2%dRQ#IB(MNK5NL+ zY;!(XC}DvtQ-G_-IR=^I3srI=uM(&ye+r&gm7etgTe~DWM4f-%yg= literal 0 HcmV?d00001 From a95fab3e4fd2debc723ad555f9fde457ce9fd30d Mon Sep 17 00:00:00 2001 From: Matt Caughey Date: Thu, 7 Nov 2013 21:42:14 -0500 Subject: [PATCH 4/5] Tweaked reed gen a bit --- common/biomesoplenty/worldgen/WorldGenWaterReeds.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/biomesoplenty/worldgen/WorldGenWaterReeds.java b/common/biomesoplenty/worldgen/WorldGenWaterReeds.java index 01bcf6087..67b240415 100644 --- a/common/biomesoplenty/worldgen/WorldGenWaterReeds.java +++ b/common/biomesoplenty/worldgen/WorldGenWaterReeds.java @@ -20,11 +20,12 @@ public class WorldGenWaterReeds extends WorldGenerator if (par1World.isAirBlock(var7, var8, var9) && par1World.getBlockId(var7, var8 - 1, var9) == Block.waterStill.blockID) { - for (int var900 = 5; var900 > -5; --var900) + for (int var900 = 2; var900 > -2; --var900) { + if (par1World.getBlockId(var7 - var900, var8 - 1, var9 - var900) != Block.waterStill.blockID && par1World.getBlockId(var7 - var900, var8 - 1, var9 - var900) != Block.waterMoving.blockID) { - par1World.setBlock(var7, var8, var9, Blocks.plants.get().blockID, 14, 2); + par1World.setBlock(var7, var8, var9, Blocks.plants.get().blockID, 14, 2); } } } From 18c8d9ea6d0926d2bc234d9ed38de7111dd3b69e Mon Sep 17 00:00:00 2001 From: Matt Caughey Date: Thu, 7 Nov 2013 22:16:32 -0500 Subject: [PATCH 5/5] Started on the bird mob --- common/biomesoplenty/ClientProxy.java | 7 ++ common/biomesoplenty/api/Entities.java | 2 + .../configuration/BOPEntities.java | 13 +++ .../configfile/BOPConfigurationIDs.java | 2 + common/biomesoplenty/entities/EntityBird.java | 94 ++++++++++++++++++ .../entities/models/ModelBird.java | 2 + .../entities/render/RenderBird.java | 28 ++++++ .../biomesoplenty/textures/mobs/bird.png | Bin 2304 -> 1993 bytes 8 files changed, 148 insertions(+) create mode 100644 common/biomesoplenty/entities/EntityBird.java create mode 100644 common/biomesoplenty/entities/render/RenderBird.java diff --git a/common/biomesoplenty/ClientProxy.java b/common/biomesoplenty/ClientProxy.java index 7f80e7c87..fdd5a5bdf 100644 --- a/common/biomesoplenty/ClientProxy.java +++ b/common/biomesoplenty/ClientProxy.java @@ -16,6 +16,7 @@ import biomesoplenty.blocks.renderers.PuddleRender; import biomesoplenty.blocks.renderers.RenderUtils; import biomesoplenty.blocks.renderers.SmallBlockRenderer; import biomesoplenty.configuration.configfile.BOPConfigurationIDs; +import biomesoplenty.entities.EntityBird; import biomesoplenty.entities.EntityGlob; import biomesoplenty.entities.EntityJungleSpider; import biomesoplenty.entities.EntityPhantom; @@ -23,6 +24,7 @@ import biomesoplenty.entities.EntityRosester; import biomesoplenty.entities.EntityWasp; import biomesoplenty.entities.projectiles.EntityDart; import biomesoplenty.entities.projectiles.EntityMudball; +import biomesoplenty.entities.render.RenderBird; import biomesoplenty.entities.render.RenderDart; import biomesoplenty.entities.render.RenderGlob; import biomesoplenty.entities.render.RenderJungleSpider; @@ -76,6 +78,11 @@ public class ClientProxy extends CommonProxy { { RenderingRegistry.registerEntityRenderingHandler(EntityWasp.class, new RenderWasp()); } + + if (BOPConfigurationIDs.birdID > 0) + { + RenderingRegistry.registerEntityRenderingHandler(EntityBird.class, new RenderBird()); + } RenderingRegistry.registerBlockHandler(new FoliageRenderer()); RenderingRegistry.registerBlockHandler(new PlantsRenderer()); diff --git a/common/biomesoplenty/api/Entities.java b/common/biomesoplenty/api/Entities.java index dd4eb4910..3ae8ed632 100644 --- a/common/biomesoplenty/api/Entities.java +++ b/common/biomesoplenty/api/Entities.java @@ -7,6 +7,8 @@ public class Entities { public static Class JungleSpider = getClass("biomesoplenty.entities.EntityJungleSpider"); public static Class Rosester = getClass("biomesoplenty.entities.EntityRosester"); public static Class Glob = getClass("biomesoplenty.entities.EntityGlob"); + public static Class Wasp = getClass("biomesoplenty.entities.EntityWasp"); + public static Class Bird = getClass("biomesoplenty.entities.EntityBird"); public static Class getClass(String inputstring) { diff --git a/common/biomesoplenty/configuration/BOPEntities.java b/common/biomesoplenty/configuration/BOPEntities.java index e791090f7..05f2fa8f7 100644 --- a/common/biomesoplenty/configuration/BOPEntities.java +++ b/common/biomesoplenty/configuration/BOPEntities.java @@ -7,6 +7,7 @@ import net.minecraft.entity.EnumCreatureType; import biomesoplenty.BiomesOPlenty; import biomesoplenty.api.Biomes; import biomesoplenty.configuration.configfile.BOPConfigurationIDs; +import biomesoplenty.entities.EntityBird; import biomesoplenty.entities.EntityGlob; import biomesoplenty.entities.EntityJungleSpider; import biomesoplenty.entities.EntityPhantom; @@ -98,5 +99,17 @@ public class BOPEntities { registerEntityEgg(EntityWasp.class, 16434729, 2500135); } + + if (BOPConfigurationIDs.birdID > 0) + { + EntityRegistry.registerModEntity(EntityBird.class, "Bird", BOPConfigurationIDs.birdID, BiomesOPlenty.instance, 80, 3, true); + + registerEntityEgg(EntityBird.class, 16434729, 2500135); + + if (Biomes.promisedLandForest.isPresent() && Biomes.promisedLandSwamp.isPresent() && Biomes.promisedLandPlains.isPresent()) + { + EntityRegistry.addSpawn(EntityBird.class, 8, 1, 1, EnumCreatureType.ambient, Biomes.promisedLandForest.get(), Biomes.promisedLandSwamp.get(), Biomes.promisedLandPlains.get()); + } + } } } diff --git a/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java b/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java index 6c34c2e7a..4b2a3e9ca 100644 --- a/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java +++ b/common/biomesoplenty/configuration/configfile/BOPConfigurationIDs.java @@ -298,6 +298,7 @@ public class BOPConfigurationIDs public static int globID; public static int phantomID; public static int waspID; + public static int birdID; public static void init(File configFile) { @@ -478,6 +479,7 @@ public class BOPConfigurationIDs globID = config.get("Mob IDs", "Glob ID", 106, null).getInt(); phantomID = config.get("Mob IDs", "Phantom ID", 107, null).getInt(); waspID = config.get("Mob IDs", "Wasp ID", 108, null).getInt(); + birdID = config.get("Mob IDs", "Bird ID", 109, null).getInt(); //Projectile IDs entityMudballID = config.get("Entity IDs", "Mudball ID", 103, null).getInt();; diff --git a/common/biomesoplenty/entities/EntityBird.java b/common/biomesoplenty/entities/EntityBird.java new file mode 100644 index 000000000..0ce0a03ac --- /dev/null +++ b/common/biomesoplenty/entities/EntityBird.java @@ -0,0 +1,94 @@ +package biomesoplenty.entities; + +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class EntityBird extends EntityFlyingMob +{ + public int courseChangeCooldown; + public double waypointX; + public double waypointY; + public double waypointZ; + + public EntityBird(World world) + { + super(world); + this.setSize(1.0F, 1.0F); + } + + @Override + protected void updateEntityActionState() + { + double d0 = this.waypointX - this.posX; + double d1 = this.waypointY - this.posY; + double d2 = this.waypointZ - this.posZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + + if (d3 < 1.0D || d3 > 3600.0D) + { + this.waypointX = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 4.0F); + this.waypointY = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 4.0F); + this.waypointZ = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 4.0F); + } + + if (this.courseChangeCooldown-- <= 0) + { + this.courseChangeCooldown += this.rand.nextInt(2) + 2; + d3 = (double)MathHelper.sqrt_double(d3); + + if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) + { + this.motionX += d0 / d3 * 0.1D; + this.motionY += d1 / d3 * 0.1D; + this.motionZ += d2 / d3 * 0.1D; + } + else + { + this.waypointX = this.posX; + this.waypointY = this.posY; + this.waypointZ = this.posZ; + } + } + + this.renderYawOffset = this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI; + } + + private boolean isCourseTraversable(double par1, double par3, double par5, double par7) + { + double d4 = (this.waypointX - this.posX) / par7; + double d5 = (this.waypointY - this.posY) / par7; + double d6 = (this.waypointZ - this.posZ) / par7; + AxisAlignedBB axisalignedbb = this.boundingBox.copy(); + + for (int i = 1; (double)i < par7; ++i) + { + axisalignedbb.offset(d4, d5, d6); + + if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) + { + return false; + } + } + + return true; + } + + @Override + protected String getLivingSound() + { + return "biomesoplenty:mob.wasp.say"; + } + + @Override + protected String getHurtSound() + { + return "biomesoplenty:mob.wasp.hurt"; + } + + @Override + protected String getDeathSound() + { + return "biomesoplenty:mob.wasp.hurt"; + } +} diff --git a/common/biomesoplenty/entities/models/ModelBird.java b/common/biomesoplenty/entities/models/ModelBird.java index dbc3fffea..b48b0ba6a 100644 --- a/common/biomesoplenty/entities/models/ModelBird.java +++ b/common/biomesoplenty/entities/models/ModelBird.java @@ -93,6 +93,7 @@ public class ModelBird extends ModelBase setRotation(LegRight, 0F, 0F, 0F); } + @Override public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); @@ -117,6 +118,7 @@ public class ModelBird extends ModelBase model.rotateAngleZ = z; } + @Override public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) { super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); diff --git a/common/biomesoplenty/entities/render/RenderBird.java b/common/biomesoplenty/entities/render/RenderBird.java new file mode 100644 index 000000000..a2040157c --- /dev/null +++ b/common/biomesoplenty/entities/render/RenderBird.java @@ -0,0 +1,28 @@ +package biomesoplenty.entities.render; + +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import biomesoplenty.entities.models.ModelBird; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderBird extends RenderLiving +{ + public RenderBird() + { + super(new ModelBird(), 0.25F); + this.shadowSize = 0.0F; + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) + { + return new ResourceLocation("biomesoplenty:textures/mobs/bird.png"); + } +} diff --git a/resources/assets/biomesoplenty/textures/mobs/bird.png b/resources/assets/biomesoplenty/textures/mobs/bird.png index 3cd2bbe4bd6f8443d39bdde89f88ebc126f8f149..1f5b802457cf55060559482c783b72d7026c6b69 100644 GIT binary patch delta 1918 zcmV-^2Z8v263GvcJPN=701m(bYSxJfkwz$g2SrIlK~!i%)mdqCQ&kw|A1NZ0($Y4` zy=j{5HcJbojE*y?BLgi^DBTxG7Yewti0dbvaR6CHoN@Pq<2OeUTiUE`ma^l5mLyH` z_?+u4VqnZxT6|{C+~B|i+-rlV!*1Es|qtf!->1|E1o`$?7nte8f+s8SbIXK zAG`*)Cj+^I_ahnDdauGY3P`P&VAwT(iN^gv<8Z3zhwAJS3SeW>dVQ_;(4pvTR<5tP61J?x!+=vyY?rXd=JiYLKhuz^mo?g^r{CkQvAFT1Zz zD-CkHALhXnl;Je&Lm4>eZDn772IX5Ou>MuRJ{%_}%)>S?564J)Ne$4UJWuOH5+ zCslS|n^qc>(KL*^reNG2KwZ}~HoQVB_sziE7l)x^nqxur!Hol#QQIC`bOYGAuBj)C z+Agn3zV`kEES?nX`%|#;M9L-CmMI<%hP7e0Up?w%DlD~3sC(Y#nZu@kqkw~vA$J6z zbVuNNNL!%nxicu+#Mbm7oSrMF+3ACB%Q&Pqzxupf@{-U%k1Jzo)C;0xv+PTvS%m&b zoP;<_Loh)NS!v)7+}vlzb{`CUcoWyM(>UvP zj;k5sQ!h@y!6Zp!hk`s^Bqis;49r9GG+bd^vG&<>^zccPHGc%%=Cd$&hM18CVd7TI zNB%&Vd!wk@Ld6)~?xCBII|FFgpMi0=7nc4xSh_-R@}>1{0XV3C?9<2S{cb<^To?^w zB)(xPzbimRFYtj;n8*bpD-? zD~pt5VUZUB>!1fn;A=r6!jbRH3oY11A$1d|I!7tAggUNF62e8K$r z$csimc$|uV2CgOGok?Mq%3t*Vi5XtK;iWTxU~<9eg4qSbt4x1SrI$-yG$vzdOw495 z6`Dts`(A8;F!z3xTO!1JZQ4VJU~<9eg4qSb3#QjZDsst-#&|eR#*eEC&ocb|f&g!% z5twBJTwl6VVAJYpYi$$@CL`;VLNnc4##+Xn{&l=^kf`wegholys;1FaP)iz$G-*+o=aow zObSQN7XN8%+2Gj6tk9F-QNna}U=C96RT$gCsMt2nTz>J(+(!-~@3*m-X%wk1t36|T zjJ1M)7X}_L*1i%lss{kKK89!=@7_?GHoUyB^e3@iD_ELY<<;yApkk{RYg+;^b^J$F zRRli&?nm6)wBhB2bvU7Z=5~sVig|U}3zK;A`JbTMK8f z&+5*(7kGx%om$z6Z+_eg)}aIxR&3&r4+pD%M%zFV4%YJGyP%Wf3dgi%@`g}UczZ$l zg(k)p46&rfu!|2Ae}6cHljW~6nuM`0j`bXKvAR;m)U#gw($mPck#j6VN%do+M6OU5 z$pKvW;O;zepWWAPmj|Zy5M)+Ra$5*BE#r_o{g7KHpliJZsf~3zYkHX_rKLZj@`0&o zXByHDFXZ+a*gEs$1Wcd$M`7M)_qE&QLv@vm^73lv^y^SrmiwQWLUC_MXNUNbhWmq1 zSzV1fvk4}}hMF1~dcB^;Si7h%^++3FDe&kTV8x2R0RLex{^#M;+W-In07*qoM6N<$ Eg3Z{qr2qf` delta 2232 zcmV;p2uJtH4}cPoJPN@801m+cxRGn^kwz$g2z*IIK~!i%-C1dKQ`Z^h2Xz{P6N4;o zlCJj6+H4C`r!)%_0^S#S-{b`cx&mpsexOa8vcz~oI&IRVA3FWkX;Sc}#getyn2>Zy zF_taq>2of!$&dvb3!CXXbLL*3dvwmbzt4NTZ>wY&Ou=;qF!AX=4d}Z*gUg?R^Sh9L z|91Zn@SfxMo(QVH2jqUXZBmtLAxYA>GrezkDJiKxw z{m6%^Y!WmY)wX`Gq9F>r7jdBGEtIy!QB6ZAU%3uTR}@zNdVUn(9H3xAIBxExyH_(D z?EW=ac!1HLf~GYH2R%X4F%K)(<$ks$k~9+3WojIHT7hQ^pM^$M0-auu^71l&6e|xs zbT3P19Q)mG;=tjH&^FJ()EPtBOYcB=bP~qSaDEhE_pid_n}>_>uI3?jdV+=S?i^0T z+{^qhPKD4DDh84agJ6CR-6EM8^M;;G7C!8w@B4=)ZsVD4Ff z)DVQRCq_Y+;GxA$J#i?G{SCH%ju6y!vv5-pp5Z*j-4>~uMzOTdL*G3QH@&aG@te)_ z57u7I4=>ub5KIGU*hez34QJt?we3S$D2`8~>IZ;rWR*E#9oGJJI7TzOs(>0+oeChDwQy$dk)u0rFBa&8`ff|1JpCFt8C zc~^jq`x?4q(02yp zT0?TF(^6omZd#6ctA7PY&I1m5hSnE`y(Zw^4+9)fi+4G+%|LkKCp6;xhC>9;0O`odKz>I%vlW}$AFK}kd4tNE!s zOSh%#s_H_}_D~qQl!kz(v`&O+G5=4+JexK zIWPCJQ8^_|Q!+w4`0_Ly1W5uNisUJ*;yj&&X?UHA+g`3HVp%IZatVbsSD>Phrj7^^ z={%9&!sb3YVi8@_9L&Tb6$}x91P{OVH3l*DBv5*sg3-O*!=FIg5r*d!OG#@0=Drn} zJ0ozCX?1fL4hma;%gxMPA=vt3@QgF@jZpZOFa`aH3?*P-E)b}2!~LA6Gcpqr_j8VA z|BjkcM%0m_SI=c~{2% zMk>zBd24@y0BD^;a=c1x(3gdwEll(ngSM6Xu|&x@p*IFgN0e4ufygU4Hnv5@FHS;v zd;+Qy*I{g$VZ2A76gi0kD;sI3obqkL%ZO9#Oq#i$ZlC5B)0m5A5lXHhlt?4`DG*%F zA{Yk(H+Qgq@ixiA(rRa!vx=I}(D5>K^<4>iY=~8dz^rExMk?Iiw**D)B);LgkRRTH zF(G^!e-Ez8&){+ffh8dFFDih_$Sr&9q!V7`i=p`C8z^gvK=J%F=7Y=FU-gE}g9y`V zCgoa=A|^knB?x`X*SP*xY2g+HrR9_V0pgzl3m*f2^PG!P3De2lQ-GUs?qaDGVd!Sq zs+rj>EV;SQ`_xRj6@3Y)>Zh0>e~_pSx16#FG3*3*iSGdB7Dy+d+elT^|7+NTG^0& zv*H4=!2L@QLC-NM+J@GdAn)N82m2MF3{4|{t3=Zda=}z=l^K6k7I=~F9})@hb_U@^ zdceoKR|WQrLM(S;1e00JvjWWDWEEgF2*fg&iRJ0GWiRRc`@p$tDV+Ti@YBBlufNOj z9&r8-z%T#E=R3fUIrnppGnZHJ8lOMoTJapaw2Ghn892*z<8Q3s{Ix7z{{T2WnZfvf zL>lL=KKj+zo{?jSsL-Ecvq2QqzXGXe8M@{elqaW%<@4X>K5--fg_X@rrGUQ7y1KR` zdxZeYN`(FYQeG8+Pv3?ZzF*vyM{as=$=tVws$9cT!!ED9DGcR_0E+6u?5pp0UHPDQ z|N0?5KXTK1OO}z8e9i6Tu(F*jJT{AeXI}aTYwIi&^*8d$>IE^#j?(3YKZxox&gLQrAt4dFM2nA=dq zt}4SuL7jAUzQW1&*FLreUGFNYIOjUWR&rdf_3}+mCC6c|F%PfFmyZ&2g}ljsLkJ(; zYghz{_s@u~*FB(p`~C+DPA=(Uo%`Vc0000