BITFALL/Assets/Artists/Scripts/Quest/CreateItemToContainer.cs

90 lines
2.3 KiB
C#

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<Transform>
{
[DictionaryReferenceConfig(nameof(allow_quest_item))]
public const string allow_quest_item = nameof(allow_quest_item);
public BBParameter<Vector3> size;
public BBParameter<ScriptableItem> itemTemplate;
public BBParameter<IBasicItem> 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<ITag>(out var tag) && tag.GetTags().Contains(allow_quest_item)).ToArray();
var newItem = itemTemplate.value.Clone().As<IBasicItem>();
var position = new Vector3();
if (containers.Length is 0)
{
newItem = Object.Instantiate(itemTemplate.value.GetPrefab(), agent.position,Quaternion.identity);
position = newItem.As<MonoBehaviour>().transform.position;
BIT4Log.Log<CreateItemToContainer>($"未找到容器,已创建物品于场景,物品名称:{newItem.Name}");
}
else
{
newItem.GetOrCreateProperty<IsQuestItem>();
var container =containers.Random();
position = container.transform.position;
container.AddInternal(newItem);
BIT4Log.Log<CreateItemToContainer>($"已创建:{newItem.Name}于容器:{container.Name}");
container.OnRelease += OnRelease;
_worldContainer = container;
}
newItem.GetOrCreateProperty<IsQuestItem>();
_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;
}
}
}