Browse Source

【优化】解决仙女棒/能量药丸不正确问题

johnclot69 1 year ago
parent
commit
2c4dc00d12

+ 2 - 4
DotNet/Hotfix/Helper/MapHelper.cs

@@ -99,12 +99,10 @@ namespace ET.Server
 
             map = component.GetMapByRoomId(player.GetRoomId());
 
-            // 销毁老场景
+            // 老场景
             if (map != null)
             {
-                component.Remove(map.Id, map.RoomId);
-                map.Dispose();
-                map = null;
+                return map;
             }
 
             // 创建一个场景

+ 1 - 13
DotNet/Hotfix/Scenes/Game/Handler/C2G_AddUnitsToMapHandler.cs

@@ -39,7 +39,7 @@ namespace ET.Server
 
 
             Struct.MonsterUnit unit = new Struct.MonsterUnit();
-            unit.name = GetRandomName();
+            unit.name = player.Map.GetRandomPlayerName();
             unit.id = request.UnitId;
             unit.force = request.Force;
             if (!string.IsNullOrEmpty(request.Flag))
@@ -61,17 +61,5 @@ namespace ET.Server
 
             reply();
         }
-
-        private string GetRandomName()
-        {
-            string[] names =
-            {
-                "好人", "小新", "精钢侠", "带投大戈", "奥仔", "袄特门", "兔比斯", "张剑闯天牙", "窝耗帅", "大白"
-            };
-
-            var rand = new Random();
-            var first = names[rand.Next(names.Length)];
-            return first + rand.Next(9999);
-        }
     }
 }

+ 88 - 103
DotNet/Hotfix/Scenes/Game/Handler/R2G_LiveGiftHandler.cs

@@ -1,5 +1,7 @@
-using System.Linq;
+using System;
+using System.Linq;
 using System.Numerics;
+using System.Text;
 using System.Text.Json;
 
 namespace ET.Server
@@ -42,29 +44,41 @@ namespace ET.Server
 
             Struct.TriggerEventNotify notify = null;
 
