vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

BWP_NAME = "MetaMapBWP";
BWP_IMAGE_PATH = "Interface\\AddOns\\MetaMapBWP\\Artwork\\Arrows\\"
BWP_BUTTON_HEIGHT = 16;
BWP_BUTTON_COUNT = 11;

BWP_Options = {};
BWP_Data = {};
BWP_CZone = {};
BWP_Destination = nil;
BWP_Data["Kalimdor"] = {};
BWP_Data["Eastern Kingdoms"] = {};

local BWPnode = {};
local BWPmeta = {};
local BWPDisp = {};
local BWPDispm = {};

BWP_CountDown = 0;
BWP_SetDist = 0;
BWP_ArrowIcon = nil;
BWP_playerIsDead = false;
BWP_GuardActive = false;

BWP_Highlighttext ="|cffFFFFFF";
BWP_Redtext="|cffFF0000";
BWP_Greentext = "|cff00FF00";

local BWP_Zones = {};
local BWP_KalimdorZones = {};
local BWP_EasternZones = {};
local BWP_Player = nil;
local BWP_SetSpecial = false;
local BWP_SpecialDest = 0;
local old_ToggleDropDownMenu = ToggleDropDownMenu;
local Old_AbandonQuest =  AbandonQuest
oldBWPFOLLOW_UnitPopup_OnClick = UnitPopup_OnClick
-- Query redirect
BWPDispm.__index = SNDisp;
-- Query redirect
BWPmeta.__index = BWPnode;
local BWP_FirstLoad = true;
local gdpx, gdpy, gddx, gddy, gddir, gdclx, gdcly;
--Map Variables below
local MAX_LOC_SAMPLES = 50;-- Circular arrays to store X,Y,time locations
local LOC_X_SAMPLES = {};
local LOC_Y_SAMPLES = {};
local LOC_T_SAMPLES = {};       
-- The last index written into
local lastIdx = 0;
-- Last coordinates, used to avoid spamming location arrays
local lastX,lastY = 0,0;
-- Configuration/thresholds -- Tune these together with coordinate
-- system for a balance of update speed and jitter reduction
-- Make sure that MIN_CUMUL_RANGE is at least 2 times as large as       
-- MIN_SAMPLE_DISTANCE (Preferably between about 3-10 times)
-- Minimum change in at least one direction to store something  
local MIN_SAMPLE_DISTANCE = 0.0001;
-- Maximum age of an old record to look at
local MAX_CUMUL_TIME = 2.0;
-- Minimum range for a significant vector
local MIN_CUMUL_RANGE = 0.0003;
-- Square of minimum range to avoid an unnecessary sqrt
local MIN_CUMUL_RANGE_SQ = MIN_CUMUL_RANGE * MIN_CUMUL_RANGE;
-- Last degree value, just here for debugging sanity
local lastDeg = nil;

function BWP_SetVars()
        if(BWP_Options.ShowYards == nil) then BWP_Options.ShowYards = false; end
        if(BWP_Options.ShowCorpse == nil) then BWP_Options.ShowCorpse = false; end
        if(BWP_Options.ShowOnGuard == nil) then BWP_Options.ShowOnGuard = false; end
        if(BWP_Options.SetAlpha == nil) then BWP_Options.SetAlpha = 1.0; end
        if(BWP_Options.SetDistance == nil) then BWP_Options.SetDistance = 0.0040; end
        if(BWP_Options.ShowPoints == nil) then BWP_Options.ShowPoints = true; end
        if(BWP_Options.ShowNPC == nil) then BWP_Options.ShowNPC = true; end
        if(BWP_Options.ClearDest == nil) then BWP_Options.ClearDest = true; end
end

function BWP_OnLoad()
        SLASH_BWPCOMMAND1 = "/bwp"; 
        SlashCmdList["BWPCOMMAND"] = BWP_LocCommand
        this:RegisterEvent("ADDON_LOADED");
        this:RegisterEvent("WORLD_MAP_UPDATE");
        this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
        this:RegisterEvent("CHAT_MSG_SYSTEM");
        this:RegisterEvent("QUEST_GREETING");
        this:RegisterEvent("UNIT_NAME_UPDATE");
        this:RegisterEvent("QUEST_COMPLETE");
        this:RegisterEvent("QUEST_FINISHED");
        this:RegisterEvent("QUEST_GREETING");
        this:RegisterEvent("QUEST_ACCEPT_CONFIRM");
        this:RegisterEvent("GOSSIP_CLOSED");
        this:RegisterEvent("PLAYER_DEAD");
        table.insert(UnitPopupMenus["PLAYER"],"BWPFOLLOW")
        table.insert(UnitPopupMenus["PARTY"],"BWPFOLLOW")
        table.insert(UnitPopupMenus["RAID"],"BWPFOLLOW")
        UnitPopupButtons["BWPFOLLOW"] = { text = "Set As Waypoint", dist = 0 } 
end

function BWP_OnEvent(event)
        if(event == "ADDON_LOADED") then
                BWP_SetVars()
                BWP_OptionsInit();
                BWP_Generate()
                MetaKBMenu_RBSelect = BWP_ShowKBMenu;
                MetaMapNotes_RBSelect = BWP_ShowNoteMenu;
        end
        if(event == "ZONE_CHANGED_NEW_AREA" or event == "PLAYER_ENTERING_WORLD") then
                BWP_OptionsInit();
        end
        if (event == "UNIT_NAME_UPDATE" and arg1 == "player") then 
                if (BWP_FirstLoad) then
                        BWP_Player = UnitName("player");
                        if (playerName ~= UNKNOWNOBJECT) then 
                                BWP_FirstLoad = nil;
                        end
                end
        end
        if(event == "GOSSIP_CLOSED") then
                BWP_SetSpecial = true;
                BWP_SpecialDest = 2;
        end
        if(event == "QUEST_COMPLETE") then
                local title = GetTitleText() or "";
                clearquest(title)
        end
        if(strsub(event,1,16) == "CHAT_MSG_SYSTEM") then
                local msg = arg1;
                local plr = arg2;
                if ( (msg and msg ~= nil) and (plr and plr ~= nil) ) then
                        local _,_,questname = string.find(msg,"Quest accepted: (.*)")
                        if(questname) then
                                BWP_AddQuest(questname)
                        end                                             
                end
        end
end

