From bb2d2bae05da9eed93e13071b0f3bb9f5e058aa8 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期二, 16 四月 2019 19:52:14 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/snxxz_scripts

---
 Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA714_tagMCNPCCntList.cs                              |    1 
 System/HazyRegion/DungeonCollectItemSuccWin.cs                                                                 |  113 +++++++
 Utility/EnumHelper.cs                                                                                          |    2 
 Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs                                                            |  216 ++++++++++++++
 System/HazyRegion/DungeonCollectItemSuccWin.cs.meta                                                            |   12 
 System/Login/LoginModel.cs                                                                                     |    2 
 Utility/ConfigInitiator.cs                                                                                     |    1 
 System/HazyRegion/HazyGrassDungeonWin.cs                                                                       |  121 +++++++
 Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs.meta                                                       |   12 
 System/Dungeon/DungeonModel.cs                                                                                 |   21 +
 Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA326_tagMCNPCIDCollectionCntInfo.cs                     |    2 
 Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs                    |   27 +
 Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs.meta               |   12 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs      |   18 +
 Fight/Stage/Dungeon/DungeonStage.cs                                                                            |    4 
 Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs                              |   33 ++
 System/HazyRegion/HazyGrassModel.cs                                                                            |  116 +++++++
 System/HazyRegion/HazyRegionModel.cs                                                                           |    6 
 Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta |   12 
 Core/GameEngine/DataToCtl/PackageRegedit.cs                                                                    |    1 
 System/Dungeon/DungeonTargetBehaviour.cs                                                                       |   25 +
 System/HazyRegion/ClientHazyGrassStage.cs                                                                      |  113 +++++--
 Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs.meta                         |   12 
 23 files changed, 819 insertions(+), 63 deletions(-)

