/// <summary> /// 加载配置文件,支持热加载 /// </summary> public void LoadConfig() { Dictionary <int, _DayAward> tmpDict = new Dictionary <int, _DayAward>(); try { XElement xml = XElement.Load(Global.GameResPath(SevenDayConsts.LoginConfig)).Element("GiftList"); foreach (var xmlItem in xml.Elements()) { int day = (int)Global.GetSafeAttributeLong(xmlItem, "ID"); _DayAward award = new _DayAward(); // 通用奖励 string goodsIDs = Global.GetSafeAttributeStr(xmlItem, "GoodsOne"); if (!string.IsNullOrEmpty(goodsIDs)) { string[] fields = goodsIDs.Split('|'); if (fields.Length <= 0) { LogManager.WriteLog(LogTypes.Warning, string.Format("读取{0}活动配置文件中的物品配置项失败", SevenDayConsts.LoginConfig)); } else { award.AllAward.GoodsDataList = HuodongCachingMgr.ParseGoodsDataList(fields, SevenDayConsts.LoginConfig); } } // 职业奖励 goodsIDs = Global.GetSafeAttributeStr(xmlItem, "GoodsTwo"); if (!string.IsNullOrEmpty(goodsIDs)) { string[] fields = goodsIDs.Split('|'); if (fields.Length <= 0) { LogManager.WriteLog(LogTypes.Warning, SevenDayConsts.LoginConfig); } else { award.OccAward.GoodsDataList = HuodongCachingMgr.ParseGoodsDataList(fields, SevenDayConsts.LoginConfig); } } // 限时奖励 string timeGoods = Global.GetSafeAttributeStr(xmlItem, "GoodsThr"); string timeList = Global.GetSafeAttributeStr(xmlItem, "EffectiveTime"); award.TimeAward.Init(timeGoods, timeList, SevenDayConsts.LoginConfig + " 时效性物品"); tmpDict[day] = award; } lock (ConfigMutex) { DayAwardDict = tmpDict; } } catch (Exception ex) { LogManager.WriteLog(LogTypes.Error, string.Format("七日登录活动加载配置失败{0}", SevenDayConsts.LoginConfig), ex); } }
/// <summary> /// 是否有任何可以领取的奖励 /// 用于检测图标更新 /// </summary> /// <param name="client"></param> /// <returns></returns> public bool HasAnyAwardCanGet(GameClient client) { if (client == null) { return(false); } if (!SevenDayActivityMgr.Instance().IsInActivityTime(client)) { return(false); } Dictionary <int, _DayAward> tmpDayAwardDict = null; lock (ConfigMutex) { tmpDayAwardDict = this.DayAwardDict; } if (tmpDayAwardDict == null) { return(false); } Dictionary <int, SevenDayItemData> itemDict = SevenDayActivityMgr.Instance().GetActivityData(client, ESevenDayActType.Charge); if (itemDict == null) { return(false); } lock (itemDict) { foreach (var kvp in itemDict) { int day = kvp.Key; SevenDayItemData itemData = kvp.Value; _DayAward award = null; if (tmpDayAwardDict.TryGetValue(day, out award) && itemData.Params1 * GameManager.GameConfigMgr.GetGameConfigItemInt("money-to-yuanbao", 10) >= award.NeedCharge && itemData.AwardFlag != SevenDayConsts.HadGetAward) { return(true); } } } return(false); }
/// <summary> /// 领取奖励 /// </summary> /// <param name="client"></param> /// <param name="day"></param> /// <returns></returns> public ESevenDayActErrorCode HandleGetAward(GameClient client, int day) { int currDay; if (!SevenDayActivityMgr.Instance().IsInActivityTime(client, out currDay)) { return(ESevenDayActErrorCode.NotInActivityTime); } Dictionary <int, SevenDayItemData> actData = SevenDayActivityMgr.Instance().GetActivityData(client, ESevenDayActType.Login); if (actData == null) { return(ESevenDayActErrorCode.NotInActivityTime); } if (day <= 0 || day > currDay) { return(ESevenDayActErrorCode.NotReachCondition); } Dictionary <int, _DayAward> tmpDayAwardDict = null; lock (ConfigMutex) { tmpDayAwardDict = this.DayAwardDict; } _DayAward dayAward = null; if (tmpDayAwardDict == null || !tmpDayAwardDict.TryGetValue(day, out dayAward)) { return(ESevenDayActErrorCode.ServerConfigError); } lock (actData) { SevenDayItemData data = null; if (!actData.TryGetValue(day, out data)) { return(ESevenDayActErrorCode.NotReachCondition); } if (data.Params1 != SevenDayConsts.HadLoginFlag || data.AwardFlag == SevenDayConsts.HadGetAward) { return(ESevenDayActErrorCode.NotReachCondition); } // 检查背包 int awardGoodsCnt = 0; if (dayAward.AllAward != null && dayAward.AllAward.GoodsDataList != null) { awardGoodsCnt += dayAward.AllAward.GoodsDataList.Count; } if (dayAward.OccAward != null && dayAward.OccAward.GoodsDataList != null) { awardGoodsCnt += dayAward.OccAward.GoodsDataList.Count(_goods => Global.IsRoleOccupationMatchGoods(client, _goods.GoodsID)); } if (dayAward.TimeAward != null) { awardGoodsCnt += dayAward.TimeAward.GoodsCnt(); } if (awardGoodsCnt <= 0 || !Global.CanAddGoodsNum(client, awardGoodsCnt)) { return(ESevenDayActErrorCode.NoBagSpace); } data.AwardFlag = SevenDayConsts.HadGetAward; if (!SevenDayActivityMgr.Instance().UpdateDb(client.ClientData.RoleID, ESevenDayActType.Login, day, data, client.ServerId)) { data.AwardFlag = SevenDayConsts.NotGetAward; return(ESevenDayActErrorCode.DBFailed); } // 发奖 if (!SevenDayActivityMgr.Instance().GiveAward(client, dayAward.AllAward, ESevenDayActType.Login) || !SevenDayActivityMgr.Instance().GiveAward(client, dayAward.OccAward, ESevenDayActType.Login) || !SevenDayActivityMgr.Instance().GiveEffectiveTimeAward(client, dayAward.TimeAward.ToAwardItem(), ESevenDayActType.Login) ) { LogManager.WriteLog(LogTypes.Error, string.Format("玩家领取七日活动奖励,设置领奖了但是发奖失败 roleid={0}, day={1}", client.ClientData.RoleID, day)); } return(ESevenDayActErrorCode.Success); } }
// 初始化配置文件信息 public bool Init() { try { GeneralCachingXmlMgr.RemoveCachingXml(Global.GameResPath(CfgFile)); XElement xml = GeneralCachingXmlMgr.GetXElement(Global.GameResPath(CfgFile)); if (null == xml) { return(false); } XElement args = xml.Element("Activities"); if (null != args) { FromDate = Global.GetSafeAttributeStr(args, "FromDate"); ToDate = Global.GetSafeAttributeStr(args, "ToDate"); ActivityType = (int)Global.GetSafeAttributeLong(args, "ActivityType"); AwardStartDate = Global.GetSafeAttributeStr(args, "AwardStartDate"); AwardEndDate = Global.GetSafeAttributeStr(args, "AwardEndDate"); } args = xml.Element("GiftList"); Dictionary <int, _ChargeLvl> awardId2ChargeLvl = new Dictionary <int, _ChargeLvl>(); if (null != args) { IEnumerable <XElement> xmlItems = args.Elements(); foreach (var xmlItem in xmlItems) { if (null == xmlItem) { continue; } int awardId = (int)Global.GetSafeAttributeLong(xmlItem, "Group"); int needCharge = (int)Global.GetSafeAttributeLong(xmlItem, "NeedZuanShi"); _ChargeLvl chargeLvl = null; if (!awardId2ChargeLvl.TryGetValue(awardId, out chargeLvl)) { chargeLvl = new _ChargeLvl(); chargeLvl.Id = awardId; chargeLvl.NeedCharge = needCharge; awardId2ChargeLvl[awardId] = chargeLvl; } _DayAward dayAward = new _DayAward(); dayAward.LianXuDay = (int)Global.GetSafeAttributeLong(xmlItem, "Day"); string goodsIDs = Global.GetSafeAttributeStr(xmlItem, "GoodsOne"); if (string.IsNullOrEmpty(goodsIDs)) { LogManager.WriteLog(LogTypes.Warning, string.Format("读取{0}配置文件中的物品配置项为空", CfgFile)); } else { string[] fields = goodsIDs.Split('|'); if (fields.Length <= 0) { LogManager.WriteLog(LogTypes.Warning, string.Format("读取{0}配置文件中的物品配置项失败", CfgFile)); } else { dayAward.AwardGoods.GoodsDataList.AddRange(HuodongCachingMgr.ParseGoodsDataList(fields, "连续充值活动goods1配置")); } } goodsIDs = Global.GetSafeAttributeStr(xmlItem, "GoodsTwo"); if (string.IsNullOrEmpty(goodsIDs)) { } else { string[] fields = goodsIDs.Split('|'); if (fields.Length <= 0) { LogManager.WriteLog(LogTypes.Warning, string.Format("读取{0}配置文件中的物品配置项失败", CfgFile)); } else { //将物品字符串列表解析成物品数据列表 dayAward.AwardGoods.GoodsDataList.AddRange(HuodongCachingMgr.ParseGoodsDataList(fields, "连续充值活动goods2配置")); } } chargeLvl.AwardList.Add(dayAward); } chargeLvlList.AddRange(awardId2ChargeLvl.Values.ToList()); PredealDateTime(); } } catch (Exception ex) { LogManager.WriteLog(LogTypes.Fatal, string.Format("{0}解析出现异常, {1}", CfgFile, ex.Message)); return(false); } return(true); }
// 领奖 public JieriLianXuChargeErrorCode HandleGetAward(GameClient client, int awardId, int day) { if (!InAwardTime() || client == null) { return(JieriLianXuChargeErrorCode.NotAwardTime); } _ChargeLvl cl = chargeLvlList.Find(_cl => _cl.Id == awardId); if (cl == null) { // 找不到该档次 return(JieriLianXuChargeErrorCode.ConfigError); } _DayAward da = cl.AwardList.Find(_da => _da.LianXuDay == day); if (da == null) { // 找不到该档次的day信息 return(JieriLianXuChargeErrorCode.ConfigError); } List <_AwardInfo> myDataLst = _GetMyActInfoFromDB(client); if (myDataLst == null) { // 找不到我的领奖信息 return(JieriLianXuChargeErrorCode.DBFailed); } var info = myDataLst.Find(_info => _info.AwardId == awardId); if (info == null) { // 找不到该档次的领奖信息 return(JieriLianXuChargeErrorCode.ConfigError); } if (info.LianXuDay < day || Global.GetIntSomeBit(info.AwardFlag, day) == 1) { // 尚未达成或者已经领取 return(JieriLianXuChargeErrorCode.NotMeetAwardCond); } if (da.AwardGoods != null && da.AwardGoods.GoodsDataList != null && da.AwardGoods.GoodsDataList.Count > 0) { // 发放的是礼包,只有1个 int AwardGoodsCnt = da.AwardGoods.GoodsDataList.Count(goods => Global.IsRoleOccupationMatchGoods(client, goods.GoodsID)); if (!Global.CanAddGoodsNum(client, AwardGoodsCnt)) { // 背包不足 return(JieriLianXuChargeErrorCode.NoBagSpace); } } int newAwardFlag = Global.SetIntSomeBit(day, info.AwardFlag, true); if (!_UpdateAwardFlag2DB(client, awardId, newAwardFlag)) { // 更新领奖信息失败啊啊啊啊 return(JieriLianXuChargeErrorCode.DBFailed); } info.AwardFlag = newAwardFlag; GiveAward(client, da.AwardGoods); //_GiveAward2Client(client, da.AwardGoods1); // 检查图标 if (client._IconStateMgr.CheckJieriLianXuCharge(client)) { client._IconStateMgr.AddFlushIconState((ushort)ActivityTipTypes.JieRiActivity, client._IconStateMgr.IsAnyJieRiTipActived()); client._IconStateMgr.SendIconStateToClient(client); } return(JieriLianXuChargeErrorCode.Success); }
/// <summary> /// 领取奖励 /// </summary> /// <param name="client"></param> /// <param name="innerId"></param> /// <returns></returns> public ESevenDayActErrorCode HandleGetAward(GameClient client, int day) { int currDay; if (!SevenDayActivityMgr.Instance().IsInActivityTime(client, out currDay)) { return(ESevenDayActErrorCode.NotInActivityTime); } if (day < 0 || day > currDay) { return(ESevenDayActErrorCode.VisitParamsWrong); } _DayAward dayAward = null; lock (ConfigMutex) { if (DayAwardDict == null || !DayAwardDict.TryGetValue(day, out dayAward)) { return(ESevenDayActErrorCode.ServerConfigError); } } Dictionary <int, SevenDayItemData> itemDict = SevenDayActivityMgr.Instance().GetActivityData(client, ESevenDayActType.Charge); if (itemDict == null) { return(ESevenDayActErrorCode.NotReachCondition); } lock (itemDict) { SevenDayItemData itemData = null; if (!itemDict.TryGetValue(day, out itemData)) { return(ESevenDayActErrorCode.ServerConfigError); } if (itemData.Params1 * GameManager.GameConfigMgr.GetGameConfigItemInt("money-to-yuanbao", 10) < dayAward.NeedCharge || itemData.AwardFlag != SevenDayConsts.NotGetAward) { return(ESevenDayActErrorCode.NotReachCondition); } // 检查背包 int awardGoodsCnt = 0; if (dayAward.AllAward != null && dayAward.AllAward.GoodsDataList != null) { awardGoodsCnt += dayAward.AllAward.GoodsDataList.Count; } if (dayAward.OccAward != null && dayAward.OccAward.GoodsDataList != null) { awardGoodsCnt += dayAward.OccAward.GoodsDataList.Count(_goods => Global.IsRoleOccupationMatchGoods(client, _goods.GoodsID)); } if (awardGoodsCnt <= 0 || !Global.CanAddGoodsNum(client, awardGoodsCnt)) { return(ESevenDayActErrorCode.NoBagSpace); } itemData.AwardFlag = SevenDayConsts.HadGetAward; if (!SevenDayActivityMgr.Instance().UpdateDb(client.ClientData.RoleID, ESevenDayActType.Charge, day, itemData, client.ServerId)) { itemData.AwardFlag = SevenDayConsts.NotGetAward; return(ESevenDayActErrorCode.DBFailed); } if (!SevenDayActivityMgr.Instance().GiveAward(client, dayAward.AllAward, ESevenDayActType.Charge) || !SevenDayActivityMgr.Instance().GiveAward(client, dayAward.OccAward, ESevenDayActType.Charge) ) { LogManager.WriteLog(LogTypes.Error, string.Format("玩家领取七日充值奖励,设置领奖了但是发奖失败 roleid={0}, day={1}", client.ClientData.RoleID, day)); } return(ESevenDayActErrorCode.Success); } }