diff options
Diffstat (limited to 'src/Java/gtPlusPlus')
4 files changed, 297 insertions, 7 deletions
diff --git a/src/Java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java b/src/Java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java index 5dfb9ebd2b..b95ab04024 100644 --- a/src/Java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java +++ b/src/Java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java @@ -4,6 +4,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import cpw.mods.fml.common.FMLCommonHandler; import gregtech.api.GregTech_API; import gregtech.api.util.GT_Config; import gregtech.api.util.MultiblockRecipeMapHandler; @@ -15,6 +16,7 @@ import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials; import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config; import gtPlusPlus.xmod.gregtech.api.world.GTPP_Worldgen; import gtPlusPlus.xmod.gregtech.common.blocks.fluid.GregtechFluidHandler; +import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper; import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechItems; import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools; import gtPlusPlus.xmod.gregtech.loaders.*; diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java b/src/Java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java new file mode 100644 index 0000000000..98d7442429 --- /dev/null +++ b/src/Java/gtPlusPlus/xmod/gregtech/common/helpers/ChargingHelper.java @@ -0,0 +1,251 @@ +package gtPlusPlus.xmod.gregtech.common.helpers; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; +import gregtech.api.enums.GT_Values; +import gregtech.api.items.GT_MetaGenerated_Tool; +import gtPlusPlus.core.util.Utils; +import gtPlusPlus.core.util.array.BlockPos; +import gtPlusPlus.core.util.array.Pair; +import gtPlusPlus.core.util.math.MathUtils; +import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger; +import ic2.api.info.Info; +import ic2.api.item.ElectricItem; +import ic2.api.item.IElectricItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; + +public class ChargingHelper { + + protected static Map<BlockPos, GregtechMetaWirelessCharger> mChargerMap = new HashMap<BlockPos, GregtechMetaWirelessCharger>(); + private int mTickTimer = 0; + + public static boolean addEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity){ + if (!mChargerMap.containsKey(mPos)){ + if (mChargerMap.put(mPos, mEntity) == null){ + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + public static boolean removeEntry(BlockPos mPos, GregtechMetaWirelessCharger mEntity){ + if (mChargerMap.containsKey(mPos)){ + if (mChargerMap.remove(mPos, mEntity)){ + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + private static Map<EntityPlayer, Pair<GregtechMetaWirelessCharger, Byte>> mValidPlayers = new HashMap<EntityPlayer, Pair<GregtechMetaWirelessCharger, Byte>>(); + + public static boolean addValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity){ + if (!mValidPlayers.containsKey(mPlayer)){ + Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<GregtechMetaWirelessCharger, Byte>(mEntity, (byte) mEntity.getMode()); + if (mValidPlayers.put(mPlayer, mEntry) == null){ + Utils.LOG_INFO("Added a Player to the Tick Map."); + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + public static boolean removeValidPlayer(EntityPlayer mPlayer, GregtechMetaWirelessCharger mEntity){ + if (mValidPlayers.containsKey(mPlayer)){ + Pair<GregtechMetaWirelessCharger, Byte> mEntry = new Pair<GregtechMetaWirelessCharger, Byte>(mEntity, (byte) mEntity.getMode()); + if (mValidPlayers.remove(mPlayer, mEntry)){ + Utils.LOG_INFO("Removed a Player to the Tick Map."); + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + + //Called whenever the player is updated or ticked. + @SubscribeEvent + public void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.player != null){ + Utils.LOG_INFO("Found Player."); + if (event.side == Side.SERVER){ + Utils.LOG_INFO("Found Server-Side."); + + mTickTimer++; + + if (mTickTimer % 20 == 0){ + + long mVoltage = 0; + long mEuStored = 0; + + if (!mChargerMap.isEmpty() && mValidPlayers.containsKey(event.player)){ + + for (GregtechMetaWirelessCharger mEntityTemp : mChargerMap.values()){ + mVoltage = mEntityTemp.getInputTier(); + mEuStored = mEntityTemp.getEUVar(); + if (mVoltage > 0 && mEuStored >= mVoltage){ + + InventoryPlayer mPlayerInventory = event.player.inventory; + ItemStack[] mArmourContents = mPlayerInventory.armorInventory; + ItemStack[] mInventoryContents = mPlayerInventory.mainInventory; + + Map<EntityPlayer, UUID> LR = mEntityTemp.getLongRangeMap(); + Map<UUID, EntityPlayer> LO = mEntityTemp.getLocalMap(); + + long mStartingEu = mEntityTemp.getEUVar(); + long mCurrentEu = mEntityTemp.getEUVar(); + long mEuUsed = 0; + if (mEntityTemp.getMode() == 0){ + + if (!LR.isEmpty() && LR.containsKey(event.player)){ + mCurrentEu = chargeItems(mEntityTemp, mArmourContents, event.player); + mCurrentEu = chargeItems(mEntityTemp, mInventoryContents, event.player); + } + } + else if (mEntityTemp.getMode() == 1){ + if (!LO.isEmpty() && LO.containsValue(event.player)){ + mCurrentEu = chargeItems(mEntityTemp, mArmourContents, event.player); + mCurrentEu = chargeItems(mEntityTemp, mInventoryContents, event.player); + } + } + else { + if (!LR.isEmpty() && LR.containsKey(event.player)){ + mCurrentEu = chargeItems(mEntityTemp, mArmourContents, event.player); + mCurrentEu = chargeItems(mEntityTemp, mInventoryContents, event.player); + } + if (!LO.isEmpty() && LO.containsValue(event.player)){ + mCurrentEu = chargeItems(mEntityTemp, mArmourContents, event.player); + mCurrentEu = chargeItems(mEntityTemp, mInventoryContents, event.player); + } + } + + if ((mEuUsed = (mStartingEu - mCurrentEu)) <= 0){ + long mMaxDistance; + if (mEntityTemp.getMode() == 0){ + mMaxDistance = (4*GT_Values.V[mEntityTemp.getTier()]); + } + else if (mEntityTemp.getMode() == 1){ + mMaxDistance = (mEntityTemp.getTier()*10); + } + else { + mMaxDistance = (4*GT_Values.V[mEntityTemp.getTier()]/2); + } + double mDistance = calculateDistance(mEntityTemp, event); + long mVoltageCost = MathUtils.findPercentageOfInt(mMaxDistance, (float) mDistance); + + if (mVoltageCost > 0){ + if (mVoltageCost > mEntityTemp.maxEUInput()){ + mEntityTemp.setEUVar((mEntityTemp.getEUVar()-mEntityTemp.maxEUInput())); + } + else { + mEntityTemp.setEUVar((mEntityTemp.getEUVar()-mVoltageCost)); + } + } + + } + + } + else { + Utils.LOG_INFO("Voltage: "+mVoltage+" | Eu Storage: "+mEuStored); + } + } + } + } + } + } + } + + public double calculateDistance(GregtechMetaWirelessCharger mEntityTemp, TickEvent.PlayerTickEvent event){ + return mEntityTemp.getDistanceBetweenTwoPositions(mEntityTemp.getTileEntityPosition(), mEntityTemp.getPositionOfEntity(event.player)); + } + + public long chargeItems(GregtechMetaWirelessCharger mEntity, ItemStack[] mItems, EntityPlayer mPlayer){ + if (mEntity == null || mItems == null || mItems.length == 0){ + return mEntity.getEUVar(); + } + int mChargedItems = 0; + final int mTier = mEntity.getTier(); + final long mVoltage = mEntity.getInputTier(); + long mEuStored = mEntity.getEUVar(); + final long mEuStoredOriginal = mEntity.getEUVar(); + for (ItemStack mTemp : mItems){ + if (isItemValid(mTemp)){ + ElectricItem.manager.charge(mTemp, mVoltage, mTier, false, false); + mEntity.setEUVar(mEuStored-mVoltage); + mEuStored = mEntity.getEUVar(); + mChargedItems++; + Utils.LOG_INFO("Charged "+mTemp.getDisplayName()+" by "+mVoltage+" for "+mPlayer.getCommandSenderName()); + } + } + if (mChargedItems < 1){ + return mEuStoredOriginal; + } + return mEntity.getEUVar(); + } + + public boolean isItemValid(final ItemStack itemstack) { + if ((accepts(itemstack)) || (itemstack.getItem() instanceof GT_MetaGenerated_Tool) || (itemstack.getItem() instanceof IElectricItem)) { + return true; + } + return false; + } + + public boolean accepts(final ItemStack stack) { + if (stack == null) { + return false; + } + return (Info.itemEnergy.getEnergyValue(stack) > 0.0D) + || (ElectricItem.manager.discharge(stack, (1.0D / 0.0D), 4, true, true, true) > 0.0D); + } + + //Called when the client ticks. + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + + } + + //Called when the server ticks. Usually 20 ticks a second. + @SubscribeEvent + public void onServerTick(TickEvent.ServerTickEvent event) { + + } + + //Called when a new frame is displayed (See fps) + @SubscribeEvent + public void onRenderTick(TickEvent.RenderTickEvent event) { + + } + + //Called when the world ticks + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent event) { + + } + +} diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java index 7d71ae9b54..9b84916459 100644 --- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java +++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/basic/GregtechMetaWirelessCharger.java @@ -17,6 +17,7 @@ import gtPlusPlus.core.util.entity.EntityUtils; import gtPlusPlus.core.util.player.PlayerUtils; import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMetaTileEntity; import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; +import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -25,6 +26,8 @@ import net.minecraft.nbt.NBTTagCompound; public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { + private boolean mHasBeenMapped = false; + public GregtechMetaWirelessCharger(final int aID, final String aName, final String aNameRegional, final int aTier, final String aDescription, final int aSlotCount) { super(aID, aName, aNameRegional, aTier, aSlotCount, aDescription); } @@ -44,6 +47,22 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { "gets half the distances each singular mode gets.", CORE.GT_Tooltip}; } + + public int getTier(){ + return this.mTier; + } + + public int getMode(){ + return this.mMode; + } + + public Map<UUID, EntityPlayer> getLocalMap(){ + return this.mLocalChargingMap; + } + + public Map<EntityPlayer, UUID> getLongRangeMap(){ + return this.mWirelessChargingMap; + } @Override public ITexture[][][] getTextureSet(final ITexture[] aTextures) { @@ -335,8 +354,11 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { super.onPostTick(aBaseMetaTileEntity, aTick); if (this.getBaseMetaTileEntity().isServerSide()) { + if (!mHasBeenMapped && ChargingHelper.addEntry(getTileEntityPosition(), this)){ + mHasBeenMapped = true; + } - if (aTick % 20 == 0){ + if (aTick % 20 == 0 && mHasBeenMapped){ if (!aBaseMetaTileEntity.getWorld().playerEntities.isEmpty()){ for (Object mTempPlayer : aBaseMetaTileEntity.getWorld().playerEntities){ if (mTempPlayer instanceof EntityPlayer || mTempPlayer instanceof EntityPlayerMP){ @@ -347,13 +369,15 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { if (getDistanceBetweenTwoPositions(getTileEntityPosition(), getPositionOfEntity(mTemp)) < tempRange){ if (!mLocalChargingMap.containsKey(mTemp.getPersistentID())){ mLocalChargingMap.put(mTemp.getPersistentID(), mTemp); + ChargingHelper.addValidPlayer(mTemp, this); PlayerUtils.messagePlayer(mTemp, "You have entered charging range. ["+tempRange+"m]."); } } else { if (mLocalChargingMap.containsKey(mTemp.getPersistentID())){ if (mLocalChargingMap.remove(mTemp.getPersistentID()) != null){ - PlayerUtils.messagePlayer(mTemp, "You have left charging range. ["+tempRange+"m]."); + PlayerUtils.messagePlayer(mTemp, "You have left charging range. ["+tempRange+"m]."); + ChargingHelper.removeValidPlayer(mTemp, this); } } } @@ -364,12 +388,14 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { if (!mWirelessChargingMap.containsKey(mTemp)){ mWirelessChargingMap.put(mTemp, mTemp.getPersistentID()); PlayerUtils.messagePlayer(mTemp, "You have entered charging range. ["+tempRange+"m]."); + ChargingHelper.addValidPlayer(mTemp, this); } } else { if (mWirelessChargingMap.containsKey(mTemp)){ if (mWirelessChargingMap.remove(mTemp) != null){ - PlayerUtils.messagePlayer(mTemp, "You have left charging range. ["+tempRange+"m]."); + PlayerUtils.messagePlayer(mTemp, "You have left charging range. ["+tempRange+"m]."); + ChargingHelper.removeValidPlayer(mTemp, this); } } } @@ -384,18 +410,18 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { } } - private BlockPos getTileEntityPosition(){ + public BlockPos getTileEntityPosition(){ return new BlockPos(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()); } - private BlockPos getPositionOfEntity(Entity mEntity){ + public BlockPos getPositionOfEntity(Entity mEntity){ if (mEntity == null){ return null; } return EntityUtils.findBlockPosUnderEntity(mEntity); } - private double getDistanceBetweenTwoPositions(BlockPos objectA, BlockPos objectB){ + public double getDistanceBetweenTwoPositions(BlockPos objectA, BlockPos objectB){ int[] objectArray1 = new int[]{objectA.xPos, objectA.yPos, objectA.zPos}; int[] objectArray2 = new int[]{objectB.xPos, objectB.yPos, objectB.zPos}; if (objectA == null || objectB == null){ @@ -411,6 +437,9 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { @Override public void onRemoval() { mWirelessChargingMap.clear(); + mLocalChargingMap.clear(); + ChargingHelper.removeEntry(getTileEntityPosition(), this); + super.onRemoval(); } @@ -445,6 +474,10 @@ public class GregtechMetaWirelessCharger extends GregtechMetaTileEntity { @Override public void onServerStart() { mWirelessChargingMap.clear(); + mLocalChargingMap.clear(); + if (!mHasBeenMapped && ChargingHelper.addEntry(getTileEntityPosition(), this)){ + mHasBeenMapped = true; + } super.onServerStart(); } diff --git a/src/Java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java b/src/Java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java index 538112d365..bd5f1abc54 100644 --- a/src/Java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java +++ b/src/Java/gtPlusPlus/xmod/gregtech/registration/gregtech/GregtechWirelessChargers.java @@ -1,10 +1,12 @@ package gtPlusPlus.xmod.gregtech.registration.gregtech; +import cpw.mods.fml.common.FMLCommonHandler; import gregtech.api.enums.ItemList; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.util.GT_ModHandler; import gtPlusPlus.xmod.gregtech.api.enums.GregtechItemList; +import gtPlusPlus.xmod.gregtech.common.helpers.ChargingHelper; import gtPlusPlus.xmod.gregtech.common.tileentities.machines.basic.GregtechMetaWirelessCharger; import net.minecraft.item.ItemStack; @@ -15,7 +17,9 @@ public class GregtechWirelessChargers { long bitsd = GT_ModHandler.RecipeBits.DISMANTLEABLE | GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE | GT_ModHandler.RecipeBits.BUFFERED; - int mID = 890; + int mID = 890; + + FMLCommonHandler.instance().bus().register(ChargingHelper.class); GregtechItemList.Charger_LV.set(new GregtechMetaWirelessCharger(mID++, "wificharger.01.tier.single", "Wireless Charger MK I", 1, "Hopefully won't give you cancer.", 0).getStackForm(1L)); |