Last active
July 1, 2021 19:45
-
-
Save phase/85d3081047cbf3d2f5ae to your computer and use it in GitHub Desktop.
Tool Strengths for Minecraft 1.8. Used in https://github.com/phase/PhaseBot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package xyz.jadonfowler.phasebot.world; | |
import java.util.*; | |
import lombok.*; | |
import xyz.jadonfowler.phasebot.world.material.*; | |
public enum ToolStrength { | |
//@formatter:off | |
WOOD(2f, Material.fromString("wood_sword", "wood_pickaxe", "wood_axe", "wood_spade", "wood_hoe")), | |
STONE(4f, Material.fromString("stone_sword", "stone_pickaxe", "stone_axe", "stone_spade", "stone_hoe")), | |
IRON(6f, Material.fromString("iron_sword", "iron_pickaxe", "iron_axe", "iron_spade", "iron_hoe")), | |
DIAMOND(8f, Material.fromString("diamond_sword", "diamond_pickaxe", "diamond_axe", "diamond_spade", "diamond_hoe")), | |
GOLD(12f, Material.fromString("gold_sword", "gold_pickaxe", "gold_axe", "gold_spade", "gold_hoe")); | |
//@formatter:on | |
@Getter private static final List<String> level0Stones = Arrays | |
.asList(new String[] { "stone", "cobblestone", "double_stone_slab", "stone_slab", "mossy_cobblestone", | |
"stone_stairs", "monster_egg", "cobblestone_wall", "sandstone", "stone_pressure_plate", "glowstone", | |
"stonebrick", "stone_brick_stairs", "sandstone_stairs", "cobblestone_wall", "redstone_block", | |
"quartz_block", "red_sandstone", "red_sandstone_stairs", "double_stone_slab2", "stone_slab2" }); | |
@Getter private static final List<String> level1Stones = Arrays | |
.asList(new String[] { "iron_ore", "iron_block", "lapis_ore", "lapis_block" }); | |
@Getter private static final List<String> level2Stones = Arrays.asList(new String[] { "diamond_ore", | |
"diamond_block", "gold_ore", "gold_block", "redstone_ore", "lit_redstone_ore" }); | |
@Getter private static final List<String> level3Stones = Arrays.asList(new String[] { "obsidian" }); | |
@Getter private static final List<String> level0Picks = Arrays.asList( | |
new String[] { "wood_pickaxe", "gold_pickaxe", "stone_pickaxe", "iron_pickaxe", "diamond_pickaxe" }); | |
@Getter private static final List<String> level1Picks = Arrays | |
.asList(new String[] { "stone_pickaxe", "iron_pickaxe", "diamond_pickaxe" }); | |
@Getter private static final List<String> level2Picks = Arrays | |
.asList(new String[] { "iron_pickaxe", "diamond_pickaxe" }); | |
@Getter private static final List<String> level3Picks = Arrays.asList(new String[] { "diamond_pickaxe" }); | |
@Getter float strength; | |
@Getter List<Material> materials; | |
ToolStrength(float strength, Material... materials) { | |
this.strength = strength; | |
this.materials = Arrays.asList(materials); | |
} | |
public static float getEffectiveness(Material tool) { | |
if (WOOD.materials.contains(tool)) return WOOD.strength; | |
else if (STONE.materials.contains(tool)) return STONE.strength; | |
else if (IRON.materials.contains(tool)) return IRON.strength; | |
else if (DIAMOND.materials.contains(tool)) return DIAMOND.strength; | |
else if (GOLD.materials.contains(tool)) return GOLD.strength; | |
return 0f; | |
} | |
public static double getWaitTime(ItemType tool, BlockType block, boolean underwater, boolean onGround) { | |
double time = 0; | |
while (time < 1) | |
time += strengthAgainstBlock(tool, block, underwater, onGround); | |
return time; | |
} | |
public static double strengthAgainstBlock(ItemType tool, BlockType block, boolean underwater, boolean onGround) { | |
if (block.getHardness() < 0) return 0; | |
if (!canHarvest(tool, block)) return 1 / block.getHardness() / 100; | |
double d = 1; | |
if (isEffectiveAgainst(tool, block)) d *= getEffectiveness(tool); | |
if (underwater) d /= 5; | |
if (!onGround) d /= 5; | |
return d / block.getHardness() / 30; | |
} | |
public static boolean canHarvest(ItemType tool, BlockType block) { | |
if (!block.isSolid()) return true; | |
else return isEffectiveAgainst(tool, block); | |
} | |
public static boolean isEffectiveAgainst(ItemType tool, BlockType block) { | |
if (!tool.getName().contains("_")) return false; | |
if (tool.getName().endsWith("_spade")) { | |
if (block.getMaterial().equals("dirt")) return true; | |
else return false; | |
} | |
else if (tool.getName().endsWith("_axe")) { | |
if (block.getMaterial().equals("wood")) return true; | |
else return false; | |
} | |
else if (tool.getName().endsWith("_pickaxe")) { | |
if (!block.getMaterial().equals("rock")) return false; | |
if (tool.getName().equals("diamond_pick")) return true; | |
if (level0Stones.contains(block.getName())) return true; | |
if (level1Stones.contains(block.getName()) && level1Picks.contains(tool.getName())) return true; | |
if (level2Stones.contains(block.getName()) && level2Picks.contains(tool.getName())) return true; | |
if (level3Stones.contains(block.getName()) && level3Picks.contains(tool.getName())) return true; | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment