--[[ Characters Viewer: View equipment and inventory of alternate characters. Author: Flisher Contributor: Vincent of Blackhand Galmok Sinaloit Legorol Version: 1.03 (Cosmos Revision : $Rev: 3761 $) Last Changed by: $LastChangedBy: Flisher $ Date: $Date: 2006-07-06 10:52:10 -0400 (jeu., 06 juil. 2006) $ Official Distribution site: http://www.curse-gaming.com/mod.php?addid=490 Also packaged in Cosmos: http://www.cosmosui.org Planned feature for the next version: - Adding Bank Timestamping in the GUI - Adding HK/DK in the GUI Version history: 1.03 - Fixed the Bank Background, thank to bsmorgan for giving me the fix 1.02 - Fixed a German Localization, thank's to Maischter from ui.worldofwar.net community 1.01 - Merged Startust German localization file 1.00 - Fixed a typo in the merge of the WakyHorse sex fix, note that you might have to reload each char to fix the sex data Version under 1.0 change are available in the readme.txt file included in the zip file. ]]-- -- Initialize the variables local Server = GetRealmName(); CharactersViewerProfile = {}; CharactersViewerProfile[Server] = {}; CharactersViewerConfig = {}; local function print(msg) SELECTED_CHAT_FRAME:AddMessage("CV: "..msg); end CharactersViewer = { -- Functions unregister = { Event = function () for index, event in CharactersViewer.constant.event do this:UnregisterEvent(event); -- Event that will be called for initialisation of the addon end for index, event in CharactersViewer.constant.toggleEvents do this:UnregisterEvent(event); end end; }; register = { Event = function () for index, event in CharactersViewer.constant.event do this:RegisterEvent(event); -- Event that will be called for initialisation of the addon end CharactersViewer.status.register.event = true; end; hook = function () if(Sea) then Sea.util.hook("Logout", "CharactersViewer.collect.all"); Sea.util.hook("Quit", "CharactersViewer.collect.all"); Sea.util.hook("GuildPlayerStatus_Update", "CharactersViewer.Note.Guild_OnUpdate"); else CharactersViewer_ORIG_Logout = Logout; CharactersViewer_ORIG_Quit = Quit; CharactersViewer_ORIG_GuildPlayerStatus_Update = GuildStatus_Update; function Quit() CharactersViewer.collect.all(); return CharactersViewer_ORIG_Quit(); end function Logout() CharactersViewer.collect.all(); return CharactersViewer_ORIG_Logout(); end function GuildStatus_Update() CharactersViewer.Note.Guild_OnUpdate(); CharactersViewer_ORIG_GuildPlayerStatus_Update(); end end CharactersViewer.status.register.hook = true; end; cosmos = function () -- Cosmos Button Support -- if( EarthFeature_AddButton ) then EarthFeature_AddButton ( { id = "CharactersViewer"; name = BINDING_HEADER_CHARACTERSVIEWER; subtext = CHARACTERSVIEWER_SHORT_DESC; tooltip = CHARACTERSVIEWER_DESCRIPTION; icon = CHARACTERSVIEWER_ICON; callback = CharactersViewer.Toggle; test = nil; } ); CharactersViewer.status.register.earth = true; elseif(Cosmos_RegisterButton) then Cosmos_RegisterButton ( BINDING_HEADER_CHARACTERSVIEWER, CHARACTERSVIEWER_SHORT_DESC, CHARACTERSVIEWER_DESCRIPTION, CHARACTERSVIEWER_ICON, CharactersViewer.Toggle ); CharactersViewer.status.register.cosmos = true; end end; myaddon = function () -- Interoperability MyAddOns -- if(myAddOnsFrame_Register) then temp = { name = 'CharactersViewer', version = CharactersViewer.version.number, releaseDate = CharactersViewer.version.date, author = 'Flisher', email = 'flisher@gmail.com', website = 'http://www.curse-gaming.com/mod.php?addid=490', category = MYADDONS_CATEGORY_INVENTORY, optionsframe = '' }; myAddOnsFrame_Register(temp, CHARACTERSVIEWER_USAGE_SUBCMD); CharactersViewer.status.register.myaddon = true; end end; counselor = function () -- Counselor tip -- if(Counselor and Counselor.registerTip) then Counselor.registerTip ( { id = "CharactersViewer_013"; addOn = "CharactersViewer"; type = COUNSELOR_STARTUP; title = "CharactersViewer Description"; text = "CharactersViewer is an addons created with the purpose of displaying information about your other characters on the same server,\nYou can call the addons by typing /cv.\n\n If the addons already know information about yout other characters, a dropdown menu will appear in your character paperdoll soo you can compare with your other character."; tooltip = "What CharactersViewer can do for you!"; } ); CharactersViewer.status.register.counselor = true; end end; ctmod = function() if(CT_RegisterMod) then CT_RegisterMod(BINDING_HEADER_CHARACTERSVIEWER, CHARACTERSVIEWER_SHORT_DESC, 4, "Interface\\Buttons\\Button-Backpack-Up", CHARACTERSVIEWER_DESCRIPTION, "switch", "", CharactersViewer.Toggle); CharactersViewer.status.register.ctmod = true; end end; titanmodmenu = function () if(TitanModMenu_MenuItems) then TitanModMenu_MenuItems["CharactersViewer"] = { frame = "CharactersViewer_Frame", cat = TITAN_MODMENU_CAT_INVENTORY, text = BINDING_HEADER_CHARACTERSVIEWER, func = "CharactersViewer_Toggle" }; CharactersViewer.status.register.titanmodmenu = true; end end; slashcmd = function () -- Register the SlashCommand in the system --! todo: Regster thing with cosmos slashcmd SlashCmdList["CHARACTERSVIEWER"] = function(msg) CharactersViewer.SlashCmd(msg); end CharactersViewer.status.register.slashcmd = true; end; }; onLoad = function () -- Registering Event CharactersViewer.register.Event(); ---- Todo: Register slashcommand with sky CharactersViewer.register.slashcmd(); -- Registering with other addons -- CharactersViewer.register.cosmos(); CharactersViewer.register.myaddon(); CharactersViewer.register.counselor(); CharactersViewer.register.ctmod(); CharactersViewer.register.titanmodmenu(); end; SlashCmd = function(msg) -- CharactersViewer.SlashCmd() -- get the parameter from the ShashCmd param = CharactersViewer.library.splitstring(msg); if( param[0] and strlen(param[0]) > 0 ) then param[0] = strlower(param[0]); end if( msg and strlen(msg) > 0 ) then msg = strlower(msg); end if(msg == CHARACTERSVIEWER_SUBCMD_SHOW) then CharactersViewer_Show(); elseif(param[0] == CHARACTERSVIEWER_SUBCMD_CLEAR) then -- if no param[1] (character), then assign the current one. if(not param[1] ) then param[1] = UnitName("player"); --! todo: use the new blizzard function end -- Make the first character upper, all the other lowercase. param[1] = string.upper(string.sub(param[1], 1,1)) .. string.lower(string.sub(param[1] , 2)); -- Check if the data exist, if(CharactersViewerProfile[Server][param[1]] ~= nil) then -- The data is confirmed existing, we can wipe it. CharactersViewerProfile[Server][param[1]] = nil; --! Make it Sea compatible print(CHARACTERSVIEWER_PROFILECLEARED .. param[1]); -- If we cleared ourself, we will collect data if( param[1] == UnitName("player") ) then CharactersViewer.collect.all(); elseif( param[1] == CharactersViewer.index ) then CharactersViewer.Switch(); CharactersViewer_PaperDoll_Dropdown2_Toggle(); else CharactersViewer_PaperDoll_Dropdown2_Toggle(); end else -- The data isn't existing for that character --! Make it Sea compatible print(CHARACTERSVIEWER_NOT_FOUND .. param[1]); end elseif(msg == CHARACTERSVIEWER_SUBCMD_CLEARALL) then CharactersViewerProfile = {}; --! todo: make it sea compliant print(CHARACTERSVIEWER_ALLPROFILECLEARED); CharactersViewer.collect.all(); CharactersViewer.Switch(); CharactersViewer_PaperDoll_Dropdown2_Toggle(); elseif(msg == "") then CharactersViewer.Toggle(); elseif(msg == CHARACTERSVIEWER_SUBCMD_PREVIOUS) then CharactersViewer.Switch(-1); elseif(msg == CHARACTERSVIEWER_SUBCMD_NEXT) then CharactersViewer.Switch(1); elseif(param[0] == CHARACTERSVIEWER_SUBCMD_SWITCH) then if(not param[1] ) then param[1] = UnitName("player"); --! todo: use the new blizzard function end CharactersViewer.Switch(param[1]); elseif(msg == CHARACTERSVIEWER_SUBCMD_LIST) then CharactersViewer.List(); elseif(msg == CHARACTERSVIEWER_SUBCMD_BANK) then CharactersViewer.Bank.Toggle(); elseif(msg == CHARACTERSVIEWER_SUBCMD_RESETLOC ) then CharactersViewer.ResetLoc(); elseif(msg == CHARACTERSVIEWER_SUBCMD_BAGS) then CharactersViewer_Bags(); elseif(msg == CHARACTERSVIEWER_SUBCMD_BAGUSE) then CharactersViewer_Bags('use'); else print(CHARACTERSVIEWER_USAGE); local index, subcmdUsage; for index, subcmdUsage in CHARACTERSVIEWER_USAGE_SUBCMD do if(subcmdUsage) then print(subcmdUsage); end end end end; Toggle = function () -- Changed by Flisher 2005-06-12 if(CharactersViewer_Frame:IsVisible()) then CharactersViewer.Hide(); else CharactersViewer_Show(); end end; Hide = function() HideUIPanel(CharactersViewer_Frame); CharactersViewerBankFrame:Hide(); PlaySound("igMainMenuClose"); end; ResetLoc = function() UIPanelWindows["CharactersViewer_Frame"] = { area = "up", pushable = 6 }; HideUIPanel(CharactersViewer_Frame); ShowUIPanel(CharactersViewer_Frame); UIPanelWindows["CharactersViewer_Frame"] = nil; HideUIPanel(CharactersViewer_Frame); ShowUIPanel(CharactersViewer_Frame); CharactersViewer_Frame:SetUserPlaced(); end; List = function () if(CharactersViewerProfile and CharactersViewerProfile[Server]) then for index, item in CharactersViewerProfile[Server] do if( CharactersViewerProfile[Server][index]["Type"] and CharactersViewerProfile[Server][index]["Type"] == "Self") then if( CharactersViewerProfile[Server][index] and CharactersViewerProfile[Server][index]["Data"]) then local output = index; if(CharactersViewerProfile[Server][index]["Data"]["Id"] and CharactersViewerProfile[Server][index]["Data"]["Id"]["Class"]) then output = output .. ", " .. CharactersViewerProfile[Server][index]["Data"]["Id"]["Class"]; end if(CharactersViewerProfile[Server][index]["Data"]["Id"] and CharactersViewerProfile[Server][index]["Data"]["Id"]["Level"]) then output = output .. ", " .. CharactersViewerProfile[Server][index]["Data"]["Id"]["Level"]; end if(CharactersViewerProfile[Server][index]["Data"]["Location"] and CharactersViewerProfile[Server][index]["Data"]["Location"]["Zone"]) then output = output .. ", " .. CharactersViewerProfile[Server][index]["Data"]["Location"]["Zone"]; end if( CharactersViewerProfile[Server][index]["Data"]["Mail"] and CharactersViewerProfile[Server][index]["Data"]["Mail"]["HasNewMail"]) then output = output .. ", " .. HAVE_MAIL; end if( CharactersViewerProfile[Server][index]["Data"]["xp"] ) then local temp = CharactersViewer.library.CalcRestedXP( CharactersViewerProfile[Server][index]["Data"]["xp"] ); if( temp and temp.estimated > 0 ) then output = output .. ", " .. temp.levelratio .. " " .. LEVEL .. " " .. CHARACTERSVIEWER_RESTED; end if( CharactersViewerProfile[Server][index]["Data"]["xp"]["resting"] and temp.levelratio < 1.5 ) then output = output .. ", " .. CHARACTERSVIEWER_RESTING; end end print(output); end end end end end; Switch = function (choice) if(choice == nil) then choice = UnitName("player"); --! todo: improve end if(choice == -1 or choice == 1) then local current = 0; local i = 0; local temp = {}; for j, name in CharactersViewerProfile[Server] do if(name["Type"] == "Self") then i = i + 1; temp[i] = j; if(j == CharactersViewer.index ) then current = i; end end end current = current + choice; if(current <= 0) then choice = temp[i]; elseif(current > i) then choice = temp[1]; else choice = temp[current]; end end -- Switch the current characterviwer character choice2 = string.upper(string.sub(choice, 1,1)) .. string.lower(string.sub(choice , 2)); -- Make the first character upper, all the other lowercase. if(CharactersViewerProfile[Server][choice] ~= nil) then CharactersViewer.index = choice; CharactersViewerCurrentIndex = CharactersViewer.index; -- Backward compatibility elseif(CharactersViewerProfile[Server][choice2] ~= nil) then CharactersViewer.index = choice2; CharactersViewerCurrentIndex = CharactersViewer.index; -- Backward compatibility else print(CHARACTERSVIEWER_NOT_FOUND .. choice); CharactersViewer.Hide(); end if(CharactersViewer_Frame:IsVisible()) then CharactersViewer_Show(); end if( AC_Target and AC_Target:IsVisible()) then AC_CV_DropDown_OnClick(name); end end; collect = { basic = function (target) local temp = {}; -- Set the mana pool if it's a mana user if( UnitPowerType(target) and UnitPowerType(target) == 0 ) then if( UnitManaMax(target) and UnitManaMax(target) > 0) then temp["Mana"] = UnitManaMax(target); else temp["Mana"] = "??"; end end if(UnitHealthMax(target) and (UnitHealthMax(target) > 100 or target == "player") ) then temp["Health"] = UnitHealthMax(target); else temp["Health"] = "??"; end if(target == "player") then temp["Defense"] = UnitDefense(target); -- Set the armor value local baseArm, effectiveArmor, armor, positiveArm, negativeArm = UnitArmor(target); temp["Armor"] = baseArm .. ":" .. (baseArm + positiveArm) .. ":" .. positiveArm; -- if they have a debuf on, don't save it end return temp; end; id = function (target) -- Flisher 2005-07-29 local Race, RaceEn = UnitRace(target); local Class, ClassEn = UnitClass(target); local temp = { Sex = CharactersViewer.collect.sex(target, 0), SexId = CharactersViewer.collect.sex(target, 1), Race = Race, RaceEn = RaceEn, Class = Class, ClassEn = ClassEn, Level = UnitLevel(target), Server = Server, Name = UnitName(target), -- Added 2005-07-28 for easyness of access, by Flisher }; return temp; end; location = function () -- Flisher 2005-07-29 return { Zone = GetZoneText(), SubZone = GetSubZoneText(), } end; xp = function() -- Flisher 2005-07-29 return { max = UnitXPMax("player"); current = UnitXP("player"); resting = IsResting() == 1 or false; bonus = GetXPExhaustion(); timestamp = time(); } end; mail = function () -- Flisher 2005-07-28 local temp = {}; temp["HasNewMail"] = HasNewMail() == 1 or false; --temp["nb"] = GetInboxNumItems(); return temp; end; sex = function (target, num) -- Flisher 2006-07-01, CharactersViewer.collect.sex local temp = ""; temp = mod(UnitSex(target),2); if( (not num) or num == 0) then if(temp and temp == 0) then temp = MALE; else temp = FEMALE; end end return temp; end; guild = function (target) -- Flisher 2005-07-28 local temp = {}; temp["GuildName"], temp["Title"], temp["Rank"] = GetGuildInfo(target); return temp; end; stats = function () -- Flisher 2005-07-28 -- "stat" is the same as effectiveStat... -- problem here is if they have a debuff spell on, the values saved will be wrong local temp = {}; for index = 1, 5 do local stat, effectiveStat, posBuff, negBuff = UnitStat("player", index); temp[index] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff; end return temp; end; resistance = function () -- Flisher 2005-06-28 local temp = {}; for index = 2, 6 do local base, resistance, positive, negative = UnitResistance("player", index); temp[index] = resistance; end return temp; end; combatstats = function () -- Flisher 2005-06-12 local temp = {}; temp["D"] = GetDodgeChance(); if( GetBlockChance() > 0) then temp["B"] = GetBlockChance(); end -- Get Parry Chance local _, class = UnitClass('player'); if( class=="MAGE" or class=="WARLOCK" or class=="DRUID" or class=="PRIEST" ) then temp["P"] = 0; else temp["P"] = GetParryChance(); end -- Get Crit Chance local i=0; repeat i=i+1; spellName, subSpellName = GetSpellName(i,BOOKTYPE_SPELL); until (spellName == ATTACK) or (not spellName) if(not spellName) then return temp; end CharactersVTooltip:SetOwner(UIParent, "ANCHOR_NONE"); CharactersVTooltip:SetSpell(i, BOOKTYPE_SPELL); local _, _, tmpStr = string.find(CharactersVTooltipTextLeft2:GetText(), '(%d+\.%d+)'); CharactersVTooltip:Hide(); tmpStr = string.gsub(tmpStr, ",", "."); temp["C"] = tmpStr; return temp; end; honor = function (target) -- Flisher 2005-06-12 local temp = {}; if(UnitPVPRank(target) and GetPVPRankInfo(UnitPVPRank(target)) and UnitPVPRank(target) >= 1) then temp["rankName"], temp["rankNumber"] = GetPVPRankInfo(UnitPVPRank(target)); end temp["HK"],temp["DK"] = GetPVPLifetimeStats(); -- Wakyhorse HK's return temp; end; Equipment = function(target) -- Changed by Flisher 2005-06-12 local link, texture ; temp = {} -- Initialise the equipments for index = 1, 19 do link = GetInventoryItemLink(target, index); texture = GetInventoryItemTexture(target, index); if( link ) then for color, item, name in string.gfind(link, "|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r") do if( color ~= nil and item ~= nil and name ~= nil ) then temp[index] = { }; temp[index]["T"] = texture; temp[index]["L"] = CharactersViewer.library.DeLink(link); if( GetInventoryItemCount(target, index) > 1 ) then temp[index]["C"] = GetInventoryItemCount(target, index); end end end end end return temp; end; Inventory = function () -- Changed by Flisher 2005-06-12 local bag, bagname, link, texture, color, item, strings, str; -- Reset/Initialize CharactersViewerProfile[Server][UnitName("player")]["Bag"] = {} for bag = 0,4 do if(bag == 0) then bagname = "Backpack"; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag] = { }; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["name"] = GetBagName(bag); --CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["Item"] = "Backpack"; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["Color"] = "ffffffff"; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["size"] = GetContainerNumSlots(bag); -- End of warlock workaround CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["T"] = "Interface\\Buttons\\Button-Backpack-Up"; CharactersViewer.collect.Bag(bag); else link = GetInventoryItemLink("player", (bag+19)); texture = GetInventoryItemTexture("player", (bag+19)); if( link ) then CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag] = { }; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["name"] = GetBagName(bag); CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["size"] = GetContainerNumSlots(bag); CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["L"] = CharactersViewer.library.DeLink(link); CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["T"] = texture; CharactersViewer.collect.Bag(bag); end end end --Kerying Gathering bag = KEYRING_CONTAINER; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag] = { }; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["name"] = "Keyring"; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["Color"] = "ffffffff"; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["size"] = GetKeyRingSize(bag); CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag]["T"] = "Interface\\ContainerFrame\\KeyRing-Bag-Icon"; CharactersViewer.collect.Bag(bag); end; Bag = function (bag) -- CharactersViewer.collect.Bag Changed by Flisher 2006-07-01 local slot, strings, str, texture, itemCount, locked, quality, link, color, item, name; if (bag ~= KEYRING_CONTAINER) then totalslot = GetContainerNumSlots(bag); else totalslot = GetKeyRingSize(); end for slot = 1, totalslot do -- loop through all slots in this bag and get items CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag][slot] = {}; texture, itemCount, locked, quality = GetContainerItemInfo(bag,slot); link = GetContainerItemLink(bag, slot); if( link ) then CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag][slot]["T"] = texture; CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag][slot]["L"] = CharactersViewer.library.DeLink(link); if(itemCount > 1) then CharactersViewerProfile[Server][UnitName("player")]["Bag"][bag][slot]["C"] = itemCount; end end end end; all = function () -- Changed Flisher 2005-06-12 local bank; -- Properly initialize the SavedVariable if it do not exist if( not CharactersViewerProfile ) then CharactersViewerProfile = {}; end -- Properly initialize the current realm if it do not exist if( not CharactersViewerProfile[Server] ) then CharactersViewerProfile[Server] = {}; end -- Properly initialise the current character data -- Bank Data protection if( CharactersViewerProfile[Server][UnitName("player")] and CharactersViewerProfile[Server][UnitName("player")]["Bank"]) then bank = CharactersViewerProfile[Server][UnitName("player")]["Bank"]; end -- GCV Data protection, requested by LordRod if( CharactersViewerProfile[Server][UnitName("player")] and CharactersViewerProfile[Server][UnitName("player")]["GCV"]) then gcv = CharactersViewerProfile[Server][UnitName("player")]["GCV"]; end -- Data Reinitialisation CharactersViewerProfile[Server][UnitName("player")] = {}; -- Bank restore CharactersViewerProfile[Server][UnitName("player")] = {}; if( bank ) then CharactersViewerProfile[Server][UnitName("player")]["Bank"] = bank; end -- GCV restore if( gcv ) then CharactersViewerProfile[Server][UnitName("player")]["GCV"] = gcv; end -- Initialise the type CharactersViewerProfile[Server][UnitName("player")]["Type"] = "Self"; CharactersViewerProfile[Server][UnitName("player")]["Timestamp"] = time(); CharactersViewerProfile[Server][UnitName("player")]["Data"] = { Type = CharactersViewerProfile[Server][UnitName("player")]["Type"]; Timestamp = CharactersViewerProfile[Server][UnitName("player")]["Timestamp"]; Money = GetMoney(), Guild = CharactersViewer.collect.guild("player"); Resists = CharactersViewer.collect.resistance(); Stats = CharactersViewer.collect.stats(); CombatStats = CharactersViewer.collect.combatstats(); Mail = CharactersViewer.collect.mail(false); Id = CharactersViewer.collect.id("player"); Location = CharactersViewer.collect.location(); xp = CharactersViewer.collect.xp(); Honor = CharactersViewer.collect.honor("player"); Basic = CharactersViewer.collect.basic("player"); } CharactersViewerProfile[Server][UnitName("player")]["Equipment"] = CharactersViewer.collect.Equipment("player"); CharactersViewer.collect.Inventory(); -- Set the status flag if data was collected at least once sicne the addon loaded if(not CharactersViewer.status.collected) then CharactersViewer.status.collected = true; CharactersViewer.Switch(); CharactersViewer_PaperDoll_Dropdown2_Toggle(); end end; inspect = function () -- Created by Flisher 2005-08-10 if( UnitIsPlayer("target") and not UnitIsUnit("player", "target") and UnitName("target") ~= nil and UnitName("target") ~= UNKNOWNOBJECT and UnitName("target") ~= UKNOWNBEING ) then -- Properly initialize the SavedVariable if it do not exist if( not CharactersViewerProfile ) then CharactersViewerProfile = {}; end -- Properly initialize the current realm if it do not exist if( not CharactersViewerProfile[Server] ) then CharactersViewerProfile[Server] = {}; end -- Properly initialise the current character data CharactersViewerProfile[Server][UnitName("target")] = {}; -- Initialise the type CharactersViewerProfile[Server][UnitName("target")]["Type"] = "Inspect"; CharactersViewerProfile[Server][UnitName("target")]["Timestamp"] = time(); CharactersViewerProfile[Server][UnitName("target")]["Data"] = { Type = CharactersViewerProfile[Server][UnitName("target")]["Type"]; Timestamp = CharactersViewerProfile[Server][UnitName("target")]["Timestamp"]; Guild = CharactersViewer.collect.guild("target"); Id = CharactersViewer.collect.id("target"); Honor = CharactersViewer.collect.honor("target"); Basic = CharactersViewer.collect.basic("target"); --Money = GetMoney(), --Resists = CharactersViewer.collect.resistance(); --Stats = CharactersViewer.collect.stats(); --CombatStats = CharactersViewer.collect.combatstats(); --Mail = CharactersViewer.collect.mail(false); --Location = CharactersViewer.collect.location(); --xp = CharactersViewer.collect.xp(); } CharactersViewerProfile[Server][UnitName("target")]["Equipment"] = CharactersViewer.collect.Equipment("target"); --CharactersViewer.collect.Inventory(); CharactersViewer_PaperDoll_Dropdown2_Toggle(); end end; bank = -- CharactersViewer.collect.bank { SaveItems = function () -- CharactersViewer.collect.bank.SaveItems local itemLink,icon,quantity,bagNum_Slots; CharactersViewerProfile[Server][UnitName("player")]["Bank"] = {}; CharactersViewerProfile[Server][UnitName("player")]["Bank"]["timestamp"] = time(); -- WakyHorse Bank Timestamp CharactersViewerProfile[Server][UnitName("player")]["Bank"]["Main"] = {}; for num = 1, 24 do itemLink = CharactersViewer.library.DeLink( GetContainerItemLink(BANK_CONTAINER, num) ); icon, quantity = GetContainerItemInfo(BANK_CONTAINER, num); if( itemLink ) then CharactersViewerProfile[Server][UnitName("player")]["Bank"]["Main"][num] = { ["T"] = icon, ["L"] = itemLink } end if(quantity and quantity > 1) then CharactersViewerProfile[Server][UnitName("player")]["Bank"]["Main"][num]["C"] = quantity; end end for bagNum = 5, 10 do local bagNum_ID = BankButtonIDToInvSlotID(bagNum, 1); link = GetInventoryItemLink("player", bagNum_ID); texture = GetInventoryItemTexture("player", bagNum_ID); if( link ) then CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum] = { }; CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum]["name"] = GetBagName(bagNum); CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum]["size"] = GetContainerNumSlots(bagNum); CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum]["L"] = CharactersViewer.library.DeLink(link); CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum]["T"] = texture; --CharactersViewer.collect.Bag(bag); end --itemLink = nil; for bagItem = 1, GetContainerNumSlots(bagNum) do itemLink = CharactersViewer.library.DeLink( GetContainerItemLink(bagNum, bagItem) ); icon, quantity = GetContainerItemInfo(bagNum, bagItem); if( itemLink ) then CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum][bagItem] = { ["L"] = itemLink, ["T"] = icon, }; if(quantity and quantity > 1) then CharactersViewerProfile[Server][UnitName("player")]["Bank"][bagNum][bagItem]["C"] = quantity; end end end end end } }; db = { validate = function () if(CharactersViewerConfig and CharactersViewerConfig["version"] and CharactersViewerConfig["version"] == CharactersViewer.version.db ) then return true; else return false; end end; init = function () --CharactersViewer.db.init() CharactersViewerConfig = {}; CharactersViewerProfile = {}; ---- Todo: Make the display Sea Compatible -- Display a warning print(CHARACTERSVIEWER_ALLPROFILECLEARED); -- Update the version of the Database CharactersViewerConfig["version"] = CharactersViewer.version.db; -- Initialise the Bag Display Status, true by default CharactersViewerConfig["Bag_Display"] = true; CharactersViewerConfig["Bag_Location"] = 0; CharactersViewerConfig["BankBag_Display"] = true; end; }; library = -- CharactersViewer.library { GetRaceFaction = function( raceEn) -- Wakyhorse Added GetRaceFaction Function Starts here if (raceEn == "Human" or raceEn == "Dwarf" or raceEn == "Gnome" or raceEn == "NightElf") then return 1; end if (raceEn == "Orc" or raceEn == "Troll" or raceEn == "Scourge" or raceEn == "Tauren") then return 2; end --print("Unknown Race "..race); return 3; end; -- Wakyhorse Added GetRaceFaction Function Ends here splitstring = function (input) -- CharactersViewer.library.splitstring local list = {}; local i = 0; for w in string.gfind(input, "([^ ]+)") do list[i] = w; i = i + 1; end return list; end; returnColor = function (quality) -- CharactersViewer.library.returnColor color = { [0] = "ff9d9d9d", -- poor, gray [1] = "ffffffff", -- common, white [2] = "ff1eff00", -- uncommon, green [3] = "ff0070dd", -- rare, blue [4] = "ffa335ee", -- epic, purple [5] = "ffff8000", -- legendary, orange } return color[quality]; end; MakeLink = function(link) -- CharactersViewer.library.MakeLink local temp = link; if( link and string.sub(link,1,5) == "item:") then local name,_,quality = GetItemInfo(link); local color = CharactersViewer.library.returnColor(quality); if(name) then temp = "|c"..color.."|H"..link.."|h["..name.."]|h|r"; else temp = false; end end return temp; end; DeLink = function(link) -- CharactersViewer.library.DeLink local temp = link; if( link and string.sub(link,1,2) == "|c") then _,_,temp = strfind(link,"|H(item:%d+:%d+:%d+:%d+)|"); end return temp; end; CalcRestedXP = function (data) -- CharactersViewer.library.CalcRestedXP local temp = { estimated = 0; levelratio = 0; percentrested = 0; } if(data and data["bonus"] and data["resting"] ~= nil and data["max"] and data["timestamp"]) then local speed = data.resting and 4 or 1; local estimated = data.bonus; if(data.timestamp < time()) then estimated = data.bonus + floor((time()-data.timestamp) * data.max * 1.5 / 864000 / 4 * speed); if(estimated > (data.max * 1.5) ) then estimated = (data.max * 1.5); end end temp = { estimated = estimated; levelratio = floor(estimated/data.max *10)/10; percentrested = floor(estimated / (data.max *1.5) *100)/100; } end return temp; end; MoneyTotal = function(faction) -- CharactersViewer.library.MoneyTotal local total = 0; if( CharactersViewerProfile and CharactersViewerProfile[Server] ) then for index in CharactersViewerProfile[Server] do if( CharactersViewerProfile[Server][index]["Data"] and CharactersViewerProfile[Server][index]["Data"]["Money"] ) then if (CharactersViewerProfile[Server][index]["Data"]["Id"]["RaceEn"]) then if ( CharactersViewer.library.GetRaceFaction(CharactersViewerProfile[Server][index]["Data"]["Id"]["RaceEn"]) == faction) then total = total + CharactersViewerProfile[Server][index]["Data"]["Money"]; end end end end end return total; end; }; Mail = { OnEnter = function() -- CharactersViewer.Mail.OnEnter local count = ""; GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); if(MailTo_InFrame and MailTo_Mail and MailTo_Mail[Server][CharactersViewer.index]) then count = 0; for anything in MailTo_Mail[Server][CharactersViewer.index] do count = count + 1; end count = " (" .. count ..")"; end GameTooltip:SetText(HAVE_MAIL .. count .. "\n\n" .. CHARACTERSVIEWER_TOOLTIP_MAIL); end; OnClick = function(button) -- CharactersViewer.Mail.OnClick if(MailTo_InFrame) then if(arg1 == "LeftButton") then if(MailTo_InFrame:IsVisible() ) then HideUIPanel(MailTo_InFrame); else MailTo_inbox(CharactersViewer.index); end elseif(arg1 == "RightButton") then --CharactersViewer.Bag.Relocate(true); end end end }; Bag = { -- CharactersViewer.Bag Display = function() -- CharactersViewer.Bag.Display local index2 = 0; for index = 0,4 do getglobal("CharactersViewer_ContainerFrame" ..index ):Hide(); if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][index]) then CharactersViewer.Bag.Draw(index, index2, "bag"); index2 = index2 + 1; end end --keyring getglobal("CharactersViewer_KeyringContainerFrame"):Hide(); if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][KEYRING_CONTAINER]) then CharactersViewer.Bag.Draw(KEYRING_CONTAINER, "", "keyring"); index2 = index2 + 1; end end; Hide = function() -- CharactersViewer.Bag.Hide for index = 0,4 do bagFrame = getglobal("CharactersViewer_ContainerFrame" ..index ):Hide(); end --keyring bagFrame = getglobal("CharactersViewer_KeyringContainerFrame"):Hide(); end; Draw = function(bagID, FrameID, option) -- CharactersViewer.Bag.Draw local theBag, frame, name, bagTextureSuffix; if( option == "bag" ) then theBag = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bagID]; frame = getglobal("CharactersViewer_ContainerFrame"..(FrameID)); name = frame:GetName(); bagTextureSuffix = ""; elseif( option == "bankbag") then theBag = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bagID]; frame = getglobal("CharactersViewer_BankItemsContainerFrame"..(FrameID)); name = frame:GetName(); bagTextureSuffix = "-Bank"; elseif ( option == "keyring" ) then theBag = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][KEYRING_CONTAINER]; frame = getglobal("CharactersViewer_KeyringContainerFrame"); name = frame:GetName(); bagTextureSuffix = "-Keyring"; end frame.size = theBag.size; size = theBag.size; id = bagID; frame:Hide(); local bgTextureTop = getglobal(name.."BackgroundTop"); local bgTextureMiddle = getglobal(name.."BackgroundMiddle1"); local bgTextureBottom = getglobal(name.."BackgroundBottom"); local columns = NUM_CONTAINER_COLUMNS; local rows = ceil(size / columns); -- if size = 0 then its the backpack if ( id == 0 ) then --getglobal(name.."MoneyFrame"):Show(); -- not used in CV -- Set Backpack texture bgTextureTop:SetTexture("Interface\\ContainerFrame\\UI-BackpackBackground"); bgTextureTop:SetHeight(256); bgTextureTop:SetTexCoord(0, 1, 0, 1); -- Hide unused textures for i=1, MAX_BG_TEXTURES do getglobal(name.."BackgroundMiddle"..i):Hide(); end bgTextureBottom:Hide(); frame:SetHeight(240); else -- Not the backpack -- Set whether or not its a bank bag local bagTextureSuffix = ""; if ( id > NUM_BAG_FRAMES ) then bagTextureSuffix = "-Bank"; elseif ( id == KEYRING_CONTAINER ) then bagTextureSuffix = "-Keyring"; end -- Set textures bgTextureTop:SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix); for i=1, MAX_BG_TEXTURES do getglobal(name.."BackgroundMiddle"..i):SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix); getglobal(name.."BackgroundMiddle"..i):Hide(); end bgTextureBottom:SetTexture("Interface\\ContainerFrame\\UI-Bag-Components"..bagTextureSuffix); -- Hide the moneyframe since its not the backpack --getglobal(name.."MoneyFrame"):Hide(); -- not used in CV local bgTextureCount, height; local rowHeight = 41; -- Subtract one, since the top texture contains one row already local remainingRows = rows-1; -- See if the bag needs the texture with two slots at the top local isPlusTwoBag; if ( mod(size,columns) == 2 ) then isPlusTwoBag = 1; end -- Bag background display stuff if ( isPlusTwoBag ) then bgTextureTop:SetTexCoord(0, 1, 0.189453125, 0.330078125); bgTextureTop:SetHeight(72); else if ( rows == 1 ) then -- If only one row chop off the bottom of the texture bgTextureTop:SetTexCoord(0, 1, 0.00390625, 0.16796875); bgTextureTop:SetHeight(86); else bgTextureTop:SetTexCoord(0, 1, 0.00390625, 0.18359375); bgTextureTop:SetHeight(94); end end -- Calculate the number of background textures we're going to need bgTextureCount = ceil(remainingRows/ROWS_IN_BG_TEXTURE); local middleBgHeight = 0; -- If one row only special case if ( rows == 1 ) then bgTextureBottom:SetPoint("TOP", bgTextureMiddle:GetName(), "TOP", 0, 0); bgTextureBottom:Show(); -- Hide middle bg textures for i=1, MAX_BG_TEXTURES do getglobal(name.."BackgroundMiddle"..i):Hide(); end else -- Try to cycle all the middle bg textures local firstRowPixelOffset = 9; local firstRowTexCoordOffset = 0.353515625; for i=1, bgTextureCount do bgTextureMiddle = getglobal(name.."BackgroundMiddle"..i); if ( remainingRows > ROWS_IN_BG_TEXTURE ) then -- If more rows left to draw than can fit in a texture then draw the max possible height = ( ROWS_IN_BG_TEXTURE*rowHeight ) + firstRowTexCoordOffset; bgTextureMiddle:SetHeight(height); bgTextureMiddle:SetTexCoord(0, 1, firstRowTexCoordOffset, ( height/BG_TEXTURE_HEIGHT + firstRowTexCoordOffset) ); bgTextureMiddle:Show(); remainingRows = remainingRows - ROWS_IN_BG_TEXTURE; middleBgHeight = middleBgHeight + height; else -- If not its a huge bag bgTextureMiddle:Show(); height = remainingRows*rowHeight-firstRowPixelOffset; bgTextureMiddle:SetHeight(height); bgTextureMiddle:SetTexCoord(0, 1, firstRowTexCoordOffset, ( height/BG_TEXTURE_HEIGHT + firstRowTexCoordOffset) ); middleBgHeight = middleBgHeight + height; end end -- Position bottom texture bgTextureBottom:SetPoint("TOP", bgTextureMiddle:GetName(), "BOTTOM", 0, 0); bgTextureBottom:Show(); end -- Set the frame height frame:SetHeight(bgTextureTop:GetHeight()+bgTextureBottom:GetHeight()+middleBgHeight); end frame:SetWidth(CONTAINER_WIDTH); getglobal(name.."Name"):SetText(theBag.name ); getglobal(name.."Portrait"):SetTexture(theBag.T); --[[ --Special case code for keyrings if ( id == KEYRING_CONTAINER ) then getglobal(frame:GetName().."Name"):SetText(KEYRING); SetPortraitToTexture(frame:GetName().."Portrait", "Interface\\ContainerFrame\\KeyRing-Bag-Icon"); else getglobal(frame:GetName().."Name"):SetText(GetBagName(id)); SetBagPortaitTexture(getglobal(frame:GetName().."Portrait"), id); end ]]-- for j=1, size, 1 do local index = size - j + 1; item = theBag[index]; itemButton = getglobal(name.."Item"..j); -- Set first button if( j == 1 ) then -- Anchor the first item differently if its the backpack frame if ( id == 0 ) then itemButton:SetPoint("BOTTOMRIGHT", name, "BOTTOMRIGHT", -12, 30); else itemButton:SetPoint("BOTTOMRIGHT", name, "BOTTOMRIGHT", -12, 9); end else if ( mod((j-1), columns) == 0 ) then itemButton:SetPoint("BOTTOMRIGHT", name.."Item"..(j - columns), "TOPRIGHT", 0, 4); else itemButton:SetPoint("BOTTOMRIGHT", name.."Item"..(j - 1), "BOTTOMLEFT", -5, 0); end end end for j = 1, size do index = size - (j - 1); getglobal(name.."Item"..j):SetID(100 * id + index + 100 ); item = theBag[index]; itemButton = getglobal(name.."Item"..j); if( item ) then SetItemButtonTexture(itemButton, item.T); SetItemButtonCount(itemButton, item.C); else SetItemButtonTexture(itemButton,""); SetItemButtonCount(itemButton, nil); end itemButton:Show(); end for j=size + 1, 36, 1 do getglobal(name.."Item"..j):Hide(); end frame:Show(); --PlaySound("igBackPackOpen"); end; Toggle = function () -- CharactersViewer.Bag.Toggle if(CharactersViewerConfig["Bag_Display"] == true) then CharactersViewerConfig["Bag_Display"] = false; CharactersViewer.Bag.Hide(); else CharactersViewerConfig["Bag_Display"] = true; CharactersViewer.Bag.Display(); end end; ToggleButton_OnClick = function(arg1) -- CharactersViewer.Bag.ToggleButton_OnClick if(arg1 == "LeftButton") then CharactersViewer.Bag.Toggle(); elseif(arg1 == "RightButton") then --CharactersViewer_ResetBag(); CharactersViewer.Bag.Relocate(true); end end; Relocate = function(change) -- CharactersViewer.Bag.Relocate if( change ) then if( CharactersViewerConfig["Bag_Location"] == nil ) then CharactersViewerConfig["Bag_Location"] = 0; else CharactersViewerConfig["Bag_Location"] = CharactersViewerConfig["Bag_Location"] +1; if( CharactersViewerConfig["Bag_Location"] >= 2) then CharactersViewerConfig["Bag_Location"] = 0; end end end if( CharactersViewerConfig["Bag_Location"] == 1) then -- Bag CharactersViewer_ContainerFrame0:SetPoint("TOPLEFT", "CharactersViewer_Frame", "TOPRIGHT"); CharactersViewer_ContainerFrame1:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame0", "BOTTOMLEFT" ); CharactersViewer_ContainerFrame2:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame1", "BOTTOMLEFT" ); CharactersViewer_ContainerFrame3:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame0", "TOPRIGHT"); CharactersViewer_ContainerFrame4:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame3", "BOTTOMLEFT" ); CharactersViewer_KeyringContainerFrame:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame4", "BOTTOMLEFT" ); CharactersViewer_ContainerFrame0:SetUserPlaced(); CharactersViewer_ContainerFrame1:SetUserPlaced(); CharactersViewer_ContainerFrame2:SetUserPlaced(); CharactersViewer_ContainerFrame3:SetUserPlaced(); CharactersViewer_ContainerFrame4:SetUserPlaced(); CharactersViewer_KeyringContainerFrame:SetUserPlaced(); else -- Bag CharactersViewer_ContainerFrame0:SetPoint("TOPLEFT", "CharactersViewer_Frame", "TOPRIGHT"); CharactersViewer_ContainerFrame1:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame0", "TOPRIGHT" ); CharactersViewer_ContainerFrame2:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame1", "TOPRIGHT" ); CharactersViewer_ContainerFrame3:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame0", "BOTTOMLEFT"); CharactersViewer_ContainerFrame4:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame3", "TOPRIGHT" ); CharactersViewer_KeyringContainerFrame:SetPoint("TOPLEFT", "CharactersViewer_ContainerFrame4", "TOPRIGHT"); CharactersViewer_ContainerFrame0:SetUserPlaced(); CharactersViewer_ContainerFrame1:SetUserPlaced(); CharactersViewer_ContainerFrame2:SetUserPlaced(); CharactersViewer_ContainerFrame3:SetUserPlaced(); CharactersViewer_ContainerFrame4:SetUserPlaced(); CharactersViewer_KeyringContainerFrame:SetUserPlaced(); end end; Toggle_Button_OnEnter = function() -- CharactersViewer.Bag.ToggleButton_OnEnter ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(CHARACTERSVIEWER_TOOLTIP_BAGRESET); end; }; Bank = { -- CharactersViewer.Bank Toggle = function() -- CharactersViewer.Bank.Toggle if(CharactersViewerBankFrame:IsVisible() ) then CharactersViewerConfig["Bank_Display"] = false; CharactersViewer.Bank.Close() else CharactersViewerConfig["Bank_Display"] = true; CharactersViewer.Bank.Show(); end end; Toggle_Button_OnEnter = function() -- CharactersViewer.Bag.ToggleButton_OnEnter ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(CHARACTERSVIEWER_TOOLTIP_BANKBAG); end; ToggleButton_OnClick = function(arg1) -- CharactersViewer.Bank.ToggleButton_OnClick if(arg1 == "LeftButton") then CharactersViewer.Bank.BagToggle(); elseif(arg1 == "RightButton") then ----- CharactersViewer.Bank.BagRelocate(true); end end; BagToggle = function () -- CharactersViewer.Bag.Toggle if(CharactersViewerConfig["BankBag_Display"] == true) then CharactersViewerConfig["BankBag_Display"] = false; CharactersViewer.Bank.BagHide(); else CharactersViewerConfig["BankBag_Display"] = true; CharactersViewer.Bank.BagDisplay(); end end; BagDisplay = function () -- CharactersViewer.Bank.BagDisplay if( not CharactersViewer_BankItemsContainerFrame6:IsUserPlaced() and not CharactersViewer_BankItemsContainerFrame6:IsUserPlaced() and not CharactersViewer_BankItemsContainerFrame7:IsUserPlaced() and not CharactersViewer_BankItemsContainerFrame8:IsUserPlaced() and not CharactersViewer_BankItemsContainerFrame9:IsUserPlaced() and not CharactersViewer_BankItemsContainerFrame10:IsUserPlaced()) then CharactersViewer.Bank.BagRelocate(false) end if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] ~= nil) then local index2 = 5; for index = 5,10 do getglobal("CharactersViewer_BankItemsContainerFrame" ..index ):Hide(); --- Removed Flisher 2005-05-29 bagFrame:Hide(); if(CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][index]) then CharactersViewer.Bag.Draw(index, index2, "bankbag"); index2 = index2 + 1; end end end end; BagHide = function() -- CharactersViewer.Bank.BagHide for index = 5,10 do bagFrame = getglobal("CharactersViewer_BankItemsContainerFrame" ..index ):Hide(); end end; Close = function() -- CharactersViewer.Bank.Close CharactersViewerBankFrame:Hide(); end; Show = function () -- CharactersViewer.Bank.Show CharactersViewerBankFrame:Hide(); if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] ) then if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Money"] ) then --MoneyFrame_Update("CharactersViewerBankItems_MoneyFrame", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Money"]); temp1 = CharactersViewer.library.MoneyTotal(1); temp2 = CharactersViewer.library.MoneyTotal(2); MoneyFrame_Update("CharactersViewerBankItems_MoneyFrameTotal1", temp1); MoneyFrame_Update("CharactersViewerBankItems_MoneyFrameTotal2", temp2); MoneyFrame_Update("CharactersViewerBankItems_MoneyFrameTotal3", temp1 + temp2); if ( temp1 <= 0 ) then CharactersViewerBankMoney1:Hide(); else CharactersViewerBankMoney1:Show(); end if ( temp2 <= 0 ) then CharactersViewerBankMoney2:Hide(); else CharactersViewerBankMoney2:Show(); end end if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] ) then for slot = 1, 24 do button = getglobal("CharactersViewerBankItem_Item" .. slot); if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot] ) then SetItemButtonTexture(button, CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].T); SetItemButtonCount(button, CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].C); button:Show(); else button:Hide(); end end for bagId = 5, 10 do button = getglobal("CharactersViewerBankItems_Bag" .. bagId); if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bagId] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bagId]["T"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bagId]["size"]) then SetItemButtonTexture(button, CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bagId].T); button:Show(); else button:Hide(); end end end end ShowUIPanel(CharactersViewerBankFrame); end; OnEnter = function() -- CharactersViewer.Bank.OnEnter local count = ""; GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(CHARACTERSVIEWER_TOOLTIP_BANK); end; OnClick = function(button) -- CharactersViewer.Bank.OnClick if(arg1 == "LeftButton") then CharactersViewer.Bank.Toggle(); elseif(arg1 == "RightButton") then CharactersViewer.Bank.Relocate(true); end end; Relocate = function ( change) -- CharactersViewer.Bank.Relocate if( CharactersViewerConfig["Bank_Location"] == 1) then -- Bag CharactersViewerBankFrame:SetPoint("TOPLEFT", "CharactersViewer_Frame", "TOPRIGHT"); CharactersViewerBankFrame:SetUserPlaced(0); if( change) then CharactersViewerConfig["Bank_Location"] = 0; end else -- Bag CharactersViewerBankFrame:SetPoint("TOPLEFT", "CharactersViewer_Frame", "BOTTOMLEFT", 0 , 64); CharactersViewerBankFrame:SetUserPlaced(0); if( change ) then CharactersViewerConfig["Bank_Location"] = 1; end end end; BagRelocate = function ( change, bagID ) -- CharactersViewer.Bank.BagRelocate if( change ) then if( CharactersViewerConfig["BankBag_Location"] == nil ) then CharactersViewerConfig["BankBag_Location"] = 0; else CharactersViewerConfig["BankBag_Location"] = CharactersViewerConfig["BankBag_Location"] +1; if( CharactersViewerConfig["BankBag_Location"] >= 2) then CharactersViewerConfig["BankBag_Location"] = 0; end end end if( CharactersViewerConfig["BankBag_Location"] == 1) then -- Bag CharactersViewer_BankItemsContainerFrame5:SetPoint("TOPLEFT", "CharactersViewerBankFrame", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame6:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame5", "BOTTOMLEFT" ); CharactersViewer_BankItemsContainerFrame7:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame6", "BOTTOMLEFT" ); CharactersViewer_BankItemsContainerFrame8:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame5", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame9:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame8", "BOTTOMLEFT" ); CharactersViewer_BankItemsContainerFrame10:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame9", "BOTTOMLEFT" ); CharactersViewer_BankItemsContainerFrame5:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame6:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame7:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame8:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame9:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame10:SetUserPlaced(); else -- Bag CharactersViewer_BankItemsContainerFrame5:SetPoint("TOPLEFT", "CharactersViewerBankFrame", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame6:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame5", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame7:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame6", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame8:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame5", "BOTTOMLEFT" ); CharactersViewer_BankItemsContainerFrame9:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame8", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame10:SetPoint("TOPLEFT", "CharactersViewer_BankItemsContainerFrame9", "TOPRIGHT" ); CharactersViewer_BankItemsContainerFrame5:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame6:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame7:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame8:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame9:SetUserPlaced(); CharactersViewer_BankItemsContainerFrame10:SetUserPlaced(); end end; }; Note = { Guild_OnUpdate = function () local guildOffset = FauxScrollFrame_GetOffset(GuildListScrollFrame); if(GuildFrameButton1:IsVisible()) then for i=1, GUILDMEMBERS_TO_DISPLAY, 1 do local button = getglobal("CharactersViewerGuildFrameNoteButton"..i); local name = GetGuildRosterInfo(i + guildOffset); if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][name]) then button:Show(); else button:Hide(); end end end end; Guild_OnClick = function (arg1) local name = GetGuildRosterInfo(this:GetID() + FauxScrollFrame_GetOffset(GuildListScrollFrame)); if( CharactersViewer.index ~= name ) then CharactersViewer.Switch(name); CharactersViewer_Show(); else CharactersViewer_Toggle(); end end; Guild_OnEnter = function () ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); if( CharactersViewerProfile ~= nil and CharactersViewerProfile[Server] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Timestamp"] ~= nil ) then GameTooltip:SetText(BINDING_NAME_CHARACTERSVIEWER_TOGGLE .. "\n" .. CHARACTERSVIEWER_SAVEDON .. date(nil, CharactersViewerProfile[Server][CharactersViewer.index]["Timestamp"] ) ); else GameTooltip:SetText(BINDING_NAME_CHARACTERSVIEWER_TOGGLE) end end; }; -- Variables index = nil; -- is now initialised via the first data collect, which should happen before any possible call loaded = nil; -- Successful load of the script version = { db = 62; text = "1.03"; number = 103; date = "July 6th, 2006"; }; constant = { event = -- CharactersViewer.constant.event { "VARIABLES_LOADED"; "UNIT_NAME_UPDATE"; "PLAYER_GUILD_UPDATE"; "UNIT_INVENTORY_CHANGED"; "PLAYER_LEVEL_UP"; "PLAYER_PVP_RANK_CHANGED"; "CHARACTER_POINTS_CHANGED"; "MAIL_SHOW"; -- Mail "MAIL_CLOSED"; -- Mail "BANKFRAME_OPENED"; -- Bank --"BANKFRAME_CLOSED"; -- Bank "PLAYERBANKSLOTS_CHANGED"; -- Bank "PLAYERBANKBAGSLOTS_CHANGED"; -- Bank "BAG_UPDATE"; -- Bank --"PLAYER_MONEY"; -- Money }; inventorySlot = { Name = { [0] = AMMOSLOT, -- 0 [1] = HEADSLOT, -- 1 [2] = NECKSLOT, -- 2 [3] = SHOULDERSLOT, -- 3 [4] = SHIRTSLOT, -- 4 [5] = CHESTSLOT, -- 5 [6] = WAISTSLOT, -- 6 [7] = LEGSSLOT, -- 7 [8] = FEETSLOT, -- 8 [9] = WRISTSLOT, -- 9 [10] = HANDSSLOT, -- 10 [11] = FINGER0SLOT, -- 11 [12] = FINGER1SLOT, -- 12 [13] = TRINKET0SLOT, -- 13 [14] = TRINKET1SLOT, -- 14 [15] = BACKSLOT, -- 15 [16] = MAINHANDSLOT, -- 16 [17] = SECONDARYHANDSLOT, -- 17 [18] = RANGEDSLOT, -- 18 [19] = TABARDSLOT, -- 19 }; Texture = { [0] = ({GetInventorySlotInfo("AMMOSLOT")})[2], -- 0 [1] = ({GetInventorySlotInfo("HEADSLOT")})[2], -- 1 [2] = ({GetInventorySlotInfo("NECKSLOT")})[2], -- 2 [3] = ({GetInventorySlotInfo("SHOULDERSLOT")})[2], -- 3 [4] = ({GetInventorySlotInfo("SHIRTSLOT")})[2], -- 4 [5] = ({GetInventorySlotInfo("CHESTSLOT")})[2], -- 5 [6] = ({GetInventorySlotInfo("WAISTSLOT")})[2], -- 6 [7] = ({GetInventorySlotInfo("LEGSSLOT")})[2], -- 7 [8] = ({GetInventorySlotInfo("FEETSLOT")})[2], -- 8 [9] = ({GetInventorySlotInfo("WRISTSLOT")})[2], -- 9 [10] = ({GetInventorySlotInfo("HANDSSLOT")})[2], -- 10 [11] = ({GetInventorySlotInfo("FINGER0SLOT")})[2], -- 11 [12] = ({GetInventorySlotInfo("FINGER1SLOT")})[2], -- 12 [13] = ({GetInventorySlotInfo("TRINKET0SLOT")})[2], -- 13 [14] = ({GetInventorySlotInfo("TRINKET1SLOT")})[2], -- 14 [15] = ({GetInventorySlotInfo("BACKSLOT")})[2], -- 15 [16] = ({GetInventorySlotInfo("MAINHANDSLOT")})[2], -- 16 [17] = ({GetInventorySlotInfo("SECONDARYHANDSLOT")})[2], -- 17 [18] = ({GetInventorySlotInfo("RANGEDSLOT")})[2], -- 18 [19] = ({GetInventorySlotInfo("TABARDSLOT")})[2], -- 19 } }; }; config = { }; status = { register = {}; -- Known status to be inserted by the code lather -- loaded (meaning the initial load/initialisation is done) -- collected (true = that the system collected data at least once }; debug = { -- Added as I can use many debug flag for developpement - Flisher 2006-06-16 }; }; -- End of CharactersViewer Object -- OnFoo functions function CharactersViewer_OnEvent(event, arg1) -- Cleaned by Flisher 2005-05-31 if(event == "VARIABLES_LOADED" and not CharactersViewer.status.loaded) then -- Set the Loaded Status to true, to ensure it's not runned twice, we never know with blizzard... CharactersViewer.status.loaded = true; -- Configure the panel display and title tinsert(UISpecialFrames, "CharactersViewer_Frame"); UIPanelWindows["CharactersViewer_Frame"] = nil; CharactersViewer_Frame:RegisterForDrag("LeftButton"); tinsert(UISpecialFrames, "CharactersViewerBankFrame"); UIPanelWindows["CharactersViewerBankFrame"] = nil; --CharactersViewer_Frame:RegisterForDrag("LeftButton"); --UIPanelWindows["CharactersViewerBankFrame"] = { area = "up", pushable = 6 }; CharactersViewer_FrameTitleText:SetText("CharactersViewer " .. CharactersViewer.version.text .. " by Flisher"); -- Hooked function CharactersViewer.register.hook(); -- Database version checkup, clean the data if the database version is obsolete if(CharactersViewer.db.validate() == false) then CharactersViewer.db.init(); end end -- Escape if we can't properly initialize, gotta be checked after 1.5.0 patch, not trigered on loading, but sometime trigered on mail retrieval if( ( event == "UNIT_INVENTORY_CHANGED" and arg1 ~= "player" ) or not UnitName("player") or UnitName("player") == UNKNOWNOBJECT or UnitName("player") == UKNOWNBEING or not Server) then return; end if(event == "MAIL_SHOW" or event == "MAIL_CLOSED") then if(CharactersViewerProfile and CharactersViewerProfile[Server]and CharactersViewerProfile[Server][UnitName("player")]and CharactersViewerProfile[Server][UnitName("player")]["Data"] ) then CharactersViewerProfile[Server][UnitName("player")]["Data"]["Mail"] = CharactersViewer.collect.mail(true); end elseif( event == "BANKFRAME_OPENED" or event == "BANKFRAME_CLOSED" or event == "PLAYERBANKSLOTS_CHANGED" or event == "PLAYERBANKBAGSLOTS_CHANGED" ) then CharactersViewer.collect.bank.SaveItems(); return; elseif( event == "BAG_UPDATE" and BankFrame:IsVisible() ) then if( tonumber(arg1) and tonumber(arg1) > 4 and tonumber(arg1) <= 10 ) then CharactersViewer.collect.bank.SaveItems(); -- Populate all bank / bank bags... end return; else CharactersViewer.collect.all(); end return; end function CharactersViewerItemButton_OnEnter() -- Cleaned by Flisher 2005-05-31 local link, text, itemCount; -- Detecting if it's from the inventory or equipment if(this:GetID() < 100 and this:GetID() > 0) then -- Equiped item link if(CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()]) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()].L ; if(CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()].C) then itemCount = CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()].C; end else text = CharactersViewer.constant.inventorySlot.Name[this:GetID()]; end elseif(this:GetID() > 2000 and this:GetID() < 2100) then local slot = this:GetID() - 2000; if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot] ) then if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L ) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L; if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].C ) then itemCount = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].C; end end else text = EMPTY; end elseif ( (this:GetID() >= 100 and this:GetID() < 600) or (this:GetID() >= -100 and this:GetID() < -80 ) ) then -- Inventory item link local slot = math.mod( abs(this:GetID() +100), 100); local bag = (this:GetID() - slot - 100) / 100; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].C) then itemCount = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].C; end else text = EMPTY; end elseif(this:GetID() >= 600 and this:GetID() < 1200) then -- Inventory item link local slot = math.mod(this:GetID(), 100); local bag = (this:GetID() - slot - 100) / 100; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].C) then itemCount = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].C; end else text = EMPTY; end end ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); if(link) then if( GetItemInfo(link) ) then GameTooltip:SetHyperlink(link); else GameTooltip:SetText(CHARACTERSVIEWER_NOT_CACHED); end else GameTooltip:SetText(text); end -- Book of Crafts inter-operability (http://www.curse-gaming.com/mod.php?addid=1397) if(BookOfCrafts_UpdateGameToolTips and link) then BookOfCrafts_UpdateGameToolTips(); end -- Receipe Book inter-operability (http://www.curse-gaming.com/mod.php?addid=914) if( RecipeBook_DoHookedFunction and link) then RecipeBook_DoHookedFunction(); end --Auctioneer inter-operability (http://www.curse-gaming.com/mod.php?addid=146) if(TT_TooltipCall and link) then local name,_,quality = GetItemInfo(link); if(name) then if(not itemCount) then itemCount = 1; end TT_Clear(); TT_TooltipCall(GameTooltip, name, CharactersViewer.library.MakeLink(link), quality, itemCount); TT_Show(GameTooltip); end end end function CharactersViewer_Tooltip_SetInventoryItem(tooltip, slotid) -- Cleaned by Flisher 2005-05-31 local link, text; --! if(not CharactersViewer.index) then --! CharactersViewer.Switch(); --! end if( CharactersViewer.index ~= UnitName("player") ) then -- Detecting if it's from the inventory or equipment if( slotid < 100 and slotid > 0) then -- Equiped item link if( CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][slotid] ) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][slotid].L ; else text = CharactersViewer.constant.inventorySlot.Name[slotid]; end elseif(slotid > 2000 and slotid < 2100) then local slot = slotid - 2000; if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot] ) then if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L ) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L; end else text = EMPTY; end elseif ( ( slotid >= 100 and slotid < 600) or (slotid >= -100 and slotid < -80 ) ) then -- Inventory item link local slot = math.mod( abs(slotid+100), 100); local bag = (slotid - slot - 100) / 100; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L; else text = EMPTY; end elseif( slotid >= 600 and slotid < 1200) then -- Inventory item link local slot = math.mod(slotid, 100); local bag = (slotid - slot - 100) / 100; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot]and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L; else text = EMPTY; end end if(link) then if( GetItemInfo(link) ) then tooltip:SetHyperlink(link); if(UnitName("player") ~= CharactersViewer.index) then tooltip:AddLine(CharactersViewer.index .. " " .. INVENTORY_TOOLTIP); tooltip:Show(); else tooltip:Show(); end else tooltip:SetText(CHARACTERSVIEWER_NOT_CACHED); end end else -- if the player requested is the logged one, use the original game tooltip tooltip:SetInventoryItem("player", slotid); tooltip:Show(); end end function CharactersViewerItemButton_OnClick(arg1) -- Cleaned by Flisher 2005-05-31 local link, item; -- Detecting if it's from the inventory or equipment if(this:GetID() < 100 and this:GetID() > 0 ) then -- Equiped item link if(CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()]) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"][this:GetID()].L; end elseif(this:GetID() > 2000 and this:GetID() < 2100) then local slot = this:GetID() - 2000; if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot] ) then if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L ) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"]["Main"][slot].L; end end elseif ( ( this:GetID() >= 100 and this:GetID() < 600) or (this:GetID() >= -100 and this:GetID() < -80 ) ) then -- Inventory item link local slot = math.mod( abs(this:GetID()+100), 100); local bag = (this:GetID() - slot - 100) / 100; if(CharactersViewerProfile[Server][CharactersViewer.index]["Bag"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bag"][bag][slot].L; end elseif( this:GetID() >= 600 and this:GetID() < 1200) then -- Inventory item link local slot = math.mod(this:GetID(), 100); local bag = (this:GetID() - slot - 100) / 100; if ( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L ) then link = CharactersViewerProfile[Server][CharactersViewer.index]["Bank"][bag][slot].L; end end link = CharactersViewer.library.MakeLink(link); if(IsShiftKeyDown() and ChatFrameEditBox:IsVisible() and link and arg1 == "LeftButton") then ChatFrameEditBox:Insert(link); end if( arg1 == "LeftButton" and IsControlKeyDown() ) then DressUpItemLink(link); end -- Component interaction, http://www.curse-gaming.com/mod.php?addid=1256, added by Flisher 2005-06-16 --! CharactersViewerItemButton_OnClick must be kept in backtracking ability CharactersViewer.button.onclick(); if(Comp_TestOnClick and Comp_TestOnClick() and link) then return Comp_OnClick(arg1, link); end end function CharactersViewerMagicResistanceFrame_OnEnter() -- Checked by Flisher 2005-05-31 ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(TEXT(getglobal("RESISTANCE"..this:GetID().."_NAME"))); end function CharactersViewerDropDown_OnEnter() -- Checked by Flisher 2005-05-31 ShowUIPanel(GameTooltip); GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(CHARACTERSVIEWER_TOOLTIP_DROPDOWN2); end function CharactersViewer_Show() CharactersViewer.Hide(); local temp; if(CharactersViewer.index == UnitName("player")) then CharactersViewer.collect.all(); end -- Character Name and location if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]) then -- "Name (Zone / SubZone)" temp = CharactersViewer.index; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Location"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Location"]["Zone"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Location"]["SubZone"] ~= nil ) then temp = temp .. " (" .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Location"]["Zone"] .. " - " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Location"]["SubZone"] .. ")"; end CharactersViewer_FrameTopText1:SetText(temp); -- Character Honor Rank, Level, Race and Class temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["Level"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["Class"] ~= nil ) then temp = temp .. "Level " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["Level"] .. " " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["Class"]; end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Honor"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Honor"]["rankNumber"] ~= nil and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Honor"]["rankName"] ~= nil) then temp = temp .. " (Rank " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Honor"]["rankNumber"] .. ", " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Honor"]["rankName"] .. ")"; end CharactersViewer_FrameTopText2:SetText(temp); -- Guild Rank and Name display initialisation temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Guild"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Guild"]["GuildName"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Guild"]["Title"] ) then temp = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Guild"]["Title"] .. " of " .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Guild"]["GuildName"]; end CharactersViewer_FrameTopText3:SetText(temp); -- Characters stats (str agi spirit intel stam...) temp = { "", "", "", "", ""}; if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Stats"]) then for index = 1, 5 do if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Stats"][index]) then local j = 0, stat, effectiveStat, posBuff, negBuff; for w in string.gfind(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Stats"][index], "%d+") do j = j + 1; if(j == 1) then stat = w; elseif(j == 2) then effectiveStat = w; elseif(j == 3) then posBuff = w; elseif(j == 4) then negBuff = w; end end end temp[index] = effectiveStat; end end for index = 1, 5 do getglobal("CharactersViewer_FrameStatsTitle"..index):SetText(TEXT(getglobal("SPELL_STAT"..(index-1).."_NAME"))..":"); getglobal("CharactersViewer_FrameStatsText"..index):SetText(temp[index]); end if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]) then -- Initialise the armor display temp = ""; if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Armor"]) then local j =0, stat, effectiveStat, posBuff, negBuff; for w in string.gfind(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Armor"], "%d+") do j = j + 1; if(j == 1) then stat = w; elseif(j == 2) then effectiveStat = w; elseif(j == 3) then posBuff = w; elseif(j == 4) then negBuff = w; end temp = effectiveStat; end end CharactersViewer_FrameStatsTitle6:SetText(ARMOR_COLON); CharactersViewer_FrameStatsText6:SetText(temp); -- Initialise the Health display temp = ""; if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Health"]) then temp = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Health"]; end CharactersViewer_FrameDetailTitle1:SetText(HEALTH_COLON); CharactersViewer_FrameDetailText1:SetText(temp); -- Initialise the mana display temp = ""; if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Mana"]) then temp = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Basic"]["Mana"]; end CharactersViewer_FrameDetailTitle2:SetText(MANA_COLON); CharactersViewer_FrameDetailText2:SetText(temp); end -- Initialize the combats stats (crit, parry, dodge, block...) if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]) then temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["C"] ) then temp = string.format("%01.2f%%", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["C"] ); end CharactersViewer_FrameDetailTitle3:SetText(CHARACTERSVIEWER_CRIT ..":"); CharactersViewer_FrameDetailText3:SetText(temp); temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["D"] ) then temp = string.format("%01.2f%%", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["D"] ); end CharactersViewer_FrameDetailTitle4:SetText(DODGE ..":"); CharactersViewer_FrameDetailText4:SetText(temp); if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["B"] ) then CharactersViewer_FrameDetailTitle5:SetText(BLOCK ..":"); CharactersViewer_FrameDetailText5:SetText( string.format("%01.2f%%", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["B"] )); end CharactersViewer_FrameDetailTitle5:SetText(""); CharactersViewer_FrameDetailText5:SetText(""); if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["P"] ) then CharactersViewer_FrameDetailTitle6:SetText(PARRY ..":"); CharactersViewer_FrameDetailText6:SetText( string.format("%01.2f%%", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["CombatStats"]["P"] )); else CharactersViewer_FrameDetailTitle6:SetText(""); CharactersViewer_FrameDetailText6:SetText(""); end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"] ) then temp = CharactersViewer.library.CalcRestedXP( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"] ); if( temp and temp.levelratio ~= nil) then temp = temp.levelratio .. " " .. LEVEL .. " " .. CHARACTERSVIEWER_RESTED; else temp = ""; end CharactersViewer_FrameDetailTitle7:SetText(XP .. ":"); CharactersViewer_FrameDetailText7:SetText(temp); temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"]["current"] ) then temp = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"]["current"]; else temp = "??"; end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"]["max"] ) then temp = temp .. "/" .. CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"]["max"]; else temp = temp .. "/??"; end CharactersViewer_FrameDetailTitle8:SetText(""); CharactersViewer_FrameDetailText8:SetText(temp); if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["xp"]["resting"] ) then CharactersViewer_RestedFrame:Show(); else CharactersViewer_RestedFrame:Hide(); end end if( CharactersViewerProfile[Server][CharactersViewer.index]["Timestamp"] ~= nil) then CharactersViewer_FrameDetailTitle0:SetText(CHARACTERSVIEWER_SAVEDON); CharactersViewer_FrameDetailText0:SetText( date(nil, CharactersViewerProfile[Server][CharactersViewer.index]["Timestamp"]) ); end else CharactersViewer_FrameDetailTitle3:SetText(""); CharactersViewer_FrameDetailText3:SetText(""); CharactersViewer_FrameDetailTitle4:SetText(""); CharactersViewer_FrameDetailText4:SetText(""); CharactersViewer_FrameDetailTitle5:SetText(""); CharactersViewer_FrameDetailText5:SetText(""); CharactersViewer_FrameDetailTitle6:SetText(""); CharactersViewer_FrameDetailText6:SetText(""); CharactersViewer_FrameDetailTitle7:SetText(""); CharactersViewer_FrameDetailText7:SetText(""); CharactersViewer_FrameDetailTitle8:SetText(""); CharactersViewer_FrameDetailText8:SetText(""); CharactersViewer_FrameDetailTitle0:SetText(""); CharactersViewer_FrameDetailText0:SetText(""); CharactersViewer_RestedFrame:Hide(); CharactersViewer_MailFrame:Hide(); CharactersViewer_MoneyFrame:Hide(); end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Resists"]) then -- Initialise the various resistance display for index = 2, 6 do temp = ""; if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Resists"][index] ) then temp = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Resists"][index]; end getglobal("CharactersViewerMagicResText"..index):SetText(temp); end else for index = 2, 6 do getglobal("CharactersViewerMagicResText"..index):SetText("x"); end end if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Money"]) then MoneyFrame_Update("CharactersViewer_MoneyFrame", CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Money"]); else MoneyFrame_Update("CharactersViewer_MoneyFrame", 0 ); CharactersViewer_MoneyFrame:Hide(); end if(MailTo_InFrame and MailTo_Mail and MailTo_Mail[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Type"] == "Self") then --if Inbox is already open, switch inbox to the current character if(MailTo_InFrame:IsVisible() ) then MailTo_inbox(CharactersViewer.index); end -- Count current know mail in the inbox local count = 0; for anything in MailTo_Mail[Server][CharactersViewer.index] do count = count + 1; end -- If there is 1 or more mail in inbox, or if mailflag is true, then display the icon with knwon mail. if( count > 1 or (CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Mail"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Mail"]["HasNewMail"])) then SetItemButtonCount(getglobal("CharactersViewer_MailFrame"), count); CharactersViewer_MailFrame:Show(); else CharactersViewer_MailFrame:Hide(); end elseif( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Mail"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Mail"]["HasNewMail"]) then SetItemButtonCount(getglobal("CharactersViewer_MailFrame"), 0); CharactersViewer_MailFrame:Show(); else CharactersViewer_MailFrame:Hide(); end end local index, item, button, texture; for index = 1, 19 do button = getglobal("CharactersViewer_FrameItem"..index); texture = getglobal("CharactersViewer_FrameItem"..index.."IconTexture"); texture2 = CharactersViewer.constant.inventorySlot.Texture[index]; texture:SetTexture(texture2); SetItemButtonCount(button, 0); end for index, item in CharactersViewerProfile[Server][CharactersViewer.index]["Equipment"] do button = getglobal("CharactersViewer_FrameItem"..index); texture = getglobal("CharactersViewer_FrameItem"..index.."IconTexture"); texture:SetTexture(item.T); SetItemButtonCount(button, item.C); end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["SexId"] and CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["RaceEn"]) then local temprace, tempsex; if(CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["RaceEn"] == "Night Elf") then temprace = "NightElf"; else temprace = CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["RaceEn"]; end if( CharactersViewerProfile[Server][CharactersViewer.index]["Data"]["Id"]["SexId"] == 0) then tempsex = "Male"; else tempsex = "Female"; end temp = "Interface\\CharacterFrame\\TemporaryPortrait-" .. tempsex .. "-" .. temprace; else temp = "Interface\\CharacterFrame\\TempPortrait"; end CharactersViewer_PortraitTexure:SetTexture(temp); if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bag"] ) then CharactersViewer_Bag_Toggle_Button:Enable(); else CharactersViewer_Bag_Toggle_Button:Disable(); end if( CharactersViewerProfile and CharactersViewerProfile[Server] and CharactersViewerProfile[Server][CharactersViewer.index] and CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] ) then CharactersViewer_BankToggle:Show(); if( CharactersViewerConfig["Bank_Display"] ) then CharactersViewer.Bank.Show(); else CharactersViewer.Bank.Close(); end else CharactersViewer_BankToggle:Hide(); CharactersViewer.Bank.Close(); end ShowUIPanel(CharactersViewer_Frame); -- bag if( not CharactersViewer_ContainerFrame0:IsUserPlaced() and not CharactersViewer_ContainerFrame1:IsUserPlaced() and not CharactersViewer_ContainerFrame2:IsUserPlaced() and not CharactersViewer_ContainerFrame3:IsUserPlaced() and not CharactersViewer_ContainerFrame4:IsUserPlaced() and not CharactersViewer_KeyringContainerFrame:IsUserPlaced()) then CharactersViewer.Bag.Relocate(false) end if( CharactersViewerProfile[Server][CharactersViewer.index]["Bag"] ) then if(CharactersViewerConfig["Bag_Display"] == true) then CharactersViewer.Bag.Display(); else CharactersViewer.Bag.Hide(); end else CharactersViewer.Bag.Hide(); end if( CharactersViewerProfile[Server][CharactersViewer.index]["Bank"] ) then if(CharactersViewerConfig["BankBag_Display"] == true ) then CharactersViewer.Bank.BagDisplay(); else CharactersViewer.Bank.BagHide(); end else CharactersViewer.Bank.BagHide(); end end function CharactersViewerDropDown_OnLoad() -- Checked by Flisher 2005-05-31 --! enable/disable checkup on this UIDropDownMenu_Initialize(this, CharactersViewerDropDown_Initialize); UIDropDownMenu_SetText(CHARACTERSVIEWER_SELPLAYER, this); UIDropDownMenu_SetWidth(80, this); end function CharactersViewerDropDown_OnClick() CharactersViewer.Switch(this.value); CharactersViewer_Show(); end function CharactersViewerDropDown_Initialize() local info = {}; for index, item in CharactersViewerProfile[Server] do if(CharactersViewerProfile[Server][index]["Type"] == "Self") then local realm, player; info.text = index; info.value = index; info.func = CharactersViewerDropDown_OnClick; info.notCheckable = nil; info.keepShownOnClick = nil; UIDropDownMenu_AddButton(info); end end; end function CharactersViewer_PaperDoll_Dropdown2_Toggle() --! enable button on/off local count = 0; for anything in CharactersViewerProfile[Server] do count = count + 1; end if( count > 1 ) then getglobal("CharactersViewerDropDown2"):Show(); getglobal("CharactersViewerDropDown3"):Show(); else getglobal("CharactersViewerDropDown2"):Hide(); getglobal("CharactersViewerDropDown3"):Hide(); end end -- Backward / inter-addons compatibility -- Called By EquipCompare, soon to be removed, modified to fit with my new code - Flisher 2005-05-16 function CharactersViewerGetBSIIndex(forceRecreate) if(forceRecreate or not CharactersViewerCurrentIndex) then CharactersViewer.Switch(); end return CharactersViewer.index ; -- same as returning CharactersViewerCurrentIndex end -- this one is also for Equipcompare interoperability: CHARACTERSVIEWER_VERSION = CharactersViewer.version.number; CharactersViewerCurrentIndex = nil -- Not local so someone can hook to it function CharactersViewer_Toggle() -- Changed by Flisher 2005-06-12 CharactersViewer.Toggle(); end local function Used(bag,nr) used = 0; for i = 1,nr do if(bag[i] and bag[i].L) then used = used+1; end end return used end function CharactersViewer_Bags(arg) if(not CharactersViewerProfile) then return; end local CV = CharactersViewerProfile[Server] if(not CV) then return; end local use = arg=='use' print(CHARACTERSVIEWER_BAG_USE..Server) local text,list,total,bag,tused,used for name,data in CV do if(data.Type=='Self') then list,total,tused = '',0,0 for ix,bag in data.Bag do if(list~='') then list = list..'+'; end if(use) then used = Used(bag,bag.size) list = list..used..'/' tused = tused+used end list = list..bag.size total = total+bag.size end tused = use and tused..'/' or '' text = format("%s: %s=%s%d",name,list,tused,total) list,total,tused = '24',24,0; if(data.Bank) then if(use) then used = Used(data.Bank.Main,24) list = used..'/24' tused = used end for ix,bag in data.Bank do if type(bag)=='table' then if(ix~='Main') then if(use) then used = Used(bag,bag.size) list = format("%s+%d/%d",list,used,bag.size) tused = tused+used else list = list..'+'..bag.size; end total = total+bag.size end end end tused = use and tused..'/' or '' text = format("%s, Bank: %s=%s%d",text,list,tused,total) end print(text) end end end