From 7976ac4a2b4b2b0d1359ecd1058fb02d8eb520ae Mon Sep 17 00:00:00 2001 From: Madsthunder Date: Fri, 26 May 2017 16:51:18 -0400 Subject: [PATCH] [1.11.2] Added support for Village capabilities (#3648) --- .../net/minecraft/village/Village.java.patch | 75 +++++++++++++++++-- .../event/ForgeEventFactory.java | 7 ++ .../test/TestCapabilityMod.java | 61 +++++++++++++-- 3 files changed, 132 insertions(+), 11 deletions(-) diff --git a/patches/minecraft/net/minecraft/village/Village.java.patch b/patches/minecraft/net/minecraft/village/Village.java.patch index 92422fccf..38af13936 100644 --- a/patches/minecraft/net/minecraft/village/Village.java.patch +++ b/patches/minecraft/net/minecraft/village/Village.java.patch @@ -1,6 +1,15 @@ --- ../src-base/minecraft/net/minecraft/village/Village.java +++ ../src-work/minecraft/net/minecraft/village/Village.java -@@ -37,7 +37,7 @@ +@@ -26,7 +26,7 @@ + import net.minecraft.util.math.Vec3d; + import net.minecraft.world.World; + +-public class Village ++public class Village implements net.minecraftforge.common.capabilities.ICapabilitySerializable + { + private World field_75586_a; + private final List field_75584_b = Lists.newArrayList(); +@@ -37,17 +37,19 @@ private int field_75581_g; private int field_75588_h; private int field_82694_i; @@ -9,7 +18,19 @@ private final List field_75589_i = Lists.newArrayList(); private int field_75587_j; -@@ -310,11 +310,11 @@ + public Village() + { ++ this.capabilities = net.minecraftforge.event.ForgeEventFactory.gatherCapabilities(this); + } + + public Village(World p_i1675_1_) + { + this.field_75586_a = p_i1675_1_; ++ this.capabilities = net.minecraftforge.event.ForgeEventFactory.gatherCapabilities(this); + } + + public void func_82691_a(World p_82691_1_) +@@ -310,11 +312,11 @@ double d0 = Double.MAX_VALUE; EntityPlayer entityplayer = null; @@ -24,7 +45,7 @@ if (entityplayer1 != null) { -@@ -407,25 +407,51 @@ +@@ -407,25 +409,51 @@ } } @@ -78,7 +99,7 @@ public void func_82690_a(NBTTagCompound p_82690_1_) { this.field_75588_h = p_82690_1_.func_74762_e("PopSize"); -@@ -451,19 +477,14 @@ +@@ -451,21 +479,17 @@ { NBTTagCompound nbttagcompound1 = nbttaglist1.func_150305_b(j); @@ -101,8 +122,11 @@ + this.field_82693_j.put(findUUID(nbttagcompound1.func_74779_i("Name")), Integer.valueOf(nbttagcompound1.func_74762_e("S"))); } } ++ if (this.capabilities != null && p_82690_1_.func_74764_b("ForgeCaps")) this.capabilities.deserializeNBT(p_82690_1_.func_74775_l("ForgeCaps")); } -@@ -499,18 +520,14 @@ + + public void func_82689_b(NBTTagCompound p_82689_1_) +@@ -499,18 +523,14 @@ p_82689_1_.func_74782_a("Doors", nbttaglist); NBTTagList nbttaglist1 = new NBTTagList(); @@ -123,7 +147,15 @@ nbttagcompound1.func_74768_a("S", ((Integer)this.field_82693_j.get(s)).intValue()); nbttaglist1.func_74742_a(nbttagcompound1); } -@@ -536,9 +553,9 @@ +@@ -522,6 +542,7 @@ + } + + p_82689_1_.func_74782_a("Players", nbttaglist1); ++ if (this.capabilities != null) p_82689_1_.func_74782_a("ForgeCaps", this.capabilities.serializeNBT()); + } + + public void func_82692_h() +@@ -536,9 +557,9 @@ public void func_82683_b(int p_82683_1_) { @@ -135,3 +167,34 @@ } } +@@ -553,4 +574,30 @@ + this.field_75590_b = p_i1674_3_; + } + } ++ ++ /* ======================================== FORGE START =====================================*/ ++ private net.minecraftforge.common.capabilities.CapabilityDispatcher capabilities; ++ public boolean hasCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.util.EnumFacing facing) ++ { ++ return capabilities == null ? false : capabilities.hasCapability(capability, facing); ++ } ++ ++ public T getCapability(net.minecraftforge.common.capabilities.Capability capability, @Nullable net.minecraft.util.EnumFacing facing) ++ { ++ return capabilities == null ? null : capabilities.getCapability(capability, facing); ++ } ++ ++ public void deserializeNBT(NBTTagCompound nbt) ++ { ++ this.func_82690_a(nbt);; ++ } ++ ++ public NBTTagCompound serializeNBT() ++ { ++ NBTTagCompound ret = new NBTTagCompound(); ++ this.func_82689_b(ret); ++ return ret; ++ } ++ ++ /* ========================================= FORGE END ======================================*/ + } diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index ce244b549..aad624483 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -55,6 +55,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; +import net.minecraft.village.Village; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraft.world.WorldServer; @@ -587,6 +588,12 @@ public class ForgeEventFactory { return gatherCapabilities(new AttachCapabilitiesEvent.Entity(entity), null); } + + @Nullable + public static CapabilityDispatcher gatherCapabilities(Village village) + { + return gatherCapabilities(new AttachCapabilitiesEvent(Village.class, village), null); + } @Nullable public static CapabilityDispatcher gatherCapabilities(Item item, ItemStack stack, ICapabilityProvider parent) diff --git a/src/test/java/net/minecraftforge/test/TestCapabilityMod.java b/src/test/java/net/minecraftforge/test/TestCapabilityMod.java index 9b1b868eb..8850bb266 100644 --- a/src/test/java/net/minecraftforge/test/TestCapabilityMod.java +++ b/src/test/java/net/minecraftforge/test/TestCapabilityMod.java @@ -1,5 +1,9 @@ package net.minecraftforge.test; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; @@ -7,10 +11,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextFormatting; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.village.Village; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability.IStorage; @@ -22,9 +28,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import net.minecraftforge.fml.common.gameevent.TickEvent; @Mod(modid = "forge.testcapmod", name = "Forge TestCapMod", version = "1.0", acceptableRemoteVersions = "*") public class TestCapabilityMod @@ -186,7 +190,54 @@ public class TestCapabilityMod if (!(event.getObject() instanceof TileEntity)) throw new IllegalArgumentException("Generic event handler failed! Expected Tile Entity got " + event.getObject()); } + + @SubscribeEvent + public void attachVillage(AttachCapabilitiesEvent event) + { + System.out.println(event.getObject()); + event.addCapability(new ResourceLocation("forge.testcapmod:dummy_cap"), new Provider(event.getObject())); + } + //Detects if a player has entered the radius of a village + @SubscribeEvent + public void tick(TickEvent.WorldTickEvent event) + { + if(!event.world.isRemote) + { + List players = event.world.playerEntities; + int i = 0; + for(Village village : event.world.villageCollectionObj.getVillageList()) + { + if(village.hasCapability(TEST_CAP, null)) + { + boolean playerInRadius = false; + for(EntityPlayer player : players) + { + + if(new Vec3d(player.posX, 0, player.posZ).squareDistanceTo(new Vec3d(village.getCenter().getX(), 0, village.getCenter().getZ())) <= village.getVillageRadius() * village.getVillageRadius()) + { + playerInRadius = playerInRadius || true; + } + } + //If the test cap is true but no players are in radius + if(village.getCapability(TEST_CAP, null).getVal() && !playerInRadius) + { + village.getCapability(TEST_CAP, null).toggleVal(); + for(EntityPlayer player : players) + player.sendMessage(new TextComponentString(TextFormatting.RED + "All Players Have Exited Village " + i)); + } + //If the test cap is false but there are players in radius + else if(!village.getCapability(TEST_CAP, null).getVal() && playerInRadius) + { + village.getCapability(TEST_CAP, null).toggleVal(); + for(EntityPlayer player : players) + player.sendMessage(new TextComponentString(TextFormatting.GREEN + "Some Players Have Entered Village " + i)); + } + } + i++; + } + } + } // Capabilities SHOULD be interfaces, NOT concrete classes, this allows for // the most flexibility for the implementors. public static interface IExampleCapability