include("database.lua"); include("addresses.lua"); include("classes/player.lua"); include("classes/camera.lua"); include("classes/waypoint.lua"); include("classes/waypointlist.lua"); include("classes/waypointlist_wander.lua"); include("classes/node.lua"); include("settings.lua"); include("functions.lua"); include("macros.lua"); include("classes/object.lua"); include("classes/memorytable.lua"); settings.load(); database.load(); -- ******************************************************************** -- Change the parameters below to your need * -- ******************************************************************** -- if you want to create waypoint files with special waypoint types -- like type=TRAVEL, than you can change the global variables -- below to your need, see the following example -- p_wp_gtype = " type=\"TRAVEL\""; -- global type for whole file -- p_wp_type = " type=\"TRAVEL\""; -- type for normal waypoints -- p_hp_type = " type=\"TRAVEL\""; -- type for harvest waypoints p_wp_gtype = ""; -- global type for whole file: e.g. TRAVEL p_wp_type = ""; -- type for normal waypoints p_hp_type = ""; -- type for harvest waypoints p_harvest_command = "\n\t\t\tplayer:harvest()\n"; p_merchant_command = "player:merchant%s"; p_targetNPC_command = "player:target_NPC%s"; p_targetObj_command = "player:target_Object%s"; --p_choiceOption_command = "sendMacro(\"ChoiceOption(%d)\")"; p_mouseClickL_command = "player:mouseclickL(%d, %d, %d, %d)"; p_wpType_command = "__WPL:setForcedWaypointType(\"%s\")"; p_acceptbyname_command = "AcceptQuestByName%s"; p_completebyname_command = "CompleteQuestByName%s"; p_choicebyname_command = "ChoiceOptionByName%s"; -- ******************************************************************** -- End of Change parameter changes * -- ******************************************************************** setStartKey(settings.hotkeys.START_BOT.key); setStopKey(settings.hotkeys.STOP_BOT.key); wpKey = key.VK_NUMPAD1; -- insert a movement point harvKey = key.VK_NUMPAD2; -- insert a harvest point saveKey = key.VK_NUMPAD3; -- save the waypoints merchantKey = key.VK_NUMPAD4; -- target merchant, repair and buy stuff targetNPCKey = key.VK_NUMPAD5; -- target NPC and open dialog waypoint --choiceOptionKey = key.VK_NUMPAD6; -- insert choiceOption byName = key.VK_NUMPAD6; -- Insert Accept/Complete/ChoiceOption 'ByName' selection. mouseClickKey = key.VK_NUMPAD7; -- Save MouseClick restartKey = key.VK_NUMPAD9; -- restart waypoints script resetKey = key.VK_NUMPAD8; -- restart waypoints script and discard changes codeKey = key.VK_NUMPAD0; -- add comment to last WP. targetObjKey = key.VK_DECIMAL; -- target an object and action it. wpTypeKey = key.VK_DIVIDE; -- change waypoint type flyToggle = key.VK_ADD -- Toggles fly and optionally inserts fly command -- read arguments / forced profile perhaps local forcedProfile = nil; for i = 2,#args do local foundpos = string.find(args[i], ":", 1, true); if( foundpos ) then local var = string.sub(args[i], 1, foundpos-1); local val = string.sub(args[i], foundpos+1); if( var == "profile" ) then forcedProfile = val; else -- invalid option local msg = sprintf(language[61], args[i]); error(msg, 0 ); end end -- check the options if(not foundpos and args[i] ~= "update" ) then local msg = sprintf(language[61], args[i]); error(msg, 0 ); end; end local wpList = {}; local playerPtr = memoryReadUIntPtr(getProc(), addresses.staticbase_char, addresses.charPtr_offset); player = CPlayer(playerPtr); player:update(); -- convert player name to profile name and check if profile exist local load_profile_name; -- name of profile to load if( forcedProfile ) then load_profile_name = convertProfileName(forcedProfile); else load_profile_name = convertProfileName(player.Name); end attach(getWin()); settings.loadProfile(load_profile_name); -- In game message to get users attention local function message(text,level) if level == "warning" then -- Red text, beep. When nothing was done. printf("\a") addMessage("|cffff4500"..text) elseif level == "question" then -- Orange text. Awating user input. addMessage("|cffff9900"..text) else -- Default message. addMessage(text) end end -- Activate MM console to get users input local function activateConsole() local startWidth, startHeight = getConsoleAttributes() -- Remember size becaue of size change bug showWindow(getHwnd(), sw.minimize) yrest(500) -- minimize first or else restore wonn't work bug. showWindow(getHwnd(), sw.restore) yrest(1000) -- Restore and activate console -- Restore size if changed local curX, curY = getConsoleAttributes() if curY ~= startHeight then -- size changed, restore setConsoleAttributes(startWidth, startHeight) end end -- Gets the text, type and index of the dialog choice the user selected. local function getChoice(num) local text, typ, index = RoMCode("n="..num.." c=0 for k,v in pairs(g_SpeakFrameData.option) do if v.objtype~=1 then c=c+1 if c==n then a={v.title,v.type,v.id} break end end end") -- Fix title if text ~= nil then text = string.gsub(text,"|c%x*","") -- Remove color info text = string.gsub(text,"%[.*%]","") -- Remove added info in square brackets text = string.gsub(text,"%(.*%)","") -- Remove added info in normal brackets local acceptQuest = getTEXT("SYS_ACCEPT_QUEST") if string.find(string.lower(text),string.lower(acceptQuest)) then text = string.sub(text,#acceptQuest+2) -- Remove "Accept quest: " end text = trim(text) -- Trim leading and trailing spaces end return text, typ, index end -- Returns table of quest ids in the questlog. local function scanQuestIds() return {RoMCode("for i=1,GetNumQuestBookButton_QuestBook() do table.insert(a,GetQuestId(i)) end")} end -- Compares 2 tables of ids and returns the changed id. local function findId(tablewithid, tablewithoutid) for ka, va in pairs(tablewithid) do local foundflag = false; for kb, vb in pairs(tablewithoutid) do if vb == va then foundflag = true; break end end if foundflag == false then return va end end end -- Saves the completed waypoint file local function saveWaypoints(list) local file while (not file) do activateConsole() -- Get input keyboardBufferClear(); io.stdin:flush(); cprintf(cli.green, language[500]); -- What do you want to name your path tempname = io.stdin:read() if tempname ~= "" and tempname ~= nil then filename = getExecutionPath() .. "/waypoints/" .. tempname .. ".xml"; else filename = getExecutionPath() .. "/waypoints/__unnamed.xml"; end filechk, err = io.open(filename, "r"); if (filechk) then cprintf(cli.yellow, language[525]); -- Filename already exists! Overwrite? [Y/N] overwrite = io.stdin:read() filechk:close(); end if (not filechk) or string.lower(overwrite) == "y" then file, err = io.open(filename, "w"); if( not file ) then cprintf(cli.green, language[524]); -- File save failed. Please verify the name and try again. end end end local openformat = "\t%s"; local closeformat = "\t\n"; file:write(""); local str = sprintf("\n", p_wp_gtype); -- create first tag file:write(str); -- write first tag local hf_line, tag_open, line_num, hf_data = "", false, 1, false; for i,v in pairs(list) do if( v.wp_type == "WP" ) then -- Waypoint if( tag_open ) then if ( hf_data ) then hf_line = hf_line .. "\n" .. closeformat else hf_line = hf_line .. closeformat end end hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") line_num = line_num + 1 tag_open = true; hf_data = false; elseif( v.wp_type == "HP" ) then -- Harvest point if( tag_open ) then if ( hf_data ) then hf_line = hf_line .. "\n" .. closeformat else hf_line = hf_line .. closeformat end end hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_hp_type, p_harvest_command) .. closeformat; line_num = line_num + 1 tag_open = false; hf_data = false; elseif( v.wp_type == "MER" ) then -- Merchant hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_merchant_command, v.npc_name) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_merchant_command, v.npc_name) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "NPC" ) then -- Open NPC Dialog hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_targetNPC_command, v.npc_name) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_targetNPC_command, v.npc_name) line_num = line_num + 1 tag_open = true; end --[[elseif( v.wp_type == "CO" ) then -- Choice Option hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_choiceOption_command, v.co_num) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_choiceOption_command, v.co_num) line_num = line_num + 1 tag_open = true; end]] elseif( v.wp_type == "MC" ) then -- Mouse click (left) hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_mouseClickL_command, v.mx, v.my, v.wide, v.high) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_mouseClickL_command, v.mx, v.my, v.wide, v.high) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "COD" ) then -- Code hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. v.com else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. v.com line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "OBJ" ) then -- Target Object hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_targetObj_command, v.obj_name) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_targetObj_command, v.obj_name) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "WPT" ) then -- Change Waypoint movement mode hf_data = true; if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_wpType_command, v.wp_move) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_wpType_command, v.wp_move) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "ACCEPT" ) then -- Accept quest hf_data = true; local tmptext if v.id then tmptext = sprintf("(%d) -- %s", v.id, v.name) else tmptext = sprintf("(\"%s\")", v.name) end if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_acceptbyname_command, tmptext) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_acceptbyname_command, tmptext) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "COMPLETE" ) then -- Complete quest hf_data = true; local tmprewtext = "" if v.rewnum then tmprewtext = sprintf(", %d", v.rewnum) end local tmptext if v.id then tmptext = sprintf("(%d%s) -- %s", v.id, tmprewtext, v.name) else tmptext = sprintf("(\"%s\"%s)", v.name, tmprewtext) end if v.rewards then tmptext = tmptext .. "\n\t\t\t-- Rewards: " for k,v in ipairs (v.rewards) do tmptext = tmptext .. sprintf("(%d) %s ", k, v) end end if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_completebyname_command, tmptext) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_completebyname_command, tmptext) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "COBYNAME" ) then -- Choose option by name hf_data = true; local tmptext if v.keystring == nil or v.text == v.keystring then tmptext = sprintf("(\"%s\")", v.text) else tmptext = sprintf("(getTEXT(\"%s\")) -- \'%s\'", v.keystring, v.text) end if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_choicebyname_command, tmptext) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_choicebyname_command, tmptext) line_num = line_num + 1 tag_open = true; end elseif( v.wp_type == "FLY" ) then -- Toggle flying and optionally insert command hf_data = true; local tmptext = sprintf("(\"%s\")", v.text) if( tag_open ) then hf_line = hf_line .. "\n\t\t\t" .. sprintf(p_choicebyname_command, tmptext) else hf_line = hf_line .. sprintf(openformat, line_num, v.X, v.Z, v.Y, p_wp_type, "") .. "\n"; hf_line = hf_line .. "\t\t\t" .. sprintf(p_choicebyname_command, tmptext) line_num = line_num + 1 tag_open = true; end end end -- If we left a tag open, close it. if( tag_open ) then if ( hf_data ) then hf_line = hf_line .. "\n" .. closeformat else hf_line = hf_line .. closeformat end end if( bot.ClientLanguage == "RU" ) then hf_line = oem2utf8_russian(hf_line); -- language conversations for Russian Client end file:write(hf_line); file:write(""); file:close(); wpList = {}; -- clear intenal table end -- Get input from the user, either a single character or a string. local function getInput(single, prompt) if single then -- Get single character cprintf(cli.green, prompt); message(prompt, "question"); -- Wait till previous key is no longer pressed repeat local ks = keyboardState() local stillpressed for k,v in pairs(ks) do if v then stillpressed = true end end yrest(50) until not stillpressed -- Wait till new key is pressed local pressed local lastState = keyboardState() repeat local ks = keyboardState() if foregroundWindow() == getWin() or foregroundWindow() == getHwnd() then for k,v in pairs(ks) do if v and not (lastState[k]) then -- Check if alpha numeric if (k >= key.VK_A and k <= key.VK_Z) or (k >= key.VK_0 and k <= key.VK_9) then pressed = k elseif (k >= key.VK_NUMPAD0 and k <= key.VK_NUMPAD9) then pressed = k - 48 end end end end lastState = ks yrest(50) until pressed -- Wait until that key stops being pressed repeat yrest(50) until not keyPressed(pressed) printf("\n") -- Return pressed character return string.char(pressed) else -- Restore console for input activateConsole() -- Print prompt cprintf(cli.green, prompt); -- Get input keyboardBufferClear(); io.stdin:flush(); local input = io.stdin:read(); yrest(500) -- Restore game showWindow(getWin(), sw.restore) yrest(500) -- Return input return input end end -- The main function function main() local playerAddress local playerId local playerHP local playerX = 0 local playerZ = 0 local playerY = 0 local running = true; local lastTime = getTime(); while(running) do local hf_x, hf_y, hf_wide, hf_high = windowRect( getWin()); cprintf(cli.turquoise, language[42], hf_wide, hf_high, hf_x, hf_y ); -- RoM windows size cprintf(cli.green, language[501]); -- RoM waypoint creator\n printf(language[502] -- Insert new waypoint .. language[503] -- Insert new harvest waypoint .. language[505] -- Save waypoints and quit .. language[509] -- Insert merchant command .. language[504] -- Insert target/dialog NPC command -- .. language[517] -- Insert choiceOption command .. language[530] -- Intert dialog 'ByName' selection. .. language[510] -- Insert Mouseclick Left command .. language[518] -- Reset script .. language[506] -- Save waypoints and restart .. language[519] -- Insert comment command .. language[522] -- Insert comment command .. language[526] -- Change Waypoint Type .. language[537], -- Toggle flying getKeyName(wpKey), getKeyName(harvKey), getKeyName(saveKey), getKeyName(merchantKey), getKeyName(targetNPCKey), getKeyName(byName), getKeyName(mouseClickKey), getKeyName(resetKey), getKeyName(restartKey), getKeyName(codeKey), getKeyName(targetObjKey), getKeyName(wpTypeKey), getKeyName(flyToggle)); attach(getWin()) message(language[501]); -- RoM waypoint creator\n local hf_key_pressed, hf_key; while(true) do hf_key_pressed = false; if( keyPressedLocal(wpKey) ) then -- normal waypoint key pressed hf_key_pressed = true; hf_key = "WP"; end; if( keyPressedLocal(harvKey) ) then -- harvest waypoint key pressed hf_key_pressed = true; hf_key = "HP"; end; if( keyPressedLocal(saveKey) ) then -- save key pressed hf_key_pressed = true; hf_key = "SAVE"; end; if( keyPressedLocal(merchantKey ) ) then -- merchant NPC key pressed hf_key_pressed = true; hf_key = "MER"; end; if( keyPressedLocal(targetNPCKey) ) then -- target NPC key pressed hf_key_pressed = true; hf_key = "NPC"; end; --[[ if( keyPressedLocal(choiceOptionKey) ) then -- choice option key pressed hf_key_pressed = true; hf_key = "CO"; end;]] if( keyPressedLocal(byName) ) then -- byname key pressed hf_key_pressed = true; hf_key = "BYNAME"; end; if( keyPressedLocal(codeKey) ) then -- choice option key pressed hf_key_pressed = true; hf_key = "COD"; end; if( keyPressedLocal(mouseClickKey) ) then -- target MouseClick key pressed hf_key_pressed = true; hf_key = "MC"; end; if( keyPressedLocal(restartKey) ) then -- restart key pressed hf_key_pressed = true; hf_key = "RESTART"; end; if( keyPressedLocal(resetKey) ) then -- reset key pressed hf_key_pressed = true; hf_key = "RESET"; end; if( keyPressedLocal(targetObjKey) ) then -- target object key pressed hf_key_pressed = true; hf_key = "OBJ"; end; if( keyPressedLocal(wpTypeKey) ) then -- waypoint type key pressed hf_key_pressed = true; hf_key = "WPT"; end; if( keyPressedLocal(flyToggle) ) then -- byname key pressed hf_key_pressed = true; hf_key = "FLY"; end; if( hf_key_pressed == false and -- key released, do the work hf_key ) then -- and key not empty -- SAVE Key: save waypoint file and exit if( hf_key == "SAVE" ) then saveWaypoints(wpList); hf_key = " "; -- clear last pressed key running = false; break; end; if( hf_key == "RESET" ) then clearScreen(); wpList = {}; -- DON'T save clear table hf_key = " "; -- clear last pressed key running = true; -- restart break; end; player.Address = memoryReadRepeat("uintptr", getProc(), addresses.staticbase_char, addresses.charPtr_offset) or 0; player:updateXYZ(); local tmp = {}, hf_type; tmp.X = player.X; tmp.Z = player.Z; tmp.Y = player.Y; hf_type = ""; local prefix = sprintf(language[511], #wpList+1) -- %d Waypoint Added. -- waypoint or harvest point key: create a waypoint/harvest waypoint if( hf_key == "HP" ) then -- harvest waypoint tmp.wp_type = "HP"; hf_type = "HP"; message(sprintf(language[512], #wpList+1) ); -- harvestpoint added elseif( hf_key == "WP") then -- normal waypoint tmp.wp_type = "WP"; hf_type = "WP"; message(prefix ); -- waypoint added elseif( hf_key == "MER" ) then -- merchant command tmp.wp_type = "MER"; local target = player:getTarget(); -- get target name tmp.npc_name = "("..target.Id..") -- "..target.Name; hf_type = "target/merchant NPC "..target.Name; message(prefix..sprintf(language[513], target.Name)); elseif( hf_key == "NPC" ) then -- target npc tmp.wp_type = "NPC"; local target = player:getTarget(); -- get target name tmp.npc_name = "("..target.Id..") -- "..target.Name; hf_type = "target/dialog NPC "..target.Name; message(prefix..sprintf(language[514], target.Name)); --[[ elseif( hf_key == "CO") then -- choose npc option tmp.wp_type = "CO"; -- ask for option number tmp.co_num = tonumber(getInput(true,language[507])) -- enter number of option hf_type = "Choosing option "..tmp.co_num; message(prefix..sprintf(language[516], tmp.co_num ) ); -- choice option]] elseif( hf_key == "COD") then -- enter code tmp.wp_type = "COD"; tmp.com = getInput(nil, language[520]); -- add code hf_type = tmp.com; message(prefix..sprintf(language[521], tmp.com or "nil" ) ); -- code elseif( hf_key == "MC" ) then -- is's a mouseclick? tmp.wp_type = "MC"; -- it is a mouseclick local x, y = mouseGetPos(); local wx, wy, hf_wide, hf_high = windowRect(getWin()); tmp.wide = hf_wide; tmp.high = hf_high; tmp.mx = x - wx; tmp.my = y - wy; hf_type = sprintf("mouseclick at %d,%d (%dx%d)", tmp.mx, tmp.my, tmp.wide, tmp.high ); message(prefix..sprintf(language[515], tmp.mx, tmp.my, tmp.wide, tmp.high )); -- Mouseclick elseif( hf_key == "OBJ" ) then -- target object tmp.wp_type = "OBJ"; local mouseObj = CObject(memoryReadUIntPtr(getProc(), addresses.staticbase_char, addresses.mousePtr_offset)); tmp.obj_name = "("..mouseObj.Id..") -- "..mouseObj.Name hf_type = sprintf("target object \'%s\'", mouseObj.Name ); message(prefix..sprintf(language[523],mouseObj.Name)); -- target object elseif( hf_key == "WPT") then -- change waypoint type tmp.wp_type = "WPT"; tmp.com = getInput(true, language[527]); -- Change to (T)ravel, (R)un, or (N)ormal if tmp.com == "1" or tmp.com == "2" or tmp.com == "3" then tmp.wp_type = nil -- Doesn't need to save waypoint local tmp_type if tmp.com == "1" then tmp_type = "TRAVEL" elseif tmp.com == "2" then tmp_type = "RUN" elseif tmp.com == "3" then tmp_type = "NORMAL" end if tmp_type ~= "NORMAL" then p_wp_gtype = " type=\""..tmp_type.."\"" else p_wp_gtype = "" end hf_type = sprintf("File waypoint type set to \'%s\'", tmp_type); message(sprintf(language[529], tmp_type ) ); -- Whole file Waypoint Type changed to else if tmp.com == "4" then tmp.wp_move = "TRAVEL" elseif tmp.com == "5" then tmp.wp_move = "RUN" elseif tmp.com == "6" then tmp.wp_move = "NORMAL" else tmp.wp_move = "NORMAL" end hf_type = sprintf("Single waypoint type set to \'%s\'", tmp.wp_move ); message(prefix..sprintf(language[528], tmp.wp_move ) ); end elseif( hf_key == "BYNAME") then local dialogOpen = RoMScript("SpeakFrame:IsVisible()") if not dialogOpen then hf_type = language[531] -- Please open the npc dialog before using this option. message(language[531], "warning" ); tmp.wp_type = nil -- Doesn't need to save waypoint else tmp.com = getInput(true, language[507]); -- Choose option local name, typ, index = getChoice(tmp.com) if name == nil then tmp.wp_type = nil hf_type = "" message("", "warning"); elseif typ == 1 then tmp.wp_type = "ACCEPT" local questIdsBefore = scanQuestIds() if index ~= nil then RoMScript("OnClick_QuestListButton(1,"..index..")") -- Clicks the quest end RoMScript("AcceptQuest()") yrest(1000) -- Accepts the quest RoMScript("SpeakFrame:Hide()") -- Close dialog. local questIdsAfter = scanQuestIds() tmp.id = findId(questIdsAfter, questIdsBefore) if tmp.id then tmp.name = GetIdName(tmp.id) else tmp.name = name end hf_type = sprintf("Accept Quest '%s'", tmp.name) message(prefix..sprintf(language[534], tmp.name) ); -- AcceptQuestName elseif typ == 2 then hf_type = language[533] message(hf_type, "warning") tmp.wp_type = nil elseif typ == 3 then tmp.wp_type = "COMPLETE" local questIdsBefore = scanQuestIds() if index ~= nil then RoMScript("OnClick_QuestListButton(3,"..index..")") -- Clicks the quest end -- Check for rewards local rewardCount = RoMScript("GetQuestItemNumByType_QuestDetail(2)") if rewardCount > 0 then tmp.rewards = {} local tmptext = "" for i = 1, rewardCount do tmp.rewards[i] = RoMScript("GetQuestItemInfo_QuestDetail( 2,"..i..")") tmptext = tmptext .. sprintf(", (%d) %s",i , tmp.rewards[i]) end tmp.rewnum = getInput(true, sprintf(language[538],tmptext)); -- Select reward if tonumber(tmp.rewnum) then RoMScript("SpeakFrame_ClickQuestReward(SpeakQuestReward1_Item"..tmp.rewnum..")") end end RoMScript("CompleteQuest()") yrest(1000) -- Completes the quest RoMScript("SpeakFrame:Hide()") -- Close dialog. local questIdsAfter = scanQuestIds() tmp.id = findId(questIdsBefore, questIdsAfter) if tmp.id then tmp.name = GetIdName(tmp.id) else tmp.name = name end hf_type = sprintf("Complete Quest '%s'", tmp.name) message(prefix..sprintf(language[535], tmp.name) ); -- CompleteQuestName else tmp.wp_type = "COBYNAME" tmp.text = name hf_type = sprintf("ChoiceOptionByName \'%s\'",name) message(prefix..sprintf(language[516], "\'"..name.."\'" ) ); -- ChoiceOptionByName tmp.keystring = getKeyStrings(name, true)--, "SC_", "SP") end end elseif( hf_key == "FLY") then -- Toggle flying local offsets = {addresses.charPtr_offset, addresses.pawnSwim_offset1, addresses.pawnSwim_offset2} local active = 4 local flying = (memoryReadIntPtr(getProc(), addresses.staticbase_char, offsets) == active) if flying then tmp.com = "flyoff()" memoryWriteString(getProc(), addresses.swimAddress, string.char(unpack(addresses.swimAddressBytes))); else tmp.com = "fly()" memoryWriteString(getProc(), addresses.swimAddress, string.rep(string.char(0x90),#addresses.swimAddressBytes)); memoryWriteIntPtr(getProc(), addresses.staticbase_char, offsets, active); end -- Ask user if they want to insert command local answer = getInput(true, sprintf(language[536],tmp.com)); -- add fly if answer == "1" then tmp.wp_type = "COD"; hf_type = tmp.com message(prefix..sprintf(language[521], hf_type) ); -- code else tmp.wp_type = nil -- Doesn't need to save waypoint if flying then hf_type = "No longer flying." else hf_type = "Now flying." end end end local coords = "" if hf_type == "WP" or hf_type == "HP" then coords = sprintf(", (%d, %d, %d)", tmp.X, tmp.Z, tmp.Y) end printf(language[508], -- (X, Z, Y), Press %s to save and quit #wpList+1, (hf_type..coords), getKeyName(saveKey)); if tmp.wp_type ~= nil then -- In case of invalid command table.insert(wpList, tmp); end if( hf_key == "RESTART" ) then saveWaypoints(wpList); hf_key = " "; -- clear last pressed key running = true; -- restart break; end; hf_key = nil; -- clear last pressed key end; -- To reduce cpu usage, do memory reads every 500ms. if deltaTime(getTime(), lastTime) > 500 then playerAddress = memoryReadUIntPtr(getProc(), addresses.staticbase_char, addresses.charPtr_offset); playerId = memoryReadInt(getProc(), playerAddress + addresses.pawnId_offset) or 0 playerHP = memoryReadInt(getProc(), playerAddress + addresses.pawnHP_offset) or 0 if not isInGame() or playerId < PLAYERID_MIN or playerId > PLAYERID_MAX or playerHP < 1 then repeat yrest(1000) playerAddress = memoryReadUIntPtr(getProc(), addresses.staticbase_char, addresses.charPtr_offset); playerId = memoryReadInt(getProc(), playerAddress + addresses.pawnId_offset) or 0 playerHP = memoryReadInt(getProc(), playerAddress + addresses.pawnHP_offset) or 0 until isInGame() and playerId >= PLAYERID_MIN and playerId <= PLAYERID_MAX and playerHP > 1 end playerX = memoryReadFloat(getProc(), playerAddress + addresses.pawnX_offset) or playerX playerY = memoryReadFloat(getProc(), playerAddress + addresses.pawnY_offset) or playerY playerZ = memoryReadFloat(getProc(), playerAddress + addresses.pawnZ_offset) or playerZ mousePawnAddress = memoryReadUIntPtr(getProc(), addresses.staticbase_char, addresses.mousePtr_offset) or 0 if( mousePawnAddress ~= 0) then mousePawnId = memoryReadUInt(getProc(), mousePawnAddress + addresses.pawnId_offset) or 0 mousePawnName = GetIdName(mousePawnId) or "" mousePawnX = memoryReadFloat(getProc(), mousePawnAddress + addresses.pawnX_offset) or mousePawnX mousePawnY = memoryReadFloat(getProc(), mousePawnAddress + addresses.pawnY_offset) or mousePawnY mousePawnZ = memoryReadFloat(getProc(), mousePawnAddress + addresses.pawnZ_offset) or mousePawnZ setWindowName(getHwnd(), sprintf("\rObject found Id %d \"%s\", Distance %d\t\t\t", mousePawnId, mousePawnName, distance(playerX, playerZ, playerY, mousePawnX, mousePawnZ, mousePawnY))); else setWindowName(getHwnd(), sprintf("\rPlayer Position X: %d, Z: %d, Y: %d\t\t\t",playerX, playerZ, playerY)); end lastTime = getTime() end yrest(10); end -- End of: while(true) end -- End of: while(running) end startMacro(main, true);