function BWP_OnUpdate(arg)
        if(UnitIsDeadOrGhost("player")) then
                DeadMan();
        else
                BWP_Alive();
        end
        if(BWP_SetSpecial) then BWP_Special_Dest(); end

        if(BWP_CountDown > 0) then 
                BWP_CountDown = BWP_CountDown - 1; 
                if(BWP_CountDown == 1 and BWP_Options.ClearDest) then
                        BWP_CountDown = 0;
                        if(BWP_SpecialDest) then
                                BWP_SpecialOff();
                        else
                                BWP_ClearDest();
                        end
                end
                return;
        end
        if(BWP_Destination) then
                local UpdateBWP = BWP_GetDir();
                if(UpdateBWP) then BWP_SetRotation(UpdateBWP); end
                BWPDistanceText:SetText(BWP_GetDistText())
        end
end

function  BWP_LocCommand(msg)
        local name = "QuickLoc";
        local i,j,x,y,tmp = string.find(msg,"%s*(%d+)%s*[,.]%s*(%d+)%s*([^%c]*)");
        if(x == nil or y == nil) then
                SetMapToCurrentZone();
                x, y = GetPlayerMapPosition("player");
                if(msg ~= "" and msg ~= nil) then
                        name = msg;
                end
        else
                x = x / 100;
                y = y / 100;
                if(tmp ~= "" and tmp ~= nil) then
                        name = tmp;
                end
        end
        setmininote(x, y, name, 7);
        BWP_OptionsInit();
end

function BWP_SelectionDropDown_OnLoad()
        UIDropDownMenu_Initialize(BWP_OptionsDropDown, BWP_DropDownFrame_Initialize );
        UIDropDownMenu_SetWidth(80);
end

function ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset, yOffset)
        if(this:GetParent()) and (this:GetParent():GetName())and(this:GetParent():GetName()== "BWP_MenuFrame_DropDown")then
                BWP_MenuFrame:Show();
                old_ToggleDropDownMenu(level, value, dropDownFrame,"BWP_MenuFrame", xOffset, yOffset)
        else
                old_ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset, yOffset)
                BWP_MenuFrame:Hide();
        end
        return nil
end

function BWP_OptionsInit()
        if(BWP_Options.SetAlpha < 0.15) then BWP_Options.SetAlpha = 0.15; end
        BWP_DistanceSlider:SetValue(BWP_Options.SetDistance);
        BWP_AlphaSlider:SetValue(BWP_Options.SetAlpha);
        if(BWP_Destination and BWP_Destination.zone == GetRealZoneText()) then
                BWPDestText:SetText("("..BWP_Destination.name..")");
                BWPDistanceText:SetText(BWP_GetDistText())
                BWP_DisplayFrame:Show();
        else
                BWP_DisplayFrame:Hide();
        end
end

function MetaMapBWP_UpdateDistance()
        BWP_Options.SetDistance = this:GetValue();
        local dist = MetaMap_round(this:GetValue() * 4000)
        BWP_SetDistText:SetText(dist);
end

function MetaMapBWP_UpdateAlpha()
        BWP_Options.SetAlpha = this:GetValue();
        BWP_DisplayFrame:SetAlpha(BWP_Options.SetAlpha);
end

function MetaMapBWPMenu_Init()
        local items = 0;
        for i=1, BWP_BUTTON_COUNT, 1 do
                local button = getglobal("MetaMapBWPMenu_Option"..i);
                button:SetHeight(BWP_BUTTON_HEIGHT);
                if(i == 1) then
                        button:SetText("Always load on startup");
                        button.toggle = MetaMapOptions.BWPalwaysOn;
                elseif(i == 2) then
                        button:SetText(BWP_SHOW_CORPSE);
                        button.toggle = BWP_Options.ShowCorpse;
                elseif(i == 3) then
                        button:SetText(BWP_SHOW_GUARD);
                        button.toggle = BWP_Options.ShowOnGuard;
                elseif(i == 4) then
                        button:SetText(BWP_SHOW_QNPC);
                        button.toggle = BWP_Options.ShowNPC;
                elseif(i == 5) then
                        button:SetText(BWP_SHOW_MAPPOINTS);
                        button.toggle = BWP_Options.ShowPoints;
                elseif(i == 6) then
                        button:SetText(BWP_CLEAR_ARRIVE);
                        button.toggle = BWP_Options.ClearDest;
                elseif(i == 7) then
                        if(BWP_Options.ShowYards) then
                                button:SetText(BWP_SHOW_METRES);
                        else
                                button:SetText(BWP_SHOW_YARDS);
                        end
                        button.toggle = false;
                elseif(i == 8) then
                        button:SetHeight(10); -- Spacer
                elseif(i == 9) then
                        button:SetText(BWP_CLEAR_DEST);
                        button.toggle = false;
                elseif(i == 10) then
                        button:SetHeight(0); -- Spare
                        button.toggle = false;
                elseif(i == 11) then
                        button:SetHeight(0); -- Spare
                        button.toggle = false;
                end
                if(button.toggle) then
                        getglobal("MetaMapBWPMenu_Option"..i.."Check"):Show();
                else
                        getglobal("MetaMapBWPMenu_Option"..i.."Check"):Hide();
                end
                button:Show();
                items = i;
        end
        MetaMapBWPMenu:ClearAllPoints();
        local yPos = "TOP";
        local xPos = "RIGHT";
        local x, y = GetCursorPosition();
        x = x / UIParent:GetEffectiveScale() +15;
        y = y / UIParent:GetEffectiveScale() +15;
        if(y <= (UIParent:GetHeight() /2)) then yPos = "BOTTOM"; y = y +50; end
        if(x <= (UIParent:GetHeight() /2)) then xPos = "LEFT"; x = x -30; end
        MetaMapBWPMenu:SetPoint(yPos..xPos, "UIParent", "BOTTOMLEFT", x, y);
        MetaMapBWPMenu:SetHeight((BWP_BUTTON_HEIGHT *items) + (BWP_BUTTON_HEIGHT *2));
        PlaySound("UChatScrollButton");
        MetaMapBWPMenu:Show();
end

