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

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