betterbeginnings/src/main/java/net/einsteinsci/betterbeginnings/event/BBEventHandler.java

550 lines
14 KiB
Java

package net.einsteinsci.betterbeginnings.event;
import net.einsteinsci.betterbeginnings.ModMain;
import net.einsteinsci.betterbeginnings.config.BBConfig;
import net.einsteinsci.betterbeginnings.items.ItemHammer;
import net.einsteinsci.betterbeginnings.items.ItemKnife;
import net.einsteinsci.betterbeginnings.register.RegisterBlocks;
import net.einsteinsci.betterbeginnings.register.RegisterItems;
import net.einsteinsci.betterbeginnings.register.achievement.RegisterAchievements;
import net.einsteinsci.betterbeginnings.tileentity.TileEntityCampfire;
import net.einsteinsci.betterbeginnings.util.ChatUtil;
import net.minecraft.block.Block;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.*;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.*;
import net.minecraft.stats.AchievementList;
import net.minecraft.world.EnumDifficulty;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import java.util.*;
public class BBEventHandler
{
@SubscribeEvent
public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e)
{
if (BBConfig.greetUser)
{
ChatUtil.sendModChatToPlayer(e.player, ChatUtil.LIME + "BetterBeginnings " + ModMain.VERSION +
" loaded successfully.");
}
}
@SubscribeEvent
public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent e)
{
if (e.modID.equals(ModMain.MODID))
{
BBConfig.syncConfig(ModMain.configFile);
}
}
@SubscribeEvent
public void onItemTooltip(ItemTooltipEvent e)
{
Item item = e.itemStack.getItem();
if (item == RegisterItems.charredMeat)
{
e.toolTip.add("Not to be confused with charcoal");
}
if (item == RegisterItems.ironNugget)
{
e.toolTip.add("Good for hinges and rivets");
}
if (item == RegisterItems.flintKnife)
{
e.toolTip.add("Don't bring it to a gunfight");
}
if (item == RegisterItems.infusionScroll)
{
e.toolTip.add("Allows you to decipher tool infusion.");
}
if (item == RegisterItems.noobWoodSword && EnchantmentHelper.getEnchantments(e.itemStack).isEmpty())
{
e.toolTip.add(ChatUtil.BLUE + "+0 Attack Damage");
}
if (item == RegisterItems.testItem)
{
e.toolTip.add(ChatUtil.PINK + "For dev testing only. What it does");
e.toolTip.add(ChatUtil.PINK + "changes from one version to the next.");
}
if (item == RegisterItems.pan)
{
e.toolTip.add(ChatUtil.BLUE + "Fry stuff over a campfire!");
}
if (item == RegisterItems.rotisserie)
{
e.toolTip.add(ChatUtil.BLUE + "Not for roasting people");
}
if (item == Items.sugar)
{
e.toolTip.add(ChatUtil.ITALIC + "Yes please!");
}
if (item == Item.getItemFromBlock(RegisterBlocks.campfire) && !BBConfig.moduleCampfire)
{
e.toolTip.add(ChatUtil.RED + "Module disabled in config.");
}
if (item == Item.getItemFromBlock(RegisterBlocks.infusionRepairStation) &&
!BBConfig.moduleInfusionRepair)
{
e.toolTip.add(ChatUtil.RED + "Module disabled in config.");
}
Block block = Block.getBlockFromItem(item);
if (block != null)
{
if (block == RegisterBlocks.kiln || block == RegisterBlocks.obsidianKiln ||
block == RegisterBlocks.brickOven || block == RegisterBlocks.netherBrickOven ||
block == RegisterBlocks.smelter || block == RegisterBlocks.enderSmelter)
{
if (!BBConfig.moduleFurnaces)
{
e.toolTip.add(ChatUtil.RED + "Module disabled in config.");
}
}
}
if (isWIP(e.itemStack))
{
e.toolTip.add(ChatUtil.RED + "WIP. May not be fully functional.");
}
}
public boolean isWIP(ItemStack stack)
{
List<ItemStack> wip = new ArrayList<>();
// add WIP items here
for (ItemStack test : wip)
{
if (stack.getItem() == test.getItem())
{
return true;
}
}
return false;
}
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent e)
{
// Let's leave this to the professionals
BlockBreakHelper.handleBlockBreaking(e);
}
@SubscribeEvent
public void onRightClick(PlayerInteractEvent e)
{
if (e.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)
{
if (e.entityPlayer.getHeldItem() != null)
{
ItemStack stack = e.entityPlayer.getHeldItem();
Item item = stack.getItem();
if (item instanceof ItemFlintAndSteel || item == RegisterItems.fireBow)
{
Block b = e.world.getBlockState(e.pos).getBlock();
if (b == RegisterBlocks.campfire || b == RegisterBlocks.campfireLit)
{
TileEntityCampfire campfire = (TileEntityCampfire)e.world.getTileEntity(e.pos);
campfire.lightFuel(); // Light it.
//e.entityPlayer.getHeldItem().damageItem(1, e.entityPlayer);
}
}
}
}
}
@SubscribeEvent
public void onBlockDrops(BlockEvent.HarvestDropsEvent e)
{
Block block = e.state.getBlock();
EntityPlayer player = e.harvester;
// All onBlockDrops activity that does not have to do with players must
// occur before here.
if (player == null)
{
return;
}
ItemStack held = player.getHeldItem();
Random rand = player.worldObj.rand;
// Knife silk-touching for vines
if (block == Blocks.vine && !e.isSilkTouching)
{
if (held != null)
{
if (held.getItem() instanceof ItemKnife)
{
if (rand.nextInt(4) == 0)
{
e.drops.add(new ItemStack(Blocks.vine));
}
}
}
}
// Knife silk-touching for grass/bushes
if ((block == Blocks.tallgrass || block == Blocks.deadbush) && !e.isSilkTouching)
{
if (held != null)
{
if (held.getItem() instanceof ItemKnife)
{
if (rand.nextInt(4) == 0)
{
int meta = block.getMetaFromState(e.state);
e.drops.add(new ItemStack(block, 1, meta));
}
}
}
}
// Hammer
if (held != null)
{
if (held.getItem() instanceof ItemHammer)
{
ItemStack crushResult = ItemHammer.getCrushResult(block, e.state);
if (crushResult != null)
{
e.drops.clear();
e.drops.add(crushResult);
}
}
}
// Tripwire -> thread
if (block == Blocks.tripwire)
{
int rem = 0;
for (int i = 0; i < e.drops.size(); i++)
{
if (e.drops.get(i).getItem() == Items.string)
{
rem = i;
}
}
int count = e.drops.get(rem).stackSize; // Almost certainly 1.
e.drops.remove(rem);
e.drops.add(new ItemStack(RegisterItems.thread, count));
}
// Makes sure emergency escape mechanic does not let blocks fall out (like logs)
if (BBConfig.alwaysBreakable.contains(block))
{
return;
}
int neededHarvestLevel = block.getHarvestLevel(e.state);
String neededToolClass = block.getHarvestTool(e.state);
int usedHarvestLevel = 0;
String usedToolClass = null;
if (held != null)
{
for (String toolClass : held.getItem().getToolClasses(held))
{
int hl = held.getItem().getHarvestLevel(held, toolClass);
if (hl >= usedHarvestLevel)
{
usedHarvestLevel = hl;
usedToolClass = toolClass;
}
}
if (BBConfig.alsoPickaxes.containsKey(held.getItem()))
{
usedToolClass = "pickaxe";
usedHarvestLevel = BBConfig.alsoPickaxes.get(held.getItem());
}
if (BBConfig.alsoAxes.containsKey(held.getItem()))
{
usedToolClass = "axe";
usedHarvestLevel = BBConfig.alsoAxes.get(held.getItem());
}
}
if (neededToolClass == null || neededToolClass.equalsIgnoreCase("shovel") ||
neededToolClass.equalsIgnoreCase("null"))
{
return;
}
if (usedToolClass == null || !usedToolClass.equalsIgnoreCase(neededToolClass) ||
usedHarvestLevel < neededHarvestLevel)
{
e.drops.clear();
}
}
@SubscribeEvent
public void onItemSmelted(PlayerEvent.ItemSmeltedEvent e)
{
if (e.smelting.getItem() == Items.golden_apple && e.smelting.getItemDamage() == 1)
{
RegisterAchievements.achievementGet(e.player, "notchApple");
}
}
@SubscribeEvent
public void onItemCrafted(PlayerEvent.ItemCraftedEvent e)
{
// To fix duplication glitch (#27)
if (e.crafting.getItem() instanceof ItemKnife)
{
for (int i = 0; i < e.craftMatrix.getSizeInventory(); i++)
{
ItemStack stack = e.craftMatrix.getStackInSlot(i);
if (stack != null)
{
if (stack.getItem() instanceof ItemKnife)
{
--stack.stackSize;
if (stack.stackSize <= 0)
{
e.craftMatrix.setInventorySlotContents(i, null);
}
else
{
e.craftMatrix.setInventorySlotContents(i, stack);
}
}
}
}
}
if (e.crafting.getItem() == RegisterItems.flintKnife)
{
RegisterAchievements.achievementGet(e.player, "flintKnife");
}
else if (e.crafting.getItem() instanceof ItemKnife)
{
RegisterAchievements.achievementGet(e.player, "upgradeKnife");
}
if (e.crafting.getItem() == Items.string)
{
RegisterAchievements.achievementGet(e.player, "makeString");
}
if (e.crafting.getItem() == RegisterItems.twine)
{
RegisterAchievements.achievementGet(e.player, "makeTwine");
}
for (int i = 0; i < e.craftMatrix.getSizeInventory(); ++i)
{
if (e.craftMatrix.getStackInSlot(i) != null)
{
ItemStack current = e.craftMatrix.getStackInSlot(i);
if (current.getItem() instanceof ItemKnife && e.crafting.getItem() == Items.stick)
{
RegisterAchievements.achievementGet(e.player, "makeSticks");
}
}
}
if (e.crafting.getItem() == RegisterItems.flintHatchet)
{
RegisterAchievements.achievementGet(e.player, "makeHatchet");
}
if (e.crafting.getItem() instanceof ItemSword)
{
RegisterAchievements.achievementGet(e.player, "makeSword");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.infusionRepairStation))
{
RegisterAchievements.achievementGet(e.player, "infusionRepair");
}
if (e.crafting.getItem() == RegisterItems.boneShard)
{
RegisterAchievements.achievementGet(e.player, "boneShards");
}
if (e.crafting.getItem() == RegisterItems.bonePickaxe)
{
RegisterAchievements.achievementGet(e.player, "bonePick");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.kiln))
{
RegisterAchievements.achievementGet(e.player, "makeKiln");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.obsidianKiln))
{
RegisterAchievements.achievementGet(e.player, "obsidianKiln");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.smelter))
{
RegisterAchievements.achievementGet(e.player, "makeSmelter");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.enderSmelter))
{
RegisterAchievements.achievementGet(e.player, "enderSmelter");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.brickOven))
{
RegisterAchievements.achievementGet(e.player, "makeBrickOven");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.doubleWorkbench))
{
e.player.addStat(AchievementList.buildWorkBench, 1);
}
if (e.crafting.getItem() == Items.cake)
{
RegisterAchievements.achievementGet(e.player, "cake");
}
if (e.crafting.getItem() == Item.getItemFromBlock(RegisterBlocks.netherBrickOven))
{
RegisterAchievements.achievementGet(e.player, "netherBrickOven");
}
}
@SubscribeEvent
public void onEntityLivingDrops(LivingDropsEvent e)
{
Random rand = e.entity.worldObj.rand;
if (e.entityLiving instanceof EntitySpider) // Includes cave spiders
{
if (!BBConfig.spidersDropString)
{
Iterator iterator = e.drops.iterator();
while (iterator.hasNext())
{
EntityItem entityItem = (EntityItem)iterator.next();
Item item = entityItem.getEntityItem().getItem();
if (item == Items.string)
{
iterator.remove();
}
}
}
int dropCount = rand.nextInt(3 + e.lootingLevel) + 2;
for (int i = 0; i < dropCount; ++i)
{
e.entityLiving.dropItem(RegisterItems.silk, 1);
}
}
if (BBConfig.moreBones)
{
if (!BBConfig.moreBonesPeacefulOnly || e.entity.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL)
{
int maxBones = 0;
int maxShards = 0;
if (e.entityLiving instanceof EntityCow)
{
maxBones = 4;
}
if (e.entityLiving instanceof EntitySheep || e.entityLiving instanceof EntityPig)
{
maxBones = 3;
}
if (e.entityLiving instanceof EntityChicken || e.entityLiving instanceof EntityOcelot)
{
maxShards = 3;
}
if (e.entityLiving instanceof EntityZombie)
{
maxBones = 2;
maxShards = 3;
}
if (maxBones > 0 && e.recentlyHit && !e.entityLiving.isChild())
{
int dropCount = rand.nextInt(maxBones + e.lootingLevel);
for (int i = 0; i < dropCount; ++i)
{
e.entityLiving.dropItem(Items.bone, 1);
}
}
if (maxShards > 0 && e.recentlyHit && !e.entityLiving.isChild())
{
int dropCount = rand.nextInt(maxShards + e.lootingLevel);
for (int i = 0; i < dropCount; ++i)
{
e.entityLiving.dropItem(RegisterItems.boneShard, 1);
}
}
}
if (e.entityLiving instanceof EntitySkeleton)
{
int dropCount = rand.nextInt(3 + e.lootingLevel);
e.entityLiving.dropItem(Items.bone, 1);
e.entityLiving.dropItem(RegisterItems.boneShard, dropCount);
}
}
if (BBConfig.flamingAnimalsDropCharredMeat)
{
// Flaming mobs drop charred meat instead of cooked meats
if (e.entityLiving instanceof EntityCow || e.entityLiving instanceof EntityPig ||
e.entityLiving instanceof EntityChicken)
{
int charredDrops = 0;
Iterator iterator = e.drops.iterator();
while (iterator.hasNext())
{
EntityItem entityItem = (EntityItem)iterator.next();
Item item = entityItem.getEntityItem().getItem();
if (item == Items.cooked_beef || item == Items.cooked_porkchop || item == Items.cooked_chicken)
{
iterator.remove();
charredDrops += entityItem.getEntityItem().stackSize;
}
}
e.entityLiving.dropItem(RegisterItems.charredMeat, charredDrops);
}
}
}
}