/*******************************************************************************
* AbyssalCraft
* Copyright (c) 2012 - 2017 Shinoow.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Contributors:
* Shinoow - implementation
******************************************************************************/
package com.shinoow.abyssalcraft.common.handlers;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.init.MobEffects;
import net.minecraft.init.SoundEvents;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.translation.I18n;
import net.minecraft.world.WorldServer;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
import net.minecraftforge.event.AnvilUpdateEvent;
import net.minecraftforge.event.entity.living.EnderTeleportEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.event.entity.player.UseHoeEvent;
import net.minecraftforge.event.terraingen.BiomeEvent;
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import com.shinoow.abyssalcraft.api.biome.ACBiomes;
import com.shinoow.abyssalcraft.api.biome.IDarklandsBiome;
import com.shinoow.abyssalcraft.api.block.ACBlocks;
import com.shinoow.abyssalcraft.api.event.ACEvents.RitualEvent;
import com.shinoow.abyssalcraft.api.item.ACItems;
import com.shinoow.abyssalcraft.api.item.ItemUpgradeKit;
import com.shinoow.abyssalcraft.api.recipe.UpgradeKitRecipes;
import com.shinoow.abyssalcraft.api.ritual.NecronomiconCreationRitual;
import com.shinoow.abyssalcraft.api.ritual.NecronomiconInfusionRitual;
import com.shinoow.abyssalcraft.api.ritual.NecronomiconPotionAoERitual;
import com.shinoow.abyssalcraft.api.ritual.NecronomiconPotionRitual;
import com.shinoow.abyssalcraft.api.ritual.NecronomiconSummonRitual;
import com.shinoow.abyssalcraft.common.entity.EntityJzahar;
import com.shinoow.abyssalcraft.common.entity.demon.EntityEvilSheep;
import com.shinoow.abyssalcraft.common.items.ItemCrystalBag;
import com.shinoow.abyssalcraft.common.items.ItemNecronomicon;
import com.shinoow.abyssalcraft.common.ritual.NecronomiconBreedingRitual;
import com.shinoow.abyssalcraft.common.ritual.NecronomiconDreadSpawnRitual;
import com.shinoow.abyssalcraft.init.BlockHandler;
import com.shinoow.abyssalcraft.lib.ACAchievements;
import com.shinoow.abyssalcraft.lib.ACConfig;
import com.shinoow.abyssalcraft.lib.ACLib;
import com.shinoow.abyssalcraft.lib.util.SpecialTextUtil;
import com.shinoow.abyssalcraft.lib.world.TeleporterDarkRealm;
public class AbyssalCraftEventHooks {
@SubscribeEvent
public void populateChunk(PopulateChunkEvent.Pre event) {
Chunk chunk = event.getWorld().getChunkFromChunkCoords(event.getChunkX(), event.getChunkZ());
for (ExtendedBlockStorage storage : chunk.getBlockStorageArray())
if (storage != null && storage.getYLocation() >= 60)
for (int x = 0; x < 16; ++x)
for (int y = 0; y < 16; ++y)
for (int z = 0; z < 16; ++z)
if(chunk.getBiome(new BlockPos(x, y, z), event.getWorld().getBiomeProvider()) == ACBiomes.darklands_mountains)
if (storage.get(x, y, z).getBlock() == Blocks.STONE)
storage.set(x, y, z, ACBlocks.darkstone.getDefaultState());
}
@SubscribeEvent
public void onItemPickup(EntityItemPickupEvent event) {
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssalnite_ore))
event.getEntityPlayer().addStat(ACAchievements.mine_abyssalnite, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.coralium_gem ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_2 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_3 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_4 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_5 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_6 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_7 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_8 ||
event.getItem().getEntityItem().getItem() == ACItems.coralium_gem_cluster_9 ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.coralium_ore))
event.getEntityPlayer().addStat(ACAchievements.mine_coralium, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.liquified_coralium_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.pearlescent_coralium_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_coralium_ore))
event.getEntityPlayer().addStat(ACAchievements.mine_abyssal_coralium, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.shadow_gem)
event.getEntityPlayer().addStat(ACAchievements.shadow_gems, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_copper_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_iron_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_gold_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_nitre_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_diamond_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.abyssal_tin_ore))
event.getEntityPlayer().addStat(ACAchievements.mine_abyssal_ores, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.dreadlands_abyssalnite_ore) ||
event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.dreaded_abyssalnite_ore))
event.getEntityPlayer().addStat(ACAchievements.mine_dreadlands_ores, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.dreadium_ingot)
event.getEntityPlayer().addStat(ACAchievements.dreadium, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.ethaxium_ingot)
event.getEntityPlayer().addStat(ACAchievements.ethaxium, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.necronomicon)
event.getEntityPlayer().addStat(ACAchievements.necronomicon, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.depths_ghoul_head))
event.getEntityPlayer().addStat(ACAchievements.depths_ghoul_head, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.pete_head))
event.getEntityPlayer().addStat(ACAchievements.pete_head, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.mr_wilson_head))
event.getEntityPlayer().addStat(ACAchievements.mr_wilson_head, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.dr_orange_head))
event.getEntityPlayer().addStat(ACAchievements.dr_orange_head, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.dreadlands_infused_powerstone))
event.getEntityPlayer().addStat(ACAchievements.find_powerstone, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.gateway_key)
event.getEntityPlayer().addStat(ACAchievements.gateway_key, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.dreaded_gateway_key)
event.getEntityPlayer().addStat(ACAchievements.dreaded_gateway_key, 1);
if(event.getItem().getEntityItem().getItem() == ACItems.rlyehian_gateway_key)
event.getEntityPlayer().addStat(ACAchievements.rlyehian_gateway_key, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.transmutator_idle))
event.getEntityPlayer().addStat(ACAchievements.make_transmutator, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.crystallizer_idle))
event.getEntityPlayer().addStat(ACAchievements.make_crystallizer, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.materializer))
event.getEntityPlayer().addStat(ACAchievements.make_materializer, 1);
if(event.getItem().getEntityItem().getItem() == Item.getItemFromBlock(ACBlocks.engraver))
event.getEntityPlayer().addStat(ACAchievements.make_engraver, 1);
}
@SubscribeEvent
public void armorStuff(LivingHurtEvent event){
if(event.getEntityLiving().getItemStackFromSlot(EntityEquipmentSlot.CHEST) != null){
ItemStack slot = event.getEntityLiving().getItemStackFromSlot(EntityEquipmentSlot.CHEST);
if(slot.getItem() == ACItems.dreaded_abyssalnite_chestplate)
if(event.getSource().getEntity() != null && event.getEntityLiving().world.rand.nextBoolean())
event.getSource().getEntity().setFire(30);
if(slot.getItem() == ACItems.plated_coralium_chestplate)
if(event.getSource().getEntity() != null && event.getEntityLiving().world.rand.nextBoolean())
event.getSource().getEntity().attackEntityFrom(getSource(event.getEntityLiving()), 1);
}
}
private DamageSource getSource(EntityLivingBase entity){
if(entity instanceof EntityPlayer)
return DamageSource.causePlayerDamage((EntityPlayer)entity);
return DamageSource.causeMobDamage(entity);
}
@SubscribeEvent
public void darkRealm(LivingUpdateEvent event){
if(event.getEntityLiving() instanceof EntityPlayerMP){
WorldServer worldServer = (WorldServer)event.getEntityLiving().world;
EntityPlayerMP player = (EntityPlayerMP)event.getEntityLiving();
if(player.dimension == ACLib.omothol_id && player.posY <= 0){
player.addPotionEffect(new PotionEffect(MobEffects.RESISTANCE, 80, 255));
player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, 20));
player.mcServer.getPlayerList().transferPlayerToDimension(player, ACLib.dark_realm_id, new TeleporterDarkRealm(worldServer));
player.addStat(ACAchievements.enter_dark_realm, 1);
}
}
if(event.getEntityLiving().dimension == ACLib.dark_realm_id && !(event.getEntityLiving() instanceof EntityPlayer)){
Random rand = new Random();
if(ACConfig.particleEntity)
event.getEntityLiving().world.spawnParticle(EnumParticleTypes.SMOKE_LARGE, event.getEntityLiving().posX + (rand.nextDouble() - 0.5D) * event.getEntityLiving().width,
event.getEntityLiving().posY + rand.nextDouble() * event.getEntityLiving().height,
event.getEntityLiving().posZ + (rand.nextDouble() - 0.5D) * event.getEntityLiving().width, 0,0,0);
}
}
@SubscribeEvent
public void onCraftingEvent(PlayerEvent.ItemCraftedEvent event)
{
for(int h=0; h < event.craftMatrix.getSizeInventory(); h++)
if(event.craftMatrix.getStackInSlot(h) != null){
ItemStack k = event.craftMatrix.getStackInSlot(h);
if(k.getItem() != null && k.getItem() instanceof ItemCrystalBag){
NBTTagCompound compound = new NBTTagCompound();
NBTTagList items = new NBTTagList();
if(k.getTagCompound() == null)
k.setTagCompound(compound);
items = k.getTagCompound().getTagList("ItemInventory", 10);
ItemStack l = event.crafting;
if(l.getItem() instanceof ItemCrystalBag){
((ItemCrystalBag)l.getItem()).setInventorySize(l);
if(l.getTagCompound() == null)
l.setTagCompound(compound);
l.getTagCompound().setTag("ItemInventory", items);
}
}
else if(k.getItem() != null && k.getItem() instanceof ItemNecronomicon){
NBTTagCompound compound = new NBTTagCompound();
String owner = "";
float energy = 0;
if(k.getTagCompound() == null)
k.setTagCompound(compound);
owner = k.getTagCompound().getString("owner");
energy = k.getTagCompound().getFloat("PotEnergy");
ItemStack l = event.crafting;
if(l.getItem() instanceof ItemNecronomicon){
if(l.getTagCompound() == null)
l.setTagCompound(compound);
if(!owner.equals(""))
l.getTagCompound().setString("owner", owner);
if(energy != 0)
l.getTagCompound().setFloat("PotEnergy", energy);
}
}
}
if(event.crafting.getItem() == ACItems.gateway_key)
event.player.addStat(ACAchievements.gateway_key, 1);
if(event.crafting.getItem() == ACItems.shadow_gem)
event.player.addStat(ACAchievements.shadow_gems, 1);
if(event.crafting.getItem() == ACItems.ethaxium_ingot)
event.player.addStat(ACAchievements.ethaxium, 1);
if(event.crafting.getItem() == ACItems.necronomicon)
event.player.addStat(ACAchievements.necronomicon, 1);
if(event.crafting.getItem() == ACItems.abyssal_wasteland_necronomicon)
event.player.addStat(ACAchievements.abyssal_wasteland_necronomicon, 1);
if(event.crafting.getItem() == ACItems.dreadlands_necronomicon)
event.player.addStat(ACAchievements.dreadlands_necronomicon, 1);
if(event.crafting.getItem() == ACItems.omothol_necronomicon)
event.player.addStat(ACAchievements.omothol_necronomicon, 1);
if(event.crafting.getItem() == ACItems.abyssalnomicon)
event.player.addStat(ACAchievements.abyssalnomicon, 1);
if(event.crafting.getItem() == Item.getItemFromBlock(ACBlocks.transmutator_idle))
event.player.addStat(ACAchievements.make_transmutator, 1);
if(event.crafting.getItem() == Item.getItemFromBlock(ACBlocks.crystallizer_idle))
event.player.addStat(ACAchievements.make_crystallizer, 1);
if(event.crafting.getItem() == Item.getItemFromBlock(ACBlocks.materializer))
event.player.addStat(ACAchievements.make_materializer, 1);
if(event.crafting.getItem() == Item.getItemFromBlock(ACBlocks.engraver))
event.player.addStat(ACAchievements.make_engraver, 1);
if(event.crafting.getItem() == ACItems.small_crystal_bag ||
event.crafting.getItem() == ACItems.medium_crystal_bag ||
event.crafting.getItem() == ACItems.large_crystal_bag ||
event.crafting.getItem() == ACItems.huge_crystal_bag)
event.player.addStat(ACAchievements.make_crystal_bag, 1);
}
@SubscribeEvent
public void noTPinOmothol(EnderTeleportEvent event){
if(!(event.getEntityLiving() instanceof EntityJzahar))
if(event.getEntityLiving().dimension == ACLib.omothol_id){
event.getEntityLiving().attackEntityFrom(DamageSource.FALL, event.getAttackDamage());
event.getEntityLiving().addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 200, 1));
event.getEntityLiving().addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 200, 1));
event.setCanceled(true);
}
}
@SubscribeEvent
public void darklandsVillages(BiomeEvent.GetVillageBlockID event){
if(event.getBiome() instanceof IDarklandsBiome){
if(event.getOriginal().getBlock() == Blocks.LOG || event.getOriginal().getBlock() == Blocks.LOG2){
event.setReplacement(ACBlocks.darklands_oak_wood.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.COBBLESTONE){
event.setReplacement(ACBlocks.darkstone_cobblestone.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.PLANKS){
event.setReplacement(ACBlocks.darklands_oak_planks.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.OAK_STAIRS){
event.setReplacement(ACBlocks.darklands_oak_stairs.getDefaultState().withProperty(BlockStairs.FACING, event.getOriginal().getValue(BlockStairs.FACING)));
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.STONE_STAIRS){
event.setReplacement(ACBlocks.darkstone_cobblestone_stairs.getDefaultState().withProperty(BlockStairs.FACING, event.getOriginal().getValue(BlockStairs.FACING)));;
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.OAK_FENCE){
event.setReplacement(ACBlocks.darklands_oak_fence.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.STONE_SLAB){
event.setReplacement(ACBlocks.darkstone_slab.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.DOUBLE_STONE_SLAB){
event.setReplacement(BlockHandler.Darkstoneslab2.getDefaultState());
event.setResult(Result.DENY);
}
if(event.getOriginal().getBlock() == Blocks.WOODEN_PRESSURE_PLATE){
event.setReplacement(ACBlocks.darklands_oak_pressure_plate.getDefaultState());
event.setResult(Result.DENY);
}
}
}
@SubscribeEvent
public void onRitualPerformed(RitualEvent.Post event){
if(event.getRitual() instanceof NecronomiconSummonRitual){
event.getEntityPlayer().addStat(ACAchievements.summoning_ritual, 1);
if(event.getRitual().getUnlocalizedName().substring(10).equals("summonSacthoth"))
if(!event.getWorld().isRemote)
SpecialTextUtil.SacthothGroup(event.getWorld(), I18n.translateToLocal("message.sacthoth.spawn.1"));
if(event.getRitual().getUnlocalizedName().substring(10).equals("summonAsorah")){
if(!event.getWorld().isRemote)
SpecialTextUtil.AsorahGroup(event.getWorld(), I18n.translateToLocal("message.asorah.spawn"));
event.getEntityPlayer().addStat(ACAchievements.summon_asorah, 1);
}
}
if(event.getRitual() instanceof NecronomiconCreationRitual)
event.getEntityPlayer().addStat(ACAchievements.creation_ritual, 1);
if(event.getRitual() instanceof NecronomiconBreedingRitual
|| event.getRitual() instanceof NecronomiconDreadSpawnRitual)
event.getEntityPlayer().addStat(ACAchievements.breeding_ritual, 1);
if(event.getRitual() instanceof NecronomiconPotionRitual)
event.getEntityPlayer().addStat(ACAchievements.potion_ritual, 1);
if(event.getRitual() instanceof NecronomiconPotionAoERitual)
event.getEntityPlayer().addStat(ACAchievements.aoe_potion_ritual, 1);
if(event.getRitual() instanceof NecronomiconInfusionRitual)
event.getEntityPlayer().addStat(ACAchievements.infusion_ritual, 1);
}
@SubscribeEvent
public void onDeath(LivingDeathEvent event){
if(event.getEntityLiving() instanceof EntityPlayer && !event.getEntityLiving().world.isRemote){
EntityPlayer player = (EntityPlayer)event.getEntityLiving();
if(event.getSource().getEntity() != null && event.getSource().getEntity() instanceof EntityEvilSheep)
((EntityEvilSheep)event.getSource().getEntity()).setKilledPlayer(player);
}
}
@SubscribeEvent
public void upgradeKits(AnvilUpdateEvent event){
if(!(event.getRight().getItem() instanceof ItemUpgradeKit)) return;
int cost = 0;
float f = (float)(event.getLeft().getMaxDamage() - event.getLeft().getItemDamage()) / (float)event.getLeft().getMaxDamage();
if(f >= 0)
cost = 10;
if(f >= 0.1f)
cost = 9;
if(f >= 0.2f)
cost = 8;
if(f >= 0.3f)
cost = 7;
if(f >= 0.4f)
cost = 6;
if(f >= 0.5f)
cost = 5;
if(f >= 0.6f)
cost = 4;
if(f >= 0.7f)
cost = 3;
if(f >= 0.8f)
cost = 2;
if(f >= 0.9f)
cost = 1;
ItemStack stack = UpgradeKitRecipes.instance().getUpgrade((ItemUpgradeKit)event.getRight().getItem(), event.getLeft());
if(!stack.isEmpty()){
if(StringUtils.isNullOrEmpty(event.getName())){
if(event.getLeft().hasDisplayName()){
cost += 1;
stack.clearCustomName();
}
} else if(!event.getName().equals(event.getLeft().getDisplayName())){
cost += 1;
stack.setStackDisplayName(event.getName());
}
for(int i : EnchantmentHelper.getEnchantments(event.getLeft()).values())
cost += i;
EnchantmentHelper.setEnchantments(EnchantmentHelper.getEnchantments(event.getLeft()), stack);
stack.setCount(event.getLeft().getCount());
event.setOutput(stack);
}
event.setMaterialCost(1);
event.setCost(cost == 0 ? 1 : cost);
}
@SubscribeEvent
public void onUseHoe(UseHoeEvent event){
Block b = event.getWorld().getBlockState(event.getPos()).getBlock();
if(b == ACBlocks.darklands_grass || b == ACBlocks.dreadlands_grass || b == ACBlocks.dreadlands_dirt){
event.getWorld().playSound(event.getEntityPlayer(), event.getPos(), SoundEvents.ITEM_HOE_TILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
if(!event.getWorld().isRemote)
event.getWorld().setBlockState(event.getPos(), Blocks.FARMLAND.getDefaultState());
event.setResult(Result.ALLOW);
}
}
}