function MetaMapBWPMenu_Select(id)
        local button = getglobal("MetaMapBWPMenu_Option"..id);
        if(id == 1) then
                MetaMapOptions.BWPalwaysOn = not MetaMapOptions.BWPalwaysOn;
                button.toggle = MetaMapOptions.BWPalwaysOn;
        elseif(id == 2) then
                BWP_Options.ShowCorpse = not BWP_Options.ShowCorpse;
                button.toggle = BWP_Options.ShowCorpse;
        elseif(id == 3) then
                BWP_Options.ShowOnGuard = not BWP_Options.ShowOnGuard;
                button.toggle = BWP_Options.ShowOnGuard;
        elseif(id == 4) then
                BWP_Options.ShowNPC = not BWP_Options.ShowNPC;
                button.toggle = BWP_Options.ShowNPC;
        elseif(id == 5) then
                BWP_Options.ShowPoints = not BWP_Options.ShowPoints;
        elseif(id == 6) then
                BWP_Options.ClearDest = not BWP_Options.ClearDest;
                button.toggle = BWP_Options.ClearDest;
        elseif(id == 7) then
                BWP_Options.ShowYards = not BWP_Options.ShowYards;
                if(BWP_Options.ShowYards) then
                        button:SetText(BWP_SHOW_METRES);
                else
                        button:SetText(BWP_SHOW_YARDS);
                end
                button.toggle = false;
        elseif(id == 8) then
                -- Spacer
        elseif(id == 9) then
                BWP_ClearDest();
                button.toggle = false;
        elseif(id == 10) then
                -- spare
        elseif(id == 11) then
                -- spare
        end
        if(button.toggle) then
                getglobal("MetaMapBWPMenu_Option"..id.."Check"):Show();
        else
                getglobal("MetaMapBWPMenu_Option"..id.."Check"):Hide();
        end
        BWP_OptionsInit()
end

function MetaMapBWPMenu_OnUpdate()
        if (MetaMapBWPMenu:IsVisible()) then
                if (not MouseIsOver(MetaMapBWPMenu) and not MouseIsOver(MetaMapBWPMenuSliderMenu)) then
                        MetaMapBWPMenu:Hide();
                end
        end
end

function BWP_SetDest() --Sets the current Destination
        if(this.value.QuestGiver) then
                UIDropDownMenu_SetText(this.value.QuestGiver, BWP_MenuFrame_DropDown)
                setmininote(this.value.X,this.value.Y,this.value.QuestGiver,"7")
        elseif(this.value.title) then
                UIDropDownMenu_SetText(this.value.title, BWP_MenuFrame_DropDown)
                setmininote(this.value.xcoord, this.value.ycoord,this.value.title,"7")
        end
        BWP_OptionsInit();
end     

function BWP_GetDistText()
        local px , py = GetPlayerMapPosition("player")
        if(px == 0 and py==0) then 
                return "Dead Zone";
        end
        local dx, dy = nil,nil
        if(BWP_Destination and BWP_Destination.x and BWP_Destination.y) then
                dx, dy = BWP_Destination.x, BWP_Destination.y
        else 
                return nil 
        end
        local loc1,loc2 = {x = px , y= py},{x=dx,y=dy}
        local thisDistance, theseUnits , flag = BWP_FormatDist(loc1,loc2)
        if (flag == "A") then 
                return BWPGreenText("("..BWP_ARRIVED..")") 
        elseif flag == "Y" then 
                return "("..thisDistance..theseUnits..")"
        end
        local colortext = getglobal("BWP"..flag.."Text")
        local testtext = colortext(thisDistance..theseUnits)
        return "("..testtext..")"
end

function DeadMan()
        if(BWP_playerIsDead) then return; end
        deadx, deady = GetCorpseMapPosition();
        deadx = deadx * 100; deady = deady * 100;
        if(deadx and deady and deadx ~= 0 and deady ~= 0) then
                if(BWP_Destination) then
                        BWP_OldDest = BWP_Destination;
                end
                BWP_playerIsDead = true;
                if(BWP_Options.ShowCorpse) then
                        setmininote(deadx, deady, BWP_CORPSE_TEXT , "7");
                else
                        BWP_DisplayFrame:Hide();
                end
        end
end

function BWP_Alive()
        if(not BWP_playerIsDead) then return; end
        if(BWP_OldDest)then
                local continent, zone = MetaMap_NameToZoneID(BWP_OldDest.zone);
                setmininote(BWP_OldDest.x, BWP_OldDest.y, BWP_OldDest.name, "7", continent, zone);
                BWP_OldDest = nil;
                BWP_playerIsDead = false;
        elseif(BWP_playerIsDead)then
                BWP_playerIsDead = false;
                BWP_ClearDest();
        end 
end

function BWP_SpecialOff()
        if(BWP_OldDest)then
                local continent, zone = MetaMap_NameToZoneID(BWP_OldDest.zone);
                setmininote(BWP_OldDest.x, BWP_OldDest.y, BWP_OldDest.name, "7", continent, zone);
                BWP_OldDest = nil;
        else
                BWP_ClearDest();
        end
        BWP_SpecialDest = 0;
end

function UnitPopup_OnClick()
        if UnitPopupMenus[this.owner][this.value]=="BWPFOLLOW" then
                BWPFOLLOW_Name = UnitName(getglobal(UIDROPDOWNMENU_INIT_MENU).unit)
                if(not BWPFOLLOWPLAYER) then
                        BWP_TargetPlayer = string.lower(BWPFOLLOW_Name);
                        BWP_SetSpecial = true; 
                        BWP_SpecialDest = 1
                        BWPFOLLOWPLAYER = 1
                        DEFAULT_CHAT_FRAME:AddMessage("Now Following "..BWPFOLLOW_Name)
                        UnitPopupButtons["BWPFOLLOW"] = { text = "Stop Following", dist = 0 } 
                else
                        BWPFOLLOWPLAYER = nil
                        BWP_SetSpecial = false; 
                        BWP_SpecialDest = 0;
                        BWP_ClearDest()
                        DEFAULT_CHAT_FRAME:AddMessage("No Longer Following "..BWPFOLLOW_Name)
                        UnitPopupButtons["BWPFOLLOW"] = { text = "Set As Waypoint", dist = 0 } 
                end     
        end
        oldBWPFOLLOW_UnitPopup_OnClick()
end 

