From aacba8e38e29ec07222d0ecc896ee7c64b82e012 Mon Sep 17 00:00:00 2001 From: kaydogz <42383791+kaydogz@users.noreply.github.com> Date: Mon, 15 Mar 2021 15:28:45 -0400 Subject: [PATCH] Add support for custom WoodTypes (#7623) --- .../net/minecraft/block/WoodType.java.patch | 14 ++ .../client/renderer/Atlases.java.patch | 25 ++++ .../SignTileEntityRenderer.java.patch | 11 ++ .../client/ForgeHooksClient.java | 1 + .../resources/META-INF/accesstransformer.cfg | 1 + .../debug/block/CustomSignsTest.java | 120 ++++++++++++++++++ src/test/resources/META-INF/mods.toml | 2 + .../blockstates/test_sign.json | 5 + .../blockstates/test_wall_sign.json | 5 + .../models/block/test_sign.json | 5 + .../textures/entity/signs/test.png | Bin 0 -> 1192 bytes 11 files changed, 189 insertions(+) create mode 100644 patches/minecraft/net/minecraft/block/WoodType.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/Atlases.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java.patch create mode 100644 src/test/java/net/minecraftforge/debug/block/CustomSignsTest.java create mode 100644 src/test/resources/assets/custom_signs_test/blockstates/test_sign.json create mode 100644 src/test/resources/assets/custom_signs_test/blockstates/test_wall_sign.json create mode 100644 src/test/resources/assets/custom_signs_test/models/block/test_sign.json create mode 100644 src/test/resources/assets/custom_signs_test/textures/entity/signs/test.png diff --git a/patches/minecraft/net/minecraft/block/WoodType.java.patch b/patches/minecraft/net/minecraft/block/WoodType.java.patch new file mode 100644 index 0000000000..9bb3324586 --- /dev/null +++ b/patches/minecraft/net/minecraft/block/WoodType.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/block/WoodType.java ++++ b/net/minecraft/block/WoodType.java +@@ -32,4 +_,11 @@ + public String func_227048_b_() { + return this.field_227045_h_; + } ++ ++ /** ++ * Use this to create a new {@link WoodType}. Make sure to register its rendering by enqueuing Atlases.addWoodType(...) during client setup.. ++ */ ++ public static WoodType create(String name) { ++ return new WoodType(name); ++ } + } diff --git a/patches/minecraft/net/minecraft/client/renderer/Atlases.java.patch b/patches/minecraft/net/minecraft/client/renderer/Atlases.java.patch new file mode 100644 index 0000000000..27380db9cc --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/Atlases.java.patch @@ -0,0 +1,25 @@ +--- a/net/minecraft/client/renderer/Atlases.java ++++ b/net/minecraft/client/renderer/Atlases.java +@@ -129,7 +_,8 @@ + } + + public static RenderMaterial func_228773_a_(WoodType p_228773_0_) { +- return new RenderMaterial(field_228746_e_, new ResourceLocation("entity/signs/" + p_228773_0_.func_227048_b_())); ++ ResourceLocation location = new ResourceLocation(p_228773_0_.func_227048_b_()); ++ return new RenderMaterial(field_228746_e_, new ResourceLocation(location.func_110624_b(), "entity/signs/" + location.func_110623_a())); + } + + private static RenderMaterial func_228774_a_(String p_228774_0_) { +@@ -156,5 +_,12 @@ + default: + return p_228772_1_; + } ++ } ++ ++ /** ++ * Not threadsafe. Enqueue it in client setup. ++ */ ++ public static void addWoodType(WoodType woodType) { ++ field_228750_i_.put(woodType, func_228773_a_(woodType)); + } + } diff --git a/patches/minecraft/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java.patch new file mode 100644 index 0000000000..8d3d701a96 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java ++++ b/net/minecraft/client/renderer/tileentity/SignTileEntityRenderer.java +@@ -89,7 +_,7 @@ + woodtype = WoodType.field_227038_a_; + } + +- return Atlases.func_228773_a_(woodtype); ++ return Atlases.field_228750_i_.get(woodtype); + } + + @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index b21c00e9c7..588dfd842e 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -164,6 +164,7 @@ public class ForgeHooksClient StartupMessageManager.mcLoaderConsumer().ifPresent(c->c.accept("Atlas Stitching : "+map.location().toString())); ModLoader.get().postEvent(new TextureStitchEvent.Pre(map, resourceLocations)); // ModelLoader.White.INSTANCE.register(map); // TODO Custom TAS + Atlases.SIGN_MATERIALS.values().forEach(material -> resourceLocations.add(material.texture())); } public static void onTextureStitchedPost(AtlasTexture map) diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index a73317bce4..aa1913715f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -93,6 +93,7 @@ public net.minecraft.block.WitherSkeletonWallSkullBlock (Lnet/minecraft/bl public net.minecraft.block.WoodButtonBlock (Lnet/minecraft/block/AbstractBlock$Properties;)V #endgroup public net.minecraft.block.Block func_180637_b(Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;I)V # dropXpOnBlockBreak +public net.minecraft.block.WoodType func_227047_a_(Lnet/minecraft/block/WoodType;)Lnet/minecraft/block/WoodType; # register public net.minecraft.block.FireBlock func_220274_q(Lnet/minecraft/block/BlockState;)I # func_220274_q public net.minecraft.block.FireBlock func_220275_r(Lnet/minecraft/block/BlockState;)I # func_220275_r public-f net.minecraft.client.GameSettings field_74324_K # keyBindings diff --git a/src/test/java/net/minecraftforge/debug/block/CustomSignsTest.java b/src/test/java/net/minecraftforge/debug/block/CustomSignsTest.java new file mode 100644 index 0000000000..dfed33fca4 --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/block/CustomSignsTest.java @@ -0,0 +1,120 @@ +package net.minecraftforge.debug.block; + +import net.minecraft.block.*; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.Atlases; +import net.minecraft.client.renderer.tileentity.SignTileEntityRenderer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.SignItem; +import net.minecraft.tileentity.SignTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IBlockReader; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +@Mod(CustomSignsTest.MODID) +public class CustomSignsTest +{ + public static final boolean ENABLE = true; + public static final String MODID = "custom_signs_test"; + + public static final WoodType TEST_WOOD_TYPE = WoodType.create(new ResourceLocation(MODID, "test").toString()); + + private static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); + public static final RegistryObject TEST_STANDING_SIGN = BLOCKS.register("test_sign", () -> new CustomStandingSignBlock(Block.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), CustomSignsTest.TEST_WOOD_TYPE)); + public static final RegistryObject TEST_WALL_SIGN = BLOCKS.register("test_wall_sign", () -> new CustomWallSignBlock(Block.Properties.of(Material.WOOD).noCollission().strength(1.0F).sound(SoundType.WOOD), CustomSignsTest.TEST_WOOD_TYPE)); + + private static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); + public static final RegistryObject TEST_SIGN = ITEMS.register("test_sign", () -> new SignItem((new Item.Properties()).stacksTo(16).tab(ItemGroup.TAB_DECORATIONS), TEST_STANDING_SIGN.get(), TEST_WALL_SIGN.get())); + + private static final DeferredRegister> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, MODID); + public static final RegistryObject> CUSTOM_SIGN = TILE_ENTITIES.register("custom_sign", () -> TileEntityType.Builder.of(CustomSignTileEntity::new, TEST_WALL_SIGN.get(), TEST_STANDING_SIGN.get()).build(null)); + + public CustomSignsTest() + { + if (ENABLE) + { + final IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); + BLOCKS.register(eventBus); + ITEMS.register(eventBus); + TILE_ENTITIES.register(eventBus); + + eventBus.addListener(this::clientSetup); + eventBus.addListener(this::commonSetup); + } + } + + private void clientSetup(final FMLClientSetupEvent event) + { + ClientRegistry.bindTileEntityRenderer(CUSTOM_SIGN.get(), SignTileEntityRenderer::new); + event.enqueueWork(() -> { + Atlases.addWoodType(TEST_WOOD_TYPE); + }); + } + + private void commonSetup(final FMLCommonSetupEvent event) + { + event.enqueueWork(() -> WoodType.register(TEST_WOOD_TYPE)); + } + + public static class CustomStandingSignBlock extends StandingSignBlock + { + + public CustomStandingSignBlock(Properties propertiesIn, WoodType woodTypeIn) + { + super(propertiesIn, woodTypeIn); + } + + @Override + public boolean hasTileEntity(BlockState stateIn) + { + return true; + } + + @Override + public TileEntity newBlockEntity(IBlockReader worldIn) + { + return new CustomSignTileEntity(); + } + } + + public static class CustomWallSignBlock extends WallSignBlock + { + + public CustomWallSignBlock(Properties propertiesIn, WoodType woodTypeIn) + { + super(propertiesIn, woodTypeIn); + } + + @Override + public boolean hasTileEntity(BlockState stateIn) + { + return true; + } + + @Override + public TileEntity newBlockEntity(IBlockReader worldIn) + { + return new CustomSignTileEntity(); + } + } + + public static class CustomSignTileEntity extends SignTileEntity + { + @Override + public TileEntityType getType() + { + return CUSTOM_SIGN.get(); + } + } +} diff --git a/src/test/resources/META-INF/mods.toml b/src/test/resources/META-INF/mods.toml index 4262ee8bc0..af92e03fb1 100644 --- a/src/test/resources/META-INF/mods.toml +++ b/src/test/resources/META-INF/mods.toml @@ -110,6 +110,8 @@ license="LGPL v2.1" modId="custom_sound_type_test" [[mods]] modId="item_modifier_test" +[[mods]] + modId="custom_signs_test" [[mods]] modId="shader_fix_test" [[mods]] diff --git a/src/test/resources/assets/custom_signs_test/blockstates/test_sign.json b/src/test/resources/assets/custom_signs_test/blockstates/test_sign.json new file mode 100644 index 0000000000..a5e96941ca --- /dev/null +++ b/src/test/resources/assets/custom_signs_test/blockstates/test_sign.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "custom_signs_test:block/test_sign" } + } +} diff --git a/src/test/resources/assets/custom_signs_test/blockstates/test_wall_sign.json b/src/test/resources/assets/custom_signs_test/blockstates/test_wall_sign.json new file mode 100644 index 0000000000..a5e96941ca --- /dev/null +++ b/src/test/resources/assets/custom_signs_test/blockstates/test_wall_sign.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "custom_signs_test:block/test_sign" } + } +} diff --git a/src/test/resources/assets/custom_signs_test/models/block/test_sign.json b/src/test/resources/assets/custom_signs_test/models/block/test_sign.json new file mode 100644 index 0000000000..3f153f39cc --- /dev/null +++ b/src/test/resources/assets/custom_signs_test/models/block/test_sign.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/oak_planks" + } +} diff --git a/src/test/resources/assets/custom_signs_test/textures/entity/signs/test.png b/src/test/resources/assets/custom_signs_test/textures/entity/signs/test.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2607b04feaa8fd1fa4cd70152087813fac8f45 GIT binary patch literal 1192 zcmV;Z1XufsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1U*SaK~z{r?U_wX zV^tK#&%3WJP@KY~&;TukB8eJTer*hDCUIv%;>x|rEN1qzn*D6dBomE6H!h5EV`74u ziEjMJsBz)fhM*3XkG8-70|*JFE$#FEZ{Mk}&%W2bQXaAROUk|XoO{~)&bjxzdoLPE zzM7gaP};eYUe&};Pd=`ck-k19M0qGB+@{Yz{-~ifBX+ko&1z#b{s}wJEc~X%C)A(9 z35tJ}im&f}>OO{_zrSZz8>4-anlR$w>LVTG^Qz=WL>rH6)uTPTysE|r)EL?Dz^KZb zwd?p`?oH#}H*UE;hZ`c9dX&Qb{btiUDh?Q8EwmE1Hphn%R%Q0+xUO@fwteCWt7DRS zpw3av+CU`2z3NvmJN7FjYNcJr`)}VdZr{AoeiZO$cr30O?I02pDGKPi+4PPG1$0VI zO`A>c)YgJETmVk1^hmFpawmQ6D6iH^GrfKOFyfLa9uz@k#1R9iGfsNDJ$|r}-U)%# z&0xfM3Y7TRX{5K?<7u7rj?Bdq#(VL2+f(s0X!pLjYiwjz>7-ny(L|E2yfWLwX`Mx6 zR?_rHWPoxj%e0YQGsXTPqOlR`=?haLHAUl-Q>OR=q2k>v7qq(8o%BvQ0I0nO)~ekY zZC*;J)jMr|fJ){tw2vI%OF$>|PN+Aks+dMxBC~-`>77s>0PHT5T(^$=w0b9mQ>V3Z zHSeF5o~do@*i~>LJ`v5R8FxbO%DKJ^K78jbV>O+ov1F3s$w_*7_EpCo|7A08YUHbwp-{``HBN~ID-qfr_gpD@M#A@+B+sVw&bgF`Vo zIjJTQKM`MjWwoMVy7`HhNGr4^RrrH3?cf8Thq=gpLr z)7ZOhz8ax%dIwI;doBmhP zzWi+7*xtxd{`i=tAA5p|#UlOq?KkxF^Dn5a*=tv?ceNwb-4r&${oybb3I)2qxIhE) zh@k5_mE~rm+Yy?k(c%7{ngKiVT!g*xrAUOf*0WT(C=OVXQOCs~4g-cv3pkf8-~WR~ z;^Stw?nUTwKV6Zz57R#&Per&Jz(3iZoq35ia~ZQ+_aa7Rw4<>Yg+d`EFbqQ_LXcff ztFoIBxDDu)uf1Kl_Hi`