Mercurial > wow > emfor1
diff CensusPlayerList.lua @ 0:edfa01041183
Census+ Mod :
- TLJ guild search
- searchstart at Level 1 for community events
| author | EmFor <EmFor.hg@mroe.de> |
|---|---|
| date | Tue, 30 Mar 2010 13:42:05 +0200 |
| parents | |
| children | 10c85be19b56 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CensusPlayerList.lua Tue Mar 30 13:42:05 2010 +0200 @@ -0,0 +1,296 @@ +--[[ + 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 +-- A WoW UI customization by Cooper Sellers +-- +-- +------------------------------------------------------------------------------------ + +local g_PlayerList = {}; +local g_PlayerLookupTable = {}; +local CensusPlus_NumPlayerButtons = 20; +local g_MaxNumListed = 1000; + +function CensusPlus_ShowPlayerList() + CP_PlayerListWindow:Show(); +end + +function CensusPlus_PlayerListOnShow() + + debugprofilestart(); + + local guildKey = nil; + local raceKey = nil; + local classKey = nil; + local levelKey = nil; + + + -- + -- Clear our character list + -- + CensusPlus_ClearPlayerList(); + + -- + -- Get realm and faction + -- + local realmName = g_CensusPlusLocale .. GetCVar("realmName"); + if( realmName == nil ) then + return; + end + + local factionGroup = UnitFactionGroup("player"); + if( factionGroup == nil ) then + return; + end + + + -- + -- Has the user made any selections? + -- + if (g_GuildSelected ~= nil ) then + guildKey = g_GuildSelected; + end + if (g_RaceSelected > 0) then + local thisFactionRaces = CensusPlus_GetFactionRaces(factionGroup); + raceKey = thisFactionRaces[g_RaceSelected]; + end + if (g_ClassSelected > 0) then + local thisFactionClasses = CensusPlus_GetFactionClasses(factionGroup); + classKey = thisFactionClasses[g_ClassSelected]; + end + if (g_LevelSelected > 0 or g_LevelSelected < 0) then + levelKey = g_LevelSelected; + end + + debugprofilestart(); + + CensusPlus_ForAllCharacters( realmName, factionGroup, raceKey, classKey, guildKey, levelKey, CensusPlus_AddPlayerToList); + + if( CensusPlus_EnableProfiling ) then + CensusPlus_Msg( "PROFILE: Time to do calcs 1 " .. debugprofilestop() / 1000000000 ); + debugprofilestart(); + end + + + -- + -- Build our list + -- + CensusPlus_UpdatePlayerListButtons(); + + local totalCharactersText = format(CENSUSPlus_TOTALCHAR, table.getn( g_PlayerList ) ); + if( table.getn( g_PlayerList ) == g_MaxNumListed ) then + totalCharactersText = totalCharactersText .. " -- " .. CENSUSPlus_MAXXED; + end + + CensusPlayerListCount:SetText(totalCharactersText); + +end + +---------------------------------------------------------------------------------- +-- +-- Predicate function which can be used to compare two characters for sorting +-- +--------------------------------------------------------------------------------- +local function CharacterPredicate(lhs, rhs) + -- + -- nil references are always less than + -- + if (lhs == nil) then + if (rhs == nil) then + return false; + else + return true; + end + elseif (rhs == nil) then + return false; + end + -- + -- Sort by name + -- + if (lhs.m_name < rhs.m_name) then + return true; + elseif (rhs.m_name < lhs.m_name) then + return false; + end + + -- + -- Sort by level + -- + if (lhs.m_level < rhs.m_level) then + return true; + elseif (rhs.m_level < lhs.m_level) then + return false; + end + + -- + -- identical + -- + return false; +end + +local function CensusPlus_UpdatePlayerLookup( index, entry ) + -- + -- Have to update our table + -- + g_PlayerLookupTable[entry.m_name] = index; +end + + + +---------------------------------------------------------------------------------- +-- +-- Update the Player button contents +-- +--------------------------------------------------------------------------------- +function CensusPlus_UpdatePlayerListButtons() + -- + -- Sort the list + -- + local size = table.getn(g_PlayerList); + if (size) then + table.sort(g_PlayerList, CharacterPredicate); + + table.foreach(g_PlayerList, CensusPlus_UpdatePlayerLookup ); + + end + + -- + -- Determine where the scroll bar is + -- + local offset = FauxScrollFrame_GetOffset( CensusPlusPlayerListScrollFrame ); + -- + -- Walk through all the rows in the frame + -- + local i = 1; + while( i <= CensusPlus_NumPlayerButtons ) do + -- + -- Get the index to the ad displayed in this row + -- + local iPlayer = i + offset; + -- + -- Get the button on this row + -- + local button = getglobal("CensusPlusPlayerButton"..i); + -- + -- Is there a valid Player on this row? + -- + if (iPlayer <= size) then + local player = g_PlayerList[iPlayer]; + -- + -- Update the button text + -- + button:Show(); + local textField = "CensusPlusPlayerButton"..i.."Name"; + if ( player.m_name == nil or player.m_name == "") then + getglobal(textField):SetText( "None" ); + else + getglobal(textField):SetText( player.m_name ); + end + + local textField = "CensusPlusPlayerButton"..i.."Level"; + if ( player.m_level == nil or player.m_level == "") then + getglobal(textField):SetText( "n/a" ); + else + getglobal(textField):SetText( player.m_level ); + end + + local textField = "CensusPlusPlayerButton"..i.."Class"; + if ( player.m_guild == nil or player.m_guild == "") then + getglobal(textField):SetText( "Unguilded" ); + else + getglobal(textField):SetText( player.m_guild ); + end + + local textField = "CensusPlusPlayerButton"..i.."Seen"; + if ( player.m_seen == nil or player.m_seen == "") then + getglobal(textField):SetText( "UNK" ); + else + getglobal(textField):SetText( player.m_seen ); + end + else + -- + -- Hide the button + -- + button:Hide(); + end + -- + -- Next row + -- + i = i + 1; + end + -- + -- Update the scroll bar + -- + FauxScrollFrame_Update(CensusPlusPlayerListScrollFrame, size, CensusPlus_NumPlayerButtons, CensusPlus_GUILDBUTTONSIZEY); +end + +---------------------------------------------------------------------------------- +-- +-- Find a characters in the g_PlayerList array by name +-- +--------------------------------------------------------------------------------- +function CensusPlus_PlayerButton_OnClick() + local id = this:GetID(); + local offset = FauxScrollFrame_GetOffset( CensusPlusPlayerListScrollFrame ); + local newSelection = id + offset; + + local player = g_PlayerList[newSelection]; + FriendsFrame_ShowDropdown(player.m_name, 1); +end + +---------------------------------------------------------------------------------- +-- +-- Clear all the characters +-- +--------------------------------------------------------------------------------- +function CensusPlus_ClearPlayerList() + g_PlayerList = nil; + g_PlayerList = {}; + + g_PlayerLookupTable = nil; + g_PlayerLookupTable = {}; +end + +---------------------------------------------------------------------------------- +-- +-- Add a character to the list +-- +--------------------------------------------------------------------------------- +function CensusPlus_AddPlayerToList( name, level, guild, raceName, className, lastseen ) + local size = table.getn( g_PlayerList ); + + if( size >= g_MaxNumListed ) then + return; + end + + local index = g_PlayerLookupTable[name]; + if (index == nil) then + local size = table.getn( g_PlayerList ); + index = size + 1; + g_PlayerList[index] = { m_name = name, m_level = level, m_guild = guild, m_seen = lastseen }; + g_PlayerLookupTable[name] = index; + end +end +