function BWP_DropDownFrame_Initialize() --Create Dropdown
        if( UIDROPDOWNMENU_MENU_LEVEL == 1) then
                descript = {};
                descript.text = BWPGreenText("-"..BWP_NAME.." "..BWP_OPTION_TEXT.."-")
                descript.func = BWP_ShowOptions;
                UIDropDownMenu_AddButton(descript)
                
                info = {}
                info.text = BWP_SELECTMSG
                info.notClickable = 1;
                info.isTitle = 1;
                info.notCheckable = 1;
                UIDropDownMenu_AddButton(info);
                local x, y = GetPlayerMapPosition("player");
                if(x == 0 and y == 0)then 
                        --Header 
                        info = {
                                text = BWP_NILLOCATION;
                                notClickable = 1;
                                isTitle = 1;
                                notCheckable = 1; }
                        UIDropDownMenu_AddButton(info);
                        return;
                end
        end
        BWP_Generate();
        bwpx,bwpy = nil,nil
        local BWP_BREAK_IT_DOWN = nil
        if(BWP_numpoints() > 20) then BWP_BREAK_IT_DOWN = 1 end
        if(BWP_Options.ShowPoints) then
                if(not BWP_BREAK_IT_DOWN) or  ( UIDROPDOWNMENU_MENU_LEVEL == 2 ) then
                        local ZonePoints = {nil}
                        local isExtra = nil
                        if(this.value == "BWP_CZone") then
                                ZonePoints = getglobal(this.value)
                        elseif(this.value) and (BWP_CZone_XTRA) and (BWP_CZone_XTRA[this.value])then
                                ZonePoints = BWP_CZone_XTRA[this.value]
                        elseif(not this.value) then
                                ZonePoints = BWP_CZone
                        end
                        if(ZonePoints) then
                                for val,k in ZonePoints do
                                        if(k) then
                                                title =  ZonePoints[val].title;
                                        end
                                        if (strlen(title) >= 24) then 
                                                title = strsub(title, 1, 21).."..."; 
                                        end
                                        if (title == "") then 
                                                title = SN_CZone[val]:getNote1();
                                        end
                                        descript = {}
                                        descript.text = val..".  "..title;
                                        descript.func = BWP_SetDest;
                                        descript.value = k;
                                        descript.notCheckable = 1;
                                        UIDropDownMenu_AddButton(descript, UIDROPDOWNMENU_MENU_LEVEL);
                                end
                        end
                else --Break It Down Too many Points            
                        info = {};
                        info.text = BWP_Get_MenuTitle(BWP_CZone);
                        info.hasArrow = 1;
                        info.value = "BWP_CZone";
                        UIDropDownMenu_AddButton(info);
                        if(BWP_CZone_XTRA) then
                                for k,v in BWP_CZone_XTRA do
                                        if(BWP_Get_MenuTitle(v)) then
                                        local info = {};
                                        info.text = BWP_Get_MenuTitle(v);
                                        info.hasArrow = 1;
                                        info.value = k;
                                        UIDropDownMenu_AddButton(info);
                                        descript.notCheckable = 1;
                                        end
                                end
                        end
                end     
        end
        
        local LocalQList = BWP_GetQuestList()
        if(LocalQList and BWP_Options.ShowNPC) then
                if(not BWP_BREAK_IT_DOWN) or (( UIDROPDOWNMENU_MENU_LEVEL == 2 ) and (this.value == "Q")) then
                        table.sort(LocalQList,BWPSortByQuestGiverName)
                        local thisindex = 0
                        for v, thisquest in LocalQList do
                                if(thisquest) then 
                                        descript = {};--Make our menu Options
                                        descript.text = BWP_NPC_TEXT..thisquest["QuestGiver"];
                                        descript.func = BWP_SetDest;
                                        descript.value = thisquest;
                                        descript.notCheckable = 1;
                                        UIDropDownMenu_AddButton(descript,UIDROPDOWNMENU_MENU_LEVEL );
                                end
                        end     
                elseif(UIDROPDOWNMENU_MENU_LEVEL == 1) then
                        local info = {};
                                local info = {};
                                info.text = BWP_QUEST_NPCSTRING ;
                                info.hasArrow = 1;
                                info.value = "Q";
                                descript.notCheckable = 1;
                                UIDropDownMenu_AddButton(info);
                end
        end
end

function BWP_Get_MenuTitle(MList)
        local tempstring = nil
        local firstword,lastword = nil, nil
        for k,v in MList do
                
                if(not tempstring) then -- if its our first word in the List
                        if(v.title) then 
                                tempstring = v.title 
                        elseif (v.QuestGiver) then 
                                tempstring = v.QuestGiver 
                        end --set tempstring(so it will have a value)
                        firstword = tempstring
                else
                        if(v.title) then 
                                tempstring = v.title 
                        elseif (v.QuestGiver) then 
                                tempstring = v.QuestGiver 
                        end
                end
                
        end
        if(tempstring) and (firstword) then
                lastword = strsub(tempstring, 1, 5)
                firstword = strsub(firstword, 1, 5)
                return "Notes: "..firstword.." - "..lastword
        else return nil end
end

function BWP_ShowOptions()
        MetaMapBWPMenu_Init();
end

function BWP_ClearDest() --Removes current destination
        UIDropDownMenu_SetText(nil, BWP_MenuFrame_DropDown)
        if(MiniNotePOI)then
                MetaMapNotes_ClearMiniNote();
        end
        BWP_Destination = nil;
        BWP_SetSpecial = false; 
        BWP_SpecialDest = 0;
        if(BWPFOLLOWPLAYER)then BWPFOLLOWPLAYER = nil; UnitPopupButtons["BWPFOLLOW"] = { text = "Set As Waypoint", dist = 0 }; end
        BWP_DisplayFrame:Hide();
        BWP_Arrow:SetTexture(BWP_IMAGE_PATH.."forward");
end

function BWPGreenText(inText) --TextOverride
        if (inText) then
                return BWP_Greentext..inText..FONT_COLOR_CODE_CLOSE;
        end
end
function BWPRedText(inText) --Text Override
        if (inText) then
                return BWP_Redtext..inText..FONT_COLOR_CODE_CLOSE;
        end
end
function BWPHilightText(inText)  --Text Override
        if (inText) then
                return BWP_Highlighttext..inText..FONT_COLOR_CODE_CLOSE;
        end
end

function BWP_SpecialOn()
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
        local name, unknown, textureIndex, x, y;
        for landmarkIndex = 1, GetNumMapLandmarks(), 1 do
                name, unknown, textureIndex, x, y = GetMapLandmarkInfo(landmarkIndex);
                if (textureIndex == 6) then
                        if(BWP_Destination) then
                                BWP_OldDest = BWP_Destination;
                        end
                        setmininote(x, y, name, "7", continent, zone);
                end
        end
end

