Преглед на файлове

增加触发单位参数@【事件开端‘从游戏服收到消息’】

大爷 преди 1 година
родител
ревизия
94398044c6

+ 64 - 2
Common/CommonAI/Zone/EventTrigger/EventAdapter.cs

@@ -507,14 +507,76 @@ namespace CommonAI.Zone.EventTrigger
 			};
 		}
 
-		public void listen_RecvMessageFromGS(EventArguments args, InstanceZone zone, string msg)
+        private List<InstanceUnit> _tmpList = new List<InstanceUnit>();
+        public void listen_RecvMessageFromGS(EventArguments args, InstanceZone zone, string msg, string triggerUnits)
 		{
 			args = args.Clone();
 			InstanceZone.RecvMessageR2BHandler handler = new InstanceZone.RecvMessageR2BHandler((z, m) =>
 			{
 				if (m.Message == msg)
 				{
-					TestAndDoAction(args);
+                    if (!string.IsNullOrEmpty(triggerUnits) || !string.IsNullOrEmpty(m.TriggerUnits))
+					{
+                        _tmpList.Clear();
+						if (!string.IsNullOrEmpty(m.TriggerUnits))
+						{
+							//游戏发送过来的,要触发的单位列表:id1,id2...
+							var sps = m.TriggerUnits.Split(',');
+							foreach (var s in sps)
+							{
+								try
+								{
+									var id = System.Convert.ToUInt32(s, 0);
+									var unit = zone.getUnit(id);
+									if (unit != null)
+									{
+										_tmpList.Add(unit);
+									}
+								}
+								catch { }
+							}
+						}
+
+                        if (!string.IsNullOrEmpty(triggerUnits))
+                        {
+                            //编辑器配置的,要触发的单位列表:类型1:数量1:阵营1;类型2:数量2:阵营2...
+                            var sps = triggerUnits.Split(';');
+							foreach (var s in sps)
+							{
+								var info = s.Split(':');
+								if(info.Length == 3)
+								{
+									if(info[0] == "1")
+									{
+										//死亡单位
+										try
+										{
+											zone.getDeadUnit(System.Convert.ToInt32(info[1]), System.Convert.ToInt32(info[2]), ref _tmpList);
+										}
+										catch { }
+									}
+									else
+									{
+										log.Error($"配置的触发单位类型不能识别: {triggerUnits}");
+									}
+								}
+							}
+                        }
+
+                        if (_tmpList.Count > 0)
+                        {
+                            foreach (var unit in _tmpList)
+                            {
+                                args.TriggingUnit = unit;
+                                TestAndDoAction(args);
+                            }
+                            _tmpList.Clear();
+                        }
+                    }
+                    else
+					{
+                        TestAndDoAction(args);
+                    }
 				}
 			});
 			zone.OnRecvMessageFromGS += handler;

+ 14 - 0
Common/CommonAI/Zone/Instance/InstanceZone.cs

@@ -671,6 +671,20 @@ namespace CommonAI.Zone.Instance
             return null;
         }
 
+        public int getDeadUnit(int count, int force, ref List<InstanceUnit> list)
+        {
+            int n = 0;
+            foreach(var obj in mObjects.Units)
+            {
+                if(obj.is_dead() && obj.Force == force && !list.Exists(u => u.ID == obj.ID))
+                {
+                    list.Add(obj);
+                    if (++n >= count) break;
+                }
+            }
+            return n;
+        }
+
         public bool IsObjectMapNull()
         {
             return this.mObjects == null;

+ 9 - 1
Common/CommonAI/Zone/ZoneEditor/EventTrigger/Triggers.Zone.cs

@@ -134,13 +134,21 @@ namespace CommonAI.Zone.ZoneEditor.EventTrigger
     {
         [DescAttribute("消息name")]
         public string Message;
+
+        [DescAttribute("选择特定Unit作为触发单位(类型:数量:阵营;)。类型=1为死亡单位")]
+        public string TriggerUnits;
+
         public override string ToString()
         {
+            if(!string.IsNullOrEmpty(TriggerUnits))
+            {
+                return string.Format("当从游戏服收到消息“{0}”, 附加触发单位({1})", Message, TriggerUnits);
+            }
             return string.Format("当从游戏服收到消息“{0}”", Message);
         }
         public override void Listen(EventTriggerAdapter api, EventArguments args)
         {
-            api.listen_RecvMessageFromGS(args, api.ZoneAPI, Message);
+            api.listen_RecvMessageFromGS(args, api.ZoneAPI, Message, TriggerUnits);
         }
     }
     

+ 3 - 0
Common/CommonAI/ZoneServer/DataB2R.cs

@@ -483,13 +483,16 @@ namespace CommonAI.ZoneServer
     public class SendMessageR2B : NetMessage
     {
         public string Message;
+        public string TriggerUnits;
         public override void WriteExternal(IOutputStream output)
         {
             output.PutUTF(this.Message);
+            output.PutUTF(this.TriggerUnits);
         }
         public override void ReadExternal(IInputStream input)
         {
             this.Message = input.GetUTF();
+            this.TriggerUnits = input.GetUTF();
         }
     }
 

+ 1 - 1
XmdsServerCS/XmdsServerEdgeJS/Zone/ZoneService.cs

@@ -118,7 +118,7 @@ namespace XmdsServerEdgeJS.Zone
 			{
 				if(param is TriggerEventR2B triggerO)
 				{
-					node.Node.Zone.RecvMessageFromGameServer(new CommonAI.ZoneServer.SendMessageR2B() { Message = triggerO.message });
+					node.Node.Zone.RecvMessageFromGameServer(new CommonAI.ZoneServer.SendMessageR2B() { Message = triggerO.message, TriggerUnits = triggerO.TriggerUnits });
                 }
 				else
 				{

+ 1 - 0
XmdsServerCS/XmdsServerNode/R2NotifyMessageDefined.cs

@@ -226,5 +226,6 @@ namespace XmdsServerNode.Node.R2bNotify
     public class TriggerEventR2B : R2BNotifyMessage
     {
         public string message;
+        public string TriggerUnits;
     }
 }