using GameServer.Reward; using ServerCommon; using ServerControlCenter; using ServerCore; using ServerBase; namespace GameServer { public class ClaimRewardReference { public string m_user_guid { get; set; } = string.Empty; public Int32 m_claim_id { get; set; } = 0; public MetaAssets.ClaimType m_claim_type { get; set; } = MetaAssets.ClaimType.Normal; public Int32 m_reward_group_id { get; set; } = 0; public List m_reward_data { get; set; } = new(); public ClaimMetaData? m_meta_data { get; set; } = null; public ServerCommon.Claim? m_claim { get; set; } = null; public List m_rewared_money { get; set; } = new(); public List m_rewarded_items { get; set; } = new(); public CommonResult m_common_result { get; set; } = new(); } public class ClaimRewardAction : EntityActionBase { public ClaimRewardAction(EntityBase owner) : base(owner) { } public override void onClear() { return; } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public async Task rewardClaim(ClaimRewardReference claimRewardRef) { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); setActiveIdx(claimRewardRef); IReward reward_proc = new RewardClaim(owner, claimRewardRef.m_user_guid, claimRewardRef); var result = await RewardManager.It.proceedRewardProcess(reward_proc); if (result.isFail()) { return result; } RewardManager.It.postRewardProcess(reward_proc); return new(); } private void setActiveIdx(ClaimRewardReference claimRewardRef) { DateTime now = DateTimeHelper.Current; NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_meta_data, () => $"claimRewardRef.m_meta_data is null !!!"); NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_claim, () => $"claimRewardRef.m_claim is null !!!"); int lastRewarIdx = claimRewardRef.m_meta_data.DetailInfo.Last().Value.Idx; var claimAttribute = claimRewardRef.m_claim.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(claimAttribute, () => $"claimAttribute is null !!!"); claimAttribute.ActiveTime = now; int nextActiveIdx = claimAttribute.ActiveRewardIdx + 1; if (nextActiveIdx > lastRewarIdx) { claimAttribute.IsComplete = 1; nextActiveIdx = 0; } claimAttribute.ActiveRewardIdx = nextActiveIdx; claimAttribute.modifiedEntityAttribute(); } public Result claimRewardConditionCheck(ref ClaimRewardReference claimRewardRef) { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); MetaAssets.ClaimType type = claimRewardRef.m_claim_type; (var result, var claim_meta) = ClaimRewardHelper.getClaimMeta(claimRewardRef.m_claim_id, type); if (result.isFail()) return result; claimRewardRef.m_meta_data = claim_meta; var claim_action = owner.getEntityAction(); result = claim_action.getClaim(claimRewardRef.m_claim_id, type, out var claim); if (result.isFail()) return result; claimRewardRef.m_claim = claim; result = timeConditionCheck(ref claimRewardRef); if (result.isFail()) return result; result = rewardConditionCheck(ref claimRewardRef); if (result.isFail()) return result; return result; } private Result timeConditionCheck(ref ClaimRewardReference claimRewardRef) { var result = new Result(); NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_claim, () => $"claimRewardRef.m_claim is null !!!"); NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_meta_data, () => $"claimRewardRef.m_meta_data is null !!!"); var attribute = claimRewardRef.m_claim.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); var active_idx = attribute.ActiveRewardIdx; if (false == claimRewardRef.m_meta_data.DetailInfo.TryGetValue(active_idx, out var detailInfo)) { var err_msg = $"detailInfo activeIdx = {active_idx} Data not exist"; result.setFail(ServerErrorCode.ClaimInfoNotExist, err_msg); return result; } var cool_time = detailInfo.CoolTime; var now_dt = DateTimeHelper.Current; var active_time = attribute.ActiveTime; if (now_dt < claimRewardRef.m_meta_data.StartTime || claimRewardRef.m_meta_data.EndTime < now_dt) { var err_msg = $"Claim Not Correct Time activeIdx = {active_idx} metaData.StartTime : {claimRewardRef.m_meta_data.StartTime}, metaData.EndTime : {claimRewardRef.m_meta_data.EndTime} "; result.setFail(ServerErrorCode.ClaimRewardEventEnd, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var apply_cool_second = active_time.AddSeconds(cool_time); if (apply_cool_second > now_dt) { var err_msg = $"HandleClaimRewardReq not enough Time to activeIdx = {active_idx} Data not exist"; result.setFail(ServerErrorCode.ClaimRewardNotEnoughTime, err_msg); return result; } return result; } private Result rewardConditionCheck(ref ClaimRewardReference claimRewardRef) { var result = new Result(); NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_claim, () => $"claimRewardRef.m_claim is null !!!"); NullReferenceCheckHelper.throwIfNull(claimRewardRef.m_meta_data, () => $"claimRewardRef.m_meta_data is null !!!"); var attribute = claimRewardRef.m_claim.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); var active_idx = attribute.ActiveRewardIdx; if (false == claimRewardRef.m_meta_data.DetailInfo.TryGetValue(active_idx, out var detailInfo)) { var err_msg = $"detailInfo activeIdx = {active_idx} Data not exist"; result.setFail(ServerErrorCode.ClaimInfoNotExist, err_msg); return result; } int rewardGroupId = detailInfo.RewardGroupId; if (!MetaData.Instance._RewardMetaTable.TryGetValue(rewardGroupId, out var rewardList)) { var err_msg = $"_RewardDataTable not exist info rewardGroupId = {rewardGroupId}"; result.setFail(ServerErrorCode.RewardInfoNotExist, err_msg); return result; } claimRewardRef.m_reward_group_id = rewardGroupId; claimRewardRef.m_reward_data.Clear(); foreach (var reward in rewardList) { claimRewardRef.m_reward_data.Add(reward.Reward); } return result; } } }