Quellcode durchsuchen

【优化】榜单优化为游戏服计算

johnclot69 vor 1 Jahr
Ursprung
Commit
31bac31467

+ 2 - 8
DotNet/Hotfix/Helper/BattleServerEventHelper.cs

@@ -15,7 +15,7 @@ namespace ET.Server
         /// <param name="msg"></param>
         public static void AreaBattleServerEvent(JObject msg)
         {
-            //Log.Debug($"AreaBattleServerEvent msg: {JsonConvert.SerializeObject(msg, Formatting.Indented)}");
+            Log.Debug($"AreaBattleServerEvent msg: {JsonConvert.SerializeObject(msg, Formatting.Indented)}");
             long instanceId = Convert.ToInt64(msg.SelectToken("instanceId"));
             Map map = GameMapComponent.Instance.Get(instanceId);
             if (map == null)
@@ -26,15 +26,9 @@ namespace ET.Server
 
             switch (Convert.ToString(msg.SelectToken("eventName")))
             {
-                //此消息不再主动推送
-                //case "unitDead":
-                //{
-                //    map.GetComponent<MapEventComponent>().OnUnitDead(msg);
-                //    return;
-                //}
                 case "message":
                 {
-                    map.GetComponent<MapEventComponent>().OnMessageEvent(msg);
+                    map.GetComponent<MapEventComponent>().OnMessage(msg);
                     return;
                 }
                 case "gameOver":

+ 7 - 1
DotNet/Hotfix/Scenes/Game/Handler/R2G_LiveGiftHandler.cs

@@ -19,7 +19,7 @@ namespace ET.Server
                 return;
             }
 
-            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerData(request.OpenId);
+            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByOpenId(request.OpenId);
             // 数据是否存在
             if (unitPlayerData == null)
             {
@@ -82,18 +82,24 @@ namespace ET.Server
                         notify = new Struct.TriggerEventNotify();
                         notify.message = BattleNotify.TiktokGift_99.ToString();
                         notify.TriggerUnits = unitPlayerData.ObjId.ToString();
+                        // 对应的贡献值
+                        map.AddContributeValue(request.OpenId, 99);
                         break;
                     case DouyinItem.GiftId_199:
                         // 恶魔炸弹
                         notify = new Struct.TriggerEventNotify();
                         notify.message = BattleNotify.TiktokGift_199.ToString();
                         notify.TriggerUnits = unitPlayerData.ObjId.ToString();
+                        // 对应的贡献值
+                        map.AddContributeValue(request.OpenId, 199);
                         break;
                     case DouyinItem.GiftId_520:
                         // 神秘空投
                         notify = new Struct.TriggerEventNotify();
                         notify.message = BattleNotify.TiktokGift_520.ToString();
                         notify.TriggerUnits = unitPlayerData.ObjId.ToString();
+                        // 对应的贡献值
+                        map.AddContributeValue(request.OpenId, 520);
                         break;
                 }
 

+ 4 - 1
DotNet/Hotfix/Scenes/Game/Handler/R2G_LiveLikeHandler.cs

@@ -20,12 +20,15 @@ namespace ET.Server
             }
 
             // 数据是否存在
-            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerData(request.OpenId) ?? map.AddUnitPlayer(request.OpenId, 0, 0, request.Likes);
+            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByOpenId(request.OpenId) ?? map.AddUnitPlayer(request.OpenId, 0, 0, request.Likes);
 
             // 累计增加点赞数
             unitPlayerData.Likes += request.Likes;
             map.TotalLikeNum += request.Likes;
 
+            // 点赞增加贡献值
+            unitPlayerData.ContributeValue += request.Likes;
+
             const int configNum = 1000; //到达多少值后,总数量减去这个值,然后继续累加
 
             bool notifyBattleServer = false;

+ 54 - 75
DotNet/Hotfix/Scenes/Game/Map/MapEventComponentSystem.cs

@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using MongoDB.Driver;
 using System.Text.RegularExpressions;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
@@ -36,78 +35,82 @@ namespace ET.Server
             }
         }
 
-        /// <summary>
-        /// 单位死亡事件
-        /// </summary>
-        /// <param name="self"></param>
-        /// <param name="msg"></param>
-        public static void OnUnitDead(this MapEventComponent self, JObject msg)
-        {
-        }
-
         /// <summary>
         /// 副本消息
         /// </summary>
         /// <param name="self"></param>
         /// <param name="msg"></param>
-        public static void OnMessageEvent(this MapEventComponent self, JObject json)
+        public static void OnMessage(this MapEventComponent self, JObject json)
         {
-            var msg = Convert.ToString(json.SelectToken("msg"));
-            switch (msg)
+            string msg = Convert.ToString(json.SelectToken("msg"));
+
+            string[] parames = msg.Split(":");
+
+            switch (parames[0])
             {
-                case "Dead:Tower1":
+                case "Dead":
                 {
-                    Log.Debug($"塔1死亡事件...");
-                    self.GetParent<Map>().DeadUnits.Add(1001);
-                    self.TransferUnitsToNewTower();
-                    return;
-                }
-                case "Dead:Tower2":
-                {
-                    Log.Debug($"塔2死亡事件...");
-                    self.GetParent<Map>().DeadUnits.Add(1002);
-                    return;
-                }
-                case "Dead:Tower3":
-                {
-                    Log.Debug($"塔3死亡事件...");
-                    self.GetParent<Map>().DeadUnits.Add(1003);
+                    if ("Tower1".Equals(parames[1]))
+                    {
+
+                        return;
+                    }
+                    else if ("Tower2".Equals(parames[1]))
+                    {
+                        Log.Debug($"塔2死亡事件...");
+                        self.GetParent<Map>().DeadUnits.Add(1002);
+                        return;
+                    } else if ("Tower3".Equals(parames[1]))
+                    {
+                        Log.Debug($"塔3死亡事件...");
+                        self.GetParent<Map>().DeadUnits.Add(1003);
+                        return;
+                    }
+                    else
+                    {
+                        int objId = int.Parse(parames[1]);
+                        if (objId > 0)
+                        {
+                            Log.Debug($"单位:{objId}死亡事件...");
+                            Map map = self.GetParent<Map>();
+                            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
+                            if (unitPlayerData != null)
+                            {
+                                unitPlayerData.DeadState = 1;
+                            }
+                            return;
+                        }
+                    }
                     return;
                 }
-            }
-            if (msg.StartsWith("Dead:{"))
-            {
-                //玩家单位死亡
-                Match m = Regex.Match(msg, "Dead:{(\\d+)}");
-                if (m.Groups.Count == 2)
+                case "Revive":
                 {
-                    try
-                    {
-                        int objid = int.Parse(m.Groups[1].Value);
-                        //TODO: 处理玩家单位死亡
-                    }
-                    catch (Exception)
+                    int objId = int.Parse(parames[1]);
+                    if (objId > 0)
                     {
-                        Log.Error("Illegal Dead msg");
+                        Log.Debug($"单位:{objId}复活事件...");
+                        Map map = self.GetParent<Map>();
+                        Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
+                        if (unitPlayerData != null)
+                        {
+                            unitPlayerData.DeadState = 0;
+                        }
+                        return;
                     }
+                    return;
                 }
             }
-            else if (msg.StartsWith("Revive:{"))
-            {
-                //TODO:处理玩家单位复活
-            }
         }
 
         private static void TransferUnitsToNewTower(this MapEventComponent self)
         {
             Map map = self.GetParent<Map>();
-            var mapid = map.Id.ToString();
 
             int cnt = 0;
-            foreach(var player in map.UnitPlayers.Values)
+            foreach(Struct.UnitPlayerData player in map.UnitPlayers.Values)
             {
                 //TODO: 转移坐标为当前战斗区域中的随机位置
-                map.GetXmdsManager().transferUnit(mapid, player.ObjId, 178f + (cnt++), 139f);
+                map.GetXmdsManager().transferUnit(map.Id.ToString(), player.ObjId, 178f + (cnt++), 139f);
             }
             Log.Debug($"transfer unit: {cnt}");
         }
@@ -126,7 +129,8 @@ namespace ET.Server
             {
                 return;
             }
-
+            // 场景结束逻辑
+            map.GetComponent<MapRankComponent>().OnGameOver();
             // 记录玩家历史
             map.SyncPlayerHistoryData(map.Player);
             // 战斗服场景玩家离开
@@ -164,31 +168,6 @@ namespace ET.Server
         /// <param name="msg"></param>
         public static void OnBattleReport(this MapEventComponent self, JObject msg)
         {
-            string data = Convert.ToString(msg.SelectToken("data"));
-            if (string.IsNullOrEmpty(data))
-            {
-                return;
-            }
-
-            List<Struct.BattleReports> battleReports = JsonConvert.DeserializeObject<List<Struct.BattleReports>>(data);
-            if (battleReports is not { Count: > 0 })
-            {
-                return;
-            }
-
-            Map map = self.GetParent<Map>();
-
-            List<Struct.BattleReports> list = (from report in battleReports
-                where report.Force == 1
-                let ID = report.ID
-                let PlayerUUID = string.IsNullOrEmpty(report.PlayerUUID)? "0" : report.PlayerUUID
-                let TemplateID = report.TemplateId
-                let Name = "玩家" + ID + "." + TemplateID
-                let Force = report.Force
-                let TotalDamage = report.TotalDamage
-                select new Struct.BattleReports(ID, PlayerUUID, TemplateID, Name, Force, TotalDamage)).ToList();
-
-            map.GetComponent<MapRankComponent>().UpdateRank(list, map);
         }
     }
 }

+ 78 - 34
DotNet/Hotfix/Scenes/Game/Map/MapRankComponentSystem.cs

