/*
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011-2014 Peter Güttinger
*
*/
package ch.njol.skript.events;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.Skript;
import ch.njol.skript.bukkitutil.HealthUtils;
import ch.njol.skript.entity.EntityData;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser.ParseResult;
/**
* @author Peter Güttinger
*/
@SuppressWarnings("unchecked")
public class EvtDamage extends SkriptEvent {
static {
Skript.registerEvent("Damage", EvtDamage.class, EntityDamageEvent.class, "damag(e|ing) [of %entitydata%]")
.description("Called when an entity receives damage, e.g. by an attack from another entity, lava, fire, drowning, fall, suffocation, etc.")
.examples("on damage", "on damage of a player")
.since("1.0");
}
@Nullable
private Literal<EntityData<?>> types;
@Override
public boolean init(final Literal<?>[] args, final int matchedPattern, final ParseResult parser) {
types = (Literal<EntityData<?>>) args[0];
return true;
}
@SuppressWarnings("null")
@Override
public boolean check(final Event evt) {
final EntityDamageEvent e = (EntityDamageEvent) evt;
if (!checkType(e.getEntity()))
return false;
if (e instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) e).getDamager() instanceof EnderDragon && ((EntityDamageByEntityEvent) e).getEntity() instanceof EnderDragon)
return false;
return checkDamage(e);
}
private boolean checkType(final Entity e) {
if (types != null) {
for (final EntityData<?> d : types.getAll()) {
if (d.isInstance(e))
return true;
}
return false;
}
return true;
}
@Override
public String toString(final @Nullable Event e, final boolean debug) {
return "damage" + (types != null ? " of " + types.toString(e, debug) : "");
}
// private final static WeakHashMap<LivingEntity, Integer> lastDamages = new WeakHashMap<LivingEntity, Integer>();
@SuppressWarnings("null")
private static boolean checkDamage(final EntityDamageEvent e) {
if (!(e.getEntity() instanceof LivingEntity))
return true;
final LivingEntity en = (LivingEntity) e.getEntity();
if (HealthUtils.getHealth(en) <= 0)
return false;
// if (en.getNoDamageTicks() <= en.getMaximumNoDamageTicks() / 2) {
// lastDamages.put(en, e.getDamage());
// return true;
// }
// final Integer lastDamage = lastDamages.get(en);
// if (lastDamage != null && lastDamage >= e.getDamage())
// return false;
// lastDamages.put(en, e.getDamage());
return true;
}
/*
static {
Bukkit.getPluginManager().registerEvents(new Listener() {
@EventHandler
public void onDamage(final EntityDamageEvent e) {
if (e.getEntity() == EffSpawn.lastSpawned) {
final Entity en = e.getEntity();
Skript.info("");
Skript.info("- damage event! time: " + en.getWorld().getTime());
// Skript.info("entity: " + en);
Skript.info("damage: " + e.getDamage());
// Skript.info("last damage: " + (en.getLastDamageCause() == null ? "<none>" : ""+en.getLastDamageCause().getDamage()));
if (en instanceof LivingEntity) {
Skript.info("is invincible: " + (((LivingEntity) en).getNoDamageTicks() > ((LivingEntity) en).getMaximumNoDamageTicks() / 2f));
if (((LivingEntity) en).getNoDamageTicks() > 0)
Skript.info("damage difference (positive = more): " + (e.getDamage() - en.getLastDamageCause().getDamage()));
final int h = Math.max(((LivingEntity) en).getHealth(), 0);
Bukkit.getScheduler().scheduleSyncDelayedTask(Skript.getInstance(), new Runnable() {
@Override
public void run() {
Skript.info("actual damage: " + (h - Math.max(((LivingEntity) en).getHealth(), 0)));
}
});
}
if (e instanceof EntityDamageByEntityEvent) {
Skript.info("attacker: " + ((EntityDamageByEntityEvent) e).getDamager());
}
}
}
}, Skript.getInstance());
}
// */
}