• 0

    posted a message on Instance Size Library (e.g. in astrolab)
    maybe check whether they are flagged? can't be flagged in an instance.

    This does leave a little uncertainty before you enter an instance but that isn't too bad really. As you form a raid you probably want more than 25 raid slots anyhow.
    Posted in: Addon Ideas
  • 0

    posted a message on BubbleLoot: Automated Master Looter Addon
    kk, fixed .pkgmeta with torhals help.
    Posted in: General AddOns
  • 0

    posted a message on BubbleLoot: Automated Master Looter Addon
    Quote from cremor
    Your check-in messages show that you hard-embedded the libraries. This is bad.
    Read here:
    http://kb.wowace.com/projects/pkgmeta-file/

    thanks for the top cremor.. I've added a .pkgmeta file but I'm not sure it's doing the right thing. Might hop on #wowace and ask around for where I'm farking it up.
    Posted in: General AddOns
  • 0

    posted a message on BubbleLoot: Automated Master Looter Addon
    URL: http://www.wowace.com/projects/bubbleloot/ (Currently in Beta)

    Overview

    BubbleLoot provides an automated mechanism to perform loot handling within PUG/guild environments. It automates the listing of loot to the raid, handles bids via whisper or raid, displays the results of the winning bid (by whichever bidding algorithm chosen) and master loot assigns the item to the winner. The master looter doesn't need to do anything for loot to be performed other than open up the loot window.


    Process

    When the user opens up a loot window as a master looter, it activates and scans for any qualifying loot (ie. epic) that isn't in it's ignore filter (eg. gems, emblems, etc). It then iterates over the qualifying items doing an automated bidding process. It does the following:
    (a.) RW Post bids on <item>. You have <x> seconds.
    (b.) It supports bids as either "main", "off" or "pvp"
    (c.) Bids can be accepted as either/or "raid" or "whisper"
    (d.) It performs the /roll and whispers the person back with the result
    (e.) It can optionally post the results of "whispers" to the raid
    (f.) Once the time elapses, it uses an algorithm to determine who wins
    - currently only one algorithm is supported (main>off>pvp)
    - and it supports a fairness system (person with less loot gets priority)
    - if enabled, it uses DKP to determine the winner of main bids
    (g.) A summary of all bids and the winner is posted to RW (if enabled)
    (h.) The item is automatically master looted to the winner (currently disabled in beta)
    (i.) It moves on to the next item.


    Future TODO
    * Better DKP support
    * Provide a GUI frontend
    * Support different loot assignment algorithms


    Motivation For Writing

    This was written by the author as a means of learning the Ace3 programming API and I'm very happy to get criticism on how to improve this. The current release is very much a beta version only. It does the job but is still crusty around the edges. I'll be working on rounding off any rough edges I can spot in my own tests and am happy to receive bug reports.

    At this point, I'm mainly interested in feedback from other developers on my code/library usage/etc. And if I'm doing something particularly dumb, please tell me.
    Posted in: General AddOns
  • 0

    posted a message on looking for suggestions; checking if a player has itemX
    Fel, I'd be keen to have a look at your addon. I've almost bug tested one that does some of what yours sounds like it does (I wrote it mostly as a way of teaching myself Ace3). I'd be keen to see your approach.

    Myaddon: http://www.wowace.com/projects/bubbleloot/

    Where is yours located?
    Posted in: Lua Code Discussion
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    without being a bump-a-holic here, can anyone suggest a good addon to dissect to learn how to use AceGUI3 widgets properly?

    My next project is a maly flame stack monitoring one (a bit like failbot). I've stolen some ideas from the MalygosFlamer addon (which I'll credit in my release) but want to use this addon to teach myself how to write a basic half decent GUI frame. (ie. not just a simple dialog box).

    I stole some basic code from Bartender4 for it's window creation and messed around to work out how to stick spell icons in frames but it's mostly learn by doing. I'd just like to ensure I'm doing things the right way instead of a failbot mechanism.

    thanks again for all the help
    bubble

    P.S. Big thanks to arrowmaster for providing some great tidbits of help on #wowace the other night!
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    SVN update should be working now in the bubbleloot package.
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    I've been waiting over the weekend for the SVN to allow me to commit but it still won't seem to accept my password so I'll post the source here in the meantime.
    (When I get prompted for the curseforge password on a commit, my username should be 'bubblecannon' yeh? Keeps coming up with unknown username)

    -- OVERVIEW
    -- TBC
    BubbleLoot = LibStub("AceAddon-3.0"):NewAddon("BubbleLoot", "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0")
    
    -- TABLES
    -- MapBid2Ndx is a map of the bid types to indexes
    -- MapNdx2Bid is a reverse map of the indexes to bid types
    -- tableBids is keyed by username with tuple(int bid, int roll)
    -- tableTally is keyed by username with tuple (int total_items, (int total_each_bid_type)+)
    -- BubbleLootList is keyed by index with tuple(str user, str item_link, int item_id, int bid)
    local mapBid2Ndx={pvp=0, off=1, bid=2}
    local mapNdx2Bid={"pvp", "off", "bid"}
    -- TODO: mapFilter should really be complemented with more filters but I want to avoid an expensive check
    local mapFilter={"Emblem of Valor", "Abyss Crystal", "Runed Dragon's Eye"}
    local tableBids={}
    local tableTally={}
    
    -- VARIABLES
    -- bDoingLoot is a flag indicating current in the middle of the bidding process
    -- bInraid is a flag that is set by the master looter indicating whether part of a raid or not
    -- timerBid is the timer object using to schedule the timer delay
    -- guildLib is the handle to the guildlib library instance used for DKP checks
    local bInRaid=false
    local bDoingLoot=false
    local iCurrentSlot=nil
    local timerBid=nil
    local guildLib=nil
    
    -- OPTIONS
    -- enableBL - toggles handling loot (ie. it ignores LOOT_OPENED events)
    -- enableML - toggles handling the actual loot assignment (ie. just displays winner)
    -- enableRB - toggles parsing of raid bids (ie. "bid", "off", "pvp")
    -- enableWB - toggles parsing of whisper bids (ie. ignores whisper "bid", "off", "pvp")
    -- enableSB - toggles echo of loot bid receipt into the raid channel
    -- enableBS - toggles printing of summary of all bids or just winner
    -- enableGD - toggles use of guild DKP to rank bids
    -- bidTime - input value for length of bid
    -- defaultSharder - input value for who to send shards to
    local options = {
    	name = "BubbleLoot",
    	handler = BubbleLoot,
    	type = "group",
    	args = {
    		enableBL = {
    			order=1, type = "toggle",
    			name = "Enable Bubble Loot",
    			desc = "Enables the master looting management by BubbleLoot",
    			get = function(info) return(BubbleLoot.db.profile.enableBL) end,
    			set = function(info, key) BubbleLoot.db.profile.enableBL=key end
    		},enableML = {
    			order=2, type = "toggle",
    			name = "Master Loot Assignment",
    			desc = "Enables the actual loot assignment by BubbleLoot",
    			get = function(info) return(BubbleLoot.db.profile.enableML) end,
    			set = function(info, key) BubbleLoot.db.profile.enableML=key end
    		},enableRB = {
    			order=3, type = "toggle",
    			name = "Raid Bids",
    			desc = "Enables people to perform bids via raid",
    			get = function(info) return(BubbleLoot.db.profile.enableRB) end,
    			set = function(info, key) BubbleLoot.db.profile.enableRB=key end
    		},enableWB = {
    			order=4, type = "toggle",
    			name = "Whisper Bids",
    			desc = "Enables people to perform bids via whisper",
    			get = function(info) return(BubbleLoot.db.profile.enableWB) end,
    			set = function(info, key) BubbleLoot.db.profile.enableWB=key end
    		},enableSB = {
    			order=5, type = "toggle",
    			name = "Enable Silent Bids",
    			desc = "Does not echo bids to raid channel received via whisper",
    			get = function(info) return(BubbleLoot.db.profile.enableSB) end,
    			set = function(info, key) BubbleLoot.db.profile.enableSB=key end
    		},enableGD = {
    			order=5, type = "toggle",
    			name = "Enable Guild DKP",
    			desc = "Uses guild DKP rather than items that night as the discriminator",
    			get = function(info) return(BubbleLoot.db.profile.enableGD) end,
    			set = function(info, key) BubbleLoot.db.profile.enableGD=key end
    		},enableBS = {
    			order=6, type = "toggle",
    			name = "Bid Summary",
    			desc = "Posts bid summary as well as the winner to RW",
    			get = function(info) return(BubbleLoot.db.profile.enableBS) end,
    			set = function(info, key) BubbleLoot.db.profile.enableBS=key end
    		},bidTime={
    			order=7, type = "input",
    			name = "BidTime",
    			desc = "How long people have to bid for each loot item",
    			get = function(info) return(BubbleLoot.db.profile.bidTime) end,
    			set = function(info, key) BubbleLoot.db.profile.bidTime=key end
    		},defaultSharder = {
    			order=8, type = "input",
    			name = "Default Sharder",
    			desc = "Default person to master loot shards to",
    			get = function(info) return(BubbleLoot.db.profile.defaultSharder) end,
    			set = function(info, key) BubbleLoot.db.profile.defaultSharder=key end
    		}
    	}
    }
    local defaultOptions = {
    	profile = {
    		enableBL = false,
    		enableML = false,
    		enableRB = true,
    		enableWB = true,
    		enableSB = false,
    		enableGD = false,
    		enableBS = true,
    		bidTime = 5,
    		defaultSharder = nil
    	}
    }
    
    -- ON_INITIALIZE
    -- This handler does the initial loading of all dependent libraries and sets up the config
    -- GUI.  It also provides an empty entry for the loot list if it doesn't exist yet.
    function BubbleLoot:OnInitialize()
    	BubbleLoot.db = LibStub("AceDB-3.0"):New("BubbleLootDB", defaultOptions, "Default")
    	LibStub("AceConfig-3.0"):RegisterOptionsTable("BubbleLoot", options)
    	BubbleLoot.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("BubbleLoot", "BubbleLoot")
    	BubbleLoot:RegisterChatCommand("bl", "ChatCommand")
    	BubbleLoot:RegisterChatCommand("bubbleloot", "ChatCommand")
    	BubbleLoot:Print("BubbleLoot 0.1 Initialised")
    	guildLib=LibStub("LibGuild-1.0")
    	if (BubbleLootList == nil) then
    		BubbleLootList = {}
    	end
    end
    
    -- ON_INITIALIZE
    -- Just register our event handlers below to the events we're interested in listening for
    function BubbleLoot:OnEnable()
    	BubbleLoot:RegisterEvent("CHAT_MSG_LOOT")
    	BubbleLoot:RegisterEvent("CHAT_MSG_WHISPER")
    	BubbleLoot:RegisterEvent("CHAT_MSG_RAID")
    	BubbleLoot:RegisterEvent("LOOT_OPENED")
    	BubbleLoot:RegisterEvent("LOOT_CLOSED")
    end
    function BubbleLoot:OnDisable()
    end
    
    -- EVENT HANDLERS
    -- Subs that invoke real handlers just to make the code a little cleaner
    function BubbleLoot:CHAT_MSG_LOOT(event, msg, user) BubbleLoot:HandleLootAssign(msg, user)end
    function BubbleLoot:CHAT_MSG_RAID(event, msg, user) BubbleLoot:HandleCmd(msg, user, false)end
    function BubbleLoot:CHAT_MSG_PARTY(event, msg, user) BubbleLoot:HandleCmd(msg, user, false)end
    function BubbleLoot:CHAT_MSG_WHISPER(event, msg, user) BubbleLoot:HandleCmd(msg, user, true) end
    function BubbleLoot:LOOT_OPENED()
    	if(BubbleLoot:ShouldWeProcessLoot()) then 
    		BubbleLoot:Print("<BL> Automated bidding commenced.")
    		bDoingLoot=false
    		iCurrentSlot=0
    		BubbleLoot:ProcessLoot()
    	end
    end
    function BubbleLoot:LOOT_CLOSED()
    	BubbleLoot:Print("<BL> Automated bidding halted.")
    	bDoingLoot=false
    end
    
    -- CHAT COMMAND HANDLER
    -- Handles all the commandline arguments for our addon including:
    --   LOOT - lists all loot for a player
    --   LOOT <player> - lists all loot for specified player
    --   RESET - resets the loot table (automatic reset disabled in alpha)
    --   GUILD <player> - returns the DKP for a specified player
    function BubbleLoot:ChatCommand(input)
    	if ((not input) or (input:trim() == "")) then
    		InterfaceOptionsFrame_OpenToCategory(BubbleLoot.optionsFrame)
    	elseif (input:lower() == "loot") then
    		BubbleLoot:ListLoot(nil)
    	elseif(string.match(input:lower(), "loot%s+")) then
    		local filter=string.match(input, "%a+%s+(%a+)")
    		BubbleLoot:ListLoot(nil, filter)
    	elseif (input:lower() == "reset") then
    		BubbleLoot:Print("<BL> Loot reset")
    		BubbleLootList = {}
    		tableTally={}
    	elseif (input:lower() == "forum") then
    		BubbleLoot:DoForum()
    	elseif (string.match(input:lower(), "(%a+)%s+")=="guild") then
    		local name=string.match(input, "%a+%s+(%a+)")
    		BubbleLoot:Print("DKP for " .. name .. " is " .. dkp)
    	else
    		LibStub("AceConfigCmd-3.0").HandleCommand(BubbleLoot, "bl", "BubbleLoot", input)
    	end
    end
    
    
    -- SHOULD_WE_PROCESS_LOOT
    -- This function checks to see if:
    -- (a.) the addon has been enabled
    -- (b.) the current loot method is master
    -- (c.) that we are the assigned loot master
    function BubbleLoot:ShouldWeProcessLoot()
    	if(BubbleLoot.db.profile.enableBL) then
    		local lootMethod, partyMaster, raidMaster=GetLootMethod()
    		bInRaid=(partyMaster==nil)
    		if(lootMethod == "master") then
    			local playerName=UnitName("player")
    			if(raidMaster == nil) then
    				return partyMaster == 0
    			else
    				local mlName=GetRaidRosterInfo(raidMaster)
    				return mlName==playerName
    			end
    		end
    	end
    	return (false)
    end
    
    -- IS_ROLLABLE_ITEM
    -- This function takes an item link and return true or false if it's worth rolling on.  The
    -- threshold is rare items for a party and epic items for a raid.  It also uses a blacklist
    -- filter to avoid logging emblems/gems/etc.
    function BubbleLoot:IsRollableItem(item)
    	local itemId = string.match(item, "item:(%d+)")
    	local itemName, itemLink, itemQual = GetItemInfo(itemId)
    	if((bInRaid and itemQual==3) or (itemQual==4)) then
    		for i,v in ipairs(mapFilter) do
    			if(itemName == v) then
    				return(false)
    			end
    		end
    		return(true)
    	end
    	return false
    end
    
    -- PROCESS_LOOT
    -- This iterates through the items in an open loot window and automates the bidding process
    -- on the master looters behalf
    function BubbleLoot:ProcessLoot()
    	iCurrentSlot=iCurrentSlot+1
    	for i=iCurrentSlot, GetNumLootItems() do
    		local itemLink=GetLootSlotLink(i)
    		if(BubbleLoot:IsRollableItem(itemLink)) then
    			bDoingLoot=true
    			iCurrentSlot=i
    			tableBids={}
    			SendChatMessage("<BL> Post bids for " .. itemLink .. " " .. BubbleLoot.db.profile.bidTime .. " secs left", "RAID_WARNING")
    			timerBid=BubbleLoot:ScheduleTimer("HandleTimer", tonumber(BubbleLoot.db.profile.bidTime))
    		end
    	end
    end
    
    -- HANDLE TIMER
    -- This function handles the timer scheduled by the ProcessLoot function.  It iterates through
    -- the receved bids and yadda yadda
    -- tableBids is keyed by username with tuple(int bid, int roll)
    function BubbleLoot:HandleTimer()
    	BubbleLoot:CancelTimer(timerBid)
    	if(not bDoingLoot) then return end
    	bDoingLoot=false
    --	now we need to evaluate the bids
    --	now we enumerate through the bids working out who will win
    --	pvp is 0, off is 1, main is 2
    	local bidCount=0
    	local winType=0
    	local winUser=nil
    	local winRoll=0
    	local winDkp=0
    	local winTally=0
    	for i,v in ipairs(tableBids) do
    		local winFlag=false
    		bidCount=bidCount+1
    --		if currently no winner, or a higher bid type winner then the first bid becomes the potential winner
    		if((winUser==nil) or (v[1]>winType))then
    			winFlag=true;
    		elseif(v[1]==winType) then
    			if(BubbleLoot.db.profile.enableDB) then
    				if(BubbleLoot:GetDKP(i)>winDkp) then
    					winFlag=true
    				elseif((BubbleLoot:GetDKP(i)==winDkp) and (v[2]>winRoll)) then
    					winFlag=true
    				end
    			else
    				if(tableTally[i]<winTally) then
    					winFlag=true
    				elseif((tableTally[i]==winTally) and (v[2]>winRoll)) then
    					winFlag=true
    				end
    			end
    		end
    --		if this bids wins, then set the win running information
    		if(winFlag) then
    			winUser=i
    			winRoll=v[2]
    			winType=v[1]
    			if(BubbleLoot.db.profile.enableDB) then
    				winDkp=BubbleLoot:GetDKP(winUser)
    			else
    				winTally=tableTally[winUser]
    			end
    		end
    	end
    	if(bidCount == 0) then
    		SendChatMessage("<BL> No bids received.  Item being sharded by defaultSharder", "RAID_WARNING")
    	else
    		if(BubbleLoot.db.profile.enableBS) then
    			BubbleLoot:DoLootSummary()
    		end
    		SendChatMessage("<BL> " .. winUser .. " won with " .. winTypeName .." roll of " .. winRoll)
    		SendChatMessage("<BL> Gratz on the win", "WHISPER", nil, winUser)
    	end
    --	GiveMasterLoot(i, 1)
    end
    
    -- DO_LOOT_SUMMARY
    -- This parses the bids and constructs multiple output strings
    function BubbleLoot:DoLootSummary()
    --	TODO: fix this local to be more generic
    	local bidStr={nil, nil, nil}
    	for i,v in ipairs(tableBids) do
    --		construct the summary as USER (ROLL, DISCRIM)
    		local bid=i .. "(" .. v[2] .. ","
    		if (BubbleLoot.db.profile.enableDB) then
    			bid = bid .. GetDKP(i) .. ")"
    		else
    			bid = bid .. tableTally[i]
    		end
    --		if this is th first string, then just assign it.  Otherwise append the string
    		if(bidStr[v[1]]==nil) then
    			bidStr[v[1]]=bid
    		else
    			bidStr[v[1]]=bidStr[v[1]] .. ", " .. bid
    		end
    	end
    --	now iterate through the array and summarise any bids to raid warning
    	for i,v in ipairs(bidStr) do
    		if(bidStr[i]) then
    			SendChatMessage("<BL> " .. mapNdx2Bid[i] .. ": " .. bidStr[i], "RAID_WARNING")
    		end
    	end
    end
    
    -- DO_FORUM
    -- This function is a very dodgy utility function used to generate a simple PHPBB code
    -- output.  However, it needs to be altered to be a lot more functional.  Generating a single
    -- string and placing that inside a large frame would be far more useful.
    -- TODO: fix this to be far more useful than it currently is including better formatting and GUI
    function BubbleLoot:DoForum()
    	for i,v in ipairs(BubbleLootList) do
    		local itemName = GetItemInfo(v[3])
    		BubbleLoot:Print("[wowitem]" .. itemName .."[/wowitem] " .. v[1])
    	end
    end
    
    
    -- HANDLE_LOOT_ASSIGN
    -- This function is invoked whenever someone loots something.  This will run even if you are not
    -- the master looter (so it can be used to keep a quick record of loot recorded in an instance)
    -- This function parses the loot assignment notification to update the loot table.
    -- First it grabs out whomever received the loot, and then it checks the item to see whether it's
    -- worth parsing or not.
    function BubbleLoot:HandleLootAssign(msg)
    	local name=string.match(msg, "(%a+)")
    	if (name == "You") then
    		name = UnitName("player")
    	end 
    	if(BubbleLoot:IsRollableItem(msg)) then
    		local itemId = string.match(msg, "item:(%d+)")
    		local itemName, itemLink, itemQual = GetItemInfo(itemId)
    		BubbleLoot:Print("<BL> " .. name .. " " .. itemLink)
    --		need to change this to identify what type of bid it is
    		table.insert(BubbleLoot, {name, itemLink, itemId, "bid"})
    		if(tableTally[name]) == nil then
    			tableTally[name] = {1, 0, 0, 0}
    		else
    			tableTally[name][1] = tableTally[name][1]+1
    		end
    	end
    end
    
    -- HANDLE_CMD
    -- This function handles the registration of commands from whispers.  If the whisper command
    -- matches on the of the bid types, it will record the bid if bidding is open.  It will also
    -- handle loot queries and provides a very rudimentary help
    -- TODO: improve the help in some manner
    function BubbleLoot:HandleCmd(msg, user, isWhisper)
    	local roll = random(1, 100)
    --	need to do a check to see if im in a raid or a party first
    --	if((msg:lower()=="bid") or (msg:lower()=="off") or (msg:lower()=="pvp")) then
    	if(mapBid2Ndx[msg:lower()]) then
    		if(bDoingLoot == false) then
    			SendChatMessage("<BL> Bids closed", "WHISPER", nil, user)
    		elseif((isWhisper and BubbleLoot.db.profile.enableWB) or (not isWhisper and BubbleLoot.db.profile.enableRB))then
    			local bidNdx=mapBid2Ndx[msg:lower()]
    			SendChatMessage("<BL> Bid registered for " .. user .. " with roll " .. roll, "WHISPER", nil, user)
    			if(not BubbleLoot.db.profile.enableSB) then
    				SendChatMessage("<BL> Bid registered for " .. user .. " with roll " .. roll, "RAID")
    			end
    			tableBids[user]={bidNdx, roll}
    		end
    	elseif(msg:lower() == "loot") then
    		SendChatMessage("<BL> Your loot recorded in this raid is as follows:", "WHISPER", nil, user)
    		BubbleLoot:ListLoot(user, user)
    	elseif(string.match(msg:lower(), "loot%s+")) then
    		local filter=string.match(msg, "%a+%s+(%a+)")
    		SendChatMessage("<BL> Loot for user " .. filter .. " recorded in this raid is as follows:", "WHISPER", nil, user)
    		BubbleLoot:ListLoot(user, filter)
    	elseif(msg:lower() == "dkp") then
    		SendChatMessage("<BL> Your DKP is currently: " .. BubbleLoot:GetDKP(user), "WHISPER", nil, user)
    	elseif(string.match(msg:lower(), "dkp%s+")) then
    		local filter=string.match(msg, "%a+%s+(%a+)")
    		SendChatMessage("<BL> DKP for user " .. filter .. " is currently: " .. BubbleLoot:GetDKP(filter), "WHISPER", nil, user)
    --	elseif(msg:lower() == "ladder") then
    --		SendChatMessage("<BL> Item count ladder in this raid is as follows:",  "WHISPER", nil, user)
    	elseif(msg:lower() == "help") then
    		SendChatMessage("<BL> BubbleLoot only accepts BID, OFF, PVP, LOOT and DKP commands", "WHISPER", nil, user)
    		SendChatMessage("<BL> Whisper this user with either BID, OFF, or PVP to register a bid on an item when prompted", "WHISPER", nil, user)
    		SendChatMessage("<BL> Or if the MasterLooter has set it up, you can bid in raid chat", "WHISPER", nil, user)
    		SendChatMessage("<BL> You can see your own loot by whispering me 'loot' or someone elses by 'loot name'", "WHISPER", nil, user)
    		SendChatMessage("<BL> You can see your own dkp by whispering me 'dkp' or someone elses by 'dkp name'", "WHISPER", nil, user)
    		SendChatMessage("<BL> Note: you must use the correct exact case for the players name (eg. Bubblecannon not bubblecannon)", "WHISPER", nil, user)
    	end
    end
    
    -- LIST_LOOT
    -- This function simply lists all the loot for a particular user
    -- [BubbleLootList is keyed by index with tuple(str user, str item_link, int item_id, int bid)]
    function BubbleLoot:ListLoot(from, filter)
    	if(from == nil) then
    		for i,v in ipairs(BubbleLootList) do
    			if((filter==nil) or (v[1]==filter)) then
    				BubbleLoot:Print("<BL> " .. i .. " " .. v[1] .. " " .. v[2])
    			end
    		end
    	else
    		for i,v in ipairs(BubbleLootList) do
    			if((filter==nil) or (v[1]==filter)) then
    				SendChatMessage("<BL> " .. v[1] .. " " .. v[2], "WHISPER", nil, from)
    			end
    		end
    	end
    end
    
    -- GET_DKP
    -- This function is simply a cleanliness function to extract the DKP from the guild notes
    -- that adheres to the format: Net:<digits> Total:<digits>
    function BubbleLoot:GetDKP(name)
    	local onote=guildLib:GetOfficerNote(name)
    	if(onote==nil) then
    		return(0)
    	else
    		local dkp=string.match(onote, "Net:(%-?%d+)")
    		if(dkp==nil) then
    			return(0)
    		else
    			return(tonumber(dkp))
    		end
    	end
    end


    I'd very much appreciate criticism on style, ace usage, etc. TBH I really don't grok lua that well just yet so always keen for advice. My coding background is all C, C++, asm and Java.
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Well I've made a project but I'm still waiting for it to be processed by the admins.

    Bit of a question with the WoW API if someone has an easy answer. Is there any way to replicate the normal masterloot behaviour? (ie. the confirmation dialog box?)

    My addon uses GiveMasterLoot() but I'd really like to give the lootmaster the same visibility he receives currently when assigning loot. Would I have to write my own dialog box to achieve this same functionality?

    Thanks for any relpies.
    cheers
    bubble
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Thanks again for the comments guys. My addon is almost finished - I'm just doing some boundary testing now. (ie. winning bid leaves raid in the middle of a bid, loot window closed just as the loot is assigned, etc etc)

    It's a very modest size mod, and if it's not violating rules, I'd be keen to post it in the forum for some criticism on coding style/api usage/ace3 library usage.

    thanks again
    bubble

    P.S. FYI, the next addon I'm working on to learn Ace3 is a malygos debuff counter to track each raid members drake debuff amount in a nice way. It will also doea 'failbot' type thing when people drop their stack. We've been 1 shotting maly now for 2 months, but we still have failboaters with low dps :(
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Quote from OrionShock
    www.wowwiki.com/API

    www.wowprogramming.com/

    these sites are fairly complete :)

    holy carp, I wish I'd known about wowprogramming.com before. That site is just wahat I was looking for. The wowwiki site hardly documents anything. Every event is a 'ok, lets give this handler 8 arguments' and see which ones are filled by the event handler.
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Thanks for that arrow. For some reason I hadn't realised lua had regexp type functionality!

    Where do you guys recommmend I post my experience on function usage? wowwiki? Because there seems to be a real lack of good event/api documentation. If the wowapi had something like php.net programming against it would be far easier.

    I'm planning on writing a few more mods so I'm keen on capturing it all. Does wowace have a newbie wiki for this sort of thing?
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Thanks a lot for the replies guys. I've been progressing with my addon and whilst moving from strict languages to lua has been a unique experience it seems to be working fairly well. In essence, my first addon is just a project to learn ace3 and get a feel for the wow api. It's a small addon that just does master looting for me.

    * uses LOOT_OPENED to detect the event and checks to see if you are the ML
    * if ML, it then scans the loot looking for epics
    * it then performs an automated bid process listening for raid or whisper chat
    * using our guild alt run rules it decides on a winner and performs GiveMasterLoot()
    * rinse repeat for each purple item
    * the whole system stops if it receives a LOOT_CLOSED event.

    I've been using AceConfig to allow the user to configure all the standard toggles (ie. default sharder toon, allow bids via raid chat, allow bids via whispers, how long for bids to last, etc).

    Because GiveMasterLoot() doesn't return a success/failure value, every time the system assigns a loot, it puts the entry on a stack. The addon also listens for LOOT items and then matches any items in the stack with an item someone picks up. This is a bit clunky right now.

    In fact, I do have a noobie questions. Is there a clean way to parse the item link string into an item id? Currently I've just made my own parsing code. (I'm referring to the string returned from CHAT_MSG_LOOT)

    Again, thanks for the responses guys and as I progress to experimenting with a pretty GUI for this to learn GUI's further I'll have a few more questions.
    Posted in: Ace3
  • 0

    posted a message on AceGUI First Timer Guide? Examples?
    Hey all,

    (Apologies in advance if I've missed something obvious but I have done about an hour of trolling/searching to try and find what I'm looking for)

    Anyway, I'm just wondering if there is a AceGUI starter document/faq anywhere? Or even some trivial examples?

    I'm fairly happy with most of the other Ace libraries but the GUI side of Ace seems a complete mystery. I've got a reasonable programming background (comp sci degree with 10 years programming experience) so really only trying to get to grips with the ui paradigm.

    If nothing is around, I'll muddle my way through addons and will try and post something as a Java -> wow gui primer.

    cheers
    bubble
    Posted in: Ace3
  • To post a comment, please or register a new account.