function clearquest(title)      --Removes a quest/questgiver
        _,_,realtitle = string.find(title,".*%[%d%]% (.*)")
        if(realtitle)then
                
                title = realtitle
        end
        if(BWP_QuestList)then
                for v, thisquest in BWP_QuestList do
                        if(string.find(thisquest["QuestName"],title))then
                                if(thisquest["QuestName"] == title) then
                                        if(BWP_Destination) and (thisquest["QuestGiver"] == BWP_Destination.name)then
                                                BWP_ClearDest()
                                        end
                                        
                                        BWP_QuestList[v]= nil
                                        tempQuestlist = {}
                                        local index = 1 
                                        for i,q in BWP_QuestList do
                                                tempQuestlist[index] = q
                                                index = index + 1
                                        end
                                        BWP_QuestList = tempQuestlist
                                else
                                        BWPqnamestring=BWP_QuestList[v]["QuestName"]
                                        _,_,tempstring1 = string.find(BWPqnamestring,"(.*)"..title)
                                        _,_,tempstring2 = string.find(BWPqnamestring,".*"..title.."%,(.*)")
                                        if(not tempstring1)and (tempstring2)then 
                                                BWPqnamestring = tempstring2
                                        elseif(not tempstring2)and(tempstring1)then
                                                BWPqnamestring = tempstring1
                                        elseif(tempstring2) and (tempstring1) then
                                                BWPqnamestring = tempstring1..tempstring2
                                        else
                                                DEFAULT_CHAT_FRAME:AddMessage("ERROR ON QUEST TURN IN:BWP[Unable to perform string operation]")
                                        end
                                        BWP_QuestList[v]["QuestName"]=BWPqnamestring
                                end
                        end
                end
        end
end
        
function BWP_numpoints()
        if(table.getn(BWP_CZone) > 20 ) then BWP_ChecknumPOI() end
        local tempnum = 0
        if(BWP_CZone) then
                        tempnum = table.getn(BWP_CZone)
        end
        if (BWP_CZone_XTRA) then 
                if(BWP_CZone_XTRA[1]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[1]) end
                if(BWP_CZone_XTRA[2]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[2]) end
                if(BWP_CZone_XTRA[3]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[3]) end
                if(BWP_CZone_XTRA[4]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[4]) end
                if(BWP_CZone_XTRA[5]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[5]) end
                if(BWP_CZone_XTRA[6]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[6]) end
                if(BWP_CZone_XTRA[7]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[7]) end
                if(BWP_CZone_XTRA[8]) then tempnum = tempnum + table.getn(BWP_CZone_XTRA[8]) end -- max number of second menus
        end
        if(BWP_QuestList) then
                for v, thisquest in BWP_QuestList do
                        if(thisquest)and(thisquest.Zone == GetCurrentMapZone())then
                                tempnum = tempnum + 1
                        end
                end
        end
        return tempnum
end