@@ -10,10 +10,6 @@ namespace ET.Server
     {
         public class MapRankComponentAwakeSystem: AwakeSystem<MapRankComponent>
         {
-            /// <summary>
-            /// 场景贡献榜组件创建
-            /// </summary>
-            /// <param name="self"></param>
             protected override void Awake(MapRankComponent self)
             {
                 Log.Info($"创建场景贡献榜组件");
@@ -22,68 +18,80 @@ namespace ET.Server
 
         public class MapRankComponentDestroySystem: DestroySystem<MapRankComponent>
         {
-            /// <summary>
-            /// 场景贡献榜组件销毁
-            /// </summary>
-            /// <param name="self"></param>
             protected override void Destroy(MapRankComponent self)
             {
-                Log.Debug($"销毁场景贡献榜组件");
+                Log.Info($"销毁场景贡献榜组件");
+            }
+        }
+
+        public class MapRankComponentUpdateSystem: UpdateSystem<MapRankComponent>
+        {
+            protected override void Update(MapRankComponent self)
+            {
+                // 未死亡的单位玩家,每秒增加贡献值
+                self.AddContributeValue();
+
+                // 每隔3秒推送排名
+                long now = TimeHelper.ClientNow();
+                if (now >= self.NextPushTime)
+                {
+                    // 排序并推送客户端
+                    self.Sort();
+                    // 设置下一次推送时间戳
+                    self.NextPushTime = now + 3000;
+                }
             }
         }
 
         /// <summary>
-        /// 更新排行榜数据
+        /// 增加贡献值数据
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="dataList"></param>
-        /// <param name="map"></param>
-        public static void UpdateRank(this MapRankComponent self, List<Struct.BattleReports> dataList, Map map)
+        private static void AddContributeValue(this MapRankComponent self)
         {
-            foreach (Struct.BattleReports data in dataList)
-            {
-                bool isExist = false;
+            Map map = self.GetParent<Map>();
 
-                foreach (Struct.BattleReports br in self.RankList.Where(br => data.ID == br.ID))
+            foreach (Struct.UnitPlayerData unitPlayer in map.UnitPlayers.Values)
+            {
+                if (unitPlayer.DeadState == 1)
                 {
-                    isExist = true;
-                    br.TotalDamage = data.TotalDamage;
+                    continue;
                 }
 
-                if (!isExist)
+                int value = unitPlayer.Level switch
                 {
-                    self.RankList.Add(data);
-                }
-            }
+                    1 => 1,
+                    2 => 2,
+                    3 => 3,
+                    _ => 0
+                };
 
-            self.Sort(map);
+                map.AddContributeValue(unitPlayer.OpenId, value);
+            }
         }
 
         /// <summary>
         /// 排序
         /// </summary>
         /// <param name="self"></param>
-        /// <param name="map"></param>
-        private static void Sort(this MapRankComponent self, Map map)
+        private static void Sort(this MapRankComponent self)
         {
-            List<Struct.BattleReports> list = new List<Struct.BattleReports>();
+            Map map = self.GetParent<Map>();
 
-            self.RankList.ForEach(br => list.Add(br));
+            List<Struct.UnitPlayerData> list = map.UnitPlayers.Values.Where(unitPlayer => unitPlayer != null).ToList();
 
             if (list is { Count: > 0 })
             {
-                list.Sort((r1, r2) => r2.TotalDamage.CompareTo(r1.TotalDamage));
+                list.Sort((r1, r2) => r2.ContributeValue.CompareTo(r1.ContributeValue));
             }
 
             int ranking = 1;
 
             List<RankInfo> infoListProto = new List<RankInfo>();
 
-            foreach (Struct.BattleReports battleReports in list.Where(battleReports => ranking <= 3))
+            foreach (RankInfo info in from unitPlayerData in list where ranking <= 3 select new RankInfo())
             {
-                // 客户端消息
-                RankInfo info = new RankInfo();
-                info.Name = battleReports.Name;
+                info.Name = "unitPlayerData.Name";
                 info.Ranking = ranking;
                 infoListProto.Add(info);
 
@@ -96,11 +104,12 @@ namespace ET.Server
                 return;
             }
 
-            self.LastInfoListProto = infoListProto;
             // 推送客户端
             if (map.Player != null)
             {
                 MessageHelper.SendToClient(map.Player, new G2C_RankNotify() { InfoList = infoListProto });
+                // 记录一下推送列表
+                self.LastInfoListProto = infoListProto;
             }
         }
 
@@ -123,5 +132,40 @@ namespace ET.Server
 
             return true;
         }
+
+        /// <summary>
+        /// 游戏结束
+        /// </summary>
+        /// <param name="self"></param>
+        public static void OnGameOver(this MapRankComponent self)
+        {
+            Map map = self.GetParent<Map>();
+
+            List<Struct.UnitPlayerData> list = map.UnitPlayers.Values.Where(unitPlayer => unitPlayer != null).ToList();
+
+            if (list is { Count: > 0 })
+            {
+                list.Sort((r1, r2) => r2.ContributeValue.CompareTo(r1.ContributeValue));
+            }
+
+            int ranking = 1;
+
+            List<RankInfo> infoListProto = new List<RankInfo>();
+
+            foreach (RankInfo info in from unitPlayerData in list where ranking <= 50 select new RankInfo())
+            {
+                info.Name = "unitPlayerData.Name";
+                info.Ranking = ranking;
+                infoListProto.Add(info);
+
+                ranking += 1;
+            }
+
+            // 推送客户端
+            if (map.Player != null)
+            {
+                MessageHelper.SendToClient(map.Player, new G2C_RankNotify() { InfoList = infoListProto });
+            }
+        }
     }
 }

+ 45 - 2
DotNet/Hotfix/Scenes/Game/Map/MapSystem.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using BattleIce;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
@@ -23,6 +24,7 @@ namespace ET.Server
                 self.Type = self.Prop.Type;
                 self.Player = player;
                 self.UnitPlayers = new Dictionary<string, Struct.UnitPlayerData>();
+                self.DeadUnits = new List<int>();
 
                 // 战斗服事件组件
                 self.AddComponent<MapEventComponent>();
@@ -333,12 +335,12 @@ namespace ET.Server
         }
 
         /// <summary>
-        /// 获取单位玩家模板id
+        /// 获取单位玩家
         /// </summary>
         /// <param name="self"></param>
         /// <param name="openId"></param>
         /// <returns></returns>
-        public static Struct.UnitPlayerData GetUnitPlayerData(this Map self, string openId)
+        public static Struct.UnitPlayerData GetUnitPlayerByOpenId(this Map self, string openId)
         {
             if (self.UnitPlayers.TryGetValue(openId, out Struct.UnitPlayerData unitPlayer))
             {
@@ -348,6 +350,17 @@ namespace ET.Server
             return null;
         }
 
+        /// <summary>
+        /// 获取单位玩家
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="objId"></param>
+        /// <returns></returns>
+        public static Struct.UnitPlayerData GetUnitPlayerByObjId(this Map self, int objId)
+        {
+            return self.UnitPlayers.Values.FirstOrDefault(unitPlayer => unitPlayer != null && unitPlayer.ObjId == objId);
+        }
+
         /// <summary>
         /// 获取当前坐标xy
         /// </summary>
@@ -369,6 +382,36 @@ namespace ET.Server
             return "218;78";
         }
 
