/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.vanilla.meltdowner.skill;
import cn.academy.ability.api.AbilityContext;
import cn.academy.ability.api.data.AbilityData;
import cn.academy.vanilla.meltdowner.CatMeltdowner;
import cn.academy.vanilla.meltdowner.client.render.MdParticleFactory;
import cn.academy.vanilla.meltdowner.passiveskill.RadiationIntensify$;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegInitCallback;
import cn.lambdalib.s11n.network.TargetPoints;
import cn.lambdalib.s11n.network.NetworkMessage;
import cn.lambdalib.s11n.network.NetworkMessage.Listener;
import cn.lambdalib.s11n.network.NetworkS11n.NetworkS11nType;
import cn.lambdalib.util.generic.RandUtils;
import cn.lambdalib.util.generic.VecUtils;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.Vec3;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
/**
* @author WeAthFolD
*/
@Registrant
@NetworkS11nType
public class MDDamageHelper {
private static final String MARKID = "md_marktick", RATEID = "md_markrate";
@RegInitCallback
private static void init() {
MinecraftForge.EVENT_BUS.register(new Events());
}
static void attack(AbilityContext ctx, Entity target, float dmg) {
EntityPlayer player = ctx.player;
ctx.attack(target, dmg);
AbilityData aData = AbilityData.get(player);
if(aData.isSkillLearned(CatMeltdowner.radIntensify)) {
int marktick = Math.max(60, getMarkTick(player));
setMarkTick(target, marktick);
setMarkRate(target, RadiationIntensify$.MODULE$.getRate(aData));
NetworkMessage.sendToAllAround(
TargetPoints.convert(player, 20),
NetworkMessage.staticCaller(MDDamageHelper.class),
"sync", player, marktick
);
}
}
private static int getMarkTick(Entity player) {
if(player.getEntityData().hasKey(MARKID))
return player.getEntityData().getInteger(MARKID);
else
return 0;
}
private static float getMarkRate(Entity entity) {
if(entity.getEntityData().hasKey(RATEID))
return entity.getEntityData().getFloat(RATEID);
else
return 0;
}
private static void setMarkRate(Entity entity, float amt) {
entity.getEntityData().setFloat(RATEID, amt);
}
@Listener(channel="sync", side=Side.CLIENT)
private static void setMarkTick(Entity player, int ticks) {
player.getEntityData().setInteger(MARKID, ticks);
}
public static class Events {
@SubscribeEvent
public void onLivingUpdate(LivingUpdateEvent event) {
int tick = getMarkTick(event.entity);
if(tick > 0)
setMarkTick(event.entity, tick - 1);
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onUpdateClient(LivingUpdateEvent event) {
Entity e = event.entity;
if(e.worldObj.isRemote) {
if(getMarkTick(e) > 0) {
int times = RandUtils.rangei(0, 3);
while(times --> 0) {
double r = RandUtils.ranged(.6, .7) * e.width;
double theta = RandUtils.nextDouble() * 2 * Math.PI;
double h = RandUtils.ranged(0, e.height);
Vec3 pos = VecUtils.add(VecUtils.vec(e.posX, e.posY, e.posZ),
VecUtils.vec(r * Math.sin(theta), h, r * Math.cos(theta)));
Vec3 vel = VecUtils.multiply(VecUtils.random(), 0.02);
e.worldObj.spawnEntityInWorld(MdParticleFactory.INSTANCE.next(e.worldObj, pos, vel));
}
}
}
}
@SubscribeEvent
public void onLivingAttack(LivingHurtEvent event) {
if(getMarkTick(event.entityLiving) > 0) {
event.ammount *= getMarkRate(event.entityLiving);
}
}
}
}