-            for (int i = 0; i < request.GiftNum; i++)
+            if (DouyinItem.GiftId_1.Equals(request.GiftId) || DouyinItem.GiftId_10.Equals(request.GiftId))
             {
-                int objId = 0;
+                // 仙女棒 自己死了复活自己, 自己没死复活其他人, 不够则补充单位
+                // 能量药丸 自己死了复活自己, 自己没死复活其他3个人, 不够则补充单位
 
-                switch (request.GiftId)
-                {
-                    case DouyinItem.GiftId_1:
-                        // 仙女棒
+                StringBuilder objIds = new StringBuilder();
 
-                        // 自己死了复活自己, 自己没死复活其他人
-                        objId = unitPlayerData.DeadState == 1? unitPlayerData.ObjId : map.DeadUnitPlayer.Count > 0? map.DeadUnitPlayer.First() : 0;
+                notify = new Struct.TriggerEventNotify();
 
+                if (unitPlayerData.DeadState == 1)
+                {
+                    objIds.Append(unitPlayerData.ObjId);
+                }
+                else
+                {
+                    long cnt = request.GiftNum * (DouyinItem.GiftId_1.Equals(request.GiftId)? 1 : 3);
+
+                    foreach (int objId in map.DeadUnitPlayer)
+                    {
                         if (objId > 0)
                         {
-                            map.GetXmdsManager().notifyBattleServer(map.Id.ToString(), NotifyBSName.TriggerEvent, JsonSerializer.Serialize(new Struct.TriggerEventNotify()
-                            {
-                                message = BattleNotify.TiktokGift_1.ToString(),
-                                TriggerUnits = objId.ToString()
-                            })) ;
+                            objIds.Append(objId).Append(',');
+                            cnt -= 1;
                         }
-                        else
+                        if (cnt <= 0)
+                        {
+                            break;
+                        }
+                    }
+
+                    if (cnt > 0)
+                    {
+                        // 补充单位
+                        for (int i = 0; i < cnt; i++)
                         {
-                            // 补充一个单位
                             Vector2 pos = map.GetRandomPlayerPos();
 
                             Struct.MonsterUnit unit = new Struct.MonsterUnit();
@@ -73,103 +87,74 @@ namespace ET.Server
                             unit.x = pos.X;
                             unit.y = pos.Y;
                             unit.autoGuard = true;
-                            unit.name = "Nickname";
-                            unit.alias = "Url";
+                            unit.name = map.GetRandomPlayerName();
 
                             int _objId = await map.AddUnits(unit, true);
+                            // 临时openId
+                            string _openId = (10000 + new Random().Next(999)).ToString();
 
-                            map.AddUnitPlayer(request.OpenId, unit.id, _objId, 0, request.NickName, request.Url);
+                            map.AddUnitPlayer(_openId, unit.id, _objId, 0, unit.name, "");
                         }
-                        break;
-                    case DouyinItem.GiftId_10:
-                        // 能量药丸
+                    }
+                }
 
-                        objId = 0;
-                        // 自己死了复活自己
-                        if (unitPlayerData.DeadState == 1)
-                        {
-                            objId = unitPlayerData.ObjId;
-                        }
-                        else
-                        {
-                            // 自己没死复活其他3个人
-                            int index = 0;
-                            foreach (int deadObjId in map.DeadUnitPlayer.Where(deadObjId => deadObjId > 0 && index < 3))
+                notify.message = DouyinItem.GiftId_1.Equals(request.GiftId)? BattleNotify.TiktokGift_1.ToString() : BattleNotify.TiktokGift_10.ToString();
+                notify.TriggerUnits = objIds.ToString();
+                map.GetXmdsManager().notifyBattleServer(map.Id.ToString(), NotifyBSName.TriggerEvent, JsonSerializer.Serialize(notify));
+
+                // Log.Debug($"============================================仙女棒/能量药丸 notifyBattleServer - data={JsonSerializer.Serialize(notify)}");
+            }
+            else
+            {
+                for (int i = 0; i < request.GiftNum; i++)
+                {
+                    switch (request.GiftId)
+                    {
+                        case DouyinItem.GiftId_52:
+                            // 甜甜圈
+                            const long maxLevel = 3; // 等级上限
+                            notify = new Struct.TriggerEventNotify();
+                            if (unitPlayerData.Level < maxLevel)
                             {
-                                map.GetXmdsManager().notifyBattleServer(map.Id.ToString(), NotifyBSName.TriggerEvent, JsonSerializer.Serialize(new Struct.TriggerEventNotify()
-                                {
-                                    message = BattleNotify.TiktokGift_10.ToString(),
-                                    TriggerUnits = deadObjId.ToString()
-                                })) ;
-                                index += 1;
+                                ++unitPlayerData.Level;
+                                notify.message = BattleNotify.TiktokGift_52.ToString();
                             }
-                            // 不够则补充单位
-                            if (3 - index > 0)
+                            else
                             {
-                                for (int j = 0; j < 3 - index; j++)
-                                {
-                                    Vector2 pos = map.GetRandomPlayerPos();
-
-                                    Struct.MonsterUnit unit = new Struct.MonsterUnit();
-                                    unit.id = RandomGenerator.RandomArray(units);
-                                    unit.force = 1;
-                                    unit.x = pos.X;
-                                    unit.y = pos.Y;
-                                    unit.autoGuard = true;
-                                    unit.name = "Nickname";
-                                    unit.alias = "Url";
-
-                                    int _objId = await map.AddUnits(unit, true);
-
-                                    map.AddUnitPlayer(request.OpenId, unit.id, _objId, 0, request.NickName, request.Url);
-                                }
+                                notify.message = BattleNotify.TiktokGift_52_ext.ToString();
                             }
-                        }
-                        break;
-                    case DouyinItem.GiftId_52:
-                        // 甜甜圈
-                        const long maxLevel = 3; // 等级上限
-                        notify = new Struct.TriggerEventNotify();
-                        if (unitPlayerData.Level < maxLevel)
-                        {
-                            ++unitPlayerData.Level;
-                            notify.message = BattleNotify.TiktokGift_52.ToString();
-                        }
-                        else
-                        {
-                            notify.message = BattleNotify.TiktokGift_52_ext.ToString();
-                        }
-                        notify.TriggerUnits = unitPlayerData.ObjId.ToString();
-                        break;
-                    case DouyinItem.GiftId_99:
-                        // 能量电池
-                        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;
+                            notify.TriggerUnits = unitPlayerData.ObjId.ToString();
+                            break;
+                        case DouyinItem.GiftId_99:
+                            // 能量电池
+                            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;
+                    }
+
+                    map.GetXmdsManager().notifyBattleServer(map.Id.ToString(), NotifyBSName.TriggerEvent, JsonSerializer.Serialize(notify));
+                    //间隔30ms,触发一次礼物效果
+                    await TimerComponent.Instance.WaitAsync(30);
                 }
-
-                map.GetXmdsManager().notifyBattleServer(map.Id.ToString(), NotifyBSName.TriggerEvent, JsonSerializer.Serialize(notify));
-                //间隔30ms,触发一次礼物效果
-                await TimerComponent.Instance.WaitAsync(30);
             }
         }
     }

