Перейти к содержимому

Высокая работоспособность
Геодата, классы и способности, подземелья и рейды:
всё, как было на официальных серверах!
Без малого 15 лет работы
29 июня нашему проекту исполняется 15 лет,
старейший сервер рунета,
ни одного вайпа за этот срок!
Бесплатно и без доната
Наш проект является полностью бесплатным,
на нём отсутствует покупка игровых ценностей, влияющих на баланс.
Отсутствие лагов
Благодаря 4 мощным серверам и надежному провайдеру
в игре полностью отсутствуют лаги!
Трансфер с других серверов
Приходите к нам со своим персонажем,
воспользуйтесь БЕСПЛАТНОЙ
услугой по переносу персонажа на наш проект!
Высокий онлайн
Онлайн на всех наших мирах РЕАЛЬНЫЙ,
ежесуточно наши миры посещает более
12000 игроков!
Хорошая техподдержка
Четыре сотрудника, отвечающих за решение ваших вопросов,
всегда выслушают и обязательно помогут.
Мы предоставляем действительно качественный сервис!
Начать играть
К системе поощрения активных игроков

Багаются руны


  • Ответить

Информация об ошибке

  • #014502

  • Issue

  • 0 - Не определена

  • Мало информации

Подтверждение ошибки

  • Да (17)Нет (0)

Сообщений в теме: 45

BRAIN TRIPPIN

BRAIN TRIPPIN

Багается атака\спелы, после заходу в игру. Можно конечно сделать релог или дунуть горн(что помогает на 1 ротацию) но в какой то момент, может снова все багнуться. Ничего не происходило с персонажем до этого, нигде не застревал и вообще все как обычно делаю и тд. Да это макросы, но там только вбито /startattack и /cancelaura Длань защиты. Кстати почему то Ледяной удар можно юзать. Багается в любом спеке и при любых обстоятельствах.

 

Скрытый текст

#41
riomcboo

Скрытый текст

 

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

 

Я сперва сделал ошибку, я думал эти пакеты одинаковы, и миссия их показать что было "до и после" присылания пакета. Но оказалось, что пакеты пересылаемые в куче с заклинанием - должны нести в себе только затраченные руны. А пакет входящий с состав ResyncRunes должен нести в себе только восстановленные руны.

 

Нарушение этого правила ведет к непредсказуемым последствиям. Я 4 дня пытался понять как клиент их обрабатывает, но лишь методом тыка нащупал в чем суть.

 

Итак это может отличаться от 335a, но вот такие там правила:
1) Заклинание отсылает только информацию о использованых рунах, маски "до и после" должны именно это отражать в себе. Также важно передавать значения всех кулдаунов, даже если они нулевые (успели откатиться) - восстановленные руны включать в маски нельзя!!!

 

2) ResyncRunes отсылает только информацию о восстановленных рунах. При этом на 3.4.3 он требует передать нулевые кулдауны (нулевые ибо откатило уже) без особой на то надобности, и при этом только тех рун, которые откатились и которые отображены в максках "до и после"

 

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

 

Поэтому если этот баг проявляется именно с Кровоотводом и РуническимОружием - то могу предположить, что эти заклинания восстанавливают руны и присылают эту информацию не через ResyncRunes , а в пакете заклинания (что как я уже говорил нельзя делать)

 

Нужно просмотреть скрипты и реализацию этих спеллов - возможно в этом и дело

Сообщение отредактировал riomcboo: 04 февраля 2025 - 09:34

#42
riomcboo

Есть еще одно предположение. Если у вас все ровно реализовано и Кровоотвод дает руну - возможно руны не нужно обновлять вручную, а просто обнулить таймер, чтобы он обновился через ResyncRunes самостоятельно

#43
newdk

У меня так только визуально багается. Урон проходит, а анимация на скилах не пропадает, показывает ,что доступно. Это иногда путает очень сильно, думаешь что у тебя есть руны, по факту они уже в кд, немного спустя времени они откатываются и все встает на свои места. Это иногда происходит когда ты нажимаешь кровавый удар и какую нибудь из других рун, возможно это из за рун смерти. Потому, что кровоотвод может сделать из кровавой руны, руну смерти и на удар плети взять руну смерти и к примеру руну льда. Остается из активных только руна нечестивости. А показывает ,будто руна льда тоже активна и из за этого баг. Типо можно сделать удар плети, по факту все в кд)

#44
riomcboo

 

[spoiler]
Любое нарушение этих правил приводит к тому, что визуально руны могут ложиться на КД и тому подобное - но с их восстановлением твориться жуткая дичь.

 

Я то и имел в виду визуально. Еще я заметил в официальном коде Тринити, что состояние рун на момент каста записывается в момент каста. Насколько я помню - в заклинаниях есть две основных фазы - каст и прилет. Если заклинание мгновенное (без анимации снаряда), то все равно расчет урона идет только на фазе прилета , потому что пока снаряд долетит - может быть иммун или еще что. Поэтому в фазе каста сохраняется состояние рун, бафы. А в состоянии прилета - берутся по факту бафы и дебафы на цели заклинания и уже происходит полный расчет.

 

