diff options
Diffstat (limited to 'src/main/java/com/detrav')
4 files changed, 229 insertions, 5 deletions
diff --git a/src/main/java/com/detrav/DetravScannerMod.java b/src/main/java/com/detrav/DetravScannerMod.java index 705f1fbf45..d6720e22d3 100644 --- a/src/main/java/com/detrav/DetravScannerMod.java +++ b/src/main/java/com/detrav/DetravScannerMod.java @@ -1,6 +1,7 @@ package com.detrav; import com.detrav.commands.DetravBiomeScannerCommand; +import com.detrav.events.BlockBreakEventHandler; import com.detrav.proxies.CommonProxy; import com.detrav.utils.DetravCreativeTab; import com.detrav.net.DetravNetwork; @@ -13,7 +14,6 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkRegistry; import gregtech.api.GregTech_API; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; @Mod(modid = DetravScannerMod.MODID, version = DetravScannerMod.VERSION,dependencies = "required-after:IC2;required-after:gregtech") public class DetravScannerMod @@ -50,9 +50,9 @@ public class DetravScannerMod } @EventHandler - public void onPostLoad(FMLPostInitializationEvent aEvent) - { + public void onPostLoad(FMLPostInitializationEvent aEvent) { proxy.onPostLoad(); + BlockBreakEventHandler.register(); } @EventHandler 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); + } +} diff --git a/src/main/java/com/detrav/proxies/ServerProxy.java b/src/main/java/com/detrav/proxies/ServerProxy.java index 9d5bbac634..b5f813a048 100644 --- a/src/main/java/com/detrav/proxies/ServerProxy.java +++ b/src/main/java/com/detrav/proxies/ServerProxy.java @@ -10,8 +10,7 @@ public class ServerProxy extends CommonProxy { super.onPostLoad(); } @Override - public void onLoad() - { + public void onLoad() { super.onLoad(); } } |