From 509872483eb4c1752932b2de184388af191416a8 Mon Sep 17 00:00:00 2001 From: Cheeserolls Date: Wed, 29 Apr 2015 12:26:22 +0100 Subject: [PATCH] Add honey fluid - Currently does not render! Seems like this is a problem affecting all forge fluids in 1.8 --- .../biomesoplenty/api/block/BOPBlocks.java | 3 + .../client/handler/ModelBakeHandler.java | 21 +++++ .../common/fluids/blocks/BlockHoneyFluid.java | 32 +++++++ .../biomesoplenty/common/init/ModBlocks.java | 78 +++++++----------- .../textures/blocks/honey_flowing.png | Bin 0 -> 7281 bytes .../textures/blocks/honey_flowing.png.mcmeta | 5 ++ .../textures/blocks/honey_still.png | Bin 0 -> 6760 bytes .../textures/blocks/honey_still.png.mcmeta | 45 ++++++++++ 8 files changed, 135 insertions(+), 49 deletions(-) create mode 100644 src/main/java/biomesoplenty/common/fluids/blocks/BlockHoneyFluid.java create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png.mcmeta create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/honey_still.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/honey_still.png.mcmeta diff --git a/src/main/java/biomesoplenty/api/block/BOPBlocks.java b/src/main/java/biomesoplenty/api/block/BOPBlocks.java index 348cf1175..92d4305e2 100644 --- a/src/main/java/biomesoplenty/api/block/BOPBlocks.java +++ b/src/main/java/biomesoplenty/api/block/BOPBlocks.java @@ -9,6 +9,7 @@ package biomesoplenty.api.block; import net.minecraft.block.Block; +import net.minecraftforge.fluids.Fluid; public class BOPBlocks { @@ -130,4 +131,6 @@ public class BOPBlocks public static Block honey_block; + public static Block honey; + public static Fluid honey_fluid; } diff --git a/src/main/java/biomesoplenty/client/handler/ModelBakeHandler.java b/src/main/java/biomesoplenty/client/handler/ModelBakeHandler.java index 0faffa871..8a821df9f 100644 --- a/src/main/java/biomesoplenty/client/handler/ModelBakeHandler.java +++ b/src/main/java/biomesoplenty/client/handler/ModelBakeHandler.java @@ -8,21 +8,29 @@ package biomesoplenty.client.handler; +import java.util.ArrayList; +import java.util.List; + import biomesoplenty.client.model.ModelBiomeFinder; import biomesoplenty.client.texture.TextureAnimationFrame; import biomesoplenty.client.util.TextureUtils; +import biomesoplenty.core.BiomesOPlenty; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.util.IRegistry; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class ModelBakeHandler { public static final ModelResourceLocation BIOME_FINDER = new ModelResourceLocation("biomesoplenty:biome_finder", "inventory"); + public static List fluidsToTextureStitch = new ArrayList(); + private TextureAnimationFrame[] biomeFinderFrames; @SubscribeEvent @@ -31,6 +39,19 @@ public class ModelBakeHandler TextureMap map = event.map; biomeFinderFrames = TextureUtils.splitAnimatedTexture(map, "biomesoplenty:items/biome_finder", 12); + + for (String name : fluidsToTextureStitch) + { + Fluid fluid = FluidRegistry.getFluid(name); + if (fluid == null) + { + BiomesOPlenty.logger.error("No fluid found with name "+name); + } + else + { + fluid.setIcons(map.getAtlasSprite("biomesoplenty:blocks/"+name+"_still"), map.getAtlasSprite("biomesoplenty:blocks/"+name+"_flowing")); + } + } } @SubscribeEvent diff --git a/src/main/java/biomesoplenty/common/fluids/blocks/BlockHoneyFluid.java b/src/main/java/biomesoplenty/common/fluids/blocks/BlockHoneyFluid.java new file mode 100644 index 000000000..12ae29f38 --- /dev/null +++ b/src/main/java/biomesoplenty/common/fluids/blocks/BlockHoneyFluid.java @@ -0,0 +1,32 @@ +package biomesoplenty.common.fluids.blocks; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidFinite; +import net.minecraftforge.fluids.Fluid; + +public class BlockHoneyFluid extends BlockFluidFinite +{ + + public BlockHoneyFluid(Fluid fluid) + { + super(fluid, Material.water); + this.setLightOpacity(1); + } + + // TODO: check we need this - Does Forge's fluid already handle it through viscosity? + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, Entity entity) + { + if (entity instanceof EntityLivingBase) + { + ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 2)); + } + } + +} \ No newline at end of file diff --git a/src/main/java/biomesoplenty/common/init/ModBlocks.java b/src/main/java/biomesoplenty/common/init/ModBlocks.java index e7b8eadae..adbbd84ce 100644 --- a/src/main/java/biomesoplenty/common/init/ModBlocks.java +++ b/src/main/java/biomesoplenty/common/init/ModBlocks.java @@ -12,67 +12,28 @@ import static biomesoplenty.api.block.BOPBlocks.*; import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.statemap.IStateMapper; +import net.minecraft.client.renderer.block.statemap.StateMap; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemSlab; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fluids.BlockFluidBase; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.registry.GameData; import net.minecraftforge.fml.common.registry.GameRegistry; import biomesoplenty.api.block.BOPWoodEnums.AllWoods; import biomesoplenty.api.block.IBOPBlock; import biomesoplenty.api.item.BOPItems; -import biomesoplenty.common.block.BlockAsh; -import biomesoplenty.common.block.BlockBOPDirt; -import biomesoplenty.common.block.BlockBOPDoor; -import biomesoplenty.common.block.BlockBOPDoubleWoodSlab0; -import biomesoplenty.common.block.BlockBOPDoubleWoodSlab1; -import biomesoplenty.common.block.BlockBOPFence; -import biomesoplenty.common.block.BlockBOPFenceGate; -import biomesoplenty.common.block.BlockBOPFlower1; -import biomesoplenty.common.block.BlockBOPFlower2; -import biomesoplenty.common.block.BlockBOPGeneric; -import biomesoplenty.common.block.BlockBOPGrass; -import biomesoplenty.common.block.BlockBOPHalfWoodSlab0; -import biomesoplenty.common.block.BlockBOPHalfWoodSlab1; -import biomesoplenty.common.block.BlockBOPLeaves0; -import biomesoplenty.common.block.BlockBOPLeaves1; -import biomesoplenty.common.block.BlockBOPLeaves2; -import biomesoplenty.common.block.BlockBOPLeaves3; -import biomesoplenty.common.block.BlockBOPLeaves4; -import biomesoplenty.common.block.BlockBOPLeaves5; -import biomesoplenty.common.block.BlockBOPLilypad; -import biomesoplenty.common.block.BlockBOPLog0; -import biomesoplenty.common.block.BlockBOPLog1; -import biomesoplenty.common.block.BlockBOPLog2; -import biomesoplenty.common.block.BlockBOPLog3; -import biomesoplenty.common.block.BlockBOPMushroom; -import biomesoplenty.common.block.BlockBOPPlanks; -import biomesoplenty.common.block.BlockBOPPlanks0; -import biomesoplenty.common.block.BlockBOPSapling0; -import biomesoplenty.common.block.BlockBOPSapling1; -import biomesoplenty.common.block.BlockBOPSapling2; -import biomesoplenty.common.block.BlockBOPStairs; -import biomesoplenty.common.block.BlockBOPStone; -import biomesoplenty.common.block.BlockBOPVine; -import biomesoplenty.common.block.BlockBamboo; -import biomesoplenty.common.block.BlockBones; -import biomesoplenty.common.block.BlockCoral; -import biomesoplenty.common.block.BlockCrystal; -import biomesoplenty.common.block.BlockBOPDoublePlant; -import biomesoplenty.common.block.BlockFlesh; -import biomesoplenty.common.block.BlockBOPPlant0; -import biomesoplenty.common.block.BlockBOPPlant1; -import biomesoplenty.common.block.BlockFruit; -import biomesoplenty.common.block.BlockGem; -import biomesoplenty.common.block.BlockGemOre; -import biomesoplenty.common.block.BlockHive; -import biomesoplenty.common.block.BlockHoney; -import biomesoplenty.common.block.BlockMud; -import biomesoplenty.common.block.BlockStoneFormations; -import biomesoplenty.common.block.BlockTurnip; +import biomesoplenty.client.handler.ModelBakeHandler; +import biomesoplenty.common.block.*; import biomesoplenty.common.command.BOPCommand; +import biomesoplenty.common.fluids.blocks.BlockHoneyFluid; import biomesoplenty.common.util.block.BlockStateUtils; import biomesoplenty.common.util.inventory.CreativeTabBOP; import biomesoplenty.core.BiomesOPlenty; @@ -227,6 +188,25 @@ public class ModBlocks honey_block = registerBlock( new BlockHoney(), "honey_block" ); + + // TODO: make the honey render! at the moment, no forge fluids are rendering in 1.8, they're invisible + honey_fluid = new Fluid("honey"); + honey_fluid.setViscosity(1500); + FluidRegistry.registerFluid(honey_fluid); + honey = registerFluidBlock(honey_fluid, new BlockHoneyFluid(honey_fluid), "honey"); + + } + + + public static Block registerFluidBlock(Fluid fluid, BlockFluidBase fluidBlock, String name) + { + Block block = GameRegistry.registerBlock(fluidBlock, null, name); + // use a custom state mapper which will ignore the LEVEL property + IStateMapper custom_mapper = (new StateMap.Builder()).addPropertiesToIgnore(new IProperty[] {BlockFluidBase.LEVEL}).build(); + ModelLoader.setCustomStateMapper(block, custom_mapper); + fluid.setBlock(fluidBlock); + ModelBakeHandler.fluidsToTextureStitch.add(name); + return block; } diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png b/src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..b5865f15bb997e5241572aacca5e312f8f6e8bf9 GIT binary patch literal 7281 zcmb7pc{o)6-~KEZG8jv?$k?XFI@8#bod%i9(6NSh9<#%#cXdWDAKjV^^7p zhO8y~S|4N^*`De1eXi^K{Qms?ajtXDT<4E7=YHSI>wYI*ICqxki1-lz0Kj98HL+%$ z;Q#;#z{$b7nl`_=%sR1o7+M(u05xgcdoJv(d#(VieINk94f}flD`ejXvwjp0GQARH zUQX!O~2BTWF{*e`Pv!%HDfzjEm>{kv~<_J)xY zpr;ZAK+!~K4fwc%AU~F)^#$=Pd4@e&%H;A-IQzU#Y=FV}=`i&Ve=2OhzT0j*%Up7X zu`^h_&yhy=O^9^; z5=-6fW<9%hH)A6W=Q&5+=|`n+X#YGh>SLw9Icd|(95p5GH+;Cy(W>xCol>fU2snbI5o{EW$+ zlm{4);7H?)vAbapM8H7mesA9C(ZoFzc~Ti5Ae*~?z5nCcC#Q;=X!~mnxWnxhsFcXb zE92ptb}j~&j92GY+Jh`*`~RGwqyaE{f}JucuEiu?BQ!GZ_gXLbdicR8CPjBzczYl*-! zdj~nr2m>12nu9naK8Pyo-yO-BlsDj1KBN5#KlvShHn?y*Abrtsy$!lnA{787t!{ux z3sJj-r2l@IRp9oHP~;yV7XXI9eoCL&`u=RX)1alFZ{|NQy$Cs{4+k1~E`D@j=U(AB z{ZjUQd<;^19qNnM)M#(+vCERJx>+<3tqwMxeCV<4tTTsxe=bJZcpX9Or=!Ju~XuyKc<84ru`}j0b7*C|u z&jP(+CNi%Ng>U^@9uXZJY)zXMjFp$H)kO2*5`HG#tP=En+&wgjX=Vcq+m;tLth}k0 z57u*a{$8cd;sdcz^`o@`+ZN)$^qq1+=eLKv@8={??cMB!4?tb`Gt;LVKBIn%BaT{m zF(9TyF(mY0y30+}+a1!y{cswDdX^5A36Zx(47SR{gy?DH6%Ubi0LH}L7%n13{wTN!IO>}@XE;jpxpyD zfKwMspRuS~#AWTxYr_wea~Q#JR>uvV*T+MBmM6N`xY{xvjO36Y2$MUe4MSXSK20yL ziaCJ*KVRB1#_o=dX8hRze<|ckV#&%PB!U^yLWu!B^s>6cA@1O_c z%uBT|a>=ELrh9i+>j7!g-_x&n1F+ux=C{dQR29JP?23l!x)Alq!y?)Aq(m!-AdY)D z0$Qs6nKYT_TPd?OVSfzK<*$jqspfMf%!Uwt0eJ!KJwe|~M#N>M`$`*Kpf2wEgujKXAkzTw3~*HpzbGWzZ*RTQ==`@6is z9XJ^O-d|hMl#}15#5HE$x@}K$`}2yv>V;jsZfVxXw0CGp|1w%|G)&x6xEMpQ$AfFk zfvu63UT2J&7K#~mKi9*@ZEy3mC&ay05JmicrNDtX0?lW9z&Z4@e8o_P=Z=178cZ<( zPvnpf_w?qAgRhJF|h$gnlOv$)7)m+SFGuzb80*kQi7qEPU~)i zFDjnwg=WaV&Wg-wBy;%AS(GF7?qh+I`G&{9#-39}_O@EQ%C%S5rS(8C7|9|qA(2su zm!>s6YwYeRjF6i0=lPf+VD(hPwXM{nF34m%LQ1Qp1m>c_`K1fdQDQDFh`}4Eoo*P* z>ifJJEP@s14-Wn>%={7Y0!dsO zeAn%_G$k6va5D)Ny)GjninfQRj`vPt2#(#Z1tNkqlYo&TKMqD*sr%~Bb`R!DaHw?J z`;$mJ{4GFCI9fgM3%`lttb54S76kBQo|ewebDJbieq3nyer>a6e-S&)BZR9(#yth` z&HG%Hj1dFXGZb~E;Bj=of0*>we?Y|29yNQ_Hp0)X=>gGN(PJmOfDlQKY%+RHQUEP z8e9fD9ba}1%cWYBII@tz_F4fbTU!jKZ|^v`3#JNm!oDFOZODzd(weRMIWci`?$pHQRasvXs7N|0!)HEX zDhmyQ-Tk9bFb`=wCsSW($A4Ze z12=~lAM`)9cuf4gaK^I2zSwg0@fNt5&65hxO=ADDGq=vZs@8a=en_1(lyc5HSvc&`bZCRO>|PR z4z}3jx<239OR(d673I-O+;}q`PN^mBje^z&V}iKA`)|?iJY(;;oO>S z!iIH5!+_#CTJ#(%mv&(*YB;e}g!22MnKVg3?3Nn_Nq=-FeA#MsS>?m44SSl2 zT7ZFbGb1lb%Cxlj(hjU!#D{>dcK* zPIHZel$2)_X~BP@&K0qvWF;@%m)}5dvtl1h&Q5Xzd<@t!L$}35P874)Eq8mV`AOEZ)$3d~_b;LyL za!WT%DPeA8MU{;-p=_|rVb=;Ve55l#DP1)a?j z(bRZWLR9)h&;_GDFq~Qkpx-XsE=n@r@(Af9wiI#|XPPKYsdCmfILdj_y8S8->4Z3{ zy4)`*NUE6(8UIQ8z+c%!OKr<H=`bhGyCN+I~*Zl&fcY5hOM) z_{z?R)f~)Oe?Y-Vgc6zHWJl6U^UzJ&+AHm{pHop4~c8+AGc(e^4iis5y} zUk$wsRRxX`Q1}6Ma1AF;iN|_*6L-Onr&GuobS?HApTZOH*%Z@e3r|z6*8Zb@NzR5O z?2{X=27RPqhZ{U*5>qk0UGLxOKF9)`${{~eMQ1ICjvvE|yW_5;7;CmW^Oy^MkE6XC zL~9loFI}7t#_om@sgBHb#RR-u^m!-yBhdlBP$yT>N_`7c(@%I>+RKiggj3E@GE z-t8{~{Lbdhn{xKYGUajx#Ucf8BufFokA(Bp>OAgocCao@X(gMyHEl;3QC*K8mU=T`O&vX7YHXyqTL9p%AQHp$a zqSL%aj00;x+rs$Xr0I0z{Y@V$Tz&X?Oj+IDHHi27ZD+xW-6>@Nw;$y={X_4OLR}lr z%AilrS#dah13NwOr8r@%flipMSyZ#}E`Ls%a^#XNq8V2c)OI02sYJjieUr$trV zMaLdUQxv52Zpi6NHdEg zF7BdNpexH-dLuNCu6K2fIB4a-?Sb7@G0KsL8mL71fopDR5Koe!#Y;L8k#!kEP{Jp+ z$MPKNaanJ(IB}7^DOP65urTlXex*J_?6;E zg(#0mu&RzHY7^#M^j6e9=hSj`eK#;-Xw^j`Kk8mQbMtJ?PmHqKWX2WT?#PPHhedWl zOwJ?=iwEDlPvT?Eu=e61j=NhWp6k!vb4B=I)v_byG~slza}23jWQ==Ama7OC=S#aDck|B%+#qOR7+>o0g!I9m=^cOqN~L0B?|8t~ zZmKbX0W$;L4L3`Mj&}~@NrPD~Is-?~BXXzwBZZPpF__FW`ZuE6YtISwy`MqZtd*ZW z217VB7sjl`f1kG@dcjb68))v*~F z*BhKNpy&a-xidPU-cuscggHJ@F4dPD?P00{J?*?5<6t8xbj_JH4YM?oQ>CuVv%Z6N zlCougGdc)Hqm3H9cD5qV#WB|&h*D-89A zK*o$Q%laudjiU<9<*rje$aumw3xN_|`~x=y^DAs$iq+Z%GDgG1XM#w*t8PF}whj}M z`9%ooF)8~w&W-vw?JmcA&DMVbQhj@)ZJxt7KZ^S+sSu5XquhC&iG?{a~ z%%EQDsijr$o>+V%^1OQuX~G7}7%3Ew7!=3zo~$Kn-%E8@P;k*{?*{R_9HC6#mi|!Z zj(JU0t4@ca%6)wrO+_2MY2(;2OJ&!;Z-g@j+pPezfvzuLp;@$YnbVjNt2=I8x z#Y0i+@61ize*!V_mGQhw0;gMc(N&G>pA>4>2`+7m_tz5~3;R-c~H1wQ~*6hDbsyLYu4Vx7_G9ge5=@ zLAuowK}un8fzAD4%Y$#`U#_s`F_^(zbYI8Jn)_!@K~{m`t6}K`sRw{r0xHMqJU_p^ zO`4Zz`RTE@^}o;#^{^hY(15=&le+WY{AdjsCakisR|XucOI5cjY2zlai0`)|+ zJ}Zi6u`5_vEMY&u`jCQ)7>nz?H{L%x!F(Kt<}+be;SlK`EnlEJNd3`bQI#%^^@KZo z#JRE&TW2RrFRRo>dK`$dy08?r6b_9AhoRbnkvy*T)7LNQ?df)$1(>JY0QLl3D^p~3 zw!5=B$-B=E^=BO(G`>iLAm3R0 zoMx6hIv-uMA1B;-!Q>#*$y>p9G#8l7xWltnE*-VX;GjNUSuG)Vr?`K^B6wlNWy{Gsec zowqxi-GN@XN85CWy4+@Dd^(LSYZ0s5lKbvU0i(2zH1!KK|7#KQDK@z#W?=(daS`)H ziM|z6%p3sv4;mPOza%LLBcMZfO}8RgSP1~|g)VBW`&wr%>=E#mE9eOMx z4HoHxRatCmIe0c#_nf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png.mcmeta b/src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png.mcmeta new file mode 100644 index 000000000..8e55e43ba --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/textures/blocks/honey_flowing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/honey_still.png b/src/main/resources/assets/biomesoplenty/textures/blocks/honey_still.png new file mode 100644 index 0000000000000000000000000000000000000000..6b69e8b2c8ea409f5c8b6d712880b5f3f84182cc GIT binary patch literal 6760 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