Просмотр полной версии : Вопросы по LFG
В процессе переписывания кода ТС возникла куча вопросов. У них там почти все захардкожено, но что-то мне говорит что это неверно...
1. как подбирается игрок в пати по GS? вообще что принимается в качестве GS? шмот, время игры, ачивы?
2. в пати может быть только 1 танк 1 хилер и 3 дпс? Или я что-то не понял? или это тоже подбирается по GS?
3. сколько донжонов можно выбрать в списке (не-рандом)? в чистом мангосе зашита цифра 3, причем насмерть. мне почему-то казалось что сколько угодно. нет?
4. одновременно рандом и список как я понимаю выбрать нельзя?
5. система поиска рейда вообще независима от случайной группы? в трине работает одновременно либо то либо то. и как народ подбирается в рейд, только вручную?
6. что светится в окошке случайного подземелья (если выбрано именно рандом), если сегодня уже 1 такое пройдено?
поможите кто чем может. желательно простыми словами, на сях я сам ругаться буду...
Lordronn
06.04.2011, 20:43
1. По среднему эквип ЛВЛу только. Если еквип ЛВЛа не достаточно, то так и написано
2. да, только так. Группа формируется из 1 танка, 1 хила, 3 дд (ДД могут быть одного класса)
3. Да хоть все
4. Да
5. Нет. Когда ты стоишь в очереди ЛФГ ты не можешь стать ни на БГ, ни в поиск рейда. Надо что-то одно выбирать(напрягает очень)
6. Первый раз отображается получаемый предмет, опыт, деньги. За последующие разы предмета уже нету(если валюта, то показана уже другая), кол-во денег и опыта уменьшено. Больше валюта и опыт не изменяются.
Еще вопросы будут?
по 1 надо смотреть патчноуты и хотфиксы. по наблюдениям плохо одетых в основном кидает к плохо одетым, но бывают исключения.
Lordronn
06.04.2011, 21:29
Там либо чистый рандом либо есть некий средний эквип ЛВЛ у всей группы, который должен быть достигнут
Было и так, что плохо одетых к плохо одетым кидало. Бывало, что когда я был в 264 эквипе меня кидало к зеленым, и на оборот
3. сколько донжонов можно выбрать в списке (не-рандом)? в чистом мангосе зашита цифра 3, причем насмерть. мне почему-то казалось что сколько угодно. нет?
Ограничение на 3 инста было в TBC до введения автоматического поиска подземелий.
5. система поиска рейда вообще независима от случайной группы? в трине работает одновременно либо то либо то. и как народ подбирается в рейд, только вручную?
Только вручную, поиск рейдов это просто список...
6. что светится в окошке случайного подземелья (если выбрано именно рандом), если сегодня уже 1 такое пройдено?
У близов это реализовано на стороне сервера в виде дэйли квестов (http://www.wowhead.com/quests=7.-1010) (по 1 квесту на первый и последующие заходы). Ну и отображаются там соответственно реварды за эти квесты...
Спасибо. Осталось выяснить цифры ограничений подземелий по GS (на ТС не реализовано), а также как считается это самое GS. Скорее всего придется взять тупую сумму левелов надетого шмота и добавлять поля в базу...
Раз поиск райда это список, то хоть с ним возни меньше. Однако система очередей выстраивается весьма красивая, можно в нее же и случайное БГ затолкать, текущая реализация весьма хаковатая.
Новый вопрос - куда в ТС выкинули реализацию хандлера CMSG_LFG_SET_ROLES_2? Судя по всему у них и так работает, но опкод же для чего-то нужен? Или он deprecated?
Осталось выяснить цифры ограничений подземелий по GS
В нормал-моды доступ открывается по достижению необходимого уровня (ЛК, Ката).
Героики в ЛК, насколько я помню, открывались с 174-м iLvl шмотом (последняя квестовая зеленка (79-80й лвл)). ЕМНИП, сразу все открываются, но не помню насчет Залов Отражений/Ямы Сарона/Кузни Душ - там уже персы достаточно одетые были.
В катаклизме же в героики можно пойти с 333-м уровнем шмота (общий - не только те, что надеты на персонаже, учитываются и предметы в сумке - можно было обмануть систему подсчета - купить левый шмот за репутацию, для поднятия уровня :) ).
2. да, только так. Группа формируется из 1 танка, 1 хила, 3 дд (ДД могут быть одного класса)
Как и хил с танком) Помню я омг-пати в 5 паладинов =)
В катаклизме же в героики можно пойти с 333-м уровнем шмота
329 уровнем :)
В процессе переписывания кода ТС возникла куча вопросов. У них там почти все захардкожено, но что-то мне говорит что это неверно...
1. как подбирается игрок в пати по GS? вообще что принимается в качестве GS? шмот, время игры, ачивы?
2. в пати может быть только 1 танк 1 хилер и 3 дпс? Или я что-то не понял? или это тоже подбирается по GS?
3. сколько донжонов можно выбрать в списке (не-рандом)? в чистом мангосе зашита цифра 3, причем насмерть. мне почему-то казалось что сколько угодно. нет?
4. одновременно рандом и список как я понимаю выбрать нельзя?
5. система поиска рейда вообще независима от случайной группы? в трине работает одновременно либо то либо то. и как народ подбирается в рейд, только вручную?
6. что светится в окошке случайного подземелья (если выбрано именно рандом), если сегодня уже 1 такое пройдено?
поможите кто чем может. желательно простыми словами, на сях я сам ругаться буду...
Всё из личных наблюдений:
1. Не замечал такой связи, просто не обращал на это внимания.
2. Это в каком смысле??? По ролям - да, именно только так.
3. Хоть все. Все доступные, имеется ввиду. С повышением левела низкие по уровню для тебя данжы не отображаются в списке вообще.
4. Нет, нельзя. Или рандом, или выбор.
5. Не совсем понимаю, тут Том лучше подсказал...
6. Ничего. Сообщения о том, что вы сегодня уже проходили что-то не появляется. Дело в том, что за последующие прохождения ты получаешь награду, но без шмота и в меньшем объёме.
Вроде ничего не напутал, давно уже не играл =)
В катаклизме же в героики можно пойти с 333-м уровнем шмота (общий - не только те, что надеты на персонаже, учитываются и предметы в сумке - можно было обмануть систему подсчета - купить левый шмот за репутацию, для поднятия уровня :) ).
опаньки... во я попал :( еще и из сумок GS считать...
Lordronn
07.04.2011, 13:04
Это только в катаклизме. В ВОТЛК такого не было
Это только в катаклизме. В ВОТЛК такого не было
В wotlk и требуемый итем левел для входа не отображался нигде, было просто написано что он недостаточно высок... А сам принцип его подсчета я думаю с тех пор не менялся...
В 4.х клиенте даже функция подсчета среднего итем левела есть.
Принцип работы:
создается массив
int bla[MAX_INVENTORY_TYPE];
memset(bla, 0, MAX_INVENTORY_TYPE*4);
потом перебираются все итемы и инвентаре и инициализируется этот массив:
if(bla[item->inventoryType] < item->itemlevel)
bla[item->inventoryType] = item->itemlevel;
ну и считается средний итем левел, при этом нужно не забыть что например уровень для двуручного оружия нужно считать за 2 слота (main+off hand) и т.д. Для колец и тринкетов только 1 слот вроде считается и т.д.
Так же учитывается может ли игрок вообще использовать данный итем: уровень игрока, класс, расса, требуемые спеллы (профессии), репутация, тип брони и прочая херь...
http://paste2.org/p/1349371
нифига не понял как вычисляется среднее, похоже просто среднее арифметическое. и непонятно, учитывать ли всякие бутыли и прочую еду.
тогда встает большая проблема где брать значения для сравнения :( разве народ накидает "по памяти" да я захардкодю все это...
кто может тупо постоять у банка, понадевать шмот разного уровня и написать какие подземелья при каком шмоте откроются?
нифига не понял как вычисляется среднее, похоже просто среднее арифметическое. и непонятно, учитывать ли всякие бутыли и прочую еду.
у таких итемов разве inventory type не 0?
тогда встает большая проблема где брать значения для сравнения :( разве народ накидает "по памяти" да я захардкодю все это...
кто может тупо постоять у банка, понадевать шмот разного уровня и написать какие подземелья при каком шмоте откроются?
Так не получится, т.к. считается весь шмот в инвентаре (возможно из банка не считается, я не уверен) + подземелья для низких уровней не отображаются когда уровень чара на много превышает уровень подземелья. Так что требуемый итем левел можно узнать только во время прокачки персонажа, т.к. обычно итем левела всегда нехватает (при получении 70 лвл не пускает в героики для 70 лвл, тоже самое на 80 и 85 уровне), для некоторых нормалов тоже есть требуемый илвл, например 5 ппл инсты цлк и колизея, все нормалы катаклизма...
Насколько мне известно, высчитывается не просто средний уровень шмота, а средний уровень ЛУЧШЕЙ экипировки. То есть если в сумке будут лежать кольчужные перчатки, скажем, 346 333 306 и какого нибудь 15 лвла, в подсчет среднего уровня пойдет только 346. Причем если при этом будут латные перчатки 359, а вы охотник, в подсчет все равно пойдет 346. Однако если будут тканевые перчатки 359, в подсчет пойдут они.
Но это лично мое наблюдение, так как тоже пыталась обмануть систему)
Чтобы получить близовский средний итемлевел нужно сделать следующее:
1. перебрать все учитываемые слоты
2. выяснить максимальный итемлевел для каждого из этих слотов из того, что игрок может одеть (в банке, в сумках, или уже одетое). т.е. например для роги будут считаться тряпки и кожа, но не будут считаться кольчуга и латы. БоЕ предметы, которые еще не привязаны к персонажу тоже учитываются. статы и качество (синька/эпик) игнорируются.
3. сделать среднее арифметическое по полученным результатам.
По поводу подбора пати хочу сказать что на мой взгляд учитываются только роли
Ну, судя по патчноутам теперь еще будет учитываться тип брони и близы будут стараться не ставить в 1 группу двух или трех дамагеров одного типа брони, например латников. Насчет подбора пати по GS - чушь. Сколько раз в мою фулл эпик пати попадали зеленые нубы, и наоборот. И столько же раз наверное я попадал своим зеленым нубом в такую же зеленую нубопати.
у таких итемов разве inventory type не 0?
далеко не у всех к сожалению. есть рыба которую можно взять в качестве дубинки и тому подобное...
далеко не у всех к сожалению. есть рыба которую можно взять в качестве дубинки и тому подобное...Она будет считаться. :)
Насчет подбора пати по GS - чушь. Сколько раз в мою фулл эпик пати попадали зеленые нубы, и наоборот. И столько же раз наверное я попадал своим зеленым нубом в такую же зеленую нубопати.
нет, как раз это и есть результат подбора по GS. есть некий "максимальный GS" для подземелья. поэтому если вся пати одета в эпики, в нее придется пихнуть одетого в зелень клиента дабы выдержать это ограничение для всей пати.
(возможно из банка не считается, я не уверен)
Считается, проверено - покупался релик для паладина за хонор, не надевался. Илвл поднялся. В банк убрал - остался на прежнем уровне. Вернул продавцу, илвл спустился на пред. значение.
и непонятно, учитывать ли всякие бутыли и прочую еду.
Нет, только экипировка.
нет, как раз это и есть результат подбора по GS. есть некий "максимальный GS" для подземелья. поэтому если вся пати одета в эпики, в нее придется пихнуть одетого в зелень клиента дабы выдержать это ограничение для всей пати.
Бред, имхо :)
Lordronn
08.04.2011, 10:00
А не может ли это обрабатываться на стороне клиента и отправляться на сервер при регистрации в ЛФГ?
нифига не понял как вычисляется среднее, похоже просто среднее арифметическое.
http://paste2.org/p/1351614
Бред, имхо :)
есть резалт-код в списке опций блокировки 5, по триневскому енуму
LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE
судя по той паре сниффов что у меня есть, локмапы с этим кодом присылаются разные до вступления в группу и после. вывод 1 - идет пересчет локмапов по среднему ГС. вывод 2 - в случае подбора случайной группы ее члены подбираются так, чтобы их средний ГС влез в диапазон для подземелья. вывод 3 - см. предыдущее письмо.
@lordronn а как может это клиент обработать до того как группа создана?
@TOM_RUS, я именно об этом коде сказал что "нифига не понял". сейчас свой подсчет оттестирую и тут опубликую, а желающие поругают если что...
@TOM_RUS, я именно об этом коде сказал что "нифига не понял". сейчас свой подсчет оттестирую и тут опубликую, а желающие поругают если что...
Что там непонятного?
Что там непонятного?
непонятна там чушь начинающаяся после уже перебора итемов - непонятно на кой черт берется по 4 значения, в цикле вычисляются какие-то левые
ILVL_WITHOUT_WEAPONS; ILVL_WEAPONS_MH_OH; ILVL_WEAPONS_2H. что это такое в общем понятно, непонятно зачем считать таким кривым способом и что же в результате этого хитрого перебора получится. если надо получить среднее то все это должно быть куда проще.
Lordronn
08.04.2011, 18:45
@lordronn а как может это клиент обработать до того как группа создана?
А группа причем тут? Я имел ввиду итем лвл игрока. Ведь как-то клиент отображает крестик и надпись "Ваш уровень экипировки мал". или сервер сам шлет лист данжей, которые отображаются у игрока и их статус (можно пойти или нет) ?
Сам шлет, в локмапах. Реализацию можно глянуть в ТС или у меня в бранче (реализация разная, но формат-то локмапов один :)
Вот например https://github.com/rsa/mangos/commit/ba4ec30046bf2774b02366f669cb322c48a99a08
реализация SMSG_LFG_PARTY_INFO. Фактически это посылаются локмапы от всех членов пати.
непонятна там чушь начинающаяся после уже перебора итемов - непонятно на кой черт берется по 4 значения, в цикле вычисляются какие-то левые
Это скорее всего оптимизация компилятора, тоже самое можно было бы сделать так:
...
invType3 = INVTYPE_HEAD; // ignore INVTYPE_NON_EQUIP in calculations
sum = 0;
do
{
sum += IlvlByInvType[invType3];
invType3 += 1;
}
while ( invType3 < MAX_INVTYPE );
...
ILVL_WITHOUT_WEAPONS = fingerILVL + trinketILVL + rangedIlvl4 + sum;
Короче господа, вот накарябал:
https://github.com/rsa/mangos/commit/dd25e3801db0960b4ae584fe047977f2855b0028
Кто разберется в моем почерке, просьба похвалить-поругать-итп. Может я что не так понял или не доделал.
Кстати. Ни у кого не найдется структуры SMSG_UPDATE_LFG_LIST? или хоть куска сниффа с ним. Делать так уж все...
Короче господа, вот накарябал:
https://github.com/rsa/mangos/commit/dd25e3801db0960b4ae584fe047977f2855b0028
Кто разберется в моем почерке, просьба похвалить-поругать-итп. Может я что не так понял или не доделал.
Кстати. Ни у кого не найдется структуры SMSG_UPDATE_LFG_LIST? или хоть куска сниффа с ним. Делать так уж все...
http://paste2.org/p/1352237
...
Кстати. Ни у кого не найдется структуры SMSG_UPDATE_LFG_LIST? или хоть куска сниффа с ним. Делать так уж все...http://paste2.org/p/1352824
+ http://paste2.org/p/1352828
Однако же, структурка блин... Ничего, и не таких обламывали.
судя по всему, присылается она уже по выбранному клиентом типу подземелья - LFGType и не более того. а то бы траффик был сумасшедший от такого... хотя и так нечего себе будут блоки...
Однако же, структурка блин... Ничего, и не таких обламывали.
судя по всему, присылается она уже по выбранному клиентом типу подземелья - LFGType и не более того. а то бы траффик был сумасшедший от такого... хотя и так нечего себе будут блоки...Еще в структуре после Unk Float
Output.AppendLine(" Average Item Level: " + Reader.ReadSingle());
Пакет приходит при выборе рейда в просмотре рейдов.
Пример пакета:LFG Type: Raid
Dungeon: Id: Baradin Hold (25) (329) Type: 0
isGuidsPresent: False
Groups: 0
Groups2: 0
Players: 4
Players2: 4
______________________
Player 0:
GUID: (Player, Counter: 42238773)
UpdateFlags: CharacterInfo, Comment, Unknown1, Guid, Roles, Unknown2, Unknown3, Unknown4
Level: 85
Class: Rogue
Race: BloodElf
Spec: 31/3/7
Armor: 10025
Spell Damage: 54 Heal: 54
Haste rating: melee 730, ranged 730, spell 730
MP5: 0 (interrupted 0)
Attack Power: 8098
Agility: 3912
Health: 110927
Mana: 0
Unk 1: 0
Unk Float: 413
Unk Float 2 (Mastery?): 352,4706
Defence Rating: 0
Dodge Rating: 0
Block Rating: 0
Parry Rating: 0
Crit Rating (?): 864
Expertise: 3
Comment: ДПС 16К+, шмот 358
Unk Byte 6 0: 0
Guid: (No Guid)
Roles: DPS
Unk Int32 23 0: 5145
Unk Byte 8 0: 0
Unk GUID 6 0: (No Guid)
Unk Int32 24 0: 0
______________________
Player 1:
GUID: (Player, Counter: 57007247)
UpdateFlags: CharacterInfo, Comment, Unknown1, Guid, Roles, Unknown2, Unknown3, Unknown4
Level: 85
Class: Warlock
Race: BloodElf
Spec: 31/7/3
Armor: 8964
Spell Damage: 2956 Heal: 2956
Haste rating: melee 414, ranged 414, spell 414
MP5: 1193 (interrupted 1028)
Attack Power: 100
Agility: 73
Health: 103766
Mana: 64763
Unk 1: 0
Unk Float: 405,1765
Unk Float 2 (Mastery?): 348
Defence Rating: 0
Dodge Rating: 0
Block Rating: 0
Parry Rating: 0
Crit Rating (?): 253
Expertise: 0
Comment:
Unk Byte 6 1: 0
Guid: (No Guid)
Roles: DPS
Unk Int32 23 1: 47
Unk Byte 8 1: 0
Unk GUID 6 1: (No Guid)
Unk Int32 24 1: 0
______________________
Player 2:
GUID: (Player, Counter: 36706580)
UpdateFlags: CharacterInfo, Comment, Unknown1, Guid, Roles, Unknown2, Unknown3, Unknown4
Level: 85
Class: DeathKnight
Race: BloodElf
Spec: 8/0/33
Armor: 19912
Spell Damage: 44 Heal: 44
Haste rating: melee 1055, ranged 1055, spell 1055
MP5: 0 (interrupted 0)
Attack Power: 9944
Agility: 138
Health: 112955
Mana: 0
Unk 1: 0
Unk Float: 419,2353
Unk Float 2 (Mastery?): 353,6875
Defence Rating: 0
Dodge Rating: 0
Block Rating: 0
Parry Rating: 1083
Crit Rating (?): 1426
Expertise: 29
Comment: анхоли 13+ ачив
Unk Byte 6 2: 0
Guid: (No Guid)
Roles: DPS
Unk Int32 23 2: 1637
Unk Byte 8 2: 0
Unk GUID 6 2: (No Guid)
Unk Int32 24 2: 0
______________________
Player 3:
GUID: (Player, Counter: 45103393)
UpdateFlags: CharacterInfo, Comment, Unknown1, Guid, Roles, Unknown2, Unknown3, Unknown4
Level: 85
Class: Druid
Race: Tauren
Spec: 32/1/8
Armor: 9868
Spell Damage: 6897 Heal: 6897
Haste rating: melee 331, ranged 331, spell 331
MP5: 2563 (interrupted 932)
Attack Power: 477
Agility: 105
Health: 114399
Mana: 99228
Unk 1: 0
Unk Float: 421,1765
Unk Float 2 (Mastery?): 354,7647
Defence Rating: 0
Dodge Rating: 0
Block Rating: 0
Parry Rating: 0
Crit Rating (?): 2142
Expertise: 0
Comment: сова 353илвл
Unk Byte 6 3: 0
Guid: (No Guid)
Roles: DPS
Unk Int32 23 3: 5356
Unk Byte 8 3: 0
Unk GUID 6 3: (No Guid)
Unk Int32 24 3: 0
Еще в структуре после Unk Float
Output.AppendLine(" Average Item Level: " + Reader.ReadSingle());
Пакет приходит при выборе рейда в просмотре рейдов.
Пример пакета:
перед дефенсрейтингом что ли? та же места по дизасму нету... ладно, будем как обычно методом тыка.
Гляньте пожалуйста на стрктурку MemberFlags (как я понимаю она же UpdateFlags. ничего не забыл/не перепутал?
.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)) ::.
Да, про структуру это я наврал, Average Item Level только в 4.0 отправляется.
Енумы у меня такие:.:: Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)) ::.
спасибо, roles и правда перепутал :)
у вас нет типа группы = 6 (рандом), флаг лидера почему-то назван Guide. и еще судя по тому что у меня есть, флаг х08 выставляется когда игрок в пати, я его назвал group.
флаг лидера почему-то назван Guide
Близы так называют.
CHAT_PARTY_GUIDE_GET = "|Hchannel:PARTY|h[Dungeon Guide]|h %s:\32"; - в LFG пати
CHAT_PARTY_LEADER_GET = "|Hchannel:PARTY|h[Party Leader]|h %s:\32"; - в обычной пати
GUIDE_TOOLTIP = "Indicates that you have some dungeon experience and are comfortable instructing the group in how to overcome the encounters.";
начал писать поиск подземелий, натолкнулся на такую проблему: а как собственно формировать группы?
Варианты
1) жадно пытаться объединить всех, кого только можно
+ игроки видят какой-то прогресс
- неоптимальный результат и не факт, что вообще группы соберутся
2) перебрать все возожные пары танк-хилер (с учетом групп, в которых они состоят и возможности дополнить такие пары ДД), построить на них максимальное паросочетание
+ гарантированно оптимальный выбор групп
- игроки не видят прогресса, работает за O(N^3), где N количество игроков в очереди
3) жадно объединять танка с хилером, ДД добивать только если можно заполнить группу
+ танки и хилеры видят прогресс
- непонятно, на скольео будет оптимальным результат
ну и самы главный вопрос - что делать с игроками, которые выбрали несколько ролей? как их учитывать?
Может у кого есть мысли, как это реализовано на оффе, или просто адекватный алгоритм?
ЗЫ спасибо rsa и TC за базу для разработок
Покажите код, посмотрим, может что и посоветуем. В подборе надо использовать теории матриц, это довольно толстый курс высшей математики и не тут его обсуждать. Если вы планируете писать на базе ТС, то мне вас жаль - я эти грабли уже на своем лбу долго ощущаю, поэтому больше половины пишу заново... И мой код еще и до половины реализации не доехал.
а как собственно формировать группы?
Имхо, в очереди как таковой, есть 3 доп. очереди - для каждой роли по одной. И набирается группа путем вытаскивания первых сверху игроков.
Ну и, возможно, + какие-то доп. проверки на уровень предметов и пр.
ну и самы главный вопрос - что делать с игроками, которые выбрали несколько ролей? как их учитывать?
Анализировать игроков, стоящих в очереди - как правило, больше всего в очереди сидит ДД, затем хилеры и меньше всего танков. Кто больше нужен, той ролью и включать игрока в поиск.
И ещё. Вроде не писали, мб пригодится:
- если кто-то из игроков отклонил приглашение, группа получает нового игрока вне очереди;
- неполная группа, находящаяся в подземелье, имеет больший приоритет на нового игрока, нежели группа, не отправленная в подземелье (см. выше).
Еще вопросик - что присылает сервер после выбора рейда (не случайного подземелья а рейда) кроме SMSG_UPDATE_LFG_LIST, в момент нажатия кнопки "подписаться". Я тут это дело захакал но не уверен что правильно...
ну поскольку хоть сколько-нибудь вменяемое описание кже известной части протокола отсутствует - TC это один из самых доступных источников информации о структуре пакетов (правда работает ли то, что там написано я вообще говоря не уверен)
Попробую с несколькими очередями (только не 3, а 5). Для временной реализации сойдет, пока оптимального решения задачи не будет.
@finomen - ваша стопиЦЦотая попытка привинтить старый LFG патч (это не с тринити, те уже давным-давно ушли дальше) закончится так же как и все делавшиеся до этого. я уже через это прошел.
Еще вопросик - что присылает сервер после выбора рейда (не случайного подземелья а рейда) кроме SMSG_UPDATE_LFG_LIST, в момент нажатия кнопки "подписаться". Я тут это дело захакал но не уверен что правильно...http://paste2.org/p/1354767
у-у-уххх... я всегда был не очень хорошего мнения о близзовых кодерах, но по моему это перебор ;) китайцев у них слишком много... или это просто не повезло с ответом на запрос?
Нет, такое всегда. Причем это нормально. Во многих местах так. http://paste2.org/p/1354836
Добавлено: Правда, у мангоса такое же есть, например при создании персонажа левые пакеты приходят
Вчера 2 часа пытался отправить клиенту SMSG_LFG_UPDATE_LIST в самых разных вариантах. Вывод - структурка не совсем та что опубликована, или какие-то из флагов работают по другому. Придется перекапывать дизасмы. Зато появилось предположение по поводу флагов unk2/unk4 (по вашей классификации) - какой-то из них ставится когда у игрока есть бинд на это подземелье и за ним отправляется uint32 с энкаунтерами.
Так. Очередная порция вопросов. Что шлет клиент при нажатии кнопки "обновить" в списке рейдов? Никак поймать не могу, ни один из текущих опкодов там не попался.
Нет ли у кого куска сниффа с SMSG_LFG_UPDATE_LIST в котором есть группы? Не пойму как их отправлять.
Какие статы показываются клиенту в игре при наведении мышки на члена списка райдов? Упорно не хочет давать ничего кроме класса , уровня и ролей.
И напоследок результаты раскопок - флаги в UpdateFlags должны быть взведены все обязательно, иначе у клиента едет крыша. Флаг 0x80 присылается если у таргета есть бинд на этот инстанс, "под" ним идет гуид инстанса и энкаунтер таргета.
по нажатию кнопки "Обновить"
LFRFrame.xml
<Button name="$parentRefreshButton" inherits="UIPanelButtonTemplate2" text="REFRESH">
.......
<OnClick>
PlaySound("UChatScrollButton");
RefreshLFGList();
</OnClick>
<OnUpdate function="LFRBrowseFrameRefreshButton_OnUpdate"/>
</Scripts>
</Button>
lua-шка RefreshLFGList() активирует данный эвент
FrameScript__SignalEvent(EVENT_UPDATE_LFG_LIST, 0);
При активации эвента уже неинтересно, вывод списка и баловство с кнопками(включить/отключить, показать/скрыть), клиент ничего не шлет, интерфейс запрашивает данные через
local name, level, areaName, className, comment, partyMembers, status, class, encountersTotal, encountersComplete, isLeader, isTank, isHealer, isDamage = SearchLFGGetResults(index);
Код самой lua-шки очень большой, но по сути там идет забор данных
Следовательно, данные уже должны лежать в клиентских структурах/массивах/переменных
ПС : это как на примере с рандом БГ, только там глобальные переменные, значения в которые записывается через пакет SMSG_BATTLEFIELD_LIST, а забираются для интерфейса lua-шкой GetRandomBGHonorCurrencyBonuses
по нажатию кнопки "Обновить"
LFRFrame.xml
[
спасибо. значит зря т...лся, полдня коту под хвост :(
Интересующихся информирую, что LFR у меня вроде бы работает. По крайней мере все откопанные в сети скрины с этой фичей выдаются нормально, аддоны работают :) К сожалению я так и не получил даже устной информации, как в списке должны отображаться стоящие в очереди группы (или их лидеры?) поэтому их нет. Как будут данные - так и появятся.
Интересующихся информирую, что LFR у меня вроде бы работает. По крайней мере все откопанные в сети скрины с этой фичей выдаются нормально, аддоны работают :) К сожалению я так и не получил даже устной информации, как в списке должны отображаться стоящие в очереди группы (или их лидеры?) поэтому их нет. Как будут данные - так и появятся.
Группы отображаются в виде игрока с иконкой лидера, а в тултипе вроде было количество игроков в группе, список убитых боссов, комментарий, мб еще что забыл...
http://i.imgur.com/543t9.png
список убитых боссов - точнее пройденных в этом подземелье энкаунтеров - отображается для любого игрока независимо от группы, если есть бинд на этот инстанс. это работает нормально.
по поводу иконки лидера - ни одним флагом не смог заставить ее показывать :( нужен снифф с хотя бы одним таким пакетом напосмотреть...
Добавил скриншот. Там же в тултипе отображается если в данной группе есть кто-то из вашего игнор листа/фрэнд листа (видимо где-то отправляется список всех игроков в группе и клиент сам сканирует игнор лист на предмет наличия некоторых личностей).
Отображаются ли в списке участники рейдов, лидеры которых стоят в очереди? Или только лидер?
Отображаются ли в списке участники рейдов, лидеры которых стоят в очереди? Или только лидер?
Не отображаются насколько я знаю. Даже встать в список рейдов нельзя если вы в группе и не лидер, только просматривать...
Кстати, SearchLFGGetResults(index) возвращает еще дополнительно 24 аргумента кроме тех что близы используют:
signed int __usercall AddLFGPlayerInfo<eax>(LFGInfoPlayer *a1<edi>, int pLuaState<esi>)
{
signed int result; // eax@2
if ( a1 )
{
FrameScript__pushboolean(pLuaState, a1->roles & 1); // isLeader
FrameScript__pushboolean(pLuaState, a1->roles & 2); // isTank
FrameScript__pushboolean(pLuaState, a1->roles & 4); // isHealer
FrameScript__pushboolean(pLuaState, a1->roles & 8); // isDamage
FrameScript__PushNumber(pLuaState, a1->Unk1);
FrameScript__PushNumber(pLuaState, a1->Spec[0]);
FrameScript__PushNumber(pLuaState, a1->Spec[1]);
FrameScript__PushNumber(pLuaState, a1->Spec[2]);
FrameScript__pushboolean(pLuaState, a1->dword8C);
FrameScript__PushNumber(pLuaState, a1->Armor);
FrameScript__PushNumber(pLuaState, a1->SpellDamage);
FrameScript__PushNumber(pLuaState, a1->SpellHeal);
FrameScript__PushNumber(pLuaState, a1->HasteMelee);
FrameScript__PushNumber(pLuaState, a1->HasteRanged);
FrameScript__PushNumber(pLuaState, a1->HasteSpell);
FrameScript__PushNumber(pLuaState, a1->MP5);
FrameScript__PushNumber(pLuaState, a1->MP5_Combat);
FrameScript__PushNumber(pLuaState, a1->AttackPower);
FrameScript__PushNumber(pLuaState, a1->Agility);
FrameScript__PushNumber(pLuaState, a1->Health);
FrameScript__PushNumber(pLuaState, a1->Mana);
FrameScript__PushNumber(pLuaState, a1->Unk2);
FrameScript__PushNumber(pLuaState, a1->Defence);
FrameScript__PushNumber(pLuaState, a1->Dodge);
FrameScript__PushNumber(pLuaState, a1->Block);
FrameScript__PushNumber(pLuaState, a1->Parry);
FrameScript__PushNumber(pLuaState, a1->Crit);
FrameScript__PushNumber(pLuaState, a1->Expertise);
result = 28;
}
else
{
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushboolean(pLuaState, 0);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
FrameScript__pushnil(pLuaState);
result = 28;
}
return result;
}
список убитых боссов - точнее пройденных в этом подземелье энкаунтеров - отображается для любого игрока независимо от группы, если есть бинд на этот инстанс. это работает нормально.
В личкинге нельзя было вставать в поиск рейда в определенный инст, если уже есть бинд на этот инстанс.
Или я неправильно понял пост?
@TOM_RUS и в моей реализации все эти данные (кроме неопознанных, вроде MP5) нормально передаются. их используют аддоны.
@shadez - это было бы нелогично, потому что тогда незачем передавать энкаунтеры подземелий. нельзя встать если подземелье полностью пройдено - вот это сделано, благо таблица DungeonEncounter.dbc у меня используется.
@TOM_RUS и в моей реализации все эти данные (кроме неопознанных, вроде MP5) нормально передаются. их используют аддоны.
Пример такого аддона? Все что идет после:
local name, level, areaName, className, comment, partyMembers, status, class, encountersTotal, encountersComplete, isLeader, isTank, isHealer, isDamage = SearchLFGGetResults(index);
нигде не документировано.
@shadez - это было бы нелогично, потому что тогда незачем передавать энкаунтеры подземелий.
Убитые/живые боссы же только у групп отображаются... :scratch_one-s_head:
LFG++ для примера.
http://wow.curse.com/downloads/wow-addons/details/lfg.aspx
Добавлено через 50 секунд
Убитые/живые боссы же только у групп отображаются... :scratch_one-s_head:
но место для передачи данных есть и у каждого игрока. думаю передаются тоже если подземелье частично пройдено. по крайней мере у меня отлично отображается, оттестировано :)
по поводу иконки лидера - ни одним флагом не смог заставить ее показывать :( нужен снифф с хотя бы одним таким пакетом напосмотреть...
Зависит от этой функции, попробуй в игре ее набрать, пропусти параметры и выведи partyMembers, я так делал когда с LFD баловался, для всего интерфейса, ибо был без снифов
local name, level, areaName, className, comment, partyMembers, status, class, encountersTotal, encountersComplete, isLeader, isTank, isHealer, isDamage = SearchLFGGetResults(index);
Потому что вот
if ( partyMembers > 0 ) then
button.type = "party";
button.partyIcon:Show();
button.tankIcon:Hide();
button.healerIcon:Hide();
button.damageIcon:Hide();
else
button.type = "individual";
button.partyIcon:Hide();
Где-то не посланы данные, уже надо ковырять ЛФГ пакет :)
TOM_RUS - жжжесть в хорошем смысле, научите плз как делать структуры клиентские, в IDA структуры то я делать умею, а вот как считать смещения для клиентских структур, мб что-то еще нужно, намекните :rolleyes:
Потому что вот
спасибо. надеюсь этого "потомучто" похоже уже хватит чтобы добить пакет :) ибо навело на назначение одного байта в пакете...
Кстати, список гуидов в начале пакета SMSG_LFG_SEARCH_RESULTS помоему для удаления из списка, везде SMemFree() вызывается для LfgPlayerInfo/LfgGroupInfo по их гуиду.
Флаги 0x04, 0x08 каким-то образом связаны с группой игрока: http://paste2.org/p/1368410
Добавлено через 5 минут
LFG++ для примера.
http://wow.curse.com/downloads/wow-addons/details/lfg.aspx
В этом аддоне поля после isDamage не используются. Да и вообще этот аддон под старое LFG судя по скринам, там даже SearchLFGGetResults еще не было!
Добавлено через 55 минут
TOM_RUS - жжжесть в хорошем смысле, научите плз как делать структуры клиентские, в IDA структуры то я делать умею, а вот как считать смещения для клиентских структур, мб что-то еще нужно, намекните :rolleyes:
Вручную, либо через "Create new struct type", или через "Convert to struct *" для уже созданных структур. Потом подгонять структуру по размеру, переименовывать поля, менять их тип и т.д.
Вручную, либо через "Create new struct type", или через "Convert to struct *" для уже созданных структур. Потом подгонять структуру по размеру, переименовывать поля, менять их тип и т.д.
Не, это понятно, я умею так делать, как определять поля, размеры и названия, ну вот например LFGInfoPlayer чуть выше, допустим в смещении 4 от начала структуры лежит поле - и что это именно Armor, а не roles, в IDA ведь просто
a1 + 4
Наугад расставлять поля ж нельзя, откуда-то же это все берется, вот и интересно, или мб надо отправлять пакеты и дебажить клиент и рассматривать что лежит по адресам и сравнивать со своими данными?
Не, это понятно, я умею так делать, как определять поля, размеры и названия, ну вот например LFGInfoPlayer чуть выше, допустим в смещении 4 от начала структуры лежит поле - и что это именно Armor, а не roles, в IDA ведь просто
a1 + 4
Наугад расставлять поля ж нельзя, откуда-то же это все берется, вот и интересно, или мб надо отправлять пакеты и дебажить клиент и рассматривать что лежит по адресам и сравнивать со своими данными?
Ну конкретно для этого опкода бралось из снифов, часть можно по "документации" lua проследить.
struct LFGInfoGroup
{
_DWORD dword0;
_DWORD dword4;
_DWORD dword8;
_DWORD dwordC;
_DWORD dword10;
_DWORD dword14;
WGUID guid18;
_DWORD Index;
char comment[256];
char roles[4];
WGUID instanceGuid;
_DWORD encountersCompletedMask;
_DWORD dword134;
_DWORD numGroupMembers;
LFGInfoPlayer **GroupMembers;
_DWORD dword140;
_DWORD dword148;
};
struct LFGInfoPlayer
{
_DWORD dword0;
_DWORD dword4;
_DWORD dword8;
_DWORD dwordC;
_DWORD dword10;
_DWORD dword14;
WGUID guid18;
_DWORD Index;
_DWORD numGroupMembers;
LFGInfoGroup *groupInfo;
char Level;
char Class;
char Race;
char Spec[4];
char pad0;
_DWORD Armor;
_DWORD SpellDamage;
_DWORD SpellHeal;
_DWORD HasteMelee;
_DWORD HasteRanged;
_DWORD HasteSpell;
float MP5;
float MP5_Combat;
_DWORD AttackPower;
_DWORD Agility;
_DWORD Health;
_DWORD Mana;
_DWORD Unk1;
float Unk2;
_DWORD Defence;
_DWORD Dodge;
_DWORD Block;
_DWORD Parry;
_DWORD Crit;
_DWORD Expertise;
_DWORD areaId;
_DWORD status;
_DWORD IsInGroup;
char roles;
char comment[256];
char pad1[3];
_DWORD dword94;
WGUID instanceGuid;
_DWORD encountersCompletedMask;
_DWORD unk2;
};
Размер был определен исходя из:
playerInfo = (LFGInfoPlayer *)SMemAlloc(0x1A8u, (int)".\\LFGInfo.cpp", 0x2D1u, 0);
groupInfo = (LFGInfoGroup *)SMemAlloc(0x148u, (int)".\\LFGInfo.cpp", 0x2BEu, v12);
@TOM_RUS и в моей реализации все эти данные (кроме неопознанных, вроде MP5) нормально передаются. их используют аддоны.
MP5 - восполнение манны
MP5_Combat - восполнение манны в бою
это общепринятое сокращение, непонятно почему неопознано -)
Судя по коду, отправляется весь список игроков и групп, а клиент уже сам разбирается исходя из полученных данных отдельно игрок стоит или в составе группы.
Поле "_DWORD IsInGroup" возможно IsGroupLeader..., т.к. уже есть поле с гуидом группы игрока, т.е. он уже как бы в группе...
Что значит поле "status" тоже не понятно, известно что оно может принимать только булевые значения и ни в одном клиентском скрипте не используется.
Поле areaId надо бы добавить, и соответствующий флаг поправить...
Всем спасибо за обсуждение, особенно TOM_RUS. Несмотря на почти полностью выясненную структуру SMSG (судя по коду, игрок начинает считаться лидером если байт под флагом 04 >0, и там же находится число членов группы), получить икону лидера в клиенте так и не удалось... Осталась последняя идея связанная с неверным формированием ObjectGuid группы - почему-то клиент не берет гуиды групп из 1 го блока данных опкода (перебор групп) и не вливает их в LFGInfoGroup *groupInfo данных игрока. Хотя гуид и там и там один и тот же... Буду колупать дальше.
Список гуидов в начале опкода - для чистки кэша клиента, там должны передаваться гуиды ушедших из очереди. Пока делать не буду, довольно сложная история.
Всем спасибо за обсуждение, особенно TOM_RUS. Несмотря на почти полностью выясненную структуру SMSG (судя по коду, игрок начинает считаться лидером если байт под флагом 04 >0, и там же находится число членов группы), получить икону лидера в клиенте так и не удалось... Осталась последняя идея связанная с неверным формированием ObjectGuid группы - почему-то клиент не берет гуиды групп из 1 го блока данных опкода (перебор групп) и не вливает их в LFGInfoGroup *groupInfo данных игрока. Хотя гуид и там и там один и тот же... Буду колупать дальше.
Список гуидов в начале опкода - для чистки кэша клиента, там должны передаваться гуиды ушедших из очереди. Пока делать не буду, довольно сложная история.
Количество игроков в группе клиент сам считает по гуиду группы как я понял:
int __thiscall GetPartyMembersCount(LFGInfoGroup *this)
{
unsigned int num; // eax@1
int result; // eax@2
num = this->group.numGroupMembers;
if ( num <= 1 )
result = 0;
else
result = num - 1;
return result;
}
void __thiscall sub_556E60(LFGInfoGroup *this, LFGInfoPlayer *player)
{
LFGInfoGroup *_this; // esi@1
int num; // edi@2
int i; // eax@3
_this = this;
if ( player->numGroupMembers < 0 )
{
num = this->group.numGroupMembers;
ReallocGroupMembers(&this->group, num + 1);
if ( player->IsInGroup )
{
for ( i = num; i > 0; --i )
{
_this->group.GroupMembers[i] = _this->group.GroupMembers[i - 1];
_this->group.GroupMembers[i]->numGroupMembers = i;
}
*_this->group.GroupMembers = player;
player->numGroupMembers = 0;
}
else
{
_this->group.GroupMembers[num] = player;
player->numGroupMembers = num;
}
}
}
void __thiscall ReallocGroupMembers(LFGGroup *this, unsigned int num)
{
LFGGroup *_this; // edi@1
unsigned int v3; // ecx@3
unsigned int v4; // ebx@5
_this = this;
if ( num > this->numGroupMembers )
{
if ( num > this->numGroupMembers2 )
{
v3 = this->dword140;
if ( !v3 )
v3 = sub_5D0040(_this, num);
v4 = num;
if ( num % v3 )
v4 = num + v3 - num % v3;
sub_5532C0(_this, v4);
}
}
_this->numGroupMembers = num;
}
GetPartyMembersCount возвращает значение, которое потом мы получаем в SearchLFGGetResults.
Количество игроков в группе клиент сам считает по гуиду группы как я понял:
сорри, но я этого ни тут в коде ни в ранее приводившихся кусках не вижу. количество пляшет от numGroupMembers, но где оно заполняется я пока не вижу... есть одна мысль, можно попробовать, но вряд ли.
PS я с трудом представляю как в гуид можно затолкать число игроков. оно ж переменное...
Обновил код выше, numGroupMembers действительно заполняется клиентом самостоятельно.
P.S. Седня ночью тестировал опкод SMSG_LFG_SEARCH_RESULTS, иконка лидера без каких либо проблем отображается, даже если идет 0 для флага 0x04...
А вот как сделать чтобы отображалось
ERR_LFG_JOINED_LIST = "You are now listed in the Raid Browser.";
ERR_LFG_LEFT_LIST = "You are no longer listed in the Raid Browser.";
вместо
ERR_LFG_JOINED_QUEUE = "You are now queued in the Dungeon Finder.";
ERR_LFG_LEFT_QUEUE = "You are no longer queued in the Dungeon Finder.";
я так и не понял, видимо какой-то опкод недопосылаю :)
Обновил код выше, numGroupMembers действительно заполняется клиентом самостоятельно.
P.S. Седня ночью тестировал опкод SMSG_LFG_SEARCH_RESULTS, иконка лидера без каких либо проблем отображается, даже если идет 0 для флага 0x04...
...
я так и не понял, видимо какой-то опкод недопосылаю :)
сообщение с постановкой в райдфиндер получаю без проблем, если надо могу пояснить как.
а вот группу и икону лидера получить не могу никак... что где отправить для этого? если надо - мой текущий код в
https://github.com/rsa/mangos/blob/master/src/game/LFGHandler.cpp
сообщение с постановкой в райдфиндер получаю без проблем, если надо могу пояснить как.
а вот группу и икону лидера получить не могу никак... что где отправить для этого? если надо - мой текущий код в
https://github.com/rsa/mangos/blob/master/src/game/LFGHandler.cpp
У меня просто гуид группы в обоих местах (group и player) одинаковый, и если в списке игроков больше одного и у всех одикаковый гуид группы (а он одинаковый), то кто-то из них отображается лидером, а флагом 0x04 можно кого-то конкретного сделать лидером :) Сам тестовый код в мастер ветке.
надеюсь дошло где туплю - я только лидера посылал, членов группы нет, они ж все равно не отображаются. попробую всех отправить (вот тут наконец и флаги пригодятся).
надеюсь дошло где туплю - я только лидера посылал, членов группы нет, они ж все равно не отображаются. попробую всех отправить (вот тут наконец и флаги пригодятся).
Надо всех слать, клиент сам разбирается что и как отображать.
Накалякал аддон, которых использует недокументированные поля в списке рейдов:
http://filebeam.com/d2614f5b1904584e4f2a702ed29ef6a2.jpg
http://i.imgur.com/U6xBq.jpg
Накалякал аддон, которых использует недокументированные поля в списке рейдов Где его взять?
Где его взять?
http://wow.curse.com/downloads/wow-addons/details/lfradvanced.aspx
Все, большое спасибо TOM_RUS, добил я LFR и даже чистку кэша сделал. Действительно, клиент смотрит в списке всех членов группы и если их нет - ставит лидера как обычного игрока...
Жалко только что этот аддон на 3.3.5а не пашет, хотелось проверить и верность посылки недокументированных данных тоже...
Все, большое спасибо TOM_RUS, добил я LFR и даже чистку кэша сделал. Действительно, клиент смотрит в списке всех членов группы и если их нет - ставит лидера как обычного игрока...
Жалко только что этот аддон на 3.3.5а не пашет, хотелось проверить и верность посылки недокументированных данных тоже...
Ну вообще он должен работать, только надо *.toc файл подредактировать (версию сменить) и убрать поле со средним итемлевелом, т.к. его в 3.3.5 помоему не было.
Увы, даже после подредактитирования эффекта от аддона никакого. Видимо моих знаний в LUA недостаточно.
Увы, даже после подредактитирования эффекта от аддона никакого. Видимо моих знаний в LUA недостаточно.
У меня эффект виден даже без редактирования на 3.3.5а (доп инфа в тултипе), Вы что-то не так делаете...
У меня эффект виден даже без редактирования на 3.3.5а (доп инфа в тултипе), Вы что-то не так делаете...
спасибо. пересилил свою лень и включил "устаревшие аддоны" в клиенте :). отлично показывает, кое-что у себя поправил. только не понял откуда берется
GameTooltip:AddLine(format(UNSPENT_TALENT_POINTS, talentPoints));
GameTooltip:AddLine(format("LFM: %s", tostring(isLFM)));
у меня их нет в пакете.
Продолжаю доставать народ вопросами.
Сохраняется ли статус очередей ЛФГ/ЛФР при логауте?
Что шлет сервер в ответ на CMSG_LFG_GET_STATUS? Нет ли у кого сниффа?
Сколько раз можно кикнуть претендента в группу? В трине зашито 5, это верно?
Продолжаю доставать народ вопросами.
Сохраняется ли статус очередей ЛФГ/ЛФР при логауте?
Что шлет сервер в ответ на CMSG_LFG_GET_STATUS? Нет ли у кого сниффа?
Сколько раз можно кикнуть претендента в группу? В трине зашито 5, это верно?
1) нет
2) --
3) видимо сколько угодно, только задержка между киками все больше и больше становится.
Lordronn
24.04.2011, 18:52
Сохраняется ли статус очередей ЛФГ/ЛФР при логауте?
Нет. Такое только с Бг есть. Если стоишь в ЛФг и вышел из игры - все. Надо заново становиться.
Сколько раз можно кикнуть претендента в группу? В трине зашито 5, это верно?
Всмысле? Если ты о кике участника то там есть система голосований. Получается что 3. Ибо тогда остается 2 человека:
1 - тот, кого хотим кикнуть
2 - тот, кто кикает.
А т.к проголосовать первый против себя не может, то и кикнуть его нельзя, пока не наберутся новенькие.
Возможно, что группа просто распадется.
спасибо. пересилил свою лень и включил "устаревшие аддоны" в клиенте :). отлично показывает, кое-что у себя поправил. только не понял откуда берется
GameTooltip:AddLine(format(UNSPENT_TALENT_POINTS, talentPoints));
GameTooltip:AddLine(format("LFM: %s", tostring(isLFM)));
у меня их нет в пакете.
void __cdecl LFGHandler__ReadPlayerInfo(CDataStore *a1, LFGGroupList *groupList, LFGInfoPlayer *playerInfo)
{
unsigned int v3; // ebx@1
int v4; // ebx@8
bool v5; // ecx@8
LFGInfoGroup *groupInfo3; // ecx@9
LFGInfoGroup *groupInfo; // eax@12
DWORD v8; // eax@13
DWORD v9; // ebx@13
LFGInfoGroup *groupInfo2; // eax@18
DWORD v11; // eax@23
WGUID groupGuid; // [sp+Ch] [bp-18h]@15
WGUID v13; // [sp+14h] [bp-10h]@13
int playerFlags; // [sp+1Ch] [bp-8h]@1
unsigned __int8 v15; // [sp+23h] [bp-1h]@8
v3 = 0;
playerFlags = 0;
CDataStore__GetInt32(a1, (int)&playerFlags);
if ( playerFlags & 1 )
{
CDataStore__GetInt8(a1, (int)&playerInfo->Level);
CDataStore__GetInt8(a1, (int)&playerInfo->Class);
CDataStore__GetInt8(a1, (int)&playerInfo->Race);
do
CDataStore__GetInt8(a1, (int)&playerInfo->Spec[v3++]);
while ( v3 < 3 );
CDataStore__GetInt32(a1, (int)&playerInfo->Armor);
CDataStore__GetInt32(a1, (int)&playerInfo->SpellDamage);
CDataStore__GetInt32(a1, (int)&playerInfo->SpellHeal);
CDataStore__GetInt32(a1, (int)&playerInfo->CritMelee);
CDataStore__GetInt32(a1, (int)&playerInfo->CritRanged);
CDataStore__GetInt32(a1, (int)&playerInfo->CritSpell);
CDataStore__GetFloat(a1, (int)&playerInfo->MP5);
CDataStore__GetFloat(a1, (int)&playerInfo->MP5_Combat);
CDataStore__GetInt32(a1, (int)&playerInfo->AttackPower);
CDataStore__GetInt32(a1, (int)&playerInfo->Agility);
CDataStore__GetInt32(a1, (int)&playerInfo->Health);
CDataStore__GetInt32(a1, (int)&playerInfo->Mana);
CDataStore__GetInt32(a1, (int)&playerInfo->TalentPoints);
CDataStore__GetFloat(a1, (int)&playerInfo->Unk1);
CDataStore__GetInt32(a1, (int)&playerInfo->Defence);
CDataStore__GetInt32(a1, (int)&playerInfo->Dodge);
CDataStore__GetInt32(a1, (int)&playerInfo->Block);
CDataStore__GetInt32(a1, (int)&playerInfo->Parry);
CDataStore__GetInt32(a1, (int)&playerInfo->Haste);
CDataStore__GetInt32(a1, (int)&playerInfo->Expertise);
}
if ( playerFlags & 2 )
CDataStore__GetString(a1, (int)playerInfo->comment, 0x100u);
if ( playerFlags & 4 )
{
v4 = playerInfo->IsLFM;
v15 = 0;
CDataStore__GetInt8(a1, (int)&v15);
v5 = v15 != 0;
playerInfo->IsLFM = v15;
if ( (v4 != 0) != v5 )
{
groupInfo3 = playerInfo->groupInfo;
if ( groupInfo3 )
{
sub_556EF0(groupInfo3, playerInfo);
sub_556E60(playerInfo->groupInfo, playerInfo);
}
}
}
if ( playerFlags & 8 )
{
groupInfo = playerInfo->groupInfo;
if ( groupInfo )
{
v9 = groupInfo->groupGuid.guid_low;
v13.guid_high = groupInfo->groupGuid.guid_high;
v8 = 0;
}
else
{
v9 = 0;
v8 = 0;
v13.guid_high = 0;
}
groupGuid.guid_low = v8;
groupGuid.guid_high = v8;
CDataStore__GetInt64(a1, (int)&groupGuid);
if ( v9 != groupGuid.guid_low || v13.guid_high != groupGuid.guid_high )
{
sub_556F90(groupList, playerInfo);
if ( groupGuid )
{
v13 = groupGuid;
groupInfo2 = (LFGInfoGroup *)GetInfo(&groupList->something, groupGuid.guid_low, &v13);
}
else
{
groupInfo2 = 0;
}
playerInfo->groupInfo = groupInfo2;
if ( groupInfo2 )
{
sub_556E60(groupInfo2, playerInfo);
}
else
{
if ( playerInfo->Index < 0 )
{
v13.guid_high = groupList->group.numGroupMembers;
ReallocGroupMembers(&groupList->group, v13.guid_high + 1);
v11 = v13.guid_high;
groupList->group.GroupMembers[v13.guid_high] = playerInfo;
playerInfo->Index = v11;
}
}
}
}
if ( playerFlags & 0x10 )
CDataStore__GetInt8(a1, (int)&playerInfo->Roles);
if ( playerFlags & 0x20 )
CDataStore__GetInt32(a1, (int)&playerInfo->AreaId);
if ( playerFlags & 0x40 )
CDataStore__GetInt8(a1, (int)&playerInfo->Status);
if ( playerFlags & 0x80 )
{
CDataStore__GetInt64(a1, (int)&playerInfo->instanceGuid);
CDataStore__GetInt32(a1, (int)&playerInfo->encountersCompletedMask);
}
}
Очередная порция вопросов:
- приходит ли игроку, выбравшему при включении в очередь ЛФГ, только одну роль, предложение выбрать роль при его включении в группу?
- группа создается всегда сразу из 5 чел, или может создаться из 3х и ждать остальных?
- что становится с группой если после создания за 2 минуты кто-то не выбрал роль? распускается или просто выкидывается из очереди?
Lordronn
03.05.2011, 12:40
1.Нет. Предложение будет тогда, когда кто-то ливнет и придется подтверждать свою роль.
2.Да
3. Роль выбирается в менюшке. Ты наверное имел ввиду, что будет с группой если отклонить предложение телепортация. Если да, то при отклонении оставшаяся группа(группа - человек, который не принял) идет в начало очереди
1.Ты наверное имел ввиду, что будет с группой если отклонить предложение телепортация. Если да, то при отклонении оставшаяся группа(группа - человек, который не принял) идет в начало очереди
спасибо, но по 3 вопросу я имел ввиду именно то что написал. при включении в группу посылается менюшка с требованием подтвердить роль. на нее надо ответить за 2 минуты. если кто-то не ответит - что будет?
спасибо, но по 3 вопросу я имел ввиду именно то что написал. при включении в группу посылается менюшка с требованием подтвердить роль. на нее надо ответить за 2 минуты. если кто-то не ответит - что будет?Возможно, вы имеете ввиду меню выбора роли при выходе кого-то из группы? Там таймера нет, и сделано это для того, чтобы, например, один из дд мой продолжить инст как хил/танк.
Другой вариант — выбор роли в рейде, но и там нет таймера и есть кнопка «закрыть», а вызывается окошко у всего рейда через RC-подобный пункт в меню у ассиста, и ввели это, насколько я помню, только в катаклизме.
хорошо, тогда пойдем с начала. при каком раскладе посылается LFG_ROLECHECK_MISSING_ROLE (второй uint32 в SMSG_LFG_JOIN_RESULT = 3). сообщение клиента при этом Someone didn't selected a role after 2 min.
хорошо, тогда пойдем с начала. при каком раскладе посылается LFG_ROLECHECK_MISSING_ROLE (второй uint32 в SMSG_LFG_JOIN_RESULT = 3). сообщение клиента при этом Someone didn't selected a role after 2 min.Не знаю такого, может быть leftover?
- что становится с группой если после создания за 2 минуты кто-то не выбрал роль? распускается или просто выкидывается из очереди?
Группа создается уже после того как все выбрали роли...
при включении в группу посылается менюшка с требованием подтвердить роль. на нее надо ответить за 2 минуты. если кто-то не ответит - что будет?
Менюшка с выбором роли появляется только если игрока пригласили в группу вручную, и то помоему только если у игрока несколько доступных ролей (ну еще после того как кто-то ливнул группу, тоже подтверждение роли идет). При автоматическом инвайте просто появляется подтверждение о телепортации в подземелье без выбора роли (роль выбирается сервером).
Менюшка с выбором роли появляется только если игрока пригласили в группу вручную, и то помоему только если у игрока несколько доступных ролей (ну еще после того как кто-то ливнул группу, тоже подтверждение роли идет).
спасибо. так вот что будет, если при подтверждении ролей кто-то не ответит за 2 минуты?
PS не вижу никаких проблем сделать (опционально конечно) телепортацию и прочие фенечки для LFR рейдов, так же как у близзов для LFG. код абсолютно тот же, строчек 20 добавить всего. как народ считает, стоит делать?
Lordronn
03.05.2011, 20:42
Просто в чат пойдет надпись, что игрок не выбрал ни одной роли. Если в рейде, то помимо надписи ничего не будет, а если в ЛФг - в очередь не встанет.
PS не вижу никаких проблем сделать (опционально конечно) телепортацию и прочие фенечки для LFR рейдов, так же как у близзов для LFG. код абсолютно тот же, строчек 20 добавить всего. как народ считает, стоит делать?
Отдельным патчем если только, как мод чтоб шёл =)
Просто в чат пойдет надпись, что игрок не выбрал ни одной роли. Если в рейде, то помимо надписи ничего не будет, а если в ЛФг - в очередь не встанет.
а зачем ей вставать в очередь если группа уже в инсте например (кто-то сбежал?).
кстати, очередной вопрос. за что кладется аура дезертира из ЛФГ группы? за просто лив, лив в инсте, еще какие прегрешения?
Добавлено через 32 секунды
Отдельным патчем если только, как мод чтоб шёл =)
я и просто патча делать не буду. а это, если будет, то опцией в конфиге.
а зачем ей вставать в очередь если группа уже в инсте например (кто-то сбежал?).
кстати, очередной вопрос. за что кладется аура дезертира из ЛФГ группы? за просто лив, лив в инсте, еще какие прегрешения?
да, если свалит игрок то можно встать по новой в поиск групп и группа доберётся, и продолжит с того место где игрок ливнул (если все игроки в 1 точке +\-10 метров(точное расстояние не помню) то игрока сумонят к лидеру (в его точку) если же больше то игрока сумонят ко входу в инст.
по поводу дебафа
1) если игрок свалил до 1 пула босса то вешается дебаф
2) если игрок убил любого босса и сваливает то дебафа на нём нет
3) если игрок слёг от босса (то есть вся пати померла во время пула) и игрок валит после реса то так же дебафа нет
а зачем ей вставать в очередь если группа уже в инсте например (кто-то сбежал?).
кстати, очередной вопрос. за что кладется аура дезертира из ЛФГ группы? за просто лив, лив в инсте, еще какие прегрешения?
Было в том случае, если я пошёл в инсту и не пройдя её до конца слился нафиг.
В других случаях не знаю, не сталкивался. Но это 100% дезертир (кинул группу не пройдя инст).
Поправка, дебафф дезертир накладывается на игрока если он свалил из группы раньше некоторого времени. Не помню точно, кажется минут 20-30.
Расчет идет так: игрок портнулся в инст, пошел отсчет времени t1
Игрок ливает из группы, вычисляется timedif = константа - t1. Если timedif больше 0, то игрок получает дебаф дезертир на время timedif, если меньше или равно 0, никакого дебафа не будет.
Константа это и есть некоторое время в минутах, по истечению которого игрок не считается дезертиром.
Легко вычислить ;)
Зайти в инст, посидеть там минуту и слиться =) минута+длительность дебафа=константа ;) Кто проверит?
сейчас сервера все лежат, техобслуживание. Сегодня же среда -)
после часа зайду проверю
Помоему если ливаешь раньше того, как кулдаун на использование случайного поиска подземелий кончается (15 мин), вешается дебаф.
Помоему если ливаешь раньше того, как кулдаун на использование случайного поиска подземелий кончается (15 мин), вешается дебаф.
убивал босса за 5 минут с начала инста потом ливал, ничего небыло, как будто пропустили мой пост про это((
это до какого боса можно дойти меньше чем за 5 мин ?
В общем немного не так, сейчас зашел проверил.
После сбора группы и входа в инст запускается таймер 15 минут
Если ливнуть в течении этих 15 минут, получаешь дебаф на 30 мин.
Насчет боса не знаю, возможно как утверждает Fedia22, если дойти до боса и убить его раньше чем 15 минут, то таймер сбросится, это хз, не проверял
Насчет боса не знаю, возможно как утверждает Fedia22, если дойти до боса и убить его раньше чем 15 минут, то таймер сбросится, это хз, не проверял
Тут просто выполняется условие, что прохождение инста засчитано, а значит и никакого дебафа быть не может...
Тут просто выполняется условие, что прохождение инста засчитано, а значит и никакого дебафа быть не может...
в некроситере почти сразу же 1 бой, идти 3 минуты, убивал и ливал специально, нет убивал не ласта а 1 босса (для проверки)
Что становится с игроком, отказавшимся принять предложение в группу? Выкидывается из очереди вообще, опускается в самый зад, просто ничего?
Статистика по очереди (среднее время ожидания, число хилов-танков) показывается общая на сервер, или по разным типам подземелий своя статистика?
Что становится с игроком, отказавшимся принять предложение в группу? Выкидывается из очереди вообще, опускается в самый зад, просто ничего?
Статистика по очереди (среднее время ожидания, число хилов-танков) показывается общая на сервер, или по разным типам подземелий своя статистика?
1. Выкидывается из очереди вообще (вы вышли из очереди потому что не приняли приглашение бла бла бла).
2. Без понятия, скорее всего по типам.
1. Выкидывается из очереди вообще (вы вышли из очереди потому что не приняли приглашение бла бла бла).
2. Без понятия, скорее всего по типам.
Хорошо, а если приглашают в частично пройденное подземелье? Или такого на оффе нет?
Опять же - если группа еще не создана, 1 отказался - всех из очереди или только его (или вообще создается группа без отказантов и кидается в очередь групп?)
В трине статистика вообще по каждому подземелью ведется... Ну тогда и я так же сделаю.
Lordronn
08.05.2011, 08:05
Хорошо, а если приглашают в частично пройденное подземелье? Или такого на оффе нет?
Также
Опять же - если группа еще не создана, 1 отказался - всех из очереди или только его (или вообще создается группа без отказантов и кидается в очередь групп?)
Его выкидывает из очереди, а остальных кидает в начало очереди в той же группе только без него
1 отказался - всех из очереди или только его
Если в очередь вставали группой, то выкидываются все. Если поодиночке - только этот игрок.
куда надо возвращать игрока после
1) успешного окончания подземелья
2) выхода игрока из группы (в случаях окончания, середины, начала - как я понял из обсуждения, по ауре. сделаем).
3) кика его оттуда же
4) ухода в оффлайн
Возвращает туда где остановился, перед телепортом в инст. (Еще заметил в 3.3.5 , что если останавливался допустим лицом к чему то , то после инста появлялся задом, т.е разварачивало всегда.. ну это не так уж и важно)
...
4) ухода в оффлайнВнутрь инста у входа
Lordronn
08.05.2011, 21:04
Внутрь инста у входа
Не всегда. Уже вот дня 3 не доходя до конца Зул Амана оффаюсь. На след. утро захожу и нахожусь уже в месте, из которого ТПшнулся. Небольшое уточнение: сначала я загружаю локацию зул Амана, а после уже ТПшусь в локу(видно по экранам загрузки)
...
в месте, из которого ТПшнулся.
...??На след. утроА конкретнее? В 7:00 по серверному инсты выгружаются и вы уже никак не попадете на то же место, если были в это время в оффлайне (в противном случае предложит продлить сохранение).
Когда лидер ставит группу ("вступить группой") в очередь в случайное подземелье, кому приходит сообщение о постановке? всем или только лидеру?
После постановки группы в очередь, запускается ли проверка ролей? Если запускается - всем или всем кроме лидера?
Когда лидер убирает группу из очереди - кому приходит сообщение (см выше :)?
1 - всей группе
2 - проверка ролей запускается для всех в группе
3 - всей группе
Когда лидер ставит группу ("вступить группой") в очередь в случайное подземелье, кому приходит сообщение о постановке? всем или только лидеру?
Всем участникам.
После постановки группы в очередь, запускается ли проверка ролей? Если запускается - всем или всем кроме лидера?
Всем, кроме лидера - у него она уже выбрана.
Когда лидер убирает группу из очереди - кому приходит сообщение (см выше :)?
Так же, всем.
Всем участникам.
Всем, кроме лидера - у него она уже выбрана.
в какой момент приходит - сразу или после проверки ролей?
если у лидера 2-3-4 роли - тоже не приходит, выбирается автоматом?
Всем, кроме лидера - у него она уже выбрана.
поправочка, встать может любой даже не лидер, кто первее откроет окно рандом инста и нажмёт на "да".
в какой момент приходит - сразу или после проверки ролей?
если у лидера 2-3-4 роли - тоже не приходит, выбирается автоматом?
После.
Ну он как бы уже выбрал роли сам перед постановкой в очередь.
поправочка, встать может любой даже не лидер, кто первее откроет окно рандом инста и нажмёт на "да".
Это уже когда группа в инсте и кто-то ливнул.
Lordronn
12.05.2011, 15:14
Когда лидер ставит группу ("вступить группой") в очередь в случайное подземелье, кому приходит сообщение о постановке? всем или только лидеру?
в чат пишется. Видять все
После постановки группы в очередь, запускается ли проверка ролей? Если запускается - всем или всем кроме лидера?
Нет, она запускается после нажатия. Если свои роли подтвердили не все игроки, то в очередь группа не попадет
Видно всем
кому не лень, распишите по пунктам что происходит после лива игрока из пати
-игрок - улетает назад и получает (или не получает) дебафф, так?
- пати - входит в проверку ролей и в очередь (автоматом или по кнопке? в начало или как повезет? какие сообщения идут ?)
выдается ли стоящему в очереди игроку при наведении "на глаз" прогресс формирования группы? то же самое для группы?
-игрок - улетает назад и получает (или не получает) дебафф, так?
Да. Дебаф уже обсуждали ранее.
- пати - входит в проверку ролей и в очередь (автоматом или по кнопке? в начало или как повезет? какие сообщения идут ?)
Появляется вопрос типа продолжить или нет, если да, то проверка ролей запускается, если нет, ничего не происходит
выдается ли стоящему в очереди игроку при наведении "на глаз" прогресс формирования группы? то же самое для группы?
Иногда. Обычно прогресс появляется только когда время нахождения в очереди приближается к среднему времени ожидания.
Предложение о продолжении инстанса приходит только лидеру или всей группе? (я почему спрашиваю все это - могу сделать хоть так хоть так, достаточно все равно. хочется чтоб приближалось к оффу).
Если предложение о продолжении отклоняется - что происходит с группой/игроками? Портаются домой (с дебаффом опять же?) Или просто группа становится обычной?
если человек открыл окно рандома и нажал на "да" (продолжить инст) вот у всех вылезло выбор ролей, они встают в очередь и остаются на своих местах (но могут портануться из инста дабы покачаться/выполнить квесты) если же кто то отказывается от выбора роли то отклоняется сразу у всей группы
Я так и не понял что же происходит с пати если 1) никто не открыл окно рандома и не нажал 2) нажал, но кто-то при проверке ролей отказался.
опять вопросы - сколько надо голосов за кик из пати? то же самое, если в пати уже 4(3) члена? кто станет лидером если кикнули лидера?
Lordronn
14.05.2011, 09:03
Я так и не понял что же происходит с пати если 1) никто не открыл окно рандома и не нажал 2) нажал, но кто-то при проверке ролей отказался.
ничего. Просто они будут в инсте находится, пока не ливнут или не сделают то, что ты описал
ничего. Просто они будут в инсте находится, пока не ливнут или не сделают то, что ты описал
группа продолжает оставаться ЛФГ (основное видимое отличие - наличие пункта "голосовать за исключение" в меню) или становится обычной? если они закончат инсту в таком составе - награда за ЛФГ будет?
группа продолжает оставаться ЛФГ (основное видимое отличие - наличие пункта "голосовать за исключение" в меню) или становится обычной? если они закончат инсту в таком составе - награда за ЛФГ будет?
Такая же рандом-группа, только не полная. Много раз и в 3, и в 4 человека добивали инст, всё давалось - и награды, и ачивки.
Кто-нибудь может кинуть пример того что сервер шлет клиенту после CMSG_LFG_GET_STATUS? Можно даже без разбора и с 4.х. Никак не могу понять что оно от меня хочет...
Думаю, что пустой, т.к судя по клиенту, шлется при входе в мир и еще чем-то, кажется открытие ЛФД фрейма
Связано раньше было с камнями встреч, мб сейчас unused
Хотя конечно, лучше б сниф
Ясно. Ну нет - так нет. Тогда общей статистики не будет.
Результаты 2х месячного переписывания ЛФГ для мангоса (код получился почти на 100% новый, от ТС осталось несколько енумов и часть процедуры доп. награды) можно взять на альфатестирование (начинается с сегодня) в бранче R2 -
https://github.com/mangosR2/mangos
Публиковать отдельным патчем или делать отдельный бранч не буду - пользы с этого никакой, один лишний геморрой.
В очередной раз предупреждаю, что на вопросы "как скомпилить" я отвечаю только по рекомендации, выданной персонально tempura.
Выражаю благодарность всем помогавшим в этой теме. Достаточно большая часть игровой механики системы взята именно отсюда.
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot