From bfe43ae465c8df1f53fb4105c1756cc040b038b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=AA=E8=81=AA?= <178666380@qq.com> Date: Tue, 4 Jul 2017 14:29:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=8C=96=E6=96=B9=E5=9D=97?= =?UTF-8?q?=E6=8D=95=E8=8E=B7=E8=BF=98=E5=8E=9F=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../minecraft/block/BlockSapling.java.patch | 69 ++-- .../entity/player/InventoryPlayer.java.patch | 51 ++- patches/net/minecraft/world/World.java.patch | 309 ++++++++++-------- .../common/ForgeHooks.java.patch | 295 ++++++++--------- .../event/world/BlockEvent.java.patch | 35 +- src/main/java/cc/Location.java | 40 +++ src/main/java/cc/capture/ItemSnapshot.java | 38 +++ src/main/java/cc/capture/WorldCapture.java | 171 ++++++++++ src/main/java/cc/capture/type/ACapture.java | 68 ++++ .../java/cc/capture/type/CaptureBlock.java | 154 +++++++++ .../java/cc/capture/type/CaptureTree.java | 72 ++++ .../org/bukkit/craftbukkit/CraftWorld.java | 92 ++++-- 12 files changed, 992 insertions(+), 402 deletions(-) create mode 100644 src/main/java/cc/Location.java create mode 100644 src/main/java/cc/capture/ItemSnapshot.java create mode 100644 src/main/java/cc/capture/WorldCapture.java create mode 100644 src/main/java/cc/capture/type/ACapture.java create mode 100644 src/main/java/cc/capture/type/CaptureBlock.java create mode 100644 src/main/java/cc/capture/type/CaptureTree.java diff --git a/patches/net/minecraft/block/BlockSapling.java.patch b/patches/net/minecraft/block/BlockSapling.java.patch index 4c05ce5..1f6e7d3 100644 --- a/patches/net/minecraft/block/BlockSapling.java.patch +++ b/patches/net/minecraft/block/BlockSapling.java.patch @@ -1,17 +1,22 @@ --- ../src-base/minecraft/net/minecraft/block/BlockSapling.java +++ ../src-work/minecraft/net/minecraft/block/BlockSapling.java -@@ -22,10 +22,18 @@ - import net.minecraft.world.gen.feature.WorldGenTrees; - import net.minecraft.world.gen.feature.WorldGenerator; +@@ -1,9 +1,13 @@ + package net.minecraft.block; -+// CraftBukkit start -+import org.bukkit.Location; -+import org.bukkit.TreeType; -+import org.bukkit.block.BlockState; -+import org.bukkit.event.world.StructureGrowEvent; -+// CraftBukkit end +-import cpw.mods.fml.relauncher.Side; +-import cpw.mods.fml.relauncher.SideOnly; + import java.util.List; + import java.util.Random; + - public class BlockSapling extends BlockBush implements IGrowable ++import org.bukkit.TreeType; ++ ++import cc.capture.type.CaptureTree; ++import cpw.mods.fml.relauncher.Side; ++import cpw.mods.fml.relauncher.SideOnly; + import net.minecraft.client.renderer.texture.IIconRegister; + import net.minecraft.creativetab.CreativeTabs; + import net.minecraft.init.Blocks; +@@ -26,6 +30,7 @@ { public static final String[] field_149882_a = new String[] {"oak", "spruce", "birch", "jungle", "acacia", "roofed_oak"}; private static final IIcon[] field_149881_b = new IIcon[field_149882_a.length]; @@ -19,7 +24,7 @@ private static final String __OBFID = "CL_00000305"; protected BlockSapling() -@@ -41,9 +49,39 @@ +@@ -41,9 +46,13 @@ { super.updateTick(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_); @@ -27,40 +32,14 @@ + if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9 && (p_149674_5_.nextInt(Math.max(2, (int)((p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().saplingModifier * 7) + 0.5F))) == 0)) // Spigot // Cauldron { + // Cauldron start -+ p_149674_1_.captureTreeGeneration = true; ++ CaptureTree tCapture=p_149674_1_.mCapture.startTreeGenCapture(null,p_149674_2_,p_149674_3_,p_149674_4_); this.func_149879_c(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_); -+ p_149674_1_.captureTreeGeneration = false; -+ if (p_149674_1_.capturedBlockSnapshots.size() > 0) -+ { -+ TreeType treeType = BlockSapling.treeType; -+ BlockSapling.treeType = null; -+ Location location = new Location(p_149674_1_.getWorld(), p_149674_2_, p_149674_3_, p_149674_4_); -+ List blocks = (List) p_149674_1_.capturedBlockSnapshots.clone(); -+ List blockstates = new java.util.ArrayList(); -+ for (net.minecraftforge.common.util.BlockSnapshot snapshot : blocks) -+ { -+ blockstates.add(new org.bukkit.craftbukkit.block.CraftBlockState(snapshot)); -+ } -+ p_149674_1_.capturedBlockSnapshots.clear(); -+ StructureGrowEvent event = null; -+ if (treeType != null) -+ { -+ event = new StructureGrowEvent(location, treeType, false, null, blockstates); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ } -+ if (event == null || !event.isCancelled()) -+ { -+ for (BlockState blockstate : blockstates) -+ { -+ blockstate.update(true); -+ } -+ } -+ } ++ tCapture.endCapture(); + // Cauldron end } } } -@@ -73,7 +111,20 @@ +@@ -73,7 +82,20 @@ { if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(p_149878_1_, p_149878_5_, p_149878_2_, p_149878_3_, p_149878_4_)) return; int l = p_149878_1_.getBlockMetadata(p_149878_2_, p_149878_3_, p_149878_4_) & 7; @@ -82,7 +61,7 @@ int i1 = 0; int j1 = 0; boolean flag = false; -@@ -84,6 +135,7 @@ +@@ -84,6 +106,7 @@ default: break; case 1: @@ -90,7 +69,7 @@ label78: for (i1 = 0; i1 >= -1; --i1) -@@ -108,6 +160,7 @@ +@@ -108,6 +131,7 @@ break; case 2: @@ -98,7 +77,7 @@ object = new WorldGenForest(true, false); break; case 3: -@@ -119,6 +172,7 @@ +@@ -119,6 +143,7 @@ { if (this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1 + 1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1 + 1, 3)) { @@ -106,7 +85,7 @@ object = new WorldGenMegaJungle(true, 10, 20, 3, 3); flag = true; break label93; -@@ -130,11 +184,13 @@ +@@ -130,11 +155,13 @@ { j1 = 0; i1 = 0; @@ -120,7 +99,7 @@ object = new WorldGenSavannaTree(true); break; case 5: -@@ -147,6 +203,7 @@ +@@ -147,6 +174,7 @@ if (this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1 + 1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1 + 1, 5)) { object = new WorldGenCanopyTree(true); diff --git a/patches/net/minecraft/entity/player/InventoryPlayer.java.patch b/patches/net/minecraft/entity/player/InventoryPlayer.java.patch index 8be8a33..f405a41 100644 --- a/patches/net/minecraft/entity/player/InventoryPlayer.java.patch +++ b/patches/net/minecraft/entity/player/InventoryPlayer.java.patch @@ -1,37 +1,23 @@ --- ../src-base/minecraft/net/minecraft/entity/player/InventoryPlayer.java +++ ../src-work/minecraft/net/minecraft/entity/player/InventoryPlayer.java -@@ -2,10 +2,13 @@ - - import cpw.mods.fml.relauncher.Side; - import cpw.mods.fml.relauncher.SideOnly; -+ - import java.util.concurrent.Callable; -+ - import net.minecraft.block.Block; - import net.minecraft.crash.CrashReport; - import net.minecraft.crash.CrashReportCategory; -+import net.minecraft.entity.item.EntityItem; - import net.minecraft.inventory.IInventory; - import net.minecraft.item.Item; - import net.minecraft.item.ItemArmor; -@@ -13,7 +16,16 @@ - import net.minecraft.nbt.NBTTagCompound; - import net.minecraft.nbt.NBTTagList; - import net.minecraft.util.ReportedException; -+import net.minecraftforge.common.util.EntitySnapshot; +@@ -1,8 +1,15 @@ + package net.minecraft.entity.player; +// CraftBukkit start +import java.util.List; ++import java.util.concurrent.Callable; + +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + - public class InventoryPlayer implements IInventory - { - public ItemStack[] mainInventory = new ItemStack[36]; -@@ -25,7 +37,46 @@ ++import cc.capture.type.CaptureBlock; + import cpw.mods.fml.relauncher.Side; + import cpw.mods.fml.relauncher.SideOnly; +-import java.util.concurrent.Callable; + import net.minecraft.block.Block; + import net.minecraft.crash.CrashReport; + import net.minecraft.crash.CrashReportCategory; +@@ -25,7 +32,46 @@ private ItemStack itemStack; public boolean inventoryChanged; private static final String __OBFID = "CL_00001709"; @@ -78,7 +64,7 @@ public InventoryPlayer(EntityPlayer p_i1750_1_) { this.player = p_i1750_1_; -@@ -81,6 +132,34 @@ +@@ -81,6 +127,34 @@ return -1; } @@ -113,18 +99,19 @@ public int getFirstEmptyStack() { for (int i = 0; i < this.mainInventory.length; ++i) -@@ -350,6 +429,10 @@ +@@ -350,6 +424,11 @@ { if (p_70441_1_ != null && p_70441_1_.stackSize != 0 && p_70441_1_.getItem() != null) { -+ if(player.worldObj.captureBlockSnapshots){ -+ player.worldObj.capturedItems.add(ItemStack.copyItemStack(p_70441_1_)); ++ CaptureBlock tBlockCapture=player.worldObj.mCapture.getLastBlockCapture(); ++ if(tBlockCapture!=null&&tBlockCapture.mEnable){ ++ tBlockCapture.addCaptureItem(player,ItemStack.copyItemStack(p_70441_1_)); + return true; + } try { int i; -@@ -430,25 +513,24 @@ +@@ -430,25 +509,24 @@ if (aitemstack[p_70298_1_] != null) { @@ -158,7 +145,7 @@ } else { -@@ -658,7 +740,7 @@ +@@ -658,7 +736,7 @@ if (this.mainInventory[i] != null) { this.player.func_146097_a(this.mainInventory[i], true, false); @@ -167,7 +154,7 @@ } } -@@ -667,7 +749,7 @@ +@@ -667,7 +745,7 @@ if (this.armorInventory[i] != null) { this.player.func_146097_a(this.armorInventory[i], true, false); diff --git a/patches/net/minecraft/world/World.java.patch b/patches/net/minecraft/world/World.java.patch index 53e08c9..97ffc2d 100644 --- a/patches/net/minecraft/world/World.java.patch +++ b/patches/net/minecraft/world/World.java.patch @@ -1,99 +1,117 @@ --- ../src-base/minecraft/net/minecraft/world/World.java +++ ../src-work/minecraft/net/minecraft/world/World.java -@@ -2,6 +2,7 @@ +@@ -1,7 +1,5 @@ + package net.minecraft.world; - import cpw.mods.fml.relauncher.Side; - import cpw.mods.fml.relauncher.SideOnly; -+ +-import cpw.mods.fml.relauncher.Side; +-import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; -@@ -12,6 +13,7 @@ +@@ -12,19 +10,54 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; + ++import org.bukkit.Bukkit; ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.SpigotTimings; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.BlockCanBuildEvent; ++import org.bukkit.event.block.BlockPhysicsEvent; ++import org.bukkit.event.block.BlockPlaceEvent; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++import org.bukkit.event.weather.ThunderChangeEvent; ++import org.bukkit.event.weather.WeatherChangeEvent; ++import org.bukkit.generator.ChunkGenerator; ++// Cauldron end ++import org.spigotmc.TickLimiter; ++ ++import com.google.common.collect.ImmutableSetMultimap; ++ ++import cc.capture.WorldCapture; ++import cc.capture.type.CaptureBlock; ++import cc.capture.type.CaptureTree; ++import cpw.mods.fml.common.FMLLog; ++import cpw.mods.fml.relauncher.Side; ++import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; - import net.minecraft.block.BlockHopper; +-import net.minecraft.block.BlockHopper; import net.minecraft.block.BlockLiquid; -@@ -23,9 +25,11 @@ +-import net.minecraft.block.BlockSlab; +-import net.minecraft.block.BlockSnow; +-import net.minecraft.block.BlockStairs; + import net.minecraft.block.material.Material; + import net.minecraft.command.IEntitySelector; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; -+import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; - import net.minecraft.entity.player.EntityPlayer; - import net.minecraft.init.Blocks; -+import net.minecraft.item.ItemBlock; - import net.minecraft.item.ItemStack; - import net.minecraft.nbt.NBTTagCompound; - import net.minecraft.pathfinding.PathEntity; -@@ -51,7 +55,6 @@ - import net.minecraft.world.storage.ISaveHandler; - import net.minecraft.world.storage.MapStorage; - import net.minecraft.world.storage.WorldInfo; -- - import cpw.mods.fml.common.FMLLog; - - import com.google.common.collect.ImmutableSetMultimap; -@@ -70,6 +73,56 @@ - import net.minecraftforge.event.entity.PlaySoundAtEntityEvent; - import net.minecraft.entity.EnumCreatureType; - +// CraftBukkit start +import net.minecraft.entity.EntityLivingBase; ++import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.item.EntityItem; ++// CraftBukkit end ++// Spigot Start ++import net.minecraft.entity.item.EntityXPOrb; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.monster.EntityGolem; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityWaterMob; + import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; + import net.minecraft.init.Blocks; + import net.minecraft.item.ItemStack; + import net.minecraft.nbt.NBTTagCompound; +@@ -36,7 +69,6 @@ + import net.minecraft.tileentity.TileEntity; + import net.minecraft.util.AxisAlignedBB; + import net.minecraft.util.ChunkCoordinates; +-import net.minecraft.util.Direction; + import net.minecraft.util.Facing; + import net.minecraft.util.MathHelper; + import net.minecraft.util.MovingObjectPosition; +@@ -48,27 +80,26 @@ + import net.minecraft.world.biome.WorldChunkManager; + import net.minecraft.world.chunk.Chunk; + import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.ChunkProviderServer; -+ -+import org.bukkit.Bukkit; -+import org.bukkit.World.Environment; -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.util.CraftMagicNumbers; -+import org.bukkit.craftbukkit.util.LongHashSet; -+import org.bukkit.craftbukkit.util.UnsafeList; -+import org.bukkit.generator.ChunkGenerator; -+import org.bukkit.craftbukkit.CraftServer; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.block.BlockCanBuildEvent; -+import org.bukkit.event.block.BlockPhysicsEvent; -+import org.bukkit.event.block.BlockPlaceEvent; -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -+import org.bukkit.event.weather.WeatherChangeEvent; -+import org.bukkit.event.weather.ThunderChangeEvent; -+ -+// CraftBukkit end -+// Spigot Start -+import net.minecraft.entity.item.EntityXPOrb; -+ -+import org.bukkit.craftbukkit.SpigotTimings; -+ -+// Spigot end -+// Cauldron start -+import net.minecraft.nbt.NBTTagCompound; + import net.minecraft.world.storage.ISaveHandler; + import net.minecraft.world.storage.MapStorage; + import net.minecraft.world.storage.WorldInfo; +- +-import cpw.mods.fml.common.FMLLog; +- +-import com.google.common.collect.ImmutableSetMultimap; +- +import net.minecraftforge.cauldron.CauldronHooks; -+import net.minecraftforge.cauldron.configuration.CauldronConfig; +import net.minecraftforge.cauldron.configuration.CauldronWorldConfig; +import net.minecraftforge.cauldron.configuration.EntityWorldConfig; -+import net.minecraftforge.cauldron.configuration.TileEntityConfig; +import net.minecraftforge.cauldron.configuration.TileEntityWorldConfig; + import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.common.DimensionManager; -+ -+import org.bukkit.block.BlockState; -+// Cauldron end -+import org.spigotmc.TickLimiter; -+ + import net.minecraftforge.common.ForgeChunkManager; + import net.minecraftforge.common.ForgeChunkManager.Ticket; + import net.minecraftforge.common.ForgeModContainer; +-import net.minecraftforge.common.ForgeHooks; + import net.minecraftforge.common.MinecraftForge; +-import net.minecraftforge.common.util.ForgeDirection; + import net.minecraftforge.common.WorldSpecificSaveHandler; ++import net.minecraftforge.common.util.BlockSnapshot; ++import net.minecraftforge.common.util.ForgeDirection; + import net.minecraftforge.event.entity.EntityEvent; + import net.minecraftforge.event.entity.EntityJoinWorldEvent; +-import net.minecraftforge.event.world.WorldEvent; + import net.minecraftforge.event.entity.PlaySoundAtEntityEvent; +-import net.minecraft.entity.EnumCreatureType; + public abstract class World implements IBlockAccess { - /** -@@ -83,15 +136,14 @@ +@@ -83,15 +114,14 @@ public boolean scheduledUpdatesAreImmediate; public List loadedEntityList = new ArrayList(); @@ -111,7 +129,7 @@ protected final int DIST_HASH_MAGIC = 1013904223; public float prevRainingStrength; public float rainingStrength; -@@ -100,30 +152,94 @@ +@@ -100,31 +130,92 @@ public int lastLightningBolt; public EnumDifficulty difficultySetting; public Random rand = new Random(); @@ -151,7 +169,6 @@ private boolean field_147481_N; int[] lightUpdateBlockList; + // Cauldron start -+ public boolean captureTreeGeneration = false; + public int entitiesTicked; + public int tilesTicked; + public CauldronWorldConfig cauldronConfig; @@ -206,14 +223,15 @@ + // Spigot end private static final String __OBFID = "CL_00000140"; public boolean restoringBlockSnapshots = false; - public boolean captureBlockSnapshots = false; - public ArrayList capturedBlockSnapshots = new ArrayList(); -+ public ArrayList capturedEntitySnapshots=new ArrayList(); -+ public ArrayList capturedItems=new ArrayList(); +- public boolean captureBlockSnapshots = false; +- public ArrayList capturedBlockSnapshots = new ArrayList(); ++ public WorldCapture mCapture=new WorldCapture(this); ++ public BiomeGenBase getBiomeGenForCoords(final int p_72807_1_, final int p_72807_2_) { -@@ -166,6 +282,27 @@ + return provider.getBiomeGenForCoords(p_72807_1_, p_72807_2_); +@@ -166,6 +257,27 @@ return this.provider.worldChunkMgr; } @@ -241,7 +259,7 @@ @SideOnly(Side.CLIENT) public World(ISaveHandler p_i45368_1_, String p_i45368_2_, WorldProvider p_i45368_3_, WorldSettings p_i45368_4_, Profiler p_i45368_5_) { -@@ -179,6 +316,12 @@ +@@ -179,6 +291,12 @@ this.worldInfo = new WorldInfo(p_i45368_4_, p_i45368_2_); this.provider = p_i45368_3_; perWorldStorage = new MapStorage((ISaveHandler)null); @@ -254,7 +272,7 @@ } // Broken up so that the WorldClient gets the chance to set the mapstorage object before the dimension initializes -@@ -207,8 +350,177 @@ +@@ -207,8 +325,177 @@ this.calculateInitialWeather(); } @@ -432,7 +450,7 @@ this.ambientTickCountdown = this.rand.nextInt(12000); this.spawnHostileMobs = true; this.spawnPeacefulMobs = true; -@@ -216,7 +528,6 @@ +@@ -216,7 +503,6 @@ this.lightUpdateBlockList = new int[32768]; this.saveHandler = p_i45369_1_; this.theProfiler = p_i45369_5_; @@ -440,7 +458,7 @@ this.worldInfo = p_i45369_1_.loadWorldInfo(); if (p_i45369_4_ != null) -@@ -235,13 +546,26 @@ +@@ -235,13 +521,26 @@ if (this.worldInfo == null) { this.worldInfo = new WorldInfo(p_i45369_3_, p_i45369_2_); @@ -467,7 +485,7 @@ this.chunkProvider = this.createChunkProvider(); if (this instanceof WorldServer) -@@ -294,6 +618,7 @@ +@@ -294,6 +593,7 @@ this.calculateInitialSkylight(); this.calculateInitialWeather(); } @@ -475,14 +493,15 @@ private static MapStorage s_mapStorage; private static ISaveHandler s_savehandler; -@@ -336,6 +661,18 @@ +@@ -336,6 +636,19 @@ public Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_) { + // Cauldron start - tree generation -+ if (captureTreeGeneration) ++ CaptureTree tTreeCapture=this.mCapture.getLastTreeGenCapture(); ++ if (tTreeCapture!=null&&tTreeCapture.mEnable) + { -+ for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : capturedBlockSnapshots) ++ for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : tTreeCapture.mCapturedBlocks) + { + if (blocksnapshot.x == p_147439_1_ && blocksnapshot.y == p_147439_2_ && blocksnapshot.z == p_147439_3_) + { @@ -494,7 +513,7 @@ if (p_147439_1_ >= -30000000 && p_147439_3_ >= -30000000 && p_147439_1_ < 30000000 && p_147439_3_ < 30000000 && p_147439_2_ >= 0 && p_147439_2_ < 256) { Chunk chunk = null; -@@ -404,7 +741,7 @@ +@@ -404,7 +717,7 @@ } } @@ -503,16 +522,17 @@ { return this.chunkProvider.chunkExists(p_72916_1_, p_72916_2_); } -@@ -421,6 +758,27 @@ +@@ -421,6 +734,28 @@ public boolean setBlock(int p_147465_1_, int p_147465_2_, int p_147465_3_, Block p_147465_4_, int p_147465_5_, int p_147465_6_) { + // Cauldron start - tree generation -+ if (this.captureTreeGeneration) ++ CaptureTree tTreeCapture=this.mCapture.getLastTreeGenCapture(); ++ if (tTreeCapture!=null&&tTreeCapture.mEnable) + { + net.minecraftforge.common.util.BlockSnapshot blocksnapshot = null; + -+ for (net.minecraftforge.common.util.BlockSnapshot previous : capturedBlockSnapshots) ++ for (net.minecraftforge.common.util.BlockSnapshot previous : tTreeCapture.mCapturedBlocks) + { + if (previous.x == p_147465_1_ && previous.y == p_147465_2_ && previous.z == p_147465_3_) + { @@ -522,42 +542,65 @@ + } + if (blocksnapshot != null) + { -+ capturedBlockSnapshots.remove(blocksnapshot); ++ tTreeCapture.mCapturedBlocks.remove(blocksnapshot); + } -+ this.capturedBlockSnapshots.add(new net.minecraftforge.common.util.BlockSnapshot(this, p_147465_1_, p_147465_2_, p_147465_3_, p_147465_4_, p_147465_5_, p_147465_6_)); ++ tTreeCapture.mCapturedBlocks.add(new net.minecraftforge.common.util.BlockSnapshot(this, p_147465_1_, p_147465_2_, p_147465_3_, p_147465_4_, p_147465_5_, p_147465_6_)); + return true; + } + // Cauldron end if (p_147465_1_ >= -30000000 && p_147465_3_ >= -30000000 && p_147465_1_ < 30000000 && p_147465_3_ < 30000000) { if (p_147465_2_ < 0) -@@ -450,7 +808,9 @@ +@@ -435,32 +770,29 @@ + { + Chunk chunk = this.getChunkFromChunkCoords(p_147465_1_ >> 4, p_147465_3_ >> 4); + Block block1 = null; +- net.minecraftforge.common.util.BlockSnapshot blockSnapshot = null; + if ((p_147465_6_ & 1) != 0) + { + block1 = chunk.getBlock(p_147465_1_ & 15, p_147465_2_, p_147465_3_ & 15); + } + +- if (this.captureBlockSnapshots && !this.isRemote) +- { +- blockSnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(this, p_147465_1_, p_147465_2_, p_147465_3_, p_147465_6_); +- this.capturedBlockSnapshots.add(blockSnapshot); ++ CaptureBlock tBlockCapture=this.mCapture.getLastBlockCapture(); ++ BlockSnapshot tSnapshot=null; ++ if(tBlockCapture!=null&&tBlockCapture.mEnable){ ++ tSnapshot=BlockSnapshot.getBlockSnapshot(this,p_147465_1_,p_147465_2_,p_147465_3_,p_147465_6_); + } +- boolean flag = chunk.func_150807_a(p_147465_1_ & 15, p_147465_2_, p_147465_3_ & 15, p_147465_4_, p_147465_5_); - if (!flag && blockSnapshot != null) -+ // Cauldron end -+ -+ if (!flag && this.captureBlockSnapshots && blockSnapshot != null) - { - this.capturedBlockSnapshots.remove(blockSnapshot); - blockSnapshot = null; -@@ -460,6 +820,7 @@ +- { +- this.capturedBlockSnapshots.remove(blockSnapshot); +- blockSnapshot = null; ++ if(flag&&tSnapshot!=null){ ++ tBlockCapture.addCapturedBlock(tSnapshot); + } + + this.theProfiler.startSection("checkLight"); this.func_147451_t(p_147465_1_, p_147465_2_, p_147465_3_); this.theProfiler.endSection(); +- if (flag && blockSnapshot == null) // Don't notify clients or update physics while capturing blockstates + // Cauldron add !this.captureBlockStates - if (flag && blockSnapshot == null) // Don't notify clients or update physics while capturing blockstates ++ if (flag && tBlockCapture != null&&tBlockCapture.mEnable) // Don't notify clients or update physics while capturing blockstates { // Modularize client and physic updates -@@ -496,6 +857,19 @@ + this.markAndNotifyBlock(p_147465_1_, p_147465_2_, p_147465_3_, chunk, block1, p_147465_4_, p_147465_6_); +@@ -496,6 +828,20 @@ public int getBlockMetadata(int p_72805_1_, int p_72805_2_, int p_72805_3_) { + // Cauldron start - tree generation -+ if (captureTreeGeneration) ++ CaptureTree treeGenCapture=this.mCapture.getLastTreeGenCapture(); ++ if (treeGenCapture!=null&&treeGenCapture.mEnable) + { -+ for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : capturedBlockSnapshots) ++ for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : treeGenCapture.mCapturedBlocks) + { + if (blocksnapshot.x == p_72805_1_ && blocksnapshot.y == p_72805_2_ && blocksnapshot.z == p_72805_3_) + { @@ -570,7 +613,7 @@ if (p_72805_1_ >= -30000000 && p_72805_3_ >= -30000000 && p_72805_1_ < 30000000 && p_72805_3_ < 30000000) { if (p_72805_2_ < 0) -@@ -511,7 +885,7 @@ +@@ -511,7 +857,7 @@ Chunk chunk = this.getChunkFromChunkCoords(p_72805_1_ >> 4, p_72805_3_ >> 4); p_72805_1_ &= 15; p_72805_3_ &= 15; @@ -579,7 +622,7 @@ } } else -@@ -610,6 +984,12 @@ +@@ -610,6 +956,12 @@ public void notifyBlockChange(int p_147444_1_, int p_147444_2_, int p_147444_3_, Block p_147444_4_) { @@ -592,7 +635,7 @@ this.notifyBlocksOfNeighborChange(p_147444_1_, p_147444_2_, p_147444_3_, p_147444_4_); } -@@ -694,6 +1074,21 @@ +@@ -694,6 +1046,21 @@ try { @@ -614,7 +657,7 @@ block.onNeighborBlockChange(this, p_147460_1_, p_147460_2_, p_147460_3_, p_147460_4_); } catch (Throwable throwable1) -@@ -1307,8 +1702,22 @@ +@@ -1307,8 +1674,22 @@ public boolean spawnEntityInWorld(Entity p_72838_1_) { @@ -630,15 +673,15 @@ + if(!this.isRemote){ + if(p_72838_1_ instanceof net.minecraft.entity.item.EntityItem&&this.restoringBlockSnapshots) + return false; -+ if(this.captureBlockSnapshots&&!(p_72838_1_ instanceof EntityPlayerMP)){ -+ this.capturedEntitySnapshots.add(new net.minecraftforge.common.util.EntitySnapshot(this,p_72838_1_,spawnReason)); ++ if(this.mCapture.isCapture()&&!(p_72838_1_ instanceof EntityPlayerMP)){ ++ this.mCapture.addCaptureEntity(this,p_72838_1_,spawnReason); + return true; + } + } int i = MathHelper.floor_double(p_72838_1_.posX / 16.0D); int j = MathHelper.floor_double(p_72838_1_.posZ / 16.0D); -@@ -1319,23 +1728,99 @@ +@@ -1319,23 +1700,99 @@ flag = true; } @@ -740,7 +783,7 @@ return true; } } -@@ -1346,6 +1831,8 @@ +@@ -1346,6 +1803,8 @@ { ((IWorldAccess)this.worldAccesses.get(i)).onEntityCreate(p_72923_1_); } @@ -749,7 +792,7 @@ } public void onEntityRemoved(Entity p_72847_1_) -@@ -1354,6 +1841,8 @@ +@@ -1354,6 +1813,8 @@ { ((IWorldAccess)this.worldAccesses.get(i)).onEntityDestroy(p_72847_1_); } @@ -758,7 +801,7 @@ } public void removeEntity(Entity p_72900_1_) -@@ -1397,6 +1886,19 @@ +@@ -1397,6 +1858,19 @@ } this.loadedEntityList.remove(p_72973_1_); @@ -778,7 +821,7 @@ this.onEntityRemoved(p_72973_1_); } -@@ -1408,40 +1910,58 @@ +@@ -1408,40 +1882,58 @@ public List getCollidingBoundingBoxes(Entity p_72945_1_, AxisAlignedBB p_72945_2_) { this.collidingBoundingBoxes.clear(); @@ -851,7 +894,7 @@ for (int j2 = 0; j2 < list.size(); ++j2) { -@@ -1797,11 +2317,22 @@ +@@ -1797,11 +2289,22 @@ Entity entity; CrashReport crashreport; CrashReportCategory crashreportcategory; @@ -874,7 +917,7 @@ try { ++entity.ticksExisted; -@@ -1812,14 +2343,7 @@ +@@ -1812,14 +2315,7 @@ crashreport = CrashReport.makeCrashReport(throwable2, "Ticking entity"); crashreportcategory = crashreport.makeCategory("Entity being ticked"); @@ -890,7 +933,7 @@ if (ForgeModContainer.removeErroringEntities) { -@@ -1862,10 +2386,14 @@ +@@ -1862,10 +2358,14 @@ this.unloadedEntityList.clear(); this.theProfiler.endStartSection("regular"); @@ -908,7 +951,7 @@ if (entity.ridingEntity != null) { -@@ -1884,7 +2412,9 @@ +@@ -1884,7 +2384,9 @@ { try { @@ -918,7 +961,7 @@ } catch (Throwable throwable1) { -@@ -1916,30 +2446,84 @@ +@@ -1916,30 +2418,84 @@ { this.getChunkFromChunkCoords(j, l).removeEntity(entity); } @@ -1010,7 +1053,7 @@ crashreport = CrashReport.makeCrashReport(throwable, "Ticking block entity"); crashreportcategory = crashreport.makeCategory("Block entity being ticked"); tileentity.func_145828_a(crashreportcategory); -@@ -1955,23 +2539,13 @@ +@@ -1955,23 +2511,13 @@ } } } @@ -1039,7 +1082,7 @@ if (!this.field_147483_b.isEmpty()) { for (Object tile : field_147483_b) -@@ -1981,6 +2555,7 @@ +@@ -1981,6 +2527,7 @@ this.loadedTileEntityList.removeAll(this.field_147483_b); this.field_147483_b.clear(); } @@ -1047,7 +1090,7 @@ this.field_147481_N = false; -@@ -2016,17 +2591,23 @@ +@@ -2016,17 +2563,23 @@ this.addedTileEntityList.clear(); } @@ -1074,7 +1117,7 @@ } public void updateEntity(Entity p_72870_1_) -@@ -2036,21 +2617,41 @@ +@@ -2036,21 +2589,41 @@ public void updateEntityWithOptionalForce(Entity p_72866_1_, boolean p_72866_2_) { @@ -1118,7 +1161,7 @@ p_72866_1_.lastTickPosX = p_72866_1_.posX; p_72866_1_.lastTickPosY = p_72866_1_.posY; p_72866_1_.lastTickPosZ = p_72866_1_.posZ; -@@ -2134,6 +2735,7 @@ +@@ -2134,6 +2707,7 @@ p_72866_1_.riddenByEntity = null; } } @@ -1126,7 +1169,7 @@ } } -@@ -2570,7 +3172,7 @@ +@@ -2570,7 +3144,7 @@ return; } @@ -1135,7 +1178,7 @@ { if (this.field_147481_N) { -@@ -2612,6 +3214,9 @@ +@@ -2612,6 +3186,9 @@ public void func_147457_a(TileEntity p_147457_1_) { @@ -1145,7 +1188,7 @@ this.field_147483_b.add(p_147457_1_); } -@@ -2718,7 +3323,15 @@ +@@ -2718,7 +3295,15 @@ if (i <= 0) { @@ -1162,7 +1205,7 @@ } } -@@ -2754,7 +3367,15 @@ +@@ -2754,7 +3339,15 @@ if (j <= 0) { @@ -1179,7 +1222,7 @@ } } -@@ -2777,8 +3398,41 @@ +@@ -2777,8 +3370,41 @@ protected void setActivePlayerChunksAndCheckLight() { this.activeChunkSet.clear(); @@ -1222,7 +1265,7 @@ int i; EntityPlayer entityplayer; int j; -@@ -2788,17 +3442,28 @@ +@@ -2788,17 +3414,28 @@ for (i = 0; i < this.playerEntities.size(); ++i) { entityplayer = (EntityPlayer)this.playerEntities.get(i); @@ -1257,7 +1300,7 @@ } this.theProfiler.endSection(); -@@ -2810,7 +3475,7 @@ +@@ -2810,7 +3447,7 @@ this.theProfiler.startSection("playerCheckLight"); @@ -1266,7 +1309,7 @@ { i = this.rand.nextInt(this.playerEntities.size()); entityplayer = (EntityPlayer)this.playerEntities.get(i); -@@ -3034,9 +3699,9 @@ +@@ -3034,9 +3671,9 @@ } } @@ -1278,7 +1321,7 @@ { return false; } -@@ -3166,6 +3831,16 @@ +@@ -3166,6 +3803,16 @@ } } @@ -1295,7 +1338,7 @@ this.theProfiler.endSection(); return true; } -@@ -3284,8 +3959,21 @@ +@@ -3284,8 +3931,21 @@ { Entity entity = (Entity)this.loadedEntityList.get(j); @@ -1318,7 +1361,7 @@ ++i; } } -@@ -3298,6 +3986,7 @@ +@@ -3298,6 +3958,7 @@ for (int i = 0; i < p_72868_1_.size(); ++i) { Entity entity = (Entity)p_72868_1_.get(i); @@ -1326,7 +1369,7 @@ if (!MinecraftForge.EVENT_BUS.post(new EntityJoinWorldEvent(entity, this))) { loadedEntityList.add(entity); -@@ -3314,8 +4003,17 @@ +@@ -3314,8 +3975,17 @@ public boolean canPlaceEntityOnSide(Block p_147472_1_, int p_147472_2_, int p_147472_3_, int p_147472_4_, boolean p_147472_5_, int p_147472_6_, Entity p_147472_7_, ItemStack p_147472_8_) { Block block1 = this.getBlock(p_147472_2_, p_147472_3_, p_147472_4_); @@ -1345,7 +1388,7 @@ } public PathEntity getPathEntityToEntity(Entity p_72865_1_, Entity p_72865_2_, float p_72865_3_, boolean p_72865_4_, boolean p_72865_5_, boolean p_72865_6_, boolean p_72865_7_) -@@ -3464,6 +4162,12 @@ +@@ -3464,6 +4134,12 @@ for (int i = 0; i < this.playerEntities.size(); ++i) { EntityPlayer entityplayer1 = (EntityPlayer)this.playerEntities.get(i); @@ -1358,7 +1401,7 @@ double d5 = entityplayer1.getDistanceSq(p_72977_1_, p_72977_3_, p_72977_5_); if ((p_72977_7_ < 0.0D || d5 < p_72977_7_ * p_72977_7_) && (d4 == -1.0D || d5 < d4)) -@@ -3489,7 +4193,12 @@ +@@ -3489,7 +4165,12 @@ for (int i = 0; i < this.playerEntities.size(); ++i) { EntityPlayer entityplayer1 = (EntityPlayer)this.playerEntities.get(i); @@ -1372,7 +1415,7 @@ if (!entityplayer1.capabilities.disableDamage && entityplayer1.isEntityAlive()) { double d5 = entityplayer1.getDistanceSq(p_72846_1_, p_72846_3_, p_72846_5_); -@@ -3660,6 +4369,18 @@ +@@ -3660,6 +4341,18 @@ public void updateAllPlayersSleepingFlag() {} @@ -1391,7 +1434,7 @@ public float getWeightedThunderStrength(float p_72819_1_) { return (this.prevThunderingStrength + (this.thunderingStrength - this.prevThunderingStrength) * p_72819_1_) * this.getRainStrength(p_72819_1_); -@@ -3932,8 +4653,8 @@ +@@ -3932,8 +4625,8 @@ */ public void addTileEntity(TileEntity entity) { @@ -1402,7 +1445,7 @@ { dest.add(entity); } -@@ -4029,4 +4750,122 @@ +@@ -4029,4 +4722,122 @@ } return count; } diff --git a/patches/net/minecraftforge/common/ForgeHooks.java.patch b/patches/net/minecraftforge/common/ForgeHooks.java.patch index 434fd5e..cd6df09 100644 --- a/patches/net/minecraftforge/common/ForgeHooks.java.patch +++ b/patches/net/minecraftforge/common/ForgeHooks.java.patch @@ -1,23 +1,74 @@ --- ../src-base/minecraft/net/minecraftforge/common/ForgeHooks.java +++ ../src-work/minecraft/net/minecraftforge/common/ForgeHooks.java -@@ -63,6 +63,16 @@ - import net.minecraftforge.event.world.BlockEvent; - import net.minecraftforge.event.world.NoteBlockEvent; - import static net.minecraft.init.Blocks.*; +@@ -1,5 +1,14 @@ + package net.minecraftforge.common; + ++import static net.minecraft.init.Blocks.diamond_block; ++import static net.minecraft.init.Blocks.diamond_ore; ++import static net.minecraft.init.Blocks.emerald_block; ++import static net.minecraft.init.Blocks.emerald_ore; ++import static net.minecraft.init.Blocks.gold_block; ++import static net.minecraft.init.Blocks.gold_ore; ++import static net.minecraft.init.Blocks.lit_redstone_ore; ++import static net.minecraft.init.Blocks.redstone_ore; ++ + import java.net.URI; + import java.util.ArrayList; + import java.util.List; +@@ -7,6 +16,8 @@ + import java.util.regex.Matcher; + import java.util.regex.Pattern; + ++import cc.capture.type.CaptureBlock; ++import cc.capture.type.CaptureTree; + import cpw.mods.fml.common.eventhandler.Event; + import cpw.mods.fml.relauncher.ReflectionHelper; + import net.minecraft.block.Block; +@@ -20,19 +31,15 @@ + import net.minecraft.inventory.Container; + import net.minecraft.inventory.ContainerRepair; + import net.minecraft.inventory.IInventory; +-import net.minecraft.item.Item; + import net.minecraft.item.ItemArmor; + import net.minecraft.item.ItemAxe; + import net.minecraft.item.ItemBucket; + import net.minecraft.item.ItemPickaxe; + import net.minecraft.item.ItemSpade; + import net.minecraft.item.ItemStack; +-import net.minecraft.item.ItemSword; +-import net.minecraft.nbt.NBTTagCompound; + import net.minecraft.network.NetHandlerPlayServer; + import net.minecraft.network.Packet; + import net.minecraft.network.play.server.S23PacketBlockChange; +-import net.minecraft.stats.StatList; + import net.minecraft.tileentity.TileEntity; + import net.minecraft.tileentity.TileEntityNote; + import net.minecraft.util.AxisAlignedBB; +@@ -46,8 +53,9 @@ + import net.minecraft.util.WeightedRandom; + import net.minecraft.world.World; + import net.minecraft.world.WorldSettings.GameType; +// Cauldron start +import net.minecraftforge.common.util.FakePlayer; -+import org.bukkit.Bukkit; -+import org.bukkit.Location; -+import org.bukkit.TreeType; -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.block.CraftBlockState; -+import org.bukkit.entity.Player; -+import org.bukkit.event.world.StructureGrowEvent; -+//Cauldron end + import net.minecraftforge.event.AnvilUpdateEvent; +-import net.minecraftforge.event.ForgeEventFactory; + import net.minecraftforge.event.ServerChatEvent; + import net.minecraftforge.event.entity.item.ItemTossEvent; + import net.minecraftforge.event.entity.living.LivingAttackEvent; +@@ -58,11 +66,10 @@ + import net.minecraftforge.event.entity.living.LivingFallEvent; + import net.minecraftforge.event.entity.living.LivingHurtEvent; + import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent; +-import net.minecraftforge.event.entity.player.PlayerOpenContainerEvent; + import net.minecraftforge.event.entity.player.AnvilRepairEvent; ++import net.minecraftforge.event.entity.player.PlayerOpenContainerEvent; + import net.minecraftforge.event.world.BlockEvent; + import net.minecraftforge.event.world.NoteBlockEvent; +-import static net.minecraft.init.Blocks.*; public class ForgeHooks { -@@ -379,10 +389,12 @@ +@@ -379,10 +386,12 @@ public static ChatComponentTranslation onServerChatEvent(NetHandlerPlayServer net, String raw, ChatComponentTranslation comp) { ServerChatEvent event = new ServerChatEvent(net.playerEntity, raw, comp); @@ -30,7 +81,7 @@ return event.component; } -@@ -439,6 +451,8 @@ +@@ -439,6 +448,8 @@ public static BlockEvent.BreakEvent onBlockBreakEvent(World world, GameType gameType, EntityPlayerMP entityPlayer, int x, int y, int z) { @@ -39,7 +90,7 @@ // Logic from tryHarvestBlock for pre-canceling the event boolean preCancelEvent = false; if (gameType.isAdventure() && !entityPlayer.isCurrentToolAdventureModeExempt(x, y, z)) -@@ -449,9 +463,9 @@ +@@ -449,9 +460,9 @@ { preCancelEvent = true; } @@ -51,7 +102,7 @@ { S23PacketBlockChange packet = new S23PacketBlockChange(x, y, z, world); packet.field_148883_d = Blocks.air; -@@ -463,11 +477,11 @@ +@@ -463,11 +474,11 @@ Block block = world.getBlock(x, y, z); int blockMetadata = world.getBlockMetadata(x, y, z); BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(x, y, z, world, block, blockMetadata, entityPlayer); @@ -65,62 +116,73 @@ { // Let the client know the block still exists entityPlayer.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); -@@ -500,81 +514,157 @@ - if (!(itemstack.getItem() instanceof ItemBucket)) // if not bucket - { - world.captureBlockSnapshots = true; +@@ -488,95 +499,43 @@ + + public static boolean onPlaceItemIntoWorld(ItemStack itemstack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { +- // handle all placement events here +- int meta = itemstack.getItemDamage(); +- int size = itemstack.stackSize; +- NBTTagCompound nbt = null; +- if (itemstack.getTagCompound() != null) +- { +- nbt = (NBTTagCompound)itemstack.getTagCompound().copy(); +- } ++ // handle all placement events here ++ CaptureBlock tCapture=null; ++ CaptureTree tTreeGenCapture=null; + +- if (!(itemstack.getItem() instanceof ItemBucket)) // if not bucket +- { +- world.captureBlockSnapshots = true; ++ if(!(itemstack.getItem() instanceof ItemBucket)){ // if not bucket ++ tCapture=world.mCapture.startCapture(player,itemstack); ++ tCapture.setAgaistPostionAndSide(side,x,y,z); + // Cauldron start -+ if (itemstack.getItem() instanceof net.minecraft.item.ItemDye && itemstack.getItemDamage() == 15) -+ { -+ Block block = world.getBlock(x, y, z); -+ if (block != null && (block instanceof net.minecraft.block.BlockSapling || block instanceof net.minecraft.block.BlockMushroom)) -+ { -+ world.captureTreeGeneration = true; ++ if(itemstack.getItem() instanceof net.minecraft.item.ItemDye&&itemstack.getItemDamage()==15){ ++ Block block=world.getBlock(x,y,z); ++ if(block!=null&&(block instanceof net.minecraft.block.BlockSapling||block instanceof net.minecraft.block.BlockMushroom)){ ++ tTreeGenCapture=world.mCapture.startTreeGenCapture(player,x,y,z); ++ tTreeGenCapture.setAgaistPostionAndSide(x,y,z,side); + } + } + // Cauldron end } -+ ItemStack.currentPlayer = player; // Cauldron - boolean flag = itemstack.getItem().onItemUse(itemstack, player, world, x, y, z, side, hitX, hitY, hitZ); -+ ItemStack.currentPlayer = null; // Cauldron - world.captureBlockSnapshots = false; +- boolean flag = itemstack.getItem().onItemUse(itemstack, player, world, x, y, z, side, hitX, hitY, hitZ); +- world.captureBlockSnapshots = false; ++ ItemStack.currentPlayer=player; // Cauldron ++ boolean flag=itemstack.getItem().onItemUse(itemstack,player,world,x,y,z,side,hitX,hitY,hitZ); ++ ItemStack.currentPlayer=null; // Cauldron - if (flag) -+ // Cauldron start -+ if (flag && world.captureTreeGeneration && world.capturedBlockSnapshots.size() > 0) - { +- { - // save new item data - int newMeta = itemstack.getItemDamage(); - int newSize = itemstack.stackSize; - NBTTagCompound newNBT = null; - if (itemstack.getTagCompound() != null) -+ world.captureTreeGeneration = false; -+ Location loc = new Location(world.getWorld(), (double) x, (double) y, (double) z); -+ TreeType type = net.minecraft.block.BlockSapling.treeType; -+ net.minecraft.block.BlockSapling.treeType = null; -+ List states = new ArrayList(); -+ -+ for (net.minecraftforge.common.util.BlockSnapshot snapshot : (List) world.capturedBlockSnapshots.clone()) - { +- { - newNBT = (NBTTagCompound)itemstack.getTagCompound().copy(); -+ states.add(new CraftBlockState(snapshot)); - } +- } - net.minecraftforge.event.world.BlockEvent.PlaceEvent placeEvent = null; - List blockSnapshots = (List) world.capturedBlockSnapshots.clone(); - world.capturedBlockSnapshots.clear(); ++ if(tCapture!=null) tCapture.disableCapture(); ++ if(tTreeGenCapture!=null) tTreeGenCapture.disableCapture(); - // make sure to set pre-placement item data for event - itemstack.setItemDamage(meta); - itemstack.stackSize = size; - if (nbt != null) -+ world.capturedBlockSnapshots.clear(); -+ StructureGrowEvent event = null; -+ if (type != null) - { +- { - itemstack.setTagCompound(nbt); -+ event = new StructureGrowEvent(loc, type, false, (Player) player.getBukkitEntity(), states); -+ Bukkit.getPluginManager().callEvent(event); ++ // Cauldron start ++ if(flag){ ++ if(tTreeGenCapture!=null&&tTreeGenCapture.mCapturedBlocks.size()>0){ ++ tTreeGenCapture.endCapture(); ++ }else if(tCapture!=null){ ++ tCapture.endCapture(); } - if (blockSnapshots.size() > 1) - { @@ -130,72 +192,30 @@ - { - placeEvent = ForgeEventFactory.onPlayerBlockPlace(player, blockSnapshots.get(0), net.minecraftforge.common.util.ForgeDirection.getOrientation(side)); - } - +- - if (placeEvent != null && (placeEvent.isCanceled())) -+ if (event == null || !event.isCancelled()) - { +- { - flag = false; // cancel placement - // revert back all captured blocks - for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : blockSnapshots) -+ for (BlockState state : states) - { +- { - world.restoringBlockSnapshots = true; - blocksnapshot.restore(true, false); - world.restoringBlockSnapshots = false; -+ state.update(true); - } - } +- } +- } - else -+ -+ return flag; -+ } -+ else -+ { -+ world.captureTreeGeneration = false; // Cauldron end -+ if (flag) - { +- { - // Change the stack to its new content - itemstack.setItemDamage(newMeta); - itemstack.stackSize = newSize; -+ // save new item data -+ int newMeta = itemstack.getItemDamage(); -+ int newSize = itemstack.stackSize; -+ NBTTagCompound newNBT = null; -+ if (itemstack.getTagCompound() != null) -+ { -+ newNBT = (NBTTagCompound) itemstack.getTagCompound().copy(); -+ } -+ net.minecraftforge.event.world.BlockEvent.PlaceEvent placeEvent = null; -+ List blockSnapshots = (List) world.capturedBlockSnapshots -+ .clone(); -+ world.capturedBlockSnapshots.clear(); -+ List tDropItemSnapshots=(List)world.capturedEntitySnapshots.clone(); -+ world.capturedEntitySnapshots.clear(); -+ List tCaptureItems=(List)world.capturedItems.clone(); -+ world.capturedItems.clear(); -+ -+ // make sure to set pre-placement item data for event -+ itemstack.setItemDamage(meta); -+ itemstack.stackSize = size; - if (nbt != null) - { +- if (nbt != null) +- { - itemstack.setTagCompound(newNBT); -+ itemstack.setTagCompound(nbt); - } -+ if (blockSnapshots.size() > 1) -+ { -+ placeEvent = ForgeEventFactory.onPlayerMultiBlockPlace(player, blockSnapshots, -+ net.minecraftforge.common.util.ForgeDirection.getOrientation(side)); -+ } -+ else if (blockSnapshots.size() == 1) -+ { -+ placeEvent = ForgeEventFactory.onPlayerBlockPlace(player, blockSnapshots.get(0), -+ net.minecraftforge.common.util.ForgeDirection.getOrientation(side)); -+ } - +- } +- - for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : blockSnapshots) -+ if (placeEvent != null && (placeEvent.isCanceled())) - { +- { - int blockX = blocksnapshot.x; - int blockY = blocksnapshot.y; - int blockZ = blocksnapshot.z; @@ -204,69 +224,20 @@ - Block oldBlock = blocksnapshot.replacedBlock; - Block newBlock = world.getBlock(blockX, blockY, blockZ); - if (newBlock != null && !(newBlock.hasTileEntity(metadata))) // Containers get placed automatically -+ flag = false; // cancel placement -+ // revert back all captured blocks -+ for(int i=blockSnapshots.size();i>0;){ -+ world.restoringBlockSnapshots=true; -+ blockSnapshots.get(--i).restore(true,false); -+ world.restoringBlockSnapshots=false; -+ } -+ for(net.minecraftforge.common.util.EntitySnapshot sEntityItem : tDropItemSnapshots){ -+ sEntityItem.cancel(); -+ } -+ } -+ else -+ { -+ // Change the stack to its new content -+ itemstack.setItemDamage(newMeta); -+ itemstack.stackSize = newSize; -+ if (nbt != null) - { +- { - newBlock.onBlockAdded(world, blockX, blockY, blockZ); -+ itemstack.setTagCompound(newNBT); - } - +- } +- - world.markAndNotifyBlock(blockX, blockY, blockZ, null, oldBlock, newBlock, updateFlag); -+ for (net.minecraftforge.common.util.BlockSnapshot blocksnapshot : blockSnapshots) -+ { -+ int blockX = blocksnapshot.x; -+ int blockY = blocksnapshot.y; -+ int blockZ = blocksnapshot.z; -+ int metadata = world.getBlockMetadata(blockX, blockY, blockZ); -+ int updateFlag = blocksnapshot.flag; -+ Block oldBlock = blocksnapshot.replacedBlock; -+ Block newBlock = world.getBlock(blockX, blockY, blockZ); -+ if (newBlock != null && !(newBlock.hasTileEntity(metadata))) // Containers -+ // get -+ // placed -+ // automatically -+ { -+ newBlock.onBlockAdded(world, blockX, blockY, blockZ); -+ } -+ -+ world.markAndNotifyBlock(blockX, blockY, blockZ, null, oldBlock, newBlock, updateFlag); -+ } -+ for(net.minecraftforge.common.util.EntitySnapshot sEntityItem : tDropItemSnapshots){ -+ sEntityItem.apply(); -+ } -+ if(!tCaptureItems.isEmpty()){ -+ boolean tAdded=false; -+ for(ItemStack sItem : tCaptureItems){ -+ if(!player.inventory.addItemStackToInventory(sItem)){ -+ world.spawnEntityInWorld(new EntityItem(world,player.posX,player.posY,player.posZ,sItem)); -+ }else{ -+ tAdded=true; -+ } -+ } -+ if(tAdded) player.openContainer.detectAndSendChanges(); -+ } -+ player.addStat(StatList.objectUseStats[Item.getIdFromItem(itemstack.getItem())], 1); - } +- } - player.addStat(StatList.objectUseStats[Item.getIdFromItem(itemstack.getItem())], 1); -+ - } +- } } -+ - world.capturedBlockSnapshots.clear(); +- world.capturedBlockSnapshots.clear(); ++ if(tCapture!=null) tCapture.markHandled(); ++ if(tTreeGenCapture!=null) tTreeGenCapture.markHandled(); ++ return flag; + } + diff --git a/patches/net/minecraftforge/event/world/BlockEvent.java.patch b/patches/net/minecraftforge/event/world/BlockEvent.java.patch index 8d61880..fc6d5c6 100644 --- a/patches/net/minecraftforge/event/world/BlockEvent.java.patch +++ b/patches/net/minecraftforge/event/world/BlockEvent.java.patch @@ -1,23 +1,33 @@ --- ../src-base/minecraft/net/minecraftforge/event/world/BlockEvent.java +++ ../src-work/minecraft/net/minecraftforge/event/world/BlockEvent.java -@@ -16,6 +16,16 @@ - import net.minecraftforge.common.ForgeHooks; - import net.minecraftforge.common.util.BlockSnapshot; +@@ -3,17 +3,23 @@ + import java.util.ArrayList; + import java.util.List; +import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.block.CraftBlockState; +// Cauldron start +import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockMultiPlaceEvent; + + import com.google.common.collect.ImmutableList; + ++import cc.capture.type.CaptureBlock; + import cpw.mods.fml.common.eventhandler.Cancelable; + import cpw.mods.fml.common.eventhandler.Event; + import net.minecraft.block.Block; +-import net.minecraft.enchantment.EnchantmentHelper; + import net.minecraft.entity.player.EntityPlayer; +-import net.minecraft.init.Blocks; +import net.minecraft.entity.player.EntityPlayerMP; +// Cauldron end -+ - public class BlockEvent extends Event { - private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("forge.debugBlockEvent", "false")); + import net.minecraft.item.ItemStack; + import net.minecraft.world.World; +-import net.minecraftforge.common.ForgeHooks; + import net.minecraftforge.common.util.BlockSnapshot; -@@ -80,17 +90,18 @@ + public class BlockEvent extends Event { +@@ -80,17 +86,18 @@ super(x, y, z, world, block, blockMetadata); this.player = player; @@ -42,7 +52,7 @@ } public EntityPlayer getPlayer() -@@ -140,6 +151,16 @@ +@@ -140,6 +147,21 @@ this.blockSnapshot = blockSnapshot; this.placedBlock = blockSnapshot.getCurrentBlock(); this.placedAgainst = placedAgainst; @@ -54,12 +64,17 @@ + if(bukkitEvent.isCancelled()||!bukkitEvent.canBuild()){ + this.setCanceled(true); + } ++ ++ CaptureBlock tCapture=world.mCapture.getLastBlockCapture(); ++ if(tCapture!=null&&tCapture.mEnable){ ++ tCapture.addCheckedBlock(world,x,y,z); ++ } + } + // Cauldron end if (DEBUG) { System.out.printf("Created PlaceEvent - [PlacedBlock: %s ][PlacedAgainst: %s ][ItemStack: %s ][Player: %s ]\n", placedBlock, placedAgainst, player.getCurrentEquippedItem(), player); -@@ -160,7 +181,17 @@ +@@ -160,7 +182,17 @@ public MultiPlaceEvent(List blockSnapshots, Block placedAgainst, EntityPlayer player) { super(blockSnapshots.get(0), placedAgainst, player); diff --git a/src/main/java/cc/Location.java b/src/main/java/cc/Location.java new file mode 100644 index 0000000..011a4dc --- /dev/null +++ b/src/main/java/cc/Location.java @@ -0,0 +1,40 @@ +package cc; + +import net.minecraft.world.World; + +public class Location{ + + public World mWorld; + + public int mPosX=0; + public int mPosY=0; + public int mPosZ=0; + + private String mToString=null; + + public Location(World pWorld,int pPosX,int pPosY,int pPosZ){ + this.mWorld=pWorld; + this.mPosX=pPosX; + this.mPosY=pPosY; + this.mPosZ=pPosZ; + } + + @Override + public String toString(){ + if(this.mToString==null){ + this.mToString=this.mWorld.worldInfo.getWorldName()+"("+this.mPosX+","+this.mPosY+","+this.mPosZ+")"; + } + return this.mToString; + } + + @Override + public int hashCode(){ + return this.toString().hashCode(); + } + + @Override + public boolean equals(Object pObj){ + return pObj instanceof Location&&((Location)pObj).hashCode()==this.hashCode(); + } + +} diff --git a/src/main/java/cc/capture/ItemSnapshot.java b/src/main/java/cc/capture/ItemSnapshot.java new file mode 100644 index 0000000..90b94fe --- /dev/null +++ b/src/main/java/cc/capture/ItemSnapshot.java @@ -0,0 +1,38 @@ +package cc.capture; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class ItemSnapshot{ + + public final EntityPlayer mPlayer; + public final ItemStack mItem; + + private boolean mApply=false; + + public ItemSnapshot(EntityPlayer pPlayer,ItemStack pItem){ + this.mPlayer=pPlayer; + this.mItem=pItem; + } + + /** + * 将物品放到玩家身上 + * + * @return 如果背包满,将生成物品在地上并返回false + */ + public boolean apply(){ + if(!this.mApply){ + this.mApply=true; + this.mPlayer.inventory.addItemStackToInventory(this.mItem); + + if(!this.mPlayer.inventory.addItemStackToInventory(this.mItem)){ + this.mPlayer.worldObj.spawnEntityInWorld( + new EntityItem(this.mPlayer.worldObj,this.mPlayer.posX,this.mPlayer.posY,this.mPlayer.posZ,this.mItem)); + return false; + } + } + return true; + } + +} diff --git a/src/main/java/cc/capture/WorldCapture.java b/src/main/java/cc/capture/WorldCapture.java new file mode 100644 index 0000000..dcbaf7d --- /dev/null +++ b/src/main/java/cc/capture/WorldCapture.java @@ -0,0 +1,171 @@ +package cc.capture; + +import java.util.Iterator; +import java.util.Stack; +import java.util.concurrent.atomic.AtomicInteger; + +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +import cc.capture.type.ACapture; +import cc.capture.type.CaptureBlock; +import cc.capture.type.CaptureTree; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class WorldCapture{ + + public final World mWorld; + /** Capture任务Id生成器 */ + private AtomicInteger mIdCreate=new AtomicInteger(); + /** 方块捕获任务 */ + public Stack mBlockCaptures=new Stack(); + /** 树捕获任务 */ + public Stack mTreeCaptures=new Stack(); + + public WorldCapture(World pWorld){ + this.mWorld=pWorld; + } + + public CaptureBlock getLastBlockCapture(){ + return getEleOrLast(this.mBlockCaptures,-1); + } + + public CaptureTree getLastTreeGenCapture(){ + return getEleOrLast(this.mTreeCaptures,-1); + } + + public static T getEleOrLast(Stack pStack,int pId){ + if(pId!=-1){ + Iterator tIt=pStack.iterator(); + while(tIt.hasNext()){ + T tCapture=tIt.next(); + if(tCapture.mHandled){ + tIt.remove(); + }else if(tCapture.mId==pId){ + return tCapture; + } + } + } + + while(!pStack.isEmpty()){ + T tCapture=pStack.lastElement(); + if(tCapture.mHandled){ + pStack.pop(); + } + return tCapture; + } + + return null; + } + + public void addCaptureEntity(World pWorld,Entity pEntity,SpawnReason pReason){ + CaptureBlock tCapture=this.getLastBlockCapture(); + if(tCapture==null||!tCapture.mEnable) return; + + tCapture.addCaptureEntity(pWorld,pEntity,pReason); + } + + public void addCaptureItem(EntityPlayer pPlayer,ItemStack pItem){ + CaptureBlock tCapture=this.getLastBlockCapture(); + if(tCapture==null||!tCapture.mEnable) return; + + tCapture.addCaptureItem(pPlayer,pItem); + } + + public void addCheckedBlock(World pWorld,int pPosX,int pPosY,int pPosZ){ + CaptureBlock tCapture=this.getLastBlockCapture(); + if(tCapture==null||!tCapture.mEnable) return; + + tCapture.addCheckedBlock(pWorld,pPosX,pPosY,pPosZ); + } + + public boolean isCapture(){ + CaptureBlock tCapture=this.getLastBlockCapture(); + return tCapture!=null&&tCapture.mEnable; + } + + public boolean isTreeGenCapture(){ + CaptureTree tCapture=this.getLastTreeGenCapture(); + return tCapture!=null&&tCapture.mEnable; + } + + public CaptureBlock startCapture(EntityPlayer pPlayer){ + ItemStack tItem=null; + int tSlot=-1; + if(pPlayer!=null){ + tSlot=pPlayer.inventory.currentItem; + tItem=pPlayer.getCurrentEquippedItem(); + } + return this.startCapture(pPlayer,tItem,tSlot); + + } + + public CaptureBlock startCapture(EntityPlayer pPlayer,ItemStack pCurrent){ + return this.startCapture(pPlayer,pCurrent,-1); + } + + public CaptureBlock startCapture(EntityPlayer pPlayer,ItemStack pCurrent,int pSlot){ + CaptureBlock tCapture=this.mBlockCaptures.push(new CaptureBlock(this,this.mIdCreate.incrementAndGet(),pPlayer)); + tCapture.mUseItem=pCurrent; + if(pCurrent!=null){ + tCapture.mOldItemMeta=pCurrent.getItemDamage(); + tCapture.mOldItemSize=pCurrent.stackSize; + tCapture.mOldItemNBT=pCurrent.stackTagCompound; + tCapture.mSlot=pSlot; + } + return tCapture; + } + + public void disableCapture(){ + CaptureBlock tCapture=this.getLastBlockCapture(); + if(tCapture==null) return; + + tCapture.mEnable=false; + } + + public boolean endCapture(int pId){ + CaptureBlock tCapture=getEleOrLast(this.mBlockCaptures,pId); + if(tCapture==null) return true; + + this.mBlockCaptures.remove(tCapture); + return tCapture.endCapture(); + + } + + public CaptureTree startTreeGenCapture(EntityPlayer pPlayer,int pPosX,int pPosY,int pPosZ){ + CaptureTree tCapture=this.mTreeCaptures.push(new CaptureTree(this,this.mIdCreate.incrementAndGet(),pPlayer)); + tCapture.setAgaistPostionAndSide(-1,pPosX,pPosY,pPosZ); + return tCapture; + } + + public CaptureTree startTreeGenCapture(EntityPlayer pPlayer,org.bukkit.Location pTreeLoc){ + return this.startTreeGenCapture(pPlayer,pTreeLoc.getBlockX(),pTreeLoc.getBlockY(),pTreeLoc.getBlockZ()); + } + + public CaptureTree disableTreeGenCapture(int pId){ + CaptureTree tCapture=getEleOrLast(this.mTreeCaptures,pId); + if(tCapture==null) return null; + + tCapture.mEnable=false; + return tCapture; + } + + public boolean endTreeGenCapture(int pId){ + CaptureTree tCapture=getEleOrLast(this.mTreeCaptures,pId); + if(tCapture==null) return true; + + this.mTreeCaptures.remove(tCapture); + return tCapture.endCapture(); + } + + /** + * 清理捕获的数据 + */ + public void clearAllData(){ + this.mBlockCaptures.clear(); + this.mTreeCaptures.clear(); + } + +} diff --git a/src/main/java/cc/capture/type/ACapture.java b/src/main/java/cc/capture/type/ACapture.java new file mode 100644 index 0000000..29c2d00 --- /dev/null +++ b/src/main/java/cc/capture/type/ACapture.java @@ -0,0 +1,68 @@ +package cc.capture.type; + +import java.util.ArrayList; + +import cc.capture.WorldCapture; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class ACapture{ + + public final WorldCapture mWorldCapture; + public final World mWorld; + public final int mId; + /** 是否启用捕获 */ + public boolean mEnable=true; + /** 是否已经处理完毕 */ + public boolean mHandled=false; + /** 当前捕获作用的玩家,可能为null,用作普通捕获 */ + public final EntityPlayer mCapturePlayer; + /** 方块放置时顶着的面 */ + protected ForgeDirection mSide=ForgeDirection.UNKNOWN; + protected Block mAgaistBlock=Blocks.air; + /** 捕获的数据 */ + public ArrayList mCapturedBlocks=new ArrayList(); + + public ACapture(WorldCapture pWorldCapture,int pId,EntityPlayer pPlayer){ + this.mWorldCapture=pWorldCapture; + this.mWorld=pWorldCapture.mWorld; + this.mId=pId; + this.mCapturePlayer=pPlayer; + } + + public void setAgaistPostionAndSide(int pSide,int pPosX,int pPosY,int pPosZ){ + this.mSide=ForgeDirection.getOrientation(pSide); + this.mAgaistBlock=this.mWorldCapture.mWorld.getBlock(pPosX,pPosY,pPosZ); + } + + public void addCapturedBlock(World pWorld,int pPosX,int pPosY,int pPosZ){ + this.addCapturedBlock(pWorld,pPosX,pPosY,pPosZ,3); + } + + public void addCapturedBlock(World pWorld,int pPosX,int pPosY,int pPosZ,int pFlag){ + if(!this.mEnable) return; + + BlockSnapshot tSnapshot=BlockSnapshot.getBlockSnapshot(pWorld,pPosX,pPosY,pPosZ,pFlag); + this.mCapturedBlocks.add(tSnapshot); + } + + public void disableCapture(){ + this.mEnable=false; + } + + /** + * 标记此捕获为已经处理 + *

