114 lines
3.5 KiB
C#
114 lines
3.5 KiB
C#
using Sandbox;
|
||
using Sasalka;
|
||
|
||
namespace Sandbox.Weapons;
|
||
|
||
/// <summary>
|
||
/// Фабрика для создания используемых предметов с правильной настройкой компонентов
|
||
/// </summary>
|
||
public static class WeaponFactory
|
||
{
|
||
/// <summary>
|
||
/// Создать используемый предмет с правильной настройкой
|
||
/// </summary>
|
||
public static GameObject CreateUseableItem(BaseItemDefinition itemDef, InventoryItem inventoryItem = null)
|
||
{
|
||
if (itemDef?.Prefab == null) return null;
|
||
|
||
var itemGo = itemDef.Prefab.Clone();
|
||
|
||
// Проверяем, есть ли уже компонент оружия
|
||
if (!itemGo.Components.TryGet<BaseWeapon>(out var weapon))
|
||
{
|
||
// Определяем тип предмета по имени или другим параметрам
|
||
if (itemDef.Name.ToLower().Contains("pistol") || itemDef.Name.ToLower().Contains("rifle") || itemDef.Name.ToLower().Contains("gun"))
|
||
{
|
||
// Создаем оружие как InventoryItem
|
||
weapon = itemGo.Components.Create<BaseWeapon>();
|
||
weapon.Definition = itemDef;
|
||
}
|
||
else if (itemDef.Name.ToLower().Contains("flashlight") || itemDef.Name.ToLower().Contains("light"))
|
||
{
|
||
// Создаем фонарик
|
||
var flashlight = itemGo.Components.Create<Flashlight>();
|
||
}
|
||
else
|
||
{
|
||
// По умолчанию создаем базовое оружие
|
||
weapon = itemGo.Components.Create<BaseWeapon>();
|
||
weapon.Definition = itemDef;
|
||
}
|
||
}
|
||
|
||
// Настраиваем компоненты
|
||
SetupItemComponents(itemGo, itemDef);
|
||
|
||
return itemGo;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Создать оружие с правильной настройкой (для обратной совместимости)
|
||
/// </summary>
|
||
public static GameObject CreateWeapon(WeaponItemDefinition weaponDef, InventoryItem inventoryItem = null)
|
||
{
|
||
return CreateUseableItem(weaponDef, inventoryItem);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Настройка компонентов предмета
|
||
/// </summary>
|
||
private static void SetupItemComponents(GameObject itemGo, BaseItemDefinition itemDef)
|
||
{
|
||
// Настраиваем рендерер
|
||
if (itemGo.Components.TryGet<SkinnedModelRenderer>(out var renderer))
|
||
{
|
||
// Можно добавить специфичную настройку рендерера
|
||
}
|
||
|
||
// Настраиваем звук
|
||
if (itemGo.Components.TryGet<SoundPointComponent>(out var sound))
|
||
{
|
||
// Можно добавить специфичную настройку звука
|
||
}
|
||
|
||
// Настраиваем физику
|
||
if (itemGo.Components.TryGet<Rigidbody>(out var rigidbody))
|
||
{
|
||
// Можно добавить специфичную настройку физики
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Создать предмет для инвентаря
|
||
/// </summary>
|
||
public static InventoryItem CreateItem(BaseItemDefinition itemDef)
|
||
{
|
||
// Для оружия создаем BaseWeapon, для остального - обычный InventoryItem
|
||
if (itemDef is WeaponItemDefinition)
|
||
{
|
||
return new BaseWeapon
|
||
{
|
||
Definition = itemDef,
|
||
Count = 1
|
||
};
|
||
}
|
||
|
||
return new InventoryItem
|
||
{
|
||
Definition = itemDef,
|
||
Count = 1
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Создать предмет оружия для инвентаря (для обратной совместимости)
|
||
/// </summary>
|
||
public static InventoryItem CreateWeaponItem(WeaponItemDefinition weaponDef)
|
||
{
|
||
return new BaseWeapon
|
||
{
|
||
Definition = weaponDef,
|
||
Count = 1
|
||
};
|
||
}
|
||
} |