using ProtoCSStruct; using Sog; namespace Game { //统一一些免费、每日免费,每周免费等等的奖励 得领取处理 public static class FreeRewardSvc { public static void OnEnter(PlayerOnGame player) { InitOrReset(player); } public static void OnNewDay(PlayerOnGame player, bool notify) { InitOrReset(player); } public static void PlayerBorn(PlayerOnGame player) { InitOrReset(player); } private static void InitOrReset(PlayerOnGame player) { ref var rewardData = ref player.RoleData.FreeRewardData; var now = GameServerUtils.GetTimeSecond(); var change = false; if (rewardData.Daily.LastUpdateTime == 0) { rewardData.Daily.LastUpdateTime = now - AppTime.SECONDS_ADAY; change = true; } if (!AppTime.IsSameDay(now, rewardData.Daily.LastUpdateTime)) { rewardData.Daily.FreeIdList.Clear(); rewardData.Daily.LastUpdateTime = now; change = true; } if (change) { player.MakeDirty(); SyncFreeData(player); } } public static void OnFreeDayReq(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var type = req.Type; var freeId = req.FreeId; var desc = CommParamDescMgr.Instance.GetConfigByInternal(freeId); ref var res = ref CSFreeRewardRes.Parser.GetMessageClear(); if (desc == null) { res.Ret = CSErrCode.DescNotFound; player.SendToClient((int)CSGameMsgID.FreeRewardRes, ref res); return; } switch (type) { case 0: //每日免费 { ref var daily = ref player.RoleData.FreeRewardData.Daily; if (daily.FreeIdList.Contains(freeId)) { break; } daily.FreeIdList.Add(freeId); var id = desc.str_val; var val = desc.int_val; var op = new UnifyOp(player, BillChangeItemReason.FreeRewardSvc); op.AddItem(id, val); op.DoOp(sendGetItemMsg: true); } break; } SyncFreeData(player); res.FreeId = freeId; player.SendToClient((int)CSGameMsgID.FreeRewardRes, ref res); player.MakeDirty(); } private static void SyncFreeData(PlayerOnGame player) { var rewardData = player.RoleData.FreeRewardData; ref var sync = ref CSFreeDataSync.Parser.GetMessageClear(); sync.Data.CopyFrom(ref rewardData); player.SendToClient((int)CSGameMsgID.FreeRewardSync, ref sync); } } }