+ * 只设置捕获中的数据,并从世界捕获中移除,不会清理捕获数据 + *

+ */ + public void markHandled(){ + this.mEnable=false; + this.mHandled=true; + } + +} diff --git a/src/main/java/cc/capture/type/CaptureBlock.java b/src/main/java/cc/capture/type/CaptureBlock.java new file mode 100644 index 0000000..a172cc8 --- /dev/null +++ b/src/main/java/cc/capture/type/CaptureBlock.java @@ -0,0 +1,154 @@ +package cc.capture.type; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; + +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +import cc.Location; +import cc.capture.EntitySnapshot; +import cc.capture.ItemSnapshot; +import cc.capture.WorldCapture; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.StatList; +import net.minecraft.world.World; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.world.BlockEvent.PlaceEvent; + +public class CaptureBlock extends ACapture{ + + /** 是否为还原模式 */ + public boolean mRestoring=false; + /** 当前物品 */ + public ItemStack mUseItem=null; + /** 当前物品所在的快捷栏位置,如果为-1表示不存在,或者不是从背包取出的物品 */ + public int mSlot=-1; + public int mOldItemSize=0; + public int mOldItemMeta=0; + public NBTTagCompound mOldItemNBT=null; + /** 捕获的数据 */ + public ArrayList mCapturedEntitys=new ArrayList(); + public ArrayList mCapturedItems=new ArrayList(); + public ArrayList mCheckedBlocks=new ArrayList(); + + public CaptureBlock(WorldCapture pWorldCapture,int pId,EntityPlayer pPlayer){ + super(pWorldCapture,pId,pPlayer); + } + + @Override + public void markHandled(){ + super.markHandled(); + this.mWorldCapture.mBlockCaptures.remove(this); + } + + @Override + public void addCapturedBlock(World pWorld,int pPosX,int pPosY,int pPosZ,int pFlag){ + if(!this.mEnable||this.isChecked(pWorld,pPosX,pPosY,pPosZ,false)) + return; + + super.addCapturedBlock(pWorld,pPosX,pPosY,pPosZ,pFlag); + } + + public void addCapturedBlock(BlockSnapshot pSnapshot){ + if(!this.mEnable||this.isChecked(pSnapshot.world,pSnapshot.x,pSnapshot.y,pSnapshot.z,false)) + return; + + this.mCapturedBlocks.add(pSnapshot); + } + + public boolean isChecked(World pWorld,int pPosX,int pPosY,int pPosZ,boolean pSimula){ + if(!this.mCheckedBlocks.isEmpty()){ + Iterator tIt=this.mCheckedBlocks.iterator(); + while(tIt.hasNext()){ + Location tLoc=tIt.next(); + if(tLoc.mWorld==pWorld&&tLoc.mPosX==pPosX&&tLoc.mPosY==pPosY&&tLoc.mPosZ==pPosZ){ + if(!pSimula) tIt.remove(); + return true; + } + } + } + return false; + } + + public void addCaptureEntity(World pWorld,Entity pEntity,SpawnReason pReason){ + if(!this.mEnable) return; + + this.mCapturedEntitys.add(new EntitySnapshot(pWorld,pEntity,pReason)); + } + + public void addCaptureItem(EntityPlayer pPlayer,ItemStack pItem){ + if(!this.mEnable) return; + + this.mCapturedItems.add(new ItemSnapshot(pPlayer,pItem)); + } + + public void addCheckedBlock(World pWorld,int pPosX,int pPosY,int pPosZ){ + this.mCheckedBlocks.add(new Location(pWorld,pPosX,pPosY,pPosZ)); + } + + public boolean endCapture(){ + if(this.mHandled) return true; + this.markHandled(); + + boolean tResult; + PlaceEvent tPlaceEvent=null; + if(this.mCapturedBlocks.size()>1){ + tPlaceEvent=ForgeEventFactory.onPlayerMultiBlockPlace(this.mCapturePlayer,this.mCapturedBlocks,this.mSide); + }else if(this.mCapturedBlocks.size()==1){ + tPlaceEvent=ForgeEventFactory.onPlayerBlockPlace(this.mCapturePlayer,this.mCapturedBlocks.get(0),this.mSide); + } + + if(tPlaceEvent!=null&&(tPlaceEvent.isCanceled())){ + if(this.mUseItem!=null){ + if(this.mSlot==-1){ + this.mUseItem.setItemDamage(this.mOldItemMeta); + this.mUseItem.stackSize=this.mOldItemSize; + this.mUseItem.setTagCompound(this.mOldItemNBT); + }else{ + this.mCapturePlayer.inventory.setInventorySlotContents(this.mSlot,this.mUseItem); + } + } + if(!this.mCapturedBlocks.isEmpty()){ + for(int i=this.mCapturedBlocks.size();i>0;){ + this.mRestoring=true; + BlockSnapshot tSnapshot=this.mCapturedBlocks.get(--i); + tSnapshot.restore(true,false); + this.mRestoring=false; + } + } + for(EntitySnapshot sSnapshot : this.mCapturedEntitys){ + sSnapshot.cancel(); + } + tResult=false; + }else{ + for(EntitySnapshot sSnapshot : this.mCapturedEntitys){ + sSnapshot.apply(); + } + if(!this.mCapturedItems.isEmpty()){ + HashSet tNotifyPlayers=new HashSet(); + for(ItemSnapshot sSnapshot : this.mCapturedItems){ + if(sSnapshot.apply()){ + tNotifyPlayers.add(sSnapshot.mPlayer); + } + } + for(EntityPlayer sPlayer : tNotifyPlayers){ + sPlayer.openContainer.detectAndSendChanges(); + } + } + if(this.mUseItem!=null&&this.mCapturePlayer!=null){ + this.mCapturePlayer.addStat(StatList.objectUseStats[Item.getIdFromItem(this.mUseItem.getItem())],1); + } + tResult=true; + } + + return tResult; + + } + +} diff --git a/src/main/java/cc/capture/type/CaptureTree.java b/src/main/java/cc/capture/type/CaptureTree.java new file mode 100644 index 0000000..dfd43c3 --- /dev/null +++ b/src/main/java/cc/capture/type/CaptureTree.java @@ -0,0 +1,72 @@ +package cc.capture.type; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.TreeType; +import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.block.CraftBlockState; +import org.bukkit.entity.Player; +import org.bukkit.event.world.StructureGrowEvent; + +import cc.capture.WorldCapture; +import net.minecraft.block.BlockSapling; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.util.BlockSnapshot; + +public class CaptureTree extends ACapture{ + + /** 捕获数模式下的位置 */ + public org.bukkit.Location mTreeLoc=null; + + public CaptureTree(WorldCapture pWorldCapture,int pId,EntityPlayer pPlayer){ + super(pWorldCapture,pId,pPlayer); + } + + @Override + public void setAgaistPostionAndSide(int pSide,int pPosX,int pPosY,int pPosZ){ + super.setAgaistPostionAndSide(pSide,pPosX,pPosY,pPosZ); + this.mTreeLoc=new org.bukkit.Location(this.mWorld.getWorld(),(double)pPosX,(double)pPosY,(double)pPosZ); + } + + @Override + public void markHandled(){ + super.markHandled(); + this.mWorldCapture.mTreeCaptures.remove(this); + } + + public boolean endCapture(){ + if(this.mHandled) return true; + this.markHandled(); + + boolean tResult=true; + if(this.mCapturedBlocks.size()>0) + return true; + + TreeType tType=BlockSapling.treeType; + BlockSapling.treeType=null; + List tStates=new ArrayList(); + + for(BlockSnapshot sSnapshot : (List)this.mCapturedBlocks.clone()){ + tStates.add(new CraftBlockState(sSnapshot)); + } + + StructureGrowEvent tEvent=null; + if(tType!=null){ + tEvent=new StructureGrowEvent(this.mTreeLoc,tType,false, + this.mCapturePlayer==null?null:(Player)this.mCapturePlayer.getBukkitEntity(),tStates); + Bukkit.getPluginManager().callEvent(tEvent); + } + + if(tEvent==null||!tEvent.isCancelled()){ + for(BlockState sState : tStates){ + sState.update(true); + } + tResult=true; + } + + return tResult; + } + +} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index d6dd160..ff0343d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -1,7 +1,5 @@ package org.bukkit.craftbukkit; -import gnu.trove.procedure.TObjectProcedure; - import java.io.File; import java.util.ArrayList; import java.util.Collection; @@ -11,11 +9,6 @@ import java.util.Random; import java.util.Set; import java.util.UUID; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraftforge.common.util.BlockSnapshot; - import org.apache.commons.lang.Validate; import org.bukkit.BlockChangeDelegate; import org.bukkit.Bukkit; @@ -30,15 +23,74 @@ import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.block.CraftBlock; -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.entity.*; +import org.bukkit.craftbukkit.entity.CraftItem; +import org.bukkit.craftbukkit.entity.CraftLightningStrike; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.metadata.BlockMetadataStore; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.util.LongHash; -import org.bukkit.entity.*; +import org.bukkit.entity.Ambient; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Bat; +import org.bukkit.entity.Blaze; +import org.bukkit.entity.Boat; +import org.bukkit.entity.CaveSpider; +import org.bukkit.entity.Chicken; +import org.bukkit.entity.ComplexLivingEntity; +import org.bukkit.entity.Cow; +import org.bukkit.entity.CreatureType; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.Egg; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.EnderSignal; +import org.bukkit.entity.Enderman; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Ghast; +import org.bukkit.entity.Giant; +import org.bukkit.entity.Golem; +import org.bukkit.entity.Hanging; +import org.bukkit.entity.Horse; +import org.bukkit.entity.IronGolem; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.LeashHitch; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.MagmaCube; +import org.bukkit.entity.Minecart; +import org.bukkit.entity.MushroomCow; +import org.bukkit.entity.Ocelot; +import org.bukkit.entity.Painting; +import org.bukkit.entity.Pig; +import org.bukkit.entity.PigZombie; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Sheep; +import org.bukkit.entity.Silverfish; +import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Slime; +import org.bukkit.entity.SmallFireball; +import org.bukkit.entity.Snowball; +import org.bukkit.entity.Snowman; +import org.bukkit.entity.Spider; +import org.bukkit.entity.Squid; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.entity.Tameable; +import org.bukkit.entity.ThrownExpBottle; +import org.bukkit.entity.ThrownPotion; +import org.bukkit.entity.Villager; +import org.bukkit.entity.Weather; +import org.bukkit.entity.Witch; +import org.bukkit.entity.Wither; +import org.bukkit.entity.WitherSkull; +import org.bukkit.entity.Wolf; +import org.bukkit.entity.Zombie; import org.bukkit.entity.minecart.ExplosiveMinecart; import org.bukkit.entity.minecart.HopperMinecart; import org.bukkit.entity.minecart.PoweredMinecart; @@ -56,7 +108,11 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.messaging.StandardMessenger; import org.bukkit.util.Vector; +import cc.capture.type.CaptureTree; import cpw.mods.fml.common.registry.EntityRegistry; // Cauldron +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.IEntityLivingData; +import net.minecraftforge.common.util.BlockSnapshot; public class CraftWorld implements World { //public static final int CUSTOM_DIMENSION_OFFSET = 10; // Cauldron - disabled @@ -512,13 +568,11 @@ public class CraftWorld implements World { break; } - world.captureTreeGeneration = true; - world.captureBlockSnapshots = true; + CaptureTree tCapture=world.mCapture.startTreeGenCapture(null,loc); boolean grownTree = gen.generate(world, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - world.captureBlockSnapshots = false; - world.captureTreeGeneration = false; + tCapture.markHandled(); if (grownTree) { // Copy block data to delegate - for (BlockSnapshot blocksnapshot : world.capturedBlockSnapshots) { + for (BlockSnapshot blocksnapshot : tCapture.mCapturedBlocks) { int x = blocksnapshot.x; int y = blocksnapshot.y; int z = blocksnapshot.z; @@ -530,11 +584,9 @@ public class CraftWorld implements World { net.minecraft.block.Block newBlock = world.getBlock(x, y, z); world.markAndNotifyBlock(x, y, z, null, oldBlock, newBlock, flag); } - world.capturedBlockSnapshots.clear(); return true; } else { - world.capturedBlockSnapshots.clear(); return false; } }