public static List <int[]> FindPath(Point startPoint, Point endPoint, int mapCode) { GameMap gameMap = GameManager.MapMgr.DictMaps[mapCode]; List <int[]> result; if (null == gameMap) { result = null; } else { PathFinderFast pathFinderFast; if (GlobalNew._pathStack.Count <= 0) { pathFinderFast = new PathFinderFast(gameMap.MyNodeGrid.GetFixedObstruction()) { Formula = HeuristicFormula.Manhattan, Diagonals = true, HeuristicEstimate = 2, ReopenCloseNodes = true, SearchLimit = int.MaxValue, Punish = null, MaxNum = Global.GMax(gameMap.MapGridWidth, gameMap.MapGridHeight) }; } else { pathFinderFast = GlobalNew._pathStack.Pop(); } startPoint.X = (double)(gameMap.CorrectWidthPointToGridPoint((int)startPoint.X) / gameMap.MapGridWidth); startPoint.Y = (double)(gameMap.CorrectHeightPointToGridPoint((int)startPoint.Y) / gameMap.MapGridHeight); endPoint.X = (double)(gameMap.CorrectWidthPointToGridPoint((int)endPoint.X) / gameMap.MapGridWidth); endPoint.Y = (double)(gameMap.CorrectHeightPointToGridPoint((int)endPoint.Y) / gameMap.MapGridHeight); pathFinderFast.EnablePunish = false; List <PathFinderNode> nodeList = pathFinderFast.FindPath(startPoint, endPoint); if (nodeList == null || nodeList.Count <= 0) { result = null; } else { List <int[]> path = new List <int[]>(); for (int i = 0; i < nodeList.Count; i++) { path.Add(new int[] { nodeList[i].X, nodeList[i].Y }); } result = path; } } return(result); }
/// <summary> // 刷B怪 /// </summary> public void CreateMonsterBBloodCastScene(int mapid, BloodCastleDataInfo bcDataTmp, BloodCastleScene bcTmp) { int monsterID = bcDataTmp.NeedKillMonster2ID; string[] sfields = bcDataTmp.NeedCreateMonster2Pos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); 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(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; int gridNum = gameMap.CorrectPointToGrid(bcDataTmp.NeedCreateMonster2Radius); for (int i = 0; i < bcDataTmp.NeedCreateMonster2Num; ++i) { GameManager.MonsterZoneMgr.AddDynamicMonsters(mapid, monsterID, -1, 1, gridX, gridY, gridNum, bcDataTmp.NeedCreateMonster2PursuitRadius); } return; }
/// <summary> // 刷城门 /// </summary> public static void CreateGateMonster(CopyMap copyMapInfo) { int monsterID = Data.FreshPlayerSceneInfo.GateID; string[] sfields = Data.FreshPlayerSceneInfo.GatePos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0); copyMapInfo.FreshPlayerCreateGateFlag = 1; return; }
/// <summary> // 刷B怪 /// </summary> public static void CreateMonsterBFreshPlayerScene(CopyMap copyMapInfo) { int monsterID = Data.FreshPlayerSceneInfo.NeedKillMonster2ID; string[] sfields = Data.FreshPlayerSceneInfo.NeedCreateMonster2Pos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; int gridNum = gameMap.CorrectPointToGrid(Data.FreshPlayerSceneInfo.NeedCreateMonster2Radius); for (int i = 0; i < Data.FreshPlayerSceneInfo.NeedCreateMonster2Num; ++i) { GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, gridNum, Data.FreshPlayerSceneInfo.NeedCreateMonster2PursuitRadius); } return; }
public static void ExperienceCopyMapCreateMonster(GameClient client, ExperienceCopyScene ExperienceMapInfo, ExperienceCopyMapDataInfo exMap, int nWave) { ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterFlag = 1; ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave++; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(ExperienceMapInfo.m_MapCodeID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("经验副本 地图配置 ID = {0}", ExperienceMapInfo.m_MapCodeID), null, true); } else { int gridX = gameMap.CorrectWidthPointToGridPoint(exMap.posX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(exMap.posZ) / gameMap.MapGridHeight; int gridNum = gameMap.CorrectWidthPointToGridPoint(exMap.Radius); int nTotal = 0; List <int> nListID = exMap.MonsterIDList[nWave]; List <int> nListNum = exMap.MonsterNumList[nWave]; for (int i = 0; i < nListID.Count; i++) { int nID = nListID[i]; int nNum = nListNum[i]; GameManager.MonsterZoneMgr.AddDynamicMonsters(ExperienceMapInfo.m_MapCodeID, nID, ExperienceMapInfo.m_CopyMapID, nNum, gridX, gridY, gridNum, 0, SceneUIClasses.Normal, null, null); nTotal += nNum; ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum += nNum; ExperienceMapInfo.m_ExperienceCopyMapRemainMonsterNum += nNum; } ExperienceMapInfo.m_ExperienceCopyMapNeedKillMonsterNum = ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum * exMap.CreateNextWaveMonsterCondition[nWave] / 100; if (client != null) { ExperienceCopySceneManager.SendMsgToClientForExperienceCopyMapInfo(client, ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave); } } }
public void CreateMonster(ElementWarScene scene, int upWave) { CopyMap copyMap = scene.CopyMapInfo; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("元素试炼报错 地图配置 ID = {0}", scene.MapID), null, true); } else { long nowTicket = TimeUtil.NOW(); long nowSecond = nowTicket / 1000L; lock (scene) { if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.SceneStatus = GameSceneStatuses.STATUS_END; } else { scene.IsMonsterFlag = 1; int wave = scene.MonsterWave + upWave; if (wave > scene.MonsterWaveTotal) { wave = scene.MonsterWaveTotal; } ElementWarMonsterConfigInfo waveConfig = this._runtimeData.GetOrderConfig(wave); if (waveConfig == null) { LogManager.WriteLog(LogTypes.Error, string.Format("元素试炼报错 刷怪波次 = {0}", wave), null, true); } else { scene.MonsterCountCreate = waveConfig.MonsterCount; scene.MonsterWave = wave; scene.CreateMonsterTime = nowSecond; for (int i = 0; i < waveConfig.MonsterCount; i++) { int monsterID = waveConfig.MonsterIDs[i % waveConfig.MonsterIDs.Count]; int gridX = gameMap.CorrectWidthPointToGridPoint(waveConfig.X + Global.GetRandomNumber(-waveConfig.Radius, waveConfig.Radius)) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(waveConfig.Y + Global.GetRandomNumber(-waveConfig.Radius, waveConfig.Radius)) / gameMap.MapGridHeight; int gridNum = 0; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, monsterID, scene.CopyMapInfo.CopyMapID, 1, gridX, gridY, gridNum, 0, SceneUIClasses.Normal, null, null); } scene.ScoreData.Wave = waveConfig.OrderID; scene.ScoreData.EndTime = nowTicket + (long)(waveConfig.Up1 * 1000); scene.ScoreData.MonsterCount = (long)waveConfig.MonsterCount; GameManager.ClientMgr.BroadSpecialCopyMapMessage <ElementWarScoreData>(1014, scene.ScoreData, scene.CopyMapInfo); } } } } }
/// <summary> // 刷怪接口 /// </summary> static public void ExperienceCopyMapCreateMonster(GameClient client, ExperienceCopyScene ExperienceMapInfo, ExperienceCopyMapDataInfo exMap, int nWave) { ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterFlag = 1; ++ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(ExperienceMapInfo.m_MapCodeID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("经验副本 地图配置 ID = {0}", ExperienceMapInfo.m_MapCodeID)); return; } int gridX = gameMap.CorrectWidthPointToGridPoint(exMap.posX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(exMap.posZ) / gameMap.MapGridHeight; int gridNum = gameMap.CorrectWidthPointToGridPoint(exMap.Radius); int nID = 0; int nNum = 0; int nTotal = 0; //for (int i = 0; i < exMap.MonsterIDList.Count; ++i) { List <int> nListID = exMap.MonsterIDList[nWave]; List <int> nListNum = exMap.MonsterNumList[nWave]; for (int j = 0; j < nListID.Count; ++j) { nID = nListID[j]; nNum = nListNum[j]; GameManager.MonsterZoneMgr.AddDynamicMonsters(ExperienceMapInfo.m_MapCodeID, nID, ExperienceMapInfo.m_CopyMapID, nNum, gridX, gridY, gridNum); nTotal += nNum; ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum += nNum; ExperienceMapInfo.m_ExperienceCopyMapRemainMonsterNum += nNum; } } // 计数要杀死怪的数量 ExperienceMapInfo.m_ExperienceCopyMapNeedKillMonsterNum = ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum * exMap.CreateNextWaveMonsterCondition[nWave] / 100; //System.Console.WriteLine("liaowei是帅哥 经验副本 {0} 里 刷怪了 数量是 {1} !!!", exMap.MapCodeID, ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterNum); if (client != null) { SendMsgToClientForExperienceCopyMapInfo(client, ExperienceMapInfo.m_ExperienceCopyMapCreateMonsterWave); } }
/// <summary> /// 刷要塞 /// </summary> public void CreateFort(CopyWolfSceneInfo scene) { CopyMap copyMap = scene.CopyMapInfo; CopyWolfWaveInfo waveConfig = null; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 地图配置 ID = {0}", scene.MapID)); return; } lock (scene) { if (scene.IsFortFlag > 0) { return; } //置刷怪标记 scene.IsFortFlag = 1; int gridX = gameMap.CorrectWidthPointToGridPoint((int)_runtimeData.FortSite.X) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint((int)_runtimeData.FortSite.Y) / gameMap.MapGridHeight; CreateMonsterTagInfo tagInfo = new CreateMonsterTagInfo(); tagInfo.FuBenSeqId = scene.FuBenSeqId; tagInfo.IsFort = true; tagInfo.ManagerType = (int)SceneUIClasses.CopyWolf; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, _runtimeData.FortMonsterID, scene.CopyMapInfo.CopyMapID, 1, gridX, gridY, 0, 0, SceneUIClasses.CopyWolf, tagInfo); XElement xml = GameManager.MonsterZoneMgr.AllMonstersXml; if (xml == null) { return; } XElement monsterXml = Global.GetSafeXElement(xml, "Monster", "ID", _runtimeData.FortMonsterID.ToString()); if (monsterXml == null) { return; } int life = (int)Global.GetSafeAttributeLong(monsterXml, "MaxLife"); scene.ScoreData.FortLifeNow = life; scene.ScoreData.FortLifeMax = life; GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_COPY_WOLF_SCORE_INFO, scene.ScoreData, scene.CopyMapInfo); } }
/// <summary> /// 补充刷新水晶棺材 /// </summary> /// <param name="client"></param> public static void AddShuiJingGuanCaiMonsters(GameClient client) { CopyMap copyMapInfo = null; lock (m_FreshPlayerListCopyMaps) { if (!m_FreshPlayerListCopyMaps.TryGetValue(client.ClientData.FuBenSeqID, out copyMapInfo) || copyMapInfo == null) { return; } } if (copyMapInfo.HaveBirthShuiJingGuan) { return; } if (copyMapInfo.FreshPlayerKillMonsterBCount >= Data.FreshPlayerSceneInfo.NeedKillMonster2Num) { bool canAddMonster = true; if (canAddMonster) //是否能刷水晶棺的怪物 { copyMapInfo.HaveBirthShuiJingGuan = true; // 把水晶棺刷出来 int monsterID = Data.FreshPlayerSceneInfo.CrystalID; string[] sfields = Data.FreshPlayerSceneInfo.CrystalPos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0); } } }
public void CreateFort(CopyWolfSceneInfo scene) { CopyMap copyMap = scene.CopyMapInfo; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 地图配置 ID = {0}", scene.MapID), null, true); } else { lock (scene) { if (scene.IsFortFlag <= 0) { scene.IsFortFlag = 1; int gridX = gameMap.CorrectWidthPointToGridPoint((int)this._runtimeData.FortSite.X) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint((int)this._runtimeData.FortSite.Y) / gameMap.MapGridHeight; CreateMonsterTagInfo tagInfo = new CreateMonsterTagInfo(); tagInfo.FuBenSeqId = scene.FuBenSeqId; tagInfo.IsFort = true; tagInfo.ManagerType = 34; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, this._runtimeData.FortMonsterID, scene.CopyMapInfo.CopyMapID, 1, gridX, gridY, 0, 0, SceneUIClasses.CopyWolf, tagInfo, null); XElement xml = GameManager.MonsterZoneMgr.AllMonstersXml; if (xml != null) { XElement monsterXml = Global.GetSafeXElement(xml, "Monster", "ID", this._runtimeData.FortMonsterID.ToString()); if (monsterXml != null) { int life = (int)Global.GetSafeAttributeLong(monsterXml, "MaxLife"); scene.ScoreData.FortLifeNow = life; scene.ScoreData.FortLifeMax = life; GameManager.ClientMgr.BroadSpecialCopyMapMessage <CopyWolfScoreData>(1025, scene.ScoreData, scene.CopyMapInfo); } } } } } }
/// <summary> // 心跳处理 /// </summary> public void HeartBeatAngelTempleScene() { long ticks = TimeUtil.NOW(); AngelTempleStatus newStatus; if (ChangeToNextStatus(out newStatus)) { switch (newStatus) { case AngelTempleStatus.FIGHT_STATUS_PREPARE: { //不需要做什么 Global.AddFlushIconStateForAll((ushort)ActivityTipTypes.AngelTemple, true); } break; case AngelTempleStatus.FIGHT_STATUS_BEGIN: { lock (m_AngelTempleScene) { bBossKilled = false; m_AngelTempleScene.m_bEndFlag = 0; } // 战斗结束倒计时 SendTimeInfoToAll(ticks); // 把天使BOSS刷出来 int monsterID = m_AngelTempleData.BossID; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(m_AngelTempleData.MapCode, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("天使神殿报错 地图配置 ID = {0}", m_AngelTempleData.MapCode)); return; } int gridX = gameMap.CorrectWidthPointToGridPoint(m_AngelTempleData.BossPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(m_AngelTempleData.BossPosY) / gameMap.MapGridHeight; AngelTempleMonsterUpgradePercent = Global.SafeConvertToDouble(GameManager.GameConfigMgr.GetGameConifgItem(GameConfigNames.AngelTempleMonsterUpgradeNumber)); GameManager.MonsterZoneMgr.AddDynamicMonsters(m_AngelTempleData.MapCode, monsterID, -1, 1, gridX, gridY, 1); } break; case AngelTempleStatus.FIGHT_STATUS_END: { Global.AddFlushIconStateForAll((ushort)ActivityTipTypes.AngelTemple, false); // 清场倒计时 SendTimeInfoToAll(ticks); // 如果BOSS没死 KILL掉 if (!bBossKilled && m_AngelTempleBoss != null) { //BOSS未被击杀,下次比例=本次血量*(总伤害/总血量)*80%,下限=当前比例/10 MonsterData md = m_AngelTempleBoss.GetMonsterData(); double damage = 0; if (md.MaxLifeV != md.LifeV) { damage = Global.Clamp(md.MaxLifeV - md.LifeV, md.MaxLifeV / 10, md.MaxLifeV); AngelTempleMonsterUpgradePercent *= damage * 0.8 / md.MaxLifeV; Global.UpdateDBGameConfigg(GameConfigNames.AngelTempleMonsterUpgradeNumber, AngelTempleMonsterUpgradePercent.ToString("0.00")); } GameManager.MonsterMgr.AddDelayDeadMonster(m_AngelTempleBoss); GameManager.ClientMgr.NotifyAngelTempleMsgBossDisappear(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, m_AngelTempleData.MapCode); LogManager.WriteLog(LogTypes.SQL, string.Format("天使神殿Boss未死亡,血量减少百分比{0:P} ,Boss生命值比例成长为{1}", damage / md.MaxLifeV, AngelTempleMonsterUpgradePercent)); m_AngelTempleBoss = null; } // 天使神殿结束战斗,如果杀死了Boss,客户端显示奖励界面(倒计时界面) GiveAwardAngelTempleScene(bBossKilled); } break; case AngelTempleStatus.FIGHT_STATUS_NULL: { // 清场 List <Object> objsList = GameManager.ClientMgr.GetMapClients(m_AngelTempleData.MapCode); 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 != m_AngelTempleData.MapCode) { continue; } // 根据公式和积分奖励经验 //GiveAwardAngelTempleScene(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.bIsInAngelTempleMap = false; GameManager.ClientMgr.NotifyChangeMap(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, c, toMapCode, toPosX, toPosY, -1); } } } CleanUpAngelTempleScene(); if (ticks >= (m_AngelTempleScene.m_lEndTime + (m_AngelTempleData.LeaveTime * 20000))) { m_AngelTempleScene.m_eStatus = AngelTempleStatus.FIGHT_STATUS_NULL; } } break; } } if (newStatus == AngelTempleStatus.FIGHT_STATUS_BEGIN) { //如果需要在这期间进行一些定时操作,写在这里 } }
/// <summary> /// 刷怪 /// </summary> public void CreateMonster(CopyWolfSceneInfo scene, int upWave = 1) { CopyMap copyMap = scene.CopyMapInfo; CopyWolfWaveInfo waveConfig = null; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 地图配置 ID = {0}", scene.MapID)); return; } //------------------------------------临时测试 //if (scene.MonsterWave > 0) //{ // //置刷怪标记 // scene.IsMonsterFlag = 1; // return; //} long nowTicket = TimeUtil.NOW(); long nowSecond = nowTicket / 1000; lock (scene) { if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.MonsterWaveOld = scene.MonsterWave; scene.MonsterWave = 0; scene.SceneStatus = GameSceneStatuses.STATUS_END; return; } //置刷怪标记 scene.IsMonsterFlag = 1; int wave = scene.MonsterWave + upWave; if (wave > scene.MonsterWaveTotal) { wave = scene.MonsterWaveTotal; } waveConfig = _runtimeData.GetWaveConfig(wave); if (waveConfig == null) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 刷怪波次 = {0}", wave)); return; } scene.MonsterWave = wave; // 递增刷怪波数 scene.CreateMonsterTime = nowSecond; int totalCount = 0; int monsterID = 0; int monsterCount = 0; int gridX = 0; int gridY = 0; int gridNum = 0; CreateMonsterTagInfo tagInfo = new CreateMonsterTagInfo(); tagInfo.FuBenSeqId = scene.FuBenSeqId; tagInfo.IsFort = false; tagInfo.ManagerType = (int)SceneUIClasses.CopyWolf; foreach (CopyWolfSiteInfo siteInfo in waveConfig.MonsterSiteDic) { gridX = gameMap.CorrectWidthPointToGridPoint(siteInfo.X + Global.GetRandomNumber(-siteInfo.Radius, siteInfo.Radius)) / gameMap.MapGridWidth; gridY = gameMap.CorrectHeightPointToGridPoint(siteInfo.Y + Global.GetRandomNumber(-siteInfo.Radius, siteInfo.Radius)) / gameMap.MapGridHeight; foreach (var monster in waveConfig.MonsterList) { monsterID = monster[0]; monsterCount = monster[1]; totalCount += monsterCount; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, monsterID, scene.CopyMapInfo.CopyMapID, monsterCount, gridX, gridY, gridNum, 0, SceneUIClasses.CopyWolf, tagInfo); //break; } //break; } scene.MonsterCountCreate += totalCount; scene.ScoreData.Wave = waveConfig.WaveID; scene.ScoreData.EndTime = nowTicket + waveConfig.NextTime * 1000; //scene.ScoreData.MonsterCount += scene.MonsterCountCreate; GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_COPY_WOLF_SCORE_INFO, scene.ScoreData, scene.CopyMapInfo); } }
public void HeartBeatAngelTempleScene() { long ticks = TimeUtil.NOW(); AngelTempleStatus newStatus; if (this.ChangeToNextStatus(out newStatus)) { switch (newStatus) { case AngelTempleStatus.FIGHT_STATUS_NULL: { List <object> objsList = GameManager.ClientMgr.GetMapClients(this.m_AngelTempleData.MapCode); if (objsList != null) { for (int i = 0; i < objsList.Count; i++) { GameClient c = objsList[i] as GameClient; if (c != null) { if (c.ClientData.MapCode == this.m_AngelTempleData.MapCode) { int toMapCode = GameManager.MainMapCode; 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.bIsInAngelTempleMap = false; GameManager.ClientMgr.NotifyChangeMap(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, c, toMapCode, toPosX, toPosY, -1, 0); } } } } } this.CleanUpAngelTempleScene(); if (ticks >= this.m_AngelTempleScene.m_lEndTime + (long)(this.m_AngelTempleData.LeaveTime * 20000)) { this.m_AngelTempleScene.m_eStatus = AngelTempleStatus.FIGHT_STATUS_NULL; } break; } case AngelTempleStatus.FIGHT_STATUS_PREPARE: Global.AddFlushIconStateForAll(1007, true); break; case AngelTempleStatus.FIGHT_STATUS_BEGIN: { lock (this.m_AngelTempleScene) { this.bBossKilled = false; this.m_AngelTempleScene.m_bEndFlag = 0; } this.SendTimeInfoToAll(ticks); int monsterID = this.m_AngelTempleData.BossID; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(this.m_AngelTempleData.MapCode, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("天使神殿报错 地图配置 ID = {0}", this.m_AngelTempleData.MapCode), null, true); return; } int gridX = gameMap.CorrectWidthPointToGridPoint(this.m_AngelTempleData.BossPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(this.m_AngelTempleData.BossPosY) / gameMap.MapGridHeight; this.AngelTempleMonsterUpgradePercent = Global.SafeConvertToDouble(GameManager.GameConfigMgr.GetGameConifgItem("AngelTempleMonsterUpgradeNumber")); GameManager.MonsterZoneMgr.AddDynamicMonsters(this.m_AngelTempleData.MapCode, monsterID, -1, 1, gridX, gridY, 1, 0, SceneUIClasses.Normal, null, null); break; } case AngelTempleStatus.FIGHT_STATUS_END: Global.AddFlushIconStateForAll(1007, false); this.SendTimeInfoToAll(ticks); if (!this.bBossKilled && this.m_AngelTempleBoss != null) { MonsterData md = this.m_AngelTempleBoss.GetMonsterData(); double damage = 0.0; if (md.MaxLifeV != md.LifeV) { damage = Global.Clamp(md.MaxLifeV - md.LifeV, md.MaxLifeV / 10.0, md.MaxLifeV); this.AngelTempleMonsterUpgradePercent *= damage * 0.8 / md.MaxLifeV; Global.UpdateDBGameConfigg("AngelTempleMonsterUpgradeNumber", this.AngelTempleMonsterUpgradePercent.ToString("0.00")); } GameManager.MonsterMgr.AddDelayDeadMonster(this.m_AngelTempleBoss); GameManager.ClientMgr.NotifyAngelTempleMsgBossDisappear(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, this.m_AngelTempleData.MapCode); LogManager.WriteLog(LogTypes.SQL, string.Format("天使神殿Boss未死亡,血量减少百分比{0:P} ,Boss生命值比例成长为{1}", damage / md.MaxLifeV, this.AngelTempleMonsterUpgradePercent), null, true); this.m_AngelTempleBoss = null; } this.GiveAwardAngelTempleScene(this.bBossKilled); break; } } if (newStatus == AngelTempleStatus.FIGHT_STATUS_BEGIN) { } }
public static void KillMonsterInFreshPlayerScene(GameClient client, Monster monster) { CopyMap copyMapInfo; lock (FreshPlayerCopySceneManager.m_FreshPlayerListCopyMaps) { if (!FreshPlayerCopySceneManager.m_FreshPlayerListCopyMaps.TryGetValue(client.ClientData.FuBenSeqID, out copyMapInfo) || copyMapInfo == null) { return; } } if (monster.MonsterInfo.VLevel >= Data.FreshPlayerSceneInfo.NeedKillMonster1Level) { copyMapInfo.FreshPlayerKillMonsterACount++; if (copyMapInfo.FreshPlayerKillMonsterACount >= Data.FreshPlayerSceneInfo.NeedKillMonster1Num) { string strcmd = string.Format("{0}", client.ClientData.RoleID); GameManager.ClientMgr.SendToClient(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, strcmd, 525); } } if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.NeedKillMonster2ID) { copyMapInfo.FreshPlayerKillMonsterBCount++; if (copyMapInfo.FreshPlayerKillMonsterBCount >= Data.FreshPlayerSceneInfo.NeedKillMonster2Num) { bool canAddMonster = false; TaskData taskData = Global.GetTaskData(client, 105); if (null != taskData) { canAddMonster = true; } if (canAddMonster) { copyMapInfo.HaveBirthShuiJingGuan = true; int monsterID = Data.FreshPlayerSceneInfo.CrystalID; string[] sfields = Data.FreshPlayerSceneInfo.CrystalPos.Split(new char[] { ',' }); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0, 0, SceneUIClasses.Normal, null, null); } } } if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.GateID) { FreshPlayerCopySceneManager.CreateMonsterBFreshPlayerScene(copyMapInfo); } if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.CrystalID) { int monsterID = Data.FreshPlayerSceneInfo.DiaoXiangID; string[] sfields = Data.FreshPlayerSceneInfo.DiaoXiangPos.Split(new char[] { ',' }); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0, 0, SceneUIClasses.Normal, null, null); } } }
/// <summary> // 杀死了怪 /// </summary> public static void KillMonsterInFreshPlayerScene(GameClient client, Monster monster) { CopyMap copyMapInfo; lock (m_FreshPlayerListCopyMaps) { if (!m_FreshPlayerListCopyMaps.TryGetValue(client.ClientData.FuBenSeqID, out copyMapInfo) || copyMapInfo == null) { return; } } if (monster.MonsterInfo.VLevel >= Data.FreshPlayerSceneInfo.NeedKillMonster1Level) { ++copyMapInfo.FreshPlayerKillMonsterACount; if (copyMapInfo.FreshPlayerKillMonsterACount >= Data.FreshPlayerSceneInfo.NeedKillMonster1Num) { // 杀死A怪的数量已经达到限额 通知客户端 面前的阻挡消失 玩家可以离开桥 攻击城门了 string strcmd = string.Format("{0}", client.ClientData.RoleID); GameManager.ClientMgr.SendToClient(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, strcmd, (int)TCPGameServerCmds.CMD_SPR_FRESHPLAYERSCENEKILLMONSTERAHASDONE); } } if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.NeedKillMonster2ID) { ++copyMapInfo.FreshPlayerKillMonsterBCount; if (copyMapInfo.FreshPlayerKillMonsterBCount >= Data.FreshPlayerSceneInfo.NeedKillMonster2Num) { bool canAddMonster = false; TaskData taskData = Global.GetTaskData(client, 105); //先写死吧,临时i解决掉 if (null != taskData) { canAddMonster = true; } if (canAddMonster) //是否能刷水晶棺的怪物 { copyMapInfo.HaveBirthShuiJingGuan = true; // 把水晶棺刷出来 int monsterID = Data.FreshPlayerSceneInfo.CrystalID; string[] sfields = Data.FreshPlayerSceneInfo.CrystalPos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0); } } } // 如果杀死的是城门 刷巫师 if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.GateID) { CreateMonsterBFreshPlayerScene(copyMapInfo); } // 刷雕像 if (monster.MonsterInfo.ExtensionID == Data.FreshPlayerSceneInfo.CrystalID) { int monsterID = Data.FreshPlayerSceneInfo.DiaoXiangID; string[] sfields = Data.FreshPlayerSceneInfo.DiaoXiangPos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(copyMapInfo.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(copyMapInfo.MapCode, monsterID, copyMapInfo.CopyMapID, 1, gridX, gridY, 0); } return; }
/// <summary> /// 刷怪 /// </summary> public void CreateMonster(ElementWarScene scene, int upWave) { CopyMap copyMap = scene.CopyMapInfo; ElementWarMonsterConfigInfo waveConfig = null; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("元素试炼报错 地图配置 ID = {0}", scene.MapID)); return; } long nowTicket = TimeUtil.NOW(); long nowSecond = nowTicket / 1000; lock (scene) { if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.SceneStatus = GameSceneStatuses.STATUS_END; return; } //置刷怪标记 scene.IsMonsterFlag = 1; int wave = scene.MonsterWave + upWave; if (wave > scene.MonsterWaveTotal) { wave = scene.MonsterWaveTotal; } waveConfig = _runtimeData.GetOrderConfig(wave); if (waveConfig == null) { LogManager.WriteLog(LogTypes.Error, string.Format("元素试炼报错 刷怪波次 = {0}", wave)); return; } scene.MonsterCountCreate = waveConfig.MonsterCount; scene.MonsterWave = wave; // 递增刷怪波数 scene.CreateMonsterTime = nowSecond; int monsterID = 0; int gridX = 0; int gridY = 0; int gridNum = 0; for (int i = 0; i < waveConfig.MonsterCount; i++) { monsterID = waveConfig.MonsterIDs[i % waveConfig.MonsterIDs.Count]; gridX = gameMap.CorrectWidthPointToGridPoint(waveConfig.X + Global.GetRandomNumber(-waveConfig.Radius, waveConfig.Radius)) / gameMap.MapGridWidth; gridY = gameMap.CorrectHeightPointToGridPoint(waveConfig.Y + Global.GetRandomNumber(-waveConfig.Radius, waveConfig.Radius)) / gameMap.MapGridHeight; gridNum = 0; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, monsterID, scene.CopyMapInfo.CopyMapID, 1, gridX, gridY, gridNum); } scene.ScoreData.Wave = waveConfig.OrderID; scene.ScoreData.EndTime = nowTicket + waveConfig.Up1 * 1000; scene.ScoreData.MonsterCount = waveConfig.MonsterCount; GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_SCORE_INFO, scene.ScoreData, scene.CopyMapInfo); } }
/// <summary> // 心跳处理 /// </summary> public void HeartBeatBloodCastScene() { //int[] nArray = GameManager.systemParamsList.GetParamValueIntArrayByName("BloodCastleMapCodeID"); foreach (var BloodCastleScenes in m_BloodCastleListScenes) { //for (int i = 0; i < nArray.Length; ++i) //{ BloodCastleDataInfo bcDataTmp = Data.BloodCastleDataInfoList[BloodCastleScenes.Key]; BloodCastleScene bcTmp = GetBloodCastleListScenes(BloodCastleScenes.Key); if (bcTmp == null || bcDataTmp == null) { continue; } int nRoleNum = 0; nRoleNum = GameManager.ClientMgr.GetMapClientsCount(bcTmp.m_nMapCode); if (nRoleNum <= 0) { if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_BEGIN) { // 做清空处理 比如 所有动态刷出的怪 都delete掉 CleanBloodCastScene(bcTmp.m_nMapCode); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = BloodCastleScenes.Key; } //continue; } // 区分时段 注意 每个时段都要计时 // 当前tick long ticks = DateTime.Now.Ticks / 10000; if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_NULL) // 如果处于空状态 -- 是否要切换到准备状态 { bool bPushMsg = false; if (Global.CanEnterBloodCastleOnTime(bcDataTmp.BeginTime, 0 /*bcDataTmp.PrepareTime*/)) { bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_PREPARE; bcTmp.m_lPrepareTime = DateTime.Now.Ticks / 10000; //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); // 消息推送 int nNow = DateTime.Now.DayOfYear; if (bPushMsg && m_nPushMsgDayID != nNow) { //Global.DayActivityTiggerPushMessage((int)SpecialActivityTypes.BloodCastle); Global.UpdateDBGameConfigg(GameConfigNames.BloodCastlePushMsgDayID, nNow.ToString()); m_nPushMsgDayID = nNow; } } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_PREPARE) // 场景战斗状态切换 { if (ticks >= (bcTmp.m_lPrepareTime + (bcDataTmp.PrepareTime * 1000))) { // 准备战斗 通知客户端 面前的阻挡消失 玩家可以上桥上去杀怪了 bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_BEGIN; bcTmp.m_lBeginTime = DateTime.Now.Ticks / 10000; int nTimer = (int)((bcDataTmp.DurationTime * 1000 - (ticks - bcTmp.m_lBeginTime)) / 1000); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, BloodCastleScenes.Key, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEBEGINFIGHT, nTimer); // 战斗结束倒计时 // 把城门刷出来 int monsterID = bcDataTmp.GateID; string[] sfields = bcDataTmp.GatePos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); 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(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; //System.Console.WriteLine("liaowei是帅哥 血色堡垒{0}里 刷城门怪了--1!!!", BloodCastleScenes.Key); GameManager.MonsterZoneMgr.AddDynamicMonsters(BloodCastleScenes.Key, monsterID, -1, 1, gridX, gridY, 0); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 1); // 杀死桥上的怪 0/50 -- 显示杀怪状态 //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_BEGIN) // 战斗开始 { if (ticks >= (bcTmp.m_lBeginTime + (bcDataTmp.DurationTime * 1000))) { bcTmp.m_eStatus = BloodCastleStatus.FIGHT_STATUS_END; bcTmp.m_lEndTime = DateTime.Now.Ticks / 10000; //触发血色城堡事件 GlobalEventSource.getInstance().fireEvent(XueSeChengBaoBaseEventObject.CreateStatusEvent((int)bcTmp.m_eStatus)); } } else if (bcTmp.m_eStatus == BloodCastleStatus.FIGHT_STATUS_END) // 战斗结束 { // 血色堡垒结束战斗 客户端显示倒计时界面 int nTimer = (int)((bcDataTmp.LeaveTime * 1000 - (ticks - bcTmp.m_lEndTime)) / 1000); if (bcTmp.m_bEndFlag == false) { // 剩余时间奖励 long nTimerInfo = 0; nTimerInfo = bcTmp.m_lEndTime - bcTmp.m_lBeginTime; long nRemain = 0; nRemain = ((bcDataTmp.DurationTime * 1000) - nTimerInfo) / 1000; if (nRemain >= bcDataTmp.DurationTime) { nRemain = bcDataTmp.DurationTime / 2; } int nTimeAward = 0; nTimeAward = (int)(bcDataTmp.TimeModulus * nRemain); if (nTimeAward < 0) { nTimeAward = 0; } GameManager.ClientMgr.NotifyBloodCastleMsgEndFight(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, BloodCastleScenes.Key, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEENDFIGHT, nTimer, nTimeAward); } if (ticks >= (bcTmp.m_lEndTime + (bcDataTmp.LeaveTime * 1000))) { // 清场 List <Object> objsList = GameManager.ClientMgr.GetMapClients(BloodCastleScenes.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 != BloodCastleScenes.Key) { continue; } // 完成该血色堡垒 //CompleteBloodCastScene(c, bcTmp, bcDataTmp); // 根据公式和积分奖励经验 注释掉 //GiveAwardBloodCastScene(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.bIsInBloodCastleMap = false; GameManager.ClientMgr.NotifyChangeMap(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, c, toMapCode, toPosX, toPosY, -1); } } } CleanBloodCastScene(BloodCastleScenes.Key); bcTmp.CleanAllInfo(); bcTmp.m_nMapCode = BloodCastleScenes.Key; } } //} } return; }
public void CreateMonster(CopyWolfSceneInfo scene, int upWave = 1) { CopyMap copyMap = scene.CopyMapInfo; CopyWolfWaveInfo waveConfig = null; GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(scene.MapID, out gameMap)) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 地图配置 ID = {0}", scene.MapID), null, true); } else { long nowTicket = TimeUtil.NOW(); long nowSecond = nowTicket / 1000L; lock (scene) { if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.MonsterWaveOld = scene.MonsterWave; scene.MonsterWave = 0; scene.SceneStatus = GameSceneStatuses.STATUS_END; } else { scene.IsMonsterFlag = 1; int wave = scene.MonsterWave + upWave; if (wave > scene.MonsterWaveTotal) { wave = scene.MonsterWaveTotal; } waveConfig = this._runtimeData.GetWaveConfig(wave); if (waveConfig == null) { LogManager.WriteLog(LogTypes.Error, string.Format("【狼魂要塞】报错 刷怪波次 = {0}", wave), null, true); } else { scene.MonsterWave = wave; scene.CreateMonsterTime = nowSecond; int totalCount = 0; int gridNum = 0; CreateMonsterTagInfo tagInfo = new CreateMonsterTagInfo(); tagInfo.FuBenSeqId = scene.FuBenSeqId; tagInfo.IsFort = false; tagInfo.ManagerType = 34; foreach (CopyWolfSiteInfo siteInfo in waveConfig.MonsterSiteDic) { int gridX = gameMap.CorrectWidthPointToGridPoint(siteInfo.X + Global.GetRandomNumber(-siteInfo.Radius, siteInfo.Radius)) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(siteInfo.Y + Global.GetRandomNumber(-siteInfo.Radius, siteInfo.Radius)) / gameMap.MapGridHeight; foreach (int[] monster in waveConfig.MonsterList) { int monsterID = monster[0]; int monsterCount = monster[1]; totalCount += monsterCount; GameManager.MonsterZoneMgr.AddDynamicMonsters(scene.MapID, monsterID, scene.CopyMapInfo.CopyMapID, monsterCount, gridX, gridY, gridNum, 0, SceneUIClasses.CopyWolf, tagInfo, null); } } scene.MonsterCountCreate += totalCount; scene.ScoreData.Wave = waveConfig.WaveID; scene.ScoreData.EndTime = nowTicket + (long)(waveConfig.NextTime * 1000); GameManager.ClientMgr.BroadSpecialCopyMapMessage <CopyWolfScoreData>(1025, scene.ScoreData, scene.CopyMapInfo); } } } } }
/// <summary> // 杀死了怪 /// </summary> public void KillMonsterABloodCastScene(GameClient client, Monster monster) { BloodCastleDataInfo bcDataTmp = Data.BloodCastleDataInfoList[client.ClientData.MapCode]; BloodCastleScene bcTmp = GetBloodCastleListScenes(client.ClientData.MapCode); if (bcTmp == null || bcDataTmp == null) { return; } if (bcTmp.m_bEndFlag == true) { return; } // 给玩家积分 client.ClientData.BloodCastleAwardPoint += monster.MonsterInfo.BloodCastJiFen; // 节省性能 当杀够1000分时 做存储 if (client.ClientData.BloodCastleAwardPoint - client.ClientData.BloodCastleAwardPointTmp >= 1000) { client.ClientData.BloodCastleAwardPointTmp = client.ClientData.BloodCastleAwardPoint; Global.SaveRoleParamsInt32ValueToDB(client, RoleParamName.BloodCastlePlayerPoint, client.ClientData.BloodCastleAwardPoint, true); } string strcmd = string.Format("{0}:{1}", client.ClientData.RoleID, client.ClientData.BloodCastleAwardPoint); GameManager.ClientMgr.SendToClient(client, strcmd, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLECOMBATPOINT); if (monster.MonsterInfo.VLevel >= bcDataTmp.NeedKillMonster1Level && bcTmp.m_bKillMonsterAStatus == 0) { int killedMonster = Interlocked.Increment(ref bcTmp.m_nKillMonsterACount); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, bcTmp.m_nKillMonsterACount, 1); // 杀死桥上的怪 数量/50 显示杀怪状态 if (killedMonster == bcDataTmp.NeedKillMonster1Num) { // 杀死A怪的数量已经达到限额 通知客户端 面前的阻挡消失 玩家可以离开桥 攻击城门了 GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERAHASDONE); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 2); // 杀死吊桥怪 0/1 -- 显示杀怪状态 bcTmp.m_bKillMonsterAStatus = 1; } } if (monster.MonsterInfo.ExtensionID == bcDataTmp.GateID) { CreateMonsterBBloodCastScene(bcTmp.m_nMapCode, bcDataTmp, bcTmp); // 把B怪刷出来吧 GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 1, 2); // 杀死吊桥怪 1/1 -- 显示杀怪状态 GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 3); // 杀死巫师怪 0/8 -- 显示杀怪状态 } if (monster.MonsterInfo.ExtensionID == bcDataTmp.NeedKillMonster2ID && bcTmp.m_bKillMonsterBStatus == 0) { int killedMonster = Interlocked.Increment(ref bcTmp.m_nKillMonsterBCount); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, bcTmp.m_nKillMonsterBCount, 3); // 杀死巫师怪 数量/8 -- 显示杀怪状态 if (killedMonster == bcDataTmp.NeedKillMonster2Num) { // 把水晶棺刷出来 int monsterID = bcDataTmp.CrystalID; string[] sfields = bcDataTmp.CrystalPos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); 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(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(bcTmp.m_nMapCode, monsterID, -1, 1, gridX, gridY, 0); GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 4); // 杀死水晶棺 0/1 -- 显示杀怪状态 bcTmp.m_bKillMonsterBStatus = 1; } } if (monster.MonsterInfo.ExtensionID == bcDataTmp.CrystalID) { GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 1, 4); // 杀死水晶棺 1/1 -- 显示杀怪状态 GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 0, 5); // 采集雕像 0/1 -- 显示杀怪状态 } if (monster.MonsterInfo.ExtensionID == bcDataTmp.DiaoXiangID) { GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 1, 5); // 采集雕像 1/1 -- 显示杀怪状态 GameManager.ClientMgr.NotifyBloodCastleMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, bcTmp.m_nMapCode, (int)TCPGameServerCmds.CMD_SPR_BLOODCASTLEKILLMONSTERSTATUS, 0, 1, 6); // 提交大天使武器 1/1 -- 显示杀怪状态 } // 刷雕像 if (monster.MonsterInfo.ExtensionID == bcDataTmp.CrystalID) { int monsterID = bcDataTmp.DiaoXiangID; string[] sfields = bcDataTmp.DiaoXiangPos.Split(','); int nPosX = Global.SafeConvertToInt32(sfields[0]); int nPosY = Global.SafeConvertToInt32(sfields[1]); GameMap gameMap = null; if (!GameManager.MapMgr.DictMaps.TryGetValue(bcDataTmp.MapCode, out gameMap)) { return; } int gridX = gameMap.CorrectWidthPointToGridPoint(nPosX) / gameMap.MapGridWidth; int gridY = gameMap.CorrectHeightPointToGridPoint(nPosY) / gameMap.MapGridHeight; GameManager.MonsterZoneMgr.AddDynamicMonsters(bcDataTmp.MapCode, monsterID, -1, 1, gridX, gridY, 0); } return; }
/// <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; }