Stun Combat Drones


Боевые дроны, поражающие врагов электрическим током. Включает в себя снаряжение, улучшения и капсулы в виде гранат. Combat drones that stun enemies with electric shocks. Includes equipment, upgrades, and grenade-style capsules.

29 days ago
2.0
142
Combat Armor

Changelog

Version: 2.3.0
Date: 2025-02-15
  Critical Fixes:
    - FIXED: Removed all hr_version blocks from graphics definitions (removed in Factorio 2.0 API). Now uses HR textures directly with scale = 0.5.
    - FIXED: LuaEquipment.quality now correctly handled as LuaQualityPrototype object instead of string (Factorio 2.0 API change).
    - FIXED: on_player_used_capsule event.quality now correctly handled as LuaQualityPrototype instead of string.
  Optimizations:
    - Runtime-global settings (auto-launch radius) are now cached and updated via on_runtime_mod_setting_changed instead of reading every 30 ticks.
    - Enemy search now uses native find_nearest_enemy API for better performance.
    - Stun sticker prefix check uses string.sub instead of pattern matching (string:find) for faster per-entity checks.
    - Added get_quality_level() utility function that handles both LuaQualityPrototype objects and quality name strings.
  Bugfixes:
    - FIXED: drone_projectiles cleanup now works correctly — tick field was not being saved on creation.
    - FIXED: Grenade quality queue now limited to 20 entries to prevent unbounded memory growth.
    - Added on_player_left_game handler to clean up player caches immediately on disconnect.
  Removed:
    - Removed unused stun-drone-capsule item and recipe (was duplicate of stun-grenade with hidden recipe).
    - Removed unused stun-drone-max-active setting from settings.lua.
    - Cleaned up orphaned locale keys (stun-drone-auto-launch-cooldown, stun-drone-max-active, stun-drone-capsule).

  Критические исправления:
    - ИСПРАВЛЕНО: Удалены все блоки hr_version из графических определений (удалены в Factorio 2.0 API). Теперь HR-текстуры используются напрямую со scale = 0.5.
    - ИСПРАВЛЕНО: LuaEquipment.quality теперь корректно обрабатывается как объект LuaQualityPrototype, а не строка (изменение API Factorio 2.0).
    - ИСПРАВЛЕНО: event.quality в on_player_used_capsule теперь корректно обрабатывается как LuaQualityPrototype.
  Оптимизации:
    - Runtime-global настройки (радиус автоатаки) теперь кешируются и обновляются через on_runtime_mod_setting_changed вместо чтения каждые 30 тиков.
    - Поиск врагов теперь использует нативный API find_nearest_enemy для лучшей производительности.
    - Проверка префикса стикера оглушения использует string.sub вместо паттерн-матчинга для более быстрой проверки.
    - Добавлена утилита get_quality_level(), поддерживающая как объекты LuaQualityPrototype, так и строки имён качества.
  Исправления:
    - ИСПРАВЛЕНО: очистка drone_projectiles теперь работает корректно — поле tick не сохранялось при создании.
    - ИСПРАВЛЕНО: очередь качества гранат теперь ограничена 20 записями для предотвращения утечки памяти.
    - Добавлен обработчик on_player_left_game для немедленной очистки кешей игрока при отключении.
  Удалено:
    - Удалён неиспользуемый предмет stun-drone-capsule и его рецепт (дублировал stun-grenade со скрытым рецептом).
    - Удалена неиспользуемая настройка stun-drone-max-active из settings.lua.
    - Очищены осиротевшие ключи локализации (stun-drone-auto-launch-cooldown, stun-drone-max-active, stun-drone-capsule).
