<?xml version="1.0" encoding="utf-8"?><waypoints type="TRAVEL" >
<!-- Rock5's Course of Terror waypoint file with teleport -->
<!--   version 1.61 . Thanks to lisa for original script  -->
<onload><![CDATA[
	--=== User Options ===--

	When_Finished = "end" -- "end" to end script, "relog" to log next character and "waypointfilename" to load that waypointfile.

	--====================--

	function checkRelog()
		if When_Finished == "relog" then
			sendMacro("}LoginNextToon=true;a={")
			sendMacro("Logout();");
			waitForLoadingScreen();
			loadPaths("cot_tele");
		elseif When_Finished == "end" then
			error("Ending script",2)
		else
			if not string.find(When_Finished,".", 1, true) then
				When_Finished = When_Finished .. ".xml"
			end
			local filename = getExecutionPath() .. "/waypoints/" .. When_Finished
			local file, err = io.open(filename, "r");
			if file then
				file:close();
				loadPaths(When_Finished)
			else
				error("'When_Finished' option is invalid",0)
			end
		end
	end

	function checkaggro()
		repeat
			player:update()
			if player.Battling then
				local clown = player:findEnemy(true)
				player.X = clown.X player.Z = clown.Z -- Temporarily change player coords so we can find nearest seal to mob
				local seal = player:findNearestNameOrId(102384)
				player:target(seal) -- kills the summoning portal and not the ghost clown.
				player:fight()
				yrest(2000) -- give a couple of seconds for the clown to disappear.
				player:update()
			end
		until not player.Battling
	end

	function getallkeys()
		local lastSealAddress = 0
		repeat
			player:update()
			local seal = player:findNearestNameOrId(113112, lastSealAddress)
			if seal then
				-- goto seal
				teleport(nil,nil,75) 			-- go up to height if 75
				teleport(seal.X, seal.Z, 75)	-- teleport to above seal
				teleport(seal.X + 1, seal.Z, 57)	-- teleport in range to click seal

				-- click seal
				repeat
					checkaggro()
					player:target(seal)
					yrest(100)
					RoMScript("UseSkill(1,1)")
					yrest(1000)
					player:update()
				until player:findNearestNameOrId(113106) -- until a key appears

				-- Remember last seal
				lastSealAddress = seal.Address

				-- Collect key
				local keys = inventory:itemTotalCount(203027)

				repeat
					checkaggro()
					player:target_Object(113106,nil,nil,true) -- harvests key
				until inventory:itemTotalCount(203027) == keys + 1
				yrest(500)

			end
		until gotAllKeys()
	end

	function gotogate()
		teleport(nil,nil,75) 			-- go up to height if 75
		teleport(4080,3948.5,75) 		-- teleport to above portal
		teleport(4080,3974,30) 		-- teleport into portal
		player:faceDirection(3.14/2) -- Face forward
		keyboardHold( settings.hotkeys.MOVE_FORWARD.key );
		repeat
			player:update()
			dist = distance(player.X, player.Z, 4081, 3335)
			yrest(700)
		until 100 > dist
		printf("Distance checked and continuing.\n")
	end

	function gotAllKeys()
		local room = currentRoom()
		local keys = inventory:itemTotalCount(203027)
		local keyGoal = (room == 1 and 1) or (room == 2 and 3) or (room == 3 and 6) or (room == 4 and 10)
		return keys >= keyGoal
	end

	function currentRoom()
		return memoryReadRepeat("int",getProc(), player.Address + 0x1c8)
	end



	if teleport_GetVersion == nil or  teleport_GetVersion() < 2.0 then
		cprintf(cli.yellow,"This waypoint file requires the userfunction \"teleport\" version 2.0 or newer.\n")
		error("You can download it from this address. http://www.solarstrike.net/phpBB3/viewtopic.php?f=27&t=2721",0)
	end

	numshells = inventory:getItemCount(240181)

	Malatina = GetIdName(111813)

	settings.profile.options.WP_NO_STOP = false
	table.insert(settings.profile.friends, "102382") -- adds the barrier to friend so doesn't try to kill it.
	changeProfileOption("HARVEST_DISTANCE", 450);

	local zoneid = RoMScript("GetZoneID()")
	if zoneid ~= 353 then -- not in Course of Terror

		-- Try to find Malatina and teleport in
		if player:target_NPC(Malatina) then
			if 50 > player.Level and (player.Level2 >= 50 or player.Level3 >= 50) then
				-- Wait for user to change class
				cprintf(cli.yellow,"If you want to earn Phirius Shells, change to your 50+ class before continuing.\n")
				player:sleep()
			end

			sendMacro("ChoiceOption(2);");
			yrest(2000)
			sendMacro("ChoiceOption(1);");
			if not waitForLoadingScreen(30) then
				print("Failed to teleport into Course of Terror")
				checkRelog()
			end
			yrest(1000)
			__WPL:setWaypointIndex(__WPL:getNearestWaypoint(player.X,player.Z))
		else
			print("You are too far from Malatina")
			checkRelog()
		end
	end

]]></onload>

