using Cal; using MongoDB.Bson.Serialization.Attributes; using Sirenix.OdinInspector; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using XNode; [NodeWidth(250)] public class ModifierNode : SkillNode { // Use this for initialization protected override void Init() { base.Init(); modifier = modifier ?? new ModifierConfig(); } [LabelText("操作")] [PropertyOrder(0)] [BsonIgnore] [Input] public float input; [PropertySpace(0, 15)] [PropertyOrder(1)] [BsonIgnore] [LabelText("modifier事件条件")] [Output] public float result; [BsonIgnore] [ShowInInspector] [PropertyOrder(2)] public string modifierId => $"{modifier?.Id.Value / 100}+{modifier?.Id.Value % 100}"; [PropertyOrder(3)] [SerializeField] public ModifierConfig modifier; // GetValue should be overridden to return a value for any specified output port public override object GetValue(NodePort port) { return null; } public override void OnCreateConnection(NodePort from, NodePort to) { if (to.node == this) { if (!(from.node is SkillOptionBase)) { from.Disconnect(to); return; } Type type = from.node.GetType(); foreach (var fieldInfo in type.GetFields()) { if(fieldInfo.FieldType == typeof(ModifierId)) { modifier.Id = (ModifierId)fieldInfo.GetValue(from.node); } else if (fieldInfo.FieldType == typeof(ModifierId[])) { var arr = (ModifierId[])fieldInfo.GetValue(from.node); HashSet set = new HashSet(); foreach (var item in arr) { set.Add(item); } foreach (ModifierNode item in skillGraph.nodes.FindAll(t=>t is ModifierNode)) { if (item != this) { if (set.Contains(item.modifier.Id)) set.Remove(item.modifier.Id); } } if (set.Count==0) { ET.Log.Error($"modifier Id = {modifierId}不能配对"); return; } modifier.Id = set.First(); } } } else if (!(to.node is ModifierEventConditionNode)) { from.Disconnect(to); } } #if UNITY public override void CheckData() { modifier.CheckData(); } #endif }