I've added 4 new commands at 4.97 to read the current status of a quest
Code:
QuestInfo=[QuestID];
_IFQuestAtStep=[QuestID],[Step];
_IFQuestAtStatus=[QuestID],[Status];
_IFQuestAtCounter=[QuestID],[Counter];
To get a Quest ID and the needed informations for the IF questions, open the Quest log ingame, select the Quest you want the current status informations from and execute this snippet
Classic 1.0
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x4C8,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
Classic 1.5
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x520,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
5.8
Code:
_MemPtrReadVar=%AddrFrameID[175],0x568,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
6.2
Code:
_MemPtrReadVar=%AddrFrameID[184],0x568,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
7.2
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x578,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
7.5
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x588,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
8.0
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x598,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
8.4
Code:
_MemPtrReadVar=%AddrFrameName[quest_dialog],0x5A0,DWORD,1;
WaitForResponse=Current Selected Quest: %Var1/nLoading further information;
QuestInfo=%Var1;
It seems as long as a quest is not completable the status is at "3" and once it changes the icon to
[Only registered and activated users can see links. Click Here To Register...] the status changes to "4"
Step starts at "0" when you accept a quest and always increments by 1 when ever you progress in the quest, this might be the most interesting one
Counter displays some things like how much mobs for the quest has been killed, but it doesn't work for quest items looted however we got "_IFQuestInventoryContains" for those cases
You can use those IF questions like that
Code:
_IFQuestAtStep=1001,7;
WaitForResponse=Quest 1001 is at Step 7;
#ELSE
WaitForResponse=Quest 1001 is NOT at Step 7;
#ENDIF
Note: this snippet can be used to Instant Report quests by QuestID
Code:
FrameAction=184,STATE,SHOW; opens quest window
FrameAction=184,XPOS,0;
FrameAction=184,YPOS,0;
Delay=550;
Mouse=72,25; select quest tab
Delay=400;
Mouse=99,71; select first quest
Delay=400;
MemPtrWrite=%AddrFrameID[184],0x568,90000,DWORD; writes quest ID internally
MemPtrWrite=%AddrFrameID[184],0x578/0x28,7,BYTE; activates instant report button
Delay=450;
Mouse=123,313; Instant report
7.2
Code:
FrameActionByName=quest_dialog,STATE,SHOW; opens quest window
FrameActionByName=quest_dialog,XPOS,0;
FrameActionByName=quest_dialog,YPOS,0;
Delay=550;
Mouse=72,25; select quest tab
Delay=400;
Mouse=99,71; select first quest
Delay=400;
MemPtrWrite=%AddrFrameName[quest_dialog],0x578,90000,DWORD; writes quest ID internally
MemPtrWrite=%AddrFrameName[quest_dialog],0x588/0x28,7,BYTE; activates instant report button
Delay=450;
Mouse=123,313; Instant report
7.5
Code:
FrameActionByName=quest_dialog,STATE,SHOW; opens quest window
FrameActionByName=quest_dialog,XPOS,0;
FrameActionByName=quest_dialog,YPOS,0;
Delay=550;
Mouse=72,25; select quest tab
Delay=400;
Mouse=99,71; select first quest
Delay=400;
MemPtrWrite=%AddrFrameName[quest_dialog],0x588,90000,DWORD; writes quest ID internally
MemPtrWrite=%AddrFrameName[quest_dialog],0x598/0x28,7,BYTE; activates instant report button
Delay=450;
Mouse=123,313; Instant report
8.0
Code:
FrameActionByName=quest_dialog,STATE,SHOW; opens quest window
FrameActionByName=quest_dialog,XPOS,0;
FrameActionByName=quest_dialog,YPOS,0;
Delay=550;
Mouse=72,25; select quest tab
Delay=400;
Mouse=99,71; select first quest
Delay=400;
MemPtrWrite=%AddrFrameName[quest_dialog],0x598,90000,DWORD; writes quest ID internally
MemPtrWrite=%AddrFrameName[quest_dialog],0x5A8/0x28,7,BYTE; activates instant report button
Delay=450;
Mouse=123,313; Instant report
With this code you can check if a quest has been completed
it displays -1 if the quest hasn't been accepted yet, 0 if it's completed and 1 if it's incompleted
8.0
Code:
#SmoothBackground
_SetVar=QuestID,61972;
#EXECUTE=IsQuestComplete;
WaitForResponse=%Var[QuestName]/nIncomplete = %Var[QuestComplete];
start_IsQuestComplete;
//displays -1 if the quest hasn't been accepted yet, 0 if it's completed and 1 if it's incompleted
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,15,BYTE;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x6C,0,FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x74,0,FLOAT;
SendKey=0x0D;
Delay=100;
SendKey=123456789012345;
Delay=150;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x510/0x370/0x0,[@quest:%Var[QuestID]],WCHAR[16];
Delay=50;
SendKey=1;
Delay=150;
Mouse=119,8;
Delay=150;
_IFFrameVisibleByName=quest_summary_dialog;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],0x518/0x360/0x8/0x18/0x1EC,WCHAR[256],QuestName;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],0x518/0xA48,BYTE,QuestComplete;
#ELSE
_SetVar=QuestName,Quest not found;
_SetVar=QuestComplete,-1;
#ENDIF
SendKey=0x1B;
Delay=1;
SendKey=0x1B;
Delay=1;
SendKey=0x1B;
Delay=1;
MemPtrWrite=%AddrESChwnd,%OffsetESChwnd,142,BYTE;
end_IsQuestComplete;
Classic 1.0
Code:
#SmoothBackground
_SetVar=QuestID,1101;
#EXECUTE=IsQuestComplete;
WaitForResponse=Complete = 0/nInComplete = 1/n/n%Var[QuestName]/nStatus = %Var[QuestComplete];
start_IsQuestComplete;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],0x4C,FLOAT,XPosCache;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],0x54,FLOAT,YPosCache;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,15,BYTE;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x4C,0,FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x54,0,FLOAT;
SendKey=0x0D;
Delay=100;
SendKey=123456789012345;
Delay=150;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x480/0x2B0/0x0,[quest:%Var[QuestID]],WCHAR[16];
Delay=50;
SendKey=1;
Delay=150;
Mouse=119,8;
Delay=250;
_IFFrameVisibleByName=quest_summary_dialog;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],0x488/0x2A0/0x8/0x18/0x1CC,WCHAR[256],QuestName;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],0x488/0x8E8,BYTE,QuestComplete;
#ELSE
_SetVar=QuestName,Quest not found;
_SetVar=QuestComplete,-1;
#ENDIF
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x4C,%Var[XPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x54,%Var[YPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
#DO=5000;
SendKey=0x1B; // ESC
Delay=1;
_UNTILMemPtrRead=%AddrFrameName[system_menu_dialog],0x28,BYTE,=175;
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
end_IsQuestComplete;
Classic 2.0+
Code:
#IF=%FirstTime,;
#SmoothBackground
#EXECUTE=GetOffsets;
#ENDIF
_SetVar=QuestID,1101;
#EXECUTE=IsQuestComplete;
WaitForResponse=Complete = 0/nInComplete = 1/n/n%Var[QuestName]/nStatus = %Var[QuestComplete];
start_IsQuestComplete;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],FLOAT,XPosCache;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],FLOAT,YPosCache;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,15,BYTE;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],0,FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],0,FLOAT;
SendKey=0x0D;
Delay=100;
SendKey=123456789012345;
Delay=150;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_ChatText],[quest:%Var[QuestID]],WCHAR[16];
Delay=50;
SendKey=1;
Delay=150;
Mouse=119,8;
Delay=250;
_IFFrameVisibleByName=quest_summary_dialog;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],%Var[Offset_Quest_Name],WCHAR[256],QuestName;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],%Var[Offset_Quest_Complete],BYTE,QuestComplete;
#ELSE
_SetVar=QuestName,Quest not found;
_SetVar=QuestComplete,-1;
#ENDIF
#IF=%Var[QuestComplete],>1;
_SetVar=QuestComplete,1;
#ELSE
_SetVar=QuestComplete,0;
#ENDIF
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_ChatText],,WCHAR[16]; // clear chat
SendKey=0x20;
Delay=100;
SendKey=0x08;
Delay=100;
SendKey=0x0D;
Delay=100; // update chat input UI
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],%Var[XPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],%Var[YPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,7,BYTE; // do not force foreground, fix for Command=
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
#DO=5000;
SendKey=0x1B; // ESC
Delay=1;
_UNTILMemPtrRead=%AddrFrameName[system_menu_dialog],0x28,BYTE,=175;
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
end_IsQuestComplete;
start_GetOffsets;
#DO=5000;
Delay=250;
#UNTIL=%Timer=997,5000;
#IF=%ClientID,=5; // Classic NA
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_XPos,(?m)\[Classic\]\n.*?^Frame_XPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_YPos,(?m)\[Classic\]\n.*?^Frame_YPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_ChatText,(?m)\[Classic\]\n.*?^ChatText=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Name,(?m)\[Classic\]\n.*?^Quest_Name=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Complete,(?m)\[Classic\]\n.*?^Quest_Complete=(.*?)$;
#ENDIF
#IF=%ClientID,=6; // Classic EU
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_XPos,(?m)\[Classic EU\]\n.*?^Frame_XPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_YPos,(?m)\[Classic EU\]\n.*?^Frame_YPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_ChatText,(?m)\[Classic EU\]\n.*?^ChatText=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Name,(?m)\[Classic EU\]\n.*?^Quest_Name=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Complete,(?m)\[Classic EU\]\n.*?^Quest_Complete=(.*?)$;
#ENDIF
CreateTimer=997;
end_GetOffsets;
Retail Any Patch
Code:
#IF=%FirstTime,;
#SmoothBackground
#EXECUTE=GetOffsets;
#ENDIF
_SetVar=QuestID,1101;
#EXECUTE=IsQuestComplete;
WaitForResponse=Complete = 0/nInComplete = 1/n/n%Var[QuestName]/nStatus = %Var[QuestComplete];
start_IsQuestComplete;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],FLOAT,XPosCache;
_MemPtrReadVar=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],FLOAT,YPosCache;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,15,BYTE;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],0,FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],0,FLOAT;
SendKey=0x0D;
Delay=100;
SendKey=123456789012345;
Delay=150;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_ChatText],[@quest:%Var[QuestID]],WCHAR[16];
Delay=50;
SendKey=1;
Delay=150;
Mouse=63,8;
Delay=250;
_IFFrameVisibleByName=quest_summary_dialog;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],%Var[Offset_Quest_Name],WCHAR[256],QuestName;
_MemPtrReadVar=%AddrFrameName[quest_summary_dialog],%Var[Offset_Quest_Complete],BYTE,QuestComplete;
#ELSE
_SetVar=QuestName,Quest not found;
_SetVar=QuestComplete,-1;
#ENDIF
#IF=%Var[QuestComplete],>1;
_SetVar=QuestComplete,1;
#ELSE
_SetVar=QuestComplete,0;
#ENDIF
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_ChatText],,WCHAR[16]; // clear chat
SendKey=0x20;
Delay=100;
SendKey=0x08;
Delay=100;
SendKey=0x0D;
Delay=100; // update chat input UI
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_XPos],%Var[XPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],%Var[Offset_Frame_YPos],%Var[YPosCache],FLOAT;
MemPtrWrite=%AddrFrameName[chat_input_dialog],0x28,7,BYTE; // do not force foreground, fix for Command=
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
#DO=5000;
SendKey=0x1B; // ESC
Delay=1;
_UNTILMemPtrRead=%AddrFrameName[system_menu_dialog],0x28,BYTE,=175;
MemPtrWrite=%AddrFrameName[system_menu_dialog],0x28,142,BYTE;
end_IsQuestComplete;
start_GetOffsets;
#DO=5000;
Delay=250;
#UNTIL=%Timer=997,5000;
_IFMemRead=%AddrLangPack,CHAR[32],=L10N/ENU/;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_XPos,(?m)\[NA\]\n.*?^Frame_XPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_YPos,(?m)\[NA\]\n.*?^Frame_YPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_ChatText,(?m)\[NA\]\n.*?^ChatText=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Name,(?m)\[NA\]\n.*?^Quest_Name=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Complete,(?m)\[NA\]\n.*?^Quest_Complete=(.*?)$;
#ELSE
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_XPos,(?m)\[EU\]\n.*?^Frame_XPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Frame_YPos,(?m)\[EU\]\n.*?^Frame_YPos=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_ChatText,(?m)\[EU\]\n.*?^ChatText=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Name,(?m)\[EU\]\n.*?^Quest_Name=(.*?)$;
_HTTPGetVar=http://subvanillatool.com/Offsets.txt,,Offset_Quest_Complete,(?m)\[EU\]\n.*?^Quest_Complete=(.*?)$;
#ENDIF
CreateTimer=997;
end_GetOffsets;