Quantcast
Exp_ZoneNames = {};
local Exp_Targets = {};
local Exp_TargetsMini = {};
local lastmap="";
local showmissing = true;
ExplorerCoordsConfig = {};

local Astrolabe = DongleStub("Astrolabe-1.0");



function ExplorerCoords_OnLoad()
	--if not (ExplorerCoord) then
		--ExplorerCoords_Init();
	 --end
    ExplorerCoordsFrame:RegisterEvent("ADDON_LOADED");
	Exp_ZoneNames[1] = { GetMapZones(1) } ;
	Exp_ZoneNames[2] = { GetMapZones(2) } ;
	Exp_ZoneNames[3] = { GetMapZones(3) } ;
	Exp_ZoneNames[4] = { GetMapZones(4) } ;
	Exp_ZoneNames[5] = { GetMapZones(5) } ;
	for i=1,30,1 do
	  Exp_Target=CreateFrame("Button", "ExplorerCoordsWorldTargetFrame",WorldMapDetailFrame );
	  Exp_Target:SetWidth(16);
      Exp_Target:SetHeight(16);
	  Exp_Target.icon = Exp_Target:CreateTexture("ARTWORK");
      Exp_Target.icon:SetAllPoints();
	  Exp_Target.icon:SetTexture("Interface\\AddOns\\ExplorerCoords\\images\\coordicon");
	  Exp_Target:SetFrameLevel(10000);
	  Exp_Target:EnableMouse(true);
	  Exp_Target:SetScript("OnEnter", ExplorerCoords_Coord_OnEnter);
	  Exp_Target:SetScript("OnLeave", ExplorerCoords_Coord_OnLeave);
	  Exp_Targets[i]=Exp_Target;
	end

	for i=1,30,1 do
	  Exp_TargetMini=CreateFrame("Button", "ExplorerCoordsMinimapTargetFrame",UIParent );
	  Exp_TargetMini:SetWidth(10);
      Exp_TargetMini:SetHeight(10);
	  Exp_TargetMini.icon = Exp_TargetMini:CreateTexture("ARTWORK");
      Exp_TargetMini.icon:SetAllPoints();
	  Exp_TargetMini.icon:SetTexture("Interface\\AddOns\\ExplorerCoords\\images\\coordicon");
	  Exp_TargetMini:SetFrameLevel(10000);
	  Exp_TargetMini:EnableMouse(true);
	  Exp_TargetMini:SetScript("OnEnter", ExplorerCoords_MiniCoord_OnEnter);
	  Exp_TargetMini:SetScript("OnLeave", ExplorerCoords_MiniCoord_OnLeave);
	  Exp_TargetsMini[i]=Exp_TargetMini;
	end
	--GetCurrentMapZone

end

function ExplorerCoords_Init()
	if not (ExplorerCoord ) or not (ExplorerCoord["v"]) or (ExplorerCoord["v"] ~= 6)  then

		ExplorerCoord = {};
		for index,value in pairs(ExplorerCoordInit) do
			for index2,value2 in pairs(value) do

					parentzone=ExplorerCoords_GetZoneName(index,index2);
					ExplorerCoord[parentzone] = {};
					ExplorerCoord[parentzone]["catid"] = index2;

				for index3,value3 in pairs(value2) do
					if(index2 == 868) then
						--ExplorerCoord[parentzone] = {};
					else
						--dirty vashjir hack
						if(index2==4825) then
							local tmp_parentzone=ExplorerCoords_GetZoneName(-1,value3["subz"]);
							if not(ExplorerCoord[tmp_parentzone]) then
								ExplorerCoord[tmp_parentzone] = {};
								ExplorerCoord[tmp_parentzone]["catid"] = index2;
							end
							subzone = ExplorerCoords_GetSubZoneName(index2,index3);
							ExplorerCoord[tmp_parentzone][subzone] = {};
							ExplorerCoord[tmp_parentzone][subzone]["x"] = value3["x"];
							ExplorerCoord[tmp_parentzone][subzone]["y"] = value3["y"];
						else

							--print(index2.." - "..index3);
							subzone = ExplorerCoords_GetSubZoneName(index2,index3);
							--print(parentzone.."--"..subzone);

							ExplorerCoord[parentzone][subzone] = {};
							ExplorerCoord[parentzone][subzone]["x"] = value3["x"];
							ExplorerCoord[parentzone][subzone]["y"] = value3["y"];
						end
					end
				end
			end
		end
		ExplorerCoord["v"] = {};
		ExplorerCoord["v"] = 6;
		ExplorerCoordInit = nil;
	end
end

function  ExplorerCoords_GetZoneName(zoneindex,zoneid)
	--dirty vashjir hack
	if(zoneindex==-1) then
		SetMapByID(zoneid);
	else
		SetMapByID(ExplorerCoordMapIt[zoneindex][zoneid]);
	end
	return Exp_ZoneNames[GetCurrentMapContinent()][GetCurrentMapZone()];

	--for i=1,GetAchievementNumCriteria(zoneindex),1 do
		--zonename,_,_,_,_,_,_,zoneidingame,_,_=GetAchievementCriteriaInfo(zoneindex,i);
		--DEFAULT_CHAT_FRAME:AddMessage(zoneid);
		--if(zoneid==zoneidingame) then
			--DEFAULT_CHAT_FRAME:AddMessage("hjohoho");
		--	return zonename;
		--end
	--end

end

