using System; using System.Collections.Generic; using System.Text; using System.Reflection; using CommonLang.Property; using CommonAI.Zone.Instance; using CommonAI.Zone.ZoneEditor.EventTrigger; using CommonLang.IO.Attribute; using CommonLang.IO; using CommonLang.Xml; using System.Xml; using CommonAI.Zone.EventTrigger; namespace CommonAI.Zone.ZoneEditor { /// <summary> /// 事件动作触发器 /// </summary> [MessageType(0x4501)] [TableClassAttribute("Name")] public class ZoneEvent : ICloneable, IEventDataNode, IExternalizable { public string EventName { get { return this.Name; } set { this.Name = value; } } public string EventTreePath { get { return this.SavePath; } set { this.SavePath = value; } } public bool EventIsActive { get { return this.Active; } set { this.Active = value; } } public string EventComment { get { return this.Comment; } set { this.Comment = value; } } public int EventDelayTimeMS { get { return this.DelayTimeMS; } set { this.DelayTimeMS = value; } } public List<LocalVar> EventLocalVars { get { return this.LocalVars.Datas; } } public List<AbstractTrigger> EventTriggers { get { return this.Triggers.Datas; } } public List<AbstractCondition> EventConditions { get { return this.Conditions.Datas; } } public List<AbstractAction> EventActions { get { return this.Actions.Datas; } } /// <summary> /// 触发器名字 /// </summary> public string Name = "Unnamed"; /// <summary> /// 启用 /// </summary> public bool Active = true; /// <summary> /// 注释 /// </summary> public string Comment = ""; /// <summary> /// 保存 /// </summary> public string SavePath; /// <summary> /// 延迟执行 /// </summary> public int DelayTimeMS; /// <summary> /// 临时变量 /// </summary> public EventLocalVars LocalVars = new EventLocalVars(); /// <summary> /// 事件触发 /// </summary> public EventTriggers Triggers = new EventTriggers(); /// <summary> /// 条件 /// </summary> public EventConditions Conditions = new EventConditions(); /// <summary> /// 动作 /// </summary> public EventActions Actions = new EventActions(); public ZoneEvent() { Triggers.Datas.Add(new SceneInitialized()); Conditions.Datas.Add(new AlwaysTrue()); Actions.Datas.Add(new DoNoting()); } public override string ToString() { return Name + ""; } public string FunctionText() { StringBuilder sb = new StringBuilder(); sb.Append(Triggers.ToString()); sb.Append(",\n"); sb.Append("满足条件:").Append(Conditions.ToString()); sb.Append(",\n"); sb.Append("执行动作:").Append(Actions.ToString()); sb.Append("。"); return sb.ToString(); } public object Clone() { return IOUtil.CloneIExternalizable<ZoneEvent>(TemplateManager.MessageCodec, this); } public void WriteExternal(IOutputStream output) { output.PutUTF(this.Name); output.PutBool(this.Active); output.PutUTF(this.Comment); output.PutUTF(this.SavePath); output.PutS32(this.DelayTimeMS); output.PutObj2Xml(this.LocalVars); output.PutObj2Xml(this.Triggers); output.PutObj2Xml(this.Conditions); output.PutObj2Xml(this.Actions); } public void ReadExternal(IInputStream input) { this.Name = input.GetUTF(); this.Active = input.GetBool(); this.Comment = input.GetUTF(); this.SavePath = input.GetUTF(); this.DelayTimeMS = input.GetS32(); this.LocalVars = input.GetXml2Obj<EventLocalVars>(); this.Triggers = input.GetXml2Obj<EventTriggers>(); this.Conditions = input.GetXml2Obj<EventConditions>(); this.Actions = input.GetXml2Obj<EventActions>(); } } // ---------------------------------------------------------------------- public class EventLocalVars { public List<LocalVar> Datas = new List<LocalVar>(); public override string ToString() { StringBuilder sb = new StringBuilder(); if (Datas.Count > 0) { for (int i = 0; i < Datas.Count; i++) { sb.AppendLine(Datas[i].ToString()); } } return sb.ToString(); } } public class EventTriggers { public List<AbstractTrigger> Datas = new List<AbstractTrigger>(); public override string ToString() { StringBuilder sb = new StringBuilder(); if (Datas.Count > 0) { for (int i = 0; i < Datas.Count; i++) { sb.Append(Datas[i]); if (i < Datas.Count - 1) { sb.Append(" 或者 "); } } } else { sb.Append("(无起因)"); } return sb.ToString(); } } public class EventConditions { public List<AbstractCondition> Datas = new List<AbstractCondition>(); public override string ToString() { StringBuilder sb = new StringBuilder(); if (Datas.Count > 0) { for (int i = 0; i < Datas.Count; i++) { sb.Append(Datas[i]); if (i < Datas.Count - 1) { sb.Append(" 并且 "); } } } else { sb.Append("(无条件)"); } return sb.ToString(); } } public class EventActions { public List<AbstractAction> Datas = new List<AbstractAction>(); public override string ToString() { StringBuilder sb = new StringBuilder(); if (Datas.Count > 0) { for (int i = 0; i < Datas.Count; i++) { sb.Append(Datas[i]); if (i < Datas.Count - 1) { sb.Append(" 并且 "); } } } else { sb.Append("(无动作)"); } return sb.ToString(); } } // ---------------------------------------------------------------------- }