Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи

Важная информация

Патчи Если кто-то хочет выложить не свой готовый патч - не забудьте указать автора и источник.

Если кто-то хочет задать вопрос по патчу - велкам.

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.11.2010, 10:17   #1
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию Отказ от лута

Увидел тут недавно, что есть такая функция в клиенте - можно отказаться от лута.
Проверил на мангосе - не работает. Думаю, что реализовать данный функционал должно быть не сложно, но я даже без понятия куда копать и что за опкод отвечает за это.
Возьмёмся?
KiriX вне форума   Ответить с цитированием
Старый 17.11.2010, 10:22   #2
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Хоть опиши, что и как должно происходить хотя бы визуально.
virusav вне форума   Ответить с цитированием
Старый 17.11.2010, 10:53   #3
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Хоть опиши, что и как должно происходить хотя бы визуально.
Сегодня проверю
А вообще - правой кнопкой по своему портрету и там есть такой пункт.
KiriX вне форума   Ответить с цитированием
Старый 17.11.2010, 12:45   #4
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Вот что накопал, прочитав тему

Начнем с интерфейса

Это обычное 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 - "Нет"
относится только к самому себе, параметр SELF
Код:
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" };
Имеет 2 пункта подменю
Код:
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;
При активации пунктов вызывается lua-фукнция c параметром 0(nil) или 1(SetOptOutOfLoot) и меню просто закрывается(CloseDropDownMenus()
Код:
	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;
}
В общем-то банально, то что мы выставили в интерфейсе(0 или 1) переходит сюда, и конвертируется фреймскриптом в булевую(логическую) переменную(FrameScript__toboolean) и используется в кач-ве параметра для опкода 409h, отсылаемого в функции sub_52CB40 - в которую мы подаем наше значение как параметр

Функция отправки пакета, хоца представить в ассемблерном виде, да понятнее наверно будет в СИ. Хотя там все просто, ложим аргументы в стек, получаем адреса переменных по 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;
}
ложим 2 uint32 в пакет(CDataStore__PutInt32), один - это номер опкода(1033 или 409h), второй - некий параметр, нетрудно догадатся, что это 0 или 1 из lua-функции - и отсылаем пакет (ClientServices__SendPacket_0) и уничтожаем данные, освобождая память (off_9E0E28(&v2, &v3, &v4, &v5))

Вернемся к функции 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);
Вторая lua, находящаяся рядом с первой в обявлениях - GetOptOutofLoot - возвращает 0 или 1 (через FrameScript__pushnil() или FrameScript__PushNumber()) в зависимости от установленной опции

Вобщем к чему все это. Итоги.

Мы получили структуру пакета под номером 409h (CMSG_OPT_OUT_OF_LOOT) , параметр всего 1 - uint32, так же выяснили что в клиенте ничего не делается, т.е работа лежит целиком на совести сервера.

Лично свое наблюдение, работа этой функции аналогична установке/снятии ПвП флага
Да, и в мангосе обработка этого паккта уже есть, т.к он еще присылается при авторизации - вероятно с нулем, чтобы сбросить опцию, хотя не проверял

Вот и все, поправьте, если где-то ошибся или дал неверную информацию
Для реализации все-таки потребуется знание, как это выглядит на офе, т.к в клиенте вроде бы ничего не происходит

Последний раз редактировалось MaS0n; 17.11.2010 в 12:47.
MaS0n вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
KiriX (17.11.2010), sven (18.11.2010)
Старый 17.11.2010, 12:47   #5
Den
Ученый
 
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
Den Скоро придёт к известностиDen Скоро придёт к известности
По умолчанию

Проверил, игрок отказавшийся от лута не учавствует в розыгрыше предметов ( не появляется даже менюшка ) так же обычный лут для него не доступен, тоесть к примеру в пати два игрока - для отказавшевася мобы не являются добычей и весь лут собвственно получает второй игрок.

А у нас разве не работает ?
Den вне форума   Ответить с цитированием
Старый 17.11.2010, 12:58   #6
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Den Посмотреть сообщение
Проверил
Где проверяли? Если на другом эмуле - то это не показатель

Под "Обычный лут" наверное имелось "добыча в режиме по-очереди" ?
__________________
Если ты видишь это сообщение то ты просто обязан нажать "Спасибо"
Insider42 вне форума   Ответить с цитированием
Старый 17.11.2010, 13:18   #7
Den
Ученый
 
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
Den Скоро придёт к известностиDen Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Insider42 Посмотреть сообщение
Где проверяли? Если на другом эмуле - то это не показатель

Под "Обычный лут" наверное имелось "добыча в режиме по-очереди" ?
Конечно же на офе........ зашел двумя аккаунтами да и проверил ,к счастью вышел сегодня выходной и удалось проверить самому лично и увидеть своими глазами ( пока некоторые личности работают ) Хотя для такой проверки достаточно приобрести два триала...

Последний раз редактировалось Den; 17.11.2010 в 13:20.
Den вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Insider42 (17.11.2010), KiriX (17.11.2010)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 09:18. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot