You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

197 lines
5.6 KiB

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<QuestionnaireRewardReq>();
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;
}
}
}
}