Собственно, патч, реализующий оффлайк систему "Пригласи друга"
Не совершенство, скорее бета-версия, но все же, ниже поясню почему
Немного теории
Услуга включает в себя 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 аккаунтов реферралов. Вынесение опций в конфиг, высылку на почту жевры/ракеты и прочую мелкую косметику не делал, если будет необходимость, с радостью сделаю.
Ну и все замечания и предложения по патчу рассмотрю внимательно
А так же отписывайтесь об ошибках, я мог позабыть что-то включить в патч, а сейчас проверить не могу
С Новым Годом