diff --git a/Core/GameEngine/DataToCtl/PackageRegedit.cs b/Core/GameEngine/DataToCtl/PackageRegedit.cs
index 0064894..d8f1c3b 100644
--- a/Core/GameEngine/DataToCtl/PackageRegedit.cs
+++ b/Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -25,6 +25,7 @@
     public static void Init()
     {
         // 鐧昏鐩稿簲鐨勬暟鎹綋鍙婂搴旂殑鏁版嵁杞�昏緫绫�
+		Register(typeof(HA718_tagMCCollectAwardItemInfo), typeof(DTCA718_tagMCCollectAwardItemInfo));
 		Register(typeof(HB214_tagMCCuntomFBPrizeInfo), typeof(DTCB214_tagMCCuntomFBPrizeInfo));
 		Register(typeof(HA307_tagMCFairyAdventuresInfo), typeof(DTCA307_tagMCFairyAdventuresInfo));
 		Register(typeof(HA306_tagMCFairyDomainInfo), typeof(DTCA306_tagMCFairyDomainInfo));
diff --git a/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs b/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs
new file mode 100644
index 0000000..b96cd7a
--- /dev/null
+++ b/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs
@@ -0,0 +1,216 @@
+锘�//--------------------------------------------------------
+//    [Author]:           Fish
+//    [  Date ]:           Tuesday, April 16, 2019
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System;
+using UnityEngine;
+
+[XLua.LuaCallCSharp]
+public partial class MapNpcRefreshConfig
+{
+
+    public readonly int id;
+	public readonly int MapID;
+	public readonly int[] NPCIDList;
+	public readonly int RefreshSeconds;
+	public readonly int RefreshPerMinutes;
+
+	public MapNpcRefreshConfig()
+    {
+    }
+
+    public MapNpcRefreshConfig(string input)
+    {
+        try
+        {
+            var tables = input.Split('\t');
+
+            int.TryParse(tables[0],out id); 
+
+			int.TryParse(tables[1],out MapID); 
+
+			string[] NPCIDListStringArray = tables[2].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			NPCIDList = new int[NPCIDListStringArray.Length];
+			for (int i=0;i<NPCIDListStringArray.Length;i++)
+			{
+				 int.TryParse(NPCIDListStringArray[i],out NPCIDList[i]);
+			}
+
+			int.TryParse(tables[3],out RefreshSeconds); 
+
+			int.TryParse(tables[4],out RefreshPerMinutes); 
+        }
+        catch (Exception ex)
+        {
+            DebugEx.Log(ex);
+        }
+    }
+
+    static Dictionary<string, MapNpcRefreshConfig> configs = new Dictionary<string, MapNpcRefreshConfig>();
+    public static MapNpcRefreshConfig Get(string id)
+    {   
+		if (!inited)
+        {
+            Debug.Log("MapNpcRefreshConfig 杩樻湭瀹屾垚鍒濆鍖栥��");
+            return null;
+        }
+		
+        if (configs.ContainsKey(id))
+        {
+            return configs[id];
+        }
+
+        MapNpcRefreshConfig config = null;
+        if (rawDatas.ContainsKey(id))
+        {
+            config = configs[id] = new MapNpcRefreshConfig(rawDatas[id]);
+            rawDatas.Remove(id);
+        }
+
+        return config;
+    }
+
+	public static MapNpcRefreshConfig Get(int id)
+    {
+        return Get(id.ToString());
+    }
+
+    public static List<string> GetKeys()
+    {
+        var keys = new List<string>();
+        keys.AddRange(configs.Keys);
+        keys.AddRange(rawDatas.Keys);
+        return keys;
+    }
+
+    public static List<MapNpcRefreshConfig> GetValues()
+    {
+        var values = new List<MapNpcRefreshConfig>();
+        values.AddRange(configs.Values);
+
+        var keys = new List<string>(rawDatas.Keys);
+        foreach (var key in keys)
+        {
+            values.Add(Get(key));
+        }
+
+        return values;
+    }
+
+	public static bool Has(string id)
+    {
+        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
+    }
+
+	public static bool Has(int id)
+    {
+        return Has(id.ToString());
+    }
+
+	public static bool inited { get; private set; }
+    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
+    public static void Init(bool sync=false)
+    {
+	    inited = false;
+		var path = string.Empty;
+        if (AssetSource.refdataFromEditor)
+        {
+            path = ResourcesPath.CONFIG_FODLER +"/MapNpcRefresh.txt";
+        }
+        else
+        {
+            path = AssetVersionUtility.GetAssetFilePath("config/MapNpcRefresh.txt");
+        }
+
+		var tempConfig = new MapNpcRefreshConfig();
+        var preParse = tempConfig is IConfigPostProcess;
+
+        if (sync)
+        {
+            var lines = File.ReadAllLines(path);
+            if (!preParse)
+            {
+                rawDatas = new Dictionary<string, string>(lines.Length - 3);
+            }
+            for (int i = 3; i < lines.Length; i++)
+            {
+				try 
+				{
+					var line = lines[i];
+					var index = line.IndexOf("\t");
+					if (index == -1)
+					{
+						continue;
+					}
+					var id = line.Substring(0, index);
+
+					if (preParse)
+					{
+						var config = new MapNpcRefreshConfig(line);
+						configs[id] = config;
+						(config as IConfigPostProcess).OnConfigParseCompleted();
+					}
+					else
+					{
+						rawDatas[id] = line;
+					}
+				}
+				catch (System.Exception ex)
+                {
+                    Debug.LogError(ex);
+                }
+            }
+			inited = true;
+        }
+        else
+        {
+            ThreadPool.QueueUserWorkItem((object _object) =>
+            {
+                var lines = File.ReadAllLines(path);
+				if (!preParse)
+				{
+					rawDatas = new Dictionary<string, string>(lines.Length - 3);
+				}
+                for (int i = 3; i < lines.Length; i++)
+                {
+					try 
+					{
+					   var line = lines[i];
+						var index = line.IndexOf("\t");
+						if (index == -1)
+						{
+							continue;
+						}
+						var id = line.Substring(0, index);
+
+						if (preParse)
+						{
+							var config = new MapNpcRefreshConfig(line);
+							configs[id] = config;
+							(config as IConfigPostProcess).OnConfigParseCompleted();
+						}
+						else
+						{
+							rawDatas[id] = line;
+						}
+					}
+					catch (System.Exception ex)
+                    {
+                        Debug.LogError(ex);
+                    }
+                }
+
+                inited = true;
+            });
+        }
+    }
+
+}
+
+
+
+
diff --git a/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs.meta b/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs.meta
new file mode 100644
index 0000000..578b545
--- /dev/null
+++ b/Core/GameEngine/Model/Config/MapNpcRefreshConfig.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a541b078663e0ee43999b0532249d30d
+timeCreated: 1555404500
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs
new file mode 100644
index 0000000..422d3bf
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// A2 34 自定义场景中获取采集奖励 #tagCMGetCustomSceneCollectAward

+

+public class CA234_tagCMGetCustomSceneCollectAward : GameNetPackBasic {

+    public uint NPCID;    //采集的NPCID

+

+    public CA234_tagCMGetCustomSceneCollectAward () {

+        combineCmd = (ushort)0x03FE;

+        _cmd = (ushort)0xA234;

+    }

+

+    public override void WriteToBytes () {

+        WriteBytes (NPCID, NetDataType.DWORD);

+    }

+

+}

diff --git a/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta
new file mode 100644
index 0000000..b1ee448
--- /dev/null
+++ b/Core/NetworkPackage/ClientPack/ClientToMapServer/CA2_Interaction/CA234_tagCMGetCustomSceneCollectAward.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f0d0635cf0a0bd64f8f4742fb964f93f
+timeCreated: 1555412785
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA326_tagMCNPCIDCollectionCntInfo.cs b/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA326_tagMCNPCIDCollectionCntInfo.cs
index 8f530b5..8563d63 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA326_tagMCNPCIDCollectionCntInfo.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA326_tagMCNPCIDCollectionCntInfo.cs
@@ -34,6 +34,8 @@
             {
                 smallBoxCollectCount += collect.CollectionCnt;
             }
+
+            ModelCenter.Instance.GetModel<DungeonModel>().UpdateDungeonCollectNpcInfo((int)collect.NPCID, collect.CollectionCnt);
         }
 
         model.bigBoxCollectCount = bigBoxCollectCount;
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA714_tagMCNPCCntList.cs b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA714_tagMCNPCCntList.cs
index 0e43729..a75b017 100644
--- a/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA714_tagMCNPCCntList.cs
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA714_tagMCNPCCntList.cs
@@ -20,6 +20,7 @@
 
         model.UpdateMonsterSurplusInfo(package);
         crossServerBossModel.UpdateMonsterSurplusInfo(package);
+        ModelCenter.Instance.GetModel<HazyGrassModel>().ReceivePackage(package);
     }
 
 }
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs
new file mode 100644
index 0000000..25e7cb9
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs
@@ -0,0 +1,27 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Tuesday, April 16, 2019
+//--------------------------------------------------------
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+public class DTCA718_tagMCCollectAwardItemInfo : DtcBasic
+{
+    public static event Action<HA718_tagMCCollectAwardItemInfo> onCollectSucc;
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        var package = vNetPack as HA718_tagMCCollectAwardItemInfo;
+
+        if (onCollectSucc != null)
+        {
+            onCollectSucc(package);
+        }
+    }
+}
+
+
+
+
diff --git a/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs.meta b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs.meta
new file mode 100644
index 0000000..bfe5a1f
--- /dev/null
+++ b/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA718_tagMCCollectAwardItemInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9d49d1b23f9edd0479798e49db5669c5
+timeCreated: 1555400708
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs b/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs
new file mode 100644
index 0000000..47106ad
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 18 采集奖励物品通知 #tagMCCollectAwardItemInfo

