---- -- TitanPanel[Roll] ---- --[[ author: QuippeR many thanks for code from: LootHog by Chompers ToggleMe by Taii description: This Titan Panel plugin catches dice rolls from the chat system. It displays the last roll (performers name and roll value) in Titan Panel, and hovering the plugin brings up a list of the latest catched rolls. Dice rolls with the range of 1-100 are displayed in green, others in red with the minimum and maximum of the roll after the actual value. Clicking on the text displayed performs a roll. ]]-- TITAN_ROLL_ID = "Roll" TITANROLL_TIMEOUTS = { 10, 20, 30, 60, 120, 180, -1}; function TitanPanelRollButton_OnLoad() this.registry = { id = TITAN_ROLL_ID, menuText = TITANROLL_MENUTEXT, buttonTextFunction = "TitanPanelRollButton_GetButtonText", tooltipTitle = TITANROLL_TOOLTIP, tooltipTextFunction = "TitanPanelRollButton_GetTooltipText", icon = "Interface\\PvPRankBadges\\PvPRank10", iconWidth = 16, category = "Information", savedVariables = { ShowIcon = 1, ShowLabelText = 1, ShowWinner = 1, ReplaceBadRolls = 1, SortList = 0, HighlightParty = 0, PerformedRoll = "1-100", ListLength = 10, Timeout = 20, OnlyGoodRollsWin = 1, AcceptGroupOnly = 0, IgnoreMultiRoll = 0, AnnouncePattern = TITANROLL_ANNPATT, EraseTimedOutRolls = 0, ShowTimeOut = 1 } }; this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("CHAT_MSG_SAY"); this:RegisterEvent("CHAT_MSG_PARTY"); this:RegisterEvent("CHAT_MSG_RAID"); this:RegisterEvent("CHAT_MSG_GUILD"); TitanRolls = {}; TimedOut = 0; end function TitanPanelRollButton_OnClick(button) local i; if (( button == "LeftButton" ) and IsShiftKeyDown()) then TitanPanelRollButton_TimeOutAll(); elseif (( button == "LeftButton" ) and IsControlKeyDown()) then if (TitanRollsCount) then for i = 1, TitanRollsCount do TitanRolls[i] = TitanRolls[i+1]; end TitanRollsCount = TitanRollsCount - 1; if (TimedOut ~= 0) then TimedOut = TimedOut - 1; end if (TitanRollsCount == 0) then TitanRollsCount = nil; end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); end elseif (( button == "LeftButton" ) and IsAltKeyDown()) then TitanRoll_AnnounceWinner(); -- (Maybe in a future version) -- -- elseif (( button == "LeftButton" ) and ChatFrameEditBox:IsShown()) then -- local Ilink = ChatFrameEditBox:GetText(); -- ChatFrameEditBox:SetText(""); -- ChatFrameEditBox:Hide(); -- TitanRoll_AnnounceItem(Ilink); elseif ( button == "LeftButton" ) then TitanRoll_EditBox:SetText("/rnd "..TitanGetVar(TITAN_ROLL_ID, "PerformedRoll")); ChatEdit_SendText(TitanRoll_EditBox); end end -- Special thanks to LootHog author Chompers ! function TitanPanelRollButton_OnEvent() local msg = arg1; local pattern = TITANROLL_SEARCHPATTERN; local player, roll, min_roll, max_roll, report; _, _, player, roll, min_roll, max_roll = string.find(msg, pattern); if (player) and ((TitanGetVar(TITAN_ROLL_ID, "AcceptGroupOnly") and (UnitInGroupByName(player)) or (not TitanGetVar(TITAN_ROLL_ID, "AcceptGroupOnly")))) then TitanPanelRollButton_ProcessRoll(player, roll, min_roll, max_roll); end if (strlower(msg)=="!roll") then TitanRoll_EditBox:SetText("/rnd 100"); ChatEdit_SendText(TitanRoll_EditBox); end end function TitanPanelRollButton_ProcessRoll(player, roll, min_roll, max_roll) local rollOK = true; local deleted = 0; local rolltime = GetTime(); local firstRoll = true; min_roll = tonumber(min_roll); max_roll = tonumber(max_roll); roll = tonumber(roll); _, _, rolltime, _ = string.find(rolltime, "(%d+).(%d+)"); rolltime = tonumber(rolltime); if (min_roll ~=1) or (max_roll~=100) then rollOK = false; end if ((TitanRollsCount) and (TitanGetVar(TITAN_ROLL_ID, "IgnoreMultiRoll")) and (TimedOut>0)) then for i = 1, TimedOut do if ((TitanRolls[i].name == player) and not (TitanGetVar(TITAN_ROLL_ID,"ReplaceBadRolls") and (not TitanRolls[i].onetohundred))) then firstRoll = false; end end end if (firstRoll) then if (TitanRollsCount) then if (TitanGetVar(TITAN_ROLL_ID, "ReplaceBadRolls")) then for i = 1, TitanRollsCount do if ((TitanRolls[i-deleted].name == player) and (not (TitanRolls[i-deleted].onetohundred)) and rollOK) then for j = i-deleted, TitanRollsCount do TitanRolls[j] = TitanRolls[j+1]; end TitanRollsCount = TitanRollsCount - 1; if (TimedOut >= (i-deleted)) then TimedOut = TimedOut - 1; end deleted = deleted + 1; end end end for i = TitanRollsCount, 1, -1 do TitanRolls[i+1] = TitanRolls[i]; end if (TitanRollsCount < TitanGetVar(TITAN_ROLL_ID, "ListLength")) then TitanRollsCount = TitanRollsCount + 1; end if (TimedOut < TitanGetVar(TITAN_ROLL_ID, "ListLength")) then TimedOut = TimedOut + 1; end else TitanRollsCount = 1; TimedOut = 1; end if (rollOK) then TitanRolls[1] = {name = player, rolled = roll, onetohundred = rollOK, since = rolltime}; else TitanRolls[1] = {name = player, rolled = roll, onetohundred = rollOK, since = rolltime, base = min_roll, top = max_roll}; end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); TitanPanelButton_SetTooltip(TITAN_ROLL_ID); end end function TitanPanelRollButton_OnUpdate() local secNow; if (TimedOut > 0) and (TitanGetVar(TITAN_ROLL_ID, "Timeout") > 0) then secNow = GetTime(); _, _, secNow, _ = string.find(secNow, "(%d+).(%d+)"); if ((secNow - TitanRolls[TimedOut].since) > TitanGetVar(TITAN_ROLL_ID, "Timeout")) then TimedOut = TimedOut - 1; if (TitanGetVar(TITAN_ROLL_ID, "EraseTimedOutRolls") == 1) then TitanRollsCount = TimedOut; end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); end elseif (TitanGetVar(TITAN_ROLL_ID, "Timeout") == -1) then TimedOut = TitanRollsCount or 0; TitanPanelButton_UpdateButton(TITAN_ROLL_ID); else -- I don't want it to be negative no way TimedOut = 0; end TitanPanelButton_UpdateTooltip(); end function TitanPanelRollButton_GetButtonText() local buttonText = ""; local max = -1; local maxloc = 0; local i; local hasBadRoll = false; local parenth = ""; local winners = ""; if (TitanRollsCount) then if not (TitanGetVar(TITAN_ROLL_ID, "ShowWinner")) then buttonText = buttonText..TitanRolls[1].name.." "; if (TitanRolls[1].onetohundred) then buttonText = buttonText..TitanUtils_GetGreenText(TitanRolls[1].rolled); else buttonText = buttonText..TitanUtils_GetRedText(TitanRolls[1].rolled); end parenth = " ("..TimedOut..")"; else for i = 1, TitanRollsCount do if (TitanRolls[i].rolled >= max) and (i <= TimedOut) and ((TitanGetVar(TITAN_ROLL_ID, "OnlyGoodRollsWin") and (TitanRolls[i].onetohundred)) or (not TitanGetVar(TITAN_ROLL_ID, "OnlyGoodRollsWin"))) then if (max ~= tonumber(TitanRolls[i].rolled)) then winners = TitanRolls[i].name; else winners = winners..", "..TitanRolls[i].name; end max = tonumber(TitanRolls[i].rolled); maxloc = i; end if not (TitanRolls[i].onetohundred) and (i <= TimedOut) then hasBadRoll = true; end end if (maxloc > 0) then if hasBadRoll then buttonText = buttonText..TitanUtils_GetRedText(winners.." "); else buttonText = buttonText..winners.." "; end if (TitanRolls[maxloc].onetohundred) then buttonText = buttonText..TitanUtils_GetGreenText(TitanRolls[maxloc].rolled); else buttonText = buttonText..TitanUtils_GetRedText(TitanRolls[maxloc].rolled) end parenth = " ("..TimedOut..")"; else buttonText = TitanUtils_GetColoredText(TITAN_NA, HIGHLIGHT_FONT_COLOR); end end else buttonText = buttonText..TitanUtils_GetColoredText(TITAN_NA, HIGHLIGHT_FONT_COLOR); end if not (TitanGetVar(TITAN_ROLL_ID, "ShowWinner")) then return TITANROLL_LABELTEXT, buttonText..parenth; else return TITANROLL_LABELWINNER, buttonText..parenth; end end function TitanPanelRollButton_GetTooltipText() local tooltipText = ""; local i, j, k; local sortedList = {}; if (TitanRollsCount) then if (TitanGetVar(TITAN_ROLL_ID, "SortList")) then for i = 1, TitanRollsCount do if (sortedList) then if (i <= TimedOut) then j = 1; while (j TitanRolls[i].rolled) do j = j + 1; end for k = i-1, j, -1 do sortedList[k+1] = sortedList[k]; end sortedList[j] = TitanRolls[i]; else sortedList[i] = TitanRolls[i]; end else sortedList[i] = TitanRolls[i]; end end tooltipText = TitanPanelRollButton_PrintTooltipText(sortedList) else tooltipText = TitanPanelRollButton_PrintTooltipText(TitanRolls) end else tooltipText = tooltipText..TitanUtils_GetNormalText(TITANROLL_NOROLL).."\n"; end tooltipText = tooltipText..TitanUtils_GetGreenText(TITANROLL_HINT); return tooltipText; end function UnitInGroupByName(name) if (UnitName("player") == name) or (UnitName("party1") == name) or (UnitName("party2") == name) or (UnitName("party3") == name) or (UnitName("party4") == name) then return true; else local raidmember = false; for i = 0, 40 do if (UnitName("raid"..i)) and (UnitName("raid"..i) == name) then raidmember = true; end end return raidmember; end end function TitanPanelRollButton_PrintTooltipText(array) local i; local name=""; local tooltipText = ""; local tooltipLength = 0; local nowIs = GetTime(); local since = 0; local sinceText = ""; local t = 0; _, _, nowIs, _ = string.find(nowIs, "(%d+).(%d+)"); if TitanRollsCount < TITANROLL_MAXTTLEN then tooltipLength = TitanRollsCount; else tooltipLength = TITANROLL_MAXTTLEN; end for i = 1, tooltipLength do if (TitanGetVar(TITAN_ROLL_ID, "ShowTimeOut")) then since = (nowIs-array[i].since); t = since-mod(since,3600); if t>0 then sinceText = ">"..(t/3600).."h" else t = since-mod(since,60); if t>60 then sinceText = ">"..(t/60).."min" elseif t>0 then sinceText = "1min "..(since-60).."s" else sinceText = since.."s" end end name = "["..sinceText.."] "..array[i].name; else name = array[i].name; end if (i <= TimedOut) then if (UnitInGroupByName(array[i].name) and TitanGetVar(TITAN_ROLL_ID, "HighlightParty")) then tooltipText = tooltipText..TitanUtils_GetHighlightText(name).."\t"; else tooltipText = tooltipText..TitanUtils_GetGreenText(name).."\t"; end else tooltipText = tooltipText..name.."\t"; end if (i <= TimedOut) then if (array[i].onetohundred) then if (UnitInGroupByName(array[i].name) and TitanGetVar(TITAN_ROLL_ID, "HighlightParty")) then tooltipText = tooltipText..TitanUtils_GetHighlightText(array[i].rolled).."\n"; else tooltipText = tooltipText..TitanUtils_GetGreenText(array[i].rolled).."\n"; end else tooltipText = tooltipText..TitanUtils_GetRedText(array[i].rolled.." ("..array[i].base.."-"..array[i].top..")").."\n"; end else if (array[i].onetohundred) then tooltipText = tooltipText..array[i].rolled.."\n"; else tooltipText = tooltipText..array[i].rolled.." ("..array[i].base.."-"..array[i].top..")\n"; end end end if (tooltipLength~=TitanRollsCount) then tooltipText = tooltipText..TitanUtils_GetRedText(TITANROLL_TTALERT).."\n"; end return tooltipText; end function TitanPanelRollButton_ResetSession() TitanRollsCount = nil; TitanRolls = {}; TimedOut = 0; TitanPanelButton_UpdateButton(TITAN_ROLL_ID); end function TitanPanelRollButton_TimeOutAll() local i; if (TitanGetVar(TITAN_ROLL_ID,"Timeout")==-1) then TitanPanelRollButton_ResetSession(); else for i = 1, TimedOut do TitanRolls[i].since = TitanRolls[i].since - TitanGetVar(TITAN_ROLL_ID,"Timeout"); end TitanPanelButton_SetTooltip(TITAN_ROLL_ID); end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); end function TitanRoll_AnnounceWinner() local sendToChat = ""; local hasBadRoll = ""; local max = -1; local maxloc = 0; local winners = ""; local rollerList = ""; local annpattern = TitanGetVar(TITAN_ROLL_ID, "AnnouncePattern"); if(GetNumRaidMembers()>0) then sendToChat = "/raid "; elseif (GetNumPartyMembers()>0) then sendToChat = "/p "; else sendToChat = "/s "; end if (TimedOut>0) then for i = 1, TimedOut do if (TitanRolls[i].rolled >= max) and (i <= TimedOut) and ((TitanGetVar(TITAN_ROLL_ID, "OnlyGoodRollsWin") and (TitanRolls[i].onetohundred)) or (not TitanGetVar(TITAN_ROLL_ID, "OnlyGoodRollsWin"))) then if (max ~= tonumber(TitanRolls[i].rolled)) then winners = TitanRolls[i].name; else winners = winners..", "..TitanRolls[i].name; end max = tonumber(TitanRolls[i].rolled); maxloc = i; end if not (TitanRolls[i].onetohundred) and (i <= TimedOut) then if (hasBadRoll~="") then hasBadRoll = hasBadRoll..", "; end hasBadRoll = hasBadRoll..TitanRolls[i].name.." ("..TitanRolls[i].base.."-"..TitanRolls[i].top..")"; end if (i~=1) then rollerList = rollerList..", " end rollerList = rollerList..TitanRolls[i].name.." - "..TitanRolls[i].rolled end if (maxloc > 0) then annpattern = string.gsub(annpattern, "$a(.+)$b", ""); annpattern = string.gsub(annpattern, "$w", winners); annpattern = string.gsub(annpattern, "$l", rollerList); annpattern = string.gsub(annpattern, "$r", TitanRolls[maxloc].rolled); annpattern = string.gsub(annpattern, "$n", TimedOut); if (hasBadRoll~="") then annpattern = string.gsub(annpattern, "$c", ""); annpattern = string.gsub(annpattern, "$i", hasBadRoll) else annpattern = string.gsub(annpattern, "$c(.+)", ""); end end end if (maxloc==0) then annpattern = string.gsub(annpattern, "$a", " "); annpattern = string.gsub(annpattern, "$b(.+)", " "); end sendToChat = sendToChat..annpattern; local strLenToPrint = string.len(sendToChat) while strLenToPrint > 255 do TitanRoll_EditBox:SetText(string.sub(sendToChat,-strLenToPrint, -(strLenToPrint-255))); ChatEdit_SendText(TitanRoll_EditBox); strLenToPrint = strLenToPrint-255; end TitanRoll_EditBox:SetText(string.sub(sendToChat,-strLenToPrint)); ChatEdit_SendText(TitanRoll_EditBox); end -- (Maybe in a future version) -- --function TitanRoll_AnnounceItem(itemlink) -- local sendToChat = ""; -- -- if(GetNumRaidMembers()>0) then -- sendToChat = "/raid "; -- elseif (GetNumPartyMembers()>0) then -- sendToChat = "/p "; -- else -- DEFAULT_CHAT_FRAME:AddMessage("TitanRoll: You're not in a group!") -- end -- -- sendToChat = sendToChat.."Please need roll on "..itemlink.."! You can pass by typing in the letter 'p'!"; -- -- TitanRoll_EditBox:SetText(sendToChat); -- ChatEdit_SendText(TitanRoll_EditBox); --end function TitanPanelRollButton_ChangeAction() StaticPopupDialogs["TITANROLL_CHANGEACTION"]={ text=TEXT(TITANROLL_CURRENTACTION..TitanGetVar(TITAN_ROLL_ID, "PerformedRoll")), button1=TEXT(ACCEPT), button2=TEXT(CANCEL), hasEditBox=1, maxLetters=30, OnAccept=function() local editBox=getglobal(this:GetParent():GetName().."EditBox") TitanSetVar(TITAN_ROLL_ID, "PerformedRoll", editBox:GetText()); end, EditBoxOnEnterPressed=function() local editBox=getglobal(this:GetParent():GetName().."EditBox") TitanSetVar(TITAN_ROLL_ID, "PerformedRoll", editBox:GetText()); end, timeout=0, exclusive=1 } StaticPopup_Show("TITANROLL_CHANGEACTION") end function TitanPanelRollButton_ChangeAnnounce() StaticPopupDialogs["TITANROLL_CHANGEANNOUNCE"]={ text=TEXT(TITANROLL_CHATFORHELP), button1=TEXT(ACCEPT), button2=TEXT(CANCEL), hasEditBox=1, maxLetters=250, OnAccept=function() local editBox=getglobal(this:GetParent():GetName().."EditBox") TitanSetVar(TITAN_ROLL_ID, "AnnouncePattern", editBox:GetText()); end, EditBoxOnEnterPressed=function() local editBox=getglobal(this:GetParent():GetName().."EditBox") TitanSetVar(TITAN_ROLL_ID, "AnnouncePattern", editBox:GetText()); end, timeout=0, exclusive=1 } DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP01); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP02..TitanGetVar(TITAN_ROLL_ID, "AnnouncePattern")); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP03); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP04); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP05); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP06); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP07); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP08); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP09); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP10); DEFAULT_CHAT_FRAME:AddMessage(TITANROLL_ANNHELP11); StaticPopup_Show("TITANROLL_CHANGEANNOUNCE") getglobal(getglobal(StaticPopup_Visible("TITANROLL_CHANGEANNOUNCE")):GetName().."EditBox"):SetText(TitanGetVar(TITAN_ROLL_ID, "AnnouncePattern")) end function TitanPanelRollButton_SetListLength() local i; local length = this.value; TitanSetVar(TITAN_ROLL_ID, "ListLength", length); if (TitanRollsCount) and (TitanRollsCount > length) then for i = length+1, TitanRollsCount do TitanRolls[i] = nil; end TitanRollsCount = length; end if (TimedOut > length) then TimedOut = length; end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); end function TitanPanelRollButton_SetTimeout() TitanSetVar(TITAN_ROLL_ID, "Timeout", TITANROLL_TIMEOUTS[this.value]); if (TitanRollsCount) then TimedOut = TitanRollsCount; else TimedOut = 0; end TitanPanelButton_UpdateButton(TITAN_ROLL_ID); TitanPanelButton_UpdateTooltip(); end function TitanPanelRightClickMenu_PrepareRollMenu() local i; if (UIDROPDOWNMENU_MENU_LEVEL == 1) then TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_ROLL_ID].menuText); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGWINNER, TITAN_ROLL_ID, "ShowWinner"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGREPLACE, TITAN_ROLL_ID, "ReplaceBadRolls"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGIGNOREMUL, TITAN_ROLL_ID, "IgnoreMultiRoll"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGSORTLIST, TITAN_ROLL_ID, "SortList"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGGROUPACC, TITAN_ROLL_ID, "AcceptGroupOnly"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGHIGHLIGHT, TITAN_ROLL_ID, "HighlightParty"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGGOODWIN, TITAN_ROLL_ID, "OnlyGoodRollsWin"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGSHOWTIME, TITAN_ROLL_ID, "ShowTimeOut"); TitanPanelRightClickMenu_AddToggleVar(TITANROLL_TOGERASETO, TITAN_ROLL_ID, "EraseTimedOutRolls"); info = {}; info.text = TITANROLL_CHANGELENGTH; info.hasArrow = 1; UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL); info = {}; info.text = TITANROLL_SETTIMEOUT; info.hasArrow = 1; UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(TITANROLL_PERFORMED, TITAN_ROLL_ID, "TitanPanelRollButton_ChangeAction"); TitanPanelRightClickMenu_AddCommand(TITANROLL_ANNOUNCE, TITAN_ROLL_ID, "TitanPanelRollButton_ChangeAnnounce"); TitanPanelRightClickMenu_AddCommand(TITANROLL_ERASELIST, TITAN_ROLL_ID, "TitanPanelRollButton_ResetSession"); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleIcon(TITAN_ROLL_ID); TitanPanelRightClickMenu_AddToggleLabelText(TITAN_ROLL_ID); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_ROLL_ID, TITAN_PANEL_MENU_FUNC_HIDE); elseif (UIDROPDOWNMENU_MENU_LEVEL == 2) then if (UIDROPDOWNMENU_MENU_VALUE == TITANROLL_CHANGELENGTH) then TitanPanelRightClickMenu_AddTitle(TITANROLL_CHANGELENGTH, UIDROPDOWNMENU_MENU_LEVEL); for i = 5, 40, 5 do info = {}; info.text = i; info.func = TitanPanelRollButton_SetListLength; info.checked = (i == TitanGetVar(TITAN_ROLL_ID, "ListLength")) info.value = i; UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL); end elseif (UIDROPDOWNMENU_MENU_VALUE == TITANROLL_SETTIMEOUT) then TitanPanelRightClickMenu_AddTitle(TITANROLL_SETTIMEOUT, UIDROPDOWNMENU_MENU_LEVEL); for i = 1, 7 do info = {} info.text = TITANROLL_TIMEOUTS_TEXT[i]; info.func = TitanPanelRollButton_SetTimeout; info.checked = (TITANROLL_TIMEOUTS[i] == TitanGetVar(TITAN_ROLL_ID, "Timeout")) info.value = i; UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL); end end end end