aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java')
-rw-r--r--src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java424
1 files changed, 424 insertions, 0 deletions
diff --git a/src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java b/src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java
new file mode 100644
index 0000000000..f6f6350020
--- /dev/null
+++ b/src/main/java/com/detrav/items/behaviours/BehaviourDetravToolProspector.java
@@ -0,0 +1,424 @@
+package com.detrav.items.behaviours;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.SplittableRandom;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.detrav.DetravScannerMod;
+import com.detrav.items.DetravMetaGeneratedTool01;
+import com.detrav.utils.BartWorksHelper;
+import com.detrav.utils.GTppHelper;
+import com.github.bartimaeusnek.bartworks.system.material.Werkstoff;
+import com.sinthoras.visualprospecting.VisualProspecting_API;
+
+import cpw.mods.fml.common.Loader;
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.Materials;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.common.GT_Pollution;
+import gregtech.common.GT_UndergroundOil;
+import gregtech.common.blocks.GT_Block_Ores_Abstract;
+import gregtech.common.blocks.GT_TileEntity_Ores;
+import gregtech.common.items.behaviors.Behaviour_None;
+
+/**
+ * Created by wital_000 on 19.03.2016.
+ */
+public class BehaviourDetravToolProspector extends Behaviour_None {
+
+ static final int[] DISTANCEINTS = new int[] { 0, 4, 25, 64 };
+ int distTextIndex;
+
+ HashMap<String, Integer> ores;
+ int badluck;
+
+ protected final int mCosts;
+
+ static final String CHAT_MSG_SEPARATOR = "--------------------";
+
+ public BehaviourDetravToolProspector(int aCosts) {
+ mCosts = aCosts;
+ }
+
+ public boolean onItemUse(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, int aSide, float hitX, float hitY, float hitZ) {
+
+ SplittableRandom aRandom = new SplittableRandom();
+ int chance = ((1 + aStack.getItemDamage()) * 8) > 100 ? 100 : (1 + aStack.getItemDamage()) * 8;
+
+ if (aWorld.isRemote) return false;
+
+ if (aWorld.getBlock(aX, aY, aZ) == Blocks.bedrock) {
+ if (!aWorld.isRemote && aRandom.nextInt(100) < chance) {
+ FluidStack fStack = GT_UndergroundOil.undergroundOil(aWorld.getChunkFromBlockCoords(aX, aZ), -1);
+ addChatMassageByValue(aPlayer, fStack.amount / 2, "a Fluid");// fStack.getLocalizedName());
+ /*
+ * boolean fluid = GT_UndergroundOil.undergroundOil(aWorld.getChunkFromBlockCoords(aX, aZ), -1)!=null
+ * &&GT_UndergroundOil.undergroundOil(aWorld.getChunkFromBlockCoords(aX, aZ), -1).getFluid()!=null; if
+ * (fluid) aPlayer.addChatMessage(new
+ * ChatComponentText(EnumChatFormatting.GREEN+"You found some liquid.")); else
+ * aPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED+"You found no liquid."));
+ */
+ if (!aPlayer.capabilities.isCreativeMode)
+ ((DetravMetaGeneratedTool01) aItem).doDamage(aStack, this.mCosts);
+
+ if (Loader.isModLoaded("visualprospecting")) {
+ VisualProspecting_API.LogicalServer.sendProspectionResultsToClient(
+ (EntityPlayerMP) aPlayer,
+ new ArrayList<>(),
+ VisualProspecting_API.LogicalServer.prospectUndergroundFluidsWithingRadius(
+ aWorld,
+ (int) aPlayer.posX,
+ (int) aPlayer.posZ,
+ 0));
+ }
+ }
+ return true;
+ }
+ if (aWorld.getBlock(aX, aY, aZ).getMaterial() == Material.rock
+ || aWorld.getBlock(aX, aY, aZ).getMaterial() == Material.ground
+ || aWorld.getBlock(aX, aY, aZ) == GregTech_API.sBlockOres1) {
+ if (!aWorld.isRemote) {
+ prospectChunks((DetravMetaGeneratedTool01) aItem, aStack, aPlayer, aWorld, aX, aY, aZ, aRandom, chance);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ protected void prospectChunks(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX,
+ int aY, int aZ, SplittableRandom aRandom, int chance) {
+ int bX = aX;
+ int bZ = aZ;
+
+ badluck = 0;
+ ores = new HashMap<>();
+
+ int range = ((DetravMetaGeneratedTool01) aItem).getHarvestLevel(aStack, "") / 2 + (aStack.getItemDamage() / 4);
+ if ((range % 2) == 0) {
+ range += 1; // kinda not needed here, divide takes it out, but we put it back in with the range+1 in the
+ // loop
+ }
+ range = range / 2; // Convert range from diameter to radius
+
+ aPlayer.addChatMessage(
+ new ChatComponentText(
+ EnumChatFormatting.GOLD
+ + GT_LanguageManager.sEnglishFile
+ .get("LanguageFile", "gt.scanner.prospecting", "Prospecting at ").getString()
+ + EnumChatFormatting.BLUE
+ + "("
+ + bX
+ + ", "
+ + bZ
+ + ")"));
+ for (int x = -(range); x < (range + 1); ++x) {
+ aX = bX + (x * 16);
+ for (int z = -(range); z < (range + 1); ++z) {
+
+ aZ = bZ + (z * 16);
+ int dist = x * x + z * z;
+
+ for (distTextIndex = 0; distTextIndex < DISTANCEINTS.length; distTextIndex++) {
+ if (dist <= DISTANCEINTS[distTextIndex]) {
+ break;
+ }
+ }
+ if (DetravScannerMod.DEBUG_ENABLED) aPlayer.addChatMessage(
+ new ChatComponentText(
+ EnumChatFormatting.YELLOW + "Chunk at "
+ + aX
+ + "|"
+ + aZ
+ + " to "
+ + (aX + 16)
+ + "|"
+ + (aZ + 16)
+ + StatCollector
+ .translateToLocal("detrav.scanner.distance.texts." + distTextIndex)));
+ processOreProspecting(
+ (DetravMetaGeneratedTool01) aItem,
+ aStack,
+ aPlayer,
+ aWorld.getChunkFromBlockCoords(aX, aZ),
+ aWorld.getTileEntity(aX, aY, aZ),
+ GT_OreDictUnificator.getAssociation(
+ new ItemStack(aWorld.getBlock(aX, aY, aZ), 1, aWorld.getBlockMetadata(aX, aY, aZ))),
+ aRandom,
+ chance);
+ }
+ }
+
+ // List to hold unsorted scanner messages
+ List<ChatComponentText> oreMessages = new ArrayList<ChatComponentText>();
+
+ for (String key : ores.keySet()) {
+ int value = ores.get(key);
+ appendChatMessageByValue(oreMessages, aPlayer, value, key);
+ }
+
+ // Define sort order by distance
+ List<String> sortOrder = Arrays.asList(
+ StatCollector.translateToLocal("detrav.scanner.distance.texts.4"),
+ StatCollector.translateToLocal("detrav.scanner.distance.texts.3"),
+ StatCollector.translateToLocal("detrav.scanner.distance.texts.2"),
+ StatCollector.translateToLocal("detrav.scanner.distance.texts.1"),
+ StatCollector.translateToLocal("detrav.scanner.distance.texts.0"));
+
+ List<ChatComponentText> oreMessagesSorted = new ArrayList<ChatComponentText>();
+ oreMessagesSorted.add(new ChatComponentText(CHAT_MSG_SEPARATOR));
+
+ // Sort ore messages by distance, separated by -----
+ for (String oreFrequency : sortOrder) {
+ for (ChatComponentText msg : oreMessages) {
+ if (msg.getChatComponentText_TextValue().contains(oreFrequency)) {
+ oreMessagesSorted.add(msg);
+ }
+ }
+
+ // Only append ----- separator if text has been added
+ if (!oreMessagesSorted.get(oreMessagesSorted.size() - 1).getChatComponentText_TextValue()
+ .contains(CHAT_MSG_SEPARATOR)) {
+ oreMessagesSorted.add(new ChatComponentText(CHAT_MSG_SEPARATOR));
+ }
+ }
+
+ if (badluck == 0) {
+ oreMessages.add(
+ new ChatComponentText(
+ EnumChatFormatting.WHITE + StatCollector.translateToLocal("detrav.scanner.success")));
+ } else {
+ oreMessages.add(
+ new ChatComponentText(
+ EnumChatFormatting.WHITE + StatCollector.translateToLocal("detrav.scanner.fail")
+ .replace("%badluck", Integer.toString(badluck))));
+ }
+
+ // Print the sorted messages
+ for (ChatComponentText msg : oreMessagesSorted) {
+ aPlayer.addChatMessage(msg);
+ }
+
+ if (Loader.isModLoaded("visualprospecting")) {
+ VisualProspecting_API.LogicalServer.sendProspectionResultsToClient(
+ (EntityPlayerMP) aPlayer,
+ VisualProspecting_API.LogicalServer.prospectOreVeinsWithinRadius(
+ aWorld.provider.dimensionId,
+ (int) aPlayer.posX,
+ (int) aPlayer.posZ,
+ range * 16),
+ new ArrayList<>());
+ }
+ }
+
+ // Used by Electric scanner when scanning the chunk whacked by the scanner. 100% chance find rate
+ protected void prospectSingleChunk(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer, World aWorld,
+ int aX, int aY, int aZ) {
+ ores = new HashMap<>();
+ aPlayer.addChatMessage(
+ new ChatComponentText(
+ EnumChatFormatting.GOLD + StatCollector.translateToLocal(
+ "detrav.scanner.prospecting") + EnumChatFormatting.BLUE + "(" + aX + ", " + aZ + ")"));
+ processOreProspecting(
+ (DetravMetaGeneratedTool01) aItem,
+ aStack,
+ aPlayer,
+ aWorld.getChunkFromBlockCoords(aX, aZ),
+ aWorld.getTileEntity(aX, aY, aZ),
+ GT_OreDictUnificator.getAssociation(
+ new ItemStack(aWorld.getBlock(aX, aY, aZ), 1, aWorld.getBlockMetadata(aX, aY, aZ))),
+ new SplittableRandom(),
+ 1000);
+
+ for (String key : ores.keySet()) {
+ int value = ores.get(key);
+ addChatMassageByValue(aPlayer, value, key);
+ }
+
+ if (Loader.isModLoaded("visualprospecting")) {
+ VisualProspecting_API.LogicalServer.sendProspectionResultsToClient(
+ (EntityPlayerMP) aPlayer,
+ VisualProspecting_API.LogicalServer.prospectOreVeinsWithinRadius(
+ aWorld.provider.dimensionId,
+ (int) aPlayer.posX,
+ (int) aPlayer.posZ,
+ 0),
+ new ArrayList<>());
+ }
+ }
+
+ protected void processOreProspecting(DetravMetaGeneratedTool01 aItem, ItemStack aStack, EntityPlayer aPlayer,
+ Chunk aChunk, TileEntity aTileEntity, ItemData tAssotiation, SplittableRandom aRandom, int chance)// TileEntity
+ // aTileEntity)
+ {
+ if (aTileEntity != null) {
+ if (aTileEntity instanceof GT_TileEntity_Ores) {
+ GT_TileEntity_Ores gt_entity = (GT_TileEntity_Ores) aTileEntity;
+ short meta = gt_entity.getMetaData();
+ String format = LanguageRegistry.instance().getStringLocalization("gt.blockores." + meta + ".name");
+ String name = Materials.getLocalizedNameForItem(format, meta % 1000);
+ addOreToHashMap(name, aPlayer);
+ if (!aPlayer.capabilities.isCreativeMode) aItem.doDamage(aStack, this.mCosts);
+ return;
+ }
+ } else if (tAssotiation != null) {
+ try {
+ String name = tAssotiation.toString();
+ addChatMassageByValue(aPlayer, -1, name);
+ if (!aPlayer.capabilities.isCreativeMode) aItem.doDamage(aStack, this.mCosts);
+ return;
+ } catch (Exception e) {
+ addChatMassageByValue(aPlayer, -1, "ERROR, lol ^_^");
+ }
+ } else if (aRandom.nextInt(100) < chance) {
+ final int data = DetravMetaGeneratedTool01.INSTANCE.getToolGTDetravData(aStack).intValue();
+ final String small_ore_keyword = StatCollector.translateToLocal("detrav.scanner.small_ore.keyword");
+ for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) {
+ int ySize = aChunk.getHeightValue(x, z);
+ for (int y = 1; y < ySize; y++) {
+
+ Block tBlock = aChunk.getBlock(x, y, z);
+ short tMetaID = (short) aChunk.getBlockMetadata(x, y, z);
+ if (tBlock instanceof GT_Block_Ores_Abstract) {
+ TileEntity tTileEntity = aChunk.getTileEntityUnsafe(x, y, z);
+ if ((tTileEntity instanceof GT_TileEntity_Ores)
+ && ((GT_TileEntity_Ores) tTileEntity).mNatural) {
+ tMetaID = (short) ((GT_TileEntity_Ores) tTileEntity).getMetaData();
+ try {
+ String format = LanguageRegistry.instance()
+ .getStringLocalization(tBlock.getUnlocalizedName() + "." + tMetaID + ".name");
+ String name = Materials.getLocalizedNameForItem(format, tMetaID % 1000);
+ if (data != 1 && name.startsWith(small_ore_keyword)) continue;
+ addOreToHashMap(name, aPlayer);
+ } catch (Exception e) {
+ String name = tBlock.getUnlocalizedName() + ".";
+ if (data != 1 && name.contains(".small.")) continue;
+ addOreToHashMap(name, aPlayer);
+ }
+ }
+ } else if (DetravScannerMod.isGTppLoaded && GTppHelper.isGTppBlock(tBlock)) {
+ String name = GTppHelper.getGTppVeinName(tBlock);
+ if (!name.isEmpty()) addOreToHashMap(name, aPlayer);
+ } else if (DetravScannerMod.isBartWorksLoaded && BartWorksHelper.isOre(tBlock)) {
+ if (data != 1 && BartWorksHelper.isSmallOre(tBlock)) continue;
+ final Werkstoff werkstoff = Werkstoff.werkstoffHashMap.getOrDefault(
+ (short) ((BartWorksHelper.getMetaFromBlock(aChunk, x, y, z, tBlock)) * -1),
+ null);
+ String type = BartWorksHelper.isSmallOre(tBlock) ? "oreSmall" : "ore";
+ String translated = GT_LanguageManager.getTranslation("bw.blocktype." + type);
+ addOreToHashMap(translated.replace("%material", werkstoff.getLocalizedName()), aPlayer);
+ } else if (data == 1) {
+ tAssotiation = GT_OreDictUnificator.getAssociation(new ItemStack(tBlock, 1, tMetaID));
+ if ((tAssotiation != null) && (tAssotiation.mPrefix.toString().startsWith("ore"))) {
+ try {
+ try {
+ tMetaID = (short) tAssotiation.mMaterial.mMaterial.mMetaItemSubID;
+ String format = LanguageRegistry.instance()
+ .getStringLocalization("gt.blockores." + tMetaID + ".name");
+ String name = Materials.getLocalizedNameForItem(format, tMetaID % 1000);
+ addOreToHashMap(name, aPlayer);
+ } catch (Exception e1) {
+ String name = tAssotiation.toString();
+ addOreToHashMap(name, aPlayer);
+ }
+ } catch (Exception ignored) {}
+ }
+ }
+
+ }
+ }
+
+ if (!aPlayer.capabilities.isCreativeMode) aItem.doDamage(aStack, this.mCosts);
+
+ return;
+ } else {
+ if (DetravScannerMod.DEBUG_ENABLED)
+ aPlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + " Failed on this chunk"));
+ badluck++;
+ if (!aPlayer.capabilities.isCreativeMode) aItem.doDamage(aStack, this.mCosts / 4);
+ }
+ // addChatMassageByValue(aPlayer,0,null);
+ }
+
+ void addOreToHashMap(String orename, EntityPlayer aPlayer) {
+ String oreDistance = orename + StatCollector.translateToLocal("detrav.scanner.distance.texts." + distTextIndex); // orename
+ // +
+ // the
+ // textual
+ // distance
+ // of
+ // the
+ // ore
+ if (!ores.containsKey(oreDistance)) {
+ if (DetravScannerMod.DEBUG_ENABLED) aPlayer.addChatMessage(
+ new ChatComponentText(EnumChatFormatting.GREEN + " Adding to oremap " + oreDistance));
+ ores.put(oreDistance, 1);
+ } else {
+ int val = ores.get(oreDistance);
+ ores.put(oreDistance, val + 1);
+ }
+ }
+
+ void addChatMassageByValue(EntityPlayer aPlayer, int value, String name) {
+ if (value < 0) {
+ aPlayer.addChatMessage(
+ new ChatComponentText(StatCollector.translateToLocal("detrav.scanner.found.texts.6") + name));
+ } else if (value < 1) {
+ aPlayer.addChatMessage(
+ new ChatComponentText(StatCollector.translateToLocal("detrav.scanner.found.texts.0")));
+ } else if (value < 10) aPlayer.addChatMessage(
+ new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.1")));
+ else if (value < 30) aPlayer.addChatMessage(
+ new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.2")));
+ else if (value < 60) aPlayer.addChatMessage(
+ new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.3")));
+ else if (value < 100) aPlayer.addChatMessage(
+ new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.4")));
+ else aPlayer.addChatMessage(
+ new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.5")));
+ }
+
+ // Same as addChatMassageByValue but appends to a list of chat messages and spelled correctly
+ void appendChatMessageByValue(List<ChatComponentText> chatMessageList, EntityPlayer aPlayer, int value,
+ String name) {
+ if (value < 0) {
+ chatMessageList
+ .add(new ChatComponentText(StatCollector.translateToLocal("detrav.scanner.found.texts.6") + name));
+ } else if (value < 1) {
+ chatMessageList.add(new ChatComponentText(StatCollector.translateToLocal("detrav.scanner.found.texts.0")));
+ } else if (value < 10) chatMessageList
+ .add(new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.1")));
+ else if (value < 30) chatMessageList
+ .add(new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.2")));
+ else if (value < 60) chatMessageList
+ .add(new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.3")));
+ else if (value < 100) chatMessageList
+ .add(new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.4")));
+ else chatMessageList
+ .add(new ChatComponentText(name + StatCollector.translateToLocal("detrav.scanner.found.texts.5")));
+ }
+
+ public static int getPolution(World aWorld, int aX, int aZ) {
+ return GT_Pollution.getPollution(aWorld.getChunkFromBlockCoords(aX, aZ));
+ }
+}