/// <summary> /// 玩家离开 /// </summary> public void LeaveFuBen(GameClient client) { //ElementWarClient.getInstance().GameFuBenRoleChangeState(client.ClientData.RoleID, (int)KuaFuRoleStates.None); ElementWarScene scene = null; lock (_sceneDict) { if (!_sceneDict.TryGetValue(client.ClientData.FuBenSeqID, out scene)) { return; } } lock (scene) { scene.PlayerCount--; if (scene.SceneStatus != GameSceneStatuses.STATUS_END && scene.SceneStatus != GameSceneStatuses.STATUS_AWARD && scene.SceneStatus != GameSceneStatuses.STATUS_CLEAR) { KuaFuManager.getInstance().SetCannotJoinKuaFu_UseAutoEndTicks(client); } } }
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> public void KillMonster(GameClient client, Monster monster) { if (client.ClientData.FuBenSeqID < 0 || client.ClientData.CopyMapID < 0 || !IsElementWarCopy(client.ClientData.FuBenID)) { return; } ElementWarScene scene = null; if (!_sceneDict.TryGetValue(client.ClientData.FuBenSeqID, out scene) || scene == null) { return; } //如果是重复记录击杀同一只怪,则直接返回 if (!scene.AddKilledMonster(monster)) { return; } if (scene.SceneStatus >= GameSceneStatuses.STATUS_END) { return; } lock (scene) { scene.MonsterCountKill++; scene.ScoreData.MonsterCount -= 1; scene.ScoreData.MonsterCount = scene.ScoreData.MonsterCount < 0 ? 0 : scene.ScoreData.MonsterCount; GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_SCORE_INFO, scene.ScoreData, scene.CopyMapInfo); if (scene.IsMonsterFlag == 1 && scene.MonsterCountKill >= scene.MonsterCountCreate && scene.ScoreData.MonsterCount <= 0) { scene.MonsterWaveOld = scene.MonsterWave; if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.SceneStatus = GameSceneStatuses.STATUS_END; } else { scene.IsMonsterFlag = 0; scene.MonsterCountKill = 0; scene.MonsterCountCreate = 0; } } }//lock }
/// <summary> /// 添加一个场景 /// </summary> public bool AddCopyScene(GameClient client, CopyMap copyMap) { if (copyMap.MapCode == _runtimeData.MapID) { int fuBenSeqId = copyMap.FuBenSeqID; int mapCode = copyMap.MapCode; lock (_mutex) { ElementWarScene newScene = null; if (!_sceneDict.TryGetValue(fuBenSeqId, out newScene)) { newScene = new ElementWarScene(); newScene.CopyMapInfo = copyMap; newScene.CleanAllInfo(); newScene.GameId = Global.GetClientKuaFuServerLoginData(client).GameId; newScene.MapID = mapCode; newScene.CopyID = copyMap.CopyMapID; newScene.FuBenSeqId = fuBenSeqId; newScene.PlayerCount = 1; _sceneDict[fuBenSeqId] = newScene; } else { newScene.PlayerCount++; } copyMap.IsKuaFuCopy = true; copyMap.SetRemoveTicks(TimeUtil.NOW() + _runtimeData.TotalSecs * TimeUtil.SECOND); GameManager.ClientMgr.BroadSpecialCopyMapMessage((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_SCORE_INFO, newScene.ScoreData, newScene.CopyMapInfo); } //更新状态 // ElementWarClient.getInstance().GameFuBenRoleChangeState(client.ClientData.RoleID, (int)KuaFuRoleStates.StartGame); // 开始游戏统计 GlobalNew.UpdateKuaFuRoleDayLogData(client.ServerId, client.ClientData.RoleID, TimeUtil.NowDateTime(), client.ClientData.ZoneID, 0, 1, 0, 0, (int)_gameType); return(true); } return(false); }
public bool AddCopyScene(GameClient client, CopyMap copyMap) { bool result; if (copyMap.MapCode == this._runtimeData.MapID) { int fuBenSeqId = copyMap.FuBenSeqID; int mapCode = copyMap.MapCode; lock (ElementWarManager._mutex) { ElementWarScene newScene = null; if (!this._sceneDict.TryGetValue(fuBenSeqId, out newScene)) { newScene = new ElementWarScene(); newScene.CopyMapInfo = copyMap; newScene.CleanAllInfo(); newScene.GameId = Global.GetClientKuaFuServerLoginData(client).GameId; newScene.MapID = mapCode; newScene.CopyID = copyMap.CopyMapID; newScene.FuBenSeqId = fuBenSeqId; newScene.PlayerCount = 1; this._sceneDict[fuBenSeqId] = newScene; } else { newScene.PlayerCount++; } copyMap.IsKuaFuCopy = true; copyMap.SetRemoveTicks(TimeUtil.NOW() + (long)(this._runtimeData.TotalSecs * 1000)); GameManager.ClientMgr.BroadSpecialCopyMapMessage <ElementWarScoreData>(1014, newScene.ScoreData, newScene.CopyMapInfo); } GlobalNew.UpdateKuaFuRoleDayLogData(client.ServerId, client.ClientData.RoleID, TimeUtil.NowDateTime(), client.ClientData.ZoneID, 0, 1, 0, 0, 4); result = true; } else { result = false; } return(result); }
public void KillMonster(GameClient client, Monster monster) { if (client.ClientData.FuBenSeqID >= 0 && client.ClientData.CopyMapID >= 0 && this.IsElementWarCopy(client.ClientData.FuBenID)) { ElementWarScene scene = null; if (this._sceneDict.TryGetValue(client.ClientData.FuBenSeqID, out scene) && scene != null) { if (scene.AddKilledMonster(monster)) { if (scene.SceneStatus < GameSceneStatuses.STATUS_END) { lock (scene) { scene.MonsterCountKill++; scene.ScoreData.MonsterCount -= 1L; scene.ScoreData.MonsterCount = ((scene.ScoreData.MonsterCount < 0L) ? 0L : scene.ScoreData.MonsterCount); GameManager.ClientMgr.BroadSpecialCopyMapMessage <ElementWarScoreData>(1014, scene.ScoreData, scene.CopyMapInfo); if (scene.IsMonsterFlag == 1 && scene.MonsterCountKill >= scene.MonsterCountCreate && scene.ScoreData.MonsterCount <= 0L) { scene.MonsterWaveOld = scene.MonsterWave; if (scene.MonsterWave >= scene.MonsterWaveTotal) { scene.SceneStatus = GameSceneStatuses.STATUS_END; } else { scene.IsMonsterFlag = 0; scene.MonsterCountKill = 0; scene.MonsterCountCreate = 0; } } } } } } } }
/// <summary> /// 给奖励 /// </summary> public void GiveAwards(ElementWarScene scene) { try { FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(scene.CopyMapInfo.FubenMapID, scene.MapID); if (fuBenMapItem == null) { return; } //FuBenInfoItem fuBenInfoItem = FuBenManager.FindFuBenInfoBySeqID(scene.FuBenSeqId); //if (null == fuBenInfoItem) return; //fuBenInfoItem.EndTicks = TimeUtil.NOW(); //int addFuBenNum = 1; //if (fuBenInfoItem.nDayOfYear != TimeUtil.NowDateTime().DayOfYear) // addFuBenNum = 0; //int usedSecs = (int)(scene.EndTime - scene.BeginTime); int zhanLi = 0; List <GameClient> objsList = scene.CopyMapInfo.GetClientsList(); if (objsList != null && objsList.Count > 0) { for (int n = 0; n < objsList.Count; ++n) { GameClient client = objsList[n]; if (client != null && client == GameManager.ClientMgr.FindClient(client.ClientData.RoleID)) //确认角色仍然在线 { // 公式 long nExp = fuBenMapItem.Experience; int money = fuBenMapItem.Money1; int wave = scene.MonsterWaveOld; if (wave > 0) { wave -= 1; } int light = fuBenMapItem.LightAward + _runtimeData.AwardLight[wave]; if (nExp > 0) { GameManager.ClientMgr.ProcessRoleExperience(client, nExp, false); } if (money > 0) { GameManager.ClientMgr.AddMoney1(Global._TCPManager.MySocketListener, Global._TCPManager.tcpClientPool, Global._TCPManager.TcpOutPacketPool, client, money, string.Format(/**/ "副本{0}通关奖励", scene.CopyID), false); } if (light > 0) { GameManager.FluorescentGemMgr.AddFluorescentPoint(client, light, "元素试炼"); } ElementWarAwardsData awardsData = new ElementWarAwardsData() { Wave = scene.MonsterWaveOld, Exp = nExp, Money = money, Light = light }; AddElementWarCount(client); GlobalNew.UpdateKuaFuRoleDayLogData(client.ServerId, client.ClientData.RoleID, TimeUtil.NowDateTime(), client.ClientData.ZoneID, 0, 0, 1, 0, (int)_gameType); client.sendCmd((int)TCPGameServerCmds.CMD_SPR_ELEMENT_WAR_AWARD, awardsData); zhanLi += client.ClientData.CombatForce; Global.UpdateFuBenDataForQuickPassTimer(client, scene.CopyMapInfo.FubenMapID, 0, 1); } } } int roleCount = 0; if (objsList != null && objsList.Count > 0) { roleCount = objsList.Count; zhanLi = zhanLi / roleCount; } // ElementWarClient.getInstance().UpdateCopyPassEvent(scene.FuBenSeqId, roleCount, scene.MonsterWaveOld, zhanLi); } catch (System.Exception ex) { DataHelper.WriteExceptionLogEx(ex, "【元素试炼】清场调度异常"); } }
/// <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); } }
public void GiveAwards(ElementWarScene scene) { try { FuBenMapItem fuBenMapItem = FuBenManager.FindMapCodeByFuBenID(scene.CopyMapInfo.FubenMapID, scene.MapID); if (fuBenMapItem != null) { int zhanLi = 0; List <GameClient> objsList = scene.CopyMapInfo.GetClientsList(); if (objsList != null && objsList.Count > 0) { for (int i = 0; i < objsList.Count; i++) { GameClient client = objsList[i]; if (client != null && client == GameManager.ClientMgr.FindClient(client.ClientData.RoleID)) { long nExp = (long)fuBenMapItem.Experience; int money = fuBenMapItem.Money1; int wave = scene.MonsterWaveOld; int light = fuBenMapItem.LightAward + this._runtimeData.AwardLight[wave]; int ysfm = fuBenMapItem.YuanSuFenMoaward + this._runtimeData.YuanSuShiLianAward2[wave]; if (nExp > 0L) { GameManager.ClientMgr.ProcessRoleExperience(client, nExp, false, true, false, "none"); } if (money > 0) { GameManager.ClientMgr.AddMoney1(Global._TCPManager.MySocketListener, Global._TCPManager.tcpClientPool, Global._TCPManager.TcpOutPacketPool, client, money, string.Format("副本{0}通关奖励", scene.CopyID), false); } if (light > 0) { GameManager.FluorescentGemMgr.AddFluorescentPoint(client, light, "元素试炼", true); } if (ysfm > 0) { GameManager.ClientMgr.ModifyYuanSuFenMoValue(client, ysfm, "元素试炼", true, false); } ElementWarAwardsData awardsData = new ElementWarAwardsData { Wave = scene.MonsterWaveOld, Exp = nExp, Money = money, Light = light, ysfm = ysfm }; this.AddElementWarCount(client); GlobalNew.UpdateKuaFuRoleDayLogData(client.ServerId, client.ClientData.RoleID, TimeUtil.NowDateTime(), client.ClientData.ZoneID, 0, 0, 1, 0, 4); client.sendCmd <ElementWarAwardsData>(1015, awardsData, false); zhanLi += client.ClientData.CombatForce; Global.UpdateFuBenDataForQuickPassTimer(client, scene.CopyMapInfo.FubenMapID, 0, 1); } } } if (objsList != null && objsList.Count > 0) { int roleCount = objsList.Count; zhanLi /= roleCount; } } } catch (Exception ex) { DataHelper.WriteExceptionLogEx(ex, "【元素试炼】清场调度异常"); } }