function BWP_Special_Dest()
        if(BWPFOLLOWPLAYER)then
                if(BWP_TargetPlayer) then
                        local bwpthisflag 
                        local playeridindex = GetNumRaidMembers()
                        if (playeridindex == 0) then playeridindex = GetNumPartyMembers();bwpthisflag = nil else  bwpthisflag = "R" end
                        if (playeridindex == 0 ) then
                                DEFAULT_CHAT_FRAME:AddMessage(BWPGROUPERROR)
                                BWP_SpecialDest = 0;
                                BWP_SetSpecial = false; 
                        else
                                if(bwpthisflag) then -- if its a raid group
                                        for x =  1, playeridindex do
                                        local Rname, Rrank, Rsubgroup, Rlevel, Rclass, RfileName, Rzone, Ronline = GetRaidRosterInfo(x)
                                                if (Rname) then
                                                        local tempuid = "raid"..x
                                                        if(string.lower(Rname) == BWP_TargetPlayer) then
                                                                BWP_TargetUnitID = tempuid
                                                                
                                                        elseif(x == 1) then --If the player wasnt found in the current group
                                                                DEFAULT_CHAT_FRAME:AddMessage(BWPGROUPERROR1)
                                                                BWP_SpecialDest = 0;
                                                                BWP_SetSpecial = false; 
                                                                BWPFOLLOWPLAYER = nil
                                                        end
                                                end
                                        end
                                else -- its a normal PARTy
                                        for x = 1,playeridindex do
                                                if (GetPartyMember(x)) then  --Doesnt work in Raid :(
                                                        local tempuid = "party"..x
                                                        if(string.lower(UnitName(tempuid)) == BWP_TargetPlayer) then
                                                                BWP_TargetUnitID = tempuid
                                                                
                                                        elseif(x == playeridindex) and (not BWP_TargetUnitID) then --If the player wasnt found in the current group
                                                                DEFAULT_CHAT_FRAME:AddMessage(BWPGROUPERROR2)
                                                                BWP_SpecialDest = 0;
                                                                BWP_SetSpecial = flase; 
                                                                BWPFOLLOWPLAYER = nil;
                                                        end
                                                end
                                        end
                                end
                                if(BWP_TargetUnitID) then
                                        local posX, posY = GetPlayerMapPosition(BWP_TargetUnitID)
                                        BWP_TargetUnitID = nil
                                        BWP_Destination = {
                                                name = BWP_TargetPlayer,
                                                x = posX ,
                                                y = posY ,                      
                                                zone = GetRealZoneText()}                                               
                                        BWP_SetRotation();
                                end
                        end
                end
        else
                if(BWP_SpecialDest == 2) then
                        BWP_SetSpecial = false; 
                        BWP_SpecialOn();
                end
        end
end     
                        
function BWP_GetQuestList() -- Returns an Array of QuestNPC Data
        local localquestlist = {}
        if(BWP_QuestList) then
                for k,v in BWP_QuestList do
                        zone = GetCurrentMapZone()
                        if(v.Zone == zone) then
                                table.insert(localquestlist,v)
                        end
                end
        end
        return localquestlist
end

function BWP_AddQuest(questname)--Adds a quest giver to waypoint menu
        if(UnitExists("target")) and(not UnitIsPlayer("Target")) and (UnitReaction("Player", "Target")>3)and (not UnitAffectingCombat("Player"))and ((UnitName("target")~= nil)or(UnitName("target")~= "")) then
                if (not BWP_QuestList) then
            BWP_QuestList = {}
                        local Questlist ={}
                        local questitem = {}
                        questitem["QuestName"] = questname
                        questitem["QuestGiver"] = UnitName("Target")
                        questitem["X"],questitem["Y"] = GetPlayerMapPosition("Player")
                        questitem["Zone"]= GetCurrentMapZone()
                        Questlist[1] = questitem
                        BWP_QuestList = Questlist
                else
                        local Questlist = BWP_QuestList
                        local questitem = {}
                        local index = 0
                        questitem["QuestName"] = questname
                        questitem["QuestGiver"] = UnitName("Target")
                        questitem["Zone"]= GetCurrentMapZone()
                        questitem["X"],questitem["Y"] = GetPlayerMapPosition("Player")
                        for k,v in Questlist do 
                                index = index + 1
                                if(UnitName("Target") == v["QuestGiver"]) then
                                        if(v["QuestName"])then
                                                questitem = nil
                                                questitem = v 
                                                if(questitem["QuestName"])then
                                                        if(not string.find(questitem["QuestName"],questname))then
                                                                questitem["QuestName"] = (questitem["QuestName"]..","..questname)
                                                        end
                                                end
                                        end
                                        Questlist[index] = questitem
                                        BWP_QuestList = Questlist
                                        return 1
                                end
                        end
                        Questlist[index+1] = questitem
                        BWP_QuestList = Questlist
                end
        end
end

--Abandon quest to know when you drop a quest and no longer require that questgiver
function  AbandonQuest() 
        local title = GetAbandonQuestName()
        if(title)then
                DEFAULT_CHAT_FRAME:AddMessage("Abandoning:"..title)
                clearquest(title)
        end
        Old_AbandonQuest()
        return Old_AbandonQuest
end

function setmininote(x, y, name, icon, continent, zone)
        if(continent == nil or zone == nil) then
                continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
        end
        if(type(continent) == "string") then return; end
        if(x >= 1) then x = x / 100; end
        if(y >= 1) then y = y / 100; end
        MetaMapNotes_AddNewNote(continent, zone, x, y, name, "", "", "MetaMapBWP", icon, 0, 0, 0, 2);
        BWP_Destination = {};
        BWP_Destination.name = name;
        BWP_Destination.x = x;
        BWP_Destination.y = y;
        BWP_Destination.zone = MetaMap_ZoneNames[continent][zone];
        BWPDestText:SetText("("..BWP_Destination.name..")");
        BWPDistanceText:SetText(BWP_GetDistText())
        BWP_DisplayFrame:Show();
end

--Set up Mini Menu
function BWP_MiniDropMenu_OnLoad()
   UIDropDownMenu_Initialize(this, BWP_MiniDropMenu_Initialize);
   UIDropDownMenu_SetWidth(80, BWP_MiniDropMenu);
end 

--Initialize minimenu with options
function BWP_MiniDropMenu_Initialize()
        local info;
        if(tempitem_XBWP) then -- Make sure you have a valid object
           if(tempitem_XBWP.X and tempitem_XBWP.Y) then -- Make sure X and Y coords Exist(means were in same zone)
                   info = {};
                   info.text = BWP_INFO_TEXT2..tempitem_XBWP.Name..BWP_INFO_TEXT3; --Option message "Set"..$name.."as waypoint"
                   info.func = QuickSetMiniMenu; -- Function to set as destination
                   info.value = tempitem_XBWP --Pass the object value
                   tempitem_XBWP = nil
                   UIDropDownMenu_AddButton(info);
                else --X and Y dont Exist so its not in out current zone
                        info = {};
                        info.text = BWP_INFO_TEXT1..tempitem_XBWP.Name..BWP_INFO_TEXT3; --non click message "Must be in same zone blah blah"
                        info.isTitle = 1
                        tempitem_XBWP = nil
                        UIDropDownMenu_AddButton(info);
                end
        end
end

--sets a mininote from the value passed by the mini menu
function  QuickSetMiniMenu()
        UIDropDownMenu_SetText(this.value.Name, BWP_MenuFrame_DropDown);
        setmininote(this.value.X,this.value.Y,this.value.Name, "7", this.value.continent, this.value.zone);
        BWP_OptionsInit();
end

function BWP_CallMenu()
        ToggleDropDownMenu(1,1,BWP_MenuFrame_DropDown, "cursor",-150,0)
end

function BWP_ShowKBMenu(id)
        local centerx, centery;
        local name = getglobal("MetaKB_ScrollFrameButton"..id.."Name"):GetText();
        local zCheck = getglobal("MetaKB_ScrollFrameButton"..id.."Coords"):GetText();
        if(string.find(zCheck, "%(%d+\.?-?%d*%)?, %(?%d+\.?-?%d*%)")) then
                local continent, zone = MetaMap_NameToZoneID(GetRealZoneText());
                local coords = MetaKB_Data[MetaKB_dbID][name][continent][zone];
                local dx = coords[2]/100 - coords[4]/100;
                local dy = coords[3]/100 - coords[1]/100;
                centerx = MetaMap_round(coords[4]/100 + dx/2, 0);
                centery = MetaMap_round(coords[1]/100 + dy/2, 0);
        end
        local cx, cy = GetCursorPosition();
        BWP_MiniDropMenu:ClearAllPoints()
        BWP_MiniDropMenu:SetPoint("BOTTOM","UIParent","BOTTOMLEFT", cx, cy)
        tempitem_XBWP ={X = centerx, Y = centery, Name = name, continent = continent, zone = zone};
        ToggleDropDownMenu(1,1,BWP_MiniDropMenu)
end

function BWP_ShowNoteMenu(id)
        local continent, zone, currentZone, mapName = MetaMap_GetCurrentMapInfo();
        if not currentZone then return end
        tempitem_XBWP ={X = currentZone[id].xPos,Y = currentZone[id].yPos ,Name = currentZone[id].name} --call our minimenu (only option is to set waypoint)
        ToggleDropDownMenu(1,1,BWP_MiniDropMenu,"cursor",-150,0)
end


function BWP_ChecknumPOI()
        BWP_CZone_XTRA = nil
        local POIinZone = table.getn(BWP_CZone)
        if( POIinZone > 20) then
                local temp_CZone = {nil}
                BWP_CZone_XTRA = {nil}
                BWP_CZone_XTRA[1] = {nil}
                BWP_CZone_XTRA[2] = {nil}
                BWP_CZone_XTRA[3] = {nil}
                BWP_CZone_XTRA[4] = {nil}
                BWP_CZone_XTRA[5] = {nil}
                BWP_CZone_XTRA[6] = {nil}
                BWP_CZone_XTRA[7] = {nil}
                BWP_CZone_XTRA[8] = {nil}
                local BWPcount = 0
                table.sort(BWP_CZone,BWPsortbyName)
                for k,v in BWP_CZone do
                        BWPcount = BWPcount + 1
                        if(BWPcount < 21) then
                                tinsert(temp_CZone, v)
                        elseif(BWPcount < 42) then 
                                tinsert(BWP_CZone_XTRA[1], v );
                        elseif(BWPcount < 63) then 
                                tinsert(BWP_CZone_XTRA[2], v );
                        elseif(BWPcount < 84) then 
                                tinsert(BWP_CZone_XTRA[3], v );
                        elseif(BWPcount < 105) then 
                                tinsert(BWP_CZone_XTRA[4], v );
                        elseif(BWPcount < 126) then 
                                tinsert(BWP_CZone_XTRA[5], v );
                        elseif(BWPcount < 147) then 
                                tinsert(BWP_CZone_XTRA[6], v );
                        elseif(BWPcount < 168) then 
                                tinsert(BWP_CZone_XTRA[7], v );
                        elseif(BWPcount < 189) then 
                                tinsert(BWP_CZone_XTRA[8], v );
                        end
                end
                BWP_CZone = temp_CZone
        end
end


-- Constructor
function BWPnode:new(x, y, text, who) 
        return setmetatable( { xcoord = x, ycoord = y, note = text, author = who}, SNmeta);
end

-- Deconstructor
function BWPnode:delete()
        return setmetatable({}, BWPmeta);
end

--Getters
function BWPnode:getX() return self.xcoord; end
function BWPnode:getY() return self.ycoord; end
function BWPnode:getNote() return self.note; end
function BWPnode:getAuthor() return self.author; end

-- Setters
function BWPnode:setX(x) self.xcoord = x; end
function BWPnode:setY(y) self.ycoord = y; end
function BWPnode:setNote(text) self.note = text; end
function BWPnode:setAuthor(text) self.author = text; end

-- Constructor
function BWPDisp:new(x, y, who, desc, txt1, txt2, mod) 
        return setmetatable( { xcoord = x, ycoord = y, author = who, title = desc, inf1 = txt1, inf2 = txt2, type = mod }, BWPDispm);
end

-- Deconstructor
function BWPDisp:delete()
        return setmetatable({}, BWPDispm);
end

-- Getters
function BWPDisp:getX() return self.xcoord; end
function BWPDisp:getY() return self.ycoord; end
function BWPDisp:getTitle() return self.title; end
function BWPDisp:getNote1() return self.inf1; end
function BWPDisp:getNote2() return self.inf2; end
function BWPDisp:getAuthor() return self.author; end
function BWPDisp:getType() return self.type; end

function BWP_FormatCoords(x, y)
        local rx, ry, fx, fy, nx, ny;
        nx = string.format("%i", x*10000); ny = string.format("%i", y*10000);
        fx = string.format("%i", x*1000); fy = string.format("%i", y*1000);
        rx = string.format("%i", x*100); ry = string.format("%i", y*100);

        fx = tonumber(strsub(fx, strlen(fx),strlen(fx))); fy = tonumber(strsub(fy, strlen(fy), strlen(fy)));

        if (tonumber(strsub(nx, strlen(nx), strlen(nx))) >= 5) then fx = fx + 1; end
        if (tonumber(strsub(ny, strlen(ny), strlen(ny))) >= 5) then fy = fy + 1; end

        return tonumber(rx.."."..fx), tonumber(ry.."."..fy);
end

--Returns Distance(in whatever units it recieves)
function BWP_GetDist(loc1 , loc2)
        if(not loc1) or (not loc2) then return nil 
        else return math.sqrt((loc1.x - loc2.x)^2 + (loc1.y - loc2.y)^2)
        end
end

--formats to yards or meters or clicks
function BWP_FormatDist(loc1,loc2)
        local zone = GetRealZoneText();
        local thisDistance = BWP_GetDist(loc1 , loc2)
        local flag = BWP_getflag(thisDistance) -- gets the color flag based on distance in Units
        thisDistance = BWP_ConvertToYards(loc1.x, loc1.y, loc2.x, loc2.y) /10;
        if(BWP_Options.ShowYards) then
                theseUnits = " Yds"
        else
                thisDistance = thisDistance * 0.9144    
                theseUnits = " Mtrs"
        end
        thisDistance = tonumber(string.format("%.0f" , thisDistance)) -- we dont really need decimal places with this small of units
        return thisDistance, theseUnits, flag
end

function BWP_getflag(distanceinUNITS)-- Really returns a color equivilent of a distance range
        local tcd =  BWP_Options.SetDistance
        if(BWP_Options.SetDistance < 0.0040) then tcd =  0.0040 end
        if (distanceinUNITS <= (BWP_Options.SetDistance *1.215)) then   return "A"
        elseif (distanceinUNITS < tcd * 2.452) then return "Green" --for Green Text
        elseif (distanceinUNITS < tcd * 242.5) then return "Y" --For Yellow text
        else return "Red" -- for red text
        end
end

function BWP_ConvertToYards(x1, y1, x2, y2)
        if(x1 == nil) then
                x1, y1, x2, y2 = 0, 0, 0, 0;
        end
   local dx = (x1 - x2) * 40482.686754239;
   local dy = (y1 - y2) * (40482.686754239 / 1.5);
   return math.sqrt(dx * dx + dy * dy)
end

function BWP_GetDir()
        if(not updCount)then
         updCount = 0
        end
        updCount = updCount + 1;
        if (updCount < 2) then
                return;
        end
        updCount = 0;
        -- Find out where we are now
        local x,y = GetPlayerMapPosition("player");

        local t = GetTime();
   -- Store data if we've moved at least min sample distance
    local dx,dy = 0.00001,0.0001
        if ((x ~= 0) or (y ~= 0)) then
                dx,dy = lastX - x, lastY - y 
        end
        if ((math.abs(dx) >= MIN_SAMPLE_DISTANCE)
                or (math.abs(dy) >= MIN_SAMPLE_DISTANCE)) then
                
                lastIdx = lastIdx + 1;
                if (lastIdx > MAX_LOC_SAMPLES) then
            lastIdx = 1;
                end
                LOC_X_SAMPLES[lastIdx] = x;

        LOC_Y_SAMPLES[lastIdx] = y;

        LOC_T_SAMPLES[lastIdx] = t;

        lastX,lastY = x,y;
        end
        if (lastIdx == 0) then
      return;
   end
   
   local idx = lastIdx;
   local cx,cy,ct = LOC_X_SAMPLES[idx], LOC_Y_SAMPLES[idx];
   local ct = LOC_T_SAMPLES[idx]; 
   local cutoff = t - MAX_CUMUL_TIME;
   local tx,ty,tt;
   local found = nil;
   -- Scan back through the sample list for a long enough vector
   while (true) do
      idx = idx - 1;
      if (idx == 0) then
         idx = MAX_LOC_SAMPLES;
      end
      tx, ty, tt = LOC_X_SAMPLES[idx], LOC_Y_SAMPLES[idx], LOC_T_SAMPLES[idx];      
      -- If we ran out of samples without finding a long enough
      -- vector then stop
      if (not tt) or (tt >= ct) or (tt < cutoff)  then
                break
      end
      dx = cx - tx;
      dy = cy - ty;

      -- If this vector is finally long enough, set found flag and break
      -- dx,dy, tx,ty,tt, and idx will all be useful
                
      if ((dx*dx + dy*dy) >= MIN_CUMUL_RANGE_SQ) then
         found = true;
         break;
      end
   end
   -- Not enough data
   if (not found) then
      if (lastDeg) then
         lastDeg = nil;
      end
      return
   end
   -- If we get here we have a vector, let's convert it to degrees
        local deg = math.deg(math.atan2(dx,-dy)); 
        local loc1  , loc2 = {}, {}
        loc1.x, loc1.y = BWP_Destination.x, BWP_Destination.y
        loc2.x, loc2.y = GetPlayerMapPosition("player")
        gdclx = (loc1.x - loc2.x  );
        gdcly = (loc1.y - loc2.y );
        _,_,Arrivedyet = BWP_FormatDist(loc1,loc2)
         if (Arrivedyet == "A")and(not BWPFOLLOWPLAYER) then
                return "Arrived!"
        end
        local goaldeg = math.deg(math.atan2(gdclx,-gdcly))
        return (goaldeg - deg)
end

function GetLocalPoints()
        local Waypoints = {} 
        local countit = 0
        local zone = GetRealZoneText();
        local cont = nil;
        local cData;

        if (BWP_Zones and BWP_Zones[zone] == 1) then cont = "Kalimdor";
        elseif (BWP_Zones and BWP_Zones[zone] == 2) then cont = "Eastern Kingdoms"; end
        if (BWP_Data[cont] and BWP_Data[cont][zone]) then       
                text = "\n"
                local temp = BWP_Data[cont][zone];
                local node = nil;
                for key in temp do
                        node = setmetatable(temp[key], BWPmeta);
                        cData = BWPDisp:new(node:getX(), node:getY(), node:getAuthor(), "", node:getNote(), "", "BWP");
                        tinsert(Waypoints, cData);
                        countit = countit + 1
                end
        end
        if (MetaMapNotes_Data) then
                local BWP_mnCont, BWP_mnZone = MetaMap_GetCurrentMapInfo();
                if (MetaMapNotes_Data[BWP_mnCont] and MetaMapNotes_Data[BWP_mnCont][BWP_mnZone]) then
                        for key in MetaMapNotes_Data[BWP_mnCont][BWP_mnZone] do
                                
                                local adjx, adjy = MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].xPos * 100, MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].yPos* 100;
                                cData = BWPDisp:new(adjx, adjy, MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].creator, MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].name, MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].inf1, MetaMapNotes_Data[BWP_mnCont][BWP_mnZone][key].inf2, "MN");
                                tinsert(Waypoints, cData);
                                
                                countit = countit + 1
                        end
                end
        end
        return Waypoints , countit
