vanilla-wow-addons – Rev 1
?pathlinks?
-- MetaMapWKB
-- Written by MetaHawk - aka Urshurak
MetaKB_dbID = "db1.1";
METAKB_AUTHOR = "MetaMapWKB";
METAKB_SCROLL_FRAME_BUTTON_HEIGHT = 16;
METAKB_SCROLL_FRAME_BUTTONS_SHOWN = 20;
METAKB_SORTBY_NAME = "name";
METAKB_SORTBY_DESC = "desc";
METAKB_SORTBY_LEVEL = "level";
METAKB_SORTBY_LOCATION = "location";
MetaKB_Data = {};
MetaKB_Data[MetaKB_dbID] = {};
MetaKBOptions = {};
MetaKB_List = {};
MetaKB_overRide = false;
MetaKB_ShowAllZones = false;
MetaKB_ScrollFrameButtonID = 0;
MetaKB_VarsLoaded = false;
local MetaKB_LastSearch = "";
local MetaKB_SearchResults = {};
local MetaKB_PlayerX = 0;
local MetaKB_PlayerY = 0;
function MetaKB_MainFrame_OnLoad()
this:RegisterEvent("ADDON_LOADED");
this:RegisterEvent("WORLD_MAP_UPDATE");
this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
end
function MetaKB_OnEvent(event)
if(event == "ADDON_LOADED" and arg1 == "MetaMapWKB") then
if(MetaKBOptions.ShowUpdates == nil) then MetaKBOptions.ShowUpdates = false; end
if(MetaKBOptions.CreateMapNotesBoundingBox == nil) then MetaKBOptions.CreateMapNotesBoundingBox = true; end
if(MetaKBOptions.AutoTrack == nil) then MetaKBOptions.AutoTrack = false; end
if(MetaKBOptions.KBstate == nil) then MetaKBOptions.KBstate = false; end
if(MetaKBOptions.NewTargetNote == nil) then MetaKBOptions.NewTargetNote = false; end
if(MetaKBOptions.RangeCheck == nil) then MetaKBOptions.RangeCheck = 1; end
if(MetaKBOptions.Dsearch == nil) then MetaKBOptions.Dsearch = true; end
if(MetaKBOptions.EmbedKB == nil) then MetaKBOptions.EmbedKB = true; end
if(MetaKBOptions.SetMapShow == nil) then MetaKBOptions.SetMapShow = false; end
MetaMapWKB_OptionsDialogInit();
MetaMapWKB_VerifyData();
MetaKB_InitFrame();
end
if(event == "INSTANCE_MAP_UPDATE" and WorldMapFrame:IsVisible()) then
if(MetaKB_DisplayFrame:IsVisible() and MetaKBOptions.EmbedKB and not MetaKB_ShowAllZones) then
MetaKB_Search();
else
MetaMapContainerFrame:Hide();
end
end
if(event == "WORLD_MAP_UPDATE" and WorldMapFrame:IsVisible()) then
if(MetaKB_DisplayFrame:IsVisible() and MetaKBOptions.EmbedKB and not MetaKB_ShowAllZones) then
MetaKB_Search();
else
MetaMapContainerFrame:Hide();
end
end
if(event == "ZONE_CHANGED_NEW_AREA") then
if(MetaKB_DisplayFrame:IsVisible() and not MetaKB_ShowAllZones) then
MetaKB_Search();
end
end
if(event == "UPDATE_MOUSEOVER_UNIT" and MetaKBOptions.AutoTrack) then
if(UnitIsPlayer("mouseover")~=1 and UnitPlayerControlled("mouseover")~=1 and UnitIsDead("mouseover")~=1) then
MetaKB_AddUnitInfo("mouseover");
end
end
end
function MetaMapWKB_OptionsDialogInit()
MetaKB_AlwaysOnCheckButton:SetChecked(MetaMapOptions.WKBalwaysOn);
MetaKB_ShowUpdatesCheckButton:SetChecked(MetaKBOptions.ShowUpdates);
MetaKB_BoundingBoxCheckButton:SetChecked(MetaKBOptions.CreateMapNotesBoundingBox);
MetaKB_AutoTrackingCheckButton:SetChecked(MetaKBOptions.AutoTrack);
MetaKB_DsearchCheckButton:SetChecked(MetaKBOptions.Dsearch);
MetaKB_UseKBCheckButton:SetChecked(MetaKBOptions.KBstate);
MetaKB_SetTargetNoteCheckButton:SetChecked(MetaKBOptions.NewTargetNote);
MetaKB_SetMapShowCheckButton:SetChecked(MetaKBOptions.SetMapShow);
MetaKB_EmbedCheckButton:SetChecked(MetaKBOptions.EmbedKB);
MetaKB_ToggleSetRange(MetaKBOptions.RangeCheck);
end
function MetaKB_InitFrame()
if(MetaKBOptions.EmbedKB) then
MetaKB_DisplayFrame:SetParent("MetaMapContainerFrame");
MetaKB_DisplayFrame:SetPoint("CENTER", "MetaMapContainerFrame", "CENTER", 0, 0);
MetaKB_DisplayFrame:SetWidth(MetaMapContainerFrame:GetWidth());
MetaKB_DisplayFrame:SetHeight(MetaMapContainerFrame:GetHeight());
MetaKB_HeaderPanel:SetHeight(40);
MetaKB_FooterPanel:SetHeight(60);
MetaKB_CloseMainFrameButton:Hide();
METAKB_SCROLL_FRAME_BUTTON_HEIGHT = 18;
METAKB_SCROLL_FRAME_BUTTONS_SHOWN = 30;
else
MetaKB_DisplayFrame:SetParent("MetaKB_OuterFrame");
MetaKB_DisplayFrame:SetPoint("CENTER", "MetaKB_OuterFrame", "CENTER", 0, 0);
MetaKB_DisplayFrame:SetWidth(710);
MetaKB_DisplayFrame:SetHeight(370);
MetaKB_HeaderPanel:SetHeight(22);
MetaKB_FooterPanel:SetHeight(40);
MetaKB_CloseMainFrameButton:Show();
METAKB_SCROLL_FRAME_BUTTON_HEIGHT = 16;
METAKB_SCROLL_FRAME_BUTTONS_SHOWN = 20;
end
MetaKB_HeaderPanel:SetWidth(MetaKB_HeaderPanel:GetParent():GetWidth());
MetaKB_HeaderPanel:SetFrameLevel(MetaKB_HeaderPanel:GetParent():GetFrameLevel()+1);
MetaKB_FooterPanel:SetWidth(MetaKB_FooterPanel:GetParent():GetWidth());
MetaKB_FooterPanel:SetFrameLevel(MetaKB_FooterPanel:GetParent():GetFrameLevel()+1);
MetaKB_ScrollFrame:SetHeight(MetaKB_ScrollFrame:GetParent():GetHeight() - (MetaKB_HeaderPanel:GetHeight()+MetaKB_FooterPanel:GetHeight()));
MetaKB_ScrollFrame:SetWidth(MetaKB_ScrollFrame:GetParent():GetWidth()-22);
MetaKB_Header1:SetWidth(MetaKB_HeaderPanel:GetWidth()*0.2675);
MetaKB_Header2:SetWidth(MetaKB_HeaderPanel:GetWidth()*0.38);
MetaKB_Header3:SetWidth(MetaKB_HeaderPanel:GetWidth()*0.16);
MetaKB_Header4:SetWidth(MetaKB_HeaderPanel:GetWidth()*0.20);
for i=1, METAKB_SCROLL_FRAME_BUTTONS_SHOWN,1 do
getglobal("MetaKB_ScrollFrameButton"..i.."Name"):SetWidth(MetaKB_Header1:GetWidth());
getglobal("MetaKB_ScrollFrameButton"..i.."Info1"):SetWidth(MetaKB_Header2:GetWidth());
getglobal("MetaKB_ScrollFrameButton"..i.."Info2"):SetWidth(MetaKB_Header3:GetWidth());
getglobal("MetaKB_ScrollFrameButton"..i.."Coords"):SetWidth(MetaKB_Header4:GetWidth());
end
end
function MetaMapWKB_VerifyData()
local TempData = {}
TempData[MetaKB_dbID] = {};
for name, continentTable in MetaKB_Data[MetaKB_dbID] do
for continent, zoneTable in continentTable do
if(type(continent) ~= "String") then
for zone, value in zoneTable do
if(zone ~= 0) then
TempData[MetaKB_dbID][name] = {};
TempData[MetaKB_dbID][name][continent] = {};
TempData[MetaKB_dbID][name][continent][zone] = {};
TempData[MetaKB_dbID][name][continent][zone] = value;
end
end
end
end
end
MetaKB_Data = {};
MetaKB_Data[MetaKB_dbID] = {};
MetaKB_Data[MetaKB_dbID] = TempData[MetaKB_dbID];
TempData = nil;
end
function MetaKB_ToggleFrame(mode)
if(MetaKBOptions.EmbedKB) then
if(MetaKB_DisplayFrame:IsVisible()) then
MetaMapContainer_ShowFrame();
if(mode == 1) then
MetaMap_ToggleFrame(WorldMapFrame);
end
else
if(not WorldMapFrame:IsVisible()) then
MetaMap_ToggleFrame(WorldMapFrame);
end
MetaMapContainer_ShowFrame(MetaKB_DisplayFrame);
end
else
MetaMap_ToggleFrame(MetaKB_DisplayFrame:GetParent());
end
end
function MetaKB_StripTextColors(textString)
-- this function is designed to replace
-- |cff00AA00Colored Text|r with Colored Text
if(textString ~= nil and textString ~= "") then
return string.gsub(textString, "|c[%dA-Fa-f][%dA-Fa-f][%dA-Fa-f][%dA-Fa-f][%dA-Fa-f]"..
"[%dA-Fa-f][%dA-Fa-f][%dA-Fa-f](.*)|r", "%1");
else
assert(false, "nil or invalid parameter to StripTextColors");
end
end
function MetaKB_ToggleSetRange(range)
for i=1, 5 do
if(i == range) then
local checkButton = getglobal("MetaKB_RangeCheck"..i);
checkButton:SetChecked(true);
else
local checkButton = getglobal("MetaKB_RangeCheck"..i);
checkButton:SetChecked(false);
end
end
MetaKBOptions.RangeCheck = range;
end
function MetaKB_UpdateKeySelectedUnit()
if (not UnitExists("target")) then
MetaMap_StatusPrint(METAKB_NOTARGET,MetaKBOptions.ShowUpdates);
return;
else
if(IsControlKeyDown()) then
MetaKB_overRide = true;
end
MetaKB_AddUnitInfo("target");
MetaKB_overRide = false;
end
end
function MetaKB_AddUnitInfo(UnitSelect)
if( not CheckInteractDistance(UnitSelect, MetaKBOptions.RangeCheck) and MetaKBOptions.RangeCheck ~= 5) then
return;
end
local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
if(type(continent) == "string") then
MetaMap_StatusPrint(METAMAPNOTES_INVALIDZONE, MetaKBOptions.ShowUpdates);
return;
end
local icon = 3; --green by default
local unitName = UnitName(UnitSelect);
local ncol = 0;
local desc1 = "";
local desc2 = "";
local playerX, playerY = GetPlayerMapPosition("player")
playerX = MetaMap_round(playerX*10000)
playerY = MetaMap_round(playerY*10000)
unitName = MetaKB_StripTextColors(unitName);
if(UnitReaction("player", UnitSelect) < 4) then
if(UnitClassification(UnitSelect) ~= "normal") then
desc1 = UnitClassification(UnitSelect).." ";
end
if(UnitCreatureType(UnitSelect) ~= nil) then
desc1 = desc1..UnitCreatureType(UnitSelect).." "
end
if(UnitClass(UnitSelect) ~= nil) then
desc1 = desc1..UnitClass(UnitSelect);
end
if(UnitLevel(UnitSelect) == "-1") then
desc2 = METAKB_MOB_LEVEL.." ??";
else
desc2 = METAKB_MOB_LEVEL.." "..UnitLevel(UnitSelect);
end
icon = 1;
elseif(UnitReaction("player", UnitSelect) == 4) then
if(GameTooltipTextLeft2:GetText() ~= nil) then
desc1 = string.sub(GameTooltipTextLeft2:GetText(), 9);
end
desc2 = METAKB_MOB_LEVEL.." "..UnitLevel(UnitSelect);
icon = 0;
elseif(UnitReaction("player", UnitSelect) > 4 and UnitIsPlayer(UnitSelect)) then
unitName = UnitPVPName(UnitSelect);
desc1 = UnitRace(UnitSelect).." "..UnitClass(UnitSelect);
desc2 = METAKB_MOB_LEVEL.." "..UnitLevel(UnitSelect);
icon = 7;
elseif(UnitReaction("player", UnitSelect) < 4 and UnitIsPlayer(UnitSelect)) then
unitName = UnitPVPName(UnitSelect);
desc1 = UnitRace(UnitSelect).." "..UnitClass(UnitSelect);
desc2 = METAKB_MOB_LEVEL.." "..UnitLevel(UnitSelect);
icon = 6;
else
local check = GameTooltipTextLeft2:GetText();
if (check ~= nil) then
if(string.find(check, METAKB_MOB_LEVEL)) then
if(GameTooltipTextLeft3 ~= "" and GameTooltipTextLeft3 ~= nil) then
desc1 = GameTooltipTextLeft3:GetText();
desc2 = GameTooltipTextLeft2:GetText();
end
else
if(GameTooltipTextLeft2 ~= "" and GameTooltipTextLeft2 ~= nil) then
desc1 = GameTooltipTextLeft2:GetText();
end
if(GameTooltipTextLeft3 ~= "" and GameTooltipTextLeft3 ~= nil) then
desc2 = GameTooltipTextLeft3:GetText();
end
end
end
icon = 3;
end
if(desc1 == nil) then desc1 = ""; end
if(desc2 == nil) then desc2 = ""; end
local changedSomething = false;
local addedSomething = false;
local updatedSomething = false;
local currentUnit;
if(MetaKB_Data[MetaKB_dbID][unitName] == nil) then
MetaKB_Data[MetaKB_dbID][unitName] = {};
MetaMap_StatusPrint(format(TEXT(METAKB_DISCOVERED_UNIT), unitName), true);
end
currentUnit = MetaKB_Data[MetaKB_dbID][unitName];
if(currentUnit[continent] == nil) then
currentUnit[continent] = {};
end
if(currentUnit[continent][zone] == nil) then
currentUnit[continent][zone] = {};
currentUnit[continent][zone]["inf1"] = desc1;
currentUnit[continent][zone]["inf2"] = desc2;
currentUnit[continent][zone]["icon"] = icon;
currentUnit[continent][zone][1] = 20000;
currentUnit[continent][zone][2] = -1;
currentUnit[continent][zone][3] = -1;
currentUnit[continent][zone][4] = 20000;
addedSomething = true
else
currentUnit[continent][zone]["icon"] = icon;
if(currentUnit[continent][zone]["inf1"] == "") then
currentUnit[continent][zone]["inf1"] = desc1;
updatedSomething = true;
end
if(currentUnit[continent][zone]["inf2"] == "") then
currentUnit[continent][zone]["inf2"] = desc2;
updatedSomething = true;
end
end
local coords = currentUnit[continent][zone];
if(playerX < coords[4]) then
currentUnit[continent][zone][4] = playerX;
changedSomething = true;
end
if(playerY < coords[1]) then
currentUnit[continent][zone][1] = playerY;
changedSomething = true;
end
if(playerX > coords[2]) then
currentUnit[continent][zone][2] = playerX;
changedSomething = true;
end
if(playerY > coords[3]) then
currentUnit[continent][zone][3] = playerY;
changedSomething = true;
end
if(MetaKBOptions.NewTargetNote or MetaKB_overRide) then
MetaKB_AddMapNotes(unitName, GetRealZoneText(), 0);
end
if(MetaKBOptions.KBstate) then
if(addedSomething) then
MetaMap_StatusPrint(format(TEXT(METAKB_ADDED_UNIT_IN_ZONE), unitName, GetRealZoneText()), MetaKBOptions.ShowUpdates);
end
if(changedSomething and not addedSomething) then
MetaMap_StatusPrint(format(TEXT(METAKB_UPDATED_MINMAX_XY), unitName, GetRealZoneText()), MetaKBOptions.ShowUpdates);
end
if(updatedSomething) then
MetaMap_StatusPrint(format(TEXT(METAKB_UPDATED_INFO), unitName, GetRealZoneText()), MetaKBOptions.ShowUpdates);
end
else
currentUnit = nil;
end
end
function MetaKB_UpdateScrollFrame()
for iScrollFrameButton = 1, METAKB_SCROLL_FRAME_BUTTONS_SHOWN, 1 do
local buttonIndex = iScrollFrameButton + FauxScrollFrame_GetOffset(MetaKB_ScrollFrame);
local scrollFrameButton = getglobal("MetaKB_ScrollFrameButton"..iScrollFrameButton);
local NameButton = getglobal("MetaKB_ScrollFrameButton"..iScrollFrameButton.."Name");
local Info1Button = getglobal("MetaKB_ScrollFrameButton"..iScrollFrameButton.."Info1");
local Info2Button = getglobal("MetaKB_ScrollFrameButton"..iScrollFrameButton.."Info2");
local CoordsButton = getglobal("MetaKB_ScrollFrameButton"..iScrollFrameButton.."Coords");
if(buttonIndex < MetaKB_SearchResults.onePastEnd) then
if(MetaKB_SearchResults[buttonIndex]["zoneName"] == GetRealZoneText()) then
-- Unit is in the same zone, show in yellow
NameButton:SetText(MetaKB_SearchResults[buttonIndex]["name"]);
Info1Button:SetText(MetaKB_SearchResults[buttonIndex]["desc"]);
Info2Button:SetText(MetaKB_SearchResults[buttonIndex]["level"]);
CoordsButton:SetText(MetaKB_SearchResults[buttonIndex]["location"]);
if(MetaKB_SearchResults[buttonIndex]["cCode"] == 2) then
CoordsButton:SetTextColor(0,1,0)
else
-- Unit is within range, show in green
CoordsButton:SetTextColor(1,1,0)
end
scrollFrameButton:Show();
else
if(MetaKB_ShowAllZones or MetaKBOptions.EmbedKB) then
-- Unit is in a different zone, show in red
NameButton:SetText(MetaKB_SearchResults[buttonIndex]["name"]);
Info1Button:SetText(MetaKB_SearchResults[buttonIndex]["desc"]);
Info2Button:SetText(MetaKB_SearchResults[buttonIndex]["level"]);
CoordsButton:SetText(MetaKB_SearchResults[buttonIndex]["zoneName"]);
CoordsButton:SetTextColor(1,0,0)
scrollFrameButton:Show();
else
scrollFrameButton:Hide();
end
end
local ncol = MetaKB_SearchResults[buttonIndex]["ncol"];
NameButton:SetTextColor(MetaMapNotes_Colors[ncol].r,MetaMapNotes_Colors[ncol].g,MetaMapNotes_Colors[ncol].b)
Info1Button:SetTextColor(0.8,0.8,0.8)
Info2Button:SetTextColor(0.5,0.5,0.8)
else
scrollFrameButton:Hide();
end
end
FauxScrollFrame_Update(MetaKB_ScrollFrame, MetaKB_SearchResults.onePastEnd - 1,
METAKB_SCROLL_FRAME_BUTTONS_SHOWN, METAKB_SCROLL_FRAME_BUTTON_HEIGHT)
end
function MetaKB_BuildSearchResults()
MetaKB_SearchResults = {};
local nameCount = 0;
local zoneCount = 0;
local tempZones = {};
local currentContinent, currentZone, _, mapName = MetaMap_GetCurrentMapInfo();
for name, continentTable in MetaKB_Data[MetaKB_dbID] do
for continent, zoneTable in continentTable do
for zone in zoneTable do
local cCode = 1;
local showAll = false;
local coordString = "";
if(continent == currentContinent and mapName == "Kalimdor") then showAll = true; end
if(continent == currentContinent and mapName == "Eastern Kingdoms") then showAll = true; end
if(mapName == "World" and continent ~= 0) then showAll = true; end
if(continent == currentContinent and zone == currentZone or MetaKB_ShowAllZones or showAll) then
local zoneName = MetaMap_ZoneNames[continent][zone];
local selectedData = MetaKB_Data[MetaKB_dbID][name][continent][zone];
local inf1 = selectedData["inf1"];
local inf2 = selectedData["inf2"];
local ncol = selectedData["icon"];
if(ncol == 1) then ncol = 2;
elseif(ncol == 2) then ncol = 6;
elseif(ncol == 3) then ncol = 4;
elseif(ncol == 6) then ncol = 1; end
if(zoneName ~= GetRealZoneText() or continent == 0) then
coordString = zoneName;
else
coordString, cCode = MetaKB_FormatCoords(selectedData);
end
if(string.find(string.lower(name),string.lower(MetaKB_LastSearch),1,true)~=nil
or string.find(string.lower(inf1),string.lower(MetaKB_LastSearch),1,true)~=nil
or string.find(string.lower(inf2),string.lower(MetaKB_LastSearch),1,true)~=nil
or string.find(string.lower(coordString),string.lower(MetaKB_LastSearch),1,true)~=nil) then
tinsert(MetaKB_SearchResults, {name = name, zoneName = zoneName, desc = inf1, level = inf2, ncol = ncol, location = coordString, cCode = cCode});
nameCount = nameCount + 1;
if(tempZones[zoneName] == nil and zoneName ~= nil) then
zoneCount = zoneCount + 1;
tempZones[zoneName] = 1;
end
end
end
end
end
end
MetaKB_ResultFontString:SetText("Found "..nameCount.." NPC/MoBs in "..zoneCount.." zones");
MetaKB_SearchResults.onePastEnd = nameCount +1;
MetaKBList_SortBy(MetaMap_sortType, MetaMap_sortDone)
end
function MetaKB_FormatCoords(dataSet, mode)
local cleanCoords = {};
local coordString = "";
for i=1,4 do
cleanCoords[i] = MetaMap_round(dataSet[i]/100, 0);
end
local dx = dataSet[2]/100 - dataSet[4]/100;
local dy = dataSet[3]/100 - dataSet[1]/100;
local centerx = dataSet[4]/100 + dx/2;
local centery = dataSet[1]/100 + dy/2;
-- truncate to two digits after the decimal again
centerx = MetaMap_round(centerx, 0);
centery = MetaMap_round(centery, 0);
if(mode == nil) then
if dx >= 3 or dy >= 3 then
-- if the NPC has a range of 3 map units or greater, show ranges
coordString = " ("..cleanCoords[4].."-"..cleanCoords[2].."),"..
" ("..cleanCoords[1].."-"..cleanCoords[3]..")"
else
-- otherwise just show an averaged point
coordString = " ("..centerx..", "..centery..")"
end
if(centerx > (MetaKB_PlayerX +3) or centerx < (MetaKB_PlayerX -3) and centery > (MetaKB_PlayerY +3) or centery < (MetaKB_PlayerY -3)) then
cCode = 1;
else
cCode = 2;
end
return coordString, cCode;
elseif(mode == 1) then
if(centerx == 0 and centery == 0) then
centerx = 75;
centery = 95;
end
centerx = centerx/100;
centery = centery/100;
return centerx, centery, dx, dy;
end
return centerx, centery;
end
function MetaKBList_SortBy(aSortType, aSortDone)
MetaMap_sortType = aSortType;
MetaMap_sortDone = aSortDone;
table.sort(MetaKB_SearchResults, MetaMap_SortCriteria);
if(not MetaMap_sortDone)then
local count = MetaKB_SearchResults.onePastEnd;
MetaKB_SearchResults = MetaMap_InvertList(MetaKB_SearchResults);
MetaKB_SearchResults.onePastEnd = count;
end
MetaKB_UpdateScrollFrame();
end
function MetaKB_Search(searchText, suppressErrors)
if(searchText == nil) then searchText = MetaKB_LastSearch; end
if(suppressErrors == nil) then suppressErrors = false; end
MetaKB_LastSearch = searchText;
if(not MetaKBOptions.EmbedKB) then
SetMapToCurrentZone();
end
MetaKB_PlayerX, MetaKB_PlayerY = GetPlayerMapPosition("player");
MetaKB_PlayerX = MetaMap_round(MetaKB_PlayerX * 100);
MetaKB_PlayerY = MetaMap_round(MetaKB_PlayerY * 100);
FauxScrollFrame_SetOffset(MetaKB_ScrollFrame, 0);
MetaKB_BuildSearchResults();
MetaKB_UpdateScrollFrame();
MetaKB_SearchEditBox:SetText(MetaKB_LastSearch);
end
function MetaKB_ScrollFrameButtonOnClick(button)
if(button == "LeftButton") then
MetaKB_ScrollFrameButtonID = this:GetID();
local x, y = GetCursorPosition();
x = x / UIParent:GetEffectiveScale();
y = y / UIParent:GetEffectiveScale();
MetaKBMenu:SetPoint("TOP", "UIParent", "BOTTOMLEFT", x , y +10);
MetaKBMenu:Show();
elseif(button == "RightButton") then
if(IsControlKeyDown()) then
MetaKBMenu_CRBSelect(this:GetID());
elseif(IsShiftKeyDown()) then
MetaKBMenu_SRBSelect(this:GetID());
else
MetaMap_LoadBWP(this:GetID(), 1);
end
end
end
function MetaKBMenu_Select(id)
local name = getglobal("MetaKB_ScrollFrameButton"..MetaKB_ScrollFrameButtonID.."Name"):GetText();
local zoneName = getglobal("MetaKB_ScrollFrameButton"..MetaKB_ScrollFrameButtonID.."Coords"):GetText();
if(string.find(zoneName, "%(%d+\.?-?%d*%)?, %(?%d+\.?-?%d*%)")) then
zoneName = GetRealZoneText();
end
local continent, zone = MetaMap_NameToZoneID(zoneName);
local currentZone = MetaMapNotes_Data[continent][zone];
local tUpdate = MetaKBOptions.ShowUpdates;
if(id == 1) then
MetaKBOptions.ShowUpdates = true;
PlaySound("MapPing");
MetaKB_AddMapNotes(name, zoneName, 0);
MetaMapNotes_MapUpdate();
PlaySound("igMiniMapClose");
elseif(id == 2) then
MetaKBOptions.ShowUpdates = true;
PlaySound("MapPing");
MetaKB_AddMapNotes(name, zoneName, 2);
PlaySound("igMainMenuOption")
elseif(id == 3) then
MetaKBOptions.ShowUpdates = true;
MetaMap_DeleteNotes(METAKB_AUTHOR, name);
elseif(id == 4) then
MetaKBOptions.ShowUpdates = true;
PlaySound("igQuestLogAbandonQuest");
MetaMap_DeleteNotes(METAKB_AUTHOR);
elseif(id == 5) then
MetaKB_Data[MetaKB_dbID][name] = nil;
PlaySound("Deathbind Sound");
MetaMap_StatusPrint(format(TEXT(METAKB_REMOVED_FROM_DATABASE), name, zoneName), true);
MetaKB_Search(MetaKB_LastSearch, true);
elseif(id == 6) then
StaticPopupDialogs["Trim_Dbase"] = {
text = TEXT(METAKB_TRIM_DBASE),
button1 = TEXT(ACCEPT),
button2 = TEXT(DECLINE),
OnAccept = function()
MetaKB_TrimDatabase();
end,
timeout = 60,
showAlert = 1,
};
StaticPopup_Show("Trim_Dbase");
elseif(id == 7 and ChatFrameEditBox:IsVisible()) then
local selectedData = MetaKB_Data[MetaKB_dbID][name][continent][zone];
local centerx, centery = MetaKB_FormatCoords(selectedData, 2)
local mInfo = " "
if(selectedData.inf1 ~= "") then mInfo = " ["..selectedData.inf1.."] "; end
local coordString = centerx..", "..centery;
ChatFrameEditBox:Insert(name..mInfo.."("..zoneName.." - "..coordString..")");
elseif(id == 8) then
local noteID = 0;
MetaKBMenu:Hide();
MetaKB_DisplayFrame:GetParent():Hide();
ShowUIPanel(WorldMapFrame);
if(continent == 0) then
MetaMapOptions.MetaMapZone = zone;
MetaMap_Toggle(true);
else
SetMapZoom(continent, zone);
end
for index, value in currentZone, 1 do
if(currentZone[index].name == name) then
noteID = index;
break;
end
end
if(noteID == 0 and MetaKBOptions.SetMapShow and not MetaMapFrame:IsVisible()) then
noteID = MetaMapNotes_GetZoneTableSize(currentZone)+1;
MetaKB_AddMapNotes(name, zoneName, 0);
MetaMapNotes_MapUpdate();
end
if(noteID > 0) then
MetaMapPing_SetPing(currentZone, noteID);
end
end
MetaKBOptions.ShowUpdates = tUpdate;
end
function MetaKBMenu_OnUpdate()
if (MetaKBMenu:IsVisible()) then
if (not MouseIsOver(MetaKBMenu)) then
MetaKBMenu:Hide();
end
end
end
function MetaKB_TrimDatabase()
local nameCount = 0;
for i=1, table.getn(MetaKB_SearchResults) do
local Name = MetaKB_SearchResults[i].name;
MetaKB_Data[MetaKB_dbID][Name] = nil;
nameCount = nameCount + 1
end
if(strlen(MetaKB_LastSearch) > 0) then
MetaMap_StatusPrint("Removed "..nameCount.." entries from database linked to '"..MetaKB_LastSearch.."'", true);
else
MetaMap_StatusPrint("Removed ALL entries from database", true);
end
MetaKB_Search(MetaKB_LastSearch, true);
end
function MetaKB_AddMapNotes(name, zoneName, mininote)
if(mininote == nil) then mininote = 0; end
local continent, zone = MetaMap_NameToZoneID(zoneName);
local currentZone = MetaKB_Data[MetaKB_dbID][name][continent][zone];
local coordSets = {
[1] = { ["n"] = TEXT(METAKB_MAPNOTES_NW_BOUND), ["x"] = 4, ["y"] = 1, },
[2] = { ["n"] = TEXT(METAKB_MAPNOTES_NE_BOUND), ["x"] = 2, ["y"] = 1, },
[3] = { ["n"] = TEXT(METAKB_MAPNOTES_SE_BOUND), ["x"] = 2, ["y"] = 3, },
[4] = { ["n"] = TEXT(METAKB_MAPNOTES_SW_BOUND), ["x"] = 4, ["y"] = 3, }, };
local infoOne = currentZone["inf1"];
local infoTwo = currentZone["inf2"];
local icon = currentZone["icon"];
local namecol = icon;
if(icon == 1) then namecol = 2;
elseif(icon == 2) then namecol = 6;
elseif(icon == 3) then namecol = 4;
elseif(icon == 6) then namecol = 1; end
local centerx, centery, dx, dy = MetaKB_FormatCoords(currentZone, 1)
local noteAdded, nearNote = MetaMapNotes_AddNewNote(continent, zone, centerx, centery, name, infoOne, infoTwo, METAKB_AUTHOR, icon, namecol, 9, 6, mininote);
if(noteAdded) then
if(mininote ~= 2) then
MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_NOTE, MetaMap_ZoneNames[continent][zone]), MetaKBOptions.ShowUpdates);
end
else
MetaMap_StatusPrint(format(METAMAPNOTES_DECLINE_NOTE, MetaMapNotes_Data[continent][zone][nearNote].name, MetaMap_ZoneNames[continent][zone]), MetaKBOptions.ShowUpdates);
end
if(mininote > 0) then
MetaMap_StatusPrint(format(METAMAPNOTES_ACCEPT_MININOTE, GetRealZoneText()), true);
end
if(noteAdded and mininote == 0 and (dx >= 3 or dy >= 3) and MetaKBOptions.CreateMapNotesBoundingBox) then
local x2 = currentZone[coordSets[4].x]/10000
local y2 = currentZone[coordSets[4].y]/10000
local skipNext = false
for i in coordSets do
local x1 = currentZone[coordSets[i].x]/10000
local y1 = currentZone[coordSets[i].y]/10000
local noteAdded = MetaMapNotes_AddNewNote(continent, zone, x1, y1, name, infoOne, infoTwo, METAKB_AUTHOR, 10, namecol, 9, 6);
if(noteAdded) then
if(not skipNext) then
MetaMapNotes_ToggleLine(continent, zone, x2, y2, x1, y1);
MetaMapNotes_ToggleLine(continent, zone, centerx, centery, x1, y1);
end
skipNext = false;
else
skipNext = true;
end
x2,y2 = x1,y1;
end
end
end
function MetaKB_ToggleAllZones()
MetaKB_ShowAllZones = not MetaKB_ShowAllZones;
if MetaKB_ShowAllZones then
this:SetText(METAKB_SHOW_LOCALZONE);
PlaySound("igMainMenuOptionCheckBoxOn");
else
this:SetText(METAKB_SHOW_ALLZONES);
PlaySound("igMainMenuOptionCheckBoxOff");
end
MetaKB_Search();
end
function MetaKB_ToggleAutoTrack()
MetaKBOptions.AutoTrack = not MetaKBOptions.AutoTrack;
if(MetaKBOptions.AutoTrack) then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
end
function MetaKB_ToggleShowUpdates()
MetaKBOptions.ShowUpdates = not MetaKBOptions.ShowUpdates
if MetaKBOptions.ShowUpdates then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
end
function MetaKB_ToggleDbase()
MetaKBOptions.KBstate = not MetaKBOptions.KBstate;
if MetaKBOptions.KBstate then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
end
function MetaKB_ToggleSetNote()
MetaKBOptions.NewTargetNote = not MetaKBOptions.NewTargetNote
if MetaKBOptions.NewTargetNote then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
end
function MetaKB_ToggleBoundingBox()
MetaKBOptions.CreateMapNotesBoundingBox = not MetaKBOptions.CreateMapNotesBoundingBox;
if MetaKBOptions.CreateMapNotesBoundingBox then
PlaySound("igMainMenuOptionCheckBoxOn");
else
PlaySound("igMainMenuOptionCheckBoxOff");
end
end