From 94bc4bb3858f1bbd3a18bef8d9ace7b325420f74 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Thu, 12 Dec 2019 20:37:06 -0800 Subject: [PATCH 1/6] src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java Fix bugs #22 #25 (do not work on source hive) Fix bugs #23 #37 (use canHandleBlock guard) (and my issue) https://github.com/DarkPacks/Crackpack-3/issues/113 src/main/java/com/rwtema/careerbees/effects/EffectPower.java Fix #17 (work on any valid side, including 'internal' / null) and refactored to de-duplicate code --- build.gradle | 2 +- .../careerbees/effects/EffectAssassin.java | 38 ++++++--- .../careerbees/effects/EffectPower.java | 85 +++++++++++++++---- 3 files changed, 94 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index d4ee5b0..5af6d25 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = "0.4.0" +version = "0.4.1" group = "com.rwtema.careerbees" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "careerbees" diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java index a778a9e..74f6333 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java @@ -1,5 +1,6 @@ package com.rwtema.careerbees.effects; +// import com.rwtema.careerbees.BeeMod; // logger import forestry.api.apiculture.*; import forestry.apiculture.PluginApiculture; import net.minecraft.block.state.IBlockState; @@ -31,6 +32,8 @@ public EffectAssassin(String name, boolean isDominant, boolean isCombinable, flo @Override public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome genome, @Nullable EnumFacing sideHit) { TileEntity tileEntity = world.getTileEntity(pos); + if ( tileEntity == null ) + return false; if (tileEntity instanceof IBeeHousing) { ItemStack queen = ((IBeeHousing) tileEntity).getBeeInventory().getQueen(); if (queen.isEmpty() || BeeManager.beeRoot.getType(queen) != EnumBeeType.QUEEN) return false; @@ -44,17 +47,28 @@ public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome gen @Override protected boolean performPosEffect(World world, BlockPos blockPos, IBlockState state, IBeeGenome genome, IBeeHousing housing) { - IBeeHousing house = (IBeeHousing) world.getTileEntity(blockPos); - if(house == null) return false; - ItemStack queenStack = house.getBeeInventory().getQueen(); - IBee queen = BeeManager.beeRoot.getMember(queenStack); - if(queen == null || queenStack.isEmpty() || !queenStack.hasTagCompound()) return false; - queen.setHealth(0); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - queen.writeToNBT(nbttagcompound); - queenStack.setTagCompound(nbttagcompound); - housing.getBeeInventory().setQueen(queenStack); - house.getBeekeepingLogic().canWork(); - return true; + // Fix bugs #22 #25 (do not work on source hive) and use the bee gun's canHandleBlock guard to fix bugs #23 #37 + if (housing.getCoordinates() != blockPos && + canHandleBlock(world, blockPos, genome, null)) { + + IBeeHousing house = (IBeeHousing) world.getTileEntity(blockPos); + // Guarded by canHandleBlock, this should always succeed. + + ItemStack queenStack = house.getBeeInventory().getQueen(); + IBee queen = BeeManager.beeRoot.getMember(queenStack); + if (queen == null || queenStack.isEmpty() || !queenStack.hasTagCompound()) + return false; + + queen.setHealth(0); + NBTTagCompound nbttagcompound = new NBTTagCompound(); + queen.writeToNBT(nbttagcompound); + //BeeMod.logger.info("Assassin Bee profiled: " + queen + " as: " + nbttagcompound); + queenStack.setTagCompound(nbttagcompound); + house.getBeeInventory().setQueen(queenStack); + house.getBeekeepingLogic().canWork(); + //BeeMod.logger.info("Assassin Bee reports back from: " + blockPos); + return true; + } + return false; } } diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java index f4fdebf..7cdc95e 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java @@ -1,5 +1,6 @@ package com.rwtema.careerbees.effects; +// import com.rwtema.careerbees.BeeMod; // logger import com.rwtema.careerbees.effects.settings.IEffectSettingsHolder; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; @@ -14,6 +15,7 @@ import javax.annotation.Nonnull; import java.util.Random; +import java.util.ArrayList; public class EffectPower extends EffectBase implements ISpecialBeeEffect.SpecialEffectBlock { public static final EffectPower INSTANCE = new EffectPower("rf"); @@ -43,16 +45,12 @@ public IEffectData doEffectBase(@Nonnull IBeeGenome genome, @Nonnull IEffectData int energyleft = rfrate; + World world = housing.getWorldObj(); for (BlockPos pos : getAdjacentTiles(housing)) { - World world = housing.getWorldObj(); - TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity != null) { - IEnergyStorage energyStorage = tileEntity.getCapability(CapabilityEnergy.ENERGY, null); - if (energyStorage != null) { - energyleft -= energyStorage.receiveEnergy(energyleft, false); - if (energyleft <= 0) break; - } - } + TEValidatedFaces TEFaces = getValidEnergyStorageFaces(world, pos); + int energysent = storeRFTEFaces(TEFaces, energyleft); + //BeeMod.logger.info("EnergyBee sent " + energysent + " RF to " + pos + " " + TEFaces.te); + energyleft -= energysent; } return storedData; } @@ -63,10 +61,65 @@ public int getRFRate(@Nonnull IBeeGenome genome, @Nonnull IBeeHousing housing) { return MathHelper.ceil(400 * speed * speed); } + // TEValidatedFaces a helper class for some code consolidation. + public class TEValidatedFaces { + boolean valid; + World world; + BlockPos pos; + TileEntity te; + ArrayList faces; + public TEValidatedFaces(World _world, BlockPos _pos) { + valid = false; + world = _world; + pos = _pos; + te = null; + faces = new ArrayList(); + } + } + + // Create a list of valid energy faces for later iteration. + private TEValidatedFaces getValidEnergyStorageFaces(World world, BlockPos pos) { + TEValidatedFaces TEFaces = new TEValidatedFaces(world, pos); + TEFaces.te = world.getTileEntity(pos); + if ( TEFaces.te == null ) + return TEFaces; + // Fix #17, since no sides are being used, the actual desire appears to be testing all possible (including null/internal) sides and powering up the block if possible in any way. + if ( TEFaces.te.hasCapability(CapabilityEnergy.ENERGY, null) && + TEFaces.te.getCapability(CapabilityEnergy.ENERGY, null).canReceive() ) { + TEFaces.faces.add(null); + TEFaces.valid = true; + //BeeMod.logger.info("EnergyBee can interact with " + pos + " " + TEFaces.te + " on the inner side."); + } + for (EnumFacing face : EnumFacing.VALUES) { + if ( TEFaces.te.hasCapability(CapabilityEnergy.ENERGY, face) && + TEFaces.te.getCapability(CapabilityEnergy.ENERGY, face).canReceive() ) + TEFaces.faces.add(face); + TEFaces.valid = true; + //BeeMod.logger.info("EnergyBee can interact with " + pos + " " + TEFaces.te + " on the " + face + " side."); + } + //BeeMod.logger.info("EnergyBee doesn't know how to handle the tile entity at " + pos + " on any face of the : " + tile); + return TEFaces; + } + + private int storeRFTEFaces(@Nonnull TEValidatedFaces TEFaces, int maxRF) { + int energyleft = maxRF; + if ( TEFaces.valid ) { + for (EnumFacing face : TEFaces.faces) { + IEnergyStorage storage = TEFaces.te.getCapability(CapabilityEnergy.ENERGY, face); + if (storage != null) { + // BeeMod.logger.info("EnergyBee powering block at: " + pos + " with " + rfRate); + energyleft -= storage.receiveEnergy(energyleft, false); // max rate, simulate (is false; actually do it) + } else { + // BeeMod.logger.warn("EnergyBee couldn't get storage for the block at: " + pos); + } + } + } + return maxRF - energyleft; // energy used/sent + } + @Override public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome genome, EnumFacing sideHit) { - TileEntity tile = world.getTileEntity(pos); - return tile != null && tile.hasCapability(CapabilityEnergy.ENERGY, null); + return getValidEnergyStorageFaces(world, pos).valid; // Is this a valid entity, and will this bee do something do it? } @Override @@ -76,13 +129,9 @@ public float getCooldown(IBeeGenome genome, Random random) { @Override public void processingTick(World world, BlockPos pos, @Nonnull IBeeGenome genome, @Nonnull IBeeHousing housing, EnumFacing facing) { - TileEntity tile = world.getTileEntity(pos); - if (tile == null || !tile.hasCapability(CapabilityEnergy.ENERGY, null)) return; - IEnergyStorage storage = tile.getCapability(CapabilityEnergy.ENERGY, null); - if (storage != null) { - int rfRate = getRFRate(genome, housing); - storage.receiveEnergy(rfRate, false); - } + TEValidatedFaces TEFaces = getValidEnergyStorageFaces(world, pos); // Is this a valid entity, and will this bee do something do it? + int rfRate = getRFRate(genome, housing); + storeRFTEFaces(TEFaces, rfRate); } @Override From 0c7fd475cfa0914adf5331dfafcdecae48a1fee8 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Fri, 13 Dec 2019 17:29:21 -0800 Subject: [PATCH 2/6] Small early exit if 0 energy left to store. Sadly, a glance at the EnergyStorage API doesn't seem to mandate a way of checking the absolute addition per block, forcing us to check all / specific sides. Since CareerBees appear to have a policy of per block, not per side, I can't make any optimizations for the 'storage full' case. --- src/main/java/com/rwtema/careerbees/effects/EffectPower.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java index 7cdc95e..2dffda5 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java @@ -51,6 +51,8 @@ public IEffectData doEffectBase(@Nonnull IBeeGenome genome, @Nonnull IEffectData int energysent = storeRFTEFaces(TEFaces, energyleft); //BeeMod.logger.info("EnergyBee sent " + energysent + " RF to " + pos + " " + TEFaces.te); energyleft -= energysent; + if ( 0 == energyleft ) + break; } return storedData; } @@ -112,6 +114,8 @@ private int storeRFTEFaces(@Nonnull TEValidatedFaces TEFaces, int maxRF) { } else { // BeeMod.logger.warn("EnergyBee couldn't get storage for the block at: " + pos); } + if ( 0 == energyleft ) + break; } } return maxRF - energyleft; // energy used/sent From 5d865eb8b775433963e5a2dfdd30bea519a4b161 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Sun, 15 Dec 2019 16:08:43 -0800 Subject: [PATCH 3/6] Refactored the faces check to return an ArrayList of valid faces instead of a custom object. Some style re-works to more closely follow the single early return use in the codebase. General syntax cleanups to make early returns easier to spot. --- .../careerbees/effects/EffectAssassin.java | 18 ++-- .../careerbees/effects/EffectPower.java | 91 +++++++------------ 2 files changed, 41 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java index 74f6333..3e4993c 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java @@ -36,9 +36,11 @@ public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome gen return false; if (tileEntity instanceof IBeeHousing) { ItemStack queen = ((IBeeHousing) tileEntity).getBeeInventory().getQueen(); - if (queen.isEmpty() || BeeManager.beeRoot.getType(queen) != EnumBeeType.QUEEN) return false; + if (queen.isEmpty() || BeeManager.beeRoot.getType(queen) != EnumBeeType.QUEEN) + return false; IBee member = BeeManager.beeRoot.getMember(queen); - if (member == null) return false; + if (member == null) + return false; IBeeGenome memberGenome = member.getGenome(); return memberGenome.getPrimary() != genome.getPrimary(); } @@ -47,26 +49,20 @@ public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome gen @Override protected boolean performPosEffect(World world, BlockPos blockPos, IBlockState state, IBeeGenome genome, IBeeHousing housing) { - // Fix bugs #22 #25 (do not work on source hive) and use the bee gun's canHandleBlock guard to fix bugs #23 #37 - if (housing.getCoordinates() != blockPos && - canHandleBlock(world, blockPos, genome, null)) { - + if ( housing.getCoordinates() == blockPos ) + return false; + if ( canHandleBlock(world, blockPos, genome, null) ) { IBeeHousing house = (IBeeHousing) world.getTileEntity(blockPos); - // Guarded by canHandleBlock, this should always succeed. - ItemStack queenStack = house.getBeeInventory().getQueen(); IBee queen = BeeManager.beeRoot.getMember(queenStack); if (queen == null || queenStack.isEmpty() || !queenStack.hasTagCompound()) return false; - queen.setHealth(0); NBTTagCompound nbttagcompound = new NBTTagCompound(); queen.writeToNBT(nbttagcompound); - //BeeMod.logger.info("Assassin Bee profiled: " + queen + " as: " + nbttagcompound); queenStack.setTagCompound(nbttagcompound); house.getBeeInventory().setQueen(queenStack); house.getBeekeepingLogic().canWork(); - //BeeMod.logger.info("Assassin Bee reports back from: " + blockPos); return true; } return false; diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java index 2dffda5..367bf96 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectPower.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectPower.java @@ -1,6 +1,5 @@ package com.rwtema.careerbees.effects; -// import com.rwtema.careerbees.BeeMod; // logger import com.rwtema.careerbees.effects.settings.IEffectSettingsHolder; import forestry.api.apiculture.IBeeGenome; import forestry.api.apiculture.IBeeHousing; @@ -31,7 +30,7 @@ public EffectPower(String rawname, boolean isDominant, boolean isCombinable) { @Nonnull @Override public IEffectData doEffectBase(@Nonnull IBeeGenome genome, @Nonnull IEffectData storedData, @Nonnull IBeeHousing housing, IEffectSettingsHolder settings) { - int rfrate = getRFRate(genome, housing); + int rfRate = getRFRate(genome, housing); TileEntity entity = housing.getWorldObj().getTileEntity(housing.getCoordinates()); if (!(entity instanceof IBeeHousing)) { @@ -43,13 +42,12 @@ public IEffectData doEffectBase(@Nonnull IBeeGenome genome, @Nonnull IEffectData return storedData; } - int energyleft = rfrate; + int energyleft = rfRate; World world = housing.getWorldObj(); for (BlockPos pos : getAdjacentTiles(housing)) { - TEValidatedFaces TEFaces = getValidEnergyStorageFaces(world, pos); - int energysent = storeRFTEFaces(TEFaces, energyleft); - //BeeMod.logger.info("EnergyBee sent " + energysent + " RF to " + pos + " " + TEFaces.te); + ArrayList faces = getEnergyStorageFaces(world, pos, true); + int energysent = storeRFTEFaces(world, pos, faces, rfRate); energyleft -= energysent; if ( 0 == energyleft ) break; @@ -63,67 +61,46 @@ public int getRFRate(@Nonnull IBeeGenome genome, @Nonnull IBeeHousing housing) { return MathHelper.ceil(400 * speed * speed); } - // TEValidatedFaces a helper class for some code consolidation. - public class TEValidatedFaces { - boolean valid; - World world; - BlockPos pos; - TileEntity te; - ArrayList faces; - public TEValidatedFaces(World _world, BlockPos _pos) { - valid = false; - world = _world; - pos = _pos; - te = null; - faces = new ArrayList(); - } - } - - // Create a list of valid energy faces for later iteration. - private TEValidatedFaces getValidEnergyStorageFaces(World world, BlockPos pos) { - TEValidatedFaces TEFaces = new TEValidatedFaces(world, pos); - TEFaces.te = world.getTileEntity(pos); - if ( TEFaces.te == null ) - return TEFaces; - // Fix #17, since no sides are being used, the actual desire appears to be testing all possible (including null/internal) sides and powering up the block if possible in any way. - if ( TEFaces.te.hasCapability(CapabilityEnergy.ENERGY, null) && - TEFaces.te.getCapability(CapabilityEnergy.ENERGY, null).canReceive() ) { - TEFaces.faces.add(null); - TEFaces.valid = true; - //BeeMod.logger.info("EnergyBee can interact with " + pos + " " + TEFaces.te + " on the inner side."); + private ArrayList getEnergyStorageFaces(World world, BlockPos pos, boolean scanAll) { + ArrayList faces = new ArrayList(); + TileEntity te = world.getTileEntity(pos); + if ( null == te ) + return faces; + if ( te.hasCapability(CapabilityEnergy.ENERGY, null) && + te.getCapability(CapabilityEnergy.ENERGY, null).canReceive() ) { + faces.add(null); + if ( ! scanAll ) + return faces; } for (EnumFacing face : EnumFacing.VALUES) { - if ( TEFaces.te.hasCapability(CapabilityEnergy.ENERGY, face) && - TEFaces.te.getCapability(CapabilityEnergy.ENERGY, face).canReceive() ) - TEFaces.faces.add(face); - TEFaces.valid = true; - //BeeMod.logger.info("EnergyBee can interact with " + pos + " " + TEFaces.te + " on the " + face + " side."); + if ( te.hasCapability(CapabilityEnergy.ENERGY, face) && + te.getCapability(CapabilityEnergy.ENERGY, face).canReceive() ) + faces.add(face); + if ( ! scanAll ) + return faces; } - //BeeMod.logger.info("EnergyBee doesn't know how to handle the tile entity at " + pos + " on any face of the : " + tile); - return TEFaces; + return faces; } - private int storeRFTEFaces(@Nonnull TEValidatedFaces TEFaces, int maxRF) { + private int storeRFTEFaces(World world, BlockPos pos, ArrayList faces, int maxRF) { int energyleft = maxRF; - if ( TEFaces.valid ) { - for (EnumFacing face : TEFaces.faces) { - IEnergyStorage storage = TEFaces.te.getCapability(CapabilityEnergy.ENERGY, face); - if (storage != null) { - // BeeMod.logger.info("EnergyBee powering block at: " + pos + " with " + rfRate); - energyleft -= storage.receiveEnergy(energyleft, false); // max rate, simulate (is false; actually do it) - } else { - // BeeMod.logger.warn("EnergyBee couldn't get storage for the block at: " + pos); - } - if ( 0 == energyleft ) - break; + TileEntity te = world.getTileEntity(pos); + if ( null == te ) + return 0; // no energy sent + for (EnumFacing face : faces) { + IEnergyStorage storage = te.getCapability(CapabilityEnergy.ENERGY, face); + if (storage != null) { + energyleft -= storage.receiveEnergy(energyleft, false); // max rate, simulate (is false; actually do it) } + if ( 0 == energyleft ) + break; } - return maxRF - energyleft; // energy used/sent + return maxRF - energyleft; // return used/sent } @Override public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome genome, EnumFacing sideHit) { - return getValidEnergyStorageFaces(world, pos).valid; // Is this a valid entity, and will this bee do something do it? + return ! getEnergyStorageFaces(world, pos, false).isEmpty(); } @Override @@ -133,9 +110,9 @@ public float getCooldown(IBeeGenome genome, Random random) { @Override public void processingTick(World world, BlockPos pos, @Nonnull IBeeGenome genome, @Nonnull IBeeHousing housing, EnumFacing facing) { - TEValidatedFaces TEFaces = getValidEnergyStorageFaces(world, pos); // Is this a valid entity, and will this bee do something do it? + ArrayList faces = getEnergyStorageFaces(world, pos, true); int rfRate = getRFRate(genome, housing); - storeRFTEFaces(TEFaces, rfRate); + storeRFTEFaces(world, pos, faces, rfRate); } @Override From 7ff2efad18acc9389644801c7661570d39880fd0 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Sun, 15 Dec 2019 16:13:14 -0800 Subject: [PATCH 4/6] Revert non-mod-author version change as suggested by sam-kirby --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5af6d25..d4ee5b0 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = "0.4.1" +version = "0.4.0" group = "com.rwtema.careerbees" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "careerbees" From 5bd511f50207fe9c1239fce397e52bd7caaeb894 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Sun, 15 Dec 2019 16:15:04 -0800 Subject: [PATCH 5/6] One more comment removal cleanup I missed, I think that's all the suggestions discussed with sam-kirby --- src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java index 3e4993c..5ccea7a 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java @@ -1,6 +1,5 @@ package com.rwtema.careerbees.effects; -// import com.rwtema.careerbees.BeeMod; // logger import forestry.api.apiculture.*; import forestry.apiculture.PluginApiculture; import net.minecraft.block.state.IBlockState; From 858046a5d7fc7707b9a38947b814ead9b5dd2687 Mon Sep 17 00:00:00 2001 From: "Michael J. Evans" Date: Sun, 29 Dec 2019 02:29:10 -0800 Subject: [PATCH 6/6] Fix bee gun (Assassin); it passes in a fake housing for the target block pos, which broke the seemingly non-issue guard. The bug in question is still resolved by calling canHandleBlock, since that checks the target genome against the calling genome as it's only possible true result. --- src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java index 5ccea7a..d8c0635 100644 --- a/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java +++ b/src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java @@ -48,8 +48,6 @@ public boolean canHandleBlock(World world, BlockPos pos, @Nonnull IBeeGenome gen @Override protected boolean performPosEffect(World world, BlockPos blockPos, IBlockState state, IBeeGenome genome, IBeeHousing housing) { - if ( housing.getCoordinates() == blockPos ) - return false; if ( canHandleBlock(world, blockPos, genome, null) ) { IBeeHousing house = (IBeeHousing) world.getTileEntity(blockPos); ItemStack queenStack = house.getBeeInventory().getQueen();