+

+public class HA718_tagMCCollectAwardItemInfo : GameNetPackBasic {

+    public uint CollectNPCID;    //采集的NPCID

+    public byte Count;

+    public  tagMCCollectAwardItem[] AwardItemList;    //奖励物品信息列表

+

+    public HA718_tagMCCollectAwardItemInfo () {

+        _cmd = (ushort)0xA718;

+    }

+

+    public override void ReadFromBytes (byte[] vBytes) {

+        TransBytes (out CollectNPCID, vBytes, NetDataType.DWORD);

+        TransBytes (out Count, vBytes, NetDataType.BYTE);

+        AwardItemList = new tagMCCollectAwardItem[Count];

+        for (int i = 0; i < Count; i ++) {

+            AwardItemList[i] = new tagMCCollectAwardItem();

+            TransBytes (out AwardItemList[i].ItemID, vBytes, NetDataType.DWORD);

+            TransBytes (out AwardItemList[i].Count, vBytes, NetDataType.BYTE);

+            TransBytes (out AwardItemList[i].IsAuctionItem, vBytes, NetDataType.BYTE);

+        }

+    }

+

+    public struct tagMCCollectAwardItem {

+        public uint ItemID;

+        public byte Count;

+        public byte IsAuctionItem;        //是否拍品

+    }

+

+}

diff --git a/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs.meta b/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs.meta
new file mode 100644
index 0000000..bc7621b
--- /dev/null
+++ b/Core/NetworkPackage/ServerPack/HA7_Interaction/HA718_tagMCCollectAwardItemInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5a0d77854a2576049a2d56c552b58843
+timeCreated: 1555400676
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Fight/Stage/Dungeon/DungeonStage.cs b/Fight/Stage/Dungeon/DungeonStage.cs
index ff4a707..2f67ed5 100644
--- a/Fight/Stage/Dungeon/DungeonStage.cs
+++ b/Fight/Stage/Dungeon/DungeonStage.cs
@@ -247,6 +247,10 @@
             case RidingPetBossModel.RIDINGPETBOSS_MAP:
                 WindowCenter.Instance.Open<RidingPetBossHintWin>();
                 break;
+            case HazyGrassModel.FairyGrassMapId:
+            case HazyGrassModel.ReikiGrassMapId:
+                WindowCenter.Instance.Open<DungeonCollectItemSuccWin>();
+                break;
             default:
                 WindowCenter.Instance.Open<DungeonStageTimeWin>();
                 break;
diff --git a/System/Dungeon/DungeonModel.cs b/System/Dungeon/DungeonModel.cs
index d61cf99..4fb9423 100644
--- a/System/Dungeon/DungeonModel.cs
+++ b/System/Dungeon/DungeonModel.cs
@@ -22,6 +22,7 @@
         Dictionary<int, int> mapIdToDataMapId = new Dictionary<int, int>();
         Dictionary<int, DateTime> dungeonCountRemainTimes = new Dictionary<int, DateTime>();
         Dictionary<int, List<DungeonInspireConfig>> dungeonInspireDict = new Dictionary<int, List<DungeonInspireConfig>>();
+        Dictionary<int, int> dungeonCollectNpcInfos = new Dictionary<int, int>();
         List<int> trialDungeonMapList = new List<int>();
 
         public event Action<DungeonCoolDownType> dungeonCoolDownEvent;
@@ -38,6 +39,7 @@
         public event Action<int> countRemainTimeChangeEvent;
         public event Action<Dungeon> kylinDifficultySelectedEvent;
         public event Action<DungeonFightStage> dungeonFightStageChangeEevent;
+        public event Action onCollectNpcInfoRefresh;
 
         List<Item> sweepResultRewards = new List<Item>();
         List<Item> sweepResultItems = new List<Item>();
@@ -138,6 +140,7 @@
         {
             dungeonCountRemainTimes.Clear();
             dungeonInspireCounts.Clear();
+            dungeonCollectNpcInfos.Clear();
         }
 
         public void OnAfterPlayerDataInitialize()
@@ -645,6 +648,15 @@
             }
         }
 
+        public void UpdateDungeonCollectNpcInfo(int npcId,int count)
+        {
+            dungeonCollectNpcInfos[npcId] = count;
+            if (onCollectNpcInfoRefresh != null)
+            {
+                onCollectNpcInfoRefresh();
+            }
+        }
+
         public void RequestClearEnterCD(int _mapID)
         {
             var clearpack = new CA210_tagCMClearFBCD();
@@ -747,6 +759,15 @@
             return endTime;
         }
 
+        public int GetDugneonNpcCollectCount(int npcId)
+        {
+            if (dungeonCollectNpcInfos.ContainsKey(npcId))
+            {
+                return dungeonCollectNpcInfos[npcId];
+            }
+            return 0;
+        }
+
         public void UpdateMission(string _mission)
         {
             var mapId = GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID);
diff --git a/System/Dungeon/DungeonTargetBehaviour.cs b/System/Dungeon/DungeonTargetBehaviour.cs
index 068f23d..0c0846b 100644
--- a/System/Dungeon/DungeonTargetBehaviour.cs
+++ b/System/Dungeon/DungeonTargetBehaviour.cs
@@ -31,6 +31,7 @@
         private void OnEnable()
         {
             model.updateMissionEvent += UpdateMissionEvent;
+            model.onCollectNpcInfoRefresh += UpdateMissionEvent;
         }
 
         private void UpdateMissionEvent()
@@ -51,21 +52,21 @@
                 var desc = config.targetDescription1[step < config.targetDescription1.Length ? step : 0];
                 var npcId = config.NPC1ID.Length == 0 ? 0 : config.NPC1ID[step < config.NPC1ID.Length ? step : 0];
                 var targetValue = config.targetValue1.Length == 0 ? 0 : config.targetValue1[step < config.targetValue1.Length ? step : 0];
