From 628b0ec725da69e7b7c7a9add2b621f0eb91696d Mon Sep 17 00:00:00 2001 From: Bass Date: Mon, 22 Jul 2019 19:36:33 +0100 Subject: Tesla Scan Server Load Reduction --- .../multi/GT_MetaTileEntity_TM_teslaCoil.java | 55 ++++++- .../single/GT_MetaTileEntity_TeslaCoil.java | 175 +++++++++------------ 2 files changed, 126 insertions(+), 104 deletions(-) (limited to 'src/main/java/com') diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java index 42f4e6c8ab..7da138e74c 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_TM_teslaCoil.java @@ -1,6 +1,7 @@ package com.github.technus.tectech.thing.metaTileEntity.multi; import com.github.technus.tectech.CommonValues; +import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil; import com.github.technus.tectech.thing.cover.GT_Cover_TM_TeslaCoil_Ultimate; import com.github.technus.tectech.thing.metaTileEntity.IConstructable; import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Capacitor; @@ -342,9 +343,10 @@ public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_Multiblock energyCapacity=aNBT.getLong("energyCapacity"); } + //TODO Rewrite efficiency formulas private long getEnergyEfficiency(long voltage, int mTier, boolean overDriveToggle){ if (overDriveToggle){ - return (long)(voltage * (2-energyEfficiencyMin + (energyEfficiencyMax - energyEfficiencyMin) / (maxTier - minTier + 1) * mTier)*(2- overdriveEfficiency)); //Sum overdrive efficiency formula + return (long)(voltage * (2-energyEfficiencyMin + (energyEfficiencyMax - energyEfficiencyMin) / (maxTier - minTier + 1) * mTier)*(2 - overdriveEfficiency)); //Sum overdrive efficiency formula } else { return (long)(voltage * energyEfficiencyMin + (energyEfficiencyMax - energyEfficiencyMin) / (maxTier - minTier + 1) * mTier); //Efficiency Formula } @@ -597,8 +599,9 @@ public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_Multiblock continue; } IMetaTileEntity nodeInside = node.getMetaTileEntity(); - if (nodeInside instanceof GT_MetaTileEntity_TeslaCoil || nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && node.isActive() || (node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil_Ultimate)) { - eTeslaMap.put(node, (int) Math.ceil(Math.sqrt(xPosOffset * xPosOffset + yPosOffset * yPosOffset + zPosOffset * zPosOffset))); + if (nodeInside instanceof GT_MetaTileEntity_TeslaCoil || nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && node.isActive() || (node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil)) { + // eTeslaMap.put(node, (int) Math.ceil(Math.sqrt(xPosOffset * xPosOffset + yPosOffset * yPosOffset + zPosOffset * zPosOffset)));//TODO Test if range valid + eTeslaMap.put(node, (int) Math.ceil(Math.sqrt(Math.pow(xPosOffset,2) + Math.pow(yPosOffset,2) + Math.pow(zPosOffset,2)))); } } } @@ -651,11 +654,53 @@ public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_Multiblock scanForTransmissionTargets((int) xPosScanMin, (int) yPosScan4, (int) zPosScanMin, (int) xPosScanMax, (int) yPosScan5, (int) zPosScanMax); break; default: - if (scanTime == (int) scanTimeMinSetting.get()-1) { + if (scanTime == (int) scanTimeMinSetting.get() - 1) { scanTime = -1; + + IGregTechTileEntity mte = getBaseMetaTileEntity(); + for (Map.Entry Rx : eTeslaMap.entrySet()) { + IGregTechTileEntity node = Rx.getKey(); + if (node != null) { + IMetaTileEntity nodeInside = node.getMetaTileEntity(); + try { + if (nodeInside instanceof GT_MetaTileEntity_TeslaCoil) { + GT_MetaTileEntity_TeslaCoil teslaCoil = (GT_MetaTileEntity_TeslaCoil) nodeInside; + + float tX = node.getXCoord(); + float tY = node.getYCoord(); + float tZ = node.getZCoord(); + + float tXN = mte.getXCoord(); + float tYN = mte.getYCoord(); + float tZN = mte.getZCoord(); + + int tOffset = (int) Math.ceil(Math.sqrt(Math.pow(tX-tXN,2) + Math.pow(tY-tYN,2) + Math.pow(tZ-tZN,2))); + teslaCoil.eTeslaMap.put(mte,tOffset); + + for (Map.Entry RRx : eTeslaMap.entrySet()) { + IGregTechTileEntity nodeN = RRx.getKey(); + if (nodeN == node){ + continue; + } + tXN = nodeN.getXCoord(); + tYN = nodeN.getYCoord(); + tZN = nodeN.getZCoord(); + tOffset = (int) Math.ceil(Math.sqrt(Math.pow(tX-tXN,2) + Math.pow(tY-tYN,2) + Math.pow(tZ-tZN,2))); + if (tOffset > 20){ + continue; + } + teslaCoil.eTeslaMap.put(nodeN,tOffset); + } + } + } catch (Exception e) { + eTeslaMap.remove(Rx.getKey()); + } + } + } } break; } + scanTime++; scanTimeDisplay.set(scanTime); @@ -701,7 +746,7 @@ public class GT_MetaTileEntity_TM_teslaCoil extends GT_MetaTileEntity_Multiblock if (teslaCoil.getStoredEnergy()[1] > 0) { continue; } - } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil_Ultimate) && node.getEUCapacity() > 0) { + } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil) && node.getEUCapacity() > 0) { continue; } } catch (Exception e) { diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java index ca50cca4e5..fb751c8fab 100644 --- a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java +++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/single/GT_MetaTileEntity_TeslaCoil.java @@ -21,22 +21,21 @@ import static java.lang.Math.round; public class GT_MetaTileEntity_TeslaCoil extends GT_MetaTileEntity_BasicBatteryBuffer { - private int maxTier = 4; //Max tier of transceiver - private int minTier = 1; //Min tier of transceiver + private int maxTier = 3; //Max tier of transceiver + private int minTier = 0; //Min tier of transceiver - //private Map eTeslaMap = new HashMap();//Tesla Map to map them tesla bois! - public Map eTeslaMap = new HashMap();//Tesla Map to map them tesla bois! - //private int scanTime = 0; //Sets scan time to Z E R O :epic: - //private int scanTimeMin = 100; //Min scan time in ticks - //private int scanTimeTill = scanTimeMin; //Set default scan time + public Map eTeslaMap = new HashMap();//Tesla Map to map them tesla bois! + + //TODO Rewrite range limits, use new formula private int transferRadiusMax = 20; //Tesla scan radius private int transferRadiusMin = 4; //Tesla scan radius - private int transferRadiusLimitTop = transferRadiusMin + (transferRadiusMax - transferRadiusMin) / (maxTier - minTier + 1) * (mTier - 1); //Tesla scan radius Formula + private int transferRadiusLimitTop = transferRadiusMin + (transferRadiusMax - transferRadiusMin) / (maxTier - minTier + 1) * mTier; //Tesla scan radius Formula private int transferRadiusLimitBottom = 1; //Minimum user configurable private int transferRadius = transferRadiusLimitTop; //Default transferRadius setting private int transferRadiusTower = 0; //Radius for transceiver to tower transfers private int transferRadiusCover = 0; //Radius for transceiver to cover transfers + //TODO Rewrite histSetting to improve readability public boolean powerPassToggle = false; //Power Pass for public viewing private int histSteps = 20; //Hysteresis Resolution private int histSettingLow = 3; //Hysteresis Low Limit @@ -46,13 +45,15 @@ public class GT_MetaTileEntity_TeslaCoil extends GT_MetaTileEntity_BasicBatteryB private float histLow = (float) histSettingLow / histSteps; //Power pass is disabled if power is under this fraction private float histHigh = (float) histSettingHigh / histSteps; //Power pass is enabled if power is over this fraction + //TODO Rewrite efficiency formulas private long lossPerBlock = 2; //EU lost per block traveled private float energyEfficiencyMax = 0.95F; //Max efficiency private float energyEfficiencyMin = 0.75F; //Min efficiency private float overdriveEfficiency = 0.95F; //Overdrive efficiency - private float energyEfficiency = energyEfficiencyMin + (energyEfficiencyMax - energyEfficiencyMin) / (maxTier - minTier + 1) * (mTier - 1); //Efficiency Formula - private float sumOverdriveEfficiency = (2-energyEfficiency)*(2- overdriveEfficiency); //Sum overdrive efficiency formula + private float energyEfficiency = energyEfficiencyMin + (energyEfficiencyMax - energyEfficiencyMin) / (maxTier - minTier + 1) * mTier; //Efficiency Formula + private float sumOverdriveEfficiency = (2 - energyEfficiency) * (2 - overdriveEfficiency); //Sum overdrive efficiency formula + //TODO Rewrite over drive efficiency formulas public boolean overDriveToggle = false; //Overdrive toggle private long outputVoltage = V[mTier]; //Tesla Voltage Output private long outputVoltagePostEfficiency = (long) (outputVoltage * energyEfficiency); //Max power a machine can actually receive @@ -156,115 +157,91 @@ public class GT_MetaTileEntity_TeslaCoil extends GT_MetaTileEntity_BasicBatteryB @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); - if (aBaseMetaTileEntity.isServerSide() && !eTeslaMap.isEmpty()) { - - ////Hysteresis based ePowerPass Config - long energyMax = getStoredEnergy()[1]; - long energyStored = getStoredEnergy()[0]; - float energyFrac = (float) energyStored / energyMax; - - //ePowerPass hist toggle - if (!powerPassToggle && energyFrac > histHigh) { - powerPassToggle = true; - } else if (powerPassToggle && energyFrac < histLow) { - powerPassToggle = false; - } + if (aBaseMetaTileEntity.isClientSide() || eTeslaMap.isEmpty()) { + return; + } - //Scanning for active teslas - //scanTime++; - //if (scanTime >= scanTimeTill) { - // scanTime = 0; - // eTeslaMap.clear(); - // - // for (int xPosOffset = -transferRadius; xPosOffset <= transferRadius; xPosOffset++) { - // for (int yPosOffset = -transferRadius; yPosOffset <= transferRadius; yPosOffset++) { - // for (int zPosOffset = -transferRadius; zPosOffset <= transferRadius; zPosOffset++) { - // if (xPosOffset == 0 && yPosOffset == 0 && zPosOffset == 0) { - // continue; - // } - // IGregTechTileEntity node = aBaseMetaTileEntity.getIGregTechTileEntityOffset(xPosOffset, yPosOffset, zPosOffset); - // if (node == null) { - // continue; - // } - // IMetaTileEntity nodeInside = node.getMetaTileEntity(); - // if (nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && node.isActive() || (node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil)) { - // eTeslaMap.put(node, (int) Math.ceil(Math.sqrt(xPosOffset * xPosOffset + yPosOffset * yPosOffset + zPosOffset * zPosOffset))); - // } - // } - // } - // } - //} + //Hysteresis based ePowerPass Config + long energyMax = getStoredEnergy()[1]; + long energyStored = getStoredEnergy()[0]; + float energyFrac = (float) energyStored / energyMax; - //Stuff to do if ePowerPass - if (powerPassToggle) { - float rangeFrac = (float)((-0.5*Math.pow(energyFrac,2))+(1.5*energyFrac)); - outputCurrent = mBatteryCount; - transferRadiusTower = (int) (transferRadius * rangeFrac); - transferRadiusCover = (int) (transferRadiusTower / 1.25); + //ePowerPass hist toggle + if (!powerPassToggle && energyFrac > histHigh) { + powerPassToggle = true; + } else if (powerPassToggle && energyFrac < histLow) { + powerPassToggle = false; + } - //Clean the eTeslaMap - for (Map.Entry Rx : eTeslaMap.entrySet()) { - IGregTechTileEntity node = Rx.getKey(); - if (node != null) { - IMetaTileEntity nodeInside = node.getMetaTileEntity(); - try { - if (nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && node.isActive()) { - GT_MetaTileEntity_TM_teslaCoil teslaTower = (GT_MetaTileEntity_TM_teslaCoil) nodeInside; - if (teslaTower.maxEUStore() > 0) { - continue; - } - } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil) && node.getEUCapacity() > 0) { + //Stuff to do if ePowerPass + if (powerPassToggle) { + float rangeFrac = (float) ((-0.5 * Math.pow(energyFrac, 2)) + (1.5 * energyFrac)); + outputCurrent = mBatteryCount; + transferRadiusTower = (int) (transferRadius * rangeFrac); + transferRadiusCover = (int) (transferRadiusTower / 1.25); + + //Clean the eTeslaMap + for (Map.Entry Rx : eTeslaMap.entrySet()) { + IGregTechTileEntity node = Rx.getKey(); + if (node != null) { + IMetaTileEntity nodeInside = node.getMetaTileEntity(); + try { + if (nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && node.isActive()) { + GT_MetaTileEntity_TM_teslaCoil teslaTower = (GT_MetaTileEntity_TM_teslaCoil) nodeInside; + if (teslaTower.maxEUStore() > 0) { continue; } - } catch (Exception e) { + } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil) && node.getEUCapacity() > 0) { + continue; } + } catch (Exception e) { } - eTeslaMap.remove(Rx.getKey()); } + eTeslaMap.remove(Rx.getKey()); + } - //Power transfer - while (outputCurrent > 0) { - boolean idle = true; - for (Map.Entry Rx : entriesSortedByValues(eTeslaMap)) { - if (getEUVar() >= (overDriveToggle ? outputVoltage*2 : outputVoltage)) { - IGregTechTileEntity node = Rx.getKey(); - IMetaTileEntity nodeInside = node.getMetaTileEntity(); - if (overDriveToggle){ - outputVoltageInjectable = outputVoltage; - outputVoltageConsumption = outputVoltagePostOverdrive + (lossPerBlock * Rx.getValue()); - } else { - outputVoltageInjectable = outputVoltagePostEfficiency - (lossPerBlock * Rx.getValue()); - outputVoltageConsumption = outputVoltage; - } - if (nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && Rx.getValue() <= transferRadiusTower) { - GT_MetaTileEntity_TM_teslaCoil nodeTesla = (GT_MetaTileEntity_TM_teslaCoil) nodeInside; - if (!nodeTesla.ePowerPass) { - if (nodeTesla.getEUVar() + outputVoltageInjectable <= (nodeTesla.maxEUStore() / 2)) { - setEUVar(getEUVar() - outputVoltageConsumption); - node.increaseStoredEnergyUnits(outputVoltageInjectable, true); - outputCurrent--; - idle = false; - } - } - } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil) && !(node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil_Ultimate) && Rx.getValue() <= transferRadiusCover) { - if (node.injectEnergyUnits((byte) 1, outputVoltageInjectable, 1L) > 0L) { + //Power transfer + while (outputCurrent > 0) { + boolean idle = true; + for (Map.Entry Rx : entriesSortedByValues(eTeslaMap)) { + if (getEUVar() >= (overDriveToggle ? outputVoltage * 2 : outputVoltage)) { + IGregTechTileEntity node = Rx.getKey(); + IMetaTileEntity nodeInside = node.getMetaTileEntity(); + if (overDriveToggle) { + outputVoltageInjectable = outputVoltage; + outputVoltageConsumption = outputVoltagePostOverdrive + (lossPerBlock * Rx.getValue()); + } else { + outputVoltageInjectable = outputVoltagePostEfficiency - (lossPerBlock * Rx.getValue()); + outputVoltageConsumption = outputVoltage; + } + if (nodeInside instanceof GT_MetaTileEntity_TM_teslaCoil && Rx.getValue() <= transferRadiusTower) { + GT_MetaTileEntity_TM_teslaCoil nodeTesla = (GT_MetaTileEntity_TM_teslaCoil) nodeInside; + if (!nodeTesla.ePowerPass) { + if (nodeTesla.getEUVar() + outputVoltageInjectable <= (nodeTesla.maxEUStore() / 2)) { setEUVar(getEUVar() - outputVoltageConsumption); + node.increaseStoredEnergyUnits(outputVoltageInjectable, true); outputCurrent--; idle = false; } } - if (outputCurrent == 0) { - break; + } else if ((node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil) && !(node.getCoverBehaviorAtSide((byte) 1) instanceof GT_Cover_TM_TeslaCoil_Ultimate) && Rx.getValue() <= transferRadiusCover) { + if (node.injectEnergyUnits((byte) 1, outputVoltageInjectable, 1L) > 0L) { + setEUVar(getEUVar() - outputVoltageConsumption); + outputCurrent--; + idle = false; } - } else { - idle = true; + } + if (outputCurrent == 0) { break; } - } - if (idle) { + } else { + idle = true; break; } } + if (idle) { + break; + } } } } -- cgit