package ai; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.aionemu.gameserver.ai.AIActions; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.ai.NpcAI; import com.aionemu.gameserver.controllers.observer.ItemUseObserver; import com.aionemu.gameserver.model.EmotionType; import com.aionemu.gameserver.model.TaskId; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION; import com.aionemu.gameserver.network.aion.serverpackets.SM_USE_OBJECT; import com.aionemu.gameserver.services.DialogService; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.ThreadPoolManager; /** * @author xTz, vlog */ @AIName("useitem") public class ActionItemNpcAI extends NpcAI { protected final int startBarAnimation = 1; protected final int cancelBarAnimation = 2; private final List observers = new ArrayList<>(); public ActionItemNpcAI(Npc owner) { super(owner); } @Override protected void handleDialogStart(Player player) { if (DialogService.isInteractionAllowed(player, getOwner())) handleUseItemStart(player); } protected void handleUseItemStart(Player player) { final int talkDelayInMs = getTalkDelayInMs(); if (talkDelayInMs > 0) { final ItemUseObserver observer = new ItemUseObserver() { @Override public void abort() { player.getController().cancelTask(TaskId.ACTION_ITEM_NPC); PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, EmotionType.END_QUESTLOOT, 0, getObjectId()), true); PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getObjectId(), 0, cancelBarAnimation)); synchronized (observers) { observers.remove(this); } player.getObserveController().removeObserver(this); } }; player.getObserveController().addObserver(observer); synchronized (observers) { observers.add(observer); } PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getObjectId(), talkDelayInMs, startBarAnimation)); PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, EmotionType.START_QUESTLOOT, 0, getObjectId()), true); player.getController().addTask(TaskId.ACTION_ITEM_NPC, ThreadPoolManager.getInstance().schedule(() -> { PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, EmotionType.END_QUESTLOOT, 0, getObjectId()), true); PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getObjectId(), talkDelayInMs, cancelBarAnimation)); player.getObserveController().removeObserver(observer); synchronized (observers) { observers.remove(observer); } handleUseItemFinish(player); }, talkDelayInMs)); } else { handleUseItemFinish(player); } } protected void handleUseItemFinish(Player player) { AIActions.handleUseItemFinish(this, player); } protected int getTalkDelayInMs() { return getObjectTemplate().getTalkDelay() * 1000; } @Override protected void handleDied() { super.handleDied(); synchronized (observers) { for (Iterator iter = observers.iterator(); iter.hasNext();) { ItemUseObserver observer = iter.next(); iter.remove(); observer.abort(); } } } }