This commit is contained in:
Oscar
2025-06-29 15:20:07 +03:00
parent 235d5ad90a
commit 33797c4bd2
2 changed files with 97 additions and 153 deletions

View File

@@ -197,71 +197,22 @@ public class Inventar : Component
if ( item == null || !Items.Contains( item ) )
return;
// Проверяем, является ли предмет одеждой
if ( item.Definition is ClothingItemDefinition clothingDef )
{
// Для одежды создаем специальный физический объект
DropClothingItem( item, position, clothingDef );
}
else
{
// Для остальных предметов используем стандартный префаб
if ( item.Definition.Prefab != null )
{
GameObject gO = item.Definition.Prefab.Clone( position );
GameObject gO = item.Definition.Prefab.Clone( position );
if ( gO.Components.TryGet<InventoryItem>( out var inventoryItem ) )
{
inventoryItem.Count = item.Count;
inventoryItem.Definition = item.Definition;
// Копируем патроны из оригинального предмета
inventoryItem.MagazineAmmo = item.MagazineAmmo;
}
gO.NetworkSpawn();
}
else
{
Log.Warning( $"Префаб не найден для предмета: {item.Definition.Name}" );
}
if ( gO.Components.TryGet<InventoryItem>( out var inventoryItem ) )
{
inventoryItem.Count = item.Count;
inventoryItem.Definition = item.Definition;
// Копируем патроны из оригинального предмета
inventoryItem.MagazineAmmo = item.MagazineAmmo;
}
gO.NetworkSpawn();
// Удаляем весь предмет из инвентаря
RemoveItem( item, item.Count );
}
/// <summary>
/// Выбрасывает предмет одежды как физический объект
/// </summary>
private void DropClothingItem( InventoryItem item, Vector3 position, ClothingItemDefinition clothingDef )
{
// Пытаемся найти подходящий префаб для одежды
GameObject clothingPrefab = GameObject.GetPrefab( "prefabs/item_parcel.prefab" );
GameObject clothingObject = null;
clothingObject = clothingPrefab.Clone( position );
// Добавляем компонент InventoryItem
if ( clothingObject.Components.TryGet<InventoryItem>( out var inventoryItem ) )
{
inventoryItem.Count = item.Count;
inventoryItem.Definition = item.Definition;
}
// Добавляем компонент PickupItem для подбора
if ( clothingObject.Components.TryGet<PickupItem>( out var pickupItem ) )
{
// Устанавливаем правильную метку для одежды
var slotName = GetSlotDisplayName( clothingDef.Slot );
pickupItem.Label = $"{clothingDef.Name} ({slotName})";
}
clothingObject.NetworkSpawn();
Log.Info( $"Выброшена одежда: {clothingDef.Name} ({clothingDef.Slot})" );
}
/// <summary>
/// Получает отображаемое название слота
/// </summary>
@@ -320,19 +271,19 @@ public class Inventar : Component
OnChanged?.Invoke();
}
// Публичный метод для уведомления об изменениях извне класса
// Публичный метод для уведомления об изменениях извне класса
public void NotifyChanged()
{
OnChanged?.Invoke();
}
// Публичный метод для уведомления о добавлении предмета извне класса
// Публичный метод для уведомления о добавлении предмета извне класса
public void NotifyItemAdded( InventoryItem item )
{
OnItemAdded?.Invoke( item );
}
// Методы для получения информации о вместимости
// Методы для получения информации о вместимости
public int GetUsedSlots()
{
return Items.Count;
@@ -423,19 +374,12 @@ public class Inventar : Component
int droppedCount = 0;
// Сначала снимаем все экипированные предметы и добавляем их в список для выбрасывания
// Сначала снимаем все экипированные предметы
foreach ( var equippedItem in equippedItemsToDrop )
{
if ( equippedItem != null )
{
// Снимаем предмет
UnEquipItem( equippedItem );
// Добавляем в список для выбрасывания, если его там еще нет
if ( !itemsToDrop.Contains( equippedItem ) )
{
itemsToDrop.Add( equippedItem );
}
}
}
@@ -445,7 +389,7 @@ public class Inventar : Component
if ( item != null && item.Count > 0 )
{
// Выбираем случайную позицию в радиусе разброса
var scatteredPosition = dropPosition + Vector3.Random * scatterRadius + Vector3.Up * 10f;
var scatteredPosition = dropPosition + Vector3.Random * scatterRadius + Vector3.Up * 100f;
DropItem( item, scatteredPosition );
droppedCount++;
}