Version: 2.2.1
Date: 2025-01-31
  Bugfixes:
    - Fixed crash in multiplayer when a player throws a stun grenade before the host's on_init runs.
      The startup settings cache (CACHED_BASE_AOE_RADIUS, CACHED_BASE_STUN_TIME) is now lazily 
      initialized on first access, ensuring it works correctly for all players in multiplayer.

  Исправления:
    - Исправлен вылет в мультиплеере, когда игрок бросает оглушающую гранату до того, как 
      на хосте выполнится on_init. Кеш startup-настроек теперь инициализируется лениво при 
      первом обращении, что гарантирует корректную работу для всех игроков в мультиплеере.
Version: 2.2.0
Date: 2025-01-31
  Optimizations:
    - CRITICAL: Removed global enemy search every 20 ticks that was searching ALL enemies on ALL surfaces.
      Now tracks only stunned enemies in a cache, reducing CPU load by 90%+ in late-game scenarios.
    - Implemented player data caching system: equipment status, quality level, and energy are now cached
      and only updated when armor/equipment changes (via event handlers).
    - Replaced inventory slot-by-slot iteration with get_item_count() for drone ammo checks.
    - Optimized find_nearest_enemy: reduced search limit from 20 to 10, removed unnecessary table.sort().
    - Added periodic cleanup routine (every 60 seconds) for stale projectile data and disconnected player caches.
    - Cached startup settings to avoid repeated settings.startup lookups.
    - Local references to frequently used Lua functions (pairs, math.random, math.floor, table.insert, table.remove).
  Multiplayer:
    - Player cache system now properly handles multiple players with separate data per player_index.
    - Cache invalidation on equipment/armor changes is deterministic and synced across clients.
  Bugfixes:
    - Fixed potential memory leak in drone_projectiles storage (added cleanup for orphaned entries).
    - Fixed edge case where equipment_ref could become invalid between cache reads.
  Info:
    - Added remote interface function get_stats() for debugging (returns stunned_count, projectiles_count, cached_players).

  Оптимизации:
    - КРИТИЧНО: Убран глобальный поиск врагов каждые 20 тиков, который искал ВСЕХ врагов на ВСЕХ поверхностях.
      Теперь отслеживаются только оглушённые враги в кеше, снижение нагрузки на CPU на 90%+ в поздней игре.
    - Реализована система кеширования данных игрока: статус оборудования, уровень качества и энергия
      теперь кешируются и обновляются только при изменении брони/оборудования.
    - Заменён перебор слотов инвентаря на get_item_count() для проверки наличия боеприпасов.
    - Оптимизирован поиск ближайшего врага: уменьшен лимит поиска с 20 до 10, убрана ненужная сортировка table.sort().
    - Добавлена периодическая очистка (каждые 60 секунд) устаревших данных снарядов и кешей отключившихся игроков.
    - Закешированы startup-настройки, чтобы избежать повторных обращений к settings.startup.
    - Локальные ссылки на часто используемые функции Lua (pairs, math.random, math.floor, table.insert, table.remove).
  Мультиплеер:
    - Система кеширования игроков корректно обрабатывает нескольких игроков с отдельными данными по player_index.
    - Инвалидация кеша при изменении оборудования/брони детерминирована и синхронизирована между клиентами.
  Исправления:
    - Исправлена потенциальная утечка памяти в хранилище drone_projectiles (добавлена очистка осиротевших записей).
    - Исправлен краевой случай, когда equipment_ref мог стать невалидным между чтениями кеша.
  Информация:
    - Добавлена функция remote-интерфейса get_stats() для отладки (возвращает stunned_count, projectiles_count, cached_players).
