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) {