From 249c8cb3cad0ed365fe770bbcdb3614a8ba0436d Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 7 Jul 2015 14:32:10 +0200 Subject: [PATCH] Fixed a big Bug with the Drill --- .../blocks/BlockPhantomface.java | 24 ++++++++ .../actuallyadditions/items/ItemDrill.java | 56 ++++++++----------- .../items/tools/ItemAllToolAA.java | 12 ++-- .../network/sync/PacketSyncerToClient.java | 2 +- .../tile/TileEntityPhantomface.java | 31 +++++++++- .../actuallyadditions/util/WorldPos.java | 8 +++ 6 files changed, 92 insertions(+), 41 deletions(-) diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index a611f9dec..627e29f24 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -22,6 +22,7 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.List; +import java.util.Random; public class BlockPhantomface extends BlockContainerBase implements INameableItem{ @@ -41,6 +42,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte this.setHardness(4.5F); this.setResistance(10.0F); this.setStepSound(soundTypeStone); + this.setTickRandomly(true); if(type == FACE || type == LIQUIFACE || type == ENERGYFACE) this.range = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); else if(type == BREAKER || type == PLACER) this.range = ConfigIntValues.PHANTOM_PLACER_RANGE.getValue(); @@ -127,6 +129,28 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte } } + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand){ + WorldPos boundPosition = null; + if(this.type == FACE || this.type == ENERGYFACE || this.type == LIQUIFACE) boundPosition = ((TileEntityPhantomface)world.getTileEntity(x, y, z)).boundPosition; + else if(this.type == PLACER || this.type == BREAKER) boundPosition = ((TileEntityPhantomPlacer)world.getTileEntity(x, y, z)).boundPosition; + + if(boundPosition != null){ + for(int l = 0; l < 3; l++){ + double d1 = (double)((float)boundPosition.getY()+rand.nextFloat()); + int i1 = rand.nextInt(2)*2-1; + int j1 = rand.nextInt(2)*2-1; + double d4 = ((double)rand.nextFloat()-0.5D)*0.125D; + double d2 = (double)boundPosition.getZ()+0.5D+0.25D*(double)j1; + double d5 = (double)(rand.nextFloat()*1.0F*(float)j1); + double d0 = (double)boundPosition.getX()+0.5D+0.25D*(double)i1; + double d3 = (double)(rand.nextFloat()*1.0F*(float)i1); + world.spawnParticle("portal", d0, d1, d2, d3, d4, d5); + } + } + } + public static class TheItemBlock extends ItemBlock{ private Block theBlock; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index f2346a2f0..94617fe58 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -3,7 +3,6 @@ package ellpeck.actuallyadditions.items; import cofh.api.energy.ItemEnergyContainer; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; @@ -19,10 +18,11 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.EnumRarity; @@ -36,8 +36,6 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import org.apache.logging.log4j.Level; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -268,29 +266,18 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(this.getEnergyStored(stack) >= use){ Block block = world.getBlock(xPos, yPos, zPos); float hardness = block.getBlockHardness(world, xPos, yPos, zPos); + int meta = world.getBlockMetadata(xPos, yPos, zPos); if(hardness > -1.0F && ((x == xPos && y == yPos && z == zPos) || this.canHarvestBlock(block, stack))){ this.extractEnergy(stack, use, false); - ArrayList drops = new ArrayList(); - int meta = world.getBlockMetadata(xPos, yPos, zPos); - - if(block.canSilkHarvest(world, player, xPos, yPos, zPos, meta) && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)){ - addSilkDrops(drops, block, meta, world, player); - } - else{ - int fortune = this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE) ? (this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1) : 0; - drops.addAll(block.getDrops(world, xPos, yPos, zPos, meta, fortune)); - block.dropXpOnBlockBreak(world, x, y, z, block.getExpDrop(world, meta, fortune)); + block.harvestBlock(world, player, xPos, yPos, zPos, meta); + if(!EnchantmentHelper.getSilkTouchModifier(player)){ + block.dropXpOnBlockBreak(world, x, y, z, block.getExpDrop(world, meta, EnchantmentHelper.getFortuneModifier(player))); } - if(!(x == xPos && y == yPos && z == zPos)){ - world.playAuxSFX(2001, xPos, yPos, zPos, Block.getIdFromBlock(block)+(meta << 12)); - } world.setBlockToAir(xPos, yPos, zPos); - for(ItemStack theDrop : drops){ - EntityItem item = new EntityItem(world, xPos+0.5, yPos+0.5, zPos+0.5, theDrop); - item.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(item); + if(!(xPos == x && yPos == y && zPos == z)){ + world.playAuxSFX(2001, xPos, yPos, zPos, Block.getIdFromBlock(block)+(meta << 12)); } } } @@ -301,18 +288,6 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } } - public static void addSilkDrops(ArrayList drops, Block block, int meta, World world, EntityPlayer player){ - try{ - Method method = ReflectionHelper.findMethod(Block.class, block, new String[]{"createStackedBlock"}, int.class); - ItemStack silkDrop = (ItemStack)method.invoke(block, meta); - if(silkDrop != null) drops.add(silkDrop); - } - catch(Exception e){ - player.addChatComponentMessage(new ChatComponentText("Oh! That shouldn't have happened! Trying to get and use a private Method here might have bugged! Report this situation to the Mod Author ASAP!")); - ModUtil.LOGGER.log(Level.ERROR, "Player "+player.getDisplayName()+" who should break a Block using a Drill at "+player.posX+", "+player.posY+", "+player.posZ+" in World "+world.provider.dimensionId+" threw an Exception trying to get and use a private Method! Report this to the Mod Author ASAP!"); - } - } - @Override public String getName(){ return "itemDrill"; @@ -325,6 +300,11 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ int use = this.getEnergyUsePerBlock(stack); if(this.getEnergyStored(stack) >= use){ if(!world.isRemote){ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)) stack.addEnchantment(Enchantment.silkTouch, 1); + else{ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE)) stack.addEnchantment(Enchantment.fortune, this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1); + } + if(!living.isSneaking() && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)){ this.breakBlocks(stack, 2, world, x, y, z, player); @@ -332,6 +312,16 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ else this.breakBlocks(stack, 1, world, x, y, z, player); } else this.breakBlocks(stack, 0, world, x, y, z, player); + + NBTTagList ench = stack.getEnchantmentTagList(); + if(ench != null){ + for(int i = 0; i < ench.tagCount(); i++){ + short id = ench.getCompoundTagAt(i).getShort("id"); + if(id == Enchantment.silkTouch.effectId || id == Enchantment.fortune.effectId){ + ench.removeTag(i); + } + } + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java index 21d05f353..3f944450b 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java @@ -2,10 +2,8 @@ package ellpeck.actuallyadditions.items.tools; import com.google.common.collect.Sets; import cpw.mods.fml.common.eventhandler.Event; -import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.KeyUtil; @@ -15,7 +13,9 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.item.*; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; @@ -29,9 +29,9 @@ import java.util.Set; @SuppressWarnings("unchecked") public class ItemAllToolAA extends ItemTool implements INameableItem{ - public static final Set axeSet = ReflectionHelper.getPrivateValue(ItemAxe.class, (ItemAxe)InitItems.itemAxeEmerald, 0); - public static final Set pickSet = ReflectionHelper.getPrivateValue(ItemPickaxe.class, (ItemPickaxe)InitItems.itemPickaxeEmerald, 0); - public static final Set shovelSet = ReflectionHelper.getPrivateValue(ItemSpade.class, (ItemSpade)InitItems.itemShovelEmerald, 0); + public static final Set axeSet = Sets.newHashSet(Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin); + public static final Set pickSet = Sets.newHashSet(Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail); + public static final Set shovelSet = Sets.newHashSet(Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium); private static final Set allSet = Sets.newHashSet(); static{ diff --git a/src/main/java/ellpeck/actuallyadditions/network/sync/PacketSyncerToClient.java b/src/main/java/ellpeck/actuallyadditions/network/sync/PacketSyncerToClient.java index c5f99b377..63e875aec 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/sync/PacketSyncerToClient.java +++ b/src/main/java/ellpeck/actuallyadditions/network/sync/PacketSyncerToClient.java @@ -70,7 +70,7 @@ public class PacketSyncerToClient implements IMessage{ public static void sendPacket(TileEntity tile){ if(tile instanceof IPacketSyncerToClient){ - PacketHandler.theNetwork.sendToAllAround(new PacketSyncerToClient(tile, ((IPacketSyncerToClient)tile).getValues()), new NetworkRegistry.TargetPoint(tile.getWorldObj().provider.dimensionId, tile.xCoord, tile.yCoord, tile.zCoord, 64)); + PacketHandler.theNetwork.sendToAllAround(new PacketSyncerToClient(tile, ((IPacketSyncerToClient)tile).getValues()), new NetworkRegistry.TargetPoint(tile.getWorldObj().provider.dimensionId, tile.xCoord, tile.yCoord, tile.zCoord, 128)); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index b211957a9..1ae791663 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -6,6 +6,8 @@ import cofh.api.energy.IEnergyReceiver; import ellpeck.actuallyadditions.blocks.BlockPhantomface; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.network.sync.IPacketSyncerToClient; +import ellpeck.actuallyadditions.network.sync.PacketSyncerToClient; import ellpeck.actuallyadditions.util.WorldPos; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.block.Block; @@ -23,9 +25,10 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; -public class TileEntityPhantomface extends TileEntityInventoryBase{ +public class TileEntityPhantomface extends TileEntityInventoryBase implements IPacketSyncerToClient{ public WorldPos boundPosition; + private WorldPos lastBoundPos; public int type; @@ -69,6 +72,11 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ if(!this.hasBoundTile()){ this.boundPosition = null; } + + if(this.boundPosition != null && !this.boundPosition.isEqual(this.lastBoundPos)){ + this.lastBoundPos = this.boundPosition.copy(); + this.sendUpdate(); + } } } @@ -117,6 +125,27 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ return false; } + @Override + public int[] getValues(){ + if(this.boundPosition != null){ + return new int[]{this.boundPosition.getWorld().provider.dimensionId, this.boundPosition.getX(), this.boundPosition.getY(), this.boundPosition.getZ()}; + } + return new int[0]; + } + + @Override + public void setValues(int[] values){ + if(values.length > 0){ + this.boundPosition = new WorldPos(DimensionManager.getWorld(values[0]), values[1], values[2], values[3]); + } + else this.boundPosition = null; + } + + @Override + public void sendUpdate(){ + PacketSyncerToClient.sendPacket(this); + } + public static class TileEntityPhantomLiquiface extends TileEntityPhantomface implements IFluidHandler{ public TileEntityPhantomLiquiface(){ diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java b/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java index b554ea00d..1a6622b26 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldPos.java @@ -41,4 +41,12 @@ public class WorldPos{ public TileEntity getTileEntity(){ return this.world != null ? this.world.getTileEntity(this.x, this.y, this.z) : null; } + + public boolean isEqual(WorldPos pos){ + return pos != null && this.x == pos.getX() && this.y == pos.getY() && this.z == pos.getZ() && this.world == pos.getWorld(); + } + + public WorldPos copy(){ + return new WorldPos(this.world, this.x, this.y, this.z); + } }