/* * 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.effects; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.eclipse.jdt.annotation.Nullable; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.util.Timespan; import ch.njol.util.Kleenean; /** * @author Peter Güttinger */ @Name("Potion Effects") @Description("Apply or remove potion effects to/from entities.") @Examples({"apply swiftness 2 to the player", "remove haste from the victim", "on join:", " apply potion of strength of tier {strength.%player%} to the player for 999 days"}) @Since("2.0") public class EffPotion extends Effect { static { Skript.registerEffect(EffPotion.class, "apply [potion of] %potioneffecttypes% [potion] [[[of] tier] %-number%] to %livingentities% [for %-timespan%]" //, "apply %itemtypes% to %livingentities%" /*,"remove %potioneffecttypes% from %livingentities%"*/); } private final static int DEFAULT_DURATION = 15 * 20; // 15 seconds, same as EffPoison @SuppressWarnings("null") private Expression<PotionEffectType> potions; @Nullable private Expression<Number> tier; @SuppressWarnings("null") private Expression<LivingEntity> entities; @Nullable private Expression<Timespan> duration; private boolean apply; @SuppressWarnings({"unchecked", "null"}) @Override public boolean init(final Expression<?>[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { apply = matchedPattern == 0; if (apply) { potions = (Expression<PotionEffectType>) exprs[0]; tier = (Expression<Number>) exprs[1]; entities = (Expression<LivingEntity>) exprs[2]; duration = (Expression<Timespan>) exprs[3]; } else { potions = (Expression<PotionEffectType>) exprs[0]; entities = (Expression<LivingEntity>) exprs[1]; } return true; } @Override protected void execute(final Event e) { final PotionEffectType[] ts = potions.getArray(e); if (ts.length == 0) return; if (!apply) { for (final LivingEntity en : entities.getArray(e)) { for (final PotionEffectType t : ts) en.removePotionEffect(t); } return; } int a = 0; if (tier != null) { final Number amp = tier.getSingle(e); if (amp == null) return; a = amp.intValue() - 1; } int d = DEFAULT_DURATION; if (duration != null) { final Timespan dur = duration.getSingle(e); if (dur == null) return; d = dur.getTicks(); } for (final LivingEntity en : entities.getArray(e)) { for (final PotionEffectType t : ts) { int duration = d; if (en.hasPotionEffect(t)) { for (final PotionEffect eff : en.getActivePotionEffects()) { if (eff.getType() == t) { duration += eff.getDuration(); break; } } } en.addPotionEffect(new PotionEffect(t, duration, a), true); } } } @Override public String toString(final @Nullable Event e, final boolean debug) { if (apply) return "apply " + potions.toString(e, debug) + (tier != null ? " of tier " + tier.toString(e, debug) : "") + " to " + entities.toString(e, debug) + (duration != null ? " for " + duration.toString(e, debug) : ""); else return "remove " + potions.toString(e, debug) + " from " + entities.toString(e, debug); } }