mirror of
https://github.com/GTNewHorizons/EnderIO.git
synced 2026-10-26 14:24:40 +00:00
Merge pull request #1811 from MatthiasMann/wireless_optimizations
cache which wireless chargers are in range of a TE
This commit is contained in:
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()) {
|
||||
|
||||
Reference in new issue
Block a user