sasalka/Code/Player/Dedugan.Hit.cs
2025-06-29 15:06:54 +03:00

64 lines
2.4 KiB
C#

using System.Threading.Tasks;
public sealed partial class Dedugan
{
[Rpc.Broadcast]
public void ReportHit( Vector3 dir, int boneIndex, int damage = 10 )
{
Renderer.Set( "hit", true );
Renderer.Set( "hit_bone", boneIndex );
Renderer.Set( "hit_direction", dir );
Renderer.Set( "hit_offset", dir );
Renderer.Set( "hit_strength", 1 );
Health -= damage;
if ( Health <= 0 )
{
_ = RunReportHitAsync();
}
}
private async Task RunReportHitAsync()
{
await GameTask.DelaySeconds( 0.1f );
RagdollController.Enabled = true;
// Выбрасываем все предметы при смерти
DropAllItemsOnDeath();
}
/// <summary>
/// Выбрасывает все предметы из инвентаря при смерти игрока
/// </summary>
private void DropAllItemsOnDeath()
{
if ( Inventory == null || !Network.IsOwner ) return;
Log.Info( $"Игрок {Name} умер. Выбрасываем все предметы..." );
// Используем метод из инвентаря для выбрасывания всех предметов
int droppedCount = Inventory.DropAllItems( WorldPosition, 50f );
Log.Info( $"Выброшено {droppedCount} предметов при смерти игрока {Name}" );
}
/// <summary>
/// Публичный метод для принудительного выбрасывания всех предметов
/// Можно вызывать из других мест (например, из команд или UI)
/// </summary>
/// <param name="dropPosition">Позиция для выбрасывания предметов (если null, используется позиция игрока)</param>
/// <param name="scatterRadius">Радиус разброса предметов</param>
public void ForceDropAllItems( Vector3? dropPosition = null, float scatterRadius = 50f )
{
if ( Inventory == null || !Network.IsOwner ) return;
Log.Info( $"Принудительно выбрасываем все предметы игрока {Name}..." );
// Используем метод из инвентаря для выбрасывания всех предметов
var finalDropPosition = dropPosition ?? WorldPosition;
int droppedCount = Inventory.DropAllItems( finalDropPosition, scatterRadius );
Log.Info( $"Принудительно выброшено {droppedCount} предметов игрока {Name}" );
}
}