aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/detrav/events
diff options
context:
space:
mode:
authorDetrav <witalyezep@gmail.com>2016-04-14 15:40:12 +0300
committerDetrav <witalyezep@gmail.com>2016-04-14 15:40:12 +0300
commit58382e965f603382ae338dd411d749686ee5dbb4 (patch)
treecd6ce40887406b86e4148dcfc2389cc163937757 /src/main/java/com/detrav/events
parentb2b9c8788670fe90e95b82e47882212b145bff32 (diff)
downloadGT5-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.java210
-rw-r--r--src/main/java/com/detrav/events/DetravBlockBreakEvent.java15
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);
+ }
+}