Index: D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2NpcInstance.java =================================================================== --- D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2NpcInstance.java (revision 1028) +++ D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2NpcInstance.java (working copy) @@ -740,7 +740,7 @@ if (qs != null) { // If the quest is alreday started, no need to show a window - if (!qs.getQuest().notifyTalk(getTemplate().npcId, qs)) + if (!qs.getQuest().notifyTalk(this, qs)) return; } else if (Quest.findQuest(questId) != null) @@ -760,7 +760,7 @@ //disabled by mr. becouse quest dialog only show on second click. //if(qs.getState().getName().equalsIgnoreCase("completed")) //{ - if (!qs.getQuest().notifyTalk(getTemplate().npcId, qs)) + if (!qs.getQuest().notifyTalk(this, qs)) return; // no need to show a window //} break; Index: D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/quest/Quest.java =================================================================== --- D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/quest/Quest.java (revision 1028) +++ D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/quest/Quest.java (working copy) @@ -30,6 +30,7 @@ import net.sf.l2j.L2DatabaseFactory; import net.sf.l2j.gameserver.NpcTable; import net.sf.l2j.gameserver.model.L2PcInstance; +import net.sf.l2j.gameserver.model.L2NpcInstance; import net.sf.l2j.gameserver.model.quest.jython.QuestJython; import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.serverpackets.SystemMessage; @@ -204,9 +205,12 @@ try { res = onKill(npcId, qs); } catch (Exception e) { return showError(qs, e); } return showResult(qs, res); } - public final boolean notifyTalk (int npcId, QuestState qs) { + public final boolean notifyTalk (L2NpcInstance npc, QuestState qs) { String res = null; + int npcId = npc.getTemplate().npcId; + int objId = npc.getObjectId(); try { res = onTalk(npcId, qs); } catch (Exception e) { return showError(qs, e); } + qs.getPlayer().setLastQuestNpcObject(objId); return showResult(qs, res); } Index: D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2PcInstance.java =================================================================== --- D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2PcInstance.java (revision 1030) +++ D:/Server/Workspace/L2J_SVN/java/net/sf/l2j/gameserver/model/L2PcInstance.java (working copy) @@ -219,8 +219,12 @@ /** The clan crest Identifier of the L2PcInstance */ private int _crestId; + /** JBForth instance associated to this L2PcInstance */ public JBForth jbf = new JBForth(); + /** Last NPC Id talked on a quest */ + private int questNpcObject = 0; + /** The face type Identifier of the L2PcInstance */ private int _face; @@ -731,6 +735,19 @@ _log.warning("Attempted to remove unknown RecipeList"+RecipeID); } + /** + * Returns the Id for the last talked quest NPC.

+ */ + public int getLastQuestNpcObject() + { + return questNpcObject; + } + + public void setLastQuestNpcObject(int npcId) + { + questNpcObject = npcId; + } + /** * Add Quest drops to the table containing all possible drops of a L2NpcInstance.

* @@ -882,25 +899,53 @@ public QuestState processQuestEvent(String quest, String event) { + QuestState retval = null; if (event == null) event = ""; if (!_quests.containsKey(quest)) - return null; + return retval; QuestState qs = getQuestState(quest); if (qs == null && event.length() == 0) - return null; + return retval; if (qs == null) { Quest q = Quest.findQuest(quest); if (q == null) - return null; + return retval; qs = q.newQuestState(this); } if (qs != null) { - if (qs.getQuest().notifyEvent(event, qs)) - showQuestWindow(quest, qs.getStateId()); - } + if (getAccessLevel() >= Config.GM_ACCESSLEVEL) + { + if (qs.getQuest().notifyEvent(event, qs)) + showQuestWindow(quest, qs.getStateId()); + + retval = qs; + } + else + { + if (getLastQuestNpcObject() > 0) + { + L2Object object = L2World.getInstance().findObject(getLastQuestNpcObject()); + if (object instanceof L2NpcInstance && getDistance(object.getX(), object.getY()) <= L2NpcInstance.INTERACTION_DISTANCE) + { + L2NpcInstance npc = (L2NpcInstance)object; + QuestState[] states = getQuestsForTalk(npc.getNpcId()); + for (QuestState state : states) + { + if ((state.getQuest().getQuestIntId() == qs.getQuest().getQuestIntId()) && !qs.isCompleted()) + { + if (qs.getQuest().notifyEvent(event, qs)) + showQuestWindow(quest, qs.getStateId()); + + retval = qs; + } + } + } + } + } + } - return qs; + return retval; } private void showQuestWindow(String questId, String stateId) {