[*]ExFactionLevelUpNotify: исправлена бесконечная рекурсия в конструкторе (поле STATIC сделано static, конструктор приватным)
[*]ItemInstance.canBeTraded, canBeSold: исправлено сравнение List.equals(int) на List.contains(int) для проверки whitelist-списков предметов
[*]SkillAcquireHolder.getAcquirableSkillListByClass: убраны ложные nullcheck-и player после фактического разыменования
[*]Skill.<init>: заменён виртуальный вызов isDebuff() на прямое чтение _isDebuff в конструкторе (UR в Summon._summonType)
[*]OfflineBufferManager.showStoreWindow: убран лишний Math.round при целочисленном делении уровня баффера на 10
[*]Player.addExpAndCheckBonus: заменён ошибочный Math.round(long→float) на прямой cast (int) при пересчёте vitality result
[*]AdminOldBan.ban: исправлено отбрасывание результата String.trim, теперь reason-строка реально обрезается
[*]Quest.showTutorialHtmlFile: исправлено отбрасывание результата String.replace, плейсхолдеры в туториальных HTM теперь подменяются
[*]Zone.checkEffects: исправлен дубль getDamageOnHP в условии запуска DamageTimer (теперь зоны с MP-уроном тоже запускают таймер)
[*]CastleSiegeEvent.canResurrect: упрощено избыточное условие проверки зоны (логически эквивалентно !targetInZone)
FortressSiegeEvent.canResurrect: упрощено избыточное условие проверки зоны (логически эквивалентно !targetInZone)
[*]AddItemAction.performAction: исправлен дубль BlessedSpiritShotItemHandler на корректный SpiritShotItemHandler во втором instanceof
FakePlayerUtils.checkAutoShots: исправлен дубль BlessedSpiritShotItemHandler на корректный SpiritShotItemHandler во втором instanceof
[*]SkillUtils.getSubSkillLevel: исправлен дубль enchantLevel в условии — первая проверка должна быть на enchantType
[*]BotCheckManager.loadBotQuestions: добавлена проверка doc на null перед parseBotQuestions, чтобы сбойный парсинг XML не приводил к NPE
[*]FakePlayer.OwnerAttakListener.onAttack: добавлена ранняя проверка target на null, чтобы не передавать null в notifyOwerStartAttak
FakePlayer.OwnerAttakListener.onMagicUse: добавлена ранняя проверка target на null перед вызовом notifyOwerStartMagicUse
[*]Player.onDeath: добавлена защита от NPE при null killer перед вызовом killer.getPlayer
[*]CreatureMovement.buildPathTo: исправлен NPE на _moveList после переприсваивания из GeoEngine.MoveList в ветке выхода из воды на берег
[*]ChaosFestivalArenaObject.onDamage: добавлена ранняя проверка attacker на null перед attacker.getPlayer
[*]OlympiadGame.tie: объединены проверки _member1 и _member2 в один блок, чтобы не разыменовывать один при null-проверке другого
OlympiadGame.winGame: добавлена недостающая проверка looseMember на null в reward-блоке
[*]GameClient.loadCharFromDisk: вызов savehwidtobase перенесён в ветку успешной загрузки, чтобы не дёргать character.getName на null
[*]RequestExEnchantSkillRouteChange.runImpl: добавлена ранняя проверка skillEntry на null перед обращением к getLevel
[*]HtmlMessage.packet: добавлен ранний return при отсутствии и _html, и _filename, чтобы не разыменовывать null content
[*]OlympiadGame: защищены финальные Log.add в tie и winGame от разыменования null _member/looseMember
[*]Party: synchronized-блоки переведены с CopyOnWriteArrayList _members на отдельный _membersLock, чтобы убрать антипаттерн синхронизации на конкурентной коллекции
[*]Boat: synchronized-блоки переведены с CopyOnWriteArraySet _players на отдельный _playersLock, чтобы убрать антипаттерн синхронизации на конкурентной коллекции
[*]ScriptRunner: заменить System.err.println на LOGGER.error, убрать @SuppressWarnings("UseOfSystemOutOrSystemErr")
[*]Version: исправить утечку ресурса JarFile, использовать try-with-resources, убрать @SuppressWarnings("resource")
AdminPolymorph: убрать @SuppressWarnings("fallthrough")
RewardList: убрать @SuppressWarnings("serial")
[*]RndSelector.RndNode.compareTo: исправлено бессмысленное сравнение поля с самим собой, сортировка теперь по убыванию веса
[*]Net.hashCode: исправлен identity-хэш массивов на Arrays.hashCode для _address и _mask
[*]HandysBlockCheckerManager: _arenaStatus переведён на eager init, убрана ленивая инициализация в конструкторе
[*]ItemAuctionManager.getInstance: добавлен synchronized для устранения race при первой ленивой инициализации singleton
[*]NaiaTowerManager: getInstance синхронизирован, lockedRooms и _roomMobs переведены на eager init
[*]ClanPenalty: DATE_FORMAT обёрнут в ThreadLocal для устранения race на статическом SimpleDateFormat
[*]Time.useUserCommand: sf обёрнут в ThreadLocal для устранения race на статическом SimpleDateFormat
[*]ItemAuctionInstance: DATE_FORMAT обёрнут в ThreadLocal для устранения race на статическом SimpleDateFormat
[*]HeroDiary: SIMPLE_FORMAT обёрнут в ThreadLocal для устранения race на статическом SimpleDateFormat
[*]TimeUtils.toSimpleFormat: внутренние вызовы переведены на приватный ThreadLocal-formatter, публичное поле SIMPLE_FORMAT сохранено для backward compat
[*]Macro.toString: использован Arrays.toString для commands вместо мусорного toString массива, заодно добавлен пробел перед name=
[*]TimeUtils: добавлен thread-safe parseSimpleFormat для парсинга строк через приватный ThreadLocal-formatter, чтобы убрать race на public SIMPLE_FORMAT