-                GetTargetInfo(0, desc, targetValue, step, config.targetType1, npcId);
+                GetTargetInfo(0, desc, targetValue, step, config.targetType1, npcId, config.NPC1ID);
             }
             if (config.targetNum >= 2)
             {
                 var desc = config.targetDescription2[step < config.targetDescription2.Length ? step : 0];
                 var npcId = config.NPC2ID.Length == 0 ? 0 : config.NPC2ID[step < config.NPC2ID.Length ? step : 0];
                 var targetValue = config.targetValue2.Length == 0 ? 0 : config.targetValue2[step < config.targetValue2.Length ? step : 0];
-                GetTargetInfo(1, desc, targetValue, step, config.targetType2, npcId);
+                GetTargetInfo(1, desc, targetValue, step, config.targetType2, npcId, config.NPC2ID);
             }
             if (config.targetNum >= 3)
             {
                 var desc = config.targetDescription3[step < config.targetDescription2.Length ? step : 0];
                 var npcId = config.NPC3ID.Length == 0 ? 0 : config.NPC3ID[step < config.NPC3ID.Length ? step : 0];
                 var targetValue = config.targetValue3.Length == 0 ? 0 : config.targetValue3[step < config.targetValue3.Length ? step : 0];
-                GetTargetInfo(2, desc, targetValue, step, config.targetType3, npcId);
+                GetTargetInfo(2, desc, targetValue, step, config.targetType3, npcId, config.NPC3ID);
             }
 
             switch (dateMapId)
@@ -83,7 +84,7 @@
             }
         }
 
-        private void GetTargetInfo(int _index, string desc, int _targetValue, int _targetStep, int _targetType, int npcId = 0)
+        private void GetTargetInfo(int _index, string desc, int _targetValue, int _targetStep, int _targetType, int npcId, int[] npcIds)
         {
             m_TargetDescs[_index].text = desc;
             m_TargetNums[_index].text = string.Empty;
@@ -163,13 +164,27 @@
                         break;
                     }
                     m_TargetNums[_index].text = model.mission.step.ToString();
+                    break;
+                case DungeonTargetType.Collect:
+                    var collectCount = 0;
+                    for (int i = 0; i < npcIds.Length; i++)
+                    {
+                        collectCount += model.GetDugneonNpcCollectCount(npcIds[i]);
+                    }
+                    if (_targetValue > 0)
+                    {
+                        m_TargetNums[_index].text = StringUtility.Contact(collectCount, "/", _targetValue);
+                        break;
+                    }
+                    m_TargetNums[_index].text = collectCount.ToString();
                     break;
             }
         }
 
         private void OnDisable()
         {
-            model.updateMissionEvent -= UpdateMissionEvent;
+            model.updateMissionEvent -= UpdateMissionEvent;
+            model.onCollectNpcInfoRefresh -= UpdateMissionEvent;
         }
     }
 }
diff --git a/System/HazyRegion/ClientHazyGrassStage.cs b/System/HazyRegion/ClientHazyGrassStage.cs
index c675610..91a7968 100644
--- a/System/HazyRegion/ClientHazyGrassStage.cs
+++ b/System/HazyRegion/ClientHazyGrassStage.cs
@@ -12,9 +12,10 @@
     static Dictionary<Vector3, GA_NpcClientCollect> s_CollectNpcs = new Dictionary<Vector3, GA_NpcClientCollect>();
     static Dictionary<uint, Vector3> s_Sid2NpcPos = new Dictionary<uint, Vector3>();
     static Dictionary<uint, int> s_Sid2NpcIds = new Dictionary<uint, int>();
-    static List<GA_NpcClientFightNorm> s_ClientFightNpcs = new List<GA_NpcClientFightNorm>();
+    //static List<GA_NpcClientFightNorm> s_ClientFightNpcs = new List<GA_NpcClientFightNorm>();
+    static List<HazyGrassNpcInfo> s_NpcRefreshInfos = new List<HazyGrassNpcInfo>();
 
-    static int grassRefreshCount = 0;
+    static Dictionary<int, int> s_NpcRefreshTimes = new Dictionary<int, int>();
 
     bool mapLoadFinish = false;
     bool initedFightNpc = false;
@@ -31,16 +32,20 @@
         s_NpcInfos.Clear();
         s_Sid2NpcIds.Clear();
         s_Sid2NpcPos.Clear();
+        s_NpcRefreshTimes.Clear();
 
         mapLoadFinish = false;
         initedFightNpc = false;
-
-        grassRefreshCount = 0;
 
         var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId);
         if (config != null)
         {
             incidentType = (HazyRegionIncidentType)config.incidentType;
+            s_NpcRefreshInfos = model.GetGrassNpcInfos(config.dungeonId);
+            foreach (var npcInfo in s_NpcRefreshInfos)
+            {
+                s_NpcRefreshTimes.Add(npcInfo.npcId, GetNpcRefreshCount(npcInfo));
+            }
         }
 
         UnloadAllNpc();
@@ -53,7 +58,6 @@
         base.OnStageLoadFinish();
 
         mapLoadFinish = true;
-        model.RefreshGrassBornTime(TimeUtility.ServerNow);
 
         InitialPlayer();
         InitializeNpc();
@@ -67,12 +71,15 @@
 
         if (mapLoadFinish)
         {
-            var used = Mathf.Max(0, (int)(TimeUtility.ServerNow - model.grassBornTime).TotalSeconds);
-            var count = used / model.grassRefreshSeconds;
-            if (count != grassRefreshCount)
+            foreach (var npcInfo in s_NpcRefreshInfos)
             {
-                RebornCollectedNpc();
-                grassRefreshCount = count;
+                var _lastCount = s_NpcRefreshTimes[npcInfo.npcId];
+                var count = GetNpcRefreshCount(npcInfo);
+                if (_lastCount != count)
+                {
+                    RebornCollectedNpc(npcInfo.npcId);
+                    s_NpcRefreshTimes[npcInfo.npcId] = count;
+                }
             }
         }
     }