+        /// <summary>
+        /// 玩家增加贡献值
+        /// </summary>
+        /// <param name="self"></param>
+        /// <param name="openId"></param>
+        /// <param name="addValue"></param>
+        public static void AddContributeValue(this Map self, string openId, long addValue)
+        {
+            Struct.UnitPlayerData unitPlayerData = self.GetUnitPlayerByOpenId(openId);
+
+            if (unitPlayerData == null)
+            {
+                return;
+            }
+
+            if (self.IsGameOver())
+            {
+                return;
+            }
+
+            long value = unitPlayerData.ContributeValue + addValue;
+
+            if (value >= long.MaxValue)
+            {
+                value = long.MaxValue;
+            }
+
+            unitPlayerData.ContributeValue = value;
+        }
+
         /// <summary>
         /// 获取抖音直播接口调用凭证
         /// </summary>

+ 6 - 34
DotNet/Model/Const/Struct.cs

@@ -215,40 +215,6 @@
             }
         }
 
-        /// <summary>
-        /// 战报数据
-        /// </summary>
-        public class BattleReports
-        {
-            public uint ID { get; set; }
-            public string PlayerUUID { get; set; }
-
-            /** 模板id **/
-            public int TemplateId { get; set; }
-
-            /** 单位名称 **/
-            public string Name { get; set; }
-
-            /** 阵营 **/
-            public int Force { get; set; }
-
-            /** 对所有单位输出的总伤害 **/
-            public int TotalDamage { get; set; }
-
-            /** 对所有单位输出的总治疗量 **/
-            public int TotalHealing { get; set; }
-
-            public BattleReports(uint id, string PlayerUUID, int templateId, string name, int force, int totalDamage)
-            {
-                this.ID = id;
-                this.PlayerUUID = PlayerUUID;
-                this.TemplateId = templateId;
-                this.Name = name;
-                this.Force = force;
-                this.TotalDamage = totalDamage;
-            }
-        }
-
         /// <summary>
         /// 玩家单位数据
         /// </summary>
@@ -269,6 +235,12 @@
             /** 点赞数 **/
             public long Likes { get; set; }
 
+            /** 贡献值 **/
+            public long ContributeValue { get; set; }
+
+            /** 死亡状态 0:活着 1:死亡 **/
+            public int DeadState { get; set; }
+
             /** 复活时间 **/
             public long ReliveTime { get; set; }
 

+ 2 - 3
DotNet/Model/Scenes/Game/Map/Map.cs

@@ -31,10 +31,9 @@ namespace ET.Server
         public long TotalLikeNum { get; set; }
         /** 配置数量达到次数 **/
         public long ConfigNum { get; set; }
-
         /** 死亡的单位(塔) **/
-        [StaticField]
-        public List<int> DeadUnits = new List<int>();
+        public List<int> DeadUnits { get; set; }
+
         /** 游戏结束标记 **/
         [StaticField]
         public bool IsGameOver = false;

+ 5 - 5
DotNet/Model/Scenes/Game/Map/MapRankComponent.cs

@@ -3,12 +3,12 @@
 namespace ET.Server
 {
     [ComponentOf(typeof (Map))]
-    public class MapRankComponent: Entity, IAwake, IDestroy
+    public class MapRankComponent: Entity, IAwake, IDestroy, IUpdate
     {
-        /** 排行榜缓存数据 **/
-        [StaticField]
-        public List<Struct.BattleReports> RankList = new List<Struct.BattleReports>();
-        /** 上一次推送列表 **/
+        /** 每隔3秒推送排名时间 **/
+        public long NextPushTime { get; set; }
+
+        /** 上一次推送列表 **/
         [StaticField]
         public List<RankInfo> LastInfoListProto = new List<RankInfo>();
     }