/// <summary> /// 战斗结算 /// </summary> public static ErrorCode Settle(int userId, string battleId, TBattleResult result, bool isManual, out TBattleSettle settle, int playerId) { settle = null; if (result == null) { return(ErrorCode.Success); } settle = new TBattleSettle() { BattleType = result.BattleType, IsMyWin = userId == (result == null ? 0 : result.WinPlayerId), BonusOutput = null, Round = result == null ? 1 : result.SettleRound, Success = result != null, BattleId = battleId, IsManual = isManual, }; //结算失败, 没有战斗结果 if (!settle.Success) { return(ErrorCode.Success); } //根据战斗类型结算 var err = ErrorCode.Success; switch ((BattleType)result.BattleType) { //挑战 case BattleType.PK: err = SettleUserPK(userId, settle); if (err != ErrorCode.Success) { return(err); } break; //合作 case BattleType.COOP: err = SettleUserCoop(userId, settle); if (err != ErrorCode.Success) { return(err); } break; //随机竞技场 case BattleType.PKRANDOM: err = SettleUserPKRandom(userId, settle, playerId); if (err != ErrorCode.Success) { return(err); } break; default: Logger.LogError($"User[{userId}]: Unknown battleType[{result.BattleType}] to settle"); return(ErrorCode.InvalidParameter); } return(ErrorCode.Success); }
/// <summary> /// 玩家战斗结算 - 随机竞技场 /// </summary> private static ErrorCode SettleUserPKRandom(int userId, TBattleSettle settle, int playerId) { if (settle == null) { Logger.LogError($"User[{userId}]: SettleUserPk Para TBattleSettle settle is null"); return(ErrorCode.FuncParameterIsNull); } return(ArenaRandomLogicService.Settle(userId, settle.IsMyWin, playerId)); }
/// <summary> /// 榜单结算 /// </summary> public static async Task Settle(int userId, TBattleSettle settle) { //无结算 if (settle == null) { return; } switch ((BattleType)settle.BattleType) { //PK case BattleType.PK: await SettlePK(userId); break; } //尝试重新加载所有榜单 await TryReloadAllRank(null); }
/// <summary> /// 玩家战斗结算 - 合作模式 /// </summary> private static ErrorCode SettleUserCoop(int userId, TBattleSettle settle) { if (settle == null) { Logger.LogError($"User[{userId}]: SettleUserCoop Para TBattleSettle settle is null"); return(ErrorCode.FuncParameterIsNull); } var battleRes = BattleResConfig.Cache.FindKey((int)BattleType.COOP); if (battleRes == null) { Logger.LogError($"User[{userId}]: BattleResConfig.Cache.FindKey({(int)BattleType.COOP}) == null"); return(ErrorCode.DataNotFound); } var profile = TUserProfile.Cache.FindKey(userId); if (profile == null) { Logger.LogError($"User[{userId}]: TUserProfile.Cache.FindKey({userId}) == null"); return(ErrorCode.DataNotFound); } //顺序敏感 //触发任务 - 完成任意战斗 TaskCenterService.Update(userId, ConditionType.BATTLE, TaskOpType.Add, 1); //触发任务 - 完成PVE战斗 TaskCenterService.Update(userId, ConditionType.PVE, TaskOpType.Add, 1); //触发任务 - 完成PVE回合数 TaskCenterService.Update(userId, ConditionType.STAGE, TaskOpType.Equal, settle.Round); //更新合作档案 ProfileService.UpdateCoopBattle(profile, settle.Round); TUserProfile.Cache.AddOrUpdate(profile); //回合数大于0时结算奖励 if (settle.Round > 0) { //触发任务 - 累计PVE回合数 TaskCenterService.Update(userId, ConditionType.STAGEADD, TaskOpType.Add, settle.Round); //战斗前广告加成 var beforeAD = UserService.CheckBattleExtraBonus(userId, settle.BattleType, true); if (beforeAD) { settle.ExtraBonusFlag = 1; } //合作奖励列表 var coopBonusList = new TBonusList(); //宝箱碎片=基础奖励 + 战前广告加成 var err = GetCoopRewardCount(userId, settle.Round, battleRes.rewardChestCountList, beforeAD, out int shardCount, out int adsCount, out int extraCount); if (err != ErrorCode.Success) { return(err); } // 基础 err = coopBonusList.AddItem(userId, ConfigConstants.COOP_CHESTSHARD_ITEMID, shardCount); if (err != ErrorCode.Success) { return(err); } // 广告 err = coopBonusList.AddItem(userId, ConfigConstants.COOP_CHESTSHARD_ITEMID, adsCount); if (err != ErrorCode.Success) { return(err); } // 活动or状态 err = coopBonusList.AddItem(userId, ConfigConstants.COOP_CHESTSHARD_ITEMID, extraCount); if (err != ErrorCode.Success) { return(err); } //添加奖励 err = ItemService.AddBonus(userId, coopBonusList, AssetReason.BattleSettleCoop); if (err != ErrorCode.Success) { return(err); } //返回奖励 settle.BonusOutput = new TBonusOutput() { BonusList = coopBonusList, }; } return(ErrorCode.Success); }
/// <summary> /// 玩家战斗结算 - 挑战模式 /// </summary> private static ErrorCode SettleUserPK(int userId, TBattleSettle settle) { if (settle == null) { Logger.LogError($"User[{userId}]: SettleUserPk Para TBattleSettle settle is null"); return(ErrorCode.FuncParameterIsNull); } //玩家创建房间的战斗不结算 if (settle.IsManual) { return(ErrorCode.Success); } var profile = TUserProfile.Cache.FindKey(userId); if (profile == null) { Logger.LogError($"User[{userId}]: TUserProfile.Cache.FindKey({userId}) == null"); return(ErrorCode.DataNotFound); } //顺序敏感 //触发任务 - 完成任意战斗 TaskCenterService.Update(userId, ConditionType.BATTLE, TaskOpType.Add, 1); //胜利 if (settle.IsMyWin) { //触发任务 - 完成PVP战斗胜利 TaskCenterService.Update(userId, ConditionType.PKWIN, TaskOpType.Add, 1); //战斗前广告加成 bool beforeAD = UserService.CheckBattleExtraBonus(userId, settle.BattleType, true); if (beforeAD) { settle.ExtraBonusFlag = 1; } //更新挑战档案 ProfileService.UpdatePKBattle(profile, settle.IsMyWin, beforeAD, out int addScore, out int addGold); //创建结算奖励 var bonusList = new TBonusList(); //金币奖励 var err = bonusList.AddItem(userId, ConfigConstants.COIN_ITEMID, addGold); if (err != ErrorCode.Success) { return(err); } //添加奖励 err = ItemService.AddBonus(userId, bonusList, AssetReason.BattleSettlePK); if (err != ErrorCode.Success) { return(err); } //返回奖励 settle.BonusOutput = new TBonusOutput() { BonusList = bonusList, }; //创建预存战斗后胜利看广告的奖励 var afterADBonusList = new TBonusList(userId, bonusList); err = afterADBonusList.AddItem(userId, ConfigConstants.SCORE_ITEMID, addScore); if (err != ErrorCode.Success) { return(err); } //返回战斗后胜利看广告的奖励倍数 bonusList.ExtraFactor = ExtraBonusService.TrySaveExtraBonus(userId, ExtraBonusType.PKWINBONUS, afterADBonusList); } //失败 else { //更新挑战档案 ProfileService.UpdatePKBattle(profile, settle.IsMyWin, false, out int addScore, out int addGold); settle.ExtraBonusFlag = ExtraBonusService.TrySaveExtraBonus(userId, ExtraBonusType.PKLOSECHEST, null) > 0 ? 2 : 0; } TUserProfile.Cache.AddOrUpdate(profile); return(ErrorCode.Success); }