using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BITFALL.Industry; using BITFALL.Items; using BITKit; using BITKit.MarkSystem; using NodeCanvas.Framework; using UnityEngine; using Object = UnityEngine.Object; namespace BITFALL.Quest { public class CreateItemToContainer : ActionTask { [DictionaryReferenceConfig(nameof(allow_quest_item))] public const string allow_quest_item = nameof(allow_quest_item); public BBParameter size; public BBParameter itemTemplate; public BBParameter item; [Inject] private IMarkSystem _markSystem; private WorldItemContainer _worldContainer; private IMarkObject _markObject; protected override void OnExecute() { base.OnExecute(); DI.Inject(this); var containers = WorldItemContainer.Query(agent.position, size.value); containers = containers.Where(x => x.TryGetComponent(out var tag) && tag.GetTags().Contains(allow_quest_item)).ToArray(); var newItem = itemTemplate.value.Clone().As(); var position = new Vector3(); if (containers.Length is 0) { newItem = Object.Instantiate(itemTemplate.value.GetPrefab(), agent.position,Quaternion.identity); position = newItem.As().transform.position; BIT4Log.Log($"未找到容器,已创建物品于场景,物品名称:{newItem.Name}"); } else { newItem.GetOrCreateProperty(); var container =containers.Random(); position = container.transform.position; container.AddInternal(newItem); BIT4Log.Log($"已创建:{newItem.Name}于容器:{container.Name}"); container.OnRelease += OnRelease; _worldContainer = container; } newItem.GetOrCreateProperty(); _markSystem.Register(_markObject = new MarkObject() { Position = position, Object = newItem }); item.SetValue(newItem); EndAction(); } private void OnRelease(bool obj) { if (!obj || _worldContainer is null) return; if (_worldContainer.GetItems().Any(x => x.Id == item.value.Id)) return; _markSystem.UnRegister(_markObject); _worldContainer.OnRelease -= OnRelease; } } }