Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.fouristhenumber.utilitiesinexcess.client.IMCForNEI;
import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents;
import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents;
import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe;
import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemReversingHoe;
import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems;
import com.fouristhenumber.utilitiesinexcess.compat.Mods;
import com.fouristhenumber.utilitiesinexcess.compat.exu.PosteaTransforms;
Expand Down Expand Up @@ -71,6 +73,9 @@ public void postInit(FMLPostInitializationEvent event) {
if (OtherConfig.enableWorldConversion && !Mods.ExtraUtilities.isLoaded() && Mods.Postea.isLoaded()) {
PosteaTransforms.postInit();
}

ItemReversingHoe.initializeCache();
ItemDestructionPickaxe.initializeCache();
}

public void serverStarting(FMLServerStartingEvent event) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.fouristhenumber.utilitiesinexcess.common.items.tools;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Pattern;
import java.util.Set;

import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
Expand All @@ -13,10 +13,12 @@
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;

import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess;
import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig;
import com.gtnewhorizon.gtnhlib.api.ITranslucentItem;
import com.gtnewhorizon.gtnhlib.util.data.BlockMeta;

import akka.japi.Pair;
import cpw.mods.fml.common.registry.GameRegistry;

public class ItemDestructionPickaxe extends ItemPickaxe implements ITranslucentItem {

Expand All @@ -27,25 +29,34 @@ public ItemDestructionPickaxe() {
if (DestructionPickaxeConfig.unbreakable) setMaxDamage(0);
}

private final static HashMap<String, Pattern> compiledPatterns = new HashMap<>();
private final static HashMap<Pair<String, String>, Boolean> resultLookup = new HashMap<>();

public static boolean blockMatches(String name, String pattern) {
// Prob can be made cleaner
if (!compiledPatterns.containsKey(name)) {
String replaceWildcard = pattern.replace(".", "\\.")
.replace("*", ".*?")
.replace("(", "\\(")
.replace(")", "\\)");
compiledPatterns.put(pattern, Pattern.compile(replaceWildcard));
}
Pattern p = compiledPatterns.get(pattern);
if (!resultLookup.containsKey(new Pair<>(pattern, name))) {
boolean res = p.matcher(name)
.matches();
resultLookup.put(new Pair<>(pattern, name), res);
public static final Set<BlockMeta> affectedBlockCache = new HashSet<>();

public static void initializeCache() {
if (DestructionPickaxeConfig.includeEffective != null) {
for (String blockString : DestructionPickaxeConfig.includeEffective) {
if (blockString == null) continue;
try {
String[] split = blockString.trim()
.split(":");
String domain = split[0];
String name = split[1];
int meta = split.length == 3 ? Integer.parseInt(split[2]) : -1;

Block block = GameRegistry.findBlock(domain, name);

if (block == null) {
UtilitiesInExcess.LOG
.warn("Destruction Pickaxe Config: Could not find {}, skipped", blockString);
continue;
}

affectedBlockCache.add(new BlockMeta(block, meta));

} catch (Exception e) {
UtilitiesInExcess.LOG.warn("Destruction Pickaxe Config: Skipped malformed config: {}", blockString);
}
}
}
return resultLookup.get(new Pair<>(pattern, name));
}

@Override
Expand All @@ -60,14 +71,14 @@ public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, i

@Override
public float getDigSpeed(ItemStack stack, Block block, int meta) {
var i = DestructionPickaxeConfig.includeEffective;
var w = DestructionPickaxeConfig.excludeEffective;
var name = block.delegate.name();
for (String s : w) if (blockMatches(name, s))
return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier;
for (String s : i) if (blockMatches(name, s))
BlockMeta exactMatch = new BlockMeta(block, meta);
BlockMeta wildcardMatch = new BlockMeta(block, -1);

if (affectedBlockCache.contains(exactMatch) || affectedBlockCache.contains(wildcardMatch)) {
Comment thread
SuperSoupr marked this conversation as resolved.
return efficiencyOnProperMaterial * DestructionPickaxeConfig.effectiveSpeedModifier;
return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier;
} else {
return efficiencyOnProperMaterial * DestructionPickaxeConfig.ineffectiveSpeedModifier;
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.fouristhenumber.utilitiesinexcess.common.items.tools;

import java.util.HashMap;
import java.util.List;

import net.minecraft.block.Block;
Expand All @@ -11,42 +12,104 @@
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;

import com.fouristhenumber.utilitiesinexcess.ModBlocks;
import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig;
import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess;
import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig;
import com.gtnewhorizon.gtnhlib.api.ITranslucentItem;
import com.gtnewhorizon.gtnhlib.util.data.BlockMeta;

import cpw.mods.fml.common.registry.GameRegistry;

// TODO: Add new features to the reversing hoe
public class ItemReversingHoe extends ItemHoe implements ITranslucentItem {

public static final HashMap<BlockMeta, BlockMeta> blockConversionCache = new HashMap<>();

public ItemReversingHoe() {
super(ToolMaterial.EMERALD);
setTextureName("utilitiesinexcess:reversing_hoe");
setUnlocalizedName("reversing_hoe");
if (ReversingHoeConfig.unbreakable) setMaxDamage(0);
}

Comment thread
FourIsTheNumber marked this conversation as resolved.
public static void initializeCache() {
if (ReversingHoeConfig.blockTransformations != null) {
for (String transformation : ReversingHoeConfig.blockTransformations) {
if (transformation == null) continue;
if (!transformation.contains("->")) {
UtilitiesInExcess.LOG
.warn("Reversing Hoe Config: {} does not contain '->', skipped", transformation);
continue;
}
try {
String[] parts = transformation.split("->");

String[] sourceSplit = parts[0].trim()
.split(":");
String sourceDomain = sourceSplit[0];
String sourceName = sourceSplit[1];
int sourceMeta = sourceSplit.length == 3 ? Integer.parseInt(sourceSplit[2]) : -1;

String[] targetSplit = parts[1].trim()
.split(":");
String targetDomain = targetSplit[0];
String targetName = targetSplit[1];
int targetMeta = targetSplit.length == 3 ? Integer.parseInt(targetSplit[2]) : 0;

Block sourceBlock = GameRegistry.findBlock(sourceDomain, sourceName);
Block targetBlock = GameRegistry.findBlock(targetDomain, targetName);

if (sourceBlock == null || targetBlock == null) {
UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Could not find {}, skipped", transformation);
continue;
}

blockConversionCache
.put(new BlockMeta(sourceBlock, sourceMeta), new BlockMeta(targetBlock, targetMeta));

} catch (Exception e) {
UtilitiesInExcess.LOG.warn("Reversing Hoe Config: Skipped malformed config: {}", transformation);
}
}
}
}

@Override
public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side,
float clickX, float clickY, float clickZ) {

Block block = world.getBlock(x, y, z);
// TODO: config for this
if (block == Blocks.dirt) {
world.setBlock(x, y, z, Blocks.grass);
return true;
} else if (block == Blocks.cobblestone) {
world.setBlock(x, y, z, Blocks.stone);
return true;
} else if (block == ModBlocks.CURSED_EARTH.get() && CursedEarthConfig.enableBlessedEarth) {
world.setBlock(x, y, z, ModBlocks.BLESSED_EARTH.get());
return true;
} else if (block == ModBlocks.BLESSED_EARTH.get() && CursedEarthConfig.enableCursedEarth) {
world.setBlock(x, y, z, ModBlocks.CURSED_EARTH.get());
int metaInWorld = world.getBlockMetadata(x, y, z);

BlockMeta exactKey = new BlockMeta(block, metaInWorld);
BlockMeta wildcardKey = new BlockMeta(block, -1);

BlockMeta targetData = null;

if (blockConversionCache.containsKey(exactKey)) {
targetData = blockConversionCache.get(exactKey);
} else if (blockConversionCache.containsKey(wildcardKey)) {
targetData = blockConversionCache.get(wildcardKey);
}

if (targetData != null) {
Block targetBlock = targetData.getBlock();
int targetMeta = targetData.getBlockMeta();

if (!world.isRemote) {
world.setBlock(x, y, z, targetBlock, targetMeta, 3);

if (!ReversingHoeConfig.unbreakable) {
itemStack.damageItem(1, player);
}
}

return true;
} else if (block == Blocks.wheat) {
}

else if (block == Blocks.wheat || block == Blocks.potatoes || block == Blocks.carrots) {
int meta = world.getBlockMetadata(x, y, z);
if (meta > 0) {
world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3);
if (!world.isRemote) world.setBlockMetadataWithNotify(x, y, z, meta - 1, 3);
return true;
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,23 @@ public class DestructionPickaxeConfig {
@Config.DefaultBoolean(true)
@Config.RequiresMcRestart
public static boolean enable;

@Config.DefaultBoolean(true)
@Config.RequiresMcRestart
public static boolean unbreakable;

@Config.DefaultBoolean(false)
public static boolean voidMinedBlock;
@Config.DefaultStringList({ "minecraft:*stone", "minecraft:netherrack", "minecraft:*hardened_clay" })

@Config.Comment("Which blocks the pickaxe is effective against. Format as modid:blockid:meta - if meta is not specified, will use any meta.")
@Config.DefaultStringList({ "minecraft:stone", "minecraft:cobblestone", "minecraft:sandstone",
"minecraft:netherrack", "minecraft:hardened_clay", "minecraft:stained_hardened_clay" })
public static String[] includeEffective;
@Config.DefaultStringList({})
public static String[] excludeEffective;

@Config.DefaultFloat(5)
@Config.RangeFloat(min = 0, max = 100)
public static float effectiveSpeedModifier;

@Config.DefaultFloat(0.0625f)
@Config.RangeFloat(min = 0, max = 100)
public static float ineffectiveSpeedModifier;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,11 @@ public class ReversingHoeConfig {
@Config.RequiresMcRestart
public static boolean unbreakable;

@Config.Comment("Which block transformations the reversing hoe will work on. Format as modid:blockid:meta->modid:blockid:meta - if meta of source block is not specified, will work on any meta. If meta of target block is not specified, will transform into meta 0.")
@Config.DefaultStringList({ "minecraft:dirt->minecraft:grass", "minecraft:cobblestone->minecraft:stone",
"utilitiesinexcess:cursed_earth->utilitiesinexcess:blessed_earth",
"utilitiesinexcess:blessed_earth->utilitiesinexcess:cursed_earth" })
@Config.RequiresMcRestart
public static String[] blockTransformations;

}