данянул <3
前往频道在 Telegram
Блог (щитпостинг) разработчика Null's Brawl и других проектов. Мои подписчики лучшие. Основной канал по NB: @nulls_ru
显示更多9 225
订阅者
-924 小时
-487 天
-10130 天
数据加载中...
吸引订阅者
九月 '26
九月 '26
+3
在0个频道中
八月 '26
+140
在2个频道中
Get PRO
七月 '26
+312
在5个频道中
Get PRO
六月 '26
+181
在1个频道中
Get PRO
五月 '26
+510
在3个频道中
Get PRO
四月 '26
+207
在4个频道中
Get PRO
三月 '26
+611
在1个频道中
Get PRO
二月 '26
+2 054
在3个频道中
Get PRO
一月 '26
+393
在6个频道中
Get PRO
十二月 '25
+226
在0个频道中
Get PRO
十一月 '25
+141
在2个频道中
Get PRO
十月 '25
+248
在3个频道中
Get PRO
九月 '25
+190
在1个频道中
Get PRO
八月 '25
+146
在1个频道中
Get PRO
七月 '25
+206
在1个频道中
Get PRO
六月 '25
+185
在8个频道中
Get PRO
五月 '25
+173
在1个频道中
Get PRO
四月 '25
+142
在1个频道中
Get PRO
三月 '25
+299
在3个频道中
Get PRO
二月 '25
+246
在1个频道中
Get PRO
一月 '25
+347
在1个频道中
Get PRO
十二月 '24
+639
在3个频道中
Get PRO
十一月 '24
+1 129
在2个频道中
Get PRO
十月 '24
+337
在1个频道中
Get PRO
九月 '24
+1 314
在2个频道中
Get PRO
八月 '24
+716
在12个频道中
Get PRO
七月 '24
+1 035
在5个频道中
Get PRO
六月 '24
+806
在6个频道中
Get PRO
五月 '24
+1 260
在12个频道中
Get PRO
四月 '24
+412
在1个频道中
Get PRO
三月 '24
+385
在1个频道中
Get PRO
二月 '24
+295
在3个频道中
Get PRO
一月 '24
+299
在2个频道中
Get PRO
十二月 '23
+918
在2个频道中
Get PRO
十一月 '23
+173
在2个频道中
Get PRO
十月 '23
+201
在0个频道中
Get PRO
九月 '23
+566
在0个频道中
Get PRO
八月 '23
+106
在0个频道中
Get PRO
七月 '23
+587
在0个频道中
Get PRO
六月 '23
+63
在0个频道中
Get PRO
五月 '23
+128
在0个频道中
Get PRO
四月 '23
+204
在0个频道中
Get PRO
三月 '23
+144
在0个频道中
Get PRO
二月 '23
+75
在0个频道中
Get PRO
一月 '23
+29
在0个频道中
Get PRO
十二月 '22
+48
在0个频道中
Get PRO
十一月 '22
+64
在0个频道中
Get PRO
十月 '22
+48
在0个频道中
Get PRO
九月 '22
+88
在0个频道中
Get PRO
八月 '22
+53
在0个频道中
Get PRO
七月 '22
+110
在0个频道中
Get PRO
六月 '22
+69
在0个频道中
Get PRO
五月 '22
+115
在0个频道中
Get PRO
四月 '22
+156
在0个频道中
Get PRO
三月 '22
+198
在0个频道中
Get PRO
二月 '22
+299
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 03 九月 | +1 | |||
| 02 九月 | 0 | |||
| 01 九月 | +2 |
频道帖子
В Brawl Stars опять насрано. Как же так?
Но начнем издалека. В этой игре есть такая сущность, как трейт (trait), которая описывает те или иные модификаторы поведения какого-либо объекта. Каждый игровой объект (а их всего 4 класса: AoE, characters, items и projectiles) имеет список своих трейтов.
Впервые в игре они появились в мае 2025 для ивента с васаби, и именно с их помощью были сделаны особые способности персонажей. С тех пор их продолжают активно использовать, в том числе с их помощью работают некоторые пассивки, баффи и прочие механики механики. И даже новые нано-силы...
Каждый трейт описывается объектом TraitData, и все трейты описаны в таблице traits.csv. На данный момент они не могут создаваться динамически. У каждого трейта есть свой тип (enum TraitType), а также произвольные значения. Интерпретация этих значений, а также само по себе поведение трейта, как раз таки определяются его типом.
В коде логики боев это сделано примерно так:
public void handleTraitsOnCauseDamage(...) {
TraitData trait = this.findTraitByType(TraitType.SpawnCharacterOnGetHurt);
if (trait != null) {
/* Handle required behavior */
}
}
Вы можете спросить, а что, это сильно плохо? Вообще, нет, плохо здесь кое-что другое🐱
Плохо здесь то, что разработчиков иногда настигает невероятная деменция и они добавляют новые TraitType для того, что спокойно можно было описать старыми. Окей, у нас есть например вот такие:
• OverrideMaxSpawns и AddMaxSpawns
• OverrideNumSpawns и AddNumSpawns
• OverrideBasicAttackCastingRange и AddCastingRangeNormalAttack
• OverrideUltiCastingRange и AddCastingRangeSuper
И это еще можно понять. А вот например "OverrideAreaEffectStatusEffectEnemy" и "OverrideEnemyStatusEffectToAreaEffect" чем отличаются? Если вам кажется, что абсолютно ничем, то так оно и есть!
А код обработки этого превращается в что-то такое:
public StatusEffectData getEnemyStatusEffect(...) {
TraitData trait = findTraitByType(TraitType.OverrideAreaEffectStatusEffectEnemy);
if (trait != null) {
return trait.statusEffect;
}
TraitData trait2 = findTraitByType(TraitType.OverrideEnemyStatusEffectToAreaEffect);
if (trait2 != null) {
return trait2.statusEffect;
}
/* ... */
}
Понятное дело, что этот код я могу переписать, добавить findTraitByAnyOfTypes(...) или что-то такое. Но какого черта вообще? Сейчас в игре 394 различных типа трейтов. Из них спокойно можно было бы выкинуть почти половину, немного подправить таблицу traits.csv и стало бы только лучше!
Ах да, и при всем этом разнообразии (и постоянных повторениях одинакового кода) у них же еще есть "классические" способности, которые определялись с помощью CardData (cards.csv). Там тоже хватает подобного безобразия, например "ulti_leach_health" и "heal_ulti".
И еще забавный прикол, раз уж пост решил написать: в скомпилированном нативном коде TraitType представлен в виде int32. При чтении traits.csv игра берет значение клетки Type (это строка) и преобразует в этот численный ID, и оказывается есть небольшой прикол: есть такие TraitType, у которых аж два названия. Это:
• OverrideProjectileSupe и OverrideProjectileSuper (ID = 306)
• AddProjectileDmgPercentageOverDistance и AddProjectileDmgPercentageEndDistance (ID = 313)
По сути, это алиасы. Почему? Наверное, разработчик логики не смог договориться с человеком, который .csv таблицы заполняет🙂
Уж лучше бы они те одинаковые трейты с "enemy status effect" сделали алиасами, блинб(| 2 | claude fix our insfrastructure make no mistakes
Если вам кажется, что серверам Brawl Stars после обновления стало плохо — нет, вам не кажется😑
Это заметно даже по графикам мониторинга нашего Null’s Proxy. Многие из них теперь выглядят довольно аномально. Во время большого онлайна трафик к серверам Supercell скачет туда-сюда, а количество реконнектов на каждого игрока выросло почти в два раза по сравнению с тем, что было до обновления.
На первом графике отражен текущий трафик (MiB/s), а на втором новые коннекты в секунду (conns/s). При этом общее количество игроков онлайн практически не изменилось, а в некоторые дни (например, вчера) оно было даже немногим меньше, чем до обновления.
Вы можете задать закономерный вопрос: а нормально ли оценивать состояние серверов Supercell исходя из этой статистики? И да, и нет. Я делаю выводы о том, что проблема на их стороне, в основном исходя из большого количества жалоб даже от тех, кто не использует Null’s Proxy... | 9 090 |
| 3 | С понедельника программы вконтакте не будет ее полностью удаляют!
Нам сидеть вконтакте осталось совсем чуть-чуть! | 10 218 |
| 4 | Помните о Mo.co? Новая игра Supercell, которая сейчас в бете. Они ее очень долго не обновляли, однако на днях произошел невероятный завоз контента, а именно:
1. Техперерыв на 24 часа. Я не шучу! Очевидно, ни один деплой не может длиться так долго и его растянули искусственно — но зачем?
2. Я зашел в игру и сразу же заметил, что моего собственного персонажа заменили на инвалида с темной кожей и кривым лицом. Какого черта вообще? У них совсем крыша на инклюзивности поехала или мне просто не повезло?
3. Раньше мыльным был только геймплей, а теперь еще и половина интерфейса.
4. Чат в игре лагает и дергается так, как будто бы сделан на Flutter или в WebView. Хотя внутрь я не смотрел еще и надеюсь, что это не так.
5. Каждый раз когда хочется свернуть приложение на iOS, оно пишет мне про дисконнект из-за неактивности. Даже если я был просто в главном меню...
И ладно бы мелкие баги, но со второго пункта меня вообще разнесло. Даже в Squad Busters разработчики себе такого не позволяли! | 7 340 |
| 5 | Опросы по картам снова открыты!
Ссылка и процесс прохождения остались прежними: dnull.xyz/polls.html. | 10 113 |
| 6 | Интересные факты о будущем Brawl Stars:
1. Кодовое имя одного из персонажей следующего (v68) обновления: KatanaKid. Его логика частично присутствует уже в текущей версии.
2. Кажется разработчики воодушевились нашим режимом на 50 игроков и добавили в игру скрытый режим "LargeShowdown". При этом глобальный лимит на количество команд повышен до 31 (было: 15), а на количество игроков аж до 63 (было: 15), но лимиты на размер карты (63x63) не увеличивались.
Если хотите, могу еще что-нибудь рассказать... может быть о новой физике мяча в v67? | 14 266 |
| 7 | блять а прикиньте они накрутку устраивают с аккаунтов тех, кто скачал их клиент... если честно это даже крипово... | 10 250 |
| 8 | ладно знаете в чем еще ебанина? они еще и ПОДПИСЧИКОВ накручивают пидарасы
а что если сделать платную подписку на канал... | 10 207 |
| 9 | кстати если че напоминаю
если вдруг вы скачали это приложение Telega то удалите немедленно!!
их сервера получают ключи для расшифровки всех ваших сообщений (если очень упрощенно) | 9 765 |
| 10 | ладно давайте смотрет сколько наберется | 9 138 |
| 11 | КУХАХВХАЫХВАХВАЗЫВХА блять представьте ебальнички людей которые такие "нам нужен БЮДЖЕТ на накрутку дизлацков" | 8 963 |
| 12 | Блокировка накрутка Роскомнадзор.
Обход VPN блокировка РКН — накрутка накрутка, VPN Дуров Телега. Обход Дуров обход Дуров VPN, Роскомнадзор РКН. Дуров обход, Роскомнадзор ВПН Роскомнадзор Телеграм.
Vpn Телеграм прокси Дуров. Телеграм Телега накрутка обход ВПН, Телега РКН РКН Роскомнадзор Роскомнадзор. Накрутка VPN накрутка Роскомнадзор, Телеграм ВПН блокировка блокировка блокировка.
Прокси ВПН. Телега Даль.
Даль Даль Телега VK Group. | 8 632 |
| 13 | Как вы там, замедлили вам Telegram?
Надеюсь, здесь никому не надо объяснять, как обходить подобные блокировки. Однако бывает так, что по какой-то причине делать это невозможно — и тогда приходится рассматривать альтернативные решения. Но не спешите переходить в СКАМ, ведь есть решения получше!
И одним из таких решений я периодически пользовался в течение последних трех месяцев, встречайте — Element и протокол Matrix.
У этого протокола есть несколько заметных преимуществ, которые могут быть актуальны при всей сложившейся ситуации:
1. Децентрализованность: в Matrix нет единого сервера, который можно заблокировать. Вы создаете аккаунт на любом сервере по вашему выбору, и затем можете общаться с людьми с других серверов в одной общей сети. Amazing!
2. Адекватное E2E-шифрование: в отличие от Telegram, здесь им можно пользоваться, и в ЛС, и в групповых чатах. И в отличие от WhatsApp, у вас есть больше контроля над ключами и возможность использовать несколько устройств.
3. Как мне показалось, спецификация протокола выглядит довольно хорошо, в неё даже приятно погружаться и вникать. Это вам не Telegram Bots API какой-нибудь, здесь все продумано!
Также существует несколько разных клиентов на выбор: Element, Nheko, FluffyChat, много их разных и всяких. Фактически "дефолтным" клиентом сейчас стал Element, поскольку он наиболее feature-complete с протоколом Matrix, а также полностью поддерживает звонки. Тем не менее, к сожалению, он не идеален: не самый лучший интерфейс (но в целом выглядит приемлемо) и нет некоторых привычных функций (например, обрезания картинок при отправке).
Так, и что дальше? В целом, просто хотел рассказать об этом интересном мессенджере (точнее даже о протоколе), чтобы вы знали о его существовании.
Лично я сейчас не пользуюсь им, как основным. И вам не очень советую переходить в него полностью. Но время от времени он оказывается довольно полезен, в нем даже сидят некоторые участники моего чата. А еще я там созваниваюсь с родственниками без VPN😑
Если вы хотите попробовать, учтите, что стандартный сервер (matrix.org) уже давно заблокирован. Но помните про децентрализацию? Вы можете поднять свой сервер, либо воспользоваться моим (dnull.xyz), чтобы иметь возможность общаться (и даже созваниваться) без ограничений. Вот так вот.
А так, пиздец, до чего же мы докатились... | 8 455 |
| 14 | Прошло почти 3 года? Значит, пора... | 10 776 |
| 15 | У меня новый год наступил еще 4 часа назад, капец... успел не только напиться, но и протрезветь, так сказать.
Из забавного: в 2025 году я провел в России чуть больше 4 месяцев. Хорошо это или плохо? Сказать сложно😑
Итоги года есть в большом канале, добавить особо, кажется, и нечего(
А так... поздравляю с новым годом, что ли? Тех, у кого он наступил, и тех, у кого только наступает. Желаю вам как обычно — чтоб было веселее и лучше в новом году. Чтобы точно скучно не было, вот вам елка из Тайланда (да, там нет снега и вообще она странная) | 9 822 |
| 16 | Внимание: сейчас я потратил почти 3 часа чтобы понять, что вторая пассивка Кольта не увеличивает скорость его снарядов, но только если у Кольта есть скин. Я в шоке... всё это время искал проблему у себя, а всё оказалось как обычно! | 10 573 |
| 17 | Supercell как обычно: попробуйте создать карту в режиме Награда за поимку в редакторе карт😑 (спойлер: игра просто вылетит)
Просто смотрите:
1. При входе в редактор карт, игра пытается заспавнить синюю звезду в центре карты
2. Тем самым, она создает новую сущность класса Item
3. Начиная с версии 64.226, при создании сущности этого класса пытается проверить способность AddBulletSizePercent у текущего игрового персонажа (бравлера)
4. В редакторе карт не просто нет "текущего персонажа", в нём даже никакого состояния боя нет — и игра успешно падает с попытках разыменовать нулевой указатель, полученный от функции BattleMode.getInstance()
Выводы? Их редактор карт это просто идеальный пример, как очень хорошую идею можно реализовать очень плохо. Я в шоке. Опять придется фиксить это за них. | 5 934 |
| 18 | Сегодня в Clash Royale случился МЕМ ДНЯ: какой-то человек попробовал повыпускать карты на поле за 0 эликсира и у него... получилось! Я серьезно, вот видео: https://x.com/sk__555/status/1979011746590339076.
Я разобрался почему возникла такая ошибка и теперь готов рассказать и вам.
tl;dr: в последней версии игры ребята начали в запросе клиента передавать стоимость карты, а сервер использовать это значение без должной валидации.
Начнем с того, что бои в Clash Royale полностью эмулируются на стороне сервера. В начале боя и на сервере, и на клиентах создается одинаковый экземпляр LogicGameMode. Любое действие в бою — это та или иная команда (LogicCommand). Сначала она отправляется на сервер, который пытается ее выполнить в рамках локального LogicGameMode, после чего уже сервер рассылает её всем клиентам, которые выполнят команду в тот же самый момент времени (тик). Таким образом между всеми клиентами и сервером достигается одинаковое состояние в каждый момент времени.
Можно ли выполнить так любую команду? Едва ли. Зачастую внутри каждой команды код выглядит следующим образом:
/* LogicDoSpellCommand.execute */
int execute(LogicGameMode mode) {
/* ... */
LogicSummoner summoner = mode.getSummoner(this.playerId);
LogicSpell spell = summoner.getSpell(this.spellIndex);
int cost = spell.getElixirCost();
if (summoner.getElixirPoints() < cost) {
/* Возвращаем ошибку и ничего не делаем больше */
return -13;
}
/* ... */
summoner.useElixir(cost);
summoner.castSpell(spell, this.x, this.y);
return 0;
}
LogicSummoner здесь представляет короля (игрока), а LogicSpell — конкретную карту в его колоде. Это каноничные названия, так уж сложилось.
Код выше — упрощенный пример. Каждая команда при её выполнении проверяет свою корректность, и выполняется только в том случае, если игрок действительно мог сделать соответствующее действие.
Даже если каким-то образом убедить свой локальный клиент в том, что выпустить "Рыцаря за 0 эликсира" — можно, то остальные клиенты и сервер такую команду не выполнят. А затем, после сверки чексуммы, сервер еще и заставит такого игрока-"читера" загрузить настоящиее состояние. Визуальный "Рыцарь за 0 эликсира" пропадет спустя полсекунды.
Чтож, это была предыстория, рассказывающая, почему читерить в боях в Clash Royale нельзя. Но у кого-то получилось, автор, ты что, нас обманываешь??7🙂
Нет-нет, что вы... вы еще не забыли пример кода, который я скинул выше? Это был реальный отрывок кода, только вот в последней версии его решили отрефакторить и переписать.
Раньше LogicDoSpellCommand содержала в себе координаты (x, y), порядковый номер карты (spellIndex) и всё такое. А вот начиная с последней версии (12.169) ситуация поменялась: вместо старого-доброго spellIndex пришел новый 32-битный Int32, в который запаковали сразу несколько полей:
22 lower bits: unknown purpose
6 bits: spell index (от 0 до 31)
4 bits: elixir cost (от 0 до 15)
Давайте назовем этот волшебный Int32 — SpellReference. Хотя доподлинно неизвестно, как эта структура называется на самом деле.
И как вы можете догадаться — да, стоимость карты (эликсир) теперь берется из этой структуры. Которая в свою очередь формируется клиентом. Очень умно, блинкласс!👍
Из забавного — они пытаются проверять эту структуру на корректность. То есть сначала они берут, достают spellIndex, по нему получают Spell, из Spell получают SpellReference. Только вот код сверки выглядит примерно так:
return ((command.reference ^ spell.reference) & 0x39FF8F) == 0;
Да, это какое-то безумие. Комментарии излишни. | 8 754 |
| 19 | Если бы по играм Supercell появилась новая вики (например, supercell.wiki), то я бы... | 8 024 |
| 20 | Помните про опросы по картам? Давненько их не было, да... в общем, вот, думаю вы разберетесь: dnull.xyz/polls.html
(механизм немножко поменялся, но суть всё та же) | 10 023 |
