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.
440 lines
14 KiB
440 lines
14 KiB
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<CSSignGetAwardReq>();
|
|
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<CSSignReSingReq>();
|
|
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<RewardItemRW>();
|
|
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);
|
|
}
|
|
}
|
|
}
|