40 Кб, 1036x583
Разработка League Sandbox (открытого сервера для League of Legends v4.20 (~2014 год)) прекращена по требованию Riot Games (C&D). Но это не мешает энтузиастам и, в частности, мне работать над ним втихаря под страхом смерти вызова в суд.
Ровно через месяц меня заберут в армию, а до тех пор буду иногда постить свои и не только прогрессы здесь.
> You've obviously put a lot of work into Chrono Shift, but I can assure you Chrono Break is coming
Разработка League Sandbox (открытого сервера для League of Legends v4.20 (~2014 год)) прекращена по требованию Riot Games (C&D). Но это не мешает энтузиастам и, в частности, мне работать над ним втихаря под страхом смерти вызова в суд.
Ровно через месяц меня заберут в армию, а до тех пор буду иногда постить свои и не только прогрессы здесь.
1,8 Мб, webm,
1024x768, 0:05
1024x768, 0:05
Мне начинает казаться, что в старой Лиге было слишком много чемпионов с телепортацией. Вчера, например, фиксил R Варвика
6,9 Мб, mp4,
1024x720, 0:57
1024x720, 0:57
Поправил R Алистара. За исключением подозрительно большого урона от пассивки, полностью рабочий кит
>>5825 (OP)
Нифигасе какой тред я отрыл, сам задротю с переодичностью в лигу со второго сезона (Вест 1400).
Это где ты откопал клиент да еще и сервер? И всё рабочее? Как увидел эти предметы аж расплакался от ностальгии.
Нифигасе какой тред я отрыл, сам задротю с переодичностью в лигу со второго сезона (Вест 1400).
Это где ты откопал клиент да еще и сервер? И всё рабочее? Как увидел эти предметы аж расплакался от ностальгии.
>>5950
Случайно нашёл на гитхабе (https://github.com/LeagueSandbox/GameServer), когда свой 2д-клон Лиги писал. Рабочее, к сожалению, очень далеко не всё. Был проект, в котором всё работало (потому что использовались утекшие в сеть оригинальные скрипты первого сезона) - Chrono Shift (его закрытие - мемная история), но его тоже прикрыли и исходников не осталось.
Хочу взять базу от LS и прикрутить оригинальные скрипты - один хер, многие чемпионы (72) почти не изменились к четвёртому сезону.
Случайно нашёл на гитхабе (https://github.com/LeagueSandbox/GameServer), когда свой 2д-клон Лиги писал. Рабочее, к сожалению, очень далеко не всё. Был проект, в котором всё работало (потому что использовались утекшие в сеть оригинальные скрипты первого сезона) - Chrono Shift (его закрытие - мемная история), но его тоже прикрыли и исходников не осталось.
Хочу взять базу от LS и прикрутить оригинальные скрипты - один хер, многие чемпионы (72) почти не изменились к четвёртому сезону.
367 Кб, 800x258
ОП, лучше бы попробовал альтернативный HotS запилить. Это топовейшая моба, жаль только больше не обновляется совсем. Как я понял, запилить свой сервер не шибко сложно, ибо вся логика на клиенте просчитывается.
>>5974
Почитал про HotS, с виду обычный авторитарный сервер, никакой игровой логики на клиенте. Я не хочу начинать с нуля, да и уже увяз по уши. За долгие годы добрые люди отреверсили в хвост и в гриву сетевой протокол и игровые ресурсы старой Лиги, написали и переписали сервер... (про качество кода пока молчу) и некоторое время даже заявляли, что пишут универсальное решение для MOBA-игр
Почитал про HotS, с виду обычный авторитарный сервер, никакой игровой логики на клиенте. Я не хочу начинать с нуля, да и уже увяз по уши. За долгие годы добрые люди отреверсили в хвост и в гриву сетевой протокол и игровые ресурсы старой Лиги, написали и переписали сервер... (про качество кода пока молчу) и некоторое время даже заявляли, что пишут универсальное решение для MOBA-игр
58 Кб, 500x392
>>5983
Кстати, LS стал, пожалуй, моим первым положительным опытом работы в команде. Но по-русски ни один из них ни гугу. Зато по-нашенски немного понимает хакер, который пару месяцев назад обманом (социал инжинеринг, блин) раздобыл исходники Лиги и ещё пары игр в придачу. К сожалению, сторговаться не удалось. Он хотел сначала 1 млн грязных зелёных бумажек, потом 700 тыс. а сейчас и за 100к не берут, а он всё удивляется, почему так.
Кстати, LS стал, пожалуй, моим первым положительным опытом работы в команде. Но по-русски ни один из них ни гугу. Зато по-нашенски немного понимает хакер, который пару месяцев назад обманом (социал инжинеринг, блин) раздобыл исходники Лиги и ещё пары игр в придачу. К сожалению, сторговаться не удалось. Он хотел сначала 1 млн грязных зелёных бумажек, потом 700 тыс. а сейчас и за 100к не берут, а он всё удивляется, почему так.
>>5983
Не, у них Lockstep движок. Все клиенты просчитывают логику у себя. Между клиентами передаётся только ввод.
> с виду обычный авторитарный сервер, никакой игровой логики на клиенте
Не, у них Lockstep движок. Все клиенты просчитывают логику у себя. Между клиентами передаётся только ввод.
Сегодняшний день примечателен спором, стоит ли синхронизировать 0.01 золота, или нет. Я считаю - не стоит, потому что в UI не отобразится, а канал забъёт, если кто-то надумает прибавлять копейку каждый кадр обновления. И ввёл округление синхронизируемых статов. А мне в ответ "так сделано у Риотов". Тьфу, терпеть этого не могу. Только слышу - в глазах ярость какая-то сразу и нож в руках
>>6107
У тебя по механике такого не может быть, золото это int. Если применяются какие то особые формулы, то оно конвертируется во float далее после вычисления обратно в int, всё.
>0.01 золота
У тебя по механике такого не может быть, золото это int. Если применяются какие то особые формулы, то оно конвертируется во float далее после вычисления обратно в int, всё.
Так это не я придумал, так Riot Games накодили. В расшифрованных файлах реплеев полно таких вот пакетов синхронизации:
{
"UnitNetID": 1073741849,
"Data": {
"Stats.Gold": 17.349998,
"Stats.TotalGold": 487.35016,
"Stats.CurrentHealth": 301.34207,
"Stats.CurrentMana": 256.79993
}
}
И это далеко не первый случай их изобретательности, поэтому я и бешусь
{
"UnitNetID": 1073741849,
"Data": {
"Stats.Gold": 17.349998,
"Stats.TotalGold": 487.35016,
"Stats.CurrentHealth": 301.34207,
"Stats.CurrentMana": 256.79993
}
}
И это далеко не первый случай их изобретательности, поэтому я и бешусь
>>6134
Так её тут и делают. Не зря же я в /gd/ :)
Хотя, я сейчас по большей части движок допиливаю, а не сами скрипты
Так её тут и делают. Не зря же я в /gd/ :)
Хотя, я сейчас по большей части движок допиливаю, а не сами скрипты
12,3 Мб, webm,
1024x768, 0:19
1024x768, 0:19
По итогам дня, почти удалось заставить работать Талона, если не считать явных проблем с возвращением клинков
9,1 Мб, mp4,
960x720, 0:25
960x720, 0:25
Починил Кейтлин. Была сломана пассивка и ульта.
1) Пассивка - потому, что событие OnPreAttack вызывалось уже после того, как спелл, которым является автоатака, начинал кастоваться. Плюс, потому, что у Риотов нет дисциплины в заполнении конфигов для автоатак - там могут встречаться любые комбинации флагов, определяющих, каких юнитов следует поражать.
2) Ульта - потому что разделена на два спелла (обычная практика - первый спелл кастуется игроком, второй кастуется первым и запускает снаряд) и вторая часть перывала первую из-за логической ошибки в классе Spell. Моя вина - месячишко тому назад переписал его почти с нуля на async/await для надёжности и читабельности. До сих пор расхлёбываю последствия.
.
Плюс, не всё ясно с временем жизни частиц - когда-то их должен удалять сервер, иначе они будут висеть вечно, когда-то - нет, чтобы они могли красиво испариться. Скрипты уничтожают частицы не всегда, а иногда - просто криво
1) Пассивка - потому, что событие OnPreAttack вызывалось уже после того, как спелл, которым является автоатака, начинал кастоваться. Плюс, потому, что у Риотов нет дисциплины в заполнении конфигов для автоатак - там могут встречаться любые комбинации флагов, определяющих, каких юнитов следует поражать.
2) Ульта - потому что разделена на два спелла (обычная практика - первый спелл кастуется игроком, второй кастуется первым и запускает снаряд) и вторая часть перывала первую из-за логической ошибки в классе Spell. Моя вина - месячишко тому назад переписал его почти с нуля на async/await для надёжности и читабельности. До сих пор расхлёбываю последствия.
.
Плюс, не всё ясно с временем жизни частиц - когда-то их должен удалять сервер, иначе они будут висеть вечно, когда-то - нет, чтобы они могли красиво испариться. Скрипты уничтожают частицы не всегда, а иногда - просто криво
5 Мб, mp4,
1024x720, 0:38
1024x720, 0:38
Назрела необходимость переработать, наконец, снаряды (т.е. missiles).
Забавный факт, Риоты тоже были не в восторге от своей системы, поэтому тоже переработали. Кому интересно, скрины с их кодом и куча букв в придачу тут: https://technology.riotgames.com/news/behind-leagues-new-missile-system .
Я сильно не всматривался, ибо воссоздаваемый период был довольно давно и я уверен, всё можно сделать проще. Начал с того, что всё сломал. Особенно горжусь круговыми, хоть их без отладки и не видно (почему - ещё предстоит разобраться)
Забавный факт, Риоты тоже были не в восторге от своей системы, поэтому тоже переработали. Кому интересно, скрины с их кодом и куча букв в придачу тут: https://technology.riotgames.com/news/behind-leagues-new-missile-system .
Я сильно не всматривался, ибо воссоздаваемый период был довольно давно и я уверен, всё можно сделать проще. Начал с того, что всё сломал. Особенно горжусь круговыми, хоть их без отладки и не видно (почему - ещё предстоит разобраться)
>>6363
А ты можешь избавить лол от "ластхит" механики? Пускай все герои в определённом радиусе получают награду от смерти вражеских крипов.
А ты можешь избавить лол от "ластхит" механики? Пускай все герои в определённом радиусе получают награду от смерти вражеских крипов.
>>6379
Всё могу, но далеко не всё буду. Приоритетом сейчас является предоставление опыта идентичного натуральному, а остальное - на откуп мододелам. Исходники со временем будут выложены в сеть, как того требует AGPLv3
Всё могу, но далеко не всё буду. Приоритетом сейчас является предоставление опыта идентичного натуральному, а остальное - на откуп мододелам. Исходники со временем будут выложены в сеть, как того требует AGPLv3
>>6379
Двачую. Самое сомнительное решение. В ММО давно умели с этим бороться - награда пропорционально внесенному урону (возможно еще нормируя хил,чтобы хилеру тоже перепадало). Когда один делает всю работу, а другой подходит и в крысу забирает все - это же максимально разрушает погружение.
Двачую. Самое сомнительное решение. В ММО давно умели с этим бороться - награда пропорционально внесенному урону (возможно еще нормируя хил,чтобы хилеру тоже перепадало). Когда один делает всю работу, а другой подходит и в крысу забирает все - это же максимально разрушает погружение.
4,8 Мб, mp4,
1024x720, 0:36
1024x720, 0:36
Собрирался сделать и цепные и линейные снаряды, успел только подшаманить линейные.
Плюс, ищу простой и быстрый способ обнаруживать пересечение прямоугольника (задаваемого центром, нормалью, шириной и высотой) и круга (лучше даже стадиона). Пока использую стадион вместо прямоугольника и круги.
Wешка Люксы - это линейная ракета, но "отскакивающая" - возвращается обратно к заклинателю. Так же применяется Дрейвеном. Когда-то применялась и Сивир, но потом Риоты снова разделили её на две: одна туда, другая - обратно. Зачем - не имею понятия. То же самое и с Мастером Йи, его Q была цепной ракетой (что логично), теперь - линейная. Я не хочу трогать конфиги от 4.20, но, похоже, это неизбежно, потому что сюрприз-сюрприз старые скрипты заточены под старые конфиги, хотя таким динозаврам, как Люкс это не мешает.
Плюс, ищу простой и быстрый способ обнаруживать пересечение прямоугольника (задаваемого центром, нормалью, шириной и высотой) и круга (лучше даже стадиона). Пока использую стадион вместо прямоугольника и круги.
Wешка Люксы - это линейная ракета, но "отскакивающая" - возвращается обратно к заклинателю. Так же применяется Дрейвеном. Когда-то применялась и Сивир, но потом Риоты снова разделили её на две: одна туда, другая - обратно. Зачем - не имею понятия. То же самое и с Мастером Йи, его Q была цепной ракетой (что логично), теперь - линейная. Я не хочу трогать конфиги от 4.20, но, похоже, это неизбежно, потому что сюрприз-сюрприз старые скрипты заточены под старые конфиги, хотя таким динозаврам, как Люкс это не мешает.
Сегодня, спустя полгода после первого, был проведён второй еженедельный товарищеский матч. Видосик как-нибудь потом выложу. Для красоты понарасставлял assertов в коде, думая, что ни один не сработает - сработали все, ведётся следствие. Пинг до 300 мс, лаги, баги, вылеты и падения - полный комплект. Плюс, как выяснилось, мои исправления переподключения так и не дошли до мастера.
Вчера всю ночь сидел за переработкой статов - предыдущая система была слишком хорошей, слишком гибкой, из-за чего была путаница. А сейчас планирую спать, спокойной ночи.
Вчера всю ночь сидел за переработкой статов - предыдущая система была слишком хорошей, слишком гибкой, из-за чего была путаница. А сейчас планирую спать, спокойной ночи.
>>6636
Лол. Не зря деды советуют ассерты расставлять.
> Для красоты понарасставлял assertов в коде, думая, что ни один не сработает - сработали все
Лол. Не зря деды советуют ассерты расставлять.
>>6636
Что такое "assertов"?? И зачем их расставлять в коде?
Почему пинг был такой большой? Разве старые версии лола не были намного проще, и лагать там было нечему?
>понарасставлял assertов в коде, думая, что ни один не сработает - сработали все, ведётся следствие.
Что такое "assertов"?? И зачем их расставлять в коде?
>Пинг до 300 мс, лаги, баги, вылеты и падения - полный комплект.
Почему пинг был такой большой? Разве старые версии лола не были намного проще, и лагать там было нечему?
>>6695
Assert - это конструкция вида:
Debug.Assert(Var != null, "Сообщение для тебя: что за хуйню ты мне подсунул? Почему Var == null?"); // Приостановит выполнение, если подключён отладчик.
Ну, во-первых, это красиво. Этакий живой комментарий по поводу того, чего ты ожидал, когда писал. А во-вторых, если ты чего-то не ожидал, ты об этом узнаешь, и все узнают.
Следствие того, что cummunity разбросано по всей Рунтерре. Я, вот, в Ноксусе, мне более-менее повезло, а вот у Морганы был пинг 300+мс.
Старые версии действительно были проще, но сервер писали и пишут рукожопы да-да, это я, поэтому он флудит пакетами. Этот матч, например, играли с отключённой коллизией - один чел из предыдущего поколения разработчиков когда-то давно просил это сделать. Это помогло, но не сильно. Скорее всего, флудят миньоны пакетами синхронизации и автоатак. Система тумана войны (алгоритм со сложностью O(n), лол) различает только видим/не видим без градации "видим, но не на экране", что так же не способствует снижению количества передаваемых данных.
Короче, жду, пока появится кто-то, кто сделает, чтобы было нормально, потому что моих мозгов не хватает, а его всё нет и нет... Да и взяться ему особо не откуда, потому что мои товарищи по несчастью всерьёз боятся судебных исков и строят из себя массонскую ложу. Впрочем, туман войны никто не трогал, поэтому это такое же Г, как и на гитхабе.
> Что такое "assertов"??
Assert - это конструкция вида:
Debug.Assert(Var != null, "Сообщение для тебя: что за хуйню ты мне подсунул? Почему Var == null?"); // Приостановит выполнение, если подключён отладчик.
> И зачем их расставлять в коде?
Ну, во-первых, это красиво. Этакий живой комментарий по поводу того, чего ты ожидал, когда писал. А во-вторых, если ты чего-то не ожидал, ты об этом узнаешь, и все узнают.
> Почему пинг был такой большой?
Следствие того, что cummunity разбросано по всей Рунтерре. Я, вот, в Ноксусе, мне более-менее повезло, а вот у Морганы был пинг 300+мс.
Старые версии действительно были проще, но сервер писали и пишут рукожопы да-да, это я, поэтому он флудит пакетами. Этот матч, например, играли с отключённой коллизией - один чел из предыдущего поколения разработчиков когда-то давно просил это сделать. Это помогло, но не сильно. Скорее всего, флудят миньоны пакетами синхронизации и автоатак. Система тумана войны (алгоритм со сложностью O(n), лол) различает только видим/не видим без градации "видим, но не на экране", что так же не способствует снижению количества передаваемых данных.
Короче, жду, пока появится кто-то, кто сделает, чтобы было нормально, потому что моих мозгов не хватает, а его всё нет и нет... Да и взяться ему особо не откуда, потому что мои товарищи по несчастью всерьёз боятся судебных исков и строят из себя массонскую ложу. Впрочем, туман войны никто не трогал, поэтому это такое же Г, как и на гитхабе.
Как тебе такое, Илон Макс?
private float _total;
private int _dirty = 0;
public float Total => (_dirty-- != 0) ? _total = CalculateTrueMoveSpeed() : _total;
public void IncBaseFlat(float by) => _flatTemp += by * (_dirty |= Convert.ToInt32(by != 0));
private float _total;
private int _dirty = 0;
public float Total => (_dirty-- != 0) ? _total = CalculateTrueMoveSpeed() : _total;
public void IncBaseFlat(float by) => _flatTemp += by * (_dirty |= Convert.ToInt32(by != 0));
>>6880
Ну да, я. Количество строк платное
Ну да, я. Количество строк платное
Я придерживаюсь принципа "сначала пиши, потом думай". С одной стороны, это позволяет быстро добиться результата и я просто не могу иначе; с другой - приходится переписывать по два раза. Как и было со статами, на которые ушло 3 дня. Не скажу, чтобы особо продвинулся, просто всё работает теперь немного иначе и скорость движения считается правильно.
Как было в LS: баффы могут создавать "модификаторы" и применять их к статам. Убирался бафф - его модификатор отнимался от статов не оставляя и следа. То есть, только "постоянные" статы.
Как это реализовано в Лиге (и реализовано мной в LS): статы сбрасываются до "постоянных" точно сбрасываются, но, может, до базовых? при каждом обновлении, после чего снова модифицируются скриптами - это объясняет, почему порядок покупок предметов важен.
Плюс один повод ненавидеть Риот: не смотря на то, что Лиговский сервер идёт на 30-и кадрах в секунду, все скрипты идут на 4-ёх и некоторые даже используют это, например W Ари включает счётчик и ждёт 3 кадра прежде чем позволить огонькам ринуться к ближайшему противнику; W Орианны накладывает бафф, который живёт 2 секунды и каждый кадр уменьшает бонусную скорость из расчёта, что проживёт 8 кадров. Казалось бы, у вас есть функция ExecutePereodically - почему бы её не использовать? - Нет, не хочу, буду говном обмазываться и считать кадры. Из-за того, что LS выдаёт по всем фронтам честные 30 кадров, Ари выпускает огоньки мнгновенно, а Орианна уходит в глубокий минус по скорости. При добавлении баффа, скрипты задают ему частоту срабатывания функций обновления (казалось бы, зачем, просто поставьте внутри ExecutePereodically). Я по наивности полагал, что TickRate=0 значит "выполнять с максимальной частотой", но, как показывает практика на примере Орианны, максимальная частота равняется 4-ём кадрам в секунду. Троттлить вызов функций обновления - не проблема, проблема продумать, как это будет работать если, например, понадобится принудительное обновление статов в случае покупки/продажи айтема, например. Возможно, придётся всё переписывать в третий раз. (Нет, задержка между покупкой шапки Рабаддона и изменением АП - это не то, просто она реализована костыльно)
За скриптами вообще глаз да глаз нужен: нужно будет ввести учёт создаваемых частиц и прибавляемых постоянных статов, чтобы ничего не оставалось висеть после удаления баффов.
Пока чинил частицы, статы и ракеты, у Орианны перестал быть виден шар. Предположение - частицы, хотя казалось бы... В общем, я в печали.
Как было в LS: баффы могут создавать "модификаторы" и применять их к статам. Убирался бафф - его модификатор отнимался от статов не оставляя и следа. То есть, только "постоянные" статы.
Как это реализовано в Лиге (и реализовано мной в LS): статы сбрасываются до "постоянных" точно сбрасываются, но, может, до базовых? при каждом обновлении, после чего снова модифицируются скриптами - это объясняет, почему порядок покупок предметов важен.
Плюс один повод ненавидеть Риот: не смотря на то, что Лиговский сервер идёт на 30-и кадрах в секунду, все скрипты идут на 4-ёх и некоторые даже используют это, например W Ари включает счётчик и ждёт 3 кадра прежде чем позволить огонькам ринуться к ближайшему противнику; W Орианны накладывает бафф, который живёт 2 секунды и каждый кадр уменьшает бонусную скорость из расчёта, что проживёт 8 кадров. Казалось бы, у вас есть функция ExecutePereodically - почему бы её не использовать? - Нет, не хочу, буду говном обмазываться и считать кадры. Из-за того, что LS выдаёт по всем фронтам честные 30 кадров, Ари выпускает огоньки мнгновенно, а Орианна уходит в глубокий минус по скорости. При добавлении баффа, скрипты задают ему частоту срабатывания функций обновления (казалось бы, зачем, просто поставьте внутри ExecutePereodically). Я по наивности полагал, что TickRate=0 значит "выполнять с максимальной частотой", но, как показывает практика на примере Орианны, максимальная частота равняется 4-ём кадрам в секунду. Троттлить вызов функций обновления - не проблема, проблема продумать, как это будет работать если, например, понадобится принудительное обновление статов в случае покупки/продажи айтема, например. Возможно, придётся всё переписывать в третий раз. (Нет, задержка между покупкой шапки Рабаддона и изменением АП - это не то, просто она реализована костыльно)
За скриптами вообще глаз да глаз нужен: нужно будет ввести учёт создаваемых частиц и прибавляемых постоянных статов, чтобы ничего не оставалось висеть после удаления баффов.
Пока чинил частицы, статы и ракеты, у Орианны перестал быть виден шар. Предположение - частицы, хотя казалось бы... В общем, я в печали.
Я придерживаюсь принципа "сначала пиши, потом думай". С одной стороны, это позволяет быстро добиться результата и я просто не могу иначе; с другой - приходится переписывать по два раза. Как и было со статами, на которые ушло 3 дня. Не скажу, чтобы особо продвинулся, просто всё работает теперь немного иначе и скорость движения считается правильно.
Как было в LS: баффы могут создавать "модификаторы" и применять их к статам. Убирался бафф - его модификатор отнимался от статов не оставляя и следа. То есть, только "постоянные" статы.
Как это реализовано в Лиге (и реализовано мной в LS): статы сбрасываются до "постоянных" точно сбрасываются, но, может, до базовых? при каждом обновлении, после чего снова модифицируются скриптами - это объясняет, почему порядок покупок предметов важен.
Плюс один повод ненавидеть Риот: не смотря на то, что Лиговский сервер идёт на 30-и кадрах в секунду, все скрипты идут на 4-ёх и некоторые даже используют это, например W Ари включает счётчик и ждёт 3 кадра прежде чем позволить огонькам ринуться к ближайшему противнику; W Орианны накладывает бафф, который живёт 2 секунды и каждый кадр уменьшает бонусную скорость из расчёта, что проживёт 8 кадров. Казалось бы, у вас есть функция ExecutePereodically - почему бы её не использовать? - Нет, не хочу, буду говном обмазываться и считать кадры. Из-за того, что LS выдаёт по всем фронтам честные 30 кадров, Ари выпускает огоньки мнгновенно, а Орианна уходит в глубокий минус по скорости. При добавлении баффа, скрипты задают ему частоту срабатывания функций обновления (казалось бы, зачем, просто поставьте внутри ExecutePereodically). Я по наивности полагал, что TickRate=0 значит "выполнять с максимальной частотой", но, как показывает практика на примере Орианны, максимальная частота равняется 4-ём кадрам в секунду. Троттлить вызов функций обновления - не проблема, проблема продумать, как это будет работать если, например, понадобится принудительное обновление статов в случае покупки/продажи айтема, например. Возможно, придётся всё переписывать в третий раз. (Нет, задержка между покупкой шапки Рабаддона и изменением АП - это не то, просто она реализована костыльно)
За скриптами вообще глаз да глаз нужен: нужно будет ввести учёт создаваемых частиц и прибавляемых постоянных статов, чтобы ничего не оставалось висеть после удаления баффов.
Пока чинил частицы, статы и ракеты, у Орианны перестал быть виден шар. Предположение - частицы, хотя казалось бы... В общем, я в печали.
Как было в LS: баффы могут создавать "модификаторы" и применять их к статам. Убирался бафф - его модификатор отнимался от статов не оставляя и следа. То есть, только "постоянные" статы.
Как это реализовано в Лиге (и реализовано мной в LS): статы сбрасываются до "постоянных" точно сбрасываются, но, может, до базовых? при каждом обновлении, после чего снова модифицируются скриптами - это объясняет, почему порядок покупок предметов важен.
Плюс один повод ненавидеть Риот: не смотря на то, что Лиговский сервер идёт на 30-и кадрах в секунду, все скрипты идут на 4-ёх и некоторые даже используют это, например W Ари включает счётчик и ждёт 3 кадра прежде чем позволить огонькам ринуться к ближайшему противнику; W Орианны накладывает бафф, который живёт 2 секунды и каждый кадр уменьшает бонусную скорость из расчёта, что проживёт 8 кадров. Казалось бы, у вас есть функция ExecutePereodically - почему бы её не использовать? - Нет, не хочу, буду говном обмазываться и считать кадры. Из-за того, что LS выдаёт по всем фронтам честные 30 кадров, Ари выпускает огоньки мнгновенно, а Орианна уходит в глубокий минус по скорости. При добавлении баффа, скрипты задают ему частоту срабатывания функций обновления (казалось бы, зачем, просто поставьте внутри ExecutePereodically). Я по наивности полагал, что TickRate=0 значит "выполнять с максимальной частотой", но, как показывает практика на примере Орианны, максимальная частота равняется 4-ём кадрам в секунду. Троттлить вызов функций обновления - не проблема, проблема продумать, как это будет работать если, например, понадобится принудительное обновление статов в случае покупки/продажи айтема, например. Возможно, придётся всё переписывать в третий раз. (Нет, задержка между покупкой шапки Рабаддона и изменением АП - это не то, просто она реализована костыльно)
За скриптами вообще глаз да глаз нужен: нужно будет ввести учёт создаваемых частиц и прибавляемых постоянных статов, чтобы ничего не оставалось висеть после удаления баффов.
Пока чинил частицы, статы и ракеты, у Орианны перестал быть виден шар. Предположение - частицы, хотя казалось бы... В общем, я в печали.
Хак для проверки, был ли перезаписан метод в дочернем классе.
Стал частью другого хака, который позволил сократить количество слушателей события и таким образом избавиться от проблем с алгоритмом удаления слушателей сложностью O(n)
(более оптимальные алгоритмы не пишу, лол)
using System;
class A {
public virtual void Void(){}
}
class B : A {
public bool Overriden => this.Void != base.Void;
}
class C : B {
public override void Void(){}
}
class D : B {}
class Program {
static void Main() {
C c = new();
D d = new();
Console.WriteLine(c.Overriden);
Console.WriteLine(d.Overriden);
}
}
Стал частью другого хака, который позволил сократить количество слушателей события и таким образом избавиться от проблем с алгоритмом удаления слушателей сложностью O(n)
(более оптимальные алгоритмы не пишу, лол)
using System;
class A {
public virtual void Void(){}
}
class B : A {
public bool Overriden => this.Void != base.Void;
}
class C : B {
public override void Void(){}
}
class D : B {}
class Program {
static void Main() {
C c = new();
D d = new();
Console.WriteLine(c.Overriden);
Console.WriteLine(d.Overriden);
}
}