package me.tyler15555.minibosses.common; import java.util.ArrayList; import java.util.Random; import me.tyler15555.minibosses.entity.EntityLivingBlock; import me.tyler15555.minibosses.item.MBItems; import me.tyler15555.minibosses.util.ConfigHelper; import me.tyler15555.minibosses.util.ExtendedPlayerProperties; import me.tyler15555.minibosses.util.IMiniboss; import me.tyler15555.minibosses.util.MicroBossProperties; import me.tyler15555.minibosses.util.NBTHelper; import me.tyler15555.minibosses.util.Resources; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntitySkeleton; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; import net.minecraftforge.event.entity.EntityEvent.EntityConstructing; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; public class MBEventHandler { private final Random random = new Random(); private final ArrayList playersToSave = new ArrayList(); @SubscribeEvent public void onEntitySpawn(EntityJoinWorldEvent event) { if(ConfigHelper.microBossesEnabled) { if(event.entity instanceof EntityZombie || event.entity instanceof EntitySkeleton) { if(random.nextInt(19) == 1) { EntityLiving entity = (EntityLiving)event.entity; MicroBossProperties props = MicroBossProperties.generateRandomProperties(); props.applyToEntity(entity); entity.setCustomNameTag(Resources.generateRandomName(random)); } } if(event.entity instanceof EntityHorse && !event.world.isRemote && random.nextInt(19) == 1) { EntityHorse horse = (EntityHorse)event.entity; EntitySkeleton skeleton = new EntitySkeleton(event.world); horse.setHorseType(4); skeleton.setSkeletonType(0); skeleton.copyLocationAndAnglesFrom(horse); event.world.spawnEntityInWorld(skeleton); horse.func_152120_b(skeleton.getName()); //Sets the owner of the horse horse.setHorseTamed(true); skeleton.setCurrentItemOrArmor(0, new ItemStack(Items.bow)); skeleton.mountEntity(horse); } if(event.entity instanceof EntityCreeper && random.nextInt(19) == 1) { EntityCreeper creeper = (EntityCreeper)event.entity; creeper.getDataWatcher().updateObject(17, Byte.valueOf((byte)1)); } if(event.entity instanceof IMiniboss) { IMiniboss entity = (IMiniboss)event.entity; if(Resources.entityBlockList.containsKey(entity.getBanlistName()) && Resources.entityBlockList.get(entity.getBanlistName()) == event.entity.worldObj.provider.getDimensionId()) { event.entity.setDead(); } } } } @SubscribeEvent public void onEntityConstructing(EntityConstructing event) { if(event.entity instanceof EntityPlayer && event.entity.getExtendedProperties(ExtendedPlayerProperties.PROP_NAME) == null) { EntityPlayer player = (EntityPlayer)event.entity; player.registerExtendedProperties(ExtendedPlayerProperties.PROP_NAME, new ExtendedPlayerProperties()); } } @SubscribeEvent public void onBlockBreak(BreakEvent event) { if(ConfigHelper.enableLivingBlocks) { if(!event.world.isRemote && random.nextInt(199) == 1) { if(event.world.getBlockState(event.pos).getBlock() == Blocks.dirt) { EntityLivingBlock livingBlock = new EntityLivingBlock(event.world); livingBlock.setBlockType(0); livingBlock.setPosition(event.pos.getX(), event.pos.getY(), event.pos.getZ()); event.world.spawnEntityInWorld(livingBlock); } if(event.world.getBlockState(event.pos).getBlock() == Blocks.stone) { EntityLivingBlock livingBlockStone = new EntityLivingBlock(event.world); livingBlockStone.setBlockType(1); livingBlockStone.setPosition(event.pos.getX(), event.pos.getY(), event.pos.getZ()); event.world.spawnEntityInWorld(livingBlockStone); } } } } @SubscribeEvent public void changeBreakSpeed(BreakSpeed speed) { if(speed.entityPlayer.getExtendedProperties(ExtendedPlayerProperties.PROP_NAME) != null && ConfigHelper.powersEnabled) { ExtendedPlayerProperties props = (ExtendedPlayerProperties) speed.entityPlayer.getExtendedProperties(ExtendedPlayerProperties.PROP_NAME); if(props.getAbilityUsageAmount() > 0 && props.getPowersEnabled()) { speed.newSpeed = speed.originalSpeed * 2; if(random.nextInt(149) == 1) { props.decreaseAbilityUsage(); } } else { speed.newSpeed = speed.originalSpeed; } } } @SubscribeEvent public void onLivingAttack(LivingAttackEvent event) { if(event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer && ConfigHelper.powersEnabled) { EntityPlayer player = (EntityPlayer)event.source.getEntity(); if(player.getExtendedProperties(ExtendedPlayerProperties.PROP_NAME) != null) { ExtendedPlayerProperties props = (ExtendedPlayerProperties) player.getExtendedProperties(ExtendedPlayerProperties.PROP_NAME); if(props.getAbilityUsageAmount() > 0 && props.getPowersEnabled()) { event.entityLiving.setPosition(event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ + 10); EntityLightningBolt lightning = new EntityLightningBolt(event.entityLiving.worldObj, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ); player.worldObj.spawnEntityInWorld(lightning); props.decreaseAbilityUsage(); //System.out.println("USAGE REMAINING: " + props.getAbilityUsageAmount()); } } } if(event.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.entityLiving; if(player.inventory.hasItem(MBItems.dodgeGem) && random.nextInt(100) >= 65) { event.setCanceled(true); } } } @SubscribeEvent public void onLivingDeath(LivingDeathEvent event) { if(event.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.entity; if(player.inventory.hasItemStack(new ItemStack(MBItems.reviveHeart))) { event.setCanceled(true); player.setHealth(player.getMaxHealth()); player.inventory.consumeInventoryItem(MBItems.reviveHeart); playersToSave.add(player); } } if(event.entity instanceof IMiniboss && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { IMiniboss entity = (IMiniboss)event.entityLiving; if(random.nextInt(100) >= entity.getDropChance()) { event.entity.dropItem(entity.getPossibleLoot().getItem(), 1); } } } @SubscribeEvent public void onPlayerDrops(PlayerDropsEvent event) { if(playersToSave.contains(event.entityPlayer)) { for(EntityItem drop : event.drops) { if(drop.getEntityItem().getItem() == MBItems.reviveHeart) { drop.setDead(); } if(drop.getEntityItem().getItem() == MBItems.dodgeGem) { NBTHelper.writeIntToStack(drop.getEntityItem(), "ShortDespawn", 1); } } playersToSave.remove(event.entityPlayer); } } }