<!-- AT THE START POINT -->
	<!-- # 1 --><waypoint x="4081" z="3360" y="18" tag="START">
		if currentRoom() == 1 then -- Just arrived
			if not RoMScript("TimeKeeperFrame:IsVisible()") then
				player:target_NPC(Malatina);
				yrest(2000)
				sendMacro("ChoiceOption(2);");
				yrest(2000)
				sendMacro("ChoiceOption(1);");
				repeat yrest(1000) until RoMScript("TimeKeeperFrame:IsVisible()")
			end
		elseif currentRoom() > 4 then -- Finished. Open chests
			--=== Create table for chests ===--
			chests = {left = {}, right = {}}

			local objectList = CObjectList();
			objectList:update();
			local objSize = objectList:size()

			for i = 0,objSize do
				local obj = objectList:getObject(i);
				if obj.Id == 113114 or obj.Id == 113137 then
					if obj.X > 4081 then -- right side
						table.insert(chests.right, table.copy(obj))
					else -- left side
						table.insert(chests.left, table.copy(obj))
					end
				end
			end

			-- Sort chests
			table.sort(chests.left, function(a,b) return b.Z > a.Z end)
			table.sort(chests.right, function(a,b) return a.Z > b.Z end)

			-- Get left side
			for k,v in pairs(chests.left) do
				memoryWriteInt(getProc(), player.Address + addresses.pawnTargetPtr_offset, v.Address);
				RoMScript("UseSkill(1,1)");
				yrest(2000)
				RoMScript("UseSkill(1,1)");
				yrest(2000)
				repeat
					yrest(2000)
					player:update()
				until not player.Casting
			end

			-- Get right side
			for k,v in pairs(chests.right) do
				memoryWriteInt(getProc(), player.Address + addresses.pawnTargetPtr_offset, v.Address);
				RoMScript("UseSkill(1,1)");
				yrest(2000)
				RoMScript("UseSkill(1,1)");
				yrest(2000)
				repeat
					yrest(2000)
					player:update()
				until not player.Casting
				yrest(1000) -- time to stand
			end

			-- Save data
			if player.Level >= 50 or player.Level2 >= 50 or player.Level3 >= 50 then
				local filename = getExecutionPath() .. "/logs/shells.log";
				local file, err = io.open(filename, "a+");
				if file then
					file:write(" Character name: " ..string.format("%-10s",player.Name .. ".").." \tDate: " .. os.date() .. ". \tShells gained: "..inventory:getItemCount(240181) - numshells..
					". \tTotal shells: "..inventory:getItemCount(240181).. ".\n")
					file:close();
				end
			end

			player:moveTo(CWaypoint(4081,3335))
			print("Completed Successfully.")
			checkRelog()
		end
	</waypoint>
<!-- JUST BEFORE THE DOOR -->
	<!-- # 2 --><waypoint x="4081" z="3499" y="18" >	</waypoint>
<!-- JUST AFTER THE DOOR -->
	<!-- # 3 --><waypoint x="4081" z="3600" y="28" >
		yrest(3000)
		fly()
		getallkeys()
		gotogate()
		flyoff()
		__WPL:setWaypointIndex(__WPL:findWaypointTag("START"));
	</waypoint>
</waypoints>
