ModularPowersuits/src/main/java/net/machinemuse/powersuits/powermodule/tool/OreScannerModule.java

191 lines
8.6 KiB
Java

package net.machinemuse.powersuits.powermodule.tool;
import net.machinemuse.api.electricity.IModularItem;
import net.machinemuse.api.ModuleManager;
import net.machinemuse.api.moduletrigger.IRightClickModule;
import net.machinemuse.powersuits.common.Config;
import net.machinemuse.powersuits.item.ItemComponent;
import net.machinemuse.powersuits.powermodule.PowerModuleBase;
import net.machinemuse.powersuits.powermodule.PropertyModifierIntLinearAdditive;
import net.machinemuse.utils.ElectricItemUtils;
import net.machinemuse.utils.MuseCommonStrings;
import net.machinemuse.utils.MuseItemUtils;
import net.machinemuse.utils.MuseStringUtils;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class OreScannerModule extends PowerModuleBase implements IRightClickModule {
public static final String MODULE_ORE_SCANNER = "Ore Scanner";
public static final String ORE_SCANNER_ENERGY_CONSUMPTION = "Energy Per Block";
public static final String ORE_SCANNER_RADIUS_X = "X Radius";
public static final String ORE_SCANNER_RADIUS_Y = "Y Radius";
public static final String ORE_SCANNER_RADIUS_Z = "Z Radius";
private static final String[] oreNames = {"oreCopper", "oreTin", "oreSilver", "oreLead", "oreNickel", "orePlatinum", "oreZinc", "oreApatite", "oreUranium"};
private static final ArrayList<ArrayList<ItemStack>> ores = new ArrayList<>();
private static final HashMap<List, String> oreMap = new HashMap();
private static final HashMap<String, Integer> valueMap = new HashMap();
public OreScannerModule(List<IModularItem> validItems) {
super(validItems);
addBaseProperty(ORE_SCANNER_ENERGY_CONSUMPTION, 50);
addBaseProperty(ORE_SCANNER_RADIUS_X, 1);
addBaseProperty(ORE_SCANNER_RADIUS_Y, 1);
addBaseProperty(ORE_SCANNER_RADIUS_Z, 1);
addIntTradeoffProperty("X Radius", ORE_SCANNER_RADIUS_X, 3, "m", 1, 0);
addIntTradeoffProperty("Y Radius", ORE_SCANNER_RADIUS_Y, 3, "m", 1, 0);
addIntTradeoffProperty("Z Radius", ORE_SCANNER_RADIUS_Z, 3, "m", 1, 0);
addInstallCost(MuseItemUtils.copyAndResize(ItemComponent.computerChip, 1));
addInstallCost(MuseItemUtils.copyAndResize(ItemComponent.controlCircuit, 2));
for (int i = 0; i < oreNames.length; i++) {
ores.add(i, OreDictionary.getOres(oreNames[i]));
}
fillMap();
}
public PowerModuleBase addIntTradeoffProperty(String tradeoffName, String propertyName, double multiplier, String unit, int roundTo, int offset) {
units.put(propertyName, unit);
return addPropertyModifier(propertyName, new PropertyModifierIntLinearAdditive(tradeoffName, multiplier, roundTo, offset));
}
public void searchForValuables(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side) {
int xRadius = (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_X);
int yRadius = (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_Y);
int zRadius = (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_Z);
int totalValue = 0, totalEnergy = 0, highestValue = 0, value;
ForgeDirection fdSide = ForgeDirection.getOrientation(side).getOpposite();
int cX = x + (fdSide.offsetX * xRadius);
int cY = y + (fdSide.offsetY * yRadius);
int cZ = z + (fdSide.offsetZ * zRadius);
for (int sX = cX - xRadius; sX <= cX + xRadius; sX++) {
for (int sY = cY - yRadius; sY <= cY + yRadius; sY++) {
for (int sZ = cZ - zRadius; sZ <= cZ + zRadius; sZ++) {
value = getValue(world.getBlock(sX, sY, sZ), world.getBlockMetadata(sX, sY, sZ));
totalValue += value;
ElectricItemUtils.drainPlayerEnergy(player, ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_ENERGY_CONSUMPTION));
totalEnergy += ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_ENERGY_CONSUMPTION);
if (value > highestValue) {
highestValue = value;
}
}
}
}
if (ElectricItemUtils.getPlayerEnergy(player) > totalEnergy) {
ElectricItemUtils.drainPlayerEnergy(player, totalEnergy);
if (MuseItemUtils.isServerSide()) {
if (Config.useAdvancedOreScannerMessage()) {
player.addChatMessage(new ChatComponentText("[Ore Scanner] Total ore value: " + totalValue + " --- Most valuable: " + highestValue + "\nSearch radius: " +
(2 * (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_X) + 1) + "x" +
(2 * (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_Y) + 1) + "x" +
(2 * (int) ModuleManager.computeModularProperty(itemStack, ORE_SCANNER_RADIUS_Z) + 1) +
" --- Energy used: " + MuseStringUtils.formatNumberFromUnits(totalEnergy, "J")));
} else {
player.addChatMessage(new ChatComponentText("[Ore Scanner] Total ore value: " + totalValue + " --- Most valuable: " + highestValue));
}
}
}
}
public static int getValue(Block blockID, int meta) {
if ((oreMap.containsKey(Arrays.asList(blockID, meta))) && (valueMap.containsKey(oreMap.get(Arrays.asList(blockID, meta))))) {
return valueMap.get(oreMap.get(Arrays.asList(blockID, meta)));
}
return 0;
}
public static void fillMap() {
for (int a = 0; a < ores.size(); a++) {
for (int b = 0; b < ores.get(a).size(); b++) {
oreMap.put(Arrays.asList(ores.get(a).get(b), ores.get(a).get(b).getItemDamage()), oreNames[a]);
}
}
oreMap.put(Arrays.asList(Blocks.coal_ore, 0), "oreCoal");
oreMap.put(Arrays.asList(Blocks.iron_ore, 0), "oreIron");
oreMap.put(Arrays.asList(Blocks.gold_ore, 0), "oreGold");
oreMap.put(Arrays.asList(Blocks.redstone_ore, 0), "oreRedstone");
oreMap.put(Arrays.asList(Blocks.diamond_ore, 0), "oreDiamond");
oreMap.put(Arrays.asList(Blocks.emerald_ore, 0), "oreEmerald");
oreMap.put(Arrays.asList(Blocks.lapis_ore, 0), "oreLapis");
oreMap.put(Arrays.asList(Blocks.quartz_ore, 0), "oreNetherQuartz");
valueMap.put("oreCoal", 1);
valueMap.put("oreIron", 4);
valueMap.put("oreGold", 6);
valueMap.put("oreRedstone", 3);
valueMap.put("oreDiamond", 16);
valueMap.put("oreEmerald", 18);
valueMap.put("oreLapis", 12);
valueMap.put("oreNetherQuartz", 8);
valueMap.put("oreCopper", 4);
valueMap.put("oreTin", 5);
valueMap.put("oreSilver", 5);
valueMap.put("oreLead", 6);
valueMap.put("oreNickel", 14);
valueMap.put("orePlatinum", 8);
valueMap.put("oreZinc", 1);
valueMap.put("oreApatite", 2);
valueMap.put("oreUranium", 14);
valueMap.put("oreXychorium", 2);
valueMap.put("oreNaturalAluminum", 3);
valueMap.put("oreCertusQuartz", 5);
}
@Override
public String getTextureFile() {
return "orescanner";
}
@Override
public String getCategory() {
return MuseCommonStrings.CATEGORY_TOOL;
}
@Override
public String getDataName() {
return MODULE_ORE_SCANNER;
}
@Override
public String getUnlocalizedName() {
return "oreScanner";
}
@Override
public String getDescription() {
return "A way to see how valuable the land around you is.";
}
@Override
public void onRightClick(EntityPlayer playerClicking, World world, ItemStack item) {
}
@Override
public void onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
searchForValuables(itemStack, player, world, x, y, z, side);
}
@Override
public boolean onItemUseFirst(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
return false;
}
@Override
public void onPlayerStoppedUsing(ItemStack itemStack, World world, EntityPlayer player, int par4) {
}
}