aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common')
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java
new file mode 100644
index 0000000000..bf58418246
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_AdvSeismicProspector.java
@@ -0,0 +1,221 @@
+package gregtech.common.tileentities.machines.basic;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import ic2.core.Ic2Items;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraftforge.fluids.FluidStack;
+import sun.text.resources.es.CollationData_es;
+
+public class GT_MetaTileEntity_AdvSeismicProspector extends GT_MetaTileEntity_BasicMachine {
+ boolean ready = false;
+ int radius;
+ int near;
+ int middle;
+ int step;
+
+ public GT_MetaTileEntity_AdvSeismicProspector(int aID, String aName, String aNameRegional, int aTier, int aRadius, int aStep) {
+ super(aID, aName, aNameRegional, aTier, 1, // amperage
+ "Place, activate with explosives ("
+ + "8 Glyceryl, "
+ + "32 TNT or "
+ + "16 ITNT), use Data Stick",
+ 1, // input slot count
+ 1, // output slot count
+ "Default.png", // GUI name
+ "", // NEI name
+ new ITexture[] { new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_SIDE_ROCK_BREAKER),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_TOP_ROCK_BREAKER),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_FRONT_ROCK_BREAKER),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER_ACTIVE),
+ new GT_RenderedTexture(Textures.BlockIcons.OVERLAY_BOTTOM_ROCK_BREAKER) });
+ radius = aRadius;
+ near = radius / 3;
+ near = near + near % 2; // making near value even;
+ middle = near * 2;
+ step = aStep;
+ }
+
+ protected GT_MetaTileEntity_AdvSeismicProspector(String aName, int aTier, String aDescription, ITexture[][][] aTextures,
+ String aGUIName, String aNEIName, int aNear, int aMiddle, int aRadius, int aStep) {
+ super(aName, aTier, 1, aDescription, aTextures, 1, 1, aGUIName, aNEIName);
+ radius = aRadius;
+ near = aNear;
+ middle = aMiddle;
+ step = aStep;
+ }
+
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AdvSeismicProspector(this.mName, this.mTier, this.mDescription, this.mTextures,
+ this.mGUIName, this.mNEIName, this.near, this.middle, this.radius, this.step);
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ ItemStack aStack = aPlayer.getCurrentEquippedItem();
+
+ if (!ready && (GT_Utility.consumeItems(aPlayer, aStack, Item.getItemFromBlock(Blocks.tnt), 32)
+ || GT_Utility.consumeItems(aPlayer, aStack, Ic2Items.industrialTnt.getItem(), 16)
+ || GT_Utility.consumeItems(aPlayer, aStack, Materials.Glyceryl, 8))) {
+
+ this.ready = true;
+ this.mMaxProgresstime = (aPlayer.capabilities.isCreativeMode ? 20 : 800);
+
+ } else if (ready && mMaxProgresstime == 0
+ && aStack != null && aStack.stackSize == 1
+ && aStack.getItem() == ItemList.Tool_DataStick.getItem()) {
+ this.ready = false;
+
+ // prospecting ores
+ HashMap<String, Integer> tNearOres = new HashMap<String, Integer>();
+ HashMap<String, Integer> tMiddleOres = new HashMap<String, Integer>();
+ HashMap<String, Integer> tFarOres = new HashMap<String, Integer>();
+ prospectOres(tNearOres, tMiddleOres, tFarOres);
+
+ // prospecting oils
+ HashMap<String, Integer> tOils = new HashMap<String, Integer>(9);
+ prospectOils(tOils);
+
+ GT_Utility.ItemNBT.setAdvancedProspectionData(mTier,
+ aStack,
+ this.getBaseMetaTileEntity().getXCoord(),
+ this.getBaseMetaTileEntity().getYCoord(),
+ this.getBaseMetaTileEntity().getZCoord(),
+ this.getBaseMetaTileEntity().getWorld().provider.dimensionId,
+ GT_Utility.sortByValueToList(tOils),
+ GT_Utility.sortByValueToList(tNearOres),
+ GT_Utility.sortByValueToList(tMiddleOres),
+ GT_Utility.sortByValueToList(tFarOres),
+ near, middle, radius);
+ }
+ }
+
+ return true;
+ }
+
+ private void prospectOils(HashMap<String, Integer> aOils) {
+
+ int tLeftXBound = this.getBaseMetaTileEntity().getXCoord() - radius;
+ int tRightXBound = tLeftXBound + 2*radius;
+
+ int tLeftZBound = this.getBaseMetaTileEntity().getZCoord() - radius;
+ int tRightZBound = tLeftZBound + 2*radius;
+
+ ArrayList<String> filterList = new ArrayList<String>(9);
+ String filter;
+
+ for (int x = tLeftXBound; x <= tRightXBound; ++x)
+ for (int z = tLeftZBound; z <= tRightZBound; ++z) {
+ filter = x/96 + "," + z/96;
+
+ if (!filterList.contains(filter)) {
+ filterList.add(filter);
+
+ putOil((x/96)*96, (z/96)*96, aOils);
+ }
+ }
+ }
+
+ private void putOil(int x, int z, HashMap<String, Integer> aOils) {
+ FluidStack tFluid = GT_Utility.getUndergroundOil(getBaseMetaTileEntity().getWorld(), x, z);
+ if (tFluid.amount / 5000 > 0)
+ aOils.put(x + "," + z + "," + (tFluid.amount / 5000) + "," + tFluid.getLocalizedName(), tFluid.amount / 5000);
+ }
+
+ private void prospectOres(Map<String, Integer> aNearOres, Map<String, Integer> aMiddleOres, Map<String, Integer> aFarOres) {
+ int tLeftXBound = this.getBaseMetaTileEntity().getXCoord() - radius;
+ int tRightXBound = tLeftXBound + 2*radius;
+
+ int tLeftZBound = this.getBaseMetaTileEntity().getZCoord() - radius;
+ int tRightZBound = tLeftZBound + 2*radius;
+
+ for (int i = tLeftXBound; i <= tRightXBound; i += step)
+ for (int k = tLeftZBound; k <= tRightZBound; k += step) {
+ int di = Math.abs(i - this.getBaseMetaTileEntity().getXCoord());
+ int dk = Math.abs(k - this.getBaseMetaTileEntity().getZCoord());
+
+ if (di <= near && dk <= near)
+ prospectHole(i, k, aNearOres);
+ else if (di <= middle && dk <= middle)
+ prospectHole(i, k, aMiddleOres);
+ else
+ prospectHole(i, k, aFarOres);
+ }
+ }
+
+ private void prospectHole(
+ int i, int k, Map<String, Integer> aOres) {
+
+ String tFoundOre = null;
+ for (int j = this.getBaseMetaTileEntity().getYCoord(); j > 0; j--) {
+ tFoundOre = checkForOre(i, j, k);
+ if (tFoundOre == null)
+ continue;
+
+ countOre(aOres, tFoundOre);
+ }
+ }
+
+ private String checkForOre(int x, int y, int z) {
+ Block tBlock = this.getBaseMetaTileEntity().getBlock(x, y, z);
+
+ if (tBlock instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = getBaseMetaTileEntity().getWorld().getTileEntity(x, y, z);
+
+ if ((tTileEntity instanceof GT_TileEntity_Ores)
+ && (((GT_TileEntity_Ores) tTileEntity).mMetaData < 16000)) { // Filtering small ores
+ Materials tMaterial
+ = GregTech_API.sGeneratedMaterials[((GT_TileEntity_Ores) tTileEntity).mMetaData % 1000];
+
+ if ((tMaterial != null) && (tMaterial != Materials._NULL))
+ return tMaterial.mDefaultLocalName;
+ }
+ } else {
+ int tMetaID = getBaseMetaTileEntity().getWorld().getBlockMetadata(x, y, z);
+ ItemData tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID));
+
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString().startsWith("ore")))
+ return tAssotiation.mMaterial.mMaterial.mDefaultLocalName;
+ }
+
+ return null;
+ }
+
+ private static void countOre(Map<String, Integer> map, String ore) {
+ Integer oldCount = map.get(ore);
+ oldCount = (oldCount == null) ? 0 : oldCount;
+
+ map.put(ore, oldCount + 1);
+ }
+}