Показать сообщение отдельно
Старый 02.01.2011, 16:56   #1
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию [patch/dev] Refer-A-Friend System

Собственно, патч, реализующий оффлайк систему "Пригласи друга"
Не совершенство, скорее бета-версия, но все же, ниже поясню почему

Немного теории
Услуга включает в себя 3 основые фишки - призвать друга, повысить уровень и утроенный опыт. Третью часть можно отбросить, это делается целиком на сервере.

Призвать друга

Опция при клике на портрете друга в пати и синий шарик во френд-листе. Кстати в 3.3.5 он выставляется независимо от статуса друга, и, позволю себе поправить уважаемого TOM_RUS в посте http://ru-mangos.ru/showpost.php?p=8598&postcount=4, это не флаг, а все-таки статус, проверял в дебаге клиента на 2.4.3., тем более если структура FriendInfo соотв. близз структуре в памяти, то по смещению pointer + 1 хранится как раз таки статус
Код:
struct FriendInfo
{
    FriendStatus Status;
    uint32 Flags;
    uint32 Area;
    uint32 Level;
    uint32 Class;
Ну сейчас это не актуально, просто так, к слову.

Проблема была вот с чем, я писал в той теме, что не мог получить гуид того, кого нужно призвать, не выделяя его. Проблема "легко" решилась, когда я подетальнее разобрал lua функцию SummonFriend - там до каста спелла, если цель не в прямой видимости, а вызывается допустим через тот же шарик, шлется пакет под номером 317 - CMSG_SET_SELECTION

Код:
    v8 = 0;
    if ( stru_BD07B0.guid_low != v3 || stru_BD07B0.guid_high != v2 )
    {
      v8 = 1;
      sub_518DC0(v3, v2);
    }
    Spell_C__CastSpell(dword_BE7D88, 0, v3, v2, 0);
    if ( v8 )
    {
      sub_518DC0(stru_BD07B0.guid_low, stru_BD07B0.guid_high);
      return 0;
    }
sub_518DC0 - это и есть отправка пакета с нужным нам гуидом.

Повысить уровень

Основная проблема заключалась в том, что опция активировалась только при опр. условиях, и их удалось найти, опять же подебажив клиент и рассмотрев смещения полей в структурах

После проходв кучи проверок доходим до такой проверки, где результат либо 0, либо 3 , 0 - это верно, 3 - вернет ошибку

Код:
result = *(_BYTE *)(*((_DWORD *)v13 + 1026) + 4197) < 1u ? 3 : 0;
А проверяется тут байт, по смещению 1 в поле(PLAYER_FIELD_BYTES в мангосе), или флаг 0x100
Код:
.text:006DEB02                 mov     ecx, [esi+1008h]
.text:006DEB08                 cmp     byte ptr [ecx+1065h], 1
Оцениваем патч, смотрим код, т.к там есть хаки, например на EFFECT_SUMMON_PLAYER, текущие проверки CheckCast не поддерживают призыв друга совсем, на выставление флагов связывания и активации дарения уровня и т.д

Предлагайте свои варианты, т.к очень хотелось бы довести патч до официального репозитория

Да, и я использовал отдельную таблицу для реферского(приглашающего) аккаунта и 5 реферралов(приглашенных) - мб тоже какой-то более рациональный способ есть

Ниже патч и sql - работает система просто, добавляем в таблицу ID аккаунта рефера и ID аккаунтов реферралов. Вынесение опций в конфиг, высылку на почту жевры/ракеты и прочую мелкую косметику не делал, если будет необходимость, с радостью сделаю.

Ну и все замечания и предложения по патчу рассмотрю внимательно
А так же отписывайтесь об ошибках, я мог позабыть что-то включить в патч, а сейчас проверить не могу
С Новым Годом
Вложения
Тип файла: sql refer_a_friend.sql (544 байт, 52 просмотров)
Тип файла: rar refer_a_friend.rar (7.9 Кб, 62 просмотров)

Последний раз редактировалось MaS0n; 02.01.2011 в 17:58.
MaS0n вне форума   Ответить с цитированием
22 пользователя(ей) сказали cпасибо:
Ambal (11.01.2011), Den (02.01.2011), Fear (03.01.2011), Fedia22 (02.01.2011), Feel the Power (03.01.2011), Gerald (02.01.2011), ghostpast (02.01.2011), KiriX (02.01.2011), Konctantin (02.01.2011), Lurker (31.01.2011), MaxXx2021 (29.01.2011), Nordway (02.01.2011), PSZ (02.01.2011), Ranger (22.03.2012), selector (09.01.2011), Shadez (02.01.2011), Sid (02.01.2011), SilverIce (29.01.2011), sven (09.01.2011), zergtmn (02.01.2011), Кот ДаWINчи (03.01.2011)