-- MobileBank v0.36 ---------------------------- -- Список команд: -- /mb cls - очистить собраные данные -- /mb hide/show - скрыть/показать главную панель -- /mb p - Показать банк игрока -- /mb g - Показать банки гильдий -- /mb i - Показать инвентари персонажей ---------------------------- MB = {} MB.version=0.36 MB.dataDefaultItems = { Guilds={}, Chars={} } for i=1,GetNumGuilds() do MB.dataDefaultItems.Guilds[GetGuildName(i)]={} end MB.dataDefaultParams = { MBUI_Menu = {10,10}, MBUI_Container = {530,380} } MB.UI_Movable=false MB.AddonReady=false MB.TempData={} MB.GCountOnUpdateTimer=0 MB.GuildBankIdToPrepare=1 MB.Debug=false MB.PreviousButtonClicked=nil MB.LastButtonClicked=nil MB.CharsName=nil MB.GuildsName=nil MB.FilterChildrens=nil MB.CurrentFilterType="All" local function debug(text) if MB.Debug then d(text) end end function MB.OnLoad(eventCode, addOnName) if (addOnName ~= "MobileBank" ) then return end --добавляем команду SLASH_COMMANDS["/mb"] = MB.commandHandler --Регистрация эвентов EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_OPEN_BANK, MB.PL_Opened) EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_CLOSE_BANK, MB.PL_Closed) EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_OPEN_GUILD_BANK, MB.GB_Opened) EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_GUILD_BANK_ITEMS_READY, MB.GB_Ready) -- Сохранение лута EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_LOOT_RECEIVED, MB.SavePlayerInvent) --Загрузка сохраненных переменных MB.items= ZO_SavedVars:NewAccountWide( "MB_SavedVars" , 2, "Items" , MB.dataDefaultItems, nil ) MB.params= ZO_SavedVars:New( "MB_SavedVars" , 2, "Params" , MB.dataDefaultParams, nil ) thisCharName=GetUnitName("player") MB.items.Chars[thisCharName]={} MB.CharsName={} for k,v in pairs(MB.items.Chars) do MB.CharsName[#MB.CharsName+1]=k end MB.GuildsName={} for k,v in pairs(MB.items.Guilds) do MB.GuildsName[#MB.GuildsName+1]=k end -- Обновляем лут MB.SavePlayerInvent() --Инициализация графического интерфейся MB_UI = WINDOW_MANAGER:GetControlByName("MBUI") -- Создаем меню MB.CreateMenu() -- Создаем банк MB.CreateBank() MB.AddonReady=true end function MB.CreateMenu() MB_UI.Menu=WINDOW_MANAGER:CreateControl("MBUI_Menu",MBUI,CT_CONTROL) MB_UI.Menu.BG = WINDOW_MANAGER:CreateControl("MBUI_Menu_BG",MBUI_Menu,CT_BACKDROP) MB_UI.Menu.Title = WINDOW_MANAGER:CreateControl("MBUI_Menu_Title",MBUI_Menu,CT_LABEL) MB_UI.Menu.Button={} MB_UI.Menu.Button.Guild = WINDOW_MANAGER:CreateControl("MBUI_Menu_Button_Guild",MBUI_Menu,CT_BUTTON) MB_UI.Menu.Button.Bank = WINDOW_MANAGER:CreateControl("MBUI_Menu_Button_Bank",MBUI_Menu,CT_BUTTON) MB_UI.Menu.Button.Invent = WINDOW_MANAGER:CreateControl("MBUI_Menu_Button_Invent",MBUI_Menu,CT_BUTTON) -- MB_UI.Menu.Button.Move = WINDOW_MANAGER:CreateControl("MBUI_Menu_Button_Move",MBUI_Menu,CT_BUTTON) --Обработчики событий -- Клик по гильдии MB_UI.Menu.Button.Guild:SetHandler("OnClicked" , function(self) local bool = not(MBUI_Container:IsHidden()) MB.PreviousButtonClicked=MB.LastButtonClicked MB.LastButtonClicked="Guild" MB.CurrentLastValue=11 MB.PrepareBankValues("Guild",1) -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MB.HideContainer(bool) end ) -- Клик по банку MB_UI.Menu.Button.Bank:SetHandler( "OnClicked" , function(self) local bool = not(MBUI_Container:IsHidden()) MB.PreviousButtonClicked=MB.LastButtonClicked MB.LastButtonClicked="Bank" MB.CurrentLastValue=11 MB.PrepareBankValues("Bank") -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MB.HideContainer(bool) end ) -- Клик по инвентарю MB_UI.Menu.Button.Invent:SetHandler( "OnClicked" , function(self) local bool = not(MBUI_Container:IsHidden()) MB.PreviousButtonClicked=MB.LastButtonClicked MB.LastButtonClicked="Invent" MB.CurrentLastValue=11 MB.PrepareBankValues("Invent",1) -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MB.HideContainer(bool) end ) MBUI_Menu:SetHandler("OnMouseUp" , function(self) MB.MouseUp(self) end) MBUI_Container:SetHandler("OnMouseUp" , function(self) MB.MouseUp(self) end) --Настройки меню MB_UI.Menu:SetAnchor(TOPLEFT,MBUI,TOPLEFT,MB.params.MBUI_Menu[1],MB.params.MBUI_Menu[2]) MB_UI.Menu:SetDimensions(200,45) MB_UI.Menu:SetMouseEnabled(true) MB_UI.Menu:SetMovable(true) --Фон MB_UI.Menu.BG:SetAnchor(CENTER,MBUI_Menu,CENTER,0,0) MB_UI.Menu.BG:SetDimensions(200,40) MB_UI.Menu.BG:SetCenterColor(0,0,0,1) MB_UI.Menu.BG:SetEdgeColor(0,0,0,0) MB_UI.Menu.BG:SetAlpha(0.5) --Заголовок MB_UI.Menu.Title:SetAnchor(CENTER,MBUI_Menu,TOP,0,13) MB_UI.Menu.Title:SetFont("ZoFontGame" ) MB_UI.Menu.Title:SetColor(255,255,255,1.5) MB_UI.Menu.Title:SetText( "|cff8000Mobile Bank|" ) -- Кнопка "Гильдия" MB_UI.Menu.Button.Guild:SetAnchor(BOTTOMLEFT,MBUI_Menu,BOTTOMLEFT,0,0) MB_UI.Menu.Button.Guild:SetText("[Guild]") MB_UI.Menu.Button.Guild:SetDimensions(70,25) MB_UI.Menu.Button.Guild:SetFont("ZoFontGameBold") MB_UI.Menu.Button.Guild:SetNormalFontColor(0,255,255,.7) MB_UI.Menu.Button.Guild:SetMouseOverFontColor(0.8,0.4,0,1) -- Кнопка "Банк" MB_UI.Menu.Button.Bank:SetAnchor(BOTTOM,MBUI_Menu,BOTTOM,0,0) MB_UI.Menu.Button.Bank:SetText("[Bank]") MB_UI.Menu.Button.Bank:SetDimensions(70,25) MB_UI.Menu.Button.Bank:SetFont("ZoFontGameBold") MB_UI.Menu.Button.Bank:SetNormalFontColor(0,255,255,.7) MB_UI.Menu.Button.Bank:SetMouseOverFontColor(0.8,0.4,0,1) -- Кнопка "Инвентарь" MB_UI.Menu.Button.Invent:SetAnchor(BOTTOMRIGHT,MBUI_Menu,BOTTOMRIGHT,0,0) MB_UI.Menu.Button.Invent:SetText("[Invent]") MB_UI.Menu.Button.Invent:SetDimensions(70,25) MB_UI.Menu.Button.Invent:SetFont("ZoFontGameBold") MB_UI.Menu.Button.Invent:SetNormalFontColor(0,255,255,.7) MB_UI.Menu.Button.Invent:SetMouseOverFontColor(0.8,0.4,0,1) end function MB.CreateBank() local OldAnchor=false -- Настройки контейнера MBUI_Container:SetAnchor(TOPLEFT,GuiRoot,TOPLEFT,MB.params.MBUI_Container[1],MB.params.MBUI_Container[2]) MBUI_Container:SetMovable(true) -- Правим Слайдер MBUI_ContainerSlider:SetValue(11) -- Создаем кнопки для переключения между гильдбанками local nextXstep=0 for i=1,#MB.GuildsName do local guildname=tostring(MB.GuildsName[i]) WINDOW_MANAGER:CreateControl("MBUI_ContainerTitleGuildButton"..i,MBUI_ContainerTitle,CT_BUTTON) _G["MBUI_ContainerTitleGuildButton"..i]:SetParent(MBUI_ContainerTitleGuildButtons) _G["MBUI_ContainerTitleGuildButton"..i]:SetFont("ZoFontGame" ) nextXstep=(MBUI_Container:GetWidth()/#MB.GuildsName*i) _G["MBUI_ContainerTitleGuildButton"..i]:SetDimensions(MBUI_Container:GetWidth()/#MB.GuildsName,20) -- Делаем поправку на ширину самой кнопки _G["MBUI_ContainerTitleGuildButton"..i]:SetAnchor(TOP,MBUI_Container,TOPLEFT,nextXstep-_G["MBUI_ContainerTitleGuildButton"..i]:GetWidth()/2,40) _G["MBUI_ContainerTitleGuildButton"..i]:SetText("["..guildname.."]") _G["MBUI_ContainerTitleGuildButton"..i]:SetNormalFontColor(0,255,255,.7) _G["MBUI_ContainerTitleGuildButton"..i]:SetMouseOverFontColor(0.8,0.4,0,1) _G["MBUI_ContainerTitleGuildButton"..i]:SetHandler( "OnClicked" , function(self) MB.PrepareBankValues("Guild",i) MB.SortPreparedValues() -- MB.FillBank(11,MB.BankValueTable) MB.FilterBank(11,MB.CurrentFilterType) end) end -- Создаем кнопки для переключения между Игроками local nextXstep=0 for i=1,#MB.CharsName do local charname=tostring(MB.CharsName[i]) WINDOW_MANAGER:CreateControl("MBUI_ContainerTitleInventButton"..i,MBUI_ContainerTitle,CT_BUTTON) _G["MBUI_ContainerTitleInventButton"..i]:SetParent(MBUI_ContainerTitleInventButtons) _G["MBUI_ContainerTitleInventButton"..i]:SetFont("ZoFontGame" ) nextXstep=(MBUI_Container:GetWidth()/#MB.CharsName*i) _G["MBUI_ContainerTitleInventButton"..i]:SetDimensions(MBUI_Container:GetWidth()/#MB.CharsName,20) -- Делаем поправку на ширину самой кнопки _G["MBUI_ContainerTitleInventButton"..i]:SetAnchor(TOP,MBUI_Container,TOPLEFT,nextXstep-_G["MBUI_ContainerTitleInventButton"..i]:GetWidth()/2,40) _G["MBUI_ContainerTitleInventButton"..i]:SetText("["..charname.."]") _G["MBUI_ContainerTitleInventButton"..i]:SetNormalFontColor(0,255,255,.7) _G["MBUI_ContainerTitleInventButton"..i]:SetMouseOverFontColor(0.8,0.4,0,1) _G["MBUI_ContainerTitleInventButton"..i]:SetHandler( "OnClicked" , function(self) MB.PrepareBankValues("Invent",i) MB.SortPreparedValues() -- MB.FillBank(11,MB.BankValueTable) MB.FilterBank(11,MB.CurrentFilterType) end) end -- Правим строки (созданы из xml) for i = 1, 11 do local dynamicControl = CreateControlFromVirtual("MBUI_Row", MBUI_Container, "TemplateRow",i) -- Строка local fromtop=150 _G["MBUI_Row"..i]:SetAnchor(TOP,MBUI_Container,TOP,0,fromtop+52*(i-1)) -- _G["MBUI_Row"..i]:SetDimensions (530,52) -- Анимация _G["MBUI_Row"..i.."IconTimeline"]=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_IconAnimation",_G["MBUI_Row"..i.."ButtonIcon"]) -- _G["MBUI_Row"..i.."CountTimeline"]=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_IconAnimation",_G["MBUI_Row"..i.."ButtonStackCount"]) end end function MB.PrepareBankValues(PrepareType,IdToPrepare) MB.GuildBankIdToPrepare=GuildBankIdToPrepare MB.BankValueTable={} if PrepareType=="Bank" then debug("Preparing Player values") bagIcon, bagSlots=GetBagInfo(BAG_BANK) MB.ItemCounter=0 while (MB.ItemCounter < bagSlots) do if GetItemName(BAG_BANK,MB.ItemCounter)~="" then --Избавляемся от мусора при сохранении local name = zo_strformat(SI_TOOLTIP_ITEM_NAME, GetItemName(BAG_BANK, MB.ItemCounter)) local link = GetItemLink(BAG_BANK,MB.ItemCounter) clearlink =string.gsub(link, "|h.+|h", "|h"..tostring(name).."|h") local stackCount = GetSlotStackSize(BAG_BANK,MB.ItemCounter) local statValue = GetItemStatValue(BAG_BANK,MB.ItemCounter) local icon, stack, sellPrice, meetsUsageRequirement, locked, equipType, itemStyle, quality = GetItemInfo(BAG_BANK,MB.ItemCounter) local ItemType=GetItemType(BAG_BANK,MB.ItemCounter) MB.BankValueTable[#MB.BankValueTable+1]={ ["ItemLink"]=tostring(clearlink), ["icon"] = tostring(icon), ["ItemName"]=tostring(name), ["stackCount"]=stackCount, ["StatValue"]=statValue, ["sellPrice"] = sellPrice, ["quality"] = quality, ["meetsUsageRequirement"]=meetsUsageRequirement, ["ItemType"]=ItemType } end MB.ItemCounter=MB.ItemCounter+1 end MB.BankValueTable.CurSlots=#MB.BankValueTable MB.BankValueTable.MaxSlots=bagSlots MBUI_ContainerTitleInventButtons:SetHidden(true) MBUI_ContainerTitleGuildButtons:SetHidden(true) elseif PrepareType=="Invent" then debug("Preparing Inventory values") local LoadingCharName=MB.CharsName[IdToPrepare] MB.BankValueTable=MB.items.Chars[LoadingCharName] MBUI_ContainerTitleInventButtons:SetHidden(false) MBUI_ContainerTitleGuildButtons:SetHidden(true) elseif PrepareType=="Guild" then bagIcon, bagSlots=GetBagInfo(BAG_GUILDBANK) debug("Preparing Guild values") local guildname=tostring(MB.GuildsName[IdToPrepare]) MB.BankValueTable=MB.items.Guilds[guildname] MBUI_ContainerTitleInventButtons:SetHidden(true) MBUI_ContainerTitleGuildButtons:SetHidden(false) else debug("Unknown prepare type: "..tostring(PrepareType)) end MBUI_ContainerSlider:SetHandler("OnValueChanged",function(self, value, eventReason) -- MB.FillBank(value,MB.BankValueTable) MB.FilterBank(value,MB.CurrentFilterType) end) MB.SortPreparedValues() return MB.BankValueTable end -- Инициализация фильтов function MB.FilterInit(self) MB.FilterChildrens={} for i=1,self:GetNumChildren() do MB.FilterChildrens[i]=self:GetChild(i) end -- Анимация for k,v in pairs(MB.FilterChildrens) do v.NormalAnimation=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_FilterAnimation",_G[tostring(v:GetName().."TextureNormal")]) v.HighlightAnimation=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_FilterAnimation",_G[tostring(v:GetName().."TextureHighlight")]) v.PressedAnimation=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_FilterAnimation",_G[tostring(v:GetName().."TexturePressed")]) end MBUI_ContainerTitleFilterAll.PressedAnimation:PlayInstantlyToEnd() MBUI_ContainerTitleFilterAllTexturePressed:SetAlpha(1) end function MB.FilterEnter(self) _G[tostring(self:GetName().."TextureHighlight")]:SetAlpha(0.75) self.NormalAnimation:PlayFromStart() self.HighlightAnimation:PlayFromStart() end function MB.FilterExit(self) _G[tostring(self:GetName().."TextureHighlight")]:SetAlpha(0) self.NormalAnimation:PlayFromEnd() self.HighlightAnimation:PlayFromEnd() end function MB.FilterClicked(self,filtertype) MB.FilterBank(11,filtertype) MBUI_ContainerSlider:SetValue(11) for k,v in pairs(MB.FilterChildrens) do _G[v:GetName().."TexturePressed"]:SetAlpha(0) end _G[self:GetName().."TexturePressed"]:SetAlpha(1) self.PressedAnimation:PlayInstantlyToEnd() end -- Типы фильтров: -- All, Weapon, Apparel,Consumable, Materials,Miscellaceous,Junk -- Не знаю что это за типы. -- ["ITEMTYPE_NONE"] = 0 -- ["ITEMTYPE_PLUG"] = 3 -- ["ITEMTYPE_TABARD"] = 15 function MB.FilterBank(position,FilterType) local texture='/esoui/art/miscellaneous/scrollbox_elevator.dds' if not position then position=11 end MB.BankValueTableFiltered={} Weapon={ ITEMTYPE_WEAPON } Apparel={ ITEMTYPE_ARMOR,ITEMTYPE_DISGUISE,ITEMTYPE_COSTUME } Consumable={ ITEMTYPE_POTION,ITEMTYPE_RECIPE,ITEMTYPE_FOOD,ITEMTYPE_DRINK,ITEMTYPE_CONTAINER,ITEMTYPE_POISON } Materials={ ITEMTYPE_ALCHEMY_BASE,ITEMTYPE_BLACKSMITHING_MATERIAL,ITEMTYPE_BLACKSMITHING_RAW_MATERIAL,ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_RAW_MATERIAL,ITEMTYPE_ENCHANTING_RUNE,ITEMTYPE_INGREDIENT,ITEMTYPE_RAW_MATERIAL,ITEMTYPE_REAGENT, ITEMTYPE_STYLE_MATERIAL,ITEMTYPE_WEAPON_TRAIT,ITEMTYPE_WOODWORKING_MATERIAL,ITEMTYPE_WOODWORKING_RAW_MATERIAL,ITEMTYPE_ARMOR_TRAIT, ITEMTYPE_SPICE,ITEMTYPE_FLAVORING,ITEMTYPE_ADDITIVE,ITEMTYPE_ARMOR_BOOSTER,ITEMTYPE_BLACKSMITHING_BOOSTER,ITEMTYPE_ENCHANTMENT_BOOSTER, ITEMTYPE_WEAPON_BOOSTER,ITEMTYPE_WOODWORKING_BOOSTER,ITEMTYPE_CLOTHIER_BOOSTER } Miscellaceous={ ITEMTYPE_SCROLL,ITEMTYPE_TROPHY,ITEMTYPE_TOOL,ITEMTYPE_SOUL_GEM,ITEMTYPE_SIEGE,ITEMTYPE_LOCKPICK,ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY,ITEMTYPE_GLYPH_WEAPON,ITEMTYPE_AVA_REPAIR,ITEMTYPE_COLLECTIBLE,ITEMTYPE_LURE } Junk={ ITEMTYPE_TRASH,ITEMTYPE_NONE,ITEMTYPE_PLUG,ITEMTYPE_TABARD, } if FilterType=="Weapon" or FilterType=="Apparel" or FilterType=="Consumable" or FilterType=="Materials" or FilterType=="Miscellaceous" or FilterType=="Junk" then MB.CurrentFilterType=FilterType for k,v in pairs(MB.BankValueTable) do for k1,v1 in pairs(_G[FilterType]) do if type(v)=="table" then if v.ItemType==v1 then debug(v.ItemName.." is "..tostring(FilterType)) MB.BankValueTableFiltered[#MB.BankValueTableFiltered+1]=v end end end end MB.FillBank(position,MB.BankValueTableFiltered) if #MB.BankValueTableFiltered>11 then MBUI_ContainerSlider:SetMinMax(11,#MB.BankValueTableFiltered) MBUI_ContainerSlider:SetThumbTexture(texture, texture, texture, 18, (1/#MB.BankValueTableFiltered*25000)/3, 0, 0, 1, 1) MBUI_ContainerSlider:SetHidden(false) else MBUI_ContainerSlider:SetHidden(true) end elseif FilterType=="All" then MB.CurrentFilterType=FilterType MB.FillBank(position,MB.BankValueTable) if #MB.BankValueTable>11 then MBUI_ContainerSlider:SetMinMax(11,#MB.BankValueTable) MBUI_ContainerSlider:SetThumbTexture(texture, texture, texture, 18, (1/#MB.BankValueTable*25000)/3, 0, 0, 1, 1) MBUI_ContainerSlider:SetHidden(false) else MBUI_ContainerSlider:SetHidden(true) end else d("No such FilterType: "..tostring(FilterType)) MB.FillBank(position,MB.BankValueTable) if #MB.BankValueTable>11 then MBUI_ContainerSlider:SetMinMax(11,#MB.BankValueTable) MBUI_ContainerSlider:SetThumbTexture(texture, texture, texture, 18, (1/#MB.BankValueTable*25000)/3, 0, 0, 1, 1) MBUI_ContainerSlider:SetHidden(false) else MBUI_ContainerSlider:SetHidden(true) end end end -- сортировка таблицы function MB.SortPreparedValues() function compare(a,b) return a["ItemName"]<b["ItemName"] end table.sort(MB.BankValueTable,compare) end -- Заполнение банка function MB.FillBank(last,TableToFillFrom) -- Технические функции -- Функции отображения и сокрытия тултипов при наведении мышки function MB.TooltipEnter(self) -- Тут может быть любой другой якорь. Нам важен его родитель ItemTooltip:ClearAnchors() ItemTooltip:ClearLines() if self:GetLeft()>=480 then ItemTooltip:SetAnchor(CENTER,self,CENTER,-480,0) else ItemTooltip:SetAnchor(CENTER,self,CENTER,500,0) end ItemTooltip:SetLink(TableToFillFrom[self.id].ItemLink) -- Сравнительный тултип if self.ItemType==ITEMTYPE_WEAPON or self.ItemType==ITEMTYPE_ARMOR then -- Броня в банке ItemTooltip:ClearAnchors() ComparativeTooltip1:ClearAnchors() if self:GetLeft()>=480 then ItemTooltip:SetAnchor(TOP,self,CENTER,-480,0) ComparativeTooltip1:SetAnchor(BOTTOM,self,CENTER,-480,0) else ItemTooltip:SetAnchor(TOP,self,CENTER,500,0) ComparativeTooltip1:SetAnchor(BOTTOM,self,CENTER,500,0) end ComparativeTooltip1:SetAlpha(1) ComparativeTooltip1:SetHidden(false) ItemTooltip:ShowComparativeTooltips() end ItemTooltip:SetAlpha(1) ItemTooltip:SetHidden(false) _G[tostring(self:GetName().."Highlight")]:SetAlpha(1) self.IconTimeline=ANIMATION_MANAGER:CreateTimelineFromVirtual("MBUI_IconAnimation",_G[tostring(self:GetName().."ButtonIcon")]) self.IconTimeline:PlayFromStart() end function MB.TooltipExit(self) ItemTooltip:ClearAnchors() ItemTooltip:ClearLines() ItemTooltip:SetAlpha(0) ItemTooltip:SetHidden(true) _G[tostring(self:GetName().."Highlight")]:SetAlpha(0) self.IconTimeline:PlayFromEnd() -- Сравнительный тултип if self.ItemType==ITEMTYPE_WEAPON or self.ItemType==ITEMTYPE_ARMOR then ComparativeTooltip1:ClearAnchors() ItemTooltip:HideComparativeTooltips() end end -- Функция прокрутки колёсиком function MB.MoveScrollerWheel(self,delta) local calculatedvalue=MB.CurrentLastValue-delta if (calculatedvalue>=11) and (calculatedvalue<=#TableToFillFrom) then -- MB.FillBank(calculatedvalue,MB.BankValueTable) MB.FilterBank(calculatedvalue,MB.CurrentFilterType) MBUI_ContainerSlider:SetValue(calculatedvalue) end end if not TableToFillFrom then d("Wrong TableToFillFrom") return end if last<=1 then debug("last<=1") return end if (#TableToFillFrom==0) then d("No data avaliable.") MBUI_ContainerItemCounter:SetHidden(true) MBUI_ContainerSlider:SetHidden(true) MB.HideContainer(true) for i=1,11 do _G["MBUI_Row"..i]:SetHidden(true) end return elseif last>1 and last<=11 then for i=1,11 do _G["MBUI_Row"..i]:SetHidden(false) end else for i=1,11 do _G["MBUI_Row"..i]:SetHidden(false) end end MB.CurrentLastValue=last if #TableToFillFrom<11 then -- Прячем Слайдер MBUI_ContainerSlider:SetHidden(true) -- Заполнение идёт сверху for i=1,#TableToFillFrom do local icon,sellPrice,meetsUsageRequirement,equipType,itemStyle = GetItemLinkInfo(TableToFillFrom[i].ItemLink) _G["MBUI_Row"..i].id=i _G["MBUI_Row"..i].ItemType=TableToFillFrom[i].ItemType _G["MBUI_Row"..i.."ButtonIcon"]:SetTexture(TableToFillFrom[i].icon) if not TableToFillFrom[i].meetsUsageRequirement then _G["MBUI_Row"..i.."ButtonIcon"]:SetColor(1,0,0,1) else _G["MBUI_Row"..i.."ButtonIcon"]:SetColor(1,1,1,1) end _G["MBUI_Row"..i.."ButtonStackCount"]:SetText(TableToFillFrom[i].stackCount) _G["MBUI_Row"..i.."Name"]:SetText(TableToFillFrom[i].ItemLink) if (TableToFillFrom[i].statValue~=0) then _G["MBUI_Row"..i.."StatValue"]:SetText(TableToFillFrom[i].statValue) else _G["MBUI_Row"..i.."StatValue"]:SetText("-") end _G["MBUI_Row"..i.."SellPrice"]:SetText(TableToFillFrom[i].stackCount*sellPrice.."|t24:24:EsoUI/Art/currency/currency_gold.dds|t") _G["MBUI_Row"..i]:SetHandler("OnMouseUp", function(self,button) if button~=2 then return end ZO_ChatWindowTextEntryEditBox:SetText(tostring(ZO_ChatWindowTextEntryEditBox:GetText()).."["..TableToFillFrom[i].ItemLink.."]") end) end -- Прячем пустые строки for i=#TableToFillFrom+1,11 do _G["MBUI_Row"..i]:SetHidden(true) end -- Заполняем вместимость банка local CurBankCapacity = TableToFillFrom.CurSlots or #TableToFillFrom local BankMaxCapacity = TableToFillFrom.MaxSlots or bagSlots MBUI_ContainerItemCounter:SetText("Bank: "..CurBankCapacity.." / "..BankMaxCapacity) MBUI_ContainerItemCounter:SetHidden(false) else -- Показываем слайдер MBUI_ContainerSlider:SetHidden(false) -- Заполнение идёт снизу for i=11,1,-1 do debug("last: "..tostring(last)) local icon,sellPrice,meetsUsageRequirement,equipType,itemStyle = GetItemLinkInfo(TableToFillFrom[last].ItemLink) _G["MBUI_Row"..i].id=last _G["MBUI_Row"..i].ItemType=TableToFillFrom[last].ItemType _G["MBUI_Row"..i.."ButtonIcon"]:SetTexture(TableToFillFrom[last].icon) if not TableToFillFrom[last].meetsUsageRequirement then _G["MBUI_Row"..i.."ButtonIcon"]:SetColor(1,0,0,1) else _G["MBUI_Row"..i.."ButtonIcon"]:SetColor(1,1,1,1) end _G["MBUI_Row"..i.."ButtonStackCount"]:SetText(TableToFillFrom[last].stackCount) _G["MBUI_Row"..i.."Name"]:SetText(TableToFillFrom[last].ItemLink) if (TableToFillFrom[last].statValue~=0) then _G["MBUI_Row"..i.."StatValue"]:SetText(TableToFillFrom[last].statValue) else _G["MBUI_Row"..i.."StatValue"]:SetText("-") end _G["MBUI_Row"..i.."SellPrice"]:SetText(TableToFillFrom[last].stackCount*sellPrice.."|t20:20:EsoUI/Art/currency/currency_gold.dds|t") _G["MBUI_Row"..i]:SetHandler("OnMouseUp", function(self,button) if button~=2 then return end ZO_ChatWindowTextEntryEditBox:SetText(tostring(ZO_ChatWindowTextEntryEditBox:GetText()).."["..TableToFillFrom[self.id].ItemLink.."]") end) if last<=#TableToFillFrom and last>1 then last=last-1 else last=11 end end -- Заполняем вместимость банка local CurBankCapacity = TableToFillFrom.CurSlots or #TableToFillFrom local BankMaxCapacity = TableToFillFrom.MaxSlots or bagSlots MBUI_ContainerItemCounter:SetText("Bank: "..CurBankCapacity.." / "..BankMaxCapacity) MBUI_ContainerItemCounter:SetHidden(false) end end function MB.PL_Opened() debug("Event PL_Opened fired") end function MB.PL_Closed() debug("Event PL_Closed fired") end function MB.GB_Opened() debug("Event GB_Opened fired") end function MB.GB_Ready() debug("Event GB_Ready fired") MB.gcount() end function MB.commandHandler( text ) if text=="cls" then MB.items.Guilds={} MB.items.Chars={} MB.params.MBUI_Menu=nil MB.params.MBUI_Container=nil ReloadUI() elseif text=="hide" then MB.params.hidden=true MBUI_Menu:SetHidden(true) elseif text=="show" then MB.params.hidden=false MBUI_Menu:SetHidden(false) elseif text=="p" then MB.CurrentLastValue=11 MB.PrepareBankValues("Bank") -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MBUI_Container:SetHidden(false) MB.PreviousButtonClicked=nil MB.LastButtonClicked=nil elseif text=="i" then MB.CurrentLastValue=11 MB.PrepareBankValues("Invent",1) -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MBUI_Container:SetHidden(false) MB.PreviousButtonClicked=nil MB.LastButtonClicked=nil elseif text=="g" then MB.CurrentLastValue=11 MB.PrepareBankValues("Guild",1) -- MB.FillBank(MB.CurrentLastValue,MB.BankValueTable) MB.FilterBank(MB.CurrentLastValue,MB.CurrentFilterType) MBUI_Container:SetHidden(false) MB.PreviousButtonClicked=nil MB.LastButtonClicked=nil else d("/mb hide - hide main window") d("/mb show - show main window") d("/mb p - show player bank") d("/mb g - show guild bank") d("/mb i - show chars inventories") d("/mb cls - clear all data and reloadui") end end function MB.gcount() MB.GCountOnUpdateTimer=GetGameTimeMilliseconds() MB.GCountOnUpdateReady=true end function MB.MouseUp(self) local name = self:GetName() local left = self:GetLeft() local top = self:GetTop() if name=="MBUI_Menu" then debug("Menu saved") MB.params.MBUI_Menu={left,top} elseif name=="MBUI_Container" then debug("Container saved") MB.params.MBUI_Container={left,top} else debug("Unknown window") end end function MB.SavePlayerInvent() bagIcon, bagSlots=GetBagInfo(BAG_BACKPACK) MB.ItemCounter=0 debug("ThisCharName: "..tostring(thisCharName)) debug("Items in Table Chars:"..tostring(#MB.items.Chars[thisCharName])) MB.items.Chars[thisCharName]={} debug("Items in Table Chars after clean:"..tostring(#MB.items.Chars[thisCharName])) while (MB.ItemCounter < bagSlots) do if GetItemName(BAG_BACKPACK,MB.ItemCounter)~="" then --Избавляемся от мусора при сохранении name = zo_strformat(SI_TOOLTIP_ITEM_NAME, GetItemName(BAG_BACKPACK, MB.ItemCounter)) link = GetItemLink(BAG_BACKPACK,MB.ItemCounter) clearlink =string.gsub(link, "|h.+|h", "|h"..tostring(name).."|h") stackCount = GetSlotStackSize(BAG_BACKPACK,MB.ItemCounter) statValue = GetItemStatValue(BAG_BACKPACK,MB.ItemCounter) icon, stack, sellPrice, meetsUsageRequirement, locked, equipType, itemStyle, quality = GetItemInfo(BAG_BACKPACK,MB.ItemCounter) ItemType=GetItemType(BAG_BACKPACK,MB.ItemCounter) start,finish=string.find(link, "%d+") id=tonumber(string.sub(link,start,finish)) MB.items.Chars[thisCharName][#MB.items.Chars[thisCharName]+1]={ ["ItemLink"]=tostring(clearlink), ["icon"] = tostring(icon), ["ItemName"]=tostring(name), ["stackCount"]=stackCount, ["StatValue"]=statValue, ["sellPrice"] = sellPrice, ["quality"] = quality, ["meetsUsageRequirement"]=meetsUsageRequirement, ["ItemType"]=ItemType, ["Id"]=id } end MB.ItemCounter=MB.ItemCounter+1 end local itemsToCheck=bagSlots while not CheckInventorySpaceSilently(itemsToCheck) do itemsToCheck=itemsToCheck-1 end MB.items.Chars[thisCharName].CurSlots=bagSlots-itemsToCheck MB.items.Chars[thisCharName].MaxSlots=bagSlots end function MB.Update(self) if (not MB.AddonReady) then return end local EscMenuHidden = ZO_GameMenu_InGame:IsHidden() local interactHidden = ZO_InteractWindow:IsHidden() if (EscMenuHidden == false) then MBUI_Container:SetHidden(true) MBUI_Menu:SetHidden(true) elseif (interactHidden == false) then MBUI_Container:SetHidden(true) MBUI_Menu:SetHidden(true) elseif (MB.params.hidden==false) then MBUI_Menu:SetHidden(false) elseif (MB.params.hidden==true) then MBUI_Menu:SetHidden(true) end --Хак на проверку инвентаря спустя Х сек после первого срабатывания эвента if MB.GCountOnUpdateReady and (GetGameTimeMilliseconds()-MB.GCountOnUpdateTimer>=1000) then MB.GCountOnUpdateReady=false local guildbankid=GetSelectedGuildBankId() or 0 local guildname=tostring(GetGuildName(guildbankid)) or 0 if guildname=="" then d("Cannot save variables. Try again.") return end MB.items.Guilds[guildname]={} d("Data saved for "..guildname) bagIcon, bagSlots=GetBagInfo(BAG_GUILDBANK) local sv = MB.items.Guilds[guildname] for i=1, #ZO_GuildBankBackpack.data do slotIndex=ZO_GuildBankBackpack.data[i].data.slotIndex link = GetItemLink(BAG_GUILDBANK,slotIndex) iconFile=ZO_GuildBankBackpack.data[i].data.iconFile name=ZO_GuildBankBackpack.data[i].data.name stackCount=ZO_GuildBankBackpack.data[i].data.stackCount statValue=ZO_GuildBankBackpack.data[i].data.statValue sellPrice=ZO_GuildBankBackpack.data[i].data.sellPrice quality=ZO_GuildBankBackpack.data[i].data.quality meetsUsageRequirement=ZO_GuildBankBackpack.data[i].data.meetsUsageRequirement ItemType=GetItemType(BAG_GUILDBANK,slotIndex) clearlink =string.gsub(link, "|h.+|h", "|h"..tostring(name).."|h") start,finish=string.find(link, "%d+") id=tonumber(string.sub(link,start,finish)) sv[#sv+1] = { ["ItemLink"] = tostring(clearlink), ["icon"] = tostring(iconFile), ["ItemName"] = tostring(name), ["stackCount"] = stackCount, ["statValue"] = statValue, ["sellPrice"] = sellPrice, ["quality"] = quality, ["meetsUsageRequirement"]=meetsUsageRequirement, ["ItemType"]=ItemType, ["Id"]=id } sv.CurSlots=#ZO_GuildBankBackpack.data sv.MaxSlots=bagSlots end end end function MB.HideContainer(value) debug("StartPrevious:"..tostring(MB.PreviousButtonClicked)) debug("StartLast:"..tostring(MB.LastButtonClicked)) if MB.PreviousButtonClicked==MB.LastButtonClicked then MBUI_Container:SetHidden(true) MB.PreviousButtonClicked=nil MB.LastButtonClicked=nil else MBUI_Container:SetHidden(false) end debug("FinishPrevious:"..tostring(MB.PreviousButtonClicked)) debug("FinishLast:"..tostring(MB.LastButtonClicked)) end --Инициализация Аддона EVENT_MANAGER:RegisterForEvent("MobileBank", EVENT_ADD_ON_LOADED, MB.OnLoad)