Знает ли кто-нибудь, как реализовать следующее: что есть: когда идет инвайт на ТолБарад или ОЛО, то с заданной периодичностью (каждые несколько секунду) проигрывается мелодия в течение заданного кол-ва времени, т.е. мелодия проигрывается 4 раза в течение 20 сек что не так: если принять инвайт или закрыть окно инвайта в пределах 20 сек, то мелодия продолжает проигрываться что нужно: чтобы при принятии инвайта или при отклонении инвайта мелодия переставала проигрываться
Думал, что можно решить вопрос каким-нибудь эвентом с помощью /etrace, но фигня в том, что когда принимаешь инвайт и попадаешь в рейд, то все эвенты игры, предшествующие этому самому попаданию, пропадают, т.е. /etrace начинает писать эвенты заново с момента попадания в рейд.
16 фев 2012, 17:19
Отрицание
0
Вопросы по Lua, XML, WoW API.
Было-бы не плохо увидеть код, но есть пара идей:
За принятие/отклонение инвайта отвечает функция AcceptBattlefieldPort(index, accept)
Fired when the player enters the world, enters/leaves an instance, or respawns at a graveyard. Also fires any other time the player sees a loading screen.
To check if the player is entering an instance, check GetPlayerMapPosition to see if both X and Y are zero.
Correction on the above comment: When PLAYER_ENTERING_WORLD fires, you'll notice that WORLD_MAP_UPDATE fires just before it. My instincts tell that leaving an instance puts the player in void space momentarily. So for the case that you are entering AND leaving an instance, GetPlayerMapPosition always returns the coordinates [0,0] and hence there is no way to determine using the event PLAYER_ENTERING_WORLD if the player is entering an instance or not. When leaving an instance the following events fire (ignoring party/raid events).
WORLD_MAP_UPDATEPLAYER_ENTERING_WORLDWORLD_MAP_UPDATE <--- Player coordinates are non-zero here
Instances do have coordinates for units once the second WORLD_MAP_UPDATE event has fired. For the case of entering a battleground such as WSG, WORLD_MAP_UPDATE won't fire until you leave Silverwing Hold or Warsong Lumber Mill and you are outside.
И вопрос от меня, хочу написать аддон, который модифицировал экшенбары. Для этого мне нужно написать код который будет "перебирать" все существующие кнопки экшенбаров получая от каждой из них информацию о том:
Хватает-ли маны на абилку,
Если есть цель, то в зоне-ли действия абилки эта цель,
Кд абилки,
Выполнены-ли специфические условия для использования этой абилки.
Как правило большинство аддонов для каждого из этих состояний окрашивает кнопку специальным образом, а для абилок на кд - показывается кд. А я хочу, что-бы если любое из этих условий выполнено (то есть мы не можем использовать абилку по той или иной причине), то кнопка затенялась всегда одним и тем-же цветом. А в частном случае когда абилка на кд, это затенение не затрагивало само отображение кд, а просто под него подкладывалась еще дополнительная заливка затенения.
Есть идеи о том, как это делается?
18 фев 2012, 19:50
Отрицание
0
Вопросы по Lua, XML, WoW API.
А так-же нужно как-то научится управлять "загорающимися" абилками, которые такой двигающейся желтой рамкой подсвечиваются под проки, то есть что-бы она загоралась и тухла по моим командам, а не сама по себе.
19 фев 2012, 11:13
Killshot
0
Вопросы по Lua, XML, WoW API.
Отрицание писал(а):
А так-же нужно как-то научится управлять "загорающимися" абилками, которые такой двигающейся желтой рамкой подсвечиваются под проки, то есть что-бы она загоралась и тухла по моим командам, а не сама по себе.
Это относится к делу, но не управляет скрытием-показыванием, а запрашивает инфо о том играется-ли сейчас анимация.
Нашел в коде близзов функции запускающие и останавливающие анимацию для заданной кнопки:
Код
function ActionButton_ShowOverlayGlow(self) if ( self.overlay ) then if ( self.overlay.animOut:IsPlaying() ) then self.overlay.animOut:Stop(); self.overlay.animIn:Play(); end else self.overlay = ActionButton_GetOverlayGlow(); local frameWidth, frameHeight = self:GetSize(); self.overlay:SetParent(self); self.overlay:ClearAllPoints(); self.overlay:SetPoint("TOPLEFT", self, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2); self.overlay:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2); self.overlay.animIn:Play(); end end
function ActionButton_HideOverlayGlow(self) if ( self.overlay ) then if ( self.overlay.animIn:IsPlaying() ) then self.overlay.animIn:Stop(); end if ( self:IsVisible() ) then self.overlay.animOut:Play(); else ActionButton_OverlayGlowAnimOutFinished(self.overlay.animOut); --We aren't shown anyway, so we'll instantly hide it. end end end
Это будет "зажигать" те кнопки, над которыми находится курсор, в момент отправления этого скрипта в чат.
19 фев 2012, 19:30
Fernir
0
Вопросы по Lua, XML, WoW API.
Отрицание писал(а):
И вопрос от меня, хочу написать аддон, который модифицировал экшенбары. Для этого мне нужно написать код который будет "перебирать" все существующие кнопки экшенбаров получая от каждой из них информацию о том:
Хватает-ли маны на абилку,
Если есть цель, то в зоне-ли действия абилки эта цель,
Кд абилки,
Выполнены-ли специфические условия для использования этой абилки.
Как правило большинство аддонов для каждого из этих состояний окрашивает кнопку специальным образом, а для абилок на кд - показывается кд. А я хочу, что-бы если любое из этих условий выполнено (то есть мы не можем использовать абилку по той или иной причине), то кнопка затенялась всегда одним и тем-же цветом. А в частном случае когда абилка на кд, это затенение не затрагивало само отображение кд, а просто под него подкладывалась еще дополнительная заливка затенения.
Есть идеи о том, как это делается?
посмотри код bBars, там это есть. Хукается setvertexcolor для normaltexture каждой кнопки. По идее можно через getmetatable __index, как и в случае с кд фреймом (омницц)
20 фев 2012, 17:48
iPew
0
Вопросы по Lua, XML, WoW API.
Можно ли затавить появляться бафы с лево на право?
20 фев 2012, 18:36
Отрицание
0
Вопросы по Lua, XML, WoW API.
Сейчас смотрю Bartender4, он для создания кнопок использует библиотеку LibActionButton-1.0 (апи библиотеки дает такую функцию как "сделай мне кнопку", полностью решая все вопросы с различными secure\protected execution), думаю разобратся с структурой создаваемой кнопки и решить все без хуков, темболее, что требования расширились.
Хочу что-бы иконка спелла всегда затенялась одинаково (как затеняется в стандартном юи при невыполненных спец условиях, только чуть темнее): для спелла на кд, при нехватке маны, при невыполненных спец условиях, при аут оф реинж. Но, при этом, что-бы для аут оф реинж рамка вокруг кнопки дополнительно окрашивалась красным, а при нехватке маны - синим. На близовских кнопках эта рамка весьма широкая, а на создаваемых LibActionButton там похоже недостает еще одной текстурки, нужно ее допилить.
Можно "зажигать" эту рамку анимации абилки вокруг вообще любого фрейма, даже WorldFrame, забавно.
P.S. Написал аддон для неймплеитов, оставляя стандартный дизайн убирает уровень, агро, дополнительные рамки элиты/босса, и сокращает длинну надписей. Ну и еще показывает тотемы иконками.
Скрытый текст
#880
#880
#880
#880
#880
iPew писал(а):
Можно ли затавить появляться бафы с лево на право?
Думаю для стандартного юи слишком много кода перечитывать нужно что-бы разобратся где где-что перехватывать и переделывать. Может если кто-то писал аддон модифицирующий стандартные ауры, то он быстро сделать это сможет.
20 фев 2012, 18:44
Reimu
0
Вопросы по Lua, XML, WoW API.
Цитата:
P.S. Написал аддон для неймплеитов, оставляя стандартный дизайн убирает уровень, агро, дополнительные рамки элиты/босса, и сокращает длинну надписей. Ну и еще показывает тотемы иконками.
А выложить этот аддон можешь, если не трудно ?
23 фев 2012, 14:07
Отрицание
0
Вопросы по Lua, XML, WoW API.
Выложил (внутри архива 2 папки, обе положить в Addons):
Мой аддон просто немного меняет внешний вид стандартных неймплеитов, а что-бы над ними показавало всякие важные аурки как на скринах скачай еще аддон PlateBuffs
24 фев 2012, 01:57
Отрицание
0
Вопросы по Lua, XML, WoW API.
Хочется более глубоко понять работу всей системы в целом, для представления где и как в памяти распологаются данные.
1) Локальная ссылка на глобальные данные помещает копию этих данных в область памяти где хранятся локальные данные этой функции? Или копия данных не создается, и это остается всего-лиш ссылкой? Но зачем тогда близзы в своем коде производят "кеширование" часто используемых глобальных функций, например, из RestrictedExecution.lua:
Скрытый текст
Код:
-- Localizes for functions that are frequently called or need to be -- assuredly un-replaceable or unhookable. local type = type; local error = error; local scrub = scrub; local issecure = issecure; local setfenv = setfenv; local loadstring = loadstring; local setmetatable = setmetatable; local getmetatable = getmetatable; local pcall = pcall; local tostring = tostring; local newproxy = newproxy; local select = select;
2) Нужно-ли осуществлять вручную управление жизнью переменных счетчиков цикла и итераторов полей таблиц? То есть, если у меня десятки функций, в каждой из которых используются переменные for i=x,y for k,v in pairs(table) и т.п., нужно-ли в каждом случае объявлять эти переменные и следить за тем, что-бы не могло оказатся двух функций одновременно использующих i,k,v в глобальном окружении? То есть фактически - всегда делать эти переменные локальными? Практический эксперемент и его результат:
Скрытый текст
Код:
for i=1,2 do print("first loop: "..i) for i=2,4 do print("second loop: "..i) end end print(i)
Результат:
Цитата:
first loop: 1 second loop: 2 second loop: 3 second loop: 4 first loop: 2 second loop: 2 second loop: 3 second loop: 4 nil
Все работает так, как-будто это две разные переменные. Есть что-то по этому поводу в официальном мануале по луа?
3) Чем является аддон с точки зрения луа? Каждый аддон это функция, или это блок кода do end или это модуль? Или-же каждый аддон это независимая программа? Но как тогда реализовано общее глобальное окружение?
4) Чем являются разнообразные функции API WoW-a? Это таблица в луа, где значениями полей являются вызываемые функции. Вот пример кода который печатает в текст все методы которые можно применять к фрейму (106 шт).
Скрытый текст
Код:
local frame = CreateFrame("Frame", nil, UIParent) local FrameClass=getmetatable(frame) for k,v in pairs(FrameClass.__index) do print(k) print(v) end
Хотелось-бы узнать, сами эти функции, они на чем написаны? Тоже на луа, или на С? Или часть на луа, а часть на С? И если есть что-то на луа, то где можно посмотреть на реализацию этих функций, этот код входит в тот пак кода близзов, что скачивается с оффсайта? И как вызываются С функции из луа?
27 фев 2012, 18:30
Fernir
0
Вопросы по Lua, XML, WoW API.
1. кешируют скорее всего потому, что в дальнейшем те глобальные переменные могут измениться и чтобы аддоне не "поехал" делают кеш (имхо)
2. хочешь, чтобы работало правильно - делай уникальные
3. каждый аддон это кусок кода добавленный в некое _G
4. не уверен точно, но CreateFrame - поделка близзов не на LUA точно, помоему ее даже можно запустить путем обьявления делегата (через инжектинг), а вот getmetatable - родная LUA команда написанная скорее всего на C++, print - обертка для SendChatMessage, где лежит - не помню, помоему сделана на LUA
29 фев 2012, 17:35
Отрицание
0
Вопросы по Lua, XML, WoW API.
1. Кроме того, что глобальные переменные могут изменится, в начале говорится о "Localizes for functions that are frequently called", то есть кешируются часто вызываемые функции для ускорения доступа.
Это утилита для поиска функций которые "выгодно" кешировать. Там в описании есть такой текст, как описание одного из методов реализации этого кеширования:
Цитата:
Put a "local _G=_G" at the top of the file, and then access them through _G.SomeFunc, etc. This is actually somewhat faster than accessing them directly, believe it or not. (Direct global access involves looking up the global variable table first!)
То есть, как я понял, профит от кеширования глобальных переменных в том, что если мы обращаемся к глобальной переменной, то осуществляется ее поиск в довольно большом массиве (_G), а если мы сохранили ссылки на части этой таблицы в отдельные переменные, то мы сможем, через эти переменные напрямую обращатся к данным, не вызывая индексации огромного массива.
2. Так дело в том, что оно работает абсолютно правильно даже если их не делать уникальными, и то, что после цикла переменная самоуничтожается, уже точно говорит о том, что луа сама как-то следит за ними.
3. _G это таблица, в ней значениями могут быть функции, тогда получается, что аддоны это функции? А если они функции, тогда найдя эту функцию в _G, можно ее запустить, и таким образом загрузить какой-то аддон без перезагрузки интерфейса? Но мне кажется они скорее реализованны как модули.
4. Да, getmetatable родная функция луа, через метатаблицы в луа реализуется ООП, вот классная статья:
http://ilovelua.n a r o d.ru/about_lua.html (Тут какой-то парсер выедает домен народа, пришлось писать через пробелы.)
Насчет print и SendChatMessage немного наоборот, SendChatMessage обертка для print, а принт родная функция луа. То есть скорее всего API вова это функции близзов написанные, например, на С++, которые как-то вызываются из луа кода.
01 мар 2012, 01:43
GenriX
0
Вопросы по Lua, XML, WoW API.
Нашел в теме "Ищу аддон" вот такой код:
Disality писал(а):
Код:
MainMenuBarTexture0:Hide()
MainMenuBarTexture1:Hide()
MainMenuBarTexture2:Hide()
MainMenuBarTexture3:Hide()
MainMenuBarLeftEndCap:Hide()
MainMenuBarRightEndCap:Hide()
MainMenuMaxLevelBar0:Hide()
MainMenuMaxLevelBar1:Hide()
MainMenuMaxLevelBar2:Hide()
MainMenuMaxLevelBar3:Hide()
BonusActionBarFrameTexture1:Hide()
BonusActionBarFrameTexture2:Hide()
BonusActionBarFrameTexture3:Hide()
BonusActionBarFrameTexture4:Hide()
Вопрос: Как скрыть еще и рамку кнопок?#76
#76
Нашел как называется текстура этой рамки, но не нашел как ее скрыть.
Сервер: Ткач Смерти
Почётные победы: 23218
2х2: 1733
3х3: 1137
0
Вопросы по Lua, XML, WoW API.
Зайти в настройки - интерфейс - панели - оттображать всегда
09 мар 2012, 15:32
GenriX
0
Вопросы по Lua, XML, WoW API.
Это что они были видны, если на панели ничего нет. Мне нужно чтобы были НЕ видны вообще.
09 мар 2012, 16:08
Отрицание
0
Вопросы по Lua, XML, WoW API.
Что-бы все сразу скрыть это так:
/run local g = {['MultiBarBottomLeftButton']=true,['ActionButton']=true,['MultiBarBottomRightButton']=true,};for k,v in pairs(g) do for i=1,12 do select(10, _G[k..i]:GetRegions()):Hide() end end
Что-бы скрыть эту рамку на 1 кнопке, вставляешь в чат этот скрипт (но не жмешь энтер):
Потом наводишь курсор на кнопку на которой хочешь его скрыть и тогда жмешь энтер отправляя скрипт на выполнение.
Я, кстати, наоборот искал способ вернуть эту текстурку на место в бартендер, но все лень было найти название текстурки. Без них кнопки слишком жидко и уныло выглядят по моему.