public override bool TakeAction() { InstanceProgressLogic ip = new InstanceProgressLogic(); ip.SetUser(m_UserId); if (!(ip.GetInstanceProgress()).ContainsKey(m_RequestPacket.InstanceId)) { ErrorCode = (int)ErrorType.RequireNotMet; ErrorInfo = "You have not passed this instance"; return(false); } PlayerInstanceLogic pi = new PlayerInstanceLogic(); pi.SetUser(m_UserId); CacheDictionary <int, int> dropItems = new CacheDictionary <int, int>(); for (int i = 0; i < m_RequestPacket.Count; i++) { PBInstanceDrop instanceDrop = new PBInstanceDrop(); List <PBDropInfo> dropList = new List <PBDropInfo>(); List <PBDropInfo> dropPack; var dropDict = pi.GenerateDropList(m_RequestPacket.InstanceId, true, out dropPack); GameUtils.MergeItemDict(dropItems, dropDict); foreach (var dropItem in dropDict) { PBDropInfo item = new PBDropInfo() { DropId = dropItem.Key, DropCount = dropItem.Value }; instanceDrop.Items.Add(item); } m_ResponsePacket.Drops.Add(instanceDrop); } PlayerPackageLogic pp = new PlayerPackageLogic(); pp.SetUser(m_UserId); if (!pp.CheckPackageSlot(dropItems)) { ErrorCode = (int)ErrorType.PackageSlotFull; ErrorInfo = "Package full"; return(false); } PlayerLogic p = new PlayerLogic(); p.SetUser(m_UserId); int energy = PlayerInstanceLogic.GetInstanceEnergy(m_RequestPacket.InstanceId); long nextRecoverTime; if (!p.DeductEnergy(energy * m_RequestPacket.Count, out nextRecoverTime)) { ErrorCode = (int)ErrorType.RequireNotMet; ErrorInfo = "You have not enough energy"; return(false); } PBReceivedItems receivedItems; pp.GetItems(dropItems, ReceiveItemMethodType.CompleteInstance, out receivedItems); m_ResponsePacket.ReceivedItems = receivedItems; DTInstance instanceData = PlayerInstanceLogic.GetInstanceData(m_RequestPacket.InstanceId); p.AddCoin(instanceData.Coin * m_RequestPacket.Count); p.AddExp(instanceData.PlayerExp * m_RequestPacket.Count); m_ResponsePacket.Count = m_RequestPacket.Count; m_ResponsePacket.InstanceId = m_RequestPacket.InstanceId; m_ResponsePacket.PlayerInfo = new PBPlayerInfo() { Id = m_UserId, Coin = p.MyPlayer.Coin, Exp = p.MyPlayer.Exp, Level = p.MyPlayer.Level, Energy = p.MyPlayer.Energy, NextEnergyRecoveryTime = nextRecoverTime }; HeroTeamLogic heroTeam = new HeroTeamLogic(); heroTeam.SetUser(m_UserId); PlayerHeroLogic playerHero = new PlayerHeroLogic(); playerHero.SetUser(m_UserId); foreach (int heroId in heroTeam.MyHeroTeam.Team) { if (heroId == 0) { continue; } //playerHero.SetHero(heroId).AddExp(instanceData.HeroExp); m_ResponsePacket.LobbyHeroInfo.Add(new PBLobbyHeroInfo() { Type = heroId, Exp = playerHero.MyHeros.Heros[heroId].HeroExp, Level = playerHero.MyHeros.Heros[heroId].HeroLv }); } PlayerDailyQuestLogic.GetInstance(m_UserId).UpdateDailyQuest(DailyQuestType.CleanOutInstance, m_RequestPacket.Count); return(true); }