@@ -86,12 +93,24 @@
         GA_NpcClientCollect.OnCollectFinished -= OnCollectFinished;
     }
 
+    int GetNpcRefreshCount(HazyGrassNpcInfo npcInfo)
+    {
+        var used = TimeUtility.Minute * 60 + TimeUtility.Second;
+        var refreshSeconds = npcInfo.refreshMinute * 60;
+        return used / refreshSeconds;
+    }
+
     private void OnCollectFinished(uint _sid)
     {
         if (s_Sid2NpcIds.ContainsKey(_sid))
         {
             var npcId = s_Sid2NpcIds[_sid];
             Debug.Log("閲囬泦浜哊pc:--" + npcId);
+            var pak = new CA234_tagCMGetCustomSceneCollectAward();
+            pak.NPCID = (uint)npcId;
+            GameNetSystem.Instance.SendInfo(pak);
+
+            s_Sid2NpcIds.Remove(_sid);
         }
 
         if (s_Sid2NpcPos.ContainsKey(_sid))
@@ -102,6 +121,8 @@
                 s_CollectNpcs.Remove(pos);
             }
         }
+
+        RefreshMapNpcCount();
     }
 
     void InitializeNpc()
@@ -131,10 +152,14 @@
         CameraController.Instance.Apply();
     }
 
-    void RebornCollectedNpc()
+    void RebornCollectedNpc(int npcId = 0)
     {
         foreach (var npcInfo in s_NpcInfos)
         {
+            if (npcId != 0 && npcInfo.npcId != npcId)
+            {
+                continue;
+            }
             switch (npcInfo.npcType)
             {
                 case E_NpcType.Collect:
@@ -155,20 +180,38 @@
                     }
                     break;
                 case E_NpcType.Fight:
-                    if (!initedFightNpc)
-                    {
-                        var fightNpc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>((uint)npcInfo.npcId,
-                             E_ActorGroup.Enemy);
-                        if (fightNpc != null)
-                        {
-                            fightNpc.Pos = npcInfo.position;
-                            fightNpc.OnAttacked -= OnAttackNpc;
-                            fightNpc.OnAttacked += OnAttackNpc;
-                        }
-                        s_ClientFightNpcs.Add(fightNpc);
-                    }
+                    //if (!initedFightNpc)
+                    //{
+                    //    var fightNpc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>((uint)npcInfo.npcId,
+                    //         E_ActorGroup.Enemy);
+                    //    if (fightNpc != null)
+                    //    {
+                    //        fightNpc.Pos = npcInfo.position;
+                    //        fightNpc.OnAttacked -= OnAttackNpc;
+                    //        fightNpc.OnAttacked += OnAttackNpc;
+                    //    }
+                    //    s_ClientFightNpcs.Add(fightNpc);
+                    //}
                     break;
             }
+        }
+
+        RefreshMapNpcCount();
+    }
+
+    void RefreshMapNpcCount()
+    {
+        foreach (var npcInfo in s_NpcRefreshInfos)
+        {
+            var count = 0;
+            foreach (var npcId in s_Sid2NpcIds.Values)
+            {
+                if (npcId == npcInfo.npcId)
+                {
+                    count++;
+                }
+            }
+            model.RefreshMapNpcCount(npcInfo.npcId, count);
         }
     }
 
@@ -190,18 +233,18 @@
             }
         }
 
-        foreach (var _npc in s_ClientFightNpcs)
-        {
-            if (_npc != null)
-            {
-                _npc.OnAttacked -= OnAttackNpc;
-                _npc.ActorInfo.serverDie = true;
-                GAMgr.Instance.ServerDie(_npc.ServerInstID);
-                GAMgr.Instance.Release(_npc);
-            }
-        }
-
-        s_ClientFightNpcs.Clear();
+        //foreach (var _npc in s_ClientFightNpcs)
+        //{
+        //    if (_npc != null)
+        //    {
+        //        _npc.OnAttacked -= OnAttackNpc;
+        //        _npc.ActorInfo.serverDie = true;
+        //        GAMgr.Instance.ServerDie(_npc.ServerInstID);
+        //        GAMgr.Instance.Release(_npc);
+        //    }
+        //}
+        //
+        //s_ClientFightNpcs.Clear();
         s_CollectNpcs.Clear();
     }
 