Version: 2.1.0
Date: 2025-01-05
  Features:
    - Reworked stun drone and stun grenade behavior: damage and stun are now applied exactly on projectile impact via scripted handlers, not instantly on launch.
    - Added full quality support:
      * Stun drone equipment quality now increases damage, radius and stun duration.
      * Stun drone ammo quality increases per-shot damage, radius and stun duration.
      * Stun grenade quality increases AOE damage, radius and stun duration.
    - Added energy mechanics for the stun drone equipment:
      * Equipment now has its own internal energy buffer (500 kJ by default).
      * At normal quality this buffer is enough for 5 drone launches without recharging.
      * Higher quality effectively increases the number of shots from a full charge by lowering energy cost per shot.
    - Added a toggle for the stun drone system:
      * Shortcut button "Stun Drone System" in the shortcut bar.
      * Hotkey: Shift + T.
      * The system can be turned on/off per player.
  Changes:
    - Disabled the built-in active-defense attack of the equipment; all attack behavior is now fully handled by script to avoid double damage and ammo-free shots.
    - Separated projectile visuals:
      * Drones use stun-drone-moving / hr-stun-drone-moving.
      * Stun grenades use stun-grenade-moving / hr-stun-grenade-moving and appear smaller than drones.
    - Equipment tooltip now shows a non-zero "Energy per use" and a reasonable max power input, matching its scripted energy behavior.
    - Reworked stun logic to use only stickers and scripted AOE, avoiding engine-side create-sticker in projectile definitions.
  Bugfixes:
    - Fixed crashes caused by accessing invalid entities after they were killed by damage (added .valid checks everywhere).
    - Fixed errors when trying to create stun stickers on entities that do not accept stickers.
    - Fixed ammo consumption logic so that stun drone ammo of any quality (including legendary) is correctly detected and consumed.
    - Fixed desynchronization of visual effects and actual damage/stun application for stun drones.
    - Shortcut state:
      * The stun drone shortcut is now greyed out and unavailable when the player has no stun drone equipment in armor.
      * Shortcut toggle state is correctly updated on armor/equipment changes and on load.
       
  Новое:
    - Полностью переработана логика автодронов и оглушающих гранат: урон и стан теперь происходят строго в момент попадания снаряда (через on_script_trigger_effect), а не сразу при выстреле.
    - Добавлена поддержка качества:
      * Качество оборудования оглушающих дронов усиливает урон, радиус и длительность стана.
      * Качество боеприпасов оглушающих дронов влияет на урон, радиус и длительность стана конкретного выстрела.
      * Качество оглушающих гранат усиливает AOE-урон, радиус и длительность стана.
    - Добавлена энергетика для системы защиты:
      * Оборудование имеет собственный энергетический буфер (500 кДж по умолчанию).
      * При обычном качестве буфера хватает примерно на 5 выстрелов без подзарядки.
      * С ростом качества фактическое количество выстрелов от полного заряда растёт за счёт снижения стоимости выстрела по энергии.
    - Добавлена кнопка включения/выключения системы:
      * Ярлык «Система защиты оглушающими дронами» в панели ярлыков.
      * Горячая клавиша: Shift + T.
      * Состояние (вкл/выкл) хранится отдельно для каждого игрока.
  Изменения:
    - Встроенная атака active-defense-оборудования отключена, всё поведение реализовано только скриптом, чтобы избежать двойного урона и «бесплатных» выстрелов.
    - Разделены визуальные эффекты полёта: дроны и гранаты используют свои спрайты, гранаты визуально меньше.
    - Подсказка оборудования теперь показывает осмысленную «Энергию за использование» и максимальное потребление энергии, соответствующие скриптовой логике.
    - Логика стана полностью переведена на скриптовые AOE и стикеры, без create-sticker в определении снаряда.
  Исправления:
    - Исправлены вылеты при обращении к невалидным сущностям после нанесения урона (добавлены проверки .valid).
    - Исправлены ошибки при попытке создать стикер на сущностях, которые не поддерживают стикеры.
    - Исправлена проблема, из-за которой система не видела/не тратила боеприпасы улучшенного качества (включая легендарные).
    - Исправлена рассинхронизация между визуальным полётом дрона и фактическим моментом нанесения урона и стана.
    - Ярлык системы теперь становится серым и недоступен, если в броне нет соответствующего оборудования, и автоматически обновляется при изменении брони/оборудования.