package org.reunionemu.jreunion.game.items.potion; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ScheduledFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.reunionemu.jcommon.ParsedItem; import org.reunionemu.jreunion.game.Item; import org.reunionemu.jreunion.game.LivingObject; import org.reunionemu.jreunion.game.Player; import org.reunionemu.jreunion.game.Usable; import org.reunionemu.jreunion.game.items.etc.Etc; import org.reunionemu.jreunion.server.REHandler; import org.reunionemu.jreunion.server.Reference; import org.reunionemu.jreunion.server.PacketFactory.Type; /** * @author Aidamina * @license http://reunion.googlecode.com/svn/trunk/license.txt */ public abstract class Potion extends Etc implements Usable { private static int ticks = 4; private static int tickLength = 500; public Potion(int id) { super(id); } int effect; public int getEffect() { return effect; } public void setEffect(int effect) { this.effect = effect; } @Override public boolean use(final Item<?> item, final LivingObject user, int quickSlotPosition, int unknown) { if(user instanceof Player){ Player player = (Player)user; item.startJob(createJob(player, item), Potion.tickLength); if (player.getClient().getVersion() >= 2000) { player.getClient().sendPacket(Type.UQ_ITEM, 1, quickSlotPosition, item.getEntityId(), unknown); } return true; } else { LoggerFactory.getLogger(this.getClass()).warn(this.getName() + " not implemented for " + user.getName()); } return false; } @Override public void loadFromReference(int id) { super.loadFromReference(id); ParsedItem item = Reference.getInstance().getItemReference().getItemById(id); this.setEffect(Integer.parseInt(item.getMemberValue("Effect"))); } public abstract void effect(Player target, int effect); public Runnable createJob(final Player player, final Item<?> item){ return new REHandler(new Runnable() { int left = getEffect(); int ticks = Potion.ticks; @Override public void run() { if(ticks > 0) { int effect = getEffect() / Potion.ticks; effect(player, Math.min(left, effect)); left -= effect; ticks--; } else { item.stopJob(); } } }); } }