--[[
CensusPlus for World of Warcraft(tm).
Copyright 2005 - 2006 Cooper Sellers and WarcraftRealms.com
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GLP.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
]]
CensusPlus_DoThisCharacter = false;
CensusPlus_Profile = {};
CensusPlus_Profile[GetCVar("realmName")] = {} ;
local myCPProfile_LOADED = nil; -- Successful load of the script
-- //////////////////////////////////////////////
-- Configuration Variables
-- //////////////////////////////////////////////
-- set to nil to disable any of the following
myCPProfile_ENABLED = 0; -- Enable the profiler?
local myCPProfile_DoScanInventory = 0; -- get inventory?
local myCPProfile_DoScanBank = 0; -- get bank?
local myCPProfile_DoScanEquipment = 0; -- get equipment?
local myCPProfile_DoScanSkills = 0; -- get skills?
local myCPProfile_DoScanTalents = 0; -- get talents?
local myCPProfile_DoScanProfessions = 0; -- output known tradeskill recipies
local myCPProfile_DoScanReputation = 0; -- get reputation?
local myCPProfile_DoScanQuestLog = 0; -- get quests?
local myCPProfile_DoScanHonor = 0; -- get honor?
local myCPProfile_HTML_Tooltips = 1; -- make html tooltips (non-array format) - separate lines with
local myCPProfile_TALENTS_Full = 1; -- output all talents and tooltips
local myCPProfile_DEBUG = 1; -- enable debugging? unused at this time
local myCPProfile_ALLEVENTS = nil; -- enable all event catching? for debugging only
-- //////////////////////////////////////////////
local TradeSkillDifficultyCode = {};
TradeSkillDifficultyCode['optimal'] = 4;
TradeSkillDifficultyCode['medium'] = 3;
TradeSkillDifficultyCode['easy'] = 2;
TradeSkillDifficultyCode['trivial'] = 1;
TradeSkillDifficultyCode['header'] = 0;
local myCPProfile_VERSION = "1.0.0"; -- this only changes when a new variable is added to the output
local timePlayed = -1;
local timeLevelPlayed = -1;
-- array of inventory slot names
local Profile_slots = {
"Head", -- 1
"Neck", -- 2
"Shoulder", -- 3
"Shirt", -- 4
"Chest", -- 5
"Waist", -- 6
"Legs", -- 7
"Feet", -- 8
"Wrist", -- 9
"Hands", -- 10
"Finger0", -- 11
"Finger1", -- 12
"Trinket0", -- 13
"Trinket1", -- 14
"Back", -- 15
"MainHand", -- 16
"SecondaryHand", -- 17
"Ranged", -- 18
"Tabard", -- 19
};
function CP_ProfileFrame_OnLoad()
-- Shut it down for now
if( true ) then
return;
end
this:RegisterEvent("VARIABLES_LOADED");
if ( myCPProfile_ALLEVENTS ) then -- unused, but keep for testing
this:RegisterEvent("PLAYER_GUILD_UPDATE");
this:RegisterEvent("UNIT_INVENTORY_CHANGED");
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("TRAINER_CLOSED");
this:RegisterEvent("PLAYER_LEVEL_UP");
end
this:RegisterEvent("TIME_PLAYED_MSG");
this:RegisterEvent("BANKFRAME_CLOSED"); -- 12/17, was OPENED, will it work with closed only?
this:RegisterEvent("TRADE_SKILL_SHOW");
this:RegisterEvent("CRAFT_SHOW");
end
-- since PLAYER_QUITTING and PLAYER_CAMPING events don't work, hook the functions
-- NOTE: Due to server lag, this could be a cause of the client not actually logging the character out until the server catches up
--[[
oldLogout = Logout;
oldQuit = Quit;
function Quit()
RequestTimePlayed();
oldQuit();
end
function Logout()
RequestTimePlayed();
oldLogout();
end
]]--
function CP_ProfileFrame_OnEvent(event, arg1, arg2)
-- crapout if we're not ready to process, or if not enabled
if ( ( event == "UNIT_INVENTORY_CHANGED" and arg1 ~= "player" ) or not myCPProfile_ENABLED or not UnitName("player") or UnitName("player") == UNKNOWNOBJECT or not GetCVar("realmName") or not CensusPlus_DoThisCharacter ) then
return;
end
-- CensusPlus_Msg( "PROF TEST : " .. event );
-- Got a unit name, now we're loaded
if (event == "VARIABLES_LOADED" and not myCPProfile_LOADED) then
myCPProfile_LOADED = 1;
PaperDollFrame_SetDamage();
PaperDollFrame_SetRangedDamage();
elseif (event == "VARIABLES_LOADED" and myCPProfile_LOADED) then
return;
end
if (event == "TIME_PLAYED_MSG") then
timePlayed = arg1;
timeLevelPlayed = arg2;
end
-- Event hit, process profile
if (myCPProfile_LOADED) then
Profile_InitProfile(); -- Always do this first, creates a profile is it doesn't exist
if( ( event == "BANKFRAME_CLOSED" or event == "BANKFRAME_OPENED" or event == "PLAYERBANKSLOTS_CHANGED" ) and myCPProfile_DoScanBank ) then
Profile_ScanBank();
CP_ProfHidden:ClearLines();
CP_ProfHidden:Hide();
return;
end
if ( not myCPProfile_DoScanBank and CensusPlus_Profile[GetCVar("realmName")][UnitName("player")] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"] = nil;
end
if ( myCPProfile_DoScanProfessions ) then
if ( event == "TRADE_SKILL_SHOW" ) then
Profile_ScanTradeSkill();
CP_ProfHidden:ClearLines();
CP_ProfHidden:Hide();
return;
end
if ( event == "CRAFT_SHOW" ) then
Profile_ScanCraft();
CP_ProfHidden:ClearLines();
CP_ProfHidden:Hide();
return;
end
elseif ( CensusPlus_Profile[GetCVar("realmName")][UnitName("player")] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] = nil;
end
CP_ProfHidden:ClearLines();
CP_ProfHidden:Hide();
end
end
function Profile_InitProfile()
if ( not CensusPlus_Profile ) then
CensusPlus_Profile = {};
end
if ( not CensusPlus_Profile[GetCVar("realmName")] ) then
CensusPlus_Profile[GetCVar("realmName")] = {};
end
if ( not CensusPlus_Profile[GetCVar("realmName")][UnitName("player")] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")] = {};
else
local tmpBank = CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"];
local tmpProfessions = CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"];
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"] = tmpBank;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] = tmpProfessions;
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["ProfilerVersion"] = myCPProfile_VERSION; -- keep track of version and don't work with old data
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Name"] = playerName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["DateUpdated"] = date();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["TimePlayed"] = timePlayed;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["TimeLevelPlayed"] = timeLevelPlayed;
local sex = "";
if (UnitSex("player") == 0) then
sex = "Male";
else
sex = "Female";
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Sex"] = sex;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Race"] = UnitRace("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Class"] = UnitClass("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Level"] = UnitLevel("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Guild"] = {} ;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Guild"]["GuildName"], CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Guild"]["Title"], CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Guild"]["Rank"] = GetGuildInfo("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Server"] = GetCVar("realmName");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["TalentPoints"] = UnitCharacterPoints("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Zone"] = GetZoneText();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["SubZone"] = GetSubZoneText();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Experience"] = UnitXP("player") .. ":" .. UnitXPMax("player");
local money = GetMoney();
local gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD));
local silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
local copper = mod(money, COPPER_PER_SILVER);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Money"] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Money"]["Gold"] = gold;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Money"]["Silver"] = silver;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Money"]["Copper"] = copper;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"] = {};
-- "stat" is the same as effectiveStat...
-- problem here is if they have a debuff spell on, the values saved will be wrong
local stat, effectiveStat, posBuff, negBuff = UnitStat("player", 1);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"]["Strength"] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff;
stat, effectiveStat, posBuff, negBuff = UnitStat("player", 2);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"]["Agility"] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff;
stat, effectiveStat, posBuff, negBuff = UnitStat("player", 3);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"]["Stamina"] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff;
stat, effectiveStat, posBuff, negBuff = UnitStat("player", 4);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"]["Intellect"] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff;
stat, effectiveStat, posBuff, negBuff = UnitStat("player", 5);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Stats"]["Spirit"] = (stat - posBuff - negBuff) .. ":" .. effectiveStat .. ":" .. posBuff .. ":" .. negBuff;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"] = {};
local base, resistance, positive, negative = UnitResistance("player", 6);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"]["Arcane"] = base .. ":" .. resistance .. ":" .. positive .. ":" .. negative;
base, resistance, positive, negative = UnitResistance("player", 2);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"]["Fire"] = base .. ":" .. resistance .. ":" .. positive .. ":" .. negative;
base, resistance, positive, negative = UnitResistance("player", 3);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"]["Nature"] = base .. ":" .. resistance .. ":" .. positive .. ":" .. negative;
base, resistance, positive, negative = UnitResistance("player", 4);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"]["Frost"] = base .. ":" .. resistance .. ":" .. positive .. ":" .. negative;
base, resistance, positive, negative = UnitResistance("player", 5);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Resists"]["Shadow"] = base .. ":" .. resistance .. ":" .. positive .. ":" .. negative;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Mana"] = UnitManaMax("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Health"] = UnitHealthMax("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Defense"] = UnitDefense("player");
local baseArm, effectiveArmor, armor, positiveArm, negativeArm = UnitArmor("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Armor"] = baseArm .. ":" .. (baseArm + positiveArm) .. ":" .. positiveArm .. ":" .. negativeArm; -- if they have a debuf on, don't save it
local minDamage, maxDamage, physicalBonusPos, physicalBonusNeg, percent = UnitDamage("player");
-- local baseDamage = (minDamage + maxDamage) * 0.5;
-- local fullDamage = (baseDamage + physicalBonusPos + physicalBonusNeg) * percent;
-- local totalBonus = (fullDamage - baseDamage);
-- local displayMin = floor(minDamage + totalBonus);
-- local displayMax = ceil(maxDamage + totalBonus);
CP_ProfHidden:SetOwner(CensusPlus_ProfileFrame, "ANCHOR_CURSOR");
CP_ProfHidden:SetText(INVTYPE_WEAPONMAINHAND, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(ATTACK_SPEED_COLON, string.format("%.2f", CharacterDamageFrame.attackSpeed), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_COLON, CharacterDamageFrame.damage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_PER_SECOND, string.format("%.1f", CharacterDamageFrame.dps), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
-- Check for offhand weapon
if ( CharacterDamageFrame.offhandAttackSpeed ) then
CP_ProfHidden:AddLine("
");
CP_ProfHidden:AddLine(INVTYPE_WEAPONOFFHAND, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(ATTACK_SPEED_COLON, string.format("%.2f", CharacterDamageFrame.offhandAttackSpeed), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_COLON, CharacterDamageFrame.offhandDamage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_PER_SECOND, string.format("%.1f", CharacterDamageFrame.offhandDps), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["AttackRating"] = UnitAttackBothHands("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["DamageRange"] = floor(minDamage) .. ":" .. ceil(maxDamage);
local base, posBuff, negBuff = UnitAttackPower("player");
local effective = base + posBuff + negBuff;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["AttackPower"] = base .. ":" .. effective .. ":" .. posBuff .. ":" .. negBuff;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["DamageRangeTooltip"] = CP_Tooltipscan();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["AttackPowerTooltip"] = CharacterAttackPowerFrame.tooltipSubtext;
-- Ranged not saved if there is no ranged weapon equipped
if ( PaperDollFrame.noRanged ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"] = nil;
else
CP_ProfHidden:SetText(INVTYPE_RANGED, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(ATTACK_SPEED_COLON, string.format("%.2f", CharacterRangedDamageFrame.attackSpeed), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_COLON, CharacterRangedDamageFrame.damage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CP_ProfHidden:AddDoubleLine(DAMAGE_PER_SECOND, string.format("%.1f", CharacterRangedDamageFrame.dps), NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["AttackPowerTooltip"] = CharacterRangedAttackPowerFrame.tooltipSubtext;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["DamageRangeTooltip"] = CP_Tooltipscan();
local RangeSpeeed, RangeMinDMG,RangeMaxDMG = UnitRangedDamage("player");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["DamageRange"] = max(floor(RangeMinDMG),1) .. ":" .. max(ceil(RangeMaxDMG),1);
local base, pos, neg = UnitRangedAttackPower("player");
local effective = base + pos + neg;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["AttackPower"] = base .. ":" .. effective .. ":" .. pos .. ":" .. neg;
local base, pos, neg = UnitRangedAttack("player");
if (not neg) then neg = 0; end;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["AttackRating"] = base;
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["DodgePercent"] = strsub(GetDodgeChance(), 0, 5);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["ParryPercent"] = strsub(GetParryChance(), 0, 5);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["BlockPercent"] = strsub(GetBlockChance(), 0, 5);
local MainAC, EffAC, AC, PosAC, NegAC = UnitArmor("player");
local Level = UnitLevel("player");
local Mitigation = (EffAC)/((85 * Level)+400);
Mitigation = 100 * (Mitigation/(Mitigation + 1));
Mitigation = strsub(Mitigation, 0, 5);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["MitigationPercent"] = Mitigation;
local spellIndex = 1;
local spellName, subSpellName = GetSpellName(spellIndex,BOOKTYPE_SPELL);
local tmpStr = nil;
while spellName do
if (spellName == "Attack") then
CP_ProfHidden:SetSpell(spellIndex, BOOKTYPE_SPELL);
if( CP_Tooltipscan() ~= nil ) then
tmpStr = string.gsub(CP_Tooltipscan(), ".*
(%d?%d?%d%.%d%d?)%%.*", "%1");
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["CritPercent"] = tmpStr;
end
end
spellIndex = spellIndex + 1;
spellName,subSpellName = nil;
spellName,subSpellName = GetSpellName(spellIndex,BOOKTYPE_SPELL);
end
--[[
local speed, offhandSpeed = UnitAttackSpeed("player");
local minDamage, maxDamage, minOffHandDamage, maxOffHandDamage, physicalBonusPos, physicalBonusNeg, percent = UnitDamage("player");
local baseDamage = (minDamage + maxDamage) * 0.5;
local fullDamage = (baseDamage + physicalBonusPos + physicalBonusNeg) * percent;
local damagePerSecond = max( fullDamage, 1 ) / speed;
minDamage = max( floor( minDamage ), 1 );
maxDamage = max( ceil( maxDamage ),1 );
speed = string.format( "%.2f", speed );
damagePerSecond = string.format( "%.1f", damagePerSecond );
local damagerange = minDamage.." - "..maxDamage;
local output = INVTYPE_WEAPONMAINHAND .. "
"
.. ATTACK_SPEED_COLON .. speed .. "
"
.. DAMAGE_COLON .. damagerange .. "
"
.. DAMAGE_PER_SECOND .. damagePerSecond
if ( offhandSpeed ) then
local offhandBaseDamage = (minOffHandDamage + maxOffHandDamage) * 0.5;
local offhandFullDamage = (offhandBaseDamage + physicalBonusPos + physicalBonusNeg) * percent;
local offhandDamagePerSecond = (max(offhandFullDamage,1) / offhandSpeed);
minOffHandDamage=max(floor(minOffHandDamage),1);
maxOffHandDamage=max(ceil(maxOffHandDamage),1);
local damagerange = minOffHandDamage.." - "..maxOffHandDamage;
offhandDamagePerSecond = string.format( "%.1f", offhandDamagePerSecond );
offhandSpeed=string.format("%.2f", offhandSpeed);
output = output .. INVTYPE_WEAPONOFFHAND .. "
"
.. ATTACK_SPEED_COLON .. offhandSpeed .. "
"
.. DAMAGE_COLON .. damagerange .. "
"
.. DAMAGE_PER_SECOND .. offhandDamagePerSecond;
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Melee Attack"]["DamageRangeTooltip"] = output;
local speed, minDamage, maxDamage = UnitRangedDamage("player");
minDamage = (minDamage / percent) - physicalBonusPos - physicalBonusNeg;
maxDamage = (maxDamage / percent) - physicalBonusPos - physicalBonusNeg;
local baseDamage = (minDamage + maxDamage) * 0.5;
local fullDamage = (baseDamage + physicalBonusPos + physicalBonusNeg) * percent;
local damagePerSecond = (max(fullDamage,1) / speed);
minDamage = max(floor(minDamage),1);
maxDamage = max(ceil(maxDamage),1);
speed=string.format("%.2f", speed);
damagePerSecond=string.format("%.1f", damagePerSecond);
local damagerange = max(floor(minDamage),1).." - "..max(ceil(maxDamage),1);
output = INVTYPE_RANGED .. "
"
.. ATTACK_SPEED_COLON .. speed .. "
"
.. DAMAGE_COLON .. damagerange .. "
"
.. DAMAGE_PER_SECOND .. damagePerSecond;
local base,pos,neg=UnitRangedAttack( "player" );
if(base==0) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["DamageRangeTooltip"] = "";
else
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Ranged Attack"]["DamageRangeTooltip"] = output;
end
]]--
-- put in dps?
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Locale"] = GetLocale();
Profile_DoBuffs();
if ( myCPProfile_DoScanSkills ) then
Profile_GetSkills();
end
if ( myCPProfile_DoScanEquipment) then
Profile_UpdateInventory();
end
if ( myCPProfile_DoScanInventory ) then
Profile_ScanInventory();
end
if ( myCPProfile_DoScanTalents and UnitLevel("player") > 9 ) then
Profile_GetTalents();
end
if ( myCPProfile_DoScanReputation ) then
Profile_ScanReputation();
end
if ( myCPProfile_DoScanQuestLog ) then
Profile_ScanQuests();
end
if ( myCPProfile_DoScanHonor ) then
Profile_ScanHonor();
end
end
function Profile_ScanQuests()
local header = "Unknown";
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"] = {};
local slot = 1;
for i=1, GetNumQuestLogEntries(), 1 do
local text, level, questtag, isHeader, isCollapsed = GetQuestLogTitle(i);
if ( isHeader ) then
header = text;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"][header] = {}
else
if ( text ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"][header][slot] = {}
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"][header][slot]["Title"] = text;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"][header][slot]["Level"] = level;
if ( questtag ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Quests"][header][slot]["Tag"] = questtag;
end
end
slot = slot + 1;
end
end
end
function Profile_ScanHonor()
-- save the honor data
local lastweekHK, lastweekDK, lastweekContribution, lastweekRank = GetPVPLastWeekStats();
local lifetimeHK, lifetimeDK, lifetimeHighestRank = GetPVPLifetimeStats();
local sessionHK, sessionDK = GetPVPSessionStats();
local yesterdayHK, yesterdayDK, yesterdayContribution = GetPVPYesterdayStats();
local lifetimeRankName, lifetimeRankNumber = GetPVPRankInfo(lifetimeHighestRank);
if ( not lifetimeRankName ) then
lifetimeRankName = NONE;
end
local rankName, rankNumber = GetPVPRankInfo(UnitPVPRank("player"));
if ( not rankName ) then
rankName = NONE;
end
local rankInfo = "("..RANK.." "..rankNumber..")";
-- set icon
local rankIcon = "";
if ( rankNumber > 0 ) then
rankIcon = string.format("%s%02d","Interface\\PvPRankBadges\\PvPRank", rankNumber);
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"] = {} ;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LifetimeHighestRank"] = lifetimeHighestRank;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LifetimeRankName"] = lifetimeRankName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LifetimeHK"] = lifetimeHK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LifetimeDK"] = lifetimeDK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["SessionHK"] = sessionHK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["SessionDK"] = sessionDK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["YesterdayHK"] = yesterdayHK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["YesterdayDK"] = yesterdayDK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["YesterdayContribution"] = yesterdayContribution;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LastWeekHK"] = lastweekHK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LastWeekDK"] = lastweekDK;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LastWeekContribution"] = lastweekContribution;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["LastWeekRank"] = lastweekRank;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["RankName"] = rankName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["RankInfo"] = rankInfo;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Honor"]["RankIcon"] = rankIcon;
end
function Profile_ScanReputation() -- Originally by Leronflon, modified to fit my style =)
local count;
local name, standing, rep, atWar, canToggle, foo2, foo3, thisHeader, isHeader;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"] = {};
count = GetNumFactions();
if( count == nil ) then
return;
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"]["Count"] = count;
local Units = { };
Units[1] = 36000; -- Hated
Units[2] = 3000; -- Hostile
Units[3] = 3000; -- Unfriendly
Units[4] = 3000; -- Neutral
Units[5] = 6000; -- Friendly
Units[6] = 12000; -- Honored
Units[7] = 21000; -- Revered
Units[8] = 1000; -- Exaulted
local ReputationKey = { [0] = "Unknown", [1] = "Hated", [2] = "Hostile", [3] = "Unfriendly", [4] = "Neutral", [5] = "Friendly", [6] = "Honored", [7] = "Revered", [8] = "Exaulted" };
thisHeader = "none";
for i = 1, count do
name, description, standing, barValue, atWar, canToggle, isHeader, isCollapsed = GetFactionInfo(i);
if( name ~= nil ) then
if (atWar == nil) then
atWar = 0;
end
if (rep == nil) then
rep = 0;
end
if (standing == nil) then
standing = 0;
end
if (isHeader == nil ) then
thisHeader = name;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader] = {};
else
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name]["Standing"] = ReputationKey[standing];
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name]["AtWar"] = atWar;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name]["Value"] = round(barValue*Units[standing]).."/"..Units[standing];
-- CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name]["canToggle"] = canToggle;
-- CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Reputation"][thisHeader][name]["Order"] = i;
end
end
end
end
function Profile_GetTalents()
local numTabs = GetNumTalentTabs();
local name, iconTexture, tier, column, rank, maxRank;
local numTalents;
local tabname, texture, points, fileName;
-- Make sure the right frame is loaded
if( not CensusPlus_IsTalentLoaded() ) then
return;
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"] = {};
for x=1, numTabs do
PanelTemplates_SetTab(TalentFrame, x);
numTalents = GetNumTalents(PanelTemplates_GetSelectedTab(TalentFrame));
tabname, texture, points, fileName = GetTalentTabInfo(PanelTemplates_GetSelectedTab(TalentFrame));
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname]["PointsSpent"] = points;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname]["Background"] = "Interface\\TalentFrame\\" .. fileName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname]["Order"] = x;
for i=1, numTalents do
name, iconTexture, tier, column, rank, maxRank = GetTalentInfo(PanelTemplates_GetSelectedTab(TalentFrame), i);
if (rank > 0 or myCPProfile_TALENTS_Full) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name]["Rank"] = rank .. ":" .. maxRank;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name]["Location"] = tier .. ":" .. column;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name]["Texture"] = iconTexture;
end
if ( myCPProfile_TALENTS_Full ) then
-- double check
if ( not CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name] = {};
end
CP_ProfHidden:SetTalent(PanelTemplates_GetSelectedTab(TalentFrame), i)
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Talents"][tabname][name]["Tooltip"] = CP_Tooltipscan();
end
end
end
end
function Profile_DoBuffs()
local iIterator = 0;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Buffs"] = {};
while( GetPlayerBuffTexture( iIterator ) ) do
buffText = GetPlayerBuffTexture( iIterator);
iIterator = iIterator + 1
CP_ProfHidden:SetUnitBuff( "player", iIterator );
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Buffs"][iIterator] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Buffs"][iIterator]["Tooltip"] = CP_Tooltipscan();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Buffs"][iIterator]["Texture"] = buffText;
end
--[[
iIterator = 1;
while( UnitDebuff( "player", iIterator ) ) do
debuffTexture, debuffApplications = UnitDebuff(unitName, debuffIndex);
CP_ProfHidden:SetUnitDebuff( "player", iIterator-1 );
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Debuffs"][iIterator] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Debuffs"][iIterator]["Tooltip"] = CP_Tooltipscan();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Debuffs"][iIterator]["Texture"] = debuffTexture;
iIterator = iIterator + 1
end
]]--
end
function Profile_GetSkills()
-- Reset/Initialize
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Skills"] = {};
local skillheader = '';
local skillinfo = nil;
local rank, maxRank = 0;
local order = 1; -- order in which the headers appear
for i=1, GetNumSkillLines(), 1 do
skillinfo = fixnilempty(GetSkillLineInfo(i));
rank = skillinfo[4];
maxRank = skillinfo[7];
if(skillinfo[2] == 1) then -- if it is a header
skillheader = skillinfo[1];
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Skills"][skillheader] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Skills"][skillheader]["Order"] = order;
order = order + 1;
else
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Skills"][skillheader][skillinfo[1]] = rank .. ":" .. maxRank;
end
end
end
---------------------------------------------
-- Process Inventory
---------------------------------------------
function Profile_UpdateInventory()
local link;
local texture;
-- Reset/Initialize
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"] = {};
for index,slot in Profile_slots do
link = GetInventoryItemLink("player", index);
texture = GetInventoryItemTexture("player", 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
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot]["Item"] = item;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot]["Name"] = name;
-- Build Tooltip
--CP_ProfHidden:SetHyperlink("item:" .. item);
CP_ProfHidden:SetInventoryItem("player", index);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Equipment"][slot]["Tooltip"] = CP_Tooltipscan();
end
end
end
end
end
function Profile_ScanInventory()
local bag, bagname, link, texture, color, item, strings, str;
-- Reset/Initialize
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"] = {}
for bag = 0,4 do
if (bag == 0) then
bagname = "Backpack";
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Name"] = "Backpack";
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Item"] = "Backpack";
if ( myCPProfile_HTML_Tooltips ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Tooltip"] = "Backpack";
else
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Tooltip"] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Tooltip"][1] = "Backpack";
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Color"] = "ffffffff";
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Slots"] = 16;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Texture"] = "Interface\\Buttons\\Button-Backpack-Up";
ProcessBagItems(bag, bagname);
else
link = GetInventoryItemLink("player", (bag+19));
texture = GetInventoryItemTexture("player", (bag+19));
if( link ) then
for color, item, bagname in string.gfind(link, "|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r") do
if( color ~= nil and item ~= nil and bagname ~= nil ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag] = { };
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Item"] = item;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Name"] = bagname;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Slots"] = GetContainerNumSlots(bag);
CP_ProfHidden:SetInventoryItem("player", (bag+19))
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Tooltip"] = CP_Tooltipscan();
ProcessBagItems(bag);
end
end
end
end
end
end
function ProcessBagItems(bag)
local slot, strings, str, texture, itemCount, locked, quality, link, color, item, name;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"] = {};
for slot = 1,GetContainerNumSlots(bag) do -- loop through all slots in this bag and get items
CP_ProfHidden:SetBagItem(bag, slot);
texture, itemCount, locked, quality = GetContainerItemInfo(bag,slot);
link = GetContainerItemLink(bag, slot);
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
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Tooltip"] = CP_Tooltipscan();
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Quantity"] = itemCount;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Name"] = name;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Inventory"]["Bag" .. bag]["Contents"][slot]["Item"] = item;
end
end
end
end
end
-- From CosmosCommonFunctions.lua
-- Clears a tooltip for usage.
function ClearTooltip(TooltipNameBase)
for i=1, 15, 1 do
getglobal(TooltipNameBase.."TextLeft"..i):SetText("");
getglobal(TooltipNameBase.."TextRight"..i):SetText("");
end
end
function Profile_ScanBank()
-- Borrowed from Telo's LootLink and restructured to fit my data
local oldBank = nil;
if (CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]) then
oldBank = CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"];
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"] = {}
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"] = {}
local bag, size, slot, link;
-- First the bank container itself
size = GetContainerNumSlots(BANK_CONTAINER);
for slot = size, 1, -1 do
link = GetContainerItemLink(BANK_CONTAINER, slot);
local texture, itemCount, locked = GetContainerItemInfo(BANK_CONTAINER, slot);
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
oldBank = nil; -- When we find items, remove the oldBank variable
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Quantity"] = itemCount;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Name"] = name;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Item"] = item;
CP_ProfHidden:SetHyperlink("item:" .. item);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Contents"][slot]["Tooltip"] = CP_Tooltipscan();
end
end
end
end
-- Now the bank bags
for bag = 5, 10 do
link = GetContainerItemLink(BANK_CONTAINER, (bag+20));
texture, itemCount, locked, quality = GetContainerItemInfo(BANK_CONTAINER, (bag+20));
if( link ) then
for color, item, bagname in string.gfind(link, "|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r") do
if( color ~= nil and item ~= nil and bagname ~= nil ) then
oldBank = nil; -- When we find items, remove the oldBank variable
bagnum = bag-4;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Name"] = bagname;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Slots"] = GetContainerNumSlots(bag);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Item"] = item;
CP_ProfHidden:SetHyperlink("item:" .. item);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Tooltip"] = CP_Tooltipscan();
ProcessBankBagItems(bag, bagnum);
end
end
end
end
if ( oldBank ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"] = oldBank;
end
end
function ProcessBankBagItems(bag, bagnum)
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"] = {};
for slot = 1,GetContainerNumSlots(bag) do -- loop through all slots in this bag and get items
-- CP_ProfHidden:SetBagItem(bag, slot);
texture, itemCount, locked, quality = GetContainerItemInfo(bag,slot);
link = GetContainerItemLink(bag, slot);
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
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot] = {};
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Texture"] = texture;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Quantity"] = itemCount;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Name"] = name;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Color"] = color;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Item"] = item;
CP_ProfHidden:SetBagItem(bag, slot);
-- CP_ProfHidden:SetHyperlink("item:" .. item);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Bank"]["Bag" .. bagnum]["Contents"][slot]["Tooltip"] = CP_Tooltipscan();
end
end
end
end
end
function Profile_ScanTradeSkill()
local skillLineName, skillLineRank, skillLineMaxRank = GetTradeSkillLine();
if( (not skillLineName) or (skillLineName == "") or (skillLineName == "UNKNOWN")) then
return;
end
-- we don't bother saving the following tradeskills
if( (skillLineName == "Fishing") or (skillLineName == "Mining") or (skillLineName == "Herbalism") or (skillLineName == "Skinning") ) then
return;
end
if ( not CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] = {};
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName] = {};
-- expand the tree so we can see all the recipes
ExpandTradeSkillSubClass(0);
-- get the number of recipes and loop through each one
local numTradeSkills = GetNumTradeSkills();
local skillHeader = skillLineName;
for itemIndex=1, numTradeSkills, 1 do
if( itemIndex == nil or skillLineName==nil or skillHeader==nil ) then
return;
end
local skillText = "";
local skillName, skillDifficulty, numAvailable, isExpanded = GetTradeSkillInfo(itemIndex);
if( skillDifficulty ~= "header" and skillLineName ~= nil and skillLineName ~= "" and skillHeader ~= nil and skillHeader ~= "" and skillName ~= nil and skillName ~= "" ) then
if( not CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader] = {};
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName] = {};
local skillIcon = GetTradeSkillIcon(itemIndex);
if( not skillIcon ) then
skillIcon = "";
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Texture"] = skillIcon;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Difficulty"] = TradeSkillDifficultyCode[skillDifficulty];
CP_ProfHidden:SetTradeSkillItem(itemIndex);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Tooltip"] = CP_Tooltipscan();
local numReagents = GetTradeSkillNumReagents(itemIndex);
local reagents = '';
for reagentIndex=1, numReagents, 1 do
local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(itemIndex, reagentIndex);
if( not reagentTexture ) then
reagentTexture = "";
end
if( not reagentName ) then
reagentName = "Unknown";
end
if (reagentIndex == numReagents) then
reagents = reagents .. reagentName .. " x" .. reagentCount;
else
reagents = reagents .. reagentName .. " x" .. reagentCount .. "
";
end
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Reagents"] = reagents;
else
skillHeader = skillName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader] = {};
end
end
end
-- is this ever called?!
function Profile_ScanCraft()
local skillLineName, skillLineRank, skillLineMaxRank = GetCraftDisplaySkillLine();
if( (not skillLineName) or (skillLineName == "") or (skillLineName == "UNKNOWN")) then
return;
end
if ( not CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"] = {};
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName] = {};
-- expand the tree so we can see all the recipes
-- ExpandCraftSubClass(0);
-- get the number of recipes and loop through each one
local numCrafts = GetNumCrafts();
local skillHeader = skillLineName; -- default it, enchanting doesn't have categories?
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader] = {};
for itemIndex=1, numCrafts, 1 do
local skillText = "";
local skillName, craftSubSpellName, skillDifficulty, numAvailable, isExpanded = GetCraftInfo(itemIndex);
--Debug(skillName .. ":" .. craftSubSpellName);
if( skillDifficulty ~= "header" and skillLineName and skillLineName ~= "" and skillHeader and skillHeader ~= "" and skillName and skillName ~= "" ) then
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName] = {};
local skillIcon = GetCraftIcon(itemIndex);
if( not skillIcon ) then
skillIcon = "";
end
local description = GetCraftDescription(itemIndex);
if (description == nil) then
description = "";
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Texture"] = skillIcon;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Difficulty"] = TradeSkillDifficultyCode[skillDifficulty];
-- CP_ProfHidden:SetCraftItem(itemIndex);
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Tooltip"] = description;
--Debug(description);
local numReagents = GetCraftNumReagents(itemIndex);
local reagents = '';
for reagentIndex=1, numReagents, 1 do
local reagentName, reagentTexture, reagentCount, playerReagentCount = GetCraftReagentInfo(itemIndex, reagentIndex);
if( not reagentTexture ) then
reagentTexture = "";
end
if( not reagentName ) then
reagentName = "Unknown";
end
if (reagentIndex == numReagents) then
reagents = reagents .. reagentName .. " x" .. reagentCount;
else
reagents = reagents .. reagentName .. " x" .. reagentCount .. "
";
end
end
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader][skillName]["Reagents"] = reagents;
else
local skillHeader = skillName;
CensusPlus_Profile[GetCVar("realmName")][UnitName("player")]["Professions"][skillLineName][skillHeader] = {};
end
end
end
-- Utilities go below
-- From CosmosCommonFunctions.lua
-- Gets all lines out of a tooltip.
function CP_Tooltipscan()
--CP_ProfHidden:Show();
local TooltipNameBase = "CP_ProfHidden";
local tooltipFrame = getglobal(TooltipNameBase);
local strings = {};
local htmlstr = nil;
-- CensusPlus_Msg( "NUM LINES: " .. CP_ProfHidden:NumLines() );
for idx = 1, CP_ProfHidden:NumLines() do
local textLeft = nil;
local textRight = nil;
ttext = getglobal(TooltipNameBase.."TextLeft"..idx);
if(ttext and ttext:IsVisible() and ttext:GetText() ~= nil) then
textLeft = ttext:GetText();
end
--if( textLeft ~= nil ) then
-- CensusPlus_Msg( "LEFT TEXT: " .. textLeft );
--end
ttext = getglobal(TooltipNameBase.."TextRight"..idx);
if(ttext and ttext:IsVisible() and ttext:GetText() ~= nil) then
textRight = ttext:GetText();
end
--if( textRight ~= nil ) then
-- CensusPlus_Msg( "RIGHT TEXT: " .. textRight );
--end
if (textLeft or textRight) then
if ( textRight) then
textRight = "\t"..textRight;
else
textRight = "";
end
if ( htmlstr ~= nil ) then
htmlstr = htmlstr .. "
" .. textLeft .. textRight;
else
htmlstr = textLeft .. textRight;
end
end
end
-- CP_ProfHidden:ClearLines();
-- ClearTooltip( "CP_ProfHidden" );
return htmlstr;
end
function round(x)
if(x - math.floor(x) > 0.5) then
x = x + 0.5;
end
return math.floor(x);
end
if (not fixnilempty) then
fixnilempty = function(...)
for i=1, arg.n, 1 do
if(not arg[i]) then
arg[i] = "";
end
end
return arg;
end
end