Split EventHandler into multiple different handlers
Better organization allows for finding things easier
This commit is contained in:
parent
6e1383c6e0
commit
512600a677
|
@ -1,5 +1,6 @@
|
||||||
package WayofTime.bloodmagic;
|
package WayofTime.bloodmagic;
|
||||||
|
|
||||||
|
import WayofTime.bloodmagic.annot.Handler;
|
||||||
import WayofTime.bloodmagic.api.Constants;
|
import WayofTime.bloodmagic.api.Constants;
|
||||||
import WayofTime.bloodmagic.api.util.helper.LogHelper;
|
import WayofTime.bloodmagic.api.util.helper.LogHelper;
|
||||||
import WayofTime.bloodmagic.client.gui.GuiHandler;
|
import WayofTime.bloodmagic.client.gui.GuiHandler;
|
||||||
|
@ -8,6 +9,7 @@ import WayofTime.bloodmagic.compat.ICompatibility;
|
||||||
import WayofTime.bloodmagic.network.BloodMagicPacketHandler;
|
import WayofTime.bloodmagic.network.BloodMagicPacketHandler;
|
||||||
import WayofTime.bloodmagic.proxy.CommonProxy;
|
import WayofTime.bloodmagic.proxy.CommonProxy;
|
||||||
import WayofTime.bloodmagic.registry.*;
|
import WayofTime.bloodmagic.registry.*;
|
||||||
|
import WayofTime.bloodmagic.util.Utils;
|
||||||
import WayofTime.bloodmagic.util.handler.IMCHandler;
|
import WayofTime.bloodmagic.util.handler.IMCHandler;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.minecraft.creativetab.CreativeTabs;
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
|
@ -19,6 +21,7 @@ import net.minecraftforge.fml.common.event.*;
|
||||||
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
||||||
|
|
||||||
import java.io.File;
|
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")
|
@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
|
@Getter
|
||||||
|
@ -68,6 +71,7 @@ public class BloodMagic
|
||||||
ModCompatibility.loadCompat(ICompatibility.InitializationPhase.PRE_INIT);
|
ModCompatibility.loadCompat(ICompatibility.InitializationPhase.PRE_INIT);
|
||||||
ModTranquilityHandlers.init();
|
ModTranquilityHandlers.init();
|
||||||
|
|
||||||
|
Utils.registerHandlers(event.getAsmData().getAll(Handler.class.getCanonicalName()));
|
||||||
proxy.preInit();
|
proxy.preInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package WayofTime.bloodmagic;
|
package WayofTime.bloodmagic;
|
||||||
|
|
||||||
|
import WayofTime.bloodmagic.annot.Handler;
|
||||||
import WayofTime.bloodmagic.api.BlockStack;
|
import WayofTime.bloodmagic.api.BlockStack;
|
||||||
import WayofTime.bloodmagic.api.BloodMagicAPI;
|
import WayofTime.bloodmagic.api.BloodMagicAPI;
|
||||||
import WayofTime.bloodmagic.api.Constants;
|
import WayofTime.bloodmagic.api.Constants;
|
||||||
|
@ -8,12 +9,15 @@ import lombok.Getter;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraftforge.common.config.Configuration;
|
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.fml.common.registry.ForgeRegistries;
|
||||||
import net.minecraftforge.oredict.OreDictionary;
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@Handler
|
||||||
public class ConfigHandler
|
public class ConfigHandler
|
||||||
{
|
{
|
||||||
@Getter
|
@Getter
|
||||||
|
@ -339,4 +343,11 @@ public class ConfigHandler
|
||||||
entitySacrificeValues.put(split[0], amount);
|
entitySacrificeValues.put(split[0], amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onConfigChanged(ConfigChangedEvent event)
|
||||||
|
{
|
||||||
|
if (event.getModID().equals(Constants.Mod.MODID))
|
||||||
|
ConfigHandler.syncConfig();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
8
src/main/java/WayofTime/bloodmagic/annot/Handler.java
Normal file
8
src/main/java/WayofTime/bloodmagic/annot/Handler.java
Normal file
|
@ -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 {
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package WayofTime.bloodmagic.api.util.helper;
|
||||||
import WayofTime.bloodmagic.api.Constants;
|
import WayofTime.bloodmagic.api.Constants;
|
||||||
import WayofTime.bloodmagic.api.event.ItemBindEvent;
|
import WayofTime.bloodmagic.api.event.ItemBindEvent;
|
||||||
import WayofTime.bloodmagic.api.iface.IBindable;
|
import WayofTime.bloodmagic.api.iface.IBindable;
|
||||||
|
import WayofTime.bloodmagic.util.handler.event.GenericHandler;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
|
@ -86,7 +87,7 @@ public class BindableHelper
|
||||||
* Deprecated.
|
* Deprecated.
|
||||||
*
|
*
|
||||||
* Now handled automatically with
|
* Now handled automatically with
|
||||||
* {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
* {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
||||||
*
|
*
|
||||||
* @param stack
|
* @param stack
|
||||||
* - The ItemStack to bind
|
* - The ItemStack to bind
|
||||||
|
@ -105,7 +106,7 @@ public class BindableHelper
|
||||||
* Deprecated.
|
* Deprecated.
|
||||||
*
|
*
|
||||||
* Now handled automatically with
|
* Now handled automatically with
|
||||||
* {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
* {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
||||||
*
|
*
|
||||||
* @param stack
|
* @param stack
|
||||||
* - The ItemStack to bind
|
* - The ItemStack to bind
|
||||||
|
@ -145,7 +146,7 @@ public class BindableHelper
|
||||||
* Deprecated.
|
* Deprecated.
|
||||||
*
|
*
|
||||||
* Now handled automatically with
|
* Now handled automatically with
|
||||||
* {@link WayofTime.bloodmagic.util.handler.EventHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
* {@link GenericHandler#onInteract(PlayerInteractEvent.RightClickItem)}
|
||||||
*
|
*
|
||||||
* @param stack
|
* @param stack
|
||||||
* - ItemStack to check
|
* - ItemStack to check
|
||||||
|
|
|
@ -14,7 +14,6 @@ public class WorldDemonWillHandler
|
||||||
{
|
{
|
||||||
static ConcurrentHashMap<Integer, WillWorld> containedWills = new ConcurrentHashMap<Integer, WillWorld>();
|
static ConcurrentHashMap<Integer, WillWorld> containedWills = new ConcurrentHashMap<Integer, WillWorld>();
|
||||||
public static ConcurrentHashMap<Integer, CopyOnWriteArrayList<PosXY>> dirtyChunks = new ConcurrentHashMap<Integer, CopyOnWriteArrayList<PosXY>>();
|
public static ConcurrentHashMap<Integer, CopyOnWriteArrayList<PosXY>> dirtyChunks = new ConcurrentHashMap<Integer, CopyOnWriteArrayList<PosXY>>();
|
||||||
public static ConcurrentHashMap<Integer, BlockPos> taintTrigger = new ConcurrentHashMap<Integer, BlockPos>();
|
|
||||||
|
|
||||||
public static WillWorld getWillWorld(int dim)
|
public static WillWorld getWillWorld(int dim)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,7 @@ import WayofTime.bloodmagic.tile.TileAlchemyArray;
|
||||||
import WayofTime.bloodmagic.tile.TileAltar;
|
import WayofTime.bloodmagic.tile.TileAltar;
|
||||||
import WayofTime.bloodmagic.tile.TileDemonCrucible;
|
import WayofTime.bloodmagic.tile.TileDemonCrucible;
|
||||||
import WayofTime.bloodmagic.tile.routing.TileRoutingNode;
|
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.InventoryRenderHelper;
|
||||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2;
|
import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
@ -61,7 +61,7 @@ public class ClientProxy extends CommonProxy
|
||||||
public void preInit()
|
public void preInit()
|
||||||
{
|
{
|
||||||
super.preInit();
|
super.preInit();
|
||||||
MinecraftForge.EVENT_BUS.register(new ClientEventHandler());
|
MinecraftForge.EVENT_BUS.register(new ClientHandler());
|
||||||
|
|
||||||
renderHelper = new InventoryRenderHelper(Constants.Mod.DOMAIN);
|
renderHelper = new InventoryRenderHelper(Constants.Mod.DOMAIN);
|
||||||
renderHelperV2 = new InventoryRenderHelperV2(Constants.Mod.DOMAIN);
|
renderHelperV2 = new InventoryRenderHelperV2(Constants.Mod.DOMAIN);
|
||||||
|
|
|
@ -10,7 +10,6 @@ import WayofTime.bloodmagic.api.ritual.CapabilityRuneType;
|
||||||
import WayofTime.bloodmagic.api.ritual.IRitualStone;
|
import WayofTime.bloodmagic.api.ritual.IRitualStone;
|
||||||
import WayofTime.bloodmagic.api.teleport.TeleportQueue;
|
import WayofTime.bloodmagic.api.teleport.TeleportQueue;
|
||||||
import WayofTime.bloodmagic.fuel.FuelHandler;
|
import WayofTime.bloodmagic.fuel.FuelHandler;
|
||||||
import WayofTime.bloodmagic.util.handler.EventHandler;
|
|
||||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
|
||||||
import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2;
|
import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2;
|
||||||
|
|
||||||
|
@ -29,7 +28,6 @@ public class CommonProxy
|
||||||
|
|
||||||
public void preInit()
|
public void preInit()
|
||||||
{
|
{
|
||||||
MinecraftForge.EVENT_BUS.register(new EventHandler());
|
|
||||||
MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance());
|
MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance());
|
||||||
GameRegistry.registerFuelHandler(new FuelHandler());
|
GameRegistry.registerFuelHandler(new FuelHandler());
|
||||||
registerRenderers();
|
registerRenderers();
|
||||||
|
|
|
@ -2,7 +2,9 @@ package WayofTime.bloodmagic.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import WayofTime.bloodmagic.BloodMagic;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockPortal;
|
import net.minecraft.block.BlockPortal;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
@ -29,11 +31,13 @@ import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.ISpecialArmor;
|
import net.minecraftforge.common.ISpecialArmor;
|
||||||
import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
|
import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
|
||||||
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.IFluidBlock;
|
import net.minecraftforge.fluids.IFluidBlock;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||||
|
import net.minecraftforge.fml.common.discovery.ASMDataTable;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import WayofTime.bloodmagic.api.BlockStack;
|
import WayofTime.bloodmagic.api.BlockStack;
|
||||||
|
@ -888,4 +892,17 @@ public class Utils
|
||||||
}
|
}
|
||||||
return largerStack ? stack : null;
|
return largerStack ? stack : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void registerHandlers(Set<ASMDataTable.ASMData> 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<Integer, Integer> serverTicks = new HashMap<Integer, Integer>();
|
|
||||||
|
|
||||||
@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<PosXY> 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<String> keyList = new ArrayList<String>();
|
|
||||||
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<ItemStack> 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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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.Constants;
|
||||||
import WayofTime.bloodmagic.api.registry.RitualRegistry;
|
import WayofTime.bloodmagic.api.registry.RitualRegistry;
|
||||||
import WayofTime.bloodmagic.api.ritual.AreaDescriptor;
|
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.client.event.TextureStitchEvent;
|
||||||
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
|
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
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 org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
import java.util.List;
|
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 ritualStoneBlank;
|
||||||
public TextureAtlasSprite ritualStoneWater;
|
public TextureAtlasSprite ritualStoneWater;
|
||||||
public TextureAtlasSprite ritualStoneFire;
|
public TextureAtlasSprite ritualStoneFire;
|
|
@ -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<String> keyList = new ArrayList<String>();
|
||||||
|
keyList.add(key);
|
||||||
|
if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList))
|
||||||
|
{
|
||||||
|
event.setCost(1);
|
||||||
|
|
||||||
|
event.setOutput(outputStack);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<Integer, Integer> serverTicks = new HashMap<Integer, Integer>();
|
||||||
|
|
||||||
|
// 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<ItemStack> 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<PosXY> 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue