BloodMagic/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java

166 lines
7.4 KiB
Java
Raw Normal View History

package WayofTime.bloodmagic.util.handler.event;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.api.soul.*;
2017-08-15 20:21:54 -07:00
import WayofTime.bloodmagic.core.RegistrarBloodMagic;
2017-08-15 21:30:48 -07:00
import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
import WayofTime.bloodmagic.demonAura.PosXY;
import WayofTime.bloodmagic.demonAura.WillChunk;
import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler;
import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow;
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.EntityDamageSourceIndirect;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.EnumDifficulty;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.event.world.ChunkDataEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
2017-08-15 21:30:48 -07:00
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@Mod.EventBusSubscriber
2017-08-15 21:30:48 -07:00
public class WillHandler {
private static final HashMap<Integer, Integer> SERVER_TICKS = new HashMap<Integer, Integer>();
// Adds Will to player
@SubscribeEvent
public static void onItemPickup(EntityItemPickupEvent event) {
ItemStack stack = event.getItem().getItem();
2017-08-15 21:30:48 -07:00
if (stack.getItem() instanceof IDemonWill) {
EntityPlayer player = event.getEntityPlayer();
EnumDemonWillType pickupType = ((IDemonWill) stack.getItem()).getType(stack);
ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack);
2017-08-15 21:30:48 -07:00
if (remainder == null || ((IDemonWill) stack.getItem()).getWill(pickupType, stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(pickupType, player)) {
2016-12-12 19:56:36 -08:00
stack.setCount(0);
event.setResult(Event.Result.ALLOW);
}
}
}
@SubscribeEvent
public static void onEntityAttacked(LivingDeathEvent event) {
2017-08-15 21:30:48 -07:00
if (event.getSource() instanceof EntityDamageSourceIndirect) {
Entity sourceEntity = event.getSource().getImmediateSource();
2017-08-15 21:30:48 -07:00
if (sourceEntity instanceof EntitySentientArrow) {
((EntitySentientArrow) sourceEntity).reimbursePlayer(event.getEntityLiving(), event.getEntityLiving().getMaxHealth());
}
}
}
// Add/Drop Demon Will for Player
@SubscribeEvent
public static void onLivingDrops(LivingDropsEvent event) {
EntityLivingBase attackedEntity = event.getEntityLiving();
DamageSource source = event.getSource();
Entity entity = source.getTrueSource();
2017-08-15 21:30:48 -07:00
if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof EntityMob || attackedEntity.getEntityWorld().getDifficulty() == EnumDifficulty.PEACEFUL)) {
2017-08-15 20:21:54 -07:00
PotionEffect eff = attackedEntity.getActivePotionEffect(RegistrarBloodMagic.SOUL_SNARE);
int lvl = eff.getAmplifier();
double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5;
ItemStack soulStack = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL).createWill(0, amountOfSouls);
2016-12-12 19:56:36 -08:00
event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack));
}
2017-08-15 21:30:48 -07:00
if (entity != null && entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
ItemStack heldStack = player.getHeldItemMainhand();
2017-08-15 21:30:48 -07:00
if (heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) {
IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem();
List<ItemStack> droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel());
2017-08-15 21:30:48 -07:00
if (!droppedSouls.isEmpty()) {
ItemStack remainder;
2017-08-15 21:30:48 -07:00
for (ItemStack willStack : droppedSouls) {
remainder = PlayerDemonWillHandler.addDemonWill(player, willStack);
2017-08-15 21:30:48 -07:00
if (!remainder.isEmpty()) {
EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder);
2017-08-15 21:30:48 -07:00
if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) {
2016-12-12 19:56:36 -08:00
event.getDrops().add(new EntityItem(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder));
}
}
}
player.inventoryContainer.detectAndSendChanges();
}
}
}
}
@SubscribeEvent
public static void onServerWorldTick(TickEvent.WorldTickEvent event) {
if (event.world.isRemote)
return;
int dim = event.world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (event.phase == TickEvent.Phase.END) {
if (!SERVER_TICKS.containsKey(dim))
SERVER_TICKS.put(dim, 0);
int ticks = (SERVER_TICKS.get(dim));
2017-08-15 21:30:48 -07:00
if (ticks % 20 == 0) {
CopyOnWriteArrayList<PosXY> dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(dim);
2017-08-15 21:30:48 -07:00
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();
}
}
SERVER_TICKS.put(dim, ticks + 1);
}
}
@SubscribeEvent
public static void chunkSave(ChunkDataEvent.Save event) {
int dim = event.getWorld().provider.getDimension();
ChunkPos loc = event.getChunk().getPos();
NBTTagCompound nbt = new NBTTagCompound();
event.getData().setTag("BloodMagic", nbt);
WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z);
2017-08-15 21:30:48 -07:00
if (ac != null) {
nbt.setShort("base", ac.getBase());
ac.getCurrentWill().writeToNBT(nbt, "current");
if (!event.getChunk().isLoaded())
WorldDemonWillHandler.removeWillChunk(dim, loc.x, loc.z);
}
}
@SubscribeEvent
public static void chunkLoad(ChunkDataEvent.Load event) {
int dim = event.getWorld().provider.getDimension();
2017-08-15 21:30:48 -07:00
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);
2017-08-15 21:30:48 -07:00
} else {
WorldDemonWillHandler.generateWill(event.getChunk());
}
}
}