diff --git a/System/HazyRegion/DungeonCollectItemSuccWin.cs b/System/HazyRegion/DungeonCollectItemSuccWin.cs
new file mode 100644
index 0000000..891d64e
--- /dev/null
+++ b/System/HazyRegion/DungeonCollectItemSuccWin.cs
@@ -0,0 +1,113 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Tuesday, April 16, 2019
+//--------------------------------------------------------
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace Snxxz.UI
+{
+
+    public class DungeonCollectItemSuccWin : Window
+    {
+        [SerializeField] Transform m_Container;
+        [SerializeField] Text m_GainRemind;
+
+        bool displaying = false;
+
+        Clock clock = null;
+
+        Queue<Item> displayItems = new Queue<Item>();
+
+        #region Built-in
+        protected override void BindController()
+        {
+        }
+
+        protected override void AddListeners()
+        {
+        }
+
+        protected override void OnPreOpen()
+        {
+            displaying = false;
+            m_Container.gameObject.SetActive(false);
+            displayItems.Clear();
+
+            DTCA718_tagMCCollectAwardItemInfo.onCollectSucc += OnCollectSucc;
+        }
+
+        protected override void OnAfterOpen()
+        {
+        }
+
+        protected override void OnPreClose()
+        {
+            DTCA718_tagMCCollectAwardItemInfo.onCollectSucc -= OnCollectSucc;
+            if (clock != null)
+            {
+                Clock.Stop(clock);
+                clock = null;
+            }
+        }
+
+        protected override void OnAfterClose()
+        {
+        }
+        #endregion
+
+        private void OnCollectSucc(HA718_tagMCCollectAwardItemInfo package)
+        {
+            for (int i = 0; i < package.Count; i++)
+            {
+                var item = new Item()
+                {
+                    id = (int)package.AwardItemList[i].ItemID,
+                    count = package.AwardItemList[i].Count,
+                };
+                displayItems.Enqueue(item);
+            }
+
+            if (!displaying)
+            {
+                DisplayCollectSucc();
+            }
+        }
+
+        void DisplayCollectSucc()
+        {
+            if (displayItems.Count > 0)
+            {
+                m_Container.gameObject.SetActive(true);
+                var item = displayItems.Dequeue();
+                var config = ItemConfig.Get(item.id);
+                if (config != null)
+                {
+                    m_GainRemind.text = string.Format("鑾峰緱{0}涓獅1}", item.count, config.ItemName);
+                }
+
+                if (clock != null)
+                {
+                    Clock.Stop(clock);
+                    clock = null;
+                }
+
+                clock = Clock.AlarmAfter(2, DisplayCollectSucc);
+            }
+            else
+            {
+                m_Container.gameObject.SetActive(false);
+                displaying = false;
+            }
+        }
+    }
+
+}
+
+
+
+
diff --git a/System/HazyRegion/DungeonCollectItemSuccWin.cs.meta b/System/HazyRegion/DungeonCollectItemSuccWin.cs.meta
new file mode 100644
index 0000000..3d9757d
--- /dev/null
+++ b/System/HazyRegion/DungeonCollectItemSuccWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 083cbd7ec1d1c4344904b08cef67dad9
+timeCreated: 1555401005
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/System/HazyRegion/HazyGrassDungeonWin.cs b/System/HazyRegion/HazyGrassDungeonWin.cs
index b038997..91518d8 100644
--- a/System/HazyRegion/HazyGrassDungeonWin.cs
+++ b/System/HazyRegion/HazyGrassDungeonWin.cs
@@ -6,6 +6,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.Text;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -15,13 +16,10 @@
     public class HazyGrassDungeonWin : Window
     {
         [SerializeField] DungeonTargetBehaviour m_DungeonTarget;
-        [SerializeField] Text m_BasicGrassCount;
-        [SerializeField] Text m_FairyGrassCount;
-        [SerializeField] Text m_BasicGrassRefreshTime;
-        [SerializeField] Text m_FairyGrassRefreshTime;
+        [SerializeField] HazyGrassCountBeha[] m_GrassCountBehas;
+        [SerializeField] Text[] m_GrassTimes;
 
-        [SerializeField] Transform m_ContainerCollectSucc;
-        [SerializeField] Text m_GainRemind;
+        float timer = 0f;
 
         DungeonModel model { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
         HazyRegionModel hazyRegionModel { get { return ModelCenter.Instance.GetModel<HazyRegionModel>(); } }
@@ -37,11 +35,13 @@
 
         protected override void OnPreOpen()
         {
-            m_ContainerCollectSucc.gameObject.SetActive(false);
-
             Display();
 
+            timer = 0f;
+            RequestGrassCount();
+
             GlobalTimeEvent.Instance.secondEvent += PerSecond;
+            hazyGrassModel.onMapNpcCountRefresh += OnMapNpcCountRefresh;
         }
 
         protected override void OnAfterOpen()
@@ -51,10 +51,22 @@
         protected override void OnPreClose()
         {
             GlobalTimeEvent.Instance.secondEvent -= PerSecond;
+            hazyGrassModel.onMapNpcCountRefresh -= OnMapNpcCountRefresh;
         }
 
         protected override void OnAfterClose()
         {
+        }
+
+        protected override void LateUpdate()
+        {
+            base.LateUpdate();
+            timer += Time.deltaTime;
+            if (timer >= 5f)
+            {
+                timer = 0f;
+                RequestGrassCount();
+            }
         }
         #endregion
 
@@ -77,19 +89,102 @@
             }
 
             DisplayGrassRefreshTime();
+            DisplayGrassCount();
         }
 
         void DisplayGrassCount()
         {
-
+            var mapId = hazyGrassModel.GetGrassMapId(hazyRegionModel.processingIncidentId);
+            var npcInfos = hazyGrassModel.GetGrassNpcInfos(mapId);
+            for (int i = 0; i < m_GrassCountBehas.Length; i++)
+            {
+                if (npcInfos != null && i < npcInfos.Count)
+                {
+                    m_GrassCountBehas[i].SetActive(true);
+                    m_GrassCountBehas[i].Display(npcInfos[i].npcId,
+                        hazyGrassModel.GetMapNpcCount(npcInfos[i].npcId));
+                }
+                else
+                {
+                    m_GrassCountBehas[i].SetActive(false);
+                }
+            }
         }
 
         void DisplayGrassRefreshTime()
         {
-            var used = Mathf.Max(0, (int)(TimeUtility.ServerNow - hazyGrassModel.grassBornTime).TotalSeconds);
-            var refreshSeconds = hazyGrassModel.grassRefreshSeconds - used % hazyGrassModel.grassRefreshSeconds;
-            m_BasicGrassRefreshTime.text = Language.Get("HazyBasicGrassRefresh", TimeUtility.SecondsToMS(refreshSeconds));
-            m_FairyGrassRefreshTime.text = Language.Get("HazyFairyGrassRefresh", TimeUtility.SecondsToMS(refreshSeconds));
+            var mapId = hazyGrassModel.GetGrassMapId(hazyRegionModel.processingIncidentId);
+            var npcInfos = hazyGrassModel.GetGrassNpcInfos(mapId);
+            for (int i = 0; i < m_GrassTimes.Length; i++)
+            {
+                if (npcInfos != null && i < npcInfos.Count)
+                {
+                    m_GrassTimes[i].gameObject.SetActive(true);
+                    var used = TimeUtility.Minute * 60 + TimeUtility.Second;
+                    var refreshSeconds = npcInfos[i].refreshMinute * 60;
+                    var seconds = refreshSeconds - used % refreshSeconds;
+                    var npcConfig = NPCConfig.Get(npcInfos[i].npcId);
+                    m_GrassTimes[i].text = string.Format("{0}{1}鍚庡埛鏂�", npcConfig.charName,
+                        TimeUtility.SecondsToMS(seconds));
+                }
+                else
+                {
+                    m_GrassTimes[i].gameObject.SetActive(false);
+                }
+            }
+        }
+
+        void RequestGrassCount()
+        {
+            if (!ClientDungeonStageUtility.isClientDungeon)
+            {
+                var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId);
+                if (config != null)
+                {
+                    var npcInfos = hazyGrassModel.GetGrassNpcInfos(config.dungeonId);
+                    if (npcInfos != null)
+                    {
+                        int[] npcs = new int[npcInfos.Count];
+                        for (int i = 0; i < npcInfos.Count; i++)
+                        {
+                            npcs[i] = npcInfos[i].npcId;
+                        }
+
+                        var pak = new CA227_tagCMQueryNPCCntInfo();
+                        pak.MapID = (uint)config.dungeonId;
+                        pak.LineID = (ushort)config.lineId;
+                        pak.NPCIDList = LitJson.JsonMapper.ToJson(npcs);
+                        pak.NPCIDListLen = (byte)pak.NPCIDList.Length;
+                        GameNetSystem.Instance.SendInfo(pak);
+                    }
+                }
+            }
+        }
+
+        private void OnMapNpcCountRefresh()
+        {
+            DisplayGrassCount();
+        }
+
+        [Serializable]
+        public class HazyGrassCountBeha
+        {
+            [SerializeField] Transform m_Container;
+            [SerializeField] Text m_Title;
+            [SerializeField] Text m_Count;
+
+            public void Display(int npcId, int count)
+            {
+                var npcConfig = NPCConfig.Get(npcId);
+                m_Title.text = string.Format("鍓╀綑{0}鏁伴噺锛�", npcConfig.charName);
+                m_Count.text = count.ToString();
+                m_Count.color = UIHelper.GetUIColor(count > 0 ? TextColType.Green : TextColType.Red);
+            }
+
+            public void SetActive(bool active)
+            {
+                m_Container.gameObject.SetActive(active);
+            }
         }
     }
 