end

function BWP_Generate()
        BWP_CZone = {};
        BWP_CZone , localpoints = GetLocalPoints()
end

function BWPsortbyName(a,b) return string.lower(a.title) < string.lower(b.title) end
function BWPSortByQuestGiverName(a,b) return string.lower(a.QuestGiver) < string.lower(b.QuestGiver) end

function BWP_SetRotation(dir)
        if(dir) then
                OffSet = tonumber(dir)
                if(OffSet)then
                        if(OffSet > 180 )then
                                OffSet = OffSet - 360
                        elseif(OffSet < -180) then
                                OffSet = OffSet + 360
                        end
                end
                if(dir == "Arrived!") then
                        BWP_CountDown = 75
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."Arrived"
                elseif(OffSet)and ((OffSet >=-5) and ( OffSet <= 5))or(OffSet < -355) then 
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."forward"
                elseif(OffSet)and (OffSet < -5) and (OffSet >= -15) then
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FLeft+2"
                elseif(OffSet)and (OffSet < -15) and (OffSet >= -35) then
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FLeft+1"
                elseif(OffSet)and (OffSet < -35) and (OffSet >= -55) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FLeft"
                elseif(OffSet)and (OffSet < -55) and (OffSet >= -65) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FLeft-1"
                elseif(OffSet)and (OffSet < -65) and (OffSet >= -80) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FLeft-2"
                elseif(OffSet)and (OffSet < -80) and (OffSet >= -100) then      
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."left"
                elseif(OffSet)and (OffSet < -100) and (OffSet >= -115) then     
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BLeft-2"
                elseif(OffSet)and (OffSet < -115) and (OffSet >= -135) then     
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BLeft-1"
                elseif(OffSet)and (OffSet < -135) and (OffSet >= -155) then     
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BLeft"
                elseif(OffSet)and (OffSet < -155) and (OffSet >= -165) then     
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BLeft+1"
                elseif(OffSet)and (OffSet < -165) and (OffSet >= -175) then     
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BLeft+2"
                elseif(OffSet)and ((OffSet < -175) and (OffSet >= -190)) or((OffSet > 175) and (OffSet <= 190)) then    
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."Backward"
                elseif(OffSet)and (OffSet > 165) and (OffSet <= 175) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BRight+2"
                elseif(OffSet)and (OffSet > 155) and (OffSet <= 165) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BRight+1"
                elseif(OffSet)and (OffSet > 135) and (OffSet <= 155) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BRight"
                elseif(OffSet)and (OffSet > 115) and (OffSet <= 135) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BRight-1"
                elseif(OffSet)and (OffSet > 100) and (OffSet <= 115) then       
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."BRight-2"
                elseif(OffSet)and (OffSet > 80) and (OffSet <= 100) then        
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."right"
                elseif(OffSet)and (OffSet > 65) and (OffSet <= 80) then 
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FRight-2"
                elseif(OffSet)and (OffSet > 55) and (OffSet <= 65) then 
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FRight-1"
                elseif(OffSet)and (OffSet > 35) and (OffSet <= 55) then 
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FRight"
                elseif(OffSet)and (OffSet > 15) and (OffSet <= 35) then 
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FRight+1"
                elseif(OffSet)and (OffSet > 5) and (OffSet <= 15) then  
                        BWP_ArrowIcon = BWP_IMAGE_PATH.."FRight+2"
                end
        end
        if(BWP_Destination) then
                BWP_Arrow:SetTexture(BWP_ArrowIcon);
        end
end