Merge pull request #1811 from MatthiasMann/wireless_optimizations

cache which wireless chargers are in range of a TE
This commit is contained in:
tterrag1098 committed 2015-01-31 20:28:50 -05:00
commit 0d490edc46
5 files changed
+89 -20

No files matched your search

@@ -31,7 +31,7 @@ import crazypants.enderio.config.Config;
import crazypants.enderio.machine.AbstractMachineEntity;
import crazypants.enderio.machine.SlotDefinition;
import crazypants.enderio.machine.generator.zombie.NutrientTank;
import crazypants.enderio.machine.wireless.WirelessChargerController;
import crazypants.enderio.machine.wireless.WirelessChargedLocation;
import crazypants.enderio.network.PacketHandler;
import crazypants.enderio.xp.ExperienceContainer;
import crazypants.enderio.xp.IHaveExperience;
@@ -45,7 +45,7 @@ import crazypants.vecmath.Vector3d;
public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandler, IEntitySelector, IHaveExperience {
private static int IO_MB_TICK = 250;
private static final int IO_MB_TICK = 250;
protected AxisAlignedBB killBounds;
@@ -55,6 +55,8 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
protected FakePlayer attackera;
protected WirelessChargedLocation chargedLocation;
final NutrientTank fuelTank = new NutrientTank(FluidContainerRegistry.BUCKET_VOLUME * 2);
int lastFluidLevelUpdate;
@@ -69,7 +71,7 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
private float prevSwingProgress;
private ExperienceContainer xpCon = new ExperienceContainer(XpUtil.getExperienceForLevel(Config.killerJoeMaxXpLevel));
private final ExperienceContainer xpCon = new ExperienceContainer(XpUtil.getExperienceForLevel(Config.killerJoeMaxXpLevel));
private boolean hadSword;
@@ -204,7 +206,7 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
frontFaceAndSides = new int[]{this.facing,ForgeDirection.ROTATION_MATRIX[0][this.facing],ForgeDirection.ROTATION_MATRIX[1][this.facing]};
}
private static double[][] faceMidPoints = new double[][]{{0.5D,0.0D,0.5D},{0.5D,1.0D,0.5D},{0.5D,0.5D,0.0D},{0.5D,0.5D,1.0D},{0.0D,0.5D,0.5D},{1.0D,0.5D,0.5D}};
private static final double[][] faceMidPoints = new double[][]{{0.5D,0.0D,0.5D},{0.5D,1.0D,0.5D},{0.5D,0.5D,0.0D},{0.5D,0.5D,1.0D},{0.0D,0.5D,0.5D},{1.0D,0.5D,0.5D}};
//------------------------------- XP
@@ -309,6 +311,13 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
return attackera;
}
WirelessChargedLocation getChargedLocation() {
if(chargedLocation == null) {
chargedLocation = new WirelessChargedLocation(this);
}
return chargedLocation;
}
private AxisAlignedBB getKillBounds() {
if(killBounds == null) {
BoundingBox bb = new BoundingBox(getLocation());
@@ -488,8 +497,8 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
xpCon.writeToNBT(nbtRoot);
}
private static UUID uuid = UUID.fromString("3baa66fa-a69a-11e4-89d3-123b93f75cba");
private static GameProfile DUMMY_PROFILE = new GameProfile(uuid, "[EioKillera]");
private static final UUID uuid = UUID.fromString("3baa66fa-a69a-11e4-89d3-123b93f75cba");
private static final GameProfile DUMMY_PROFILE = new GameProfile(uuid, "[EioKillera]");
private class Attackera extends FakePlayer {
@@ -519,7 +528,8 @@ public class TileKillerJoe extends AbstractMachineEntity implements IFluidHandle
}
prevWeapon = cur == null ? null : cur.copy();
}
WirelessChargerController.instance.chargePlayersItems(this);
getChargedLocation().chargeItems(inventory.mainInventory);
}
}
@@ -10,7 +10,7 @@ public interface IWirelessCharger {
BlockCoord getLocation();
boolean chargeItems(ItemStack[] armorInventory);
boolean chargeItems(ItemStack[] items);
int takeEnergy(int max);
@@ -57,12 +57,12 @@ public class TileWirelessCharger extends TileEntityEio implements IInternalPower
}
@Override
public boolean chargeItems(ItemStack[] items) {
public boolean chargeItems(ItemStack[] items) {
boolean chargedItem = false;
int available = Math.min(MAX_ENERGY_OUT, storedEnergyRF);
for (ItemStack item : items) {
if(item != null && available > 0) {
int used = 0;
for (int i=0,end=items.length ; i<end && available>0 ; i++) {
ItemStack item = items[i];
if(item != null) {
if(item.getItem() instanceof IEnergyContainerItem && item.stackSize == 1) {
IEnergyContainerItem chargable = (IEnergyContainerItem) item.getItem();
@@ -70,14 +70,14 @@ public class TileWirelessCharger extends TileEntityEio implements IInternalPower
int cur = chargable.getEnergyStored(item);
int canUse = Math.min(available, max - cur);
if(cur < max) {
used = chargable.receiveEnergy(item, canUse, false);
int used = chargable.receiveEnergy(item, canUse, false);
if(used > 0) {
storedEnergyRF = storedEnergyRF - used;
chargedItem = true;
available -= used;
}
}
}
if(used > 0) {
storedEnergyRF = storedEnergyRF - used;
chargedItem = true;
available -= used;
}
}
}
return chargedItem;
@@ -0,0 +1,43 @@
package crazypants.enderio.machine.wireless;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import crazypants.util.BlockCoord;
public class WirelessChargedLocation {
private final TileEntity te;
private int lastChangeCount;
private final List<IWirelessCharger> chargers;
public WirelessChargedLocation(TileEntity te) {
this.te = te;
this.chargers = new ArrayList<IWirelessCharger>();
updateChargers();
}
private void updateChargers() {
WirelessChargerController wcc = WirelessChargerController.instance;
chargers.clear();
lastChangeCount = wcc.getChangeCount();
wcc.getChargers(te.getWorldObj(), new BlockCoord(te), chargers);
}
public boolean chargeItems(ItemStack[] items) {
if(lastChangeCount != WirelessChargerController.instance.getChangeCount()) {
updateChargers();
}
for(IWirelessCharger wc : chargers) {
if(wc.isActive()) {
if(wc.chargeItems(items)) {
return true;
}
}
}
return false;
}
}
@@ -26,7 +26,8 @@ public class WirelessChargerController {
MinecraftForge.EVENT_BUS.register(WirelessChargerController.instance);
}
private Map<Integer, Map<BlockCoord, IWirelessCharger>> perWorldChargers = new HashMap<Integer, Map<BlockCoord, IWirelessCharger>>();
private final Map<Integer, Map<BlockCoord, IWirelessCharger>> perWorldChargers = new HashMap<Integer, Map<BlockCoord, IWirelessCharger>>();
private int changeCount;
private WirelessChargerController() {
}
@@ -34,9 +35,10 @@ public class WirelessChargerController {
public void registerCharger(IWirelessCharger charger) {
if(charger == null) {
return;
}
}
Map<BlockCoord, IWirelessCharger> chargers = getChargersForWorld(charger.getWorld());
chargers.put(charger.getLocation(), charger);
changeCount++;
}
public void deregisterCharger(IWirelessCharger capBank) {
@@ -45,6 +47,7 @@ public class WirelessChargerController {
}
Map<BlockCoord, IWirelessCharger> chargers = getChargersForWorld(capBank.getWorld());
chargers.remove(capBank.getLocation());
changeCount++;
}
@SubscribeEvent
@@ -55,6 +58,19 @@ public class WirelessChargerController {
chargePlayersItems(event.player);
}
public int getChangeCount() {
return changeCount;
}
public void getChargers(World world, BlockCoord bc, Collection<IWirelessCharger> res) {
Map<BlockCoord, IWirelessCharger> chargers = getChargersForWorld(world);
for (IWirelessCharger wc : chargers.values()) {
if(wc.getLocation().distanceSquared(bc) <= RANGE_SQ) {
res.add(wc);
}
}
}
public void chargePlayersItems(EntityPlayer player) {
Map<BlockCoord, IWirelessCharger> chargers = getChargersForWorld(player.worldObj);
if(chargers.isEmpty()) {