diff --git a/System/HazyRegion/HazyGrassModel.cs b/System/HazyRegion/HazyGrassModel.cs
index 5f0f6be..03e89df 100644
--- a/System/HazyRegion/HazyGrassModel.cs
+++ b/System/HazyRegion/HazyGrassModel.cs
@@ -6,6 +6,9 @@
 {
     public class HazyGrassModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk
     {
+        Dictionary<int, List<HazyGrassNpcInfo>> mapNpcs = new Dictionary<int, List<HazyGrassNpcInfo>>();
+        Dictionary<int, int> m_MapNpcCount = new Dictionary<int, int>();
+
         public const int ReikiGrassMapId = 32040;
         public const int FairyGrassMapId = 32050;
         public const int Client_ReikiGrassMapID = 3240;
@@ -13,11 +16,10 @@
 
         public bool IsInDungeon { get; private set; }
 
-        public int grassRefreshSeconds { get; private set; }
-
-        public DateTime grassBornTime { get; private set; }
+        public event Action onMapNpcCountRefresh;
 
         HazyRegionModel hazyRegionModel { get { return ModelCenter.Instance.GetModel<HazyRegionModel>(); } }
+        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
 
         public override void Init()
         {
@@ -41,12 +43,35 @@
 
         void ParseConfig()
         {
-            grassRefreshSeconds = 20;
+            var mapNpcConfigs = MapNpcRefreshConfig.GetValues();
+            foreach (var config in mapNpcConfigs)
+            {
+                if (config.MapID == ReikiGrassMapId
+                    || config.MapID == FairyGrassMapId)
+                {
+                    List<HazyGrassNpcInfo> _npcs = null;
+                    if (!mapNpcs.TryGetValue(config.MapID, out _npcs))
+                    {
+                        _npcs = new List<HazyGrassNpcInfo>();
+                        mapNpcs.Add(config.MapID, _npcs);
+                    }
+                    for (int i = 0; i < config.NPCIDList.Length; i++)
+                    {
+                        _npcs.Add(new HazyGrassNpcInfo()
+                        {
+                            npcId = config.NPCIDList[i],
+                            refreshMinute = config.RefreshPerMinutes,
+                        });
+                    }
+                }
+            }
         }
 
         private void OnStageLoadFinish()
         {
             var mapId = PlayerDatas.Instance.baseData.MapID;
+
+            m_MapNpcCount.Clear();
 
             IsInDungeon = false;
             if (IsInGrassDungeon(mapId))
@@ -89,14 +114,83 @@
             return 0;
         }
 
-        public void RefreshGrassBornTime()
+        public int GetGrassMapId(int incidentId)
         {
-
+            var config = HazyRegionConfig.Get(incidentId);
+            if (config != null)
+            {
+                return config.dungeonId;
+            }
+            return 0;
         }
 
-        public void RefreshGrassBornTime(DateTime _time)
+        public List<HazyGrassNpcInfo> GetGrassNpcInfos(int mapId)
         {
-            grassBornTime = _time;
+            if (mapNpcs.ContainsKey(mapId))
+            {
+                return mapNpcs[mapId];
+            }
+            return null;
+        }
+
+        public int GetMapNpcCount(int npcId)
+        {
+            if (m_MapNpcCount.ContainsKey(npcId))
+            {
+                return m_MapNpcCount[npcId];
+            }
+            return 0;
+        }
+
+        public bool CanCollectClientNpc(int npcId)
+        {
+            if (ClientDungeonStageUtility.isClientDungeon
+                && ClientDungeonStageUtility.clientMapId == Client_ReikiGrassMapID)
+            {
+                var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId);
+                if (config != null)
+                {
+                    var collectCount = dungeonModel.GetDugneonNpcCollectCount(npcId);
+                    var hintId = dungeonModel.GetDungeonHintId(config.dungeonId, config.lineId);
+                    var hintConfig = DungeonHintConfig.Get(hintId);
+                    if (hintConfig.NPC1ID.Length > 0 && hintConfig.NPC1ID[0] == npcId)
+                    {
+                        return collectCount < hintConfig.targetValue1[0];
+                    }
+                    else if (hintConfig.NPC2ID.Length > 0 && hintConfig.NPC2ID[0] == npcId)
+                    {
+                        return collectCount < hintConfig.targetValue2[0];
+                    }
+                }
+            }
+            return true;
+        }
+
+        public void ReceivePackage(HA714_tagMCNPCCntList package)
+        {
+            if (package.MapID != ReikiGrassMapId
+                && package.MapID != FairyGrassMapId)
+            {
+                return;
+            }
+            for (int i = 0; i < package.NPCInfoCnt; i++)
+            {
+                var data = package.NPCInfoList[i];
+                m_MapNpcCount[(int)data.NPCID] = (int)data.Cnt;
+            }
+            if (onMapNpcCountRefresh != null)
+            {
+                onMapNpcCountRefresh();
+            }
+        }
+
+        public void RefreshMapNpcCount(int npcId, int count)
+        {
+            m_MapNpcCount[npcId] = count;
+            if (onMapNpcCountRefresh != null)
+            {
+                onMapNpcCountRefresh();
+            }
         }
 
         public void RequestEnterClientDungeon()
@@ -145,5 +239,11 @@
             });
         }
     }
