From fb69e8de2e0718343bd0beec9850b1ff1551845f Mon Sep 17 00:00:00 2001 From: xuexinpeng Date: Mon, 8 Nov 2021 00:06:49 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=91=A8=E5=8D=A1=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/activity/WeekCardHandler.java | 4 +- .../handler/activity/WeekCardInfoHandler.java | 7 +- .../jieling/logic/GlobalDataManaager.java | 6 +- .../activity/activityLogic/WeekCardLogic.java | 69 ++++++++++++++++--- .../jieling/logic/store/BuyGoodsNewLogic.java | 4 +- 5 files changed, 69 insertions(+), 21 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/activity/WeekCardHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/activity/WeekCardHandler.java index d25402994..6e48f60cf 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/activity/WeekCardHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/activity/WeekCardHandler.java @@ -34,8 +34,7 @@ public class WeekCardHandler extends BaseHandler weekCard = user.getPlayerInfoManager().getWeekCard(); ActivityProto.WeekCardRewardResponse.Builder res = ActivityProto.WeekCardRewardResponse.newBuilder(); @@ -71,6 +70,5 @@ public class WeekCardHandler extends BaseHandler weekCardList = WeekCardLogic.getInstance().initAllWeekCardInfo(user); res.addAllAllWeekCardInfo(weekCardList); - MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.WeekCardInfoResponse.getNumber(), res.build(), true);*/ + MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.WeekCardInfoResponse.getNumber(), res.build(), true); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java index 0eaaff511..a785e3a34 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java @@ -407,8 +407,6 @@ public class GlobalDataManaager implements IManager { public static void checkNeedReFlush(ISession session,User user,PlayerInfoProto.FivePlayerUpdateIndication.Builder fBuilder) throws Exception { // 需要隔天刷新的字段统一在这里处理 if (TimeUtils.isOverTime(0,user.getPlayerInfoManager().getLoginTime())) { - //周卡每日刷新 - //WeekCardLogic.getInstance().sendWeekCardInitInfo(session); //活动刷新 ActivityLogic.getInstance().flushEveryDay(user,fBuilder); PlayerLogic.getInstance().vipflushEveryDay(user,fBuilder); @@ -434,6 +432,10 @@ public class GlobalDataManaager implements IManager { SevenWorldLogic.getInstance().sevenWorldInfoIndication(session); // 御剑行 RidingSwardLogic.getInstance().zeroClearRidingSwardByUser(user); + //周卡每日刷新 + WeekCardLogic.getInstance().sendWeekCardInitInfo(session); + //周卡邮件发放未领取奖励 + WeekCardLogic.getInstance().sendWeekCardRewardMail(session); // GuildChallengeLogic.getInstance().resetBossDamage(user); if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,0)){ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/WeekCardLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/WeekCardLogic.java index c60b80648..753655411 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/WeekCardLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/activityLogic/WeekCardLogic.java @@ -1,22 +1,25 @@ package com.ljsd.jieling.logic.activity.activityLogic; +import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.WeekCardInfo; import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.mail.MailLogic; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.util.MessageUtil; +import config.SErrorCodeEerverConfig; +import config.SWeekcardConfig; import config.SWeekcardRotationConfig; import manager.STableManager; import rpc.protocols.ActivityProto; import rpc.protocols.CommonProto; import rpc.protocols.MessageTypeProto; +import util.StringUtil; import util.TimeUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class WeekCardLogic { @@ -25,7 +28,6 @@ public class WeekCardLogic { public static class Instance { public final static WeekCardLogic instance = new WeekCardLogic(); - } public static WeekCardLogic getInstance() { @@ -39,7 +41,54 @@ public class WeekCardLogic { res.addAllAllWeekCardInfo(weekCardList); //MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.WeekCardIndicationInfoResponse, res.build(), true); MessageUtil.sendIndicationMessage(session,1, MessageTypeProto.MessageType.WeekCardIndicationInfoResponse_VALUE,res.build(),true); + } + public void sendWeekCardRewardMail(ISession session)throws Exception{ + //发每周未领取的奖励 + User user = UserManager.getUser(session.getUid()); + Map weekCard = user.getPlayerInfoManager().getWeekCard(); + MapdropMap = new HashMap<>(); + boolean isSave = false; + for(WeekCardInfo weekCardVal:weekCard.values()){ + Map config = STableManager.getConfig(SWeekcardConfig.class); + if(!config.containsKey(weekCardVal.getId())){ + continue; + } + if(!weekCardVal.isBuy()){ + continue; + } + if(TimeUtils.isSameWeek7(weekCardVal.getBugTime())){ + continue; + } + if(Calendar.DAY_OF_WEEK - weekCardVal.getLeaveGetRewardDays()>0){ + for(int i= (Calendar.DAY_OF_WEEK - weekCardVal.getLeaveGetRewardDays());i>0;i--){ + int [][]drop =config.get(weekCardVal.getId()).getBaseReward(); + for(int[] single:drop){ + if(dropMap.containsKey(single[0])){ + dropMap.put(single[0],dropMap.get(single[0])+single[1]); + }else{ + dropMap.put(single[0],single[1]); + } + } + } + weekCardVal.setBuy(false); + weekCardVal.setBugTime(0); + isSave =true; + int [][] dropArray= dropMap.entrySet().stream().map(n->new int[]{n.getKey(),n.getValue()}).toArray(int[][]::new); + /*String content = SErrorCodeEerverConfig.getI18NMessageNeedConvert("MsRankContent",new Object[]{(i + 1)},new int[0],"#"); + MailLogic.getInstance().sendMail(arenaRankfilt.get(i), title, content, + StringUtil.parseArrayToString(config.getSeasonReward()), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME);*/ + MailLogic.getInstance().sendMail(user.getId(), "周卡未领取奖励", "周卡奖励", + StringUtil.parseArrayToString(dropArray), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); + }else{ + weekCardVal.setBuy(false); + weekCardVal.setBugTime(0); + isSave = true; + } + if(isSave){ + user.getPlayerInfoManager().setWeekCard(weekCard); + } + } } public List initAllWeekCardInfo(User user) throws Exception{ @@ -54,7 +103,6 @@ public class WeekCardLogic { boolean isSaveToDb =false; List weekCardList=new ArrayList<>(); for(int i= 1;i=cardType[0][0]&&level<=cardType[1][0]){ - return cardType[0]; + if(cardType.length>1){ + if(level>=cardType[0][0]&&level<=cardType[1][0]){ + return cardType[0]; + }else { + return cardType[1]; + } }else { - return cardType[1]; + return cardType[0]; } } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/store/BuyGoodsNewLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/BuyGoodsNewLogic.java index 12229c888..c3a6de4a5 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/store/BuyGoodsNewLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/store/BuyGoodsNewLogic.java @@ -402,8 +402,8 @@ public class BuyGoodsNewLogic { } //周卡 if(type==GiftGoodsType.WEEKCARD){ - //WeekCardLogic.getInstance().buyWeekCard(user,config.getId()); - //WeekCardLogic.getInstance().sendWeekCardInitInfo(session); + WeekCardLogic.getInstance().buyWeekCard(user,config.getId()); + WeekCardLogic.getInstance().sendWeekCardInitInfo(session); } if(drop!=null&&session!=null){ PlayerInfoProto.DirectBuyIndication build = PlayerInfoProto.DirectBuyIndication.newBuilder().setDrop(drop).build(); From 5c70df47dbe674d9c80a7d047c8a7e416bc31096 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 4 Nov 2021 10:11:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=B7=A8=E6=9C=8D=E5=88=86=E7=BB=84?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/db/redis/RedisKey.java | 6 ++-- .../com/ljsd/jieling/db/redis/RedisUtil.java | 22 ++++++------ .../ljsd/jieling/logic/GlobleSystemLogic.java | 26 ++++++++++++-- .../jieling/logic/rank/CrossRankManager.java | 36 +++++++++++++------ .../logic/sevenworld/SevenWorldLogic.java | 1 - .../ljsd/jieling/thread/task/MinuteTask.java | 4 +-- 6 files changed, 64 insertions(+), 31 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java index 4e395336c..1896b5360 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java @@ -1,8 +1,5 @@ package com.ljsd.jieling.db.redis; -import com.ljsd.jieling.db.mongo.AreaManager; -import com.ljsd.jieling.logic.GlobleSystemLogic; - import java.util.HashSet; import java.util.Set; @@ -356,7 +353,8 @@ public class RedisKey { public static final String GUILD_LEADER_CACHE = "GUILD_LEADER_CACHE"; - public static final String CROSS_RANK_UPDATE_VERSION = "CROSS_RANK_UPDATE_VERSION"; + public static final String CROSS_RANK_UPDATE = "CROSS_RANK_UPDATE"; + public static final String CROSS_RANK_DELETE = "CROSS_RANK_DELETE"; //玉虚论道 public static final String CROSS_YUXULUNDAO_RANK = "CROSS_YUXULUNDAO_RANK";//排行榜信息 废弃 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index 06baa0356..7d90c1f13 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -1429,27 +1429,27 @@ public class RedisUtil { if (result == null){ result = AreaManager.areaId + RedisKey.Delimiter_colon + type + RedisKey.Delimiter_colon + key; } - deathPathKeyHandler(result); - helpHeroKeyHandler(result); - + // 保存需要清理的key + saveRemoveKeyHandler(result); return result;} /** - * 十绝阵rediskey处理 + * 保存需要清理的key */ - private void deathPathKeyHandler(String key){ + private void saveRemoveKeyHandler(String key){ + // 十绝阵相关 if(key.contains("DEATH_PATH")){ RedisUtil.getInstence().sSet(RedisKey.DEATH_PATH_DELETE,key); } - } - - /** - * 助战rediskey处理 - */ - private void helpHeroKeyHandler(String key){ + // 助战相关 if(key.contains("HELP_FIGHT")){ RedisUtil.getInstence().sSet(RedisKey.HELP_FIGHT_DELETE,key); } + // 跨服排行榜相关 + if(key.contains("CROSS_RANK_UPDATE")){ + RedisUtil.getInstence().sSet(RedisKey.CROSS_RANK_DELETE,key); + } + } private static final String LOCK_SUCCESS = "OK"; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java index 6d2a6a400..17390e2b5 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -285,13 +285,20 @@ public class GlobleSystemLogic implements IEventHandler { redisUtil.del(RedisKey.CHAT_CROSS_MSG_ID+i); } + // 重新分组,需要删除旧排行榜数据,重新分组 + redisUtil.delVague(RedisKey.CROSS_RANK_DELETE,"CROSS_RANK_UPDATE:.*"); + //释放分布式锁 redisUtil.del("SERVER_SPLIT_REDIS_LOCK"); LOGGER.info("跨服分组结束"); // splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,"",String.class,Integer.class); } - //获取当前区服的跨服区组 -1为未在分组内 + + /** + * 获取当前区服的跨服区组 -1为未在分组内 + * @return + */ public int getCrossGroup(){ //测试服不参与分组和跨服 if(!GameApplication.serverProperties.isArenaCross()){ @@ -299,8 +306,23 @@ public class GlobleSystemLogic implements IEventHandler { } Integer group = RedisUtil.getInstence().getMapValue(RedisKey.SERVER_SPLIT_INFO, "", String.valueOf(GameApplication.serverId), Integer.class); crossGroup = group==null?-1:group; + return crossGroup; + } - return crossGroup; + /** + * 获取和当前分组同一分组的服务器id + * @return + */ + public List getCrossServersByGroup(){ + int group = getCrossGroup(); + Map values = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, "", String.class, Integer.class); + ArrayList list = new ArrayList<>(); + for (Map.Entry entry : values.entrySet()) { + if (entry.getValue() == group){ + list.add(entry.getKey()); + } + } + return list; } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java index bb46ad155..bef2f70c7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java @@ -1,5 +1,6 @@ package com.ljsd.jieling.logic.rank; +import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.dao.GuilidManager; @@ -11,6 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ZSetOperations; import util.TimeUtils; +import java.util.List; import java.util.Map; import java.util.Set; @@ -45,7 +47,7 @@ public class CrossRankManager { /** * 跨服排行处理 */ - public void crossRankHandle(boolean choice){ + public void crossRankHandle(){ // 时间验证 if (isTime()){ // 全部排行遍历 @@ -57,11 +59,20 @@ public class CrossRankManager { int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup(); if(crossGroup != -1){ AbstractRank rank = RankContext.getRankEnum(type); - // 获取本服排行榜数据 - Set> range = RedisUtil.getInstence().getZsetreverseRangeWithScores(rank.getRedisKey(), "", 0, 100, true); - // 批量放入跨服排行榜 + // 获取跨服key String key = RedisUtil.getInstence().getKey(rank.getCrossRedisKey(),"",false); - RedisUtil.getInstence().zsetAddAall(key,range); + // 清理旧榜数据 + RedisUtil.getInstence().del(key); + // 获取本组的服务器列表 + List servers = GlobleSystemLogic.getInstence().getCrossServersByGroup(); + for (String server : servers) { + String localKey = RedisUtil.getInstence().getKey(server, rank.getRedisKey(), false); + // 获取本地服排行榜数据 + Set> range = + RedisUtil.getInstence().getZsetreverseRangeWithScores(localKey,"",0,100, false); + // 批量放入跨服排行榜 + RedisUtil.getInstence().zsetAddAall(key,range); + } LOGGER.info("=====================跨服排行榜处理========,key:{}",key); } } @@ -74,14 +85,17 @@ public class CrossRankManager { * @return */ private boolean isTime(){ - long now = TimeUtils.now(); - long twoHour = TimeUtils.HOUR * 2; - if (now >= twoHour+time){ - time = now; - return true; - }else{ + int group = GlobleSystemLogic.getInstence().getCrossGroup(); + if (group == -1){ return false; } + String key = RedisUtil.getInstence().getKey(RedisKey.CROSS_RANK_UPDATE, String.valueOf(group), false); + Object object = RedisUtil.getInstence().get(key); + if (object != null){ + return false; + } + RedisUtil.getInstence().set(key,"1",TimeUtils.HOUR * 2); + return true; } /** diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java index ed973c79e..673bf18d1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/sevenworld/SevenWorldLogic.java @@ -11,7 +11,6 @@ import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.ktbeans.ReportEventEnum; import com.ljsd.jieling.ktbeans.ReportUtil; import com.ljsd.jieling.logic.GlobleSystemLogic; -import com.ljsd.jieling.logic.activity.crossService.CrossServiceLogic; import com.ljsd.jieling.logic.dao.Hero; import com.ljsd.jieling.logic.dao.TeamEnum; import com.ljsd.jieling.logic.dao.TeamPosHeroInfo; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index b26853c17..c2b28460b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -163,10 +163,10 @@ public class MinuteTask extends Thread { } try { - CrossRankManager.getInstance().crossRankHandle(false); + CrossRankManager.getInstance().crossRankHandle(); }catch (Exception e){ e.printStackTrace(); - LOGGER.error("跨服排行榜初始化一次,Exception::=>{}",e.toString()); + LOGGER.error("跨服排行榜初始化异常,Exception::=>{}",e.toString()); } try { From 8f35b31222b4ed01cbd27dd0bb1e773dd36672b7 Mon Sep 17 00:00:00 2001 From: duhui Date: Thu, 4 Nov 2021 10:47:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=B7=A8=E6=9C=8D=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/jieling/logic/GlobleSystemLogic.java | 2 -- .../jieling/logic/rank/CrossRankManager.java | 26 ------------------- 2 files changed, 28 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java index 17390e2b5..f661c6d59 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -243,8 +243,6 @@ public class GlobleSystemLogic implements IEventHandler { LOGGER.error("跨服分组,未获取到锁"); return; } - // 跨服排行榜处理 - CrossRankManager.getInstance().cleanCrossRank(); //这里为所有服务器的世界等级 Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO,"",String.class,Integer.class); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java index bef2f70c7..9004b45de 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/CrossRankManager.java @@ -39,11 +39,6 @@ public class CrossRankManager { return CrossRankManager.Instance.INSTANCE; } - /** - * 上次排行榜初始化时间 - */ - private long time = 0L; - /** * 跨服排行处理 */ @@ -109,25 +104,4 @@ public class CrossRankManager { LOGGER.info("==================工会缓存处理============="); } - /** - * 清理跨服排行榜 - */ - public void cleanCrossRank(){ - for (RankEnum value : RankEnum.values()) { - int type = value.getType(); - //跨服 - if (RankContext.isCrossRank2(type) && RankContext.isCrossRank(type)) { - // 获取分组id,是否跨服 - int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup(); - if (crossGroup != -1) { - AbstractRank rank = RankContext.getRankEnum(type); - String key = RedisUtil.getInstence().getKey(rank.getCrossRedisKey(),"",false); - RedisUtil.getInstence().del(key); - time = 0L; - LOGGER.info("=====================跨服排行榜清理========,key:{},time:{}",key,time); - } - } - } - } - }