package com.aionemu.gameserver.ai.handler;
import com.aionemu.gameserver.ai.AIState;
import com.aionemu.gameserver.ai.AISubState;
import com.aionemu.gameserver.ai.NpcAI;
import com.aionemu.gameserver.model.DialogAction;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.network.aion.serverpackets.SM_DIALOG_WINDOW;
import com.aionemu.gameserver.network.aion.serverpackets.SM_HEADING_UPDATE;
import com.aionemu.gameserver.questEngine.QuestEngine;
import com.aionemu.gameserver.questEngine.model.QuestEnv;
import com.aionemu.gameserver.services.DialogService;
import com.aionemu.gameserver.services.TownService;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
/**
* @author ATracer
*/
public class TalkEventHandler {
public static void onTalk(NpcAI npcAI, Creature creature) {
onSimpleTalk(npcAI, creature);
if (creature instanceof Player player) {
if (QuestEngine.getInstance().onDialog(new QuestEnv(npcAI.getOwner(), player, 0, DialogAction.USE_OBJECT)))
return;
// only player villagers can use villager npcs in oriel/pernon
switch (npcAI.getOwner().getObjectTemplate().getTitleId()) {
case 462877:
int playerTownId = TownService.getInstance().getTownResidence(player);
int currentTownId = TownService.getInstance().getTownIdByPosition(player);
if (playerTownId != currentTownId) {
PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(npcAI.getOwner().getObjectId(), 44));
} else {
PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(npcAI.getOwner().getObjectId(), 10));
}
return;
default:
int dialogPageId = DialogService.isInteractionAllowed(player, npcAI.getOwner()) ? 10 : 1011;
PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(npcAI.getOwner().getObjectId(), dialogPageId));
break;
}
}
}
public static void onSimpleTalk(NpcAI npcAI, Creature creature) {
if (npcAI.getOwner().getObjectTemplate().isDialogNpc()) {
npcAI.setSubStateIfNot(AISubState.TALK);
npcAI.getOwner().setTarget(creature);
}
}
public static void onFinishTalk(NpcAI npcAI, Creature creature) {
Npc owner = npcAI.getOwner();
if (owner.isTargeting(creature.getObjectId())) {
if (npcAI.getState() == AIState.FOLLOWING) {
npcAI.think();
} else {
owner.setTarget(null);
ThreadPoolManager.getInstance().schedule(() -> {
if (owner.getTarget() == null) {
npcAI.think();
ThreadPoolManager.getInstance().schedule(() -> {
if (owner.getTarget() == null && !owner.getMoveController().isInMove() && owner.isAtSpawnLocation()) {
owner.getPosition().setH(owner.getSpawn().getHeading());
PacketSendUtility.broadcastPacket(owner, new SM_HEADING_UPDATE(owner));
}
}, 500);
}
}, 750);
}
}
}
}