This commit is contained in:
Oscar
2025-06-29 15:06:54 +03:00
parent 495c672818
commit 235d5ad90a
7 changed files with 423 additions and 111 deletions

View File

@@ -20,9 +20,6 @@ public sealed partial class Dedugan
// Плавная интерполяция позиции пивота для устранения колебаний
CameraPivot.WorldPosition =
Vector3.Lerp( CameraPivot.WorldPosition, Eyes.WorldPosition, Time.Delta * 25f );
// Компенсируем поворот тела, чтобы камера вращалась правильно
// Используем только yaw от EyeAngles, но pitch оставляем как есть
var bodyYaw = Renderer.LocalRotation.Yaw();
var cameraYaw = EyeAngles.yaw;
var compensatedYaw = cameraYaw - bodyYaw;

View File

@@ -22,5 +22,42 @@ public sealed partial class Dedugan
{
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}" );
}
}

View File

@@ -73,10 +73,10 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
protected override void OnUpdate()
{
_isOwner = Network.IsOwner;
UpdateCustomAnimations();
InventoryUpdate();
if ( _isOwner )
{
EyeAngles += Input.AnalogLook;
@@ -94,15 +94,19 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
UpdateBodyRotation();
Camera.LocalRotation = EyeAngles.ToRotation();
CameraPivot.WorldPosition =
Vector3.Lerp( CameraPivot.WorldPosition, Eyes.WorldPosition, Time.Delta * 25f );
var bodyYaw = Renderer.LocalRotation.Yaw();
var cameraYaw = EyeAngles.yaw;
var compensatedYaw = cameraYaw - bodyYaw;
CameraPivot.LocalRotation = Rotation.FromYaw( compensatedYaw ) * Rotation.FromPitch( EyeAngles.pitch );
var pivotOffset = CameraPivot.LocalRotation.Right * CamOffset.y +
CameraPivot.LocalRotation.Forward * CamOffset.x +
CameraPivot.LocalRotation.Up * CamOffset.z;
var rotatedOffset = pivotOffset * EyeAngles.ToRotation();
Camera.WorldPosition = CameraPivot.WorldPosition + rotatedOffset;
// Camera.LocalRotation = EyeAngles.ToRotation();
// var pivotOffset = CameraPivot.LocalRotation.Right * CamOffset.y +
// CameraPivot.LocalRotation.Forward * CamOffset.x +
// CameraPivot.LocalRotation.Up * CamOffset.z;
// var rotatedOffset = pivotOffset * EyeAngles.ToRotation();
// Camera.WorldPosition = CameraPivot.WorldPosition + rotatedOffset;
}
}
@@ -145,15 +149,15 @@ public sealed partial class Dedugan : Component, IUseContext, Component.INetwork
{
var currentBodyYaw = Renderer.LocalRotation.Yaw();
var currentCameraYaw = EyeAngles.yaw;
// Проверяем, изменились ли углы
if ( Math.Abs( currentBodyYaw - _lastBodyYaw ) < 0.1f &&
Math.Abs( currentCameraYaw - _lastCameraYaw ) < 0.1f &&
if ( Math.Abs( currentBodyYaw - _lastBodyYaw ) < 0.1f &&
Math.Abs( currentCameraYaw - _lastCameraYaw ) < 0.1f &&
!_bodyRotationDirty )
{
return; // Пропускаем обновление, если углы не изменились
}
_lastBodyYaw = currentBodyYaw;
_lastCameraYaw = currentCameraYaw;
_bodyRotationDirty = false;