sasalka/Code/Weapons/WeaponFactory.cs
2025-06-28 18:13:47 +03:00

114 lines
3.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
};
}
}