diff options
author | Detrav <witalyezep@gmail.com> | 2016-04-14 15:40:12 +0300 |
---|---|---|
committer | Detrav <witalyezep@gmail.com> | 2016-04-14 15:40:12 +0300 |
commit | 58382e965f603382ae338dd411d749686ee5dbb4 (patch) | |
tree | cd6ce40887406b86e4148dcfc2389cc163937757 /src/main/java/com/detrav/events | |
parent | b2b9c8788670fe90e95b82e47882212b145bff32 (diff) | |
download | GT5-Unofficial-58382e965f603382ae338dd411d749686ee5dbb4.tar.gz GT5-Unofficial-58382e965f603382ae338dd411d749686ee5dbb4.tar.bz2 GT5-Unofficial-58382e965f603382ae338dd411d749686ee5dbb4.zip |
3x3 BlockBreak event
Diffstat (limited to 'src/main/java/com/detrav/events')
-rw-r--r-- | src/main/java/com/detrav/events/BlockBreakEventHandler.java | 210 | ||||
-rw-r--r-- | src/main/java/com/detrav/events/DetravBlockBreakEvent.java | 15 |
2 files changed, 225 insertions, 0 deletions
diff --git a/src/main/java/com/detrav/events/BlockBreakEventHandler.java b/src/main/java/com/detrav/events/BlockBreakEventHandler.java new file mode 100644 index 0000000000..eaca6c7d2f --- /dev/null +++ b/src/main/java/com/detrav/events/BlockBreakEventHandler.java @@ -0,0 +1,210 @@ +package com.detrav.events; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.block.Block; +//import net.minecraft.client.Minecraft; +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.item.ItemSword; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S23PacketBlockChange; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraft.world.WorldSettings; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.BlockEvent; + +/** + * Created by wital_000 on 13.04.2016. + */ +public class BlockBreakEventHandler { + @SubscribeEvent + public void onBreakBlock(BlockEvent.BreakEvent ev) { + if (ev.isCanceled()) + return; + if(ev instanceof DetravBlockBreakEvent) + return; + if (!ev.world.isRemote) { + EntityPlayer player = ev.getPlayer(); + if((player instanceof EntityPlayerMP) && ((EntityPlayerMP)player).theItemInWorldManager.getGameType() != WorldSettings.GameType.SURVIVAL) + return; + if(player.capabilities.isCreativeMode) + return; + Vec3 vec3 = Vec3.createVectorHelper(player.posX, player.posY + 1.62f, player.posZ); + Vec3 vec31 = ev.getPlayer().getLook(1.0F); + Vec3 vec32 = vec3.addVector(vec31.xCoord * 4.5F, vec31.yCoord * 4.5F, vec31.zCoord * 4.5F); + int side = rayTrace(ev.world, ev.block,ev.blockMetadata,vec3, vec32,ev.x,ev.y,ev.z, false, false, true); + //ev.getPlayer().addChatMessage(new ChatComponentText(ev.block.getLocalizedName() + " | " + ev.getPlayer().rotationYaw + " | " + ev.getPlayer().rotationPitch)); + //ev.getPlayer().addChatMessage(new ChatComponentText(ev.block.getLocalizedName() + " | " + side)); + switch (side) { + case 0: + case 1: + // if (ev.getPlayer().rotationPitch > 45 || ev.getPlayer().rotationPitch < -45) { + for (int i = ev.x - 1; i <= ev.x + 1; i++) + for (int j = ev.z - 1; j <= ev.z + 1; j++) + if (i != ev.x || j != ev.z) + tryHarvestBlock(i, ev.y, j, ev); + break; + // and (-45 > x > -135) and (-135 > x > -225) and (-225 > x > -315) or (-315 > x > -45) + // } else if ((-135 <= ev.getPlayer().rotationYaw && ev.getPlayer().rotationYaw <= -45) || (-315 <= ev.getPlayer().rotationYaw && ev.getPlayer().rotationYaw <= -225)) { + case 4: + case 5: + for (int i = ev.z - 1; i <= ev.z + 1; i++) + for (int j = ev.y - 1; j <= ev.y + 1; j++) + if (i != ev.z || j != ev.y) + tryHarvestBlock(ev.x, j, i, ev); + break; + // } else if ((-225 <= ev.getPlayer().rotationYaw && ev.getPlayer().rotationYaw <= -135) || -45 <= ev.getPlayer().rotationYaw || ev.getPlayer().rotationYaw <= -315) { + case 2: + case 3: + for (int i = ev.x - 1; i <= ev.x + 1; i++) + for (int j = ev.y - 1; j <= ev.y + 1; j++) + if (i != ev.x || j != ev.y) + tryHarvestBlock(i, j, ev.z, ev); + break; + // } else + // ev.getPlayer().addChatMessage(new ChatComponentText("Unknown | yaw = " + ev.getPlayer().rotationYaw + " | pitch = " + ev.getPlayer().rotationPitch)); + } + } + } + + static private boolean tryHarvestBlock(int x, int y, int z,BlockEvent.BreakEvent event2) { + if (!(event2.getPlayer() instanceof EntityPlayerMP)) + return false; + EntityPlayer thisPlayerMP = event2.getPlayer(); + ItemStack stack = thisPlayerMP.getCurrentEquippedItem(); + if(stack == null ) return false; + World theWorld = event2.world; + Block block = theWorld.getBlock(x, y, z); + if (!stack.getItem().canHarvestBlock(block, stack)) + return false; + + BlockEvent.BreakEvent event = onDetravBlockBreakEvent(event2.world, WorldSettings.GameType.SURVIVAL, (EntityPlayerMP) event2.getPlayer(), x, y, z); + if (event.isCanceled()) + return false; + + if (stack != null && stack.getItem().onBlockStartBreak(stack, x, y, z, thisPlayerMP)) { + return false; + } + int l = theWorld.getBlockMetadata(x, y, z); + theWorld.playAuxSFXAtEntity(thisPlayerMP, 2001, x, y, z, Block.getIdFromBlock(block) + (theWorld.getBlockMetadata(x, y, z) << 12)); + boolean flag = false; + ItemStack itemstack = thisPlayerMP.getCurrentEquippedItem(); + boolean flag1 = block.canHarvestBlock(thisPlayerMP, l); + + if (itemstack != null) { + itemstack.func_150999_a(theWorld, block, x, y, z, thisPlayerMP); + if (itemstack.stackSize == 0) { + thisPlayerMP.destroyCurrentEquippedItem(); + } + } + flag = removeBlock(x, y, z, flag1, event); + if (flag && flag1) { + block.harvestBlock(theWorld, thisPlayerMP, x, y, z, l); + } + if (flag && event != null) { + block.dropXpOnBlockBreak(theWorld, x, y, z, event.getExpToDrop()); + } + return flag; + } + + static private boolean removeBlock(int x, int y, int z, boolean canHarvest,BlockEvent.BreakEvent event) + { + World theWorld = event.world; + EntityPlayer thisPlayerMP = event.getPlayer(); + Block block = theWorld.getBlock(x, y, z); + int l = theWorld.getBlockMetadata(x, y, z); + block.onBlockHarvested(theWorld, x, y, z, l, thisPlayerMP); + boolean flag = block.removedByPlayer(theWorld, thisPlayerMP, x, y, z, canHarvest); + + if (flag) + { + block.onBlockDestroyedByPlayer(theWorld, x, y, z, l); + } + + return flag; + } + + public static BlockEvent.BreakEvent onDetravBlockBreakEvent(World world, WorldSettings.GameType gameType, EntityPlayerMP entityPlayer, int x, int y, int z) + { + // Logic from tryHarvestBlock for pre-canceling the event + boolean preCancelEvent = false; + if (gameType.isAdventure() && !entityPlayer.isCurrentToolAdventureModeExempt(x, y, z)) + { + preCancelEvent = true; + } + else if (gameType.isCreative() && entityPlayer.getHeldItem() != null && entityPlayer.getHeldItem().getItem() instanceof ItemSword) + { + preCancelEvent = true; + } + + // Tell client the block is gone immediately then process events + if (world.getTileEntity(x, y, z) == null) + { + S23PacketBlockChange packet = new S23PacketBlockChange(x, y, z, world); + packet.field_148883_d = Blocks.air; + packet.field_148884_e = 0; + entityPlayer.playerNetServerHandler.sendPacket(packet); + } + + // Post the block break event + Block block = world.getBlock(x, y, z); + int blockMetadata = world.getBlockMetadata(x, y, z); + BlockEvent.BreakEvent event = new DetravBlockBreakEvent(x, y, z, world, block, blockMetadata, entityPlayer); + event.setCanceled(preCancelEvent); + MinecraftForge.EVENT_BUS.post(event); + + // Handle if the event is canceled + if (event.isCanceled()) + { + // Let the client know the block still exists + entityPlayer.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world)); + + // Update any tile entity data for this block + TileEntity tileentity = world.getTileEntity(x, y, z); + if (tileentity != null) + { + Packet pkt = tileentity.getDescriptionPacket(); + if (pkt != null) + { + entityPlayer.playerNetServerHandler.sendPacket(pkt); + } + } + } + return event; + } + + static int rayTrace(World w,Block block,int blockMetadata,Vec3 playerPos, Vec3 lookAtPos, int xBlock,int yBlock, int zBlock, boolean unknownVar1, boolean unknownVar2, boolean unknownVar3) { + if (!Double.isNaN(playerPos.xCoord) && !Double.isNaN(playerPos.yCoord) && !Double.isNaN(playerPos.zCoord)) + if (!Double.isNaN(lookAtPos.xCoord) && !Double.isNaN(lookAtPos.yCoord) && !Double.isNaN(lookAtPos.zCoord)) { + + if ((!unknownVar2 || block.getCollisionBoundingBoxFromPool(w, xBlock, yBlock, zBlock) != null) && block.canCollideCheck(blockMetadata, unknownVar1)) { + MovingObjectPosition movingobjectposition = block.collisionRayTrace(w, xBlock, yBlock, zBlock, playerPos, lookAtPos); + + if (movingobjectposition != null) { + return movingobjectposition.sideHit; + } + } + return -1; + } + return -1; + } + + static boolean inited = false; + public static void register() + { + if(!inited) { + inited = true; + BlockBreakEventHandler handler = new BlockBreakEventHandler(); + MinecraftForge.EVENT_BUS.register(handler); + FMLCommonHandler.instance().bus().register(handler); + } + } +}
\ No newline at end of file diff --git a/src/main/java/com/detrav/events/DetravBlockBreakEvent.java b/src/main/java/com/detrav/events/DetravBlockBreakEvent.java new file mode 100644 index 0000000000..ac0c4d873c --- /dev/null +++ b/src/main/java/com/detrav/events/DetravBlockBreakEvent.java @@ -0,0 +1,15 @@ +package com.detrav.events; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; + +/** + * Created by wital_000 on 14.04.2016. + */ +public class DetravBlockBreakEvent extends BlockEvent.BreakEvent { + public DetravBlockBreakEvent(int x, int y, int z, World world, Block block, int blockMetadata, EntityPlayer player) { + super(x, y, z, world, block, blockMetadata, player); + } +} |