public void EnterMission(int missionID, int difficulty)
        {
            var missionData = LocalServerResManager.MissionDataMap.FirstOrDefault(t => t.Value.mission == missionID && t.Value.difficulty == difficulty);

            if (missionData.Value == null)
            {
                return;
            }

            ClearSceneData();
            LocalServerResManager.ResetSpaceData(missionData.Value);
            ConstructEventData(missionData.Value.events);
            ConstructMissionTargetData(missionData.Value.target);
            ConstructEntityData(difficulty);
            ConstructContainerData(missionData.Value.drop);
            EnterResetAvatarData(missionData.Value.reviveTimes);
            sceneId = LocalServerResManager.GetSceneId(missionID, difficulty);
        }
        protected void ConstructMonsterData(int difficulty)
        {
            foreach (var item in LocalServerResManager.SpaceDataMap)
            {
                var spaceData = item.Value;
                if (spaceData.type != SpaceType.SpawnPoint.ToString())
                {
                    continue;
                }

                if (spaceData.levelID.Count < difficulty)
                {
                    continue;
                }

                int levelID = spaceData.levelID[difficulty - 1];
                if (!LocalServerResManager.SpawnPointLevelDataMap.ContainsKey(levelID))
                {
                    continue;
                }

                List <int> monsterIDs  = LocalServerResManager.SpawnPointLevelDataMap[levelID].monsterId;
                List <int> monsterNums = LocalServerResManager.SpawnPointLevelDataMap[levelID].monsterNumber;

                if (monsterIDs.Count != monsterNums.Count)
                {
                    continue;
                }

                if (item.Value.monsterSpawntPoint.Count % 2 != 0)
                {
                    continue;
                }

                List <KeyValuePair <int, int> > place = new List <KeyValuePair <int, int> >();
                for (int i = 0; i < item.Value.monsterSpawntPoint.Count; i += 2)
                {
                    KeyValuePair <int, int> coordinate = new KeyValuePair <int, int>(item.Value.monsterSpawntPoint[i], item.Value.monsterSpawntPoint[i + 1]);
                    place.Add(coordinate);
                }

                if (!localServerSpawnPoint.ContainsKey(item.Key))
                {
                    localServerSpawnPoint.Add(item.Key, new SpawnPoint(item.Key, item.Value.triggerType));
                }

                if (!localServerMonster.ContainsKey(item.Key))
                {
                    localServerMonster.Add(item.Key, new Dictionary <uint, LocalServerEntity>());
                }

                if (!localServerTokenTemplete.ContainsKey(item.Key))
                {
                    localServerTokenTemplete.Add(item.Key, new List <LocalServerEntity>());
                }

                int monsterCount = 0;
                for (int i = 0; i < monsterIDs.Count; i++)
                {
                    for (int j = 0; j < monsterNums[i]; j++)
                    {
                        if (monsterCount < place.Count)
                        {
                            LocalServerDummy dummy = new LocalServerDummy();
                            dummy.ID           = getNextEntityId();
                            dummy.spawnPointID = item.Key;
                            dummy.monsterID    = monsterIDs[i];
                            dummy.state        = MonsterState.sleep;
                            dummy.x            = place[monsterCount].Key;
                            dummy.y            = place[monsterCount].Value;
                            dummy.exp          = LocalServerResManager.GetMonsterData(dummy.monsterID).exp;

                            monsterCount++;

                            if (!localServerEntity.ContainsKey(dummy.ID) &&
                                !localServerMonster[item.Key].ContainsKey(dummy.ID))
                            {
                                localServerEntity.Add(dummy.ID, dummy);
                                localServerMonster[item.Key].Add(dummy.ID, dummy);
                                localServerTokenTemplete[item.Key].Add(dummy);
                            }
                            //else
                            //{
                            //    dummy.state = MonsterState.invalid;
                            //    dummy.x = 0;
                            //    dummy.x = 0;
                            //}
                        }
                        //else
                        //{
                        //}
                    }
                }
            }
        }
        public void MissionReq(byte handleCode, ushort arg1, ushort arg2, string arg3)
        {
            switch (handleCode)
            {
            case (byte)MissionHandleCode.ENTER_MISSION:
                EnterMission((int)arg1, (int)arg2);
                break;

            case (byte)MissionHandleCode.START_MISSION:
                List <int> pos = LocalServerResManager.GetEnterXY(sceneId);
                if (pos.Count == 0)
                {
                    LoggerHelper.Error(string.Format("sceneId {0} is enter xy is error", sceneId));
                    return;
                }
                var info = new Mogo.RPC.CellAttachedInfo();
                info.x = (short)pos[0];
                info.y = (short)pos[1];
                MogoWorld.thePlayer.SetEntityCellInfo(info);
                MogoWorld.thePlayer.UpdatePosition();

                CheckSpawnPointDefaultSpawn();
                break;

            case (byte)MissionHandleCode.EXIT_MISSION:
                ServerProxy.SomeToLocal = false;
                ExitMission();
                MogoWorld.thePlayer.RpcCall("MissionReq", (byte)MissionHandleCode.EXIT_MISSION, (ushort)1, (ushort)1, String.Empty);
                break;

            case (byte)MissionHandleCode.QUIT_MISSION:
                ServerProxy.SomeToLocal = false;
                ExitMission();
                MogoWorld.thePlayer.RpcCall("MissionReq", (byte)MissionHandleCode.QUIT_MISSION, (ushort)1, (ushort)1, String.Empty);
                break;

            case (byte)MissionHandleCode.GO_TO_INIT_MAP:
                ServerProxy.SomeToLocal = false;
                ExitMission();
                MogoWorld.thePlayer.RpcCall("MissionReq", (byte)MissionHandleCode.GO_TO_INIT_MAP, (ushort)1, (ushort)1, String.Empty);
                break;

            case (byte)MissionHandleCode.SPAWNPOINT_START:
                TriggerSpawnPoint((int)arg1);
                break;

            case (byte)MissionHandleCode.CREATE_CLIENT_DROP:
                CreateClientDrop(arg1, arg3);
                break;

            case (byte)MissionHandleCode.GET_REVIVE_TIMES:
                LoggerHelper.Debug("GET_REVIVE_TIMES");
                NotifyReviveTime();
                break;

            case (byte)MissionHandleCode.REVIVE:
                LoggerHelper.Debug("REVIVE");
                AvatarRevive();
                break;

            case (byte)MissionHandleCode.UPLOAD_COMBO:
                SetCombo(arg1);
                NotifyClientMissionWon();
                break;

            case (byte)MissionHandleCode.GET_MISSION_REWARDS:
                ServerProxy.SomeToLocal = false;
                SendClientMissionMessage();
                GetMissionReward();
                break;
            }
        }