Damage Receiver
Tipo: Exec (In → Out)
Categoría: AI
Execution Order: 42 (después de Enemy Perception, antes de AI State Machine)
Gestiona los puntos de vida del objeto y lee daño desde el canal _dmg_<nombre> de globalDict. Publica el estado de HP en variables ai_* para el resto del sistema modular.
Propiedades
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
| Max HP | Float (≥1.0) | 100.0 |
Puntos de vida máximos |
Sockets
| Socket | Dirección | Tipo |
|---|---|---|
| In | Entrada | Exec |
| Out | Salida | Exec |
Variables publicadas
| Variable | Tipo | Descripción |
|---|---|---|
self.ai_hp |
float | HP actual |
self.ai_hp_max |
float | HP máximo |
self.ai_is_dead |
bool | True cuando HP ≤ 0 (se mantiene True) |
self.ai_took_damage |
bool | True solo el frame en que llegó daño |
self.ai_recent_damage |
bool | Alias de ai_took_damage |
Canal de daño
Cualquier objeto puede dañar a este enemigo escribiendo en globalDict:
Range.logic.globalDict['_dmg_' + enemy.name] = cantidad
El nodo lee y elimina (pop) este valor cada frame. Si no hay nada en el canal, el daño es 0.
¿Quién escribe en este canal?
| Fuente | Canal |
|---|---|
| Enemy Combat (melee/ranged) | _dmg_<target_name> |
| Weapon Hitscan (legacy) | _dmg_<hit_name> |
| Weapon Balancer | _dmg_<target_name> |
| Código personalizado | Range.logic.globalDict['_dmg_<nombre>'] = dmg |
Comportamiento
Cada frame:
- Lee
_dmg_<self.own.name>de globalDict (y lo elimina). - Resta el daño a
_dr_hp. - Actualiza
ai_hp,ai_took_damage. - Si HP ≤ 0 y
ai_is_deadera False: poneai_is_dead = True(transición solo ocurre una vez).
ai_is_dead nunca vuelve a False — es un estado terminal. Para "revivir" al enemigo habría que destruir y reemplazar el objeto.
Uso en el sistema modular
[Enemy Perception] → [Damage Receiver] → [AI State Machine]
AI State Machine lee ai_hp, ai_hp_max y ai_is_dead para decidir si entrar en RETREAT o DEAD.
Hacer que un objeto dañe al enemigo
# En cualquier BTCustomTask, script o nodo de otro objeto:
enemy = self.own.scene.objects.get('Enemy_01')
if enemy:
Range.logic.globalDict['_dmg_' + enemy.name] = 25.0
Daño del jugador (ej. Weapon Hitscan)
El nodo Weapon Hitscan del sistema PLAYER escribe automáticamente en _dmg_<nombre> del objeto golpeado. Si ese objeto tiene Damage Receiver, recibirá el daño.
Diferencia con EnemyAI (prefab)
| Damage Receiver | EnemyAI (prefab) |
|---|---|
Canal: _dmg_<nombre> |
Canal: _ai_dmg_<nombre> |
Publica ai_* |
No publica ai_* externas |
| Parte del sistema modular | Auto-contenido |
No mezclar Damage Receiver con EnemyAI en el mismo objeto — usan canales de globalDict distintos.
Notas
ai_took_damagees True solo durante un frame — el frame en que llegó daño. El siguiente frame vuelve a False.- Para reaccionar al daño (flash, sonido, stagger), conecta Enemy Hit Flash o lee
ai_took_damageen Enemy Animation. - Si quieres daño acumulado (varios proyectiles en el mismo frame), el canal suma correctamente porque
globalDict.get(key, 0) + dmgacumula antes delpop.