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.
581 lines
20 KiB
581 lines
20 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using ProtoCSStruct;
|
|
using Sog;
|
|
|
|
namespace Game
|
|
{
|
|
public class BattlePassSvc
|
|
{
|
|
public static void OnRoleEnter(PlayerOnGame player, ActivityType type)
|
|
{
|
|
}
|
|
|
|
public static void OnStateChange(PlayerOnGame player, int actId, ActivityState state)
|
|
{
|
|
switch (state)
|
|
{
|
|
case ActivityState.ActivityEnded:
|
|
SendRewardMail(player, actId);
|
|
RemoveBattlePass(player, actId);
|
|
RemoveBattleItem(player, actId);
|
|
break;
|
|
case ActivityState.InProgress:
|
|
AddBattlePass(player, actId);
|
|
break;
|
|
case ActivityState.GameplayEnded:
|
|
RemoveBattlePass(player, actId);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
public static void OnDailyRefresh(PlayerOnGame player, ref DBActInfo activityInfo)
|
|
{
|
|
return;
|
|
//由于任务配置在活动上面得到,所以这里不需要处理
|
|
var actId = activityInfo.ActID;
|
|
var index = -1;
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
|
|
for (var i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (index < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ref var battlePass = ref battlePassData[index];
|
|
var type = battlePass.ReasonType;
|
|
switch ((ReasonType)type)
|
|
{
|
|
case ReasonType.QuestEXDesc:
|
|
//todo 刷新任务
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//购买成功之后
|
|
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.passCardType == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var activityId = payDiamondDesc.activityId;
|
|
var state = ActivitySvc.GetActivityState(player, activityId);
|
|
if (state != ActivityState.InProgress)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var activityDesc = ActivityDescMgr.Instance.GetConfig(activityId);
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
var index = -1;
|
|
for (var i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == activityId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (index >= 0)
|
|
{
|
|
var activeIndex = activityDesc.subType == payDiamondDesc.passCardType ? 0 : 1; //激活的挡位,默认为0.高级档1
|
|
battlePassData[index].Active[activeIndex] = true;
|
|
BuyUnLockSeq(player, activityId, payDiamondDesc.unlockToLevel);
|
|
player.MakeDirty();
|
|
SyncBattlesInfo(player);
|
|
}
|
|
}
|
|
|
|
|
|
private static void BuyUnLockSeq(PlayerOnGame player, int actId, int seq)
|
|
{
|
|
if (seq == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
var index = -1;
|
|
for (var i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (index < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var activityDesc = ActivityDescMgr.Instance.GetConfig(actId);
|
|
ref var battlePass = ref battlePassData[index];
|
|
var groupDesc = PassCardDescMgr.Instance.GetGroup(activityDesc.subType);
|
|
var type = groupDesc.First().Value.reasonType;
|
|
switch (type)
|
|
{
|
|
case ReasonType.PowerCostY:
|
|
case ReasonType.PowerCost:
|
|
{
|
|
var point = 0;
|
|
|
|
foreach (var kv in groupDesc)
|
|
{
|
|
if (kv.Value.seq == seq)
|
|
{
|
|
point = kv.Value.reasonTypeNum[0];
|
|
break;
|
|
}
|
|
}
|
|
battlePass.Point = Math.Max(point, battlePass.Point);
|
|
}
|
|
break;
|
|
default:
|
|
TraceLog.Debug("BattlePass.BuyUnLockSeq type not supported type={0}", type);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
private static void AddBattlePass(PlayerOnGame player, int actId)
|
|
{
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
for (int i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
var activityDesc = ActivityDescMgr.Instance.GetConfig(actId);
|
|
var desc = PassCardDescMgr.Instance.GetConfig(activityDesc.subType, 1);
|
|
var defVal = GetConductionDefaultValue(player, desc.reasonType, desc.reasonTypeNum);
|
|
var active = new RepeatedBool_2();
|
|
active.Add(false);
|
|
active.Add(false);
|
|
var battle = new BattlePassData()
|
|
{
|
|
Active = active,
|
|
ActId = actId,
|
|
StartTime = ActivitySvc.GetActOpenTimeDate(player, actId),
|
|
EndTime = ActivitySvc.GetLastTimeToEnd(player, actId),
|
|
Point = defVal
|
|
};
|
|
battlePassData.Add(battle);
|
|
AddBattlePassQuest(player, actId);
|
|
SyncBattlesInfo(player);
|
|
}
|
|
|
|
//领取奖励
|
|
public static void Award(PlayerOnGame player, StructPacket packet)
|
|
{
|
|
ref var req = ref packet.GetMessage<CSBattlePassGetAwardReq>();
|
|
var actId = req.ActId;
|
|
var cmd = (int)CSGameMsgID.BattlePassAwardRes;
|
|
var res = new CSBattlePassGetAwardRes();
|
|
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
var index = -1;
|
|
for (int i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
index = i;
|
|
}
|
|
}
|
|
|
|
if (index == -1)
|
|
{
|
|
res.Ret = CSErrCode.Fail;
|
|
player.SendToClient(cmd, ref res);
|
|
return;
|
|
}
|
|
|
|
ref var battlePass = ref battlePassData[index];
|
|
if (ActivitySvc.GetActivityState(player, actId) != ActivityState.InProgress)
|
|
{
|
|
res.Ret = CSErrCode.Fail;
|
|
player.SendToClient(cmd, ref res);
|
|
return;
|
|
}
|
|
|
|
var rewards = GetAllCanAwardList(player, ref battlePass, req.FreeIndex, req.PayIndex, req.SupPayIndex);
|
|
var unifyOp = new UnifyOp(player, BillChangeItemReason.BattlePass);
|
|
if (rewards != null)
|
|
{
|
|
foreach (var reward in rewards)
|
|
{
|
|
unifyOp.AddGoods(reward.Type, reward.Id.ToString(), reward.Value);
|
|
}
|
|
|
|
unifyOp.DoOp(sendGetItemMsg: true);
|
|
}
|
|
|
|
player.MakeDirty();
|
|
SyncBattlesInfo(player);
|
|
player.SendToClient(cmd, ref res);
|
|
}
|
|
|
|
public static void SyncBattlesInfo(PlayerOnGame player)
|
|
{
|
|
//发送给客户端
|
|
var sync = new CSBattlePassInfoSync();
|
|
sync.BattlePassData.CopyFrom(ref player.RoleData.ActExtraInfo.BattlePassData);
|
|
player.SendToClient((int)CSGameMsgID.BattlePassInfoSyn, ref sync);
|
|
}
|
|
|
|
//添加点数:可从道具、背包、任务等不同渠道
|
|
public static void AddPoint(PlayerOnGame player, ReasonType type, int num)
|
|
{
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
var change = false;
|
|
for (int i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
ref var battlePass = ref battlePassData[i];
|
|
var actId = battlePass.ActId;
|
|
if (ActivitySvc.GetActivityState(player, actId) != ActivityState.InProgress)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var passCardId = ActivityDescMgr.Instance.GetConfig(actId).subType;
|
|
var group = PassCardDescMgr.Instance.GetGroup(passCardId);
|
|
var oneType = group.Values[0].reasonType;
|
|
if (type != oneType)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
switch (type)
|
|
{
|
|
case ReasonType.Level:
|
|
case ReasonType.PowerCost:
|
|
battlePass.Point += num;
|
|
break;
|
|
case ReasonType.PowerCostY:
|
|
battlePass.Point = num;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
change = true;
|
|
}
|
|
|
|
if (change)
|
|
{
|
|
SyncBattlesInfo(player);
|
|
player.MakeDirty();
|
|
}
|
|
}
|
|
|
|
|
|
//把没有领取的奖励通过邮件发送给玩家
|
|
private static void SendRewardMail(PlayerOnGame player, int actId)
|
|
{
|
|
var activityDesc = ActivityDescMgr.Instance.GetConfig(actId);
|
|
if (activityDesc.mailId == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
var index = -1;
|
|
for (int i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
index = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (index <= -1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ref var battlePass = ref battlePassData[index];
|
|
if (battlePass.SendReward)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var rewards = GetAllCanAwardList(player, ref battlePass);
|
|
battlePass.SendReward = true;
|
|
if ((rewards == null || rewards.Count == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var list = new List<RewardItemRW>();
|
|
for (var i = 0; i < rewards.Count; i++)
|
|
{
|
|
if (rewards[i].Type == 0 || rewards[i].Value == 0 || string.IsNullOrEmpty(rewards[i].Id.ToString()))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
list.Add(new RewardItemRW()
|
|
{ type = rewards[i].Type, code = rewards[i].Id.ToString(), amount = rewards[i].Value });
|
|
}
|
|
|
|
MailSender.SendNewMailToPlayer(player, activityDesc.mailId, list);
|
|
}
|
|
|
|
|
|
private static void RemoveBattlePass(PlayerOnGame player, int actId)
|
|
{
|
|
ref var battlePassData = ref player.RoleData.ActExtraInfo.BattlePassData;
|
|
for (int i = 0; i < battlePassData.Count; i++)
|
|
{
|
|
if (battlePassData[i].ActId == actId)
|
|
{
|
|
battlePassData.RemoveAt(i);
|
|
return;
|
|
}
|
|
}
|
|
|
|
SyncBattlesInfo(player);
|
|
RemoveBattlePassQuest(player, actId);
|
|
}
|
|
|
|
private static void AddBattlePassQuest(PlayerOnGame player, int actId)
|
|
{
|
|
}
|
|
|
|
private static void RemoveBattlePassQuest(PlayerOnGame player, int actId)
|
|
{
|
|
}
|
|
|
|
private static void RemoveBattleItem(PlayerOnGame player, int actId)
|
|
{
|
|
var passCardId = ActivityDescMgr.Instance.GetConfig(actId).subType;
|
|
var passCardDescList = PassCardDescMgr.Instance.GetGroup(passCardId);
|
|
var desc = passCardDescList.First().Value;
|
|
if (desc.reasonType != ReasonType.ItemNum)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var itemInternalId = desc.reasonTypeNum[0];
|
|
var itemDesc = ItemDescMgr.Instance.GetConfigByInternal(itemInternalId);
|
|
|
|
if (itemDesc == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var unifyOp = new UnifyOp(player, BillChangeItemReason.BattlePass);
|
|
var itemCount = unifyOp.GetItemCount(itemDesc.itemID);
|
|
if (itemCount > 0)
|
|
{
|
|
unifyOp.CostItem(itemDesc.itemID, itemCount);
|
|
unifyOp.DoOp();
|
|
player.MakeDirty();
|
|
}
|
|
}
|
|
|
|
//检查battlepass栏目上的奖励是否达到领取条件
|
|
public static bool CheckItemGainRewardConduction(PlayerOnGame player, PassCardDesc desc, int point)
|
|
{
|
|
switch (desc.reasonType)
|
|
{
|
|
case ReasonType.Level: //level
|
|
return player.RoleBase.Level >= desc.reasonTypeNum[0];
|
|
case ReasonType.QuestEXDesc: //QUEST //todo
|
|
return TaskEXSvc.IsCompleteTask(player, desc.reasonTypeNum[0]) ||
|
|
TaskEXSvc.IsFinishTask(player, desc.reasonTypeNum[0]);
|
|
case ReasonType.PowerCost: //point
|
|
case ReasonType.PowerCostY: //point
|
|
{
|
|
return point >= desc.reasonTypeNum[0];
|
|
}
|
|
case ReasonType.ItemNum: //item num
|
|
{
|
|
var itemInternalId = desc.reasonTypeNum[0];
|
|
var itemDesc = ItemDescMgr.Instance.GetConfigByInternal(itemInternalId);
|
|
var itemCount = UnifyOp.GetItemCount(player, itemDesc.itemID);
|
|
return itemCount >= desc.reasonTypeNum[1];
|
|
}
|
|
case ReasonType.ChapterPass:
|
|
return desc.reasonTypeNum[1] <= player.RoleData.ChapterData.BattleId;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static int GetConductionDefaultValue(PlayerOnGame player, ReasonType reasonType, int[] value)
|
|
{
|
|
switch (reasonType)
|
|
{
|
|
case ReasonType.Level: //level
|
|
return player.RoleBase.Level;
|
|
case ReasonType.PowerCostY:
|
|
return player.RoleData.PowerPointData.CostPower;
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//获取免费奖励
|
|
public static List<TypeIDValueString> GetFreeAward(PassCardDesc passCard)
|
|
{
|
|
return passCard.free.Select(t => new TypeIDValueString
|
|
{
|
|
Type = t.Type,
|
|
Id = new FixedStructString64(t.Id), Value = t.Value
|
|
}).ToList();
|
|
}
|
|
|
|
//获取付费档奖励
|
|
public static List<TypeIDValueString> GetPayAward(PassCardDesc passCard)
|
|
{
|
|
return passCard.pay.Select(t => new TypeIDValueString
|
|
{
|
|
Type = t.Type,
|
|
Id = new FixedStructString64(t.Id), Value = t.Value
|
|
}).ToList();
|
|
}
|
|
|
|
|
|
//获取当前可以领取的奖励
|
|
private static List<TypeIDValueString> GetAllCanAwardList(PlayerOnGame player, ref BattlePassData battlePass,
|
|
int freeIndex = 0, int payIndex = 0, int subPayIndex = 0)
|
|
{
|
|
var list = new List<TypeIDValueString>();
|
|
|
|
var activityDesc = ActivityDescMgr.Instance.GetConfig(battlePass.ActId);
|
|
if (activityDesc.subType == 0)
|
|
{
|
|
return list;
|
|
}
|
|
|
|
var passCardDesc = PassCardDescMgr.Instance.GetGroup(activityDesc.subType);
|
|
var desc = PassCardDescMgr.Instance.GetConfig(activityDesc.subType, Math.Max(freeIndex, payIndex));
|
|
list = GetCanAward(player, ref battlePass, desc, freeIndex > 0, payIndex > 0);
|
|
if (subPayIndex > 0 && activityDesc.param1.Length != 0)
|
|
{
|
|
var passCard = PassCardDescMgr.Instance.GetConfig(int.Parse(activityDesc.param1[0]), subPayIndex);
|
|
var reward = GetCanSupAward(player, ref battlePass, passCard);
|
|
if (reward != null)
|
|
{
|
|
GenericUtils.Merge(list, reward);
|
|
}
|
|
}
|
|
|
|
if (freeIndex > 0 || payIndex > 0 || subPayIndex > 0) //单独领取其中某一个
|
|
{
|
|
return list;
|
|
}
|
|
|
|
foreach (var passCard in passCardDesc.Select(kv => kv.Value))
|
|
{
|
|
var reward = GetCanAward(player, ref battlePass, passCard);
|
|
if (reward != null)
|
|
{
|
|
GenericUtils.Merge(list, reward);
|
|
}
|
|
}
|
|
|
|
if (activityDesc.param1.Length != 0)
|
|
{
|
|
var supPassCardDesc = PassCardDescMgr.Instance.GetGroup(int.Parse(activityDesc.param1[0]));
|
|
foreach (var passCard in supPassCardDesc.Select(kv => kv.Value))
|
|
{
|
|
var reward = GetCanSupAward(player, ref battlePass, passCard);
|
|
if (reward != null)
|
|
{
|
|
GenericUtils.Merge(list, reward);
|
|
}
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
private static List<TypeIDValueString> GetCanAward(PlayerOnGame player, ref BattlePassData battlePass,
|
|
PassCardDesc passCard, bool gainFree = true, bool gainPay = true)
|
|
{
|
|
var ret = new List<TypeIDValueString>();
|
|
if (passCard == null)
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
var canGain = CheckItemGainRewardConduction(player, passCard, battlePass.Point);
|
|
if (!canGain)
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
if (gainFree && !battlePass.FreeIndex.Contains(passCard.seq))
|
|
{
|
|
var freeAward = GetFreeAward(passCard);
|
|
GenericUtils.Merge(ret, freeAward);
|
|
battlePass.FreeIndex.Add(passCard.seq);
|
|
}
|
|
|
|
if (battlePass.Active.Count == 0)
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
if (gainPay && battlePass.Active[0] && !battlePass.PayIndex.Contains(passCard.seq))
|
|
{
|
|
var payAward = GetPayAward(passCard);
|
|
GenericUtils.Merge(ret, payAward);
|
|
battlePass.PayIndex.Add(passCard.seq);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
private static List<TypeIDValueString> GetCanSupAward(PlayerOnGame player, ref BattlePassData battlePass,
|
|
PassCardDesc passCard)
|
|
{
|
|
var canGain = CheckItemGainRewardConduction(player, passCard, battlePass.Point);
|
|
if (!canGain)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if (battlePass.Active.Count != 2)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if (battlePass.Active[1] && !battlePass.SupPayIndex.Contains(passCard.seq))
|
|
{
|
|
var payAward = GetPayAward(passCard);
|
|
battlePass.SupPayIndex.Add(passCard.seq);
|
|
return payAward;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|