/// <summary> // 玩家离开恶魔堡垒 /// </summary> static public void LeaveDaimonSquareScene(GameClient client) { if (!Global.IsDaimonSquareSceneID(client.ClientData.MapCode)) { return; } DaimonSquareScene bcTmp = GetDaimonSquareListScenes(client.ClientData.MapCode); if (bcTmp == null) { return; } --bcTmp.m_nPlarerCount; // 离开时 保存积分 Global.SaveRoleParamsInt32ValueToDB(client, RoleParamName.DaimonSquarePlayerPoint, client.ClientData.DaimonSquarePoint, true); // 看看要不要给奖励 //GiveAwardDaimonSquareScene(client); client.ClientData.bIsInDaimonSquareMap = false; return; }
/// <summary> /// 添加一个场景 /// </summary> static public void AddDaimonSquareListScenes(int nMap, DaimonSquareScene bcScene) { lock (m_DaimonSquareListScenes) { m_DaimonSquareListScenes.Add(nMap, bcScene); } }
/// <summary> // 完成恶魔广场 /// </summary> static public void CompleteDaimonSquareScene(GameClient client, DaimonSquareScene bsInfo, DaimonSquareDataInfo dsData) { int nFlag = Global.GetRoleParamsInt32FromDB(client, RoleParamName.DaimonSquareSceneFinishFlag); if (nFlag != 1) { // 保存完成状态 Global.SaveRoleParamsInt32ValueToDB(client, RoleParamName.DaimonSquareSceneFinishFlag, 1, true); // 剩余时间奖励 long nTimer = bsInfo.m_lEndTime - bsInfo.m_lBeginTime; long nRemain = ((dsData.DurationTime * 1000) - nTimer) / 1000; Global.SaveRoleParamsInt32ValueToDB(client, RoleParamName.DaimonSquareSceneTimer, (int)nRemain, true); } }
/// <summary> /// 加载恶魔广场场景到管理器 /// </summary> static public void LoadDaimonSquareListScenes() { int[] nArray = GameManager.systemParamsList.GetParamValueIntArrayByName("DemonMapCodeIds"); for (int i = 0; i < nArray.Length; ++i) { DaimonSquareScene tmpMap = new DaimonSquareScene(); tmpMap.CleanAllInfo(); tmpMap.m_nMapCode = nArray[i]; AddDaimonSquareListScenes(nArray[i], tmpMap); } // 向DB请求最高积分信息 Global.QueryDayActivityTotalPointInfoToDB(SpecialActivityTypes.DemoSque); m_nPushMsgDayID = Global.SafeConvertToInt32(GameManager.GameConfigMgr.GetGameConifgItem(GameConfigNames.DemoSquarePushMsgDayID)); }
/// <summary> // 杀怪接口 /// </summary> static public void DaimonSquareSceneKillMonster(GameClient client, Monster monster) { DaimonSquareDataInfo bcDataTmp = null; if (!Data.DaimonSquareDataInfoList.TryGetValue(client.ClientData.MapCode, out bcDataTmp)) //bcDataTmp = Data.DaimonSquareDataInfoList[client.ClientData.MapCode]; { return; } DaimonSquareScene bcTmp = null; bcTmp = m_DaimonSquareListScenes[client.ClientData.MapCode]; if (bcTmp == null || bcDataTmp == null) { return; } if (bcTmp.m_bEndFlag == true) { return; } Interlocked.Increment(ref bcTmp.m_nKillMonsterNum); //System.Console.WriteLine("liaowei是帅哥 恶魔广场{0}里 杀了{1}只怪了!!!", client.ClientData.MapCode, bcTmp.m_nKillMonsterNum); int nKillMonsterTotalNum = Interlocked.Increment(ref bcTmp.m_nKillMonsterTotalNum); client.ClientData.DaimonSquarePoint += monster.MonsterInfo.DaimonSquareJiFen; if (bcTmp.m_nCreateMonsterFlag == 1 && bcTmp.m_nKillMonsterNum == bcTmp.m_nNeedKillMonsterNum) { bcTmp.m_nCreateMonsterFlag = 0; // 重新计数 bcTmp.m_nNeedKillMonsterNum = 0; bcTmp.m_nKillMonsterNum = 0; bcTmp.m_nCreateMonsterCount = 0; } // 如果杀光了所有的怪 就胜利了 if (nKillMonsterTotalNum == bcDataTmp.MonsterSum) { bcTmp.m_eStatus = DaimonSquareStatus.FIGHT_STATUS_END; bcTmp.m_lEndTime = DateTime.Now.Ticks / 10000; CompleteDaimonSquareScene(client, bcTmp, bcDataTmp); bcTmp.m_bIsFinishTask = true; } // 恶魔广场怪物波和人物得分信息 //GameManager.ClientMgr.NotifyDaimonSquareMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcDataTmp.MapCode, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUAREMONSTERWAVEANDPOINTRINFO, // 0, 0, bcDataTmp.MonsterID.Length - bcTmp.m_nMonsterWave, client.ClientData.DaimonSquarePoint, 0); string strcmd = string.Format("{0}:{1}", bcDataTmp.MonsterID.Length - bcTmp.m_nMonsterWave, client.ClientData.DaimonSquarePoint); GameManager.ClientMgr.SendToClient(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, strcmd, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUAREMONSTERWAVEANDPOINTRINFO); //string strcmd = string.Format("{0}:{1}", bcDataTmp.MonsterID.Length - bcTmp.m_nMonsterWave, client.ClientData.DaimonSquarePoint); //GameManager.ClientMgr.SendToClient(client, strcmd, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUAREMONSTERWAVEANDPOINTRINFO); }
/// <summary> // 刷怪接口 /// </summary> static public void DaimonSquareSceneCreateMonster(DaimonSquareScene bcTmp, DaimonSquareDataInfo bcDataTmp) { if (bcTmp.m_nMonsterWave >= bcTmp.m_nMonsterTotalWave) { return; } // 置刷怪标记 bcTmp.m_nCreateMonsterFlag = 1; string sMonsterNum = null; string sMonsterID = null; string sNeedSkillMonster = null; sMonsterNum = bcDataTmp.MonsterNum[bcTmp.m_nMonsterWave]; sMonsterID = bcDataTmp.MonsterID[bcTmp.m_nMonsterWave]; sNeedSkillMonster = bcDataTmp.CreateNextWaveMonsterCondition[bcTmp.m_nMonsterWave]; if (sMonsterID == null || sMonsterNum == null || sNeedSkillMonster == null) { return; } string[] sNum = null; string[] sID = null; string[] sRate = null; sNum = sMonsterNum.Split(','); sID = sMonsterID.Split(','); sRate = sNeedSkillMonster.Split(','); if (sNum.Length != sID.Length) { return; } GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(bcDataTmp.MapCode, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("恶魔广场报错 地图配置 ID = {0}", bcDataTmp.MapCode)); return; } int gridX = gameMap.CorrectWidthPointToGridPoint(bcDataTmp.posX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(bcDataTmp.posZ) / gameMap.MapGridHeight; int gridNum = gameMap.CorrectWidthPointToGridPoint(bcDataTmp.Radius); for (int i = 0; i < sNum.Length; ++i) { int nNum = Global.SafeConvertToInt32(sNum[i]); int nID = Global.SafeConvertToInt32(sID[i]); //System.Console.WriteLine("liaowei是帅哥 恶魔广场 i = {0}",i); for (int j = 0; j < nNum; ++j) { GameManager.MonsterZoneMgr.AddDynamicMonsters(bcTmp.m_nMapCode, nID, -1, 1, gridX, gridY, gridNum); //System.Console.WriteLine("liaowei是帅哥 恶魔广场 j = {0}", j); ++bcTmp.m_nCreateMonsterCount; } } // 计数要杀死怪的数量 bcTmp.m_nNeedKillMonsterNum = bcTmp.m_nCreateMonsterCount * Global.SafeConvertToInt32(sRate[0]) / 100; // 递增刷怪波数 ++bcTmp.m_nMonsterWave; //System.Console.WriteLine("liaowei是帅哥 恶魔广场第{0}波 {1}只!!!", bcTmp.m_nMonsterWave, bcTmp.m_nCreateMonsterCount); // 恶魔广场怪物波和人物得分信息 GameManager.ClientMgr.NotifyDaimonSquareMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcDataTmp.MapCode, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUAREMONSTERWAVEANDPOINTRINFO, 0, 0, bcDataTmp.MonsterID.Length - bcTmp.m_nMonsterWave, -100, 0); // 只更新波数 //System.Console.WriteLine("liaowei是帅哥 恶魔广场{0}里 刷第{1}波怪了 一共{3}只!!!", bcTmp.m_nMapCode, bcTmp.m_nMonsterWave, bcTmp.m_nCreateMonsterCount); return; }
/// <summary> // 给奖励 /// </summary> static public void GiveAwardDaimonSquareScene(GameClient client) { DaimonSquareDataInfo bcDataTmp = Data.DaimonSquareDataInfoList[client.ClientData.MapCode]; DaimonSquareScene bcTmp = GetDaimonSquareListScenes(client.ClientData.MapCode); if (bcTmp == null || bcDataTmp == null) { return; } if (bcTmp.m_bIsFinishTask == true) { string[] sItem = bcDataTmp.AwardItem; if (null != sItem && sItem.Length > 0) { for (int i = 0; i < sItem.Length; i++) { if (string.IsNullOrEmpty(sItem[i].Trim())) { continue; } string[] sFields = sItem[i].Split(','); if (string.IsNullOrEmpty(sFields[i].Trim())) { continue; } int nGoodsID = Convert.ToInt32(sFields[0].Trim()); int nGoodsNum = Convert.ToInt32(sFields[1].Trim()); GoodsData goodsData = new GoodsData() { Id = -1, GoodsID = nGoodsID, Using = 0, Forge_level = 0, Starttime = "1900-01-01 12:00:00", Endtime = Global.ConstGoodsEndTime, Site = 0, Quality = (int)GoodsQuality.White, Props = "", GCount = nGoodsNum, Binding = 0, Jewellist = "", BagIndex = 0, AddPropIndex = 0, BornIndex = 0, Lucky = 0, Strong = 0, ExcellenceInfo = 0, AppendPropLev = 0, ChangeLifeLevForEquip = 0, }; string sMsg = "恶魔广场--统一奖励"; if (!Global.CanAddGoodsNum(client, nGoodsNum)) { for (int j = 0; j < nGoodsNum; ++j) { Global.UseMailGivePlayerAward(client, goodsData, "恶魔广场", sMsg); } } else { Global.AddGoodsDBCommand(Global._TCPManager.TcpOutPacketPool, client, nGoodsID, nGoodsNum, goodsData.Quality, "", goodsData.Forge_level, goodsData.Binding, 0, "", true, 1, sMsg, goodsData.Endtime); } } } } // 根据积分以及公式给奖励(经验) if (client.ClientData.DaimonSquarePoint > 0) { // 公式 int nExp = client.ClientData.DaimonSquarePoint * bcDataTmp.ExpModulus; int nMoney = client.ClientData.DaimonSquarePoint * bcDataTmp.MoneyModulus; if (nExp > 0) { GameManager.ClientMgr.ProcessRoleExperience(client, nExp, false); } if (nMoney > 0) { GameManager.ClientMgr.AddMoney1(Global._TCPManager.MySocketListener, Global._TCPManager.tcpClientPool, Global._TCPManager.TcpOutPacketPool, client, nMoney, "恶魔广场奖励一", false); } //GameManager.ClientMgr.AddUserYinLiang(Global._TCPManager.MySocketListener, Global._TCPManager.tcpClientPool, Global._TCPManager.TcpOutPacketPool, client, nMoney); // 存盘 if (client.ClientData.DaimonSquarePoint > client.ClientData.DaimonSquarePointTotalPoint) { client.ClientData.DaimonSquarePointTotalPoint = client.ClientData.DaimonSquarePoint; } if (client.ClientData.DaimonSquarePoint > m_nDaimonSquareMaxPoint) { SetTotalPointInfo(client.ClientData.RoleName, client.ClientData.DaimonSquarePoint); } // 清空 client.ClientData.DaimonSquarePoint = 0; } return; }
/// <summary> // 心跳处理 /// </summary> static public void HeartBeatDaimonSquareScene() { foreach (var DaimonSquareScenes in m_DaimonSquareListScenes) { DaimonSquareDataInfo bcDataTmp = Data.DaimonSquareDataInfoList[DaimonSquareScenes.Key]; DaimonSquareScene bcTmp = GetDaimonSquareListScenes(DaimonSquareScenes.Key); if (bcTmp == null || bcDataTmp == null) { continue; } int nRoleNum = 0; nRoleNum = GameManager.ClientMgr.GetMapClientsCount(bcTmp.m_nMapCode); if (nRoleNum <= 0) { if (bcTmp.m_eStatus == DaimonSquareStatus.FIGHT_STATUS_BEGIN) { // 做清空处理 比如 所有动态刷出的怪 都delete掉 CleanDaimonSquareScene(bcTmp.m_nMapCode); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = DaimonSquareScenes.Key; } //continue; } // 当前tick long ticks = DateTime.Now.Ticks / 10000; if (bcTmp.m_eStatus == DaimonSquareStatus.FIGHT_STATUS_NULL) { bool bPushMsg = false; if (Global.CanEnterDaimonSquareOnTime(bcDataTmp.BeginTime, 0)) { // 场景开启 bcTmp.m_eStatus = DaimonSquareStatus.FIGHT_STATUS_PREPARE; bcTmp.m_lPrepareTime = DateTime.Now.Ticks / 10000; bcTmp.m_nMonsterTotalWave = bcDataTmp.MonsterID.Length; // 消息推送 if (bPushMsg) { int nNow = DateTime.Now.DayOfYear; if (bPushMsg && m_nPushMsgDayID != nNow) { //Global.DayActivityTiggerPushMessage((int)SpecialActivityTypes.DemoSque); Global.UpdateDBGameConfigg(GameConfigNames.DemoSquarePushMsgDayID, nNow.ToString()); m_nPushMsgDayID = nNow; } } } } else if (bcTmp.m_eStatus == DaimonSquareStatus.FIGHT_STATUS_PREPARE) { if (ticks >= (bcTmp.m_lPrepareTime + (bcDataTmp.PrepareTime * 1000))) { // 准备战斗 bcTmp.m_eStatus = DaimonSquareStatus.FIGHT_STATUS_BEGIN; bcTmp.m_lBeginTime = DateTime.Now.Ticks / 10000; int nTimer = (int)((bcDataTmp.DurationTime * 1000 - (ticks - bcTmp.m_lBeginTime)) / 1000); GameManager.ClientMgr.NotifyDaimonSquareMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, DaimonSquareScenes.Key, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUARETIMERINFO, (int)DaimonSquareStatus.FIGHT_STATUS_BEGIN, nTimer, 0, 0, 0); // 战斗结束倒计时 } } else if (bcTmp.m_eStatus == DaimonSquareStatus.FIGHT_STATUS_BEGIN) { // 开始战斗 -- 刷怪 if (bcTmp.m_nCreateMonsterFlag == 0 && bcTmp.m_nMonsterWave < bcTmp.m_nMonsterTotalWave) { DaimonSquareSceneCreateMonster(bcTmp, bcDataTmp); } if (ticks >= (bcTmp.m_lBeginTime + (bcDataTmp.DurationTime * 1000)) || bcTmp.m_nKillMonsterTotalNum == bcDataTmp.MonsterSum) { bcTmp.m_eStatus = DaimonSquareStatus.FIGHT_STATUS_END; bcTmp.m_lEndTime = DateTime.Now.Ticks / 10000; } } else if (bcTmp.m_eStatus == DaimonSquareStatus.FIGHT_STATUS_END) { // 战斗结束 int nTimer = (int)((bcDataTmp.LeaveTime * 1000 - (ticks - bcTmp.m_lEndTime)) / 1000); if (bcTmp.m_bEndFlag == false) { GameManager.ClientMgr.NotifyDaimonSquareMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, DaimonSquareScenes.Key, (int)TCPGameServerCmds.CMD_SPR_QUERYDAIMONSQUARETIMERINFO, (int)DaimonSquareStatus.FIGHT_STATUS_END, nTimer, 0, 0, 0); // 剩余时间奖励 long nTimeInfo = 0; nTimeInfo = bcTmp.m_lEndTime - bcTmp.m_lBeginTime; long nRemain = 0; nRemain = ((bcDataTmp.DurationTime * 1000) - nTimeInfo) / 1000; if (nRemain >= bcDataTmp.DurationTime) { nRemain = bcDataTmp.DurationTime / 2; } int nTimeAward = 0; nTimeAward = (int)(bcDataTmp.TimeModulus * nRemain); if (nTimeAward < 0) { nTimeAward = 0; } GameManager.ClientMgr.NotifyDaimonSquareMsgEndFight(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, DaimonSquareScenes.Key, (int)TCPGameServerCmds.CMD_SPR_DAIMONSQUAREENDFIGHT, nTimeAward); bcTmp.m_bEndFlag = true; } if (ticks >= (bcTmp.m_lEndTime + (bcDataTmp.LeaveTime * 1000))) { // 清场 List <Object> objsList = GameManager.ClientMgr.GetMapClients(DaimonSquareScenes.Key); if (objsList != null) { for (int n = 0; n < objsList.Count; ++n) { GameClient c = objsList[n] as GameClient; if (c == null) { continue; } if (c.ClientData.MapCode != DaimonSquareScenes.Key) { continue; } //CompleteDaimonSquareScene(c, bcTmp, bcDataTmp); // 根据公式和积分奖励经验 //GiveAwardDaimonSquareScene(c); // 退出场景 int toMapCode = GameManager.MainMapCode; //主城ID 防止意外 int toPosX = -1; int toPosY = -1; if (MapTypes.Normal == Global.GetMapType(c.ClientData.LastMapCode)) { if (GameManager.BattleMgr.BattleMapCode != c.ClientData.LastMapCode || GameManager.ArenaBattleMgr.BattleMapCode != c.ClientData.LastMapCode) { toMapCode = c.ClientData.LastMapCode; toPosX = c.ClientData.LastPosX; toPosY = c.ClientData.LastPosY; } } GameMap gameMap = null; if (GameManager.MapMgr.DictMaps.TryGetValue(toMapCode, out gameMap)) { c.ClientData.bIsInDaimonSquareMap = false; GameManager.ClientMgr.NotifyChangeMap(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, c, toMapCode, toPosX, toPosY, -1); } } } CleanDaimonSquareScene(DaimonSquareScenes.Key); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = DaimonSquareScenes.Key; } } } }