using System.Collections.Generic; using ProtoCSStruct; using Sog; namespace Game { public static class SignSvc { public static void OnDailyRefresh(PlayerOnGame player, ref DBActInfo activityInfo) { var actId = activityInfo.ActID; ref var signActData = ref player.RoleData.ActExtraInfo.SignActData; var index = -1; for (var i = 0; i < signActData.Count; i++) { if (signActData[i].ActId == actId) { index = i; break; } } if (index < 0) { return; } signActData[index].Num = 0; //补签次数 SyncData(player); } public static void InitOrResetData(PlayerOnGame player, int actId, ActivityState state) { var signActData = player.RoleData.ActExtraInfo.SignActData; var index = -1; for (int i = 0; i < signActData.Count; i++) { if (signActData[i].ActId == actId) { index = i; break; } } var change = false; if (index < 0 && state == ActivityState.InProgress) //添加一个活动进去 { var actDesc = ActivityDescMgr.Instance.GetConfig(actId); var duration = actDesc.duration; //七天一轮询 var openDay = GameServerUtils.GetOpenDay(player.RealmID); //开服了多少天 int startDay = 0; if (duration > 0) { if (openDay > duration) //待遇一个周期了 { var openTimeDate = ActivitySvc.GetActOpenTimeDate(player, actId); startDay = GameServerUtils.GetOpenDay(player.RealmID, openTimeDate) - 1; } } var sign = new SignActData { ActId = actId, StartDay = startDay, }; player.RoleData.ActExtraInfo.SignActData.Add(sign); change = true; } if (index >= 0 && (state is ActivityState.ActivityEnded or ActivityState.GameplayEnded)) { SendMail(player, signActData[index]); player.RoleData.ActExtraInfo.SignActData.RemoveAt(index); change = true; } if (!change) return; player.MakeDirty(); SyncData(player); } public static void OnBuySuccess(PlayerOnGame player, int itemId, uint payDiamond, uint addDiamond, uint money, bool isPlayerFirstPay, long payTime3rd, ref CSPayGoogleSuccessRes csRes) { var payDiamondDesc = PayDiamondDescMgr.Instance.GetConfig(itemId); if (payDiamondDesc == null || payDiamondDesc.activityId == 0) { return; } if (payDiamondDesc.goodsType != PayGoodsType.LoopSign) { return; } var actId = payDiamondDesc.activityId; var activityDesc = ActivityDescMgr.Instance.GetConfig(actId); if (activityDesc == null) { return; } var isSign = activityDesc.type == ActivityType.LoopSign || activityDesc.type == ActivityType.Sign; if (!isSign) { return; } var state = ActivitySvc.GetActivityState(player, actId); if (state != ActivityState.InProgress) { return; } ref var signActData = ref player.RoleData.ActExtraInfo.SignActData; var index = -1; for (int i = 0; i < signActData.Count; i++) { if (signActData[i].ActId == actId) { index = i; break; } } if (index < 0) { return; } if (signActData[index].IsPay) { return; } signActData[index].IsPay = true; ref var recordsData = ref signActData[index]; var unify = new UnifyOp(player, BillChangeItemReason.SignDailyAct); PaySendReward(unify, ref recordsData.Records, actId); unify.DoOp(sendGetItemMsg: true); player.MakeDirty(); SyncData(player); } private static void PaySendReward(UnifyOp unify, ref RepeatedSignRecord_32 records, int actId) { var subType = ActivityDescMgr.Instance.GetConfig(actId).subType; for (var i = 0; i < records.Count; i++) { ref var record = ref records[i]; if (record.FreeState && !record.PayState) { var desc = SignRewardDescMgr.Instance.GetConfig(subType, record.Day); if (desc != null) { MergePayReward(unify, ref record, true, desc); } } } } //领取签到奖励 public static void Award(PlayerOnGame player, StructPacket packet) { var res = new CSSignGetAwardRes(); ref var req = ref packet.GetMessage(); var actId = req.ActId; var day = req.Day; ref var signActData = ref player.RoleData.ActExtraInfo.SignActData; var state = ActivitySvc.GetActivityState(player, actId); if (state != ActivityState.InProgress) { res.Ret = (int)CSErrCode.FunctionNotOpen; player.SendToClient((int)CSGameMsgID.SignGetAwardRes, ref res); return; } var index = -1; for (var i = 0; i < signActData.Count; i++) { if (signActData[i].ActId == actId) { index = i; break; } } if (index < 0) { res.Ret = (int)CSErrCode.DescNotFound; player.SendToClient((int)CSGameMsgID.SignGetAwardRes, ref res); return; } ref var statData = ref signActData[index]; var openDay = GameServerUtils.GetOpenDay(player.RealmID) - statData.StartDay; if (day > openDay) { //时间未到 res.Ret = (int)CSErrCode.SysFailure; player.SendToClient((int)CSGameMsgID.SignGetAwardRes, ref res); return; } ref var records = ref statData.Records; var unify = new UnifyOp(player, BillChangeItemReason.SignDailyAct); SendReward(player, unify, statData.IsPay, ref records, actId, day); unify.DoOp(sendGetItemMsg: true); player.MakeDirty(); player.SendToClient((int)CSGameMsgID.SignGetAwardRes, ref res); SyncData(player); GameTALogUtils.LogSign(player,actId,1,day); } //补签 public static void ReSingDaily(PlayerOnGame player, StructPacket packet) { var req = packet.GetMessage(); var actId = req.ActId; var day = req.Day; var res = new CSSignReSingRes(); ref var signActData = ref player.RoleData.ActExtraInfo.SignActData; if (!ActivitySvc.IsActivityInProgress(player, actId)) { res.Ret = (int)CSErrCode.FunctionNotOpen; player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); return; } var index = -1; for (var i = 0; i < signActData.Count; i++) { if (signActData[i].ActId == actId) { index = i; break; } } if (index < 0) { res.Ret = (int)CSErrCode.DescNotFound; player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); return; } ref var statData = ref signActData[index]; var openDay = GameServerUtils.GetOpenDay(player.RealmID) - statData.StartDay; if (day >= openDay) { //时间未到或者当日不可补签 res.Ret = (int)CSErrCode.SysFailure; player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); return; } var loopDesc = CommParamDescMgr.Instance.LoopSign1001; if (loopDesc.int_list.Length > 0) { var unify = new UnifyOp(player, BillChangeItemReason.SignDailyAct); var count = unify.GetItemCount(loopDesc.int_val, loopDesc.str_val); if (count < loopDesc.int_list[0]) { res.Ret = (int)CSErrCode.SysFailure; player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); return; } unify.CostGoods(loopDesc.int_val, loopDesc.str_val, loopDesc.int_list[0]); var ret = unify.DoOp(); if (ret != CSErrCode.None) { res.Ret = (int)ret; player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); return; } } ref var records = ref statData.Records; var rewardUnify = new UnifyOp(player, BillChangeItemReason.SignDailyAct); SendReward(player, rewardUnify, statData.IsPay, ref records, actId, day); rewardUnify.DoOp(notifyClient: true, sendGetItemMsg: true); player.MakeDirty(); player.SendToClient((int)CSGameMsgID.SignReSingRes, ref res); SyncData(player); GameTALogUtils.LogSign(player,actId,2,day); } private static void SendMail(PlayerOnGame player, SignActData signActData) { var actId = signActData.ActId; var activityDesc = ActivityDescMgr.Instance.GetConfig(actId); if (activityDesc == null || activityDesc.mailId == 0) { return; } if (!signActData.IsPay) { return; } var subType = ActivityDescMgr.Instance.GetConfig(actId).subType; var group = SignRewardDescMgr.Instance.GetGroup(subType); var list = new List(); foreach (var kv in group) { var desc = kv.Value; var index = -1; for (int i = 0; i < signActData.Records.Count; i++) { if (signActData.Records[i].Day == desc.day) { index = i; break; } } if (index > -1 && signActData.Records[index].PayState) { continue; } foreach (var rewards in desc.paySignItem) { list.Add(new RewardItemRW() { type = rewards.type, code = rewards.id, amount = rewards.value }); } } if (list.Count <= 0) { return; } MailSender.SendNewMailToPlayer(player, activityDesc.mailId, list); } //签到发奖 private static void SendReward(PlayerOnGame player, UnifyOp unify, bool isPay, ref RepeatedSignRecord_32 records, int actId, int day) { var activityDesc = ActivityDescMgr.Instance.GetConfig(actId); var rewardDesc = SignRewardDescMgr.Instance.GetConfig(activityDesc.subType, day); if (rewardDesc == null) { return; } var index = -1; for (int i = 0; i < records.Count; i++) { if (records[i].Day == day) { index = i; } } if (index > -1) { ref var record = ref records[index]; var freeState = record.FreeState; var payState = record.PayState; if (freeState && !isPay) { //都领取了 没有支付,免费得领取了 return; } if (isPay && payState) //有支付,支付得没领取 { return; } MergeReward(unify, ref record, isPay, rewardDesc); } else //没有这个奖励 { var record = new SignRecord { Day = day }; MergeReward(unify, ref record, isPay, rewardDesc); records.Add(record); } TaskEXEvent.TriggerGetSignRwdN(player); } private static void MergeReward(UnifyOp unify, ref SignRecord record, bool isPay, SignRewardDesc rewardDesc) { MergeFreeReward(unify, ref record, isPay, rewardDesc); MergePayReward(unify, ref record, isPay, rewardDesc); } private static void MergeFreeReward(UnifyOp unify, ref SignRecord record, bool isPay, SignRewardDesc rewardDesc) { if (!record.FreeState) { foreach (var item in rewardDesc.signItem) { unify.AddGoods(item.type, item.id, item.value); } record.FreeState = true; } } private static void MergePayReward(UnifyOp unify, ref SignRecord record, bool isPay, SignRewardDesc rewardDesc) { if (isPay && !record.PayState) { foreach (var item in rewardDesc.paySignItem) { unify.AddGoods(item.type, item.id, item.value); } record.PayState = true; } } private static void SyncData(PlayerOnGame player) { var sync = new CSSignInfoSync(); sync.SignActData.CopyFrom(ref player.RoleData.ActExtraInfo.SignActData); player.SendToClient((int)CSGameMsgID.SignInfoSync, ref sync); } } }