public void HitEnemy(BasePlayer player, BaseEnemy enemy) { if (enemy is IUnitDamageable) { Damage dmg = player.CalculateDamage(enemy); // return negative damage if it's fatal; probably stupid hack to avoid struct for damage if (dmg.is_crit && player.CritEvent != null) { player.CritEvent(); } if (((IUnitDamageable)enemy).TakeDamage(dmg)) // return true if damage is fatal { if (player.DeathEvent != null) { player.DeathEvent(); } } if (player.HitEvent != null) { player.HitEvent(); } var msg = enemy.GetNode("/root/messanger") as messanger; msg.EnemyDamage(dmg, enemy.GetTranslation()); } if (enemy is IUnitPushable) { ((IUnitPushable)enemy).PushBack(player.GetTransform().basis.z * 100); } }