using SWB.Base; using SWB.Shared; namespace Sandbox; public class Inventory : Component, IInventory { [Sync] public NetList Items { get; set; } = new(); [Sync] public new GameObject Active { get; set; } Kal _player; protected override void OnAwake() { _player = Components.Get(); } public void Add( GameObject gameObject, bool makeActive = false ) { if ( !Has( gameObject ) ) { Items.Add( gameObject ); } if ( makeActive ) SetActive( gameObject ); else { if ( gameObject.Components.TryGet( out var item ) ) { item.OnCarryStop(); } } } public void Disarm() { foreach ( var item in Items ) { if ( item.Enabled && item.IsValid ) { IInventoryItem iItem = item.GetComponent(); iItem.OnCarryStop(); } } Active = null; } public GameObject AddClone( GameObject gamePrefab, bool makeActive = true ) { var gameObject = gamePrefab.Clone( _player.GameObject, _player.WorldPosition, _player.WorldRotation, Vector3.One ); gameObject.Name = gamePrefab.Name; gameObject.NetworkSpawn( _player.Network.Owner ); Add( gameObject, makeActive ); return gameObject; } public bool Has( GameObject gameObject ) { return Items.Contains( gameObject ); } public void SetActive( GameObject gameObject ) { if ( !Has( gameObject ) || Active == gameObject ) return; if ( Active is not null && Active.Components.TryGet( out var oldActive ) ) { if ( !oldActive.CanCarryStop() ) return; oldActive.OnCarryStop(); } if ( gameObject.Components.TryGet( out var newActive, FindMode.EverythingInSelf ) ) { newActive.OnCarryStart(); } Active = gameObject; } public void SetActive( string name ) { foreach ( var item in Items ) { if ( item.Name == name ) { SetActive( item ); break; } } } public void Clear() { foreach ( var item in Items ) { item.Destroy(); } Items.Clear(); Active = null; } }