Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean patch fix for the Assassin bee crashing servers and sided RF / Energy bee issues #40

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 21 additions & 14 deletions src/main/java/com/rwtema/careerbees/effects/EffectAssassin.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,15 @@ 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;
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();
}
Expand All @@ -44,17 +48,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) {
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;
if ( canHandleBlock(world, blockPos, genome, null) ) {
IBeeHousing house = (IBeeHousing) world.getTileEntity(blockPos);
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);
house.getBeeInventory().setQueen(queenStack);
house.getBeekeepingLogic().canWork();
return true;
}
return false;
}
}
82 changes: 62 additions & 20 deletions src/main/java/com/rwtema/careerbees/effects/EffectPower.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.rwtema.careerbees.effects;

import com.rwtema.careerbees.BeeMod; // get BeeMod.logger to record erroring
import com.rwtema.careerbees.effects.settings.IEffectSettingsHolder;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
Expand All @@ -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");
Expand All @@ -29,7 +31,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)) {
Expand All @@ -41,18 +43,15 @@ 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)) {
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;
}
}
ArrayList faces = getEnergyStorageFaces(world, pos, true);
int energysent = storeRFTEFaces(world, pos, faces, rfRate);
energyleft -= energysent;
if ( 0 == energyleft )
break;
}
return storedData;
}
Expand All @@ -63,10 +62,57 @@ public int getRFRate(@Nonnull IBeeGenome genome, @Nonnull IBeeHousing housing) {
return MathHelper.ceil(400 * speed * speed);
}

private ArrayList<EnumFacing> getEnergyStorageFaces(World world, BlockPos pos, boolean scanAll) {
ArrayList<EnumFacing> faces = new ArrayList<EnumFacing>();
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 ( te.hasCapability(CapabilityEnergy.ENERGY, face) &&
te.getCapability(CapabilityEnergy.ENERGY, face).canReceive() )
faces.add(face);
if ( ! scanAll )
return faces;
}
return faces;
}

private int storeRFTEFaces(World world, BlockPos pos, ArrayList<EnumFacing> faces, int maxRF) {
int energyLeft = maxRF;
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) {
// max rate, simulate (is false; actually do it)
int energyStored = storage.receiveEnergy(energyLeft, false);
if ( energyStored > energyLeft ) {
BeeMod.logger.trace("The block at " + pos + " on face " + face +
" consumed (" + energyStored +
") more energy than was sent (" + energyLeft +
"); this should never happen. " +
"Please report it to the author of the TileEntity: " + te);
energyLeft = 0;
} else {
energyLeft -= energyStored;
}
}
if ( 0 == energyLeft )
break;
}
return maxRF - energyLeft; // return 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 ! getEnergyStorageFaces(world, pos, false).isEmpty();
}

@Override
Expand All @@ -76,13 +122,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);
}
ArrayList<EnumFacing> faces = getEnergyStorageFaces(world, pos, true);
int rfRate = getRFRate(genome, housing);
storeRFTEFaces(world, pos, faces, rfRate);
}

@Override
Expand Down