diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index e53a92ab..3001e297 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic; +import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; @@ -8,6 +9,7 @@ import WayofTime.bloodmagic.compat.ICompatibility; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.*; +import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; @@ -19,6 +21,7 @@ import net.minecraftforge.fml.common.event.*; import net.minecraftforge.fml.common.network.NetworkRegistry; import java.io.File; +import java.util.Set; @Mod(modid = Constants.Mod.MODID, name = Constants.Mod.NAME, version = Constants.Mod.VERSION, dependencies = Constants.Mod.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") @Getter @@ -68,6 +71,7 @@ public class BloodMagic ModCompatibility.loadCompat(ICompatibility.InitializationPhase.PRE_INIT); ModTranquilityHandlers.init(); + Utils.registerHandlers(event.getAsmData().getAll(Handler.class.getCanonicalName())); proxy.preInit(); } diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index 9511c050..a7447cd4 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,5 +1,6 @@ package WayofTime.bloodmagic; +import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; @@ -8,12 +9,15 @@ import lombok.Getter; import net.minecraft.block.Block; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.client.event.ConfigChangedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; import java.io.File; import java.util.*; +@Handler public class ConfigHandler { @Getter @@ -339,4 +343,11 @@ public class ConfigHandler entitySacrificeValues.put(split[0], amount); } } + + @SubscribeEvent + public void onConfigChanged(ConfigChangedEvent event) + { + if (event.getModID().equals(Constants.Mod.MODID)) + ConfigHandler.syncConfig(); + } } diff --git a/src/main/java/WayofTime/bloodmagic/annot/Handler.java b/src/main/java/WayofTime/bloodmagic/annot/Handler.java new file mode 100644 index 00000000..cb7ccb18 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/annot/Handler.java @@ -0,0 +1,8 @@ +package WayofTime.bloodmagic.annot; + +/** + * Classes annotated with this will automatically be registered to the + * {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. + */ +public @interface Handler { +} diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java index 46863274..7ebf7eaa 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.api.util.helper; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.event.ItemBindEvent; import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.util.handler.event.GenericHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; @@ -86,7 +87,7 @@ public class BindableHelper * Deprecated. * * Now handled automatically with - * {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)} + * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} * * @param stack * - The ItemStack to bind @@ -105,7 +106,7 @@ public class BindableHelper * Deprecated. * * Now handled automatically with - * {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)} + * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} * * @param stack * - The ItemStack to bind @@ -145,7 +146,7 @@ public class BindableHelper * Deprecated. * * Now handled automatically with - * {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)} + * {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)} * * @param stack * - ItemStack to check diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index ab3812de..5caee62e 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -14,7 +14,6 @@ public class WorldDemonWillHandler { static ConcurrentHashMap containedWills = new ConcurrentHashMap(); public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap>(); - public static ConcurrentHashMap taintTrigger = new ConcurrentHashMap(); public static WillWorld getWillWorld(int dim) { diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 5b6919fd..c0d0028f 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -20,7 +20,7 @@ import WayofTime.bloodmagic.tile.TileAlchemyArray; import WayofTime.bloodmagic.tile.TileAltar; import WayofTime.bloodmagic.tile.TileDemonCrucible; import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import WayofTime.bloodmagic.util.handler.ClientEventHandler; +import WayofTime.bloodmagic.util.handler.event.ClientHandler; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; import net.minecraft.block.Block; @@ -61,7 +61,7 @@ public class ClientProxy extends CommonProxy public void preInit() { super.preInit(); - MinecraftForge.EVENT_BUS.register(new ClientEventHandler()); + MinecraftForge.EVENT_BUS.register(new ClientHandler()); renderHelper = new InventoryRenderHelper(Constants.Mod.DOMAIN); renderHelperV2 = new InventoryRenderHelperV2(Constants.Mod.DOMAIN); diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 5580e360..6c9d6654 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -10,7 +10,6 @@ import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.teleport.TeleportQueue; import WayofTime.bloodmagic.fuel.FuelHandler; -import WayofTime.bloodmagic.util.handler.EventHandler; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; @@ -29,7 +28,6 @@ public class CommonProxy public void preInit() { - MinecraftForge.EVENT_BUS.register(new EventHandler()); MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance()); GameRegistry.registerFuelHandler(new FuelHandler()); registerRenderers(); diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 1de284d2..0b0530e5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -2,7 +2,9 @@ package WayofTime.bloodmagic.util; import java.util.ArrayList; import java.util.Locale; +import java.util.Set; +import WayofTime.bloodmagic.BloodMagic; import net.minecraft.block.Block; import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; @@ -29,11 +31,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.ISpecialArmor.ArmorProperties; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.api.BlockStack; @@ -888,4 +892,17 @@ public class Utils } return largerStack ? stack : null; } + + public static void registerHandlers(Set eventHandlers) { + for (ASMDataTable.ASMData data : eventHandlers) { + try { + Class handlerClass = Class.forName(data.getClassName()); + Object handlerImpl = handlerClass.newInstance(); + MinecraftForge.EVENT_BUS.register(handlerImpl); + BloodMagic.instance.getLogger().debug("Registering event handler for class {}", data.getClassName()); + } catch (Exception e) { + // No-op + } + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java deleted file mode 100644 index ba4f9997..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java +++ /dev/null @@ -1,936 +0,0 @@ -package WayofTime.bloodmagic.util.handler; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; -import java.util.concurrent.CopyOnWriteArrayList; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Enchantments; -import net.minecraft.init.Items; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemArrow; -import net.minecraft.item.ItemSpade; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.AnvilUpdateEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingDropsEvent; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.living.LivingHealEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.player.ArrowLooseEvent; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.entity.player.FillBucketEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.event.world.ChunkDataEvent; -import net.minecraftforge.fml.client.event.ConfigChangedEvent; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.common.eventhandler.Event.Result; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.relauncher.Side; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.BloodMagicAPI; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.AltarCraftedEvent; -import WayofTime.bloodmagic.api.event.ItemBindEvent; -import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.api.event.TeleposeEvent; -import WayofTime.bloodmagic.api.iface.IBindable; -import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.api.network.SoulNetwork; -import WayofTime.bloodmagic.api.orb.IBloodOrb; -import WayofTime.bloodmagic.api.soul.DemonWillHolder; -import WayofTime.bloodmagic.api.soul.EnumDemonWillType; -import WayofTime.bloodmagic.api.soul.IDemonWill; -import WayofTime.bloodmagic.api.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.api.util.helper.*; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.demonAura.PosXY; -import WayofTime.bloodmagic.demonAura.WillChunk; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.item.ItemAltarMaker; -import WayofTime.bloodmagic.item.ItemExperienceBook; -import WayofTime.bloodmagic.item.ItemInscriptionTool; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowShot; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerCriticalStrike; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerDigging; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerExperience; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFallProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGraveDigger; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerHealthboost; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerMeleeDamage; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerPhysicalProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSelfSacrifice; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSolarPowered; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSprintAttack; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.registry.ModItems; -import WayofTime.bloodmagic.registry.ModPotions; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.TextHelper; - -import com.google.common.base.Strings; - -public class EventHandler -{ - Random random = new Random(); - HashMap serverTicks = new HashMap(); - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityDeath(LivingDeathEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - StatTrackerGrimReaperSprint.incrementCounter(armour); - - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.grimReaper", chestStack); - - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) - { - ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); - event.setCanceled(true); - event.setResult(Result.DENY); - } - - armour.writeDirtyToNBT(ItemLivingArmour.getArmourTag(chestStack)); - } - } - } - } - - @SubscribeEvent - public void onJumpEvent(LivingEvent.LivingJumpEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - StatTrackerJump.incrementCounter(armour); - - if (!player.isSneaking()) - { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.jump", chestStack); - - if (upgrade instanceof LivingArmourUpgradeJump) - { - player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); - } - } - } - } - } - } - - @SubscribeEvent - public void onServerWorldTick(TickEvent.WorldTickEvent event) - { - if (event.side == Side.CLIENT) - { - return; - } - int dim = event.world.provider.getDimension(); - if (event.phase == TickEvent.Phase.END) - { - if (!this.serverTicks.containsKey(Integer.valueOf(dim))) - { - this.serverTicks.put(Integer.valueOf(dim), Integer.valueOf(0)); - } - - int ticks = ((Integer) this.serverTicks.get(Integer.valueOf(dim))).intValue(); - - if (ticks % 20 == 0) - { - CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(Integer.valueOf(dim)); - if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) - { - for (PosXY pos : dirtyChunks) - { - event.world.markChunkDirty(new BlockPos(pos.x * 16, 5, pos.y * 16), null); - } - - dirtyChunks.clear(); - } - } - - this.serverTicks.put(dim, ticks + 1); - } - - } - - @SubscribeEvent - public void chunkSave(ChunkDataEvent.Save event) - { - int dim = event.getWorld().provider.getDimension(); - ChunkPos loc = event.getChunk().getChunkCoordIntPair(); - - NBTTagCompound nbt = new NBTTagCompound(); - event.getData().setTag("BloodMagic", nbt); - - WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.chunkXPos, loc.chunkZPos); - if (ac != null) - { - nbt.setShort("base", ac.getBase()); - ac.getCurrentWill().writeToNBT(nbt, "current"); - if (!event.getChunk().isLoaded()) - { - WorldDemonWillHandler.removeWillChunk(dim, loc.chunkXPos, loc.chunkZPos); - } - } - } - - @SubscribeEvent - public void chunkLoad(ChunkDataEvent.Load event) - { - int dim = event.getWorld().provider.getDimension(); - if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) - { - NBTTagCompound nbt = event.getData().getCompoundTag("BloodMagic"); - short base = nbt.getShort("base"); - DemonWillHolder current = new DemonWillHolder(); - current.readFromNBT(nbt, "current"); - WorldDemonWillHandler.addWillChunk(dim, event.getChunk(), base, current); - } else - { - WorldDemonWillHandler.generateWill(event.getChunk()); - } - } - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) - { - if (event.getEntityLiving() instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) event.getEntityLiving(); - if (event.getEntityLiving().isPotionActive(ModPotions.boost)) - { - player.stepHeight = 1.0f; - } else - { - boolean hasAssist = false; - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.stepAssist", chestStack); - - if (upgrade instanceof LivingArmourUpgradeStepAssist) - { - player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); - hasAssist = true; - } - } - } - - if (!hasAssist) - player.stepHeight = 0.6f; - } - - float percentIncrease = 0; - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) - { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.movement", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSpeed) - { - percentIncrease += 0.1f * ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); - } - } - } - - if (event.getEntityLiving().isPotionActive(ModPotions.boost)) - { - int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); - { - percentIncrease += (i + 1) * 0.05f; - } - } - - if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && player.moveForward > 0F) - { - player.moveRelative(0F, 1F, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease); - } - } - } - - @SubscribeEvent - public void onAltarCrafted(AltarCraftedEvent event) - { - if (event.getOutput() == null) - { - return; - } - - if (event.getOutput().getItem() instanceof ItemInscriptionTool) - { - NBTHelper.checkNBT(event.getOutput()); - event.getOutput().getTagCompound().setInteger(Constants.NBT.USES, 10); - } - } - - @SubscribeEvent - public void onEntityHurt(LivingHurtEvent event) - { - if (event.getEntity().worldObj.isRemote) - return; - - if (event.getSource().getEntity() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getEntity())) - { - EntityPlayer player = (EntityPlayer) event.getSource().getEntity(); - - if (player.getItemStackFromSlot(EntityEquipmentSlot.CHEST) != null && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) - { - ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem(); - - boolean shouldSyphon = pack.getStoredLP(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) < pack.CAPACITY; - float damageDone = event.getEntityLiving().getHealth() < event.getAmount() ? event.getAmount() - event.getEntityLiving().getHealth() : event.getAmount(); - int totalLP = Math.round(damageDone * ConfigHandler.sacrificialPackConversion); - - if (shouldSyphon) - ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST), totalLP, pack.CAPACITY); - } - } - } - - @SubscribeEvent - public void onAnvil(AnvilUpdateEvent event) - { - if (ConfigHandler.thaumcraftGogglesUpgrade) - { - if (event.getLeft().getItem() == ModItems.livingArmourHelmet && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) - { - ItemStack output = new ItemStack(ModItems.upgradeTome); - output = NBTHelper.checkNBT(output); - ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.revealing"); - ItemHelper.LivingUpgrades.setLevel(output, 1); - event.setCost(1); - - event.setOutput(output); - - return; - } - } - - if (event.getLeft().getItem() == Items.BOOK && event.getRight().getItem() == Items.ELYTRA && !event.getRight().isItemDamaged()) - { - ItemStack output = new ItemStack(ModItems.upgradeTome); - output = NBTHelper.checkNBT(output); - ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.elytra"); - ItemHelper.LivingUpgrades.setLevel(output, 1); - event.setCost(30); - - event.setOutput(output); - - return; - } - - if (event.getLeft().getItem() == ModItems.upgradeTome && event.getRight().getItem() == ModItems.upgradeTome) - { - LivingArmourUpgrade leftUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getLeft()); - if (leftUpgrade != null && ItemHelper.LivingUpgrades.getKey(event.getLeft()).equals(ItemHelper.LivingUpgrades.getKey(event.getRight()))) - { - int leftLevel = ItemHelper.LivingUpgrades.getLevel(event.getLeft()); - int rightLevel = ItemHelper.LivingUpgrades.getLevel(event.getRight()); - - if (leftLevel == rightLevel && leftLevel < leftUpgrade.getMaxTier() - 1) - { - ItemStack outputStack = event.getLeft().copy(); - ItemHelper.LivingUpgrades.setLevel(outputStack, leftLevel + 1); - event.setCost(leftLevel + 2); - - event.setOutput(outputStack); - - return; - } - } - } - - if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == ModItems.upgradeTome) - { - LivingArmourUpgrade rightUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getRight()); - if (rightUpgrade != null) - { - String key = ItemHelper.LivingUpgrades.getKey(event.getRight()); - ItemStack outputStack = event.getLeft().copy(); - List keyList = new ArrayList(); - keyList.add(key); - if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList)) - { - event.setCost(1); - - event.setOutput(outputStack); - - return; - } - } - } - } - - @SubscribeEvent - public void onBucketFill(FillBucketEvent event) - { - if (event.getEmptyBucket().getItem() != Items.BUCKET) - return; - - ItemStack result = null; - - if (event.getTarget() == null || event.getTarget().getBlockPos() == null) - { - return; - } - - Block block = event.getWorld().getBlockState(event.getTarget().getBlockPos()).getBlock(); - - if (block != null && (block.equals(ModBlocks.lifeEssence)) && block.getMetaFromState(event.getWorld().getBlockState(event.getTarget().getBlockPos())) == 0) - { - event.getWorld().setBlockToAir(event.getTarget().getBlockPos()); - result = new ItemStack(ModItems.bucketEssence); - } - - if (result == null) - return; - - event.setFilledBucket(result); - event.setResult(Event.Result.ALLOW); - } - - @SubscribeEvent - public void harvestEvent(PlayerEvent.HarvestCheck event) - { - IBlockState state = event.getTargetBlock(); - Block block = state.getBlock(); - if (block != null && block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && event.getEntityPlayer().getActiveItemStack() != null && event.getEntityPlayer().getActiveItemStack().getItem() instanceof ItemAltarMaker) - { - ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getActiveItemStack().getItem(); - ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.BloodMagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); - } - } - - @SubscribeEvent - public void onTelepose(TeleposeEvent event) - { - if (ConfigHandler.teleposerBlacklist.contains(event.initialStack) || ConfigHandler.teleposerBlacklist.contains(event.finalStack)) - event.setCanceled(true); - - if (BloodMagicAPI.getTeleposerBlacklist().contains(event.initialStack) || BloodMagicAPI.getTeleposerBlacklist().contains(event.finalStack)) - event.setCanceled(true); - } - - @SubscribeEvent - public void onTeleposeEntity(TeleposeEvent.Ent event) - { - if (ConfigHandler.teleposerBlacklistEntity.contains(event.entity.getClass().getSimpleName())) - event.setCanceled(true); - } - - @SubscribeEvent - public void onTeleposeEntityPost(TeleposeEvent.Ent.Post event) - { - event.entity.timeUntilPortal = 5; - } - - @SubscribeEvent - public void onConfigChanged(ConfigChangedEvent event) - { - if (event.getModID().equals(Constants.Mod.MODID)) - ConfigHandler.syncConfig(); - } - - @SubscribeEvent - public void blockBreakEvent(BlockEvent.BreakEvent event) - { - EntityPlayer player = event.getPlayer(); - if (player != null) - { - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack != null && chestStack.getItem() instanceof ItemLivingArmour) - { - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - - if (armour != null) - { - StatTrackerDigging.incrementCounter(armour); - LivingArmourUpgradeDigging.hasDug(armour); - } - } - } - } - } - - @SubscribeEvent - public void onInteract(PlayerInteractEvent.RightClickItem event) - { - if (event.getWorld().isRemote) - return; - - EntityPlayer player = event.getEntityPlayer(); - - if (PlayerHelper.isFakePlayer(player)) - return; - - ItemStack held = event.getItemStack(); - if (held != null && held.getItem() instanceof IBindable) - { - held = NBTHelper.checkNBT(held); - IBindable bindable = (IBindable) held.getItem(); - if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) - { - if (bindable.onBind(player, held)) - { - String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - ItemBindEvent toPost = new ItemBindEvent(player, uuid, held); - if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY) - return; - - BindableHelper.setItemOwnerUUID(held, uuid); - BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); - } - } else if (bindable.getOwnerUUID(held).equals(PlayerHelper.getUUIDFromPlayer(player).toString()) && !bindable.getOwnerName(held).equals(player.getDisplayNameString())) - BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); - } - - if (held != null && held.getItem() instanceof IBloodOrb) - { - held = NBTHelper.checkNBT(held); - IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - if (bloodOrb.getOrbLevel(held.getItemDamage()) > network.getOrbTier()) - network.setOrbTier(bloodOrb.getOrbLevel(held.getItemDamage())); - } - } - - @SubscribeEvent - public void selfSacrificeEvent(SacrificeKnifeUsedEvent event) - { - EntityPlayer player = event.player; - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.selfSacrifice", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) - { - double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); - - event.lpAdded = (int) (event.lpAdded * (1 + modifier)); - } - } - } - } - - @SubscribeEvent - public void onEntityHealed(LivingHealEvent event) - { - EntityLivingBase healedEntity = event.getEntityLiving(); - if (!(healedEntity instanceof EntityPlayer)) - { - return; - } - - EntityPlayer player = (EntityPlayer) healedEntity; - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); - if (player.worldObj.canSeeSky(player.getPosition()) && player.worldObj.provider.isDaytime()) - { - StatTrackerSolarPowered.incrementCounter(armour, event.getAmount()); - } - } - } - } - - private static float lastPlayerSwingStrength = 0; - - @SubscribeEvent - public void onLivingAttack(AttackEntityEvent event) - { - lastPlayerSwingStrength = event.getEntityPlayer().getCooledAttackStrength(0); - } - - @SubscribeEvent - public void onEntityAttacked(LivingHurtEvent event) - { - DamageSource source = event.getSource(); - Entity sourceEntity = event.getSource().getEntity(); - EntityLivingBase attackedEntity = event.getEntityLiving(); - - if (attackedEntity instanceof EntityPlayer) - { - EntityPlayer attackedPlayer = (EntityPlayer) attackedEntity; - - // Living Armor Handling - if (LivingArmour.hasFullSet(attackedPlayer)) - { - float amount = Math.min(Utils.getModifiedDamage(attackedPlayer, event.getSource(), event.getAmount()), attackedPlayer.getHealth()); - ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) - { - // Add resistance to the upgrade that protects against non-magic damage - StatTrackerPhysicalProtect.incrementCounter(armour, amount); - } - - if (source.equals(DamageSource.fall)) - { - StatTrackerFallProtect.incrementCounter(armour, amount); - } - - if (source.isProjectile()) - { - StatTrackerArrowProtect.incrementCounter(armour, amount); - } - } - } else - { - ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (chestStack != null && chestStack.getItem() instanceof ItemSentientArmour) - { - ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); - armour.onPlayerAttacked(chestStack, source, attackedPlayer); - } - } - } - - if (sourceEntity instanceof EntitySentientArrow) - { - // Soul Weapon handling - ((EntitySentientArrow) sourceEntity).reimbursePlayer(); - } - - if (sourceEntity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) sourceEntity; - - // Living Armor Handling - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - ItemStack mainWeapon = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); - - event.setAmount((float) (event.getAmount() + lastPlayerSwingStrength * armour.getAdditionalDamageOnHit(event.getAmount(), player, attackedEntity, mainWeapon))); - - float amount = Math.min(Utils.getModifiedDamage(attackedEntity, event.getSource(), event.getAmount()), attackedEntity.getHealth()); - - if (!source.isProjectile()) - { - StatTrackerMeleeDamage.incrementCounter(armour, amount); - - if (mainWeapon != null && mainWeapon.getItem() instanceof ItemSpade) - { - StatTrackerGraveDigger.incrementCounter(armour, amount); - } - - if (player.isSprinting()) - { - StatTrackerSprintAttack.incrementCounter(armour, amount); - } - - boolean isCritical = lastPlayerSwingStrength > 0.9 && player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(MobEffects.BLINDNESS) && !player.isRiding() && !player.isSprinting(); - if (isCritical) - { - StatTrackerCriticalStrike.incrementCounter(armour, amount); - } - - double kb = armour.getKnockbackOnHit(player, attackedEntity, mainWeapon); - if (kb > 0) - { - ((EntityLivingBase) attackedEntity).knockBack(player, (float) kb * 0.5F, (double) MathHelper.sin(player.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(player.rotationYaw * 0.017453292F))); - } - } - } - } - } - } - - @SubscribeEvent - public void onArrowFire(ArrowLooseEvent event) - { - World world = event.getEntityPlayer().worldObj; - ItemStack stack = event.getBow(); - EntityPlayer player = event.getEntityPlayer(); - - if (world.isRemote) - { - return; - } - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - StatTrackerArrowShot.incrementCounter(armour); - - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) - { - int i = event.getCharge(); - float f = (float) i / 20.0F; - f = (f * f + f * 2.0F) / 3.0F; - - if ((double) f < 0.1D) - { - return; - } - - if (f > 1.0F) - { - f = 1.0F; - } - - int numberExtra = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < numberExtra; n++) - { - ItemStack arrowStack = new ItemStack(Items.ARROW); - ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); - EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); - entityarrow.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, f * 3.0F, 1.0F); - - float velocityModifier = 0.6f * f; - - entityarrow.motionX += (random.nextDouble() - 0.5) * velocityModifier; - entityarrow.motionY += (random.nextDouble() - 0.5) * velocityModifier; - entityarrow.motionZ += (random.nextDouble() - 0.5) * velocityModifier; - - if (f == 1.0F) - { - entityarrow.setIsCritical(true); - } - - int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack); - - if (j > 0) - { - entityarrow.setDamage(entityarrow.getDamage() + (double) j * 0.5D + 0.5D); - } - - int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - - if (k > 0) - { - entityarrow.setKnockbackStrength(k); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - { - entityarrow.setFire(100); - } - - if (true) - { - entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; - } - - world.spawnEntityInWorld(entityarrow); - } - } - } - } - } - - @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) - { - EntityLivingBase attackedEntity = event.getEntityLiving(); - DamageSource source = event.getSource(); - Entity entity = source.getEntity(); - - if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL)) - { - PotionEffect eff = attackedEntity.getActivePotionEffect(ModPotions.soulSnare); - int lvl = eff.getAmplifier(); - - double amountOfSouls = random.nextDouble() * (lvl + 1) * (lvl + 1) * 5; - ItemStack soulStack = ((IDemonWill) ModItems.monsterSoul).createWill(0, amountOfSouls); - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); - } - - if (entity != null && entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) entity; - ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack != null && heldStack.getItem() instanceof IDemonWillWeapon && !player.worldObj.isRemote) - { - IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); - List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); - if (!droppedSouls.isEmpty()) - { - ItemStack remainder; - for (ItemStack willStack : droppedSouls) - { - remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); - if (remainder != null && ((IDemonWill) remainder.getItem()).getWill(remainder) >= 0.0001) - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); - } - player.inventoryContainer.detectAndSendChanges(); - } - } - - if (heldStack != null && heldStack.getItem() == ModItems.boundSword && !(attackedEntity instanceof EntityAnimal)) - for (int i = 0; i <= EnchantmentHelper.getLootingModifier(player); i++) - if (this.random.nextDouble() < 0.2) - event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(ModItems.bloodShard, 1, 0))); - } - } - - @SubscribeEvent - public void onItemPickup(EntityItemPickupEvent event) - { - ItemStack stack = event.getItem().getEntityItem(); - if (stack != null && stack.getItem() instanceof IDemonWill) - { - EntityPlayer player = event.getEntityPlayer(); - - ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack); - - if (remainder == null || ((IDemonWill) stack.getItem()).getWill(stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(EnumDemonWillType.DEFAULT, player)) - { - stack.stackSize = 0; - event.setResult(Result.ALLOW); - } - } - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onExperiencePickup(PlayerPickupXpEvent event) - { - EntityPlayer player = event.getEntityPlayer(); - - if (LivingArmour.hasFullSet(player)) - { - ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); - if (armour != null) - { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.experienced", chestStack); - if (upgrade instanceof LivingArmourUpgradeExperience) - { - double modifier = ((LivingArmourUpgradeExperience) upgrade).getExperienceModifier(); - - double exp = event.getOrb().xpValue * (1 + modifier); - - event.getOrb().xpValue = (int) Math.floor(exp) + (Math.random() < exp % 1 ? 1 : 0); - } - - StatTrackerExperience.incrementCounter(armour, event.getOrb().xpValue); - } - } - - ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - - if (itemstack != null && itemstack.isItemDamaged()) - { - int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); - event.getOrb().xpValue -= durabilityToXp(i); - itemstack.setItemDamage(itemstack.getItemDamage() - i); - } - - if (!player.worldObj.isRemote) - { - for (ItemStack stack : player.inventory.mainInventory) - { - if (stack != null && stack.getItem() instanceof ItemExperienceBook) - { - ItemExperienceBook.addExperience(stack, event.getOrb().xpValue); - event.getOrb().xpValue = 0; - break; - } - } - } - } - - private int xpToDurability(int xp) - { - return xp * 2; - } - - private int durabilityToXp(int durability) - { - return durability / 2; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java similarity index 96% rename from src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java rename to src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java index 123dcbf2..b5567234 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java @@ -1,5 +1,6 @@ -package WayofTime.bloodmagic.util.handler; +package WayofTime.bloodmagic.util.handler.event; +import WayofTime.bloodmagic.annot.Handler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.AreaDescriptor; @@ -27,15 +28,16 @@ import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; import java.util.List; -public class ClientEventHandler +@Handler +@SideOnly(Side.CLIENT) +public class ClientHandler { - public static int currentLP = 0; - public static int capacity = 0; - public TextureAtlasSprite ritualStoneBlank; public TextureAtlasSprite ritualStoneWater; public TextureAtlasSprite ritualStoneFire; diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java new file mode 100644 index 00000000..b7063808 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java @@ -0,0 +1,114 @@ +package WayofTime.bloodmagic.util.handler.event; + +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.AltarCraftedEvent; +import WayofTime.bloodmagic.api.iface.IUpgradeTrainer; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.util.helper.ItemHelper; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.item.ItemInscriptionTool; +import WayofTime.bloodmagic.registry.ModItems; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.AnvilUpdateEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.util.ArrayList; +import java.util.List; + +@Handler +public class CraftingHandler { + + // Sets the uses of crafted Inscription Tools to 10 + @SubscribeEvent + public void onAltarCrafted(AltarCraftedEvent event) + { + if (event.getOutput() == null) + { + return; + } + + if (event.getOutput().getItem() instanceof ItemInscriptionTool) + { + NBTHelper.checkNBT(event.getOutput()); + event.getOutput().getTagCompound().setInteger(Constants.NBT.USES, 10); + } + } + + // Handles crafting of: Revealing Upgrade Tome, Elytra Upgrade Tome, Combining Upgrade Tomes, Setting Upgrade for Trainer + @SubscribeEvent + public void onAnvil(AnvilUpdateEvent event) + { + if (ConfigHandler.thaumcraftGogglesUpgrade) + { + if (event.getLeft().getItem() == ModItems.livingArmourHelmet && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) + { + ItemStack output = new ItemStack(ModItems.upgradeTome); + output = NBTHelper.checkNBT(output); + ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.revealing"); + ItemHelper.LivingUpgrades.setLevel(output, 1); + event.setCost(1); + + event.setOutput(output); + + return; + } + } + + if (event.getLeft().getItem() == Items.BOOK && event.getRight().getItem() == Items.ELYTRA && !event.getRight().isItemDamaged()) + { + ItemStack output = new ItemStack(ModItems.upgradeTome); + output = NBTHelper.checkNBT(output); + ItemHelper.LivingUpgrades.setKey(output, Constants.Mod.MODID + ".upgrade.elytra"); + ItemHelper.LivingUpgrades.setLevel(output, 1); + event.setCost(30); + + event.setOutput(output); + + return; + } + + if (event.getLeft().getItem() == ModItems.upgradeTome && event.getRight().getItem() == ModItems.upgradeTome) + { + LivingArmourUpgrade leftUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getLeft()); + if (leftUpgrade != null && ItemHelper.LivingUpgrades.getKey(event.getLeft()).equals(ItemHelper.LivingUpgrades.getKey(event.getRight()))) + { + int leftLevel = ItemHelper.LivingUpgrades.getLevel(event.getLeft()); + int rightLevel = ItemHelper.LivingUpgrades.getLevel(event.getRight()); + + if (leftLevel == rightLevel && leftLevel < leftUpgrade.getMaxTier() - 1) + { + ItemStack outputStack = event.getLeft().copy(); + ItemHelper.LivingUpgrades.setLevel(outputStack, leftLevel + 1); + event.setCost(leftLevel + 2); + + event.setOutput(outputStack); + + return; + } + } + } + + if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == ModItems.upgradeTome) + { + LivingArmourUpgrade rightUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getRight()); + if (rightUpgrade != null) + { + String key = ItemHelper.LivingUpgrades.getKey(event.getRight()); + ItemStack outputStack = event.getLeft().copy(); + List keyList = new ArrayList(); + keyList.add(key); + if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList)) + { + event.setCost(1); + + event.setOutput(outputStack); + + return; + } + } + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java new file mode 100644 index 00000000..850ef14a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -0,0 +1,274 @@ +package WayofTime.bloodmagic.util.handler.event; + +import WayofTime.bloodmagic.annot.Handler; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Enchantments; +import net.minecraft.init.Items; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.FillBucketEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.Event.Result; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.BloodMagicAPI; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.ItemBindEvent; +import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent; +import WayofTime.bloodmagic.api.event.TeleposeEvent; +import WayofTime.bloodmagic.api.iface.IBindable; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.api.network.SoulNetwork; +import WayofTime.bloodmagic.api.orb.IBloodOrb; +import WayofTime.bloodmagic.api.util.helper.*; +import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.item.ItemAltarMaker; +import WayofTime.bloodmagic.item.ItemExperienceBook; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSelfSacrifice; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; +import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.helper.TextHelper; + +import com.google.common.base.Strings; + +@Handler +public class GenericHandler +{ + @SubscribeEvent + public void onEntityHurt(LivingHurtEvent event) + { + if (event.getEntity().worldObj.isRemote) + return; + + if (event.getSource().getEntity() instanceof EntityPlayer && !PlayerHelper.isFakePlayer((EntityPlayer) event.getSource().getEntity())) + { + EntityPlayer player = (EntityPlayer) event.getSource().getEntity(); + + if (player.getItemStackFromSlot(EntityEquipmentSlot.CHEST) != null && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem() instanceof ItemPackSacrifice) + { + ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EntityEquipmentSlot.CHEST).getItem(); + + boolean shouldSyphon = pack.getStoredLP(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) < pack.CAPACITY; + float damageDone = event.getEntityLiving().getHealth() < event.getAmount() ? event.getAmount() - event.getEntityLiving().getHealth() : event.getAmount(); + int totalLP = Math.round(damageDone * ConfigHandler.sacrificialPackConversion); + + if (shouldSyphon) + ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EntityEquipmentSlot.CHEST), totalLP, pack.CAPACITY); + } + } + } + + @SubscribeEvent + public void onBucketFill(FillBucketEvent event) + { + if (event.getEmptyBucket().getItem() != Items.BUCKET) + return; + + ItemStack result = null; + + if (event.getTarget() == null || event.getTarget().getBlockPos() == null) + { + return; + } + + Block block = event.getWorld().getBlockState(event.getTarget().getBlockPos()).getBlock(); + + if (block != null && (block.equals(ModBlocks.lifeEssence)) && block.getMetaFromState(event.getWorld().getBlockState(event.getTarget().getBlockPos())) == 0) + { + event.getWorld().setBlockToAir(event.getTarget().getBlockPos()); + result = new ItemStack(ModItems.bucketEssence); + } + + if (result == null) + return; + + event.setFilledBucket(result); + event.setResult(Event.Result.ALLOW); + } + + // Handles destroying altar + @SubscribeEvent + public void harvestEvent(PlayerEvent.HarvestCheck event) + { + IBlockState state = event.getTargetBlock(); + Block block = state.getBlock(); + if (block != null && block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof EntityPlayerMP && event.getEntityPlayer().getHeldItemMainhand() != null && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) + { + ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); + ChatUtil.sendNoSpam(event.getEntityPlayer(), TextHelper.localizeEffect("chat.BloodMagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer()))); + } + } + + // Handle Teleposer block blacklist + @SubscribeEvent + public void onTelepose(TeleposeEvent event) + { + if (ConfigHandler.teleposerBlacklist.contains(event.initialStack) || ConfigHandler.teleposerBlacklist.contains(event.finalStack)) + event.setCanceled(true); + + if (BloodMagicAPI.getTeleposerBlacklist().contains(event.initialStack) || BloodMagicAPI.getTeleposerBlacklist().contains(event.finalStack)) + event.setCanceled(true); + } + + // Handle Teleposer entity blacklist + @SubscribeEvent + public void onTeleposeEntity(TeleposeEvent.Ent event) + { + if (ConfigHandler.teleposerBlacklistEntity.contains(event.entity.getClass().getSimpleName())) + event.setCanceled(true); + } + + // Sets teleport cooldown for Teleposed entities to 5 ticks (1/4 second) instead of 150 (7.5 seconds) + @SubscribeEvent + public void onTeleposeEntityPost(TeleposeEvent.Ent.Post event) + { + event.entity.timeUntilPortal = 5; + } + + // Handles binding of IBindable's as well as setting a player's highest orb tier + @SubscribeEvent + public void onInteract(PlayerInteractEvent.RightClickItem event) + { + if (event.getWorld().isRemote) + return; + + EntityPlayer player = event.getEntityPlayer(); + + if (PlayerHelper.isFakePlayer(player)) + return; + + ItemStack held = event.getItemStack(); + if (held != null && held.getItem() instanceof IBindable) + { + held = NBTHelper.checkNBT(held); + IBindable bindable = (IBindable) held.getItem(); + if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) + { + if (bindable.onBind(player, held)) + { + String uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); + ItemBindEvent toPost = new ItemBindEvent(player, uuid, held); + if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY) + return; + + BindableHelper.setItemOwnerUUID(held, uuid); + BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); + } + } else if (bindable.getOwnerUUID(held).equals(PlayerHelper.getUUIDFromPlayer(player).toString()) && !bindable.getOwnerName(held).equals(player.getDisplayNameString())) + BindableHelper.setItemOwnerName(held, player.getDisplayNameString()); + } + + if (held != null && held.getItem() instanceof IBloodOrb) + { + held = NBTHelper.checkNBT(held); + IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); + SoulNetwork network = NetworkHelper.getSoulNetwork(player); + + if (bloodOrb.getOrbLevel(held.getItemDamage()) > network.getOrbTier()) + network.setOrbTier(bloodOrb.getOrbLevel(held.getItemDamage())); + } + } + + @SubscribeEvent + public void selfSacrificeEvent(SacrificeKnifeUsedEvent event) + { + EntityPlayer player = event.player; + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.selfSacrifice", chestStack); + + if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) + { + double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); + + event.lpAdded = (int) (event.lpAdded * (1 + modifier)); + } + } + } + } + + // Drop Blood Shards + @SubscribeEvent + public void onLivingDrops(LivingDropsEvent event) + { + EntityLivingBase attackedEntity = event.getEntityLiving(); + DamageSource source = event.getSource(); + Entity entity = source.getEntity(); + + if (entity != null && entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + ItemStack heldStack = player.getHeldItemMainhand(); + + if (heldStack != null && heldStack.getItem() == ModItems.boundSword && !(attackedEntity instanceof EntityAnimal)) + for (int i = 0; i <= EnchantmentHelper.getLootingModifier(player); i++) + if (attackedEntity.getEntityWorld().rand.nextDouble() < 0.2) + event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(ModItems.bloodShard, 1, 0))); + } + } + + // Experience Tome + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onExperiencePickup(PlayerPickupXpEvent event) + { + EntityPlayer player = event.getEntityPlayer(); + ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); + + if (itemstack != null && itemstack.isItemDamaged()) + { + int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); + event.getOrb().xpValue -= durabilityToXp(i); + itemstack.setItemDamage(itemstack.getItemDamage() - i); + } + + if (!player.worldObj.isRemote) + { + for (ItemStack stack : player.inventory.mainInventory) + { + if (stack != null && stack.getItem() instanceof ItemExperienceBook) + { + ItemExperienceBook.addExperience(stack, event.getOrb().xpValue); + event.getOrb().xpValue = 0; + break; + } + } + } + } + + private int xpToDurability(int xp) + { + return xp * 2; + } + + private int durabilityToXp(int durability) + { + return durability / 2; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java new file mode 100644 index 00000000..c18aae56 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java @@ -0,0 +1,229 @@ +package WayofTime.bloodmagic.util.handler.event; + +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowShot; +import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGrimReaperSprint; +import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; +import WayofTime.bloodmagic.livingArmour.upgrade.*; +import WayofTime.bloodmagic.registry.ModPotions; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Enchantments; +import net.minecraft.init.Items; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +@Handler +public class LivingArmourHandler { + + // Applies: Grim Reaper + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onEntityDeath(LivingDeathEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + StatTrackerGrimReaperSprint.incrementCounter(armour); + + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.grimReaper", chestStack); + + if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) + { + ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); + event.setCanceled(true); + event.setResult(Event.Result.DENY); + } + + armour.writeDirtyToNBT(ItemLivingArmour.getArmourTag(chestStack)); + } + } + } + } + + // Applies: Jump + @SubscribeEvent + public void onJumpEvent(LivingEvent.LivingJumpEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + StatTrackerJump.incrementCounter(armour); + + if (!player.isSneaking()) + { + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.jump", chestStack); + + if (upgrade instanceof LivingArmourUpgradeJump) + { + player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); + } + } + } + } + } + } + + // Applies: Step Assist, Speed Boost + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onEntityUpdate(LivingEvent.LivingUpdateEvent event) + { + if (event.getEntityLiving() instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + if (event.getEntityLiving().isPotionActive(ModPotions.boost)) + { + player.stepHeight = 1.0f; + } else + { + boolean hasAssist = false; + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); + if (armour != null) + { + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.stepAssist", chestStack); + + if (upgrade instanceof LivingArmourUpgradeStepAssist) + { + player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); + hasAssist = true; + } + } + } + + if (!hasAssist) + player.stepHeight = 0.6f; + } + + float percentIncrease = 0; + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); + if (armour != null) + { + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.movement", chestStack); + + if (upgrade instanceof LivingArmourUpgradeSpeed) + { + percentIncrease += 0.1f * ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); + } + } + } + + if (event.getEntityLiving().isPotionActive(ModPotions.boost)) + { + int i = event.getEntityLiving().getActivePotionEffect(ModPotions.boost).getAmplifier(); + { + percentIncrease += (i + 1) * 0.05f; + } + } + + if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && player.moveForward > 0F) + { + player.moveRelative(0F, 1F, player.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease); + } + } + } + + // Applies: Arrow Shot + // Tracks: Arrow Shot + @SubscribeEvent + public void onArrowFire(ArrowLooseEvent event) + { + World world = event.getEntityPlayer().worldObj; + ItemStack stack = event.getBow(); + EntityPlayer player = event.getEntityPlayer(); + + if (world.isRemote) + return; + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + StatTrackerArrowShot.incrementCounter(armour); + + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.arrowShot", chestStack); + if (upgrade instanceof LivingArmourUpgradeArrowShot) + { + int charge = event.getCharge(); + float velocity = (float) charge / 20.0F; + velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; + + if ((double) velocity < 0.1D) + return; + + if (velocity > 1.0F) + velocity = 1.0F; + + int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); + for (int n = 0; n < extraArrows; n++) + { + ItemStack arrowStack = new ItemStack(Items.ARROW); + ItemArrow itemarrow = (ItemArrow) ((stack.getItem() instanceof ItemArrow ? arrowStack.getItem() : Items.ARROW)); + EntityArrow entityarrow = itemarrow.createArrow(world, arrowStack, player); + entityarrow.setAim(player, player.rotationPitch, player.rotationYaw, 0.0F, velocity * 3.0F, 1.0F); + + float velocityModifier = 0.6f * velocity; + + entityarrow.motionX += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; + entityarrow.motionY += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; + entityarrow.motionZ += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; + + if (velocity == 1.0F) + entityarrow.setIsCritical(true); + + int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack); + + if (powerLevel > 0) + entityarrow.setDamage(entityarrow.getDamage() + (double) powerLevel * 0.5D + 0.5D); + + int punchLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); + + if (punchLevel > 0) + entityarrow.setKnockbackStrength(punchLevel); + + if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) + entityarrow.setFire(100); + + entityarrow.pickupStatus = EntityArrow.PickupStatus.CREATIVE_ONLY; + + world.spawnEntityInWorld(entityarrow); + } + } + } + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java new file mode 100644 index 00000000..19b0750a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java @@ -0,0 +1,195 @@ +package WayofTime.bloodmagic.util.handler.event; + +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.item.armour.ItemSentientArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import WayofTime.bloodmagic.livingArmour.tracker.*; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; +import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.event.entity.living.LivingHealEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +@Handler +public class StatTrackerHandler { + + private static float lastPlayerSwingStrength = 0; + + // Tracks: Digging + @SubscribeEvent + public void blockBreakEvent(BlockEvent.BreakEvent event) + { + EntityPlayer player = event.getPlayer(); + if (player != null) + { + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + if (chestStack != null && chestStack.getItem() instanceof ItemLivingArmour) + { + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + + if (armour != null) + { + StatTrackerDigging.incrementCounter(armour); + LivingArmourUpgradeDigging.hasDug(armour); + } + } + } + } + } + + // Tracks: Health Boost + @SubscribeEvent + public void onEntityHealed(LivingHealEvent event) + { + EntityLivingBase healedEntity = event.getEntityLiving(); + if (!(healedEntity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer player = (EntityPlayer) healedEntity; + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); + if (player.worldObj.canSeeSky(player.getPosition()) && player.worldObj.provider.isDaytime()) + { + StatTrackerSolarPowered.incrementCounter(armour, event.getAmount()); + } + } + } + } + + @SubscribeEvent + public void onLivingAttack(AttackEntityEvent event) + { + lastPlayerSwingStrength = event.getEntityPlayer().getCooledAttackStrength(0); + } + + // Tracks: Fall Protect, Arrow Protect, Physical Protect, Grave Digger, Sprint Attack, Critical Strike, + @SubscribeEvent + public void entityHurt(LivingHurtEvent event) { + DamageSource source = event.getSource(); + Entity sourceEntity = event.getSource().getEntity(); + EntityLivingBase attackedEntity = event.getEntityLiving(); + + if (attackedEntity instanceof EntityPlayer) + { + EntityPlayer attackedPlayer = (EntityPlayer) attackedEntity; + + // Living Armor Handling + if (LivingArmour.hasFullSet(attackedPlayer)) + { + float amount = Math.min(Utils.getModifiedDamage(attackedPlayer, event.getSource(), event.getAmount()), attackedPlayer.getHealth()); + ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) + StatTrackerPhysicalProtect.incrementCounter(armour, amount); + + if (source.equals(DamageSource.fall)) + StatTrackerFallProtect.incrementCounter(armour, amount); + + if (source.isProjectile()) + StatTrackerArrowProtect.incrementCounter(armour, amount); + } + } else + { + ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + if (chestStack != null && chestStack.getItem() instanceof ItemSentientArmour) + { + ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); + armour.onPlayerAttacked(chestStack, source, attackedPlayer); + } + } + } + + if (sourceEntity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) sourceEntity; + + // Living Armor Handling + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) { + ItemStack mainWeapon = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND); + + event.setAmount((float) (event.getAmount() + lastPlayerSwingStrength * armour.getAdditionalDamageOnHit(event.getAmount(), player, attackedEntity, mainWeapon))); + + float amount = Math.min(Utils.getModifiedDamage(attackedEntity, event.getSource(), event.getAmount()), attackedEntity.getHealth()); + + if (!source.isProjectile()) + { + StatTrackerMeleeDamage.incrementCounter(armour, amount); + + if (mainWeapon != null && mainWeapon.getItem() instanceof ItemSpade) + StatTrackerGraveDigger.incrementCounter(armour, amount); + + if (player.isSprinting()) + StatTrackerSprintAttack.incrementCounter(armour, amount); + + boolean isCritical = lastPlayerSwingStrength > 0.9 && player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(MobEffects.BLINDNESS) && !player.isRiding() && !player.isSprinting(); + if (isCritical) + StatTrackerCriticalStrike.incrementCounter(armour, amount); + + double kb = armour.getKnockbackOnHit(player, attackedEntity, mainWeapon); + if (kb > 0) + attackedEntity.knockBack(player, (float) kb * 0.5F, (double) MathHelper.sin(player.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(player.rotationYaw * 0.017453292F))); + } + } + } + } + } + + // Tracks: Experienced + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onExperiencePickup(PlayerPickupXpEvent event) + { + EntityPlayer player = event.getEntityPlayer(); + + if (LivingArmour.hasFullSet(player)) + { + ItemStack chestStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack); + if (armour != null) + { + LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.experienced", chestStack); + if (upgrade instanceof LivingArmourUpgradeExperience) + { + double modifier = ((LivingArmourUpgradeExperience) upgrade).getExperienceModifier(); + double exp = event.getOrb().xpValue * (1 + modifier); + + event.getOrb().xpValue = (int) Math.floor(exp) + (Math.random() < exp % 1 ? 1 : 0); + } + + StatTrackerExperience.incrementCounter(armour, event.getOrb().xpValue); + } + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java new file mode 100644 index 00000000..e6baf03a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -0,0 +1,172 @@ +package WayofTime.bloodmagic.util.handler.event; + +import WayofTime.bloodmagic.annot.Handler; +import WayofTime.bloodmagic.api.soul.*; +import WayofTime.bloodmagic.demonAura.PosXY; +import WayofTime.bloodmagic.demonAura.WillChunk; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; +import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; +import WayofTime.bloodmagic.registry.ModItems; +import WayofTime.bloodmagic.registry.ModPotions; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.EnumDifficulty; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +@Handler +public class WillHandler { + + private final HashMap serverTicks = new HashMap(); + + // Adds Will to player + @SubscribeEvent + public void onItemPickup(EntityItemPickupEvent event) { + ItemStack stack = event.getItem().getEntityItem(); + if (stack != null && stack.getItem() instanceof IDemonWill) { + EntityPlayer player = event.getEntityPlayer(); + + ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack); + + if (remainder == null || ((IDemonWill) stack.getItem()).getWill(stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(EnumDemonWillType.DEFAULT, player)) { + stack.stackSize = 0; + event.setResult(Event.Result.ALLOW); + } + } + } + + @SubscribeEvent + public void onEntityAttacked(LivingHurtEvent event) + { + Entity sourceEntity = event.getSource().getEntity(); + + if (sourceEntity instanceof EntitySentientArrow) + ((EntitySentientArrow) sourceEntity).reimbursePlayer(); + } + + // Add/Drop Demon Will for Player + @SubscribeEvent + public void onLivingDrops(LivingDropsEvent event) + { + EntityLivingBase attackedEntity = event.getEntityLiving(); + DamageSource source = event.getSource(); + Entity entity = source.getEntity(); + + if (attackedEntity.isPotionActive(ModPotions.soulSnare) && (attackedEntity instanceof EntityMob || attackedEntity.worldObj.getDifficulty() == EnumDifficulty.PEACEFUL)) + { + PotionEffect eff = attackedEntity.getActivePotionEffect(ModPotions.soulSnare); + int lvl = eff.getAmplifier(); + + double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5; + ItemStack soulStack = ((IDemonWill) ModItems.monsterSoul).createWill(0, amountOfSouls); + event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); + } + + if (entity != null && entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + ItemStack heldStack = player.getHeldItemMainhand(); + if (heldStack != null && heldStack.getItem() instanceof IDemonWillWeapon && !player.worldObj.isRemote) + { + IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); + List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); + if (!droppedSouls.isEmpty()) + { + ItemStack remainder; + for (ItemStack willStack : droppedSouls) + { + remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); + if (remainder != null && ((IDemonWill) remainder.getItem()).getWill(remainder) >= 0.0001) + event.getDrops().add(new EntityItem(attackedEntity.worldObj, attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); + } + player.inventoryContainer.detectAndSendChanges(); + } + } + } + } + + @SubscribeEvent + public void onServerWorldTick(TickEvent.WorldTickEvent event) + { + if (event.world.isRemote) + return; + + int dim = event.world.provider.getDimension(); + if (event.phase == TickEvent.Phase.END) + { + if (!this.serverTicks.containsKey(dim)) + this.serverTicks.put(dim, 0); + + int ticks = (this.serverTicks.get(dim)); + + if (ticks % 20 == 0) + { + CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(dim); + if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) + { + for (PosXY pos : dirtyChunks) + event.world.markChunkDirty(new BlockPos(pos.x * 16, 5, pos.y * 16), null); + + dirtyChunks.clear(); + } + } + + this.serverTicks.put(dim, ticks + 1); + } + + } + + @SubscribeEvent + public void chunkSave(ChunkDataEvent.Save event) + { + int dim = event.getWorld().provider.getDimension(); + ChunkPos loc = event.getChunk().getChunkCoordIntPair(); + + NBTTagCompound nbt = new NBTTagCompound(); + event.getData().setTag("BloodMagic", nbt); + + WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.chunkXPos, loc.chunkZPos); + if (ac != null) + { + nbt.setShort("base", ac.getBase()); + ac.getCurrentWill().writeToNBT(nbt, "current"); + if (!event.getChunk().isLoaded()) + WorldDemonWillHandler.removeWillChunk(dim, loc.chunkXPos, loc.chunkZPos); + } + } + + @SubscribeEvent + public void chunkLoad(ChunkDataEvent.Load event) + { + int dim = event.getWorld().provider.getDimension(); + if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) + { + NBTTagCompound nbt = event.getData().getCompoundTag("BloodMagic"); + short base = nbt.getShort("base"); + DemonWillHolder current = new DemonWillHolder(); + current.readFromNBT(nbt, "current"); + WorldDemonWillHandler.addWillChunk(dim, event.getChunk(), base, current); + } else + { + WorldDemonWillHandler.generateWill(event.getChunk()); + } + } +}