|
Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.
Если кто-то хочет задать вопрос по патчу - велкам. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
17.11.2010, 10:17 | #1 |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Отказ от лута
Увидел тут недавно, что есть такая функция в клиенте - можно отказаться от лута.
Проверил на мангосе - не работает. Думаю, что реализовать данный функционал должно быть не сложно, но я даже без понятия куда копать и что за опкод отвечает за это. Возьмёмся? |
17.11.2010, 10:22 | #2 |
Администратор
|
Хоть опиши, что и как должно происходить хотя бы визуально.
|
17.11.2010, 12:45 | #4 |
Модератор
|
Вот что накопал, прочитав тему
Начнем с интерфейса Это обычное PopupMenu для юнита Код:
UnitPopupButtons["OPT_OUT_LOOT_TITLE"] = { text = OPT_OUT_LOOT_TITLE, dist = 0, nested = 1, tooltipText = NEWBIE_TOOLTIP_UNIT_OPT_OUT_LOOT }; UnitPopupButtons["OPT_OUT_LOOT_ENABLE"] = { text = YES, dist = 0, checkable = 1 }; UnitPopupButtons["OPT_OUT_LOOT_DISABLE"] = { text = NO, dist = 0, checkable = 1 }; Текст : OPT_OUT_LOOT_TITLE - "Отказаться от добычи: %s" NEWBIE_TOOLTIP_UNIT_OPT_OUT_LOOT - "Если этот параметр включен, то из добычи вы сможете получать только предметы, необходимые для выполнения заданий, а также предметы, от которых отказались остальные участники или которые выбрал для вас ответственный за добычу." YES - "Да" NO - "Нет" Код:
UnitPopupMenus["SELF"] = { "SET_FOCUS", "PVP_FLAG", "LOOT_METHOD", "LOOT_THRESHOLD", "OPT_OUT_LOOT_TITLE", "LOOT_PROMOTE", "DUNGEON_DIFFICULTY", "RAID_DIFFICULTY", "RESET_INSTANCES", "RAID_TARGET_ICON", "LEAVE", "CANCEL" }; Код:
UnitPopupMenus["OPT_OUT_LOOT_TITLE"] = { "OPT_OUT_LOOT_ENABLE", "OPT_OUT_LOOT_DISABLE"}; Меню неактивно, если : вы не в пати(inParty == 0) или если вы в пати и включен фри лут( inParty == 1 and GetLootMethod() == "freeforall") Код:
elseif ( value == "OPT_OUT_LOOT_TITLE" ) then if ( inParty == 0 or ( inParty == 1 and GetLootMethod() == "freeforall" ) ) then UnitPopupShown[UIDROPDOWNMENU_MENU_LEVEL][index] = 0; Код:
elseif ( button == "OPT_OUT_LOOT_ENABLE" ) then SetOptOutOfLoot(1); CloseDropDownMenus() elseif ( button == "OPT_OUT_LOOT_DISABLE" ) then SetOptOutOfLoot(nil); CloseDropDownMenus(); Там обнаруживаются Код:
OPT_OUT_LOOT_TOGGLE_OFF = "Вы имеете право на случайную добычу."; OPT_OUT_LOOT_TOGGLE_ON = "Вы не участвуете в разделе случайной добычи."; Теперь клиент(биг спс TOM_RUS за именование функций ) хотя lua и так легко находятся, но все равно биг спс Начнем с обнаруженной функции SetOptOutOfLoot Код:
int __cdecl Lua_SetOptOutOfLoot(int a1) { int v1; // esi@1 char *v2; // eax@4 int v4; // [sp-40h] [bp-44h]@2 v1 = FrameScript__toboolean(a1, 1); sub_52CB40(v1); if ( v1 ) v4 = (int)"OPT_OUT_LOOT_TOGGLE_ON"; else v4 = (int)"OPT_OUT_LOOT_TOGGLE_OFF"; v2 = (char *)FrameScript__GetText(v4, -1, 0); ChatFrame__AddMessage(v2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); return 0; } Функция отправки пакета, хоца представить в ассемблерном виде, да понятнее наверно будет в СИ. Хотя там все просто, ложим аргументы в стек, получаем адреса переменных по ebp регистру + смещение и вызываем функции Код:
int __cdecl sub_52CB40(int a1) { int result; // eax@1 int v2; // [sp+8h] [bp-18h]@1 int v3; // [sp+Ch] [bp-14h]@1 int v4; // [sp+10h] [bp-10h]@1 int v5; // [sp+14h] [bp-Ch]@1 int v6; // [sp+18h] [bp-8h]@1 int v7; // [sp+1Ch] [bp-4h]@1 dword_BD19A0 = a1; v2 = (int)off_9E0E24; v3 = 0; v4 = 0; v5 = 0; v6 = 0; v7 = -1; CDataStore__PutInt32((int)&v2, 1033); CDataStore__PutInt32((int)&v2, a1); v7 = 0; result = ClientServices__SendPacket_0(&v2); v2 = (int)off_9E0E24; if ( v5 != -1 ) result = off_9E0E28(&v2, &v3, &v4, &v5); return result; } Вернемся к функции lua - дальше простой вывод в чат(ChatFrame__AddMessage) в зависимости от параметра(как я и предполагал в начале), кстати текст целиком соотв. тексту, который я приводил выше Код:
if ( v1 ) v4 = (int)"OPT_OUT_LOOT_TOGGLE_ON"; else v4 = (int)"OPT_OUT_LOOT_TOGGLE_OFF"; v2 = (char *)FrameScript__GetText(v4, -1, 0); ChatFrame__AddMessage(v2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); Вобщем к чему все это. Итоги. Мы получили структуру пакета под номером 409h (CMSG_OPT_OUT_OF_LOOT) , параметр всего 1 - uint32, так же выяснили что в клиенте ничего не делается, т.е работа лежит целиком на совести сервера. Лично свое наблюдение, работа этой функции аналогична установке/снятии ПвП флага Да, и в мангосе обработка этого паккта уже есть, т.к он еще присылается при авторизации - вероятно с нулем, чтобы сбросить опцию, хотя не проверял Вот и все, поправьте, если где-то ошибся или дал неверную информацию Для реализации все-таки потребуется знание, как это выглядит на офе, т.к в клиенте вроде бы ничего не происходит Последний раз редактировалось MaS0n; 17.11.2010 в 12:47. |
17.11.2010, 12:47 | #5 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
Проверил, игрок отказавшийся от лута не учавствует в розыгрыше предметов ( не появляется даже менюшка ) так же обычный лут для него не доступен, тоесть к примеру в пати два игрока - для отказавшевася мобы не являются добычей и весь лут собвственно получает второй игрок.
А у нас разве не работает ? |
17.11.2010, 12:58 | #6 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Где проверяли? Если на другом эмуле - то это не показатель
Под "Обычный лут" наверное имелось "добыча в режиме по-очереди" ?
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо" |
17.11.2010, 13:18 | #7 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
Конечно же на офе........ зашел двумя аккаунтами да и проверил ,к счастью вышел сегодня выходной и удалось проверить самому лично и увидеть своими глазами ( пока некоторые личности работают ) Хотя для такой проверки достаточно приобрести два триала...
Последний раз редактировалось Den; 17.11.2010 в 13:20. |
|
|