В плагине **zEFA** (zEasyFreeAim) механика хедшотов (критических попаданий в голову) является прямым портом на C++ скриптовой логики из мода **Gothic Free Aim (GFA)** от *mud-freak*. Технически она состоит из нескольких взаимосвязанных этапов, прописанных в файле Collision.hpp
Вот подробный разбор логики, принципа работы и комментариев автора GFA:
### 1. Расширение BBox модели (Enlarge BBox)
В ванильной Готике у гуманоидов с отдельным визуалом головы она **не входит** в общий Bounding Box (BBox) модели. Без исправления этого нюанса стрела, летящая точно в голову, просто пролетит насквозь, так как движок даже не начнет проверку коллизии.
**Техническая реализация:**
* Ставится хук `hook_Model_CalcBBox3DWorld` на выходе из функции `zCModel::CalcModelBBox3DWorld`.
* Код читает локальный BBox ноды головы (`modelHeadNode`), переводит его в мировые координаты и "вливает" (CalcGreaterBBox3D) в общий BBox модели NPC.
### 2. Полигон-точная проверка и детекция "головы" (Refined Collision & TraceRay)
Движок Готики по умолчанию засчитывает попадания по "грубому" BBox воба, что при свободном прицеливании привело бы к попаданиям "в воздух" рядом с NPC.
**Техническая реализация:**
* Делается уточняющий луч (`TraceRay`) строго по геометрии (полигонам) модели через `RefinedProjectileCollisionCheck`.
* На время пуска луча включается специальный хук `hook_Model_TraceRay_NodeHit` (порт `GFA_RecordHitNode`). Если луч пересекает кость, имя этой кости сохраняется в глобальную переменную `g_hitModelNode`.
* Если луч по геометрии не попал, делается **отдельная, запасная проверка** луча именно в визуал головы (`AimRayHeadHit`). Если попадание есть, в `g_hitModelNode` принудительно пишется имя кости головы (обычно `"BIP01 HEAD"`).
### 3. Расчёт урона и условия хедшота (Damage Calculation)
Расчёт урона происходит прямо перед тем, как движок собирается его нанести (хук `hook_ArrowDamage_CriticalHit` в `oCAIArrow::ReportCollisionToAI`).
**Условия для успешного хедшота:**
1. Попадание произошло именно при активном свободном прицеливании.
2. Записанная нода коллизии в `g_hitModelNode` строго равна `"BIP01 HEAD"`.
3. У стрелы только один тип урона (защита от багов с нестандартными снарядами).
4. Обычный выстрел без крита всё равно бы пробил броню цели (`базовый урон + ловкость > защита цели`). Иначе игнор.
5. **Правило "Шлема" (Металлическая броня):** Если NPC экипирован в металлическую броню (`SND_MAT_METAL`) **и при этом не видит игрока** (например, выстрел со спины/в затылок), хедшот игнорируется.
**Применение эффекта:**
Если все условия сошлись, происходит следующее:
* **Урон:** Берется Float-значение базового урона снаряда со стека и умножается на **1.3**.
* **Фидбек:** На 300 миллисекунд в центре экрана отрисовывается специальная текстура-хитмаркер (крестик), а на цели проигрывается звук попадания (`BOW_FIRE_02.WAV`).
---
### Комментарии автора GFA (mud-freak) и адаптация под G2:
В коде zEFA задокументированы важные комментарии и дефолты из оригинального GFA:
> *"в G2 к урону добавляется ловкость, поэтому множитель ×1.3 разумнее, чем ×2 из G1"*
В Готике 1 урон от лука не скалировался от ловкости напрямую, поэтому там крит был х2. В Готике 2 Ночь Ворона ловкость идет в плюс к урону, поэтому множитель x2 от G1 делал бы луки невероятно "имбовыми", и автор остановился на **x1.3 к базовому урону стрелы**.
> *"Крит только если и обычный выстрел пробил бы защиту"*
Защита от абуза: вы не сможете убить элитного орка хедшотами из короткого лука, если ваш урон в принципе не пробивает его броню.
> *"Шлем: металлическая броня + цель не видит игрока"*
Это интересная геймплейная фича от mud-freak. Подразумевается, что тяжелые латы и шлемы (которые игра определяет по материалу брони `METAL`) защищают со спины лучше. Выстрел "в лицо" латнику (когда он вас видит) даст хедшот, а выстрел в затылок сработает как попадание в прочный шлем.