using System.Collections.Generic; using ProtoCSStruct; using Sog; namespace Game; //调查问卷 public class QuestionnaireSvc : AbstractActivity { private static readonly int QUESTIONNAIRE_STATUS_NONE = 0; private static readonly int QUESTIONNAIRE_STATUS_CLICK = 1; private static readonly int QUESTIONNAIRE_STATUS_DONE = 2; //发奖 public override void OnRoleEnter(PlayerOnGame player) { } protected override void OnStateChange(PlayerOnGame player, int actId, ActivityState state) { if (state == ActivityState.InProgress) { Init(player, actId); } else { ref var questionData = ref player.RoleData.ActExtraInfo.QuestionData; for (var i = 0; i < questionData.Count; i++) { if (questionData[i].ActId == actId) { if (questionData[i].Status == QUESTIONNAIRE_STATUS_CLICK) { SendRewardMail(player, actId); } questionData.RemoveAt(i); break; } } } SendSync(player); } private static void SendRewardMail(PlayerOnGame player, int actId) { var desc = ActivityDescMgr.Instance.GetConfig(actId); if (desc.mailId == 0) { return; } var rewardId = desc.param1[0]; var reward = RewardSvc.Reward(player, rewardId, false, false); MailSender.SendNewMailToPlayer(player, desc.mailId, reward); } public override void OnSystemUnlock(PlayerOnGame player, int sysId) { } protected override void OnDailyRefresh(PlayerOnGame player, ref DBActInfo activityInfo) { } public static void Init(PlayerOnGame player, int actId) { ref var questionData = ref player.RoleData.ActExtraInfo.QuestionData; var index = -1; for (int i = 0; i < questionData.Count; i++) { if (questionData[i].ActId == actId) { index = i; break; } } if (index == -1) { questionData.Add(new QuestionnaireData() { ActId = actId }); } else { questionData[index].Status = QUESTIONNAIRE_STATUS_NONE; } player.MakeDirty(); } private static void SendSync(PlayerOnGame player) { var syncInfo = new QuestionnaireInfoSync(); syncInfo.QuestionData.CopyFrom(ref player.RoleData.ActExtraInfo.QuestionData); player.SendToClient((int)CSGameMsgID.QuestionnaireRewardSyn, ref syncInfo); } //发送调查问卷奖励邮件 public static int SendQuestionnaireReward(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var actId = req.ActId; var status = req.Status; var res = QuestionnaireRewardRes.Parser.GetMessageClear(); if (status != QUESTIONNAIRE_STATUS_CLICK && status != QUESTIONNAIRE_STATUS_DONE) { player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } var state = ActivitySvc.GetActivityState(player, actId); if (state != ActivityState.InProgress) { AddSendRecord(player, actId); player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } var desc = ActivityDescMgr.Instance.GetConfig(actId); if (desc == null) { AddSendRecord(player, actId); player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } ref var record = ref player.RoleData.ActExtraInfo.QuestionData; var index = -1; for (var i = 0; i < record.Count; i++) { if (record[i].ActId == actId) { index = i; break; } } if (index < 0) { player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } ref var data = ref record[index]; if (data.Status == QUESTIONNAIRE_STATUS_DONE) { player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } if (data.Status == status) { player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); return -1; } data.Status = status; if (status == QUESTIONNAIRE_STATUS_CLICK) //点击链接了 { player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); SendSync(player); player.MakeDirty(); return 0; } //去领奖了 AddSendRecord(player, actId); SendReward(player, actId); player.SendToClient((int)CSGameMsgID.QuestionnaireRewardRes, ref res); SendSync(player); player.MakeDirty(); return 1; } private static void SendReward(PlayerOnGame player, int actId) { var desc = ActivityDescMgr.Instance.GetConfig(actId); var rewardId = desc.param1[0]; RewardSvc.Reward(player, rewardId, true, true); } private static void AddSendRecord(PlayerOnGame player, int actId) { ref var record = ref player.RoleData.ActExtraInfo.QuestionData; for (int i = 0; i < record.Count; i++) { if (record[i].ActId == actId) { record[i].Status = QUESTIONNAIRE_STATUS_DONE; return; } } } }