+
+    public struct HazyGrassNpcInfo
+    {
+        public int npcId;
+        public int refreshMinute;
+    }
 }
 
diff --git a/System/HazyRegion/HazyRegionModel.cs b/System/HazyRegion/HazyRegionModel.cs
index 32139dd..93de794 100644
--- a/System/HazyRegion/HazyRegionModel.cs
+++ b/System/HazyRegion/HazyRegionModel.cs
@@ -40,7 +40,11 @@
 
         public bool InFakeHazyRegion
         {
-            get { return hazyRegionOpenTimes <= fakeOpenTimes; }
+            get
+            {
+                return hazyRegionOpenTimes <= fakeOpenTimes
+                  || !FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HazyRegion);
+            }
         }
 
         int cacheMapId = 0;
diff --git a/System/Login/LoginModel.cs b/System/Login/LoginModel.cs
index 40bc42a..f6eeb30 100644
--- a/System/Login/LoginModel.cs
+++ b/System/Login/LoginModel.cs
@@ -299,7 +299,7 @@
                     send.Extra = "";
                     break;
                 case VersionAuthority.Release:
-                    send.Extra = VersionConfig.Get().SpID;
+                    send.Extra = VersionConfig.Get().SpID + "|" + SDKUtility.Instance.Device.imei;
                     send.ExtraLen = (byte)send.Extra.Length;
                     if (SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Free)
                     {
diff --git a/Utility/ConfigInitiator.cs b/Utility/ConfigInitiator.cs
index a8239f1..05b287b 100644
--- a/Utility/ConfigInitiator.cs
+++ b/Utility/ConfigInitiator.cs
@@ -291,6 +291,7 @@
         normalTasks.Add(new ConfigInitTask("ReikiRootConfig", () => { ReikiRootConfig.Init(); }, () => { return ReikiRootConfig.inited; }));
         normalTasks.Add(new ConfigInitTask("HazyRegionConfig", () => { HazyRegionConfig.Init(); }, () => { return HazyRegionConfig.inited; }));
         normalTasks.Add(new ConfigInitTask("AdventureDialogueConfig", () => { AdventureDialogueConfig.Init(); }, () => { return AdventureDialogueConfig.inited; }));
+        normalTasks.Add(new ConfigInitTask("MapNpcRefreshConfig", () => { MapNpcRefreshConfig.Init(); }, () => { return MapNpcRefreshConfig.inited; }));
     }
 
     static List<ConfigInitTask> doingTasks = new List<ConfigInitTask>();
diff --git a/Utility/EnumHelper.cs b/Utility/EnumHelper.cs
index 596b861..bbe779c 100644
--- a/Utility/EnumHelper.cs
+++ b/Utility/EnumHelper.cs
@@ -698,6 +698,7 @@
     ReikiRoot = 145,//鐏垫牴
     CrossServer = 157, //璺ㄦ湇澶╂璧�
     CrossServerBoss = 162,
+    HazyRegion = 173,//缂ョ紙浠欏煙
 }
 //灞炴�х被鍨�
 public enum PropertyType
@@ -1185,6 +1186,7 @@
     NPCDialogue = 8,    //npc瀵硅瘽
     VictorySumCnt = 9, //锛堜粰榄旇儨鍒╂�诲満鏁帮級
     StageVictoryCnt = 10, //锛堥樁娈佃儨鍒╁満鏁帮級
+    Collect,
 }
 
 public enum AchievementType

--
Gitblit v1.8.0