function  ExplorerCoords_GetSubZoneName(zoneindex,zoneid)
	for i=1,GetAchievementNumCriteria(zoneindex),1 do
		zonename,_,_,_,_,_,_,zoneidingame,_,_=GetAchievementCriteriaInfo(zoneindex,i);
		--zonename,_,_,_,_,_,_,_,_,zoneidingame=GetAchievementCriteriaInfo(zoneindex,i);
		--DEFAULT_CHAT_FRAME:AddMessage(zoneidingame);
		if(zoneid==zoneidingame) then
			--DEFAULT_CHAT_FRAME:AddMessage("hjohoho");
			return zonename;
		end
	end

end

function ExplorerCoords_OnEvent(self,event, ...)
	if ( (event == "WORLD_MAP_UPDATE") and WorldMapFrame:IsVisible() ) then
		ExplorerCoords_UpdateMap("world");
	elseif(event == "ZONE_CHANGED_NEW_AREA") then
		ExplorerCoords_UpdateMap("mini");

	elseif(event == "ADDON_LOADED") then
	local arg1 = ...;

   if(arg1 == "ExplorerCoords") then
		ExplorerCoords_Init();
		ExplorerCoordsConfig:Init();
		ExplorerCoordsFrame:UnregisterEvent("ADDON_LOADED");
    end
  end
end


local function GetZoneInfo(zonename)
	for i=1,5,1 do
		for index,value in pairs(Exp_ZoneNames[i]) do
			if (value == zonename) then
				return i,index;
			end
		end
	end

end

function ExplorerCoords_ClearNotes(whichmap)
	if(whichmap == "world") then

		for i=1,30,1 do
			Exp_Target = Exp_Targets[i];
			Exp_Target:Hide();
		end
	elseif(whichmap == "mini") then
		for i=1,30,1 do
			Exp_TargetMini = Exp_TargetsMini[i];
			Exp_TargetMini:Hide();
		end
	end
end

function ExplorerCoords_UpdateMap(whichmap)
	ExplorerCoords_ClearNotes(whichmap);

	if(whichmap=="world" and GetCurrentMapZone()<1) then
	  return;
	end
	  if(whichmap == "world") then
		currentzone = Exp_ZoneNames[GetCurrentMapContinent()][GetCurrentMapZone()];
	  elseif(whichmap == "mini") then
		currentzone = GetRealZoneText();

	  end
	  if( ExplorerCoord[currentzone]) then
	    if(whichmap == "world") then
			if(lastmap==currentzone) then
				showmissing = false;
			else
				showmissing = true;
				lastmap = currentzone;
			end;
		end

	    catid = ExplorerCoord[currentzone]["catid"];
		--fuckup here still
		if(catid==868) then
			return;
		end
	    for i=1,GetAchievementNumCriteria(catid),1 do
	      criteriaString, criteriaType, completed, quantity, reqQuantity, charName, flags, assetID, quantityString, unknown = GetAchievementCriteriaInfo(catid, i);

		  if(completed) then

	      else
		    if(ExplorerCoord[currentzone][criteriaString]) then
			  if(ExplorerCoord[currentzone][criteriaString]["x"]~=-1) then
			    coordx = ExplorerCoord[currentzone][criteriaString]["x"];
	            coordy = ExplorerCoord[currentzone][criteriaString]["y"];

			    if(whichmap == "world") then
				  Exp_Target = Exp_Targets[i];
			      Exp_Target.id = criteriaString;
	              Exp_Target:Show();
				  Astrolabe:PlaceIconOnWorldMap( WorldMapDetailFrame, Exp_Target, GetCurrentMapAreaID(), GetCurrentMapDungeonLevel(), coordx, coordy );
			    elseif(whichmap == "mini") then
				  Exp_TargetMini = Exp_TargetsMini[i];
				  Exp_TargetMini.id = criteriaString;
				  Exp_TargetMini:Show();
				  mini_continent, mini_zone = GetZoneInfo(currentzone);
				  SetMapToCurrentZone();
				  Astrolabe:PlaceIconOnMinimap(Exp_TargetMini, GetCurrentMapAreaID(),GetCurrentMapDungeonLevel(), coordx, coordy );
			    end
			  else
			    if(showmissing and whichmap == "world" and (not ExplorerCoords_Config.ShowMissingCoords or ExplorerCoords_Config.ShowMissingCoords==0)) then
				  DEFAULT_CHAT_FRAME:AddMessage("Explorer Coords: Missing coords for "..criteriaString);
			    end
			  end
			end
			--else
			-- if(showmissing and whichmap == "world") then
			--	DEFAULT_CHAT_FRAME:AddMessage("Explorer Coords: Missing coords for "..criteriaString);
			-- end
			--end
	      end
	    end
	  end


end

function ExplorerCoords_MiniCoord_OnEnter(frame,this)

  local tooltip = GameTooltip;
  tooltip:SetOwner(frame, "ANCHOR_BOTTOMLEFT")
  tooltip:ClearLines()
  tooltip:AddLine(frame.id);
  tooltip:Show();

end

function ExplorerCoords_MiniCoord_OnLeave()
  GameTooltip:Hide();
end

function ExplorerCoords_Coord_OnEnter(frame,this)
  WorldMapPOIFrame.allowBlobTooltip = false;
  local tooltip = WorldMapTooltip;
  tooltip:SetOwner(frame, "ANCHOR_BOTTOMLEFT")
  tooltip:ClearLines()
  tooltip:AddLine(frame.id);
  tooltip:Show();

end

function ExplorerCoords_Coord_OnLeave()
  WorldMapPOIFrame.allowBlobTooltip = true;
  WorldMapTooltip:Hide();
end