+ 12 - 7
DotNet/Hotfix/Scenes/Game/Map/MapEventComponentSystem.cs

@@ -40,11 +40,11 @@ namespace ET.Server
         /// </summary>
         /// <param name="self"></param>
         /// <param name="msg"></param>
-        public static void OnMessage(this MapEventComponent self, JObject json)
+        public static void OnMessage(this MapEventComponent self, JObject msg)
         {
-            string msg = Convert.ToString(json.SelectToken("msg"));
+            string str = Convert.ToString(msg.SelectToken("msg"));
 
-            string[] parames = msg.Split(":");
+            string[] parames = str.Split(":");
 
             switch (parames[0])
             {
@@ -52,6 +52,7 @@ namespace ET.Server
                 {
                     if ("Tower1".Equals(parames[1]))
                     {
+                        Log.Debug($"塔1死亡事件...");
                         Map map = self.GetParent<Map>();
                         map.CurBattleIndex = 1;
                         map.TransferUnitsToNewTower();
@@ -83,10 +84,9 @@ namespace ET.Server
                                 unitPlayerData.DeadState = 1;
                                 map.DeadUnitPlayer.Add(unitPlayerData.ObjId);
                             }
-                            return;
                         }
                     }
-                    return;
+                    break;
                 }
                 case "Revive":
                 {
@@ -101,9 +101,8 @@ namespace ET.Server
                             unitPlayerData.DeadState = 0;
                             map.DeadUnitPlayer.Remove(unitPlayerData.ObjId);
                         }
-                        return;
                     }
-                    return;
+                    break;
                 }
             }
         }
@@ -124,6 +123,8 @@ namespace ET.Server
             }
             // 场景结束排行榜逻辑
             map.GetComponent<MapRankComponent>().OnGameOver();
+            // 玩家离开
+            map.Player.GetComponent<PlayerTempDataComponent>().MapData.ready = false;
             // 记录玩家历史
             map.SyncPlayerHistoryData(map.Player);
             // 战斗服场景玩家离开
@@ -132,8 +133,12 @@ namespace ET.Server
             map.RemovePlayer(map.Player, false);
             // 战斗服结束场景
             map.GetZoneManager().destroyZoneRequest(map.Id.ToString());
+            // 移除本地场景数据
+            map.DomainScene().GetComponent<GameMapComponent>().Remove(map.Id, map.RoomId);
 
             map.Player.Map = null;
+
+            map.Dispose();
         }
 
         /// <summary>

+ 12 - 0
DotNet/Hotfix/Scenes/Game/Map/MapSystem.cs

@@ -469,5 +469,17 @@ namespace ET.Server
             }
             Log.Debug($"transfer unit: {self.UnitPlayers.Count}");
         }
+
+        public static string GetRandomPlayerName(this Map self)
+        {
+            string[] names =
+            {
+                "好人", "小新", "精钢侠", "带投大戈", "奥仔", "袄特门", "兔比斯", "张剑闯天牙", "窝耗帅", "大白"
+            };
+
+            var rand = new Random();
+            var first = names[rand.Next(names.Length)];
+            return first + rand.Next(9999);
+        }
     }
 }