Так вот, между этими фазами есть промежуток (потому что момент каста и урона могут занимать секунды и больше), в котором цикл сервера продолжается. И в этот момент в этом промежутке руны могут обновится через ResyncRunes, от чего текущее и прошлое состояние (до и после) меняется. Но заклинание хранит другую версию того что было до, потому что состояние рун записывается в момент каста. В этом и наверное кроется ошибка.

 

Нужно предыдущее состояние рун хранить в отдельной переменной и обновлять ее всегда когда обновляются руны любым из двух способов (через каст заклинания или через ResyncRunes). И тогда если в промежутке между кастом и прилетом прокнет обновление КД через ResyncRunes - последовательность не нарушиться.

 

Вот как на мой взгляд происходит баг:
1) Допустим у нас две руны на КД, и скоро КД одной из них спадет. Игрок нажимает каст заклинания, сохраняется состояние рун (к примеру 11-01-01)

 

2) В промежутке между кастом и прилетом одна руна восстанавливается в Player::RegenerateAll() и посылается пакет:
До (11-01-01)
После (11-11-01)

 

3) В фазе прилета заклинание попадает в цель (или промах) выбирается время кулдауна 10с или 1,5с, вешается КД на руну, новое состояние теперь такое: 01-11-01

 

В итоге сервер получает два пакета почти одновременно:
1й) пакет от Player::RegenerateAll() с данными:
До (11-01-01)
После (11-11-01)
2й) пакет с кастом заклинания с данными:
До (11-01-01))
После (01-11-01)

 

Цепочка состояний нарушена, но что у голове у клиента в голове непонятно, возможно он просчитает своей логикой и восстановит последовательность путем каких-то допущений. Но что будет, если данным заклинанием окажется Кровоотвод, или например комбинация этой ситуации с последующим или предшествующим Кровоотводом?

 

Ведь смотрите, зачем вообще отправлять информацию что было до и что было после? Если можно просто оправить маску тех рун, которые изменились без всяких до и после и плюс информацию о кд. Да даже просто инфу о текущих КД? Как он это делает с обновлением маны, например.

 

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

 

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

 

Но нужно также учитывать что у пакетов есть айдишники и он еще может следить за их последовательностью. Поэтому точно сказать нельзя что будет, но можно сказать точно, что в общем случае ему по айдишникам и пересланным КД удается понять, что в цепочке состояний была ошибка, а не потеря пакетов, и косвенно он может правильно восстановить цепочку и забить на это. Что якобы происходит в обычном случае.

 

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

 

В общем я у себя в 3.4.3 реализовал так, что заклинание не сохраняет состояние рун при касте. Состояние рун у меня сохраняется только после факта синхронизации любым их методов (каст или ResyncRunes в Player::RegenerateAll() ). Таким образом плевать на последовательность синхронизации и обсчета каста - прилета - цепочка состояний сохраняется всегда правильная. У меня даже можно повешать КД несколько раз подряд, на каждую руну отдельно, либо сразу на несколько, не важно, предыдущее состояние перезапишется только в момент отсылки пакета. Что и гарантирует последовательность

Сообщение отредактировал riomcboo: 07 февраля 2025 - 20:27

#45
riomcboo

Случайный дубляж, мышка лагает, два раза кликнул что ли....

Сообщение отредактировал riomcboo: 07 февраля 2025 - 20:28


0 пользователей просматривают этот вопрос

0 пользователей, 0 гостей, 0 скрытых пользователей

UCaller Visa Mastercard Paypal Qiwi Robokassa Yookassa
Договор-оферта Условия возврата
Подробности - о сервере?
Играй на нашем сервере!
Бесплатный сервер WoW 3.3.5 Wrath of the Lich King - уже 16 лет мы радуем наших игроков, присоединяйся к ним!
Без доната! Всё работает!
Нет - продаже предметов, влияющих на игровой процесс. Да - высокой работоспособности - проверь!

Система лояльности

За внутриигровую активность Вы будете получать Сферы Лояльности, которые автоматически конвертируются в бонусы для покупок в магазине сервера:

  • Победа в матче на Арене: 15% от текущего рейтинга;
    (т.е. примерно 300 при рейтинге в 2000)
  • Победа в сражении на Полях Боя: 12.5% от текущего рейтинга;
    (т.е. примерно 500 при рейтинге в 4000)

(только при использовании системы Поиска Подземелий)

(только актуальные рейдовые подземелья - ЦЛК, РС и ИВК)

За каждые 100 Сфер Лояльности Вы получаете 1 бонусный рубль, который можете использовать для полной или частичной оплаты чего-нибудь нужного из магазина.


Участие в особом событии - Цареубийстве!

Кажд (для игроков Альянса) и кажд (для игроков Орды) с 16:00 до 22:00 (по московскому времени) проводится особое событие - Цареубийство!


Достаточно убить одного из предводителей противоположной фракции и получить награду: 2000 Сфер Лояльности! Следите за уведомлениями в чате...


Еженедельно можно получить 15000 Сфер Лояльности, после достижения данного значения бонусы за вышеперечисленные действия начисляться не будут.