package com.herocraftonline.dev.heroes.skill.skills;
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.MobEffect;
import net.minecraft.server.Packet41MobEffect;
import net.minecraft.server.Packet42RemoveMobEffect;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.Event.Type;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.util.config.ConfigurationNode;
import com.herocraftonline.dev.heroes.Heroes;
import com.herocraftonline.dev.heroes.api.HeroesEventListener;
import com.herocraftonline.dev.heroes.api.WeaponDamageEvent;
import com.herocraftonline.dev.heroes.effects.EffectType;
import com.herocraftonline.dev.heroes.effects.PeriodicEffect;
import com.herocraftonline.dev.heroes.hero.Hero;
import com.herocraftonline.dev.heroes.skill.PassiveSkill;
import com.herocraftonline.dev.heroes.skill.Skill;
import com.herocraftonline.dev.heroes.skill.SkillType;
import com.herocraftonline.dev.heroes.util.Setting;
public class SkillFrenzy extends PassiveSkill {
private String applyText = null;
private String unapplyText = null;
public SkillFrenzy(Heroes plugin) {
super(plugin, "Frenzy");
setDescription("Makes you move faster, deal more damage at lower health");
setTypes(SkillType.COUNTER, SkillType.MOVEMENT, SkillType.BUFF, SkillType.HARMFUL);
registerEvent(Type.CUSTOM_EVENT, new SkillHeroListener(), Priority.Normal);
}
@Override
public ConfigurationNode getDefaultConfig() {
ConfigurationNode node = super.getDefaultConfig();
node.setProperty("max-damage-modifier", 2);
node.setProperty("use-speed-modifier", "true");
node.setProperty(Setting.APPLY_TEXT.node(), "%hero% went into a %skill%!");
node.setProperty(Setting.UNAPPLY_TEXT.node(), "%hero% came out of a %skill%!");
return node;
}
@Override
public void init() {
applyText = getSetting(null, Setting.APPLY_TEXT.node(), "%hero% gained %skill%!");
applyText = applyText.replace("%hero%", "$1").replace("%skill%", "$2");
unapplyText = getSetting(null, Setting.UNAPPLY_TEXT.node(), "%hero% lost %skill%!");
unapplyText = unapplyText.replace("%hero%", "$1").replace("%skill%", "$2");
}
@Override
protected void apply(Hero hero){
FrenzyEffect effect = new FrenzyEffect(this,getName());
effect.setPersistent(true);
hero.addEffect(effect);
Player player = hero.getPlayer();
broadcast(player.getLocation(), applyText, player.getDisplayName(), getName());
}
@Override
protected void unapply(Hero hero) {
if (hero.hasEffect(getName())) {
hero.removeEffect(hero.getEffect(getName()));
Player player = hero.getPlayer();
broadcast(player.getLocation(), unapplyText, player.getDisplayName(), getName());
}
}
public class FrenzyEffect extends PeriodicEffect {
private MobEffect mobEffect = new MobEffect(1, 0, 0);
public FrenzyEffect(Skill skill, String name) {
super(skill, name, 2000);
this.types.add(EffectType.BENEFICIAL);
}
@Override
public void tick(Hero hero) {
super.tick(hero);
if (hero.getHealth()/hero.getMaxHealth() <= .5) {
this.mobEffect = new MobEffect(1, 40, 2);
Player player = hero.getPlayer();
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
entityPlayer.netServerHandler.sendPacket(new Packet42RemoveMobEffect(entityPlayer.id, this.mobEffect));
entityPlayer.netServerHandler.sendPacket(new Packet41MobEffect(entityPlayer.id, this.mobEffect));
}
}
@Override
public void remove(Hero hero) {
Player player = hero.getPlayer();
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
entityPlayer.netServerHandler.sendPacket(new Packet42RemoveMobEffect(entityPlayer.id, this.mobEffect));
}
}
public class SkillHeroListener extends HeroesEventListener {
@Override
public void onWeaponDamage(WeaponDamageEvent event) {
if (event.getCause() != DamageCause.ENTITY_ATTACK)
return;
if (event.getDamager() instanceof Player) {
Player player = (Player) event.getDamager();
Hero hero = plugin.getHeroManager().getHero(player);
if (hero.hasSkill("Frenzy")) {
double damageBonus = (double) getSetting(hero.getHeroClass(), "max-damage-modifier", 2) * hero.getMaxHealth() / hero.getHealth();
event.setDamage((int) (event.getDamage() * damageBonus));
}
} else if (event.getDamager() instanceof Projectile) {
if (((Projectile) event.getDamager()).getShooter() instanceof Player) {
Player player = (Player) ((Projectile) event.getDamager()).getShooter();
Hero hero = plugin.getHeroManager().getHero(player);
if (hero.hasSkill("Frenzy")) {
double damageBonus = (double) getSetting(hero.getHeroClass(), "max-damage-modifier", 2) * hero.getMaxHealth() / hero.getHealth();
event.setDamage((int) (event.getDamage() * damageBonus));
}
}
}
}
}
}