From 93a4e13837cc4139fd33f1f263c71ab8eeb4d82a Mon Sep 17 00:00:00 2001 From: Madsthunder Date: Mon, 1 May 2017 00:59:57 -0400 Subject: [PATCH] [1.11.2] Fixed Zombie Villagers not setting and getting professions correctly (#3678) --- .../entity/RenderZombieVillager.java.patch | 10 +++ .../monster/EntityZombieVillager.java.patch | 68 ++++++++++++++++-- .../entity/passive/EntityVillager.java.patch | 3 +- .../fml/common/registry/VillagerRegistry.java | 3 + .../test/VillagerProfessionTest.java | 21 ++++++ .../textures/entity/test_villager.png | Bin 0 -> 1649 bytes .../textures/entity/zombie_test_villager.png | Bin 0 -> 3128 bytes 7 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 patches/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java.patch create mode 100644 src/test/java/net/minecraftforge/test/VillagerProfessionTest.java create mode 100644 src/test/resources/assets/professiontest/textures/entity/test_villager.png create mode 100644 src/test/resources/assets/professiontest/textures/entity/zombie_test_villager.png diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java.patch new file mode 100644 index 0000000000..4f8f88bb77 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java.patch @@ -0,0 +1,10 @@ +--- ../src-base/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java ++++ ../src-work/minecraft/net/minecraft/client/renderer/entity/RenderZombieVillager.java +@@ -25,6 +25,7 @@ + + protected ResourceLocation func_110775_a(EntityZombieVillager p_110775_1_) + { ++ if (true) return p_110775_1_.getForgeProfession().getZombieSkin(); + switch (p_110775_1_.func_190736_dl()) + { + case 0: diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch b/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch index 7aba28025d..95c9a4f326 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch +++ b/patches/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java.patch @@ -1,17 +1,58 @@ --- ../src-base/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java +++ ../src-work/minecraft/net/minecraft/entity/monster/EntityZombieVillager.java -@@ -48,6 +48,7 @@ +@@ -48,11 +48,14 @@ public void func_190733_a(int p_190733_1_) { this.field_70180_af.func_187227_b(field_190739_c, Integer.valueOf(p_190733_1_)); + net.minecraftforge.fml.common.registry.VillagerRegistry.onSetProfession(this, p_190733_1_); } ++ //Use Forge Variant below ++ @Deprecated public int func_190736_dl() -@@ -85,6 +86,21 @@ - return super.func_180482_a(p_180482_1_, p_180482_2_); + { +- return Math.max(((Integer)this.field_70180_af.func_187225_a(field_190739_c)).intValue() % 6, 0); ++ return Math.max(((Integer)this.field_70180_af.func_187225_a(field_190739_c)).intValue(), 0); } + public static void func_190737_b(DataFixer p_190737_0_) +@@ -64,6 +67,7 @@ + { + super.func_70014_b(p_70014_1_); + p_70014_1_.func_74768_a("Profession", this.func_190736_dl()); ++ p_70014_1_.func_74778_a("ProfessionName", this.getForgeProfession().getRegistryName().toString()); + p_70014_1_.func_74768_a("ConversionTime", this.func_82230_o() ? this.field_82234_d : -1); + } + +@@ -71,6 +75,12 @@ + { + super.func_70037_a(p_70037_1_); + this.func_190733_a(p_70037_1_.func_74762_e("Profession")); ++ if (p_70037_1_.func_74764_b("ProfessionName")) ++ { ++ net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession p = net.minecraftforge.fml.common.registry.VillagerRegistry.instance().getRegistry().getValue(new net.minecraft.util.ResourceLocation(p_70037_1_.func_74779_i("ProfessionName"))); ++ if (p == null) p = net.minecraftforge.fml.common.registry.VillagerRegistry.FARMER; ++ this.setForgeProfession(p); ++ } + + if (p_70037_1_.func_150297_b("ConversionTime", 99) && p_70037_1_.func_74762_e("ConversionTime") > -1) + { +@@ -164,7 +174,7 @@ + { + EntityVillager entityvillager = new EntityVillager(this.field_70170_p); + entityvillager.func_82149_j(this); +- entityvillager.func_70938_b(this.func_190736_dl()); ++ entityvillager.setProfession(this.getForgeProfession()); + entityvillager.func_190672_a(this.field_70170_p.func_175649_E(new BlockPos(entityvillager)), (IEntityLivingData)null, false); + entityvillager.func_82187_q(); + +@@ -256,4 +266,37 @@ + { + return ItemStack.field_190927_a; + } ++ ++ /* ======================================== FORGE START =====================================*/ ++ + @Nullable + private net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession prof; + public void setForgeProfession(net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession prof) @@ -20,13 +61,26 @@ + this.func_190733_a(net.minecraftforge.fml.common.registry.VillagerRegistry.getId(prof)); + } + -+ @Nullable + public net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession getForgeProfession() + { ++ if (this.prof == null) ++ { ++ this.prof = net.minecraftforge.fml.common.registry.VillagerRegistry.getById(this.func_190736_dl()); ++ if (this.prof == null) ++ return net.minecraftforge.fml.common.registry.VillagerRegistry.FARMER; ++ } + return this.prof; + } + ++ @Override ++ public void func_184206_a(DataParameter key) ++ { ++ super.func_184206_a(key); ++ if (key.equals(field_190739_c)) ++ { ++ net.minecraftforge.fml.common.registry.VillagerRegistry.onSetProfession(this, this.field_70180_af.func_187225_a(field_190739_c)); ++ } ++ } + - public void func_70071_h_() - { - if (!this.field_70170_p.field_72995_K && this.func_82230_o()) ++ /* ======================================== FORGE END =====================================*/ + } diff --git a/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch b/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch index 5d46c87b69..7983c6c971 100644 --- a/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch +++ b/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch @@ -51,7 +51,8 @@ + @Deprecated //Use Forge Variant below public int func_70946_n() { - return Math.max(((Integer)this.field_70180_af.func_187225_a(field_184752_bw)).intValue() % 6, 0); +- return Math.max(((Integer)this.field_70180_af.func_187225_a(field_184752_bw)).intValue() % 6, 0); ++ return Math.max(((Integer)this.field_70180_af.func_187225_a(field_184752_bw)).intValue(), 0); } + private net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession prof; diff --git a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java index 91d3391cc5..08b7308f12 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java @@ -37,6 +37,7 @@ import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureVillagePieces; import net.minecraft.world.gen.structure.StructureVillagePieces.PieceWeight; import net.minecraft.world.gen.structure.StructureVillagePieces.Village; +import net.minecraftforge.fml.common.registry.GameRegistry.ObjectHolder; import javax.annotation.Nullable; @@ -46,6 +47,8 @@ import javax.annotation.Nullable; public class VillagerRegistry { public static final ResourceLocation PROFESSIONS = new ResourceLocation("minecraft:villagerprofessions"); + @ObjectHolder("minecraft:farmer") + public static final VillagerProfession FARMER = null; private static final VillagerRegistry INSTANCE = new VillagerRegistry(); private Map, IVillageCreationHandler> villageCreationHandlers = Maps.newHashMap(); diff --git a/src/test/java/net/minecraftforge/test/VillagerProfessionTest.java b/src/test/java/net/minecraftforge/test/VillagerProfessionTest.java new file mode 100644 index 0000000000..946830107c --- /dev/null +++ b/src/test/java/net/minecraftforge/test/VillagerProfessionTest.java @@ -0,0 +1,21 @@ +package net.minecraftforge.test; + +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerCareer; +import net.minecraftforge.fml.common.registry.VillagerRegistry.VillagerProfession; + +@Mod(modid = "professiontest", name = "ProfessionTest2000", version = "1.0", acceptableRemoteVersions = "*") +@EventBusSubscriber +public class VillagerProfessionTest +{ + @SubscribeEvent + public static void registerVillagers(RegistryEvent.Register event) + { + VillagerProfession profession = new VillagerProfession("professiontest:test_villager", "professiontest:textures/entity/test_villager.png", "professiontest:textures/entity/zombie_test_villager.png"); + new VillagerCareer(profession, "professiontest:test_villager"); + event.getRegistry().register(profession); + } +} diff --git a/src/test/resources/assets/professiontest/textures/entity/test_villager.png b/src/test/resources/assets/professiontest/textures/entity/test_villager.png new file mode 100644 index 0000000000000000000000000000000000000000..c96f96ff37fdf7f3d7cdafb87685577f4f41c5a9 GIT binary patch literal 1649 zcmV-%29EiOP)pF8FWQhbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMF*7s+TY3Nh1@1{iK~#8N-I+U&TtyIt=Pw`;kRdc6Bqw0mmN2qd#0C}-4@*FV zWF$nej?BY>MM8u`LS&JU@Cb-4M1=p^pfl7rbEc;5?b+Eov%N0q=+^D3>aKITZ|~YW zYuUd)JzNao@5f)2<3RD4X7=sfHx|OrpPw!f!%e&Q=+DK+-~F-B6Zm_i9nK(+CCVpNaobU%<|JH{9JdY`W$X}`e5Qen-B63IpGU=lW@bvK) zOQI0JECC>XbOD?!zK=mBL-CkqZ-X$OfPV@{6QCjvTJe}>ZxhK(deRdBfeIo}je{xT z5UJp#4~5kc&y4|(kB#dIhVrU-)f7MgPCyo93W2&1z>l>2>YE=!RnI$6ULF&+J^>oT z_c4dZ9p{bHumBk+C%pgQ*Tw0VzidEbIS*3uT?C)o-{p5908M8=Jg%!PtAt=K&Fh4# zH3kLX32walLJ4xm>Ra*L6cDlC*|Z@M1cb<9@LUN%L%Biuve}dW2@CRN)VAu!;xy+3 z#&&(kRO540B0${VmjaCarl((M6#wUkhl^)FK3G9xinZ!nac@S=o@eK?`AP6O^O(n$ z0(i6d00ADocWVPK0J&9tEA9;n`|LheodS{dF~;%BPr!iy6%b&oz7_YzEFx5!3yQt<`YSsjrn`EE0Neq74|FZS zoon-jWB$^M8;G=~iDX4y{*(gfV*B*_zn0*#6ZXF34k-Z7DFuK$@XJn!wB2oL0oeIt z2vGgZkF?!wN&%d_V@d&rJ^?<1NEK(SBm+*pCNc-PNwhZB|nt$5I08wB?eKv2`f1c=bEiy(if4mfEC^ZCzm z5#-pr0Aul>y*4d6MsSz70|AI5f=+~!%XNTw1=Wuc6k741y*4d+5dl0#uHZQc;A5>i z@>AHRARst_N&spE&!I*> z^Eo*La8v>~g7(^caT;)F%$v;de4BF#(y-uUAeZYvRU@DIM9$&6tM9xO587)RY5=t2 zLjrh?li_`rx(dviPft3KME&LB2K zuoYMH{w?FH;S47wvgA@L5En!kUr;RCp3YhXTk$M_6R7~1UFw`Th_(-J`o~4MTQ(Lu zwE2y$OU~abtu9ozyvGs1<1tO!dOiUVbO9jgaegd%Jf>+|&jJA7-3p2+ z$H!utw)G-_2=H57{>?6vV{9m&xWC6T+t!N!BH^Ss&g`zhDbSH0%SQmuUn=Z)_x_V5 zloUN|*@xf!zER^)OcMi?<~^p^*)k!`RT1KSET0}dzx*?jFx0S$SlH`;lXmPY0R4bG zZyp=V*E__))}M@Wp*QX1avdOEVIKhwZaVHxfKR|1C#M=4szYg!c0ZQw$GmxmeDUCn2h)8FxZiIO>$+wdCvBr2s=jARsXAguITLoC9h3%ooe{V`I0u8Wt)6avh-N z$_oGy!37X10jjzRv1~u)L?9usYXSoJj(VNfdL6m=s*h#+u^}Stm=LL}{|phKUFs^t vRQ;F}frKEEk+NlD0(hMW`+I*UU^e>?m_%0Hl$yd200000NkvXXu0mjft#SGc literal 0 HcmV?d00001 diff --git a/src/test/resources/assets/professiontest/textures/entity/zombie_test_villager.png b/src/test/resources/assets/professiontest/textures/entity/zombie_test_villager.png new file mode 100644 index 0000000000000000000000000000000000000000..4951a527379eaffb6bedbb06ef83b1d92928b13d GIT binary patch literal 3128 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 SOOnd~0000