Skip to content

Instantly share code, notes, and snippets.

@Unh0lyTigg
Created January 14, 2015 00:07
Show Gist options
  • Save Unh0lyTigg/3c2d76576376471692a4 to your computer and use it in GitHub Desktop.
Save Unh0lyTigg/3c2d76576376471692a4 to your computer and use it in GitHub Desktop.
package org.unh0lytigg.core.modules;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.block.BlockCocoa;
import net.minecraft.block.BlockCrops;
import net.minecraft.block.BlockNetherWart;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.world.GameRules.ValueType;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.unh0lytigg.core.TiggCore;
import org.unh0lytigg.core.annotations.AutoSubscribe;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class RightClickHarvesting {
@AutoSubscribe
public static RightClickHarvesting INSTANCE = new RightClickHarvesting();
private boolean doRemoveSeed = false;
private List<PropertyInteger> propertyFilters = Lists.newArrayList();
private Map<IProperty, Integer> propertyMin = Maps.newHashMap();
private Map<IProperty, Integer> propertyMax = Maps.newHashMap();
@SuppressWarnings("unchecked")
private RightClickHarvesting() {
propertyFilters.add(BlockCrops.AGE);
propertyFilters.add(BlockCocoa.field_176501_a);
propertyFilters.add(BlockNetherWart.AGE_PROP);
for (PropertyInteger p : propertyFilters) {
List<Integer> values = Lists.newArrayList(p.getAllowedValues());
propertyMin.put(p, getMin(values));
propertyMax.put(p, getMax(values));
}
}
private static int getMax(List<Integer> values) {
int r = Integer.MIN_VALUE;
for (Integer v : values)
if (v > r)
r = v;
return r;
}
private static int getMin(List<Integer> values) {
int r = Integer.MAX_VALUE;
for (Integer v : values)
if (v < r)
r = v;
return r;
}
@SubscribeEvent
public void worldLoad(WorldEvent.Load event) {
if (!event.world.getGameRules().hasRule("rightClickHarvests")) {
event.world.getGameRules().addGameRule("rightClickHarvests", "false", ValueType.BOOLEAN_VALUE);
TiggCore.LOGGER.info("Added rightClickHarvests gamerule to " + event.world.getSaveHandler().getWorldDirectoryName() + "\\" + event.world.provider.getDimensionName());
}
}
@SuppressWarnings("unchecked")
@SubscribeEvent
public void rightClick(PlayerInteractEvent event) {
if (!event.world.getGameRules().getGameRuleBooleanValue("rightClickHarvests"))
return;
BlockPos pos = event.pos;
IBlockState state = event.world.getBlockState(pos);
if (event.action != Action.RIGHT_CLICK_BLOCK)
return;
IProperty prop = null;
for (Object o : state.getProperties().entrySet()) {
Entry<IProperty, Comparable<?>> e = (Entry<IProperty, Comparable<?>>) o;
if (propertyFilters.contains(e.getKey())) {
prop = e.getKey();
if (propertyMax.get(prop) != e.getValue())
return;
}
}
if (prop == null)
return;
if (event.world.isRemote)
event.entityPlayer.swingItem();
else {
doRemoveSeed = true;
state.getBlock().dropBlockAsItem(event.world, pos, state, 0);
doRemoveSeed = false;
event.world.setBlockState(pos, state.withProperty(prop, propertyMin.get(prop)), 3);
event.setCanceled(true);
}
}
@SubscribeEvent
public void harvest(HarvestDropsEvent event) {
if (doRemoveSeed) {
Item toSearch = null; int itemDamage = 0;
IBlockState state = event.world.getBlockState(event.pos);
if (state.getBlock() == Blocks.cocoa) {
toSearch = Items.dye;
itemDamage = EnumDyeColor.BROWN.getDyeColorDamage();
} else if (state.getBlock() == Blocks.nether_wart) {
toSearch = Items.nether_wart;
} else if (state.getBlock() instanceof BlockCrops) {
toSearch = state.getBlock().getItem(event.world, event.pos);
}
for (int i = 0; i < event.drops.size(); i++) {
ItemStack stack = event.drops.get(i);
Item item = stack.getItem();
if (item == toSearch && stack.getItemDamage() == itemDamage) {
event.drops.remove(i);
break;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment