From 1580d2adff65048f1ddd8b1cc24b3429b0a17103 Mon Sep 17 00:00:00 2001 From: grimm <1769111741@qq.com> Date: Sat, 21 Jun 2025 19:04:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B7=A8=E6=9C=8D=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gamecommon/src/main/java/util/TimeUtils.java | 1 + .../main/java/com/ljsd/GameApplication.java | 3 + .../com/ljsd/jieling/db/redis/RedisKey.java | 4 +- .../com/ljsd/jieling/db/redis/RedisUtil.java | 41 +++++++++- ...GetWorldArenaChallengeResponseHandler.java | 15 +++- .../ljsd/jieling/logic/GlobleSystemLogic.java | 77 +++++++++---------- .../ljsd/jieling/logic/arena/ArenaLogic.java | 58 +++++++++++++- .../arena/arenaworld/ArenaWorldLogic.java | 4 +- .../ljsd/jieling/logic/dao/MailManager.java | 2 +- .../jieling/logic/family/DeathPathLogic.java | 73 +++++++++++------- .../ljsd/jieling/logic/mail/MailLogic.java | 40 ++++++++++ .../ljsd/jieling/logic/rank/RankLogic.java | 3 +- .../jieling/network/server/WorldHelper.java | 4 +- .../ljsd/jieling/thread/task/MinuteTask.java | 33 ++++++++ .../com/ljsd/jieling/util/MessageUtil.java | 2 +- .../WorldArenaRewardJobHandler.java | 4 +- .../GetArenaRankRewardRequestHandler.java | 6 +- .../java/com/world/logic/GlobalLogic.java | 66 +++++++++------- .../com/world/logic/arean/ArenaLogic.java | 8 +- .../java/com/world/thread/MinuteTask.java | 7 ++ .../ArenaLogicCrossServerFightJobHandler.java | 2 +- .../EveryMondayZeroDoSplitHandler.java | 3 +- 22 files changed, 335 insertions(+), 121 deletions(-) diff --git a/gamecommon/src/main/java/util/TimeUtils.java b/gamecommon/src/main/java/util/TimeUtils.java index cbe701c..049f976 100644 --- a/gamecommon/src/main/java/util/TimeUtils.java +++ b/gamecommon/src/main/java/util/TimeUtils.java @@ -2103,4 +2103,5 @@ public class TimeUtils { return startOfWeek1.equals(startOfWeek2); } + } \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/GameApplication.java b/serverlogic/src/main/java/com/ljsd/GameApplication.java index dc61634..517ddfc 100644 --- a/serverlogic/src/main/java/com/ljsd/GameApplication.java +++ b/serverlogic/src/main/java/com/ljsd/GameApplication.java @@ -13,6 +13,7 @@ import com.ljsd.jieling.db.mongo.MongoUtil; import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.ktbeans.ReportUtil; +import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.dao.ServerConfig; import com.ljsd.jieling.logic.dao.root.GlobalSystemControl; import com.ljsd.jieling.logic.rankReward.RankRewardLogic; @@ -95,6 +96,8 @@ public class GameApplication { new WorldServerListListener().start(); new ReportUtil().start(); NetManager.getInstance().init(); + //设置开服分组 + GlobleSystemLogic.getInstence().getCrossGroup(); //控制台gm Scanner sc = new Scanner(System.in); while (sc.hasNext()) { 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 3a5b0b2..6425e32 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 @@ -476,7 +476,9 @@ public class RedisKey { public static final String USER_SIMPLE_INFO = "USER_SIMPLE_INFO"; public static final String DEFTRAINING_RANK_MARK = "DEFTRAINING_RANK_MARK"; public static final String F5_PRE_REWARD = "F5_PRE_REWARD";//F5谷歌预注册奖励 - public static final String RANK_REWARD_SLAVE_SERVERS = "RANK_REWARD_SLAVE_SERVERS";//主服对应的从服服务器id集合,合并离线奖励用 + public static final String RANK_REWARD_SLAVE_SERVERS = "RANK_REWARD_SLAVE_SERVERS"; + public static final String CROSS_SERVER_GROUP = "CROSS_SERVER_GROUP";// + public static final String MAIL_REWARD_MARK = "MAIL_REWARD_MARK";// 邮件奖励 //public static Set worldDeathPathCacChe = new HashSet<>(); 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 0dbcc14..185abe8 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 @@ -1573,7 +1573,8 @@ public class RedisUtil { ||RedisKey.CROSS_ARENA_ROBOT_INFO.equals(type)||RedisKey.CROSS_SERVICE_ARENA.equals(type) ||RedisKey.WORLD_ARENA_RANK_MY_MATH.equals(type)||RedisKey.WORLD_ARENA_MY_PRON.equals(type) ||RedisKey.WORLD_ARENA_RRECORD.equals(type)||RedisKey.GLOBAL_DEATH_PATH_WORLD.equals(type) - ||RedisKey.CUser_ServerId_Key.equals(type) || RedisKey.DEATH_PATH_STATUS.equals(type)) { + ||RedisKey.CUser_ServerId_Key.equals(type) || RedisKey.DEATH_PATH_STATUS.equals(type) + ||RedisKey.CROSS_SERVER_GROUP.equals(type)) { return type + RedisKey.Delimiter_colon + key; } // if(RedisKey.familyKey.contains(type)){ @@ -1715,4 +1716,42 @@ public class RedisUtil { } return results; } + + public Map getmapvaluekeyclass(String key, Class keyClazz, Class valueClazz){ + Map result = new HashMap<>(); + Map entries = redisTemplate.opsForHash().entries(key); + for(Map.Entry item : entries.entrySet()){ + Object key1 = item.getKey(); + Object value = item.getValue(); + result.put(gson.fromJson(gson.toJson(key1),keyClazz),gson.fromJson(value.toString(),valueClazz)); + } + return result; + } + + public void putmap(String key, String mapKey, T value){ + for (int i = 0; i < MAX_TRY_TIMES; i++) { + try { + redisTemplate.opsForHash().put(key,mapKey,gson.toJson(value)); + return; + } catch (Exception e) { + TimeUtils.sleep(FAILED_SLEEP); + } + } + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(毫秒) + */ + public void expireMills(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.MILLISECONDS); + } + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeResponseHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeResponseHandler.java index d926d97..67976c0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeResponseHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeResponseHandler.java @@ -112,8 +112,17 @@ public class GetWorldArenaChallengeResponseHandler extends gtGBaseHandler splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class); - - return splitInfo.getOrDefault(String.valueOf(serverId), -1); + Integer group = RedisUtil.getInstence().getMapValue(RedisKey.SERVER_SPLIT_INFO,"", String.valueOf(serverId), Integer.class); + // 当本地无跨服id时,读取gm的跨服分组,开服用 + if (group == null){ + Integer entry = RedisUtil.getInstence().getMapValue(RedisKey.CROSS_SERVER_GROUP, "", String.valueOf(serverId), Integer.class); + if (entry != null){ + RedisUtil.getInstence().putMapEntry(RedisKey.SERVER_SPLIT_INFO, "", String.valueOf(serverId),entry); + group = entry; + }else { + group = -1; + } + } + return group; } } 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 f4db759..fa64263 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -179,61 +179,52 @@ public class GlobleSystemLogic implements IEventHandler { } - //跨服竞技场服务器分组,跨服分组 - public void doSplit() { - if (!GameApplication.serverProperties.isArenaCross()) { + public void doSplit(){ + LOGGER.info("跨服分组验证处理"); + if(!GameApplication.serverProperties.isArenaCross()){ + LOGGER.error("跨服分组,测试服不做分组"); return; } RedisUtil redisUtil = RedisUtil.getInstence(); Object matched = redisUtil.get(RedisKey.MATCHED_SPLIT_KEY); - if (matched != null) { + if(matched!=null){ + LOGGER.error("跨服分组,获取key:【MATCHED_SPLIT_KEY】失败, info:{}", matched); return; } - SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); //使用分布式锁,保证只有一个服来分组 boolean lock = redisUtil.lock("SERVER_SPLIT_REDIS_LOCK", TimeUtils.ONE_MINUTE * 2); - if (!lock) { + if(!lock){ //没有拿到锁直接返回 + LOGGER.error("跨服分组,未获取到锁"); return; } - //这里为所有服务器的世界等级 - Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO, "", String.class, Integer.class); + LOGGER.info("跨服开始分组"); + // 周一零点时间戳,毫秒 long lastHour = TimeUtils.getLastOrUnderHour(TimeUtils.now(), 1, 0, 0, true); - lastHour += TimeUtils.WEEK; - int expireTime = (int) ((lastHour - TimeUtils.now()) / 1000); - redisUtil.set(RedisKey.MATCHED_SPLIT_KEY, String.valueOf(1), expireTime - 60); + // 加上七天,秒 + lastHour = (lastHour + TimeUtils.WEEK)/1000; + // 当前时间 + long expireTime = lastHour-TimeUtils.nowInt(); + redisUtil.set(RedisKey.MATCHED_SPLIT_KEY,String.valueOf(1),expireTime-60); //提前两分钟结算 - redisUtil.set(RedisKey.MATCHED_VERSION, TimeUtils.getTimeStampYMD(System.currentTimeMillis()), expireTime - 120); - worldLevelMap.forEach((k, v) -> { - if (v > setting.getWorldLevel()) { - redisUtil.zsetAddOne(RedisKey.SERVER_LEVEL_RANK, k, v); + redisUtil.set(RedisKey.MATCHED_VERSION,TimeUtils.getTimeStampYMD(System.currentTimeMillis()),expireTime-120); + // 分组逻辑 + Map cross = redisUtil.getMapValues(RedisKey.CROSS_SERVER_GROUP, "", String.class, Integer.class); + Map split = new HashMap<>(); + // 遍历gm分组,剔除所有分组id小于等于0的分组,这些默认不跨服 + for (Map.Entry entry : cross.entrySet()) { + if (entry.getValue()<=0){ + continue; } - }); - Set> zsetRevRangeWithScore = redisUtil.getZsetreverseRangeByRangeWithScores(RedisKey.SERVER_LEVEL_RANK, setting.getWorldLevel(), 999); - - int index = 0; - int areaId = 1; - Map split = new HashMap<>(zsetRevRangeWithScore.size()); - for (ZSetOperations.TypedTuple data : zsetRevRangeWithScore) { - if (index >= setting.getServerNum()) { - if ((zsetRevRangeWithScore.size() - areaId * setting.getServerNum()) > setting.getServerNum() / 2) { - areaId++; - } - index = 0; - } - split.put(data.getValue(), areaId); - - index++; + split.put(entry.getKey(),entry.getValue()); } - redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO, "", split); - //发分组邮件 - split.keySet().forEach(server -> redisUtil.putMapEntry(RedisKey.SERVER_SPLIT_MAIL_INFO, "", server, 0)); - + // 删除上期分组数据,并赋值新分组数据 + redisUtil.remove(RedisKey.SERVER_SPLIT_INFO+RedisKey.Delimiter_colon); + redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,"",split); //释放分布式锁 redisUtil.del("SERVER_SPLIT_REDIS_LOCK"); LOGGER.info("跨服分组结束"); -// splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,"",String.class,Integer.class); } //获取当前区服的跨服区组 -1为未在分组内 @@ -244,9 +235,16 @@ public class GlobleSystemLogic implements IEventHandler { return -1; } Integer group = RedisUtil.getInstence().getMapValue(RedisKey.SERVER_SPLIT_INFO,"", String.valueOf(GameApplication.serverId), Integer.class); -// Map groups = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class); -// Integer group = groups.get(String.valueOf(GameApplication.serverId)); -// Integer group = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class).get(String.valueOf(GameApplication.serverId)); + // 当本地无跨服id时,读取gm的跨服分组,开服用 + if (group == null){ + Integer entry = RedisUtil.getInstence().getMapValue(RedisKey.CROSS_SERVER_GROUP, "", String.valueOf(GameApplication.serverId), Integer.class); + if (entry != null){ + RedisUtil.getInstence().putMapEntry(RedisKey.SERVER_SPLIT_INFO, "", String.valueOf(GameApplication.serverId),entry); + group = entry; + }else { + group = -1; + } + } LOGGER.info("GameApplication.serverId={},group={}",GameApplication.serverId,group); crossGroup = group == null ? -1 : group; @@ -264,7 +262,6 @@ public class GlobleSystemLogic implements IEventHandler { Integer group = RedisUtil.getInstence().getMapValues(RedisKey.DeathPath_SERVER_SPLIT_INFO, String.class, Integer.class).get(String.valueOf(GameApplication.serverId)); LOGGER.info("GameApplication.serverId={},group={}",GameApplication.serverId,group); crossGroup = group == null ? -1 : group; - return crossGroup; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java index 0acbda4..ad08877 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java @@ -15,6 +15,7 @@ import com.ljsd.jieling.globals.BIReason; import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.handler.map.behavior.BehaviorUtil; import com.ljsd.jieling.logic.GlobalDataManaager; +import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.dao.*; import com.ljsd.jieling.logic.dao.root.GuildInfo; @@ -802,6 +803,48 @@ public class ArenaLogic { //跨服竞技场结算 (跨服竞技场活动结束排行结算)(跨服竞技场邮件) public void worldSendReward() { +// TimeControllerOfFunction timeControllerOfFunction = GlobalDataManaager.getInstance().getTimeControllerOfFunctionByFunctinoType(FunctionIdEnum.World_Arena); +// +// if (null == timeControllerOfFunction) { +// return; +// } +// long diff = (System.currentTimeMillis() - timeControllerOfFunction.getStartTime()) / 1000; +// +// SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); +// +// TreeMap rewardMapByRank = SSkyLadderReward.rewardMapByRank; +// if (setting == null) { +// return; +// } +// if (diff >= setting.getBattleTime()[1] && diff < setting.getBattleTime()[1] + 50) { +// int myGroup = GlobleSystemLogic.getInstence().getCrossGroup(); +// if (myGroup == 0) { +// return; +// } +// try { +// WorldProto.GetArenaRankRewardResponse response = WorldHelper.sendMessageToWorldWithResult(0, WorldProto.GetArenaRankRewardRequest.newBuilder().setGroupId(myGroup).build(), WorldProto.GetArenaRankRewardResponse.class); +// if (response == null || response.getRankInfoList().size() == 0) { +// return; +// } +// for (WorldProto.ArenaRank rank : response.getRankInfoList()) { +// int myRank = rank.getRank(); +// //sendmail +// String title = SErrorCodeEerverConfig.getI18NMessage("SkyLadder_title"); +// List content = SErrorCodeEerverConfig.getI18NMessageNew("SkyLadder_txt", new Object[]{myRank}); +// +// Map.Entry entry = rewardMapByRank.floorEntry(myRank); +// String mailReward = ItemUtil.getMailReward(entry.getValue().getRankAwards()); +// MailLogic.getInstance().sendMail(rank.getUid(), title, content, mailReward, TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); +// //MailLogic.getInstance().sendMail(rank.getUid(), "跨服竞技场奖励", "跨服竞技场奖励", StringUtil.parseArrayToString(entry.getValue().getRankAwards()), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); +// } +// } catch (Exception e) { +// LOGGER.error("world arena reward error", e); +// } +// } + + } + + public void worldSendRewardNew() { TimeControllerOfFunction timeControllerOfFunction = GlobalDataManaager.getInstance().getTimeControllerOfFunctionByFunctinoType(FunctionIdEnum.World_Arena); if (null == timeControllerOfFunction) { @@ -816,10 +859,19 @@ public class ArenaLogic { return; } if (diff >= setting.getBattleTime()[1] && diff < setting.getBattleTime()[1] + 50) { - int myGroup = WorldHelper.getGroupByServerId(); - if (myGroup == 0) { + int myGroup = GlobleSystemLogic.getInstence().getCrossGroup(); + if (myGroup <= 0) { return; } + long start = TimeUtils.now(); + //分布式锁,保证一个组只有一个服进行初始化 + String lockKey = "CROSS_ARENA_SEND_REWARD_LOCK:" + myGroup; + boolean lock = RedisUtil.getInstence().lock(lockKey, TimeUtils.ONE_HOUR); + if (!lock) { + LOGGER.error("跨服天梯发奖退出, 未获取到锁!耗时:{} ms, 当前时间:{}", TimeUtils.now() - start, TimeUtils.getTimeStamp(TimeUtils.now())); + return; + } + LOGGER.info("跨服天梯,开始发奖。。。"); try { WorldProto.GetArenaRankRewardResponse response = WorldHelper.sendMessageToWorldWithResult(0, WorldProto.GetArenaRankRewardRequest.newBuilder().setGroupId(myGroup).build(), WorldProto.GetArenaRankRewardResponse.class); if (response == null || response.getRankInfoList().size() == 0) { @@ -833,7 +885,7 @@ public class ArenaLogic { Map.Entry entry = rewardMapByRank.floorEntry(myRank); String mailReward = ItemUtil.getMailReward(entry.getValue().getRankAwards()); - MailLogic.getInstance().sendMail(rank.getUid(), title, content, mailReward, TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); + MailLogic.getInstance().sendMailToRedis(rank.getUid(), title, content.get(0), mailReward, TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); //MailLogic.getInstance().sendMail(rank.getUid(), "跨服竞技场奖励", "跨服竞技场奖励", StringUtil.parseArrayToString(entry.getValue().getRankAwards()), TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); } } catch (Exception e) { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/arenaworld/ArenaWorldLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/arenaworld/ArenaWorldLogic.java index 4a432ac..6ec6e9c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/arenaworld/ArenaWorldLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/arenaworld/ArenaWorldLogic.java @@ -56,7 +56,7 @@ public class ArenaWorldLogic { } public static void close() throws Exception { - int myGroup = WorldHelper.getGroupByServerId(); + int myGroup = GlobleSystemLogic.getInstence().getCrossGroup(); if(myGroup==0){ return; } @@ -124,7 +124,7 @@ public class ArenaWorldLogic { SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); SGlobalSystemConfig globalSystemConfig = STableManager.getConfig(SGlobalSystemConfig.class).get(84); - int worldLevel = GlobleSystemLogic.getGloableWorldLeveCache(); //世界等级 + int worldLevel = 0; //取消世界等级限制,这里设置999肯定大于配置的世界等级需求 boolean unLock = false; //true解锁,false未解锁 int level = user.getPlayerInfoManager().getLevel(); //玩家等级 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MailManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MailManager.java index 390e815..d218c00 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MailManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/MailManager.java @@ -19,7 +19,7 @@ public class MailManager extends MongoBase { return mailMap; } - public void addMail(Mail mail) throws Exception { + public void addMail(Mail mail){ mail.init(mail.getRoleUid(), getMongoKey() + ".mailMap." + mail.getId()); updateString("mailMap." + mail.getId(), mail); mailMap.put(mail.getId(), mail); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/DeathPathLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/DeathPathLogic.java index ea1b2d9..fd34935 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/DeathPathLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/DeathPathLogic.java @@ -69,6 +69,8 @@ public class DeathPathLogic { //跨服公会战 是否解锁 true解锁,false未解锁 private boolean isUnlock = false; + //上次请求跨服公会战是否解锁的时间 + private long isUnlockTime = 0; //private BlockingQueue tasks = new BlockingUniqueQueue<>(); private LinkedBlockingQueue tasks = new LinkedBlockingQueue<>(); @@ -106,6 +108,11 @@ public class DeathPathLogic { } public boolean isUnlock() { + long now = TimeUtils.now(); + //1秒内多次请求取内存缓存 + if( now - isUnlockTime < 1000 * 2) { + return this.isUnlock; + } String redisKey = RedisKey.getKey(RedisKey.GLOBAL_DEATH_PATH_WORLD, RedisKey.DEATH_PATH_WORLD_UNLOCK, true); String unlock = (String) RedisUtil.getInstence().get(redisKey); boolean curIsReached; @@ -115,9 +122,13 @@ public class DeathPathLogic { throw new RuntimeException(e); } if (unlock != null && unlock.equals("true") && curIsReached) { - return true; + this.isUnlock = true; + this.isUnlockTime = now; + return this.isUnlock; } - return false; + this.isUnlock =false; + this.isUnlockTime = now; + return this.isUnlock; } /** @@ -525,7 +536,8 @@ public class DeathPathLogic { //当前阵公会伤害 挑战之前 第一的guildId Set> zSetReverseRangeWithScoresBefore; - if(isUnlock()) { //跨服 + boolean isUnlock = isUnlock(); + if(isUnlock) { //跨服 zSetReverseRangeWithScoresBefore = RedisUtil.getInstence().getZsetreverseRangeWithScoresWorld(RedisKey.GLOBAL_DEATH_PATH_WORLD + ":" + groupId() + ":" + RedisKey.DEATH_PATH_EVERY_GUILD_RANK, String.valueOf(pathId), 0, -1); }else { //单服 AbstractRank guildRankBefore = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); @@ -565,7 +577,7 @@ public class DeathPathLogic { FightRecordLogic.getInstance().addRecordMap(user,fightData); //更新排行榜数据 - tasks.offer(new DeathPathTask(uid, guildId, damage, pathId,groupId(),isUnlock())); + tasks.offer(new DeathPathTask(uid, guildId, damage, pathId,groupId(),isUnlock)); //挑战次数记录 RedisUtil.getInstence().increment(RedisKey.getKey(RedisKey.DEATH_PATH_CHALLENGE_COUNT,String.valueOf(uid),false)); //挑战次数 @@ -852,7 +864,8 @@ public class DeathPathLogic { AbstractRank guildTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); Set> zSetReverseRangeWithScores; - if(isUnlock()){ + boolean isUnlock = isUnlock(); + if(isUnlock){ zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScoresWorld(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); }else{ zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); @@ -872,7 +885,7 @@ public class DeathPathLogic { firstGuildId = Integer.valueOf(next.getValue()); doRankAdd(personRank,guildRank,task); Set> currScores; - if(isUnlock()){ + if(isUnlock){ currScores = RedisUtil.getInstence().getZsetreverseRangeWithScoresWorld(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); }else{ currScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); @@ -941,7 +954,8 @@ public class DeathPathLogic { int guildRank = getGuildRankByGuildId(guildId); List list = null; - if (isUnlock()) { //跨服 + boolean isUnlock = isUnlock(); + if (isUnlock) { //跨服 list = SGuildWarRewardBOX.worldGuildWarRewardBoxMap.get(guildRank); } else { //单服 list = SGuildWarRewardBOX.guildWarRewardBoxMap.get(guildRank); @@ -950,7 +964,7 @@ public class DeathPathLogic { //SGuildWarRewardBOX表里有当前排行数据 if (list != null && list.size() > 0) { Map rewardBoxMap; - if (isUnlock()) { //跨服 + if (isUnlock) { //跨服 rewardBoxMap = RedisUtil.getInstence().getMapValuesWorld(RedisKey.GLOBAL_DEATH_PATH_WORLD,groupId() + ":" + RedisKey.DEATH_PATH_REWARD_BOX + ":" + String.valueOf(guildRank), String.class, DeathReward.class); //kei= 公会排名 DEATH_PATH_REWARD_BOX=战果宝箱记录 } else { //单服 rewardBoxMap = RedisUtil.getInstence().getMapValues(RedisKey.DEATH_PATH_REWARD_BOX, String.valueOf(guildRank), String.class, DeathReward.class); //kei= 公会排名 DEATH_PATH_REWARD_BOX=战果宝箱记录 @@ -1000,7 +1014,7 @@ public class DeathPathLogic { position++; } - if (isUnlock()) { //跨服 + if (isUnlock) { //跨服 RedisUtil.getInstence().putMapEntrys(RedisKey.GLOBAL_DEATH_PATH_WORLD, groupId() + ":" + RedisKey.DEATH_PATH_REWARD_BOX + ":" + String.valueOf(guildRank), rewardBoxMap); } else { //单服 RedisUtil.getInstence().putMapEntrys(RedisKey.DEATH_PATH_REWARD_BOX, String.valueOf(guildRank), rewardBoxMap); @@ -1044,8 +1058,9 @@ public class DeathPathLogic { int itemId = 0; int itemCount = 0; int[][] itemArray; + boolean isUnlock = isUnlock(); try { - if (isUnlock()) { //跨服 + if (isUnlock) { //跨服 rewardBoxMap = RedisUtil.getInstence().getMapValuesWorld(RedisKey.GLOBAL_DEATH_PATH_WORLD,groupId() + ":" + RedisKey.DEATH_PATH_REWARD_BOX + ":" + String.valueOf(guildRank), String.class, DeathReward.class); //kei= 公会排名 } else { //单服 rewardBoxMap = RedisUtil.getInstence().getMapValues(RedisKey.DEATH_PATH_REWARD_BOX, String.valueOf(guildRank), String.class, DeathReward.class); //kei= 公会排名 @@ -1092,8 +1107,7 @@ public class DeathPathLogic { deathReward.setItemCount(itemCount); rewardBoxMap.put(String.valueOf(position), deathReward); - - if(isUnlock()){ //跨服 + if(isUnlock){ //跨服 RedisUtil.getInstence().putMapEntrys(RedisKey.GLOBAL_DEATH_PATH_WORLD,groupId() + ":" + RedisKey.DEATH_PATH_REWARD_BOX + ":" + String.valueOf(guildRank), rewardBoxMap); }else { //单服 RedisUtil.getInstence().putMapEntrys(RedisKey.DEATH_PATH_REWARD_BOX, String.valueOf(guildRank), rewardBoxMap); @@ -1264,12 +1278,12 @@ public class DeathPathLogic { //公会战活动结束,结算发邮件 public void activityEndEmailReward() throws Exception { RedisUtil redisUtil = RedisUtil.getInstence(); - + boolean isUnlock = isUnlock(); boolean haveGuildRank = false; for (int i = 1; i <= 10; i++) { AbstractRank everyGuildRank = null; Set> guildRankSet = null; - if (isUnlock()) { + if (isUnlock) { guildRankSet = redisUtil.getZsetreverseRangeWithScoresWorld(RedisKey.GLOBAL_DEATH_PATH_WORLD + ":" + groupId() + ":" + RedisKey.DEATH_PATH_EVERY_GUILD_RANK, String.valueOf(i), 0, -1); } else { everyGuildRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); @@ -1310,7 +1324,7 @@ public class DeathPathLogic { AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType()); //玩家总伤害 排行 Set> guildTotalRankSet; Set> personRankSet; - if(isUnlock()){ + if(isUnlock){ guildTotalRankSet = guildTotalRank.getRankByKeyWorld("", 0, -1); personRankSet = personRank.getRankByKeyWorld("", 0, -1); }else { @@ -1492,12 +1506,12 @@ public class DeathPathLogic { */ public List> getDeathPathFirstRank(){ Map guildFirstNumMap = new TreeMap<>(); //十绝阵: Map<公会ID,占领公会个数> 占领:当前阵公会伤害排行第一 - + boolean isUnlock = isUnlock(); AbstractRank everyGuildRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); //当前阵公会伤害 排行 for(int i=1;i<=10;i++) { String redisKey = null; Set> zSetReverseRangeWithScores; - if(isUnlock()){ //跨服 + if(isUnlock){ //跨服 redisKey = RedisKey.GLOBAL_DEATH_PATH_WORLD + ":" + groupId() + ":" + everyGuildRank.getRedisKey(); zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScoresWorld(redisKey, String.valueOf(i), 0, -1); }else { //单服 @@ -1534,7 +1548,7 @@ public class DeathPathLogic { AbstractRank guildTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); //公会总伤害 排行 //Set> guildTotalRankSet = guildTotalRank.getRankByKey("", 0, -1); //获取 公会总伤害排行 Set> guildTotalRankSet; //获取 公会总伤害排行 - if(isUnlock()){ + if(isUnlock){ guildTotalRankSet = guildTotalRank.getRankByKeyWorld("", 0, -1); //获取 公会总伤害排行 }else{ guildTotalRankSet = guildTotalRank.getRankByKey("", 0, -1); //获取 公会总伤害排行 @@ -1869,7 +1883,8 @@ public class DeathPathLogic { public static void getDeathPathTotalPersonRank(ISession session, MessageTypeProto.MessageType messageType) throws Exception { AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType()); //玩家总伤害 排行 Set> personRankSet = null; - if(DeathPathLogic.getInstance().isUnlock()){ + boolean isUnlock = getInstance().isUnlock(); + if(isUnlock){ int groupId = DeathPathLogic.getInstance().groupId(); personRankSet = personRank.getRankByKeyWorld("", 0, -1); }else { @@ -1885,7 +1900,7 @@ public class DeathPathLogic { int uid = Integer.parseInt(value); long score = item.getScore().longValue(); - if(getInstance().isUnlock()){ //跨服 + if(isUnlock){ //跨服 String userName = null; int head = 0; int headFrame = 0; @@ -1989,12 +2004,12 @@ public class DeathPathLogic { int rank = 1; List rankInfoList = new ArrayList<>(); List> deathPathFirstNumRank = getDeathPathFirstRank(); - + boolean isUnlock = getInstance().isUnlock(); //获取公会总伤害 排行 AbstractRank guildTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); //公会总伤害 排行 //Set> guildTotalRankSet = guildTotalRank.getRankByKey("", 0, -1); //获取 公会总伤害排行 Set> guildTotalRankSet; //获取 公会总伤害排行 - if(getInstance().isUnlock()){ + if(isUnlock){ guildTotalRankSet = guildTotalRank.getRankByKeyWorld("", 0, -1); //获取 公会总伤害排行 }else { guildTotalRankSet = guildTotalRank.getRankByKey("", 0, -1); //获取 公会总伤害排行 @@ -2016,7 +2031,7 @@ public class DeathPathLogic { } } - if(getInstance().isUnlock()){ //跨服 + if(isUnlock){ //跨服 //GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); //获取会长名 //Set chairMan = guildInfo.getMembers().get(GlobalsDef.CHAIRMAN); @@ -2128,12 +2143,12 @@ public class DeathPathLogic { //公会战当前阵玩家伤害排行 public static void getDeathPathCurPersonRank(ISession session,int pathId,int type, MessageTypeProto.MessageType messageType) throws Exception { - + boolean isUnlock = getInstance().isUnlock(); //当前阵:1=个人排行,2=公会排行,3=本会排行 if(type == 1){ //当前阵:1=个人排行 // AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType()); //当前阵玩家伤害排行 AbstractRank personRank; - if(getInstance().isUnlock()){ + if(isUnlock){ personRank = RankContext.getRankEnum(RankEnum.WORLD_DEATH_PATH_EVERY_PERSON_RANK.getType()); //当前阵玩家伤害排行 // personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType()); //当前阵玩家伤害排行 }else { @@ -2145,7 +2160,7 @@ public class DeathPathLogic { } //String redisKey = null; Set> zSetReverseRangeWithScores = null; - if(getInstance().isUnlock()){ //跨服 + if(isUnlock){ //跨服 String keyType = RedisKey.GLOBAL_DEATH_PATH_WORLD + ":"+ getInstance().groupId() +":"+ personRank.getRedisKey(); //redisKey = RedisKey.getKey(keyType,String.valueOf(i),true); //redisKey = RedisKey.getKey(keyType,"",true); @@ -2167,7 +2182,7 @@ public class DeathPathLogic { int uid = Integer.parseInt(value); long score = item.getScore().longValue(); - if (getInstance().isUnlock()) { //跨服 + if (isUnlock) { //跨服 String userName = ""; int head = 0; int headFrame = 0; @@ -2235,7 +2250,7 @@ public class DeathPathLogic { String redisKey = null; Set> zSetReverseRangeWithScores; - if (getInstance().isUnlock()) { //跨服 + if (isUnlock) { //跨服 // redisKey = getInstance().groupId +":"+ guildRank.getRedisKey(); redisKey = RedisKey.GLOBAL_DEATH_PATH_WORLD + ":" + getInstance().groupId() + ":" + guildRank.getRedisKey(); zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScoresWorld(redisKey, String.valueOf(i), 0, -1); @@ -2253,7 +2268,7 @@ public class DeathPathLogic { int guildId = Integer.parseInt(item.getValue()); long score = item.getScore().longValue(); - if (getInstance().isUnlock()) { //跨服 + if (isUnlock) { //跨服 GuildInfoCache guildInfoCache = getCrossGuild(guildId); if (guildInfoCache != null) { int chairmanUserId = guildInfoCache.getChairmanUserId(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java index 4562af1..a189cf8 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mail/MailLogic.java @@ -428,6 +428,46 @@ public class MailLogic { sendSystemMail(title, new ArrayList<>(), content, sendTime, reward, mailEffectiveTime, "system", TimeUtils.now(), "0"); } + /** + * 发送邮件 + */ + public void sendMail(Mail mail){ + int roleUid = mail.getRoleUid(); + User user = UserManager.getUser(roleUid); + if (user != null){ + user.getMailManager().addMail(mail); + LOGGER.info("领取redis标记的邮件==>uid={},mail={}",roleUid, mail); + MessageUtil.sendRedIndication(roleUid, GlobalsDef.MAIL_RED_TYPE); + }else { + LOGGER.error("用户为空,error sendMail==>uid={},mail={}",roleUid,mail); + } + } + + private void getMailToRedis(int uid){ + String key = RedisKey.MAIL_REWARD_MARK + RedisKey.Delimiter_colon + uid; + Map mailMap = RedisUtil.getInstence().getmapvaluekeyclass(key, String.class, Mail.class); + if (mailMap == null || mailMap.isEmpty()){ + return; + } + for (Mail mail : mailMap.values()) { + sendMail(mail); + } + RedisUtil.getInstence().del(key); + } + + /** + * 发送邮件到redis + */ + public void sendMailToRedis(int uid, String title, String content, String reward, int sendTime, int mailEffectiveTime){ + Mail mail = new Mail(uid,title,content,reward,sendTime, mailEffectiveTime,"system",Global.MAIL_TYPE_SYS); + String key = RedisKey.MAIL_REWARD_MARK + RedisKey.Delimiter_colon + uid; + String timeKey = String.valueOf(TimeUtils.now()); + RedisUtil.getInstence().putmap(key,timeKey,mail); + // 有新邮件就增加10天的有效时间 + RedisUtil.getInstence().expireMills(key, TimeUtils.ONE_DAY * 10); + LOGGER.info("redis邮件标记:key:{}, time:{}, mail:{}",key,timeKey,mail); + } + /** *每分钟检测是否有需要发的邮件 */ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java index fd3c655..3e5d9bf 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java @@ -8,6 +8,7 @@ import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.exception.ErrorCode; import com.ljsd.jieling.exception.ErrorCodeException; import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.dao.PlayerInfoCache; import com.ljsd.jieling.logic.dao.PlayerManager; import com.ljsd.jieling.logic.dao.UserManager; @@ -86,7 +87,7 @@ public class RankLogic { AbstractRank rank = RankContext.getRankEnum(type); if (RankContext.isCrossRank(type)) { //跨服 - int myGroup = WorldHelper.getGroupByServerId(); + int myGroup = GlobleSystemLogic.getInstence().getCrossGroup(); int protoId = session.getUid(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/WorldHelper.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/WorldHelper.java index 1bf7fc3..1d82331 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/WorldHelper.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/WorldHelper.java @@ -36,13 +36,13 @@ public class WorldHelper extends GlobalProtocolsManager { /** * 每周执行有一次分组 - * 每个星期从redis取一次就可以 + * 每天从redis取一次就可以 * 获取服务器分组 * @return */ public static int getGroupByServerId() { long now = System.currentTimeMillis(); - if(splitInfo == null || !TimeUtils.isSameWeek222(System.currentTimeMillis(), lastGetTime)) { + if(splitInfo == null || !TimeUtils.isSameDay(System.currentTimeMillis(), lastGetTime)) { splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class,Integer.class); lastGetTime = now; } 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 041b1d3..051be87 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 @@ -11,6 +11,7 @@ import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.handler.map.MapLogic; import com.ljsd.jieling.logic.DefTraining.DefTrainingLogic; +import com.ljsd.jieling.logic.GlobleSystemLogic; import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.SituationLogic; import com.ljsd.jieling.logic.activity.ActivityLogic; @@ -35,6 +36,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import util.TimeUtils; +import java.util.Calendar; + /** * 分钟定时器 */ @@ -86,6 +89,8 @@ public class MinuteTask extends Thread { try { //计算世界等级 ActivityLogic.getInstance().checkSecretBoxSeason(); + //跨服分组 + everyMondayZeroClockTask(); } catch (Exception e) { LOGGER.error("Exception::5=>{}", e.toString()); } @@ -112,6 +117,7 @@ public class MinuteTask extends Thread { GuildFightLogic.familyFightStatus(); //修改公会战状态分钟定时器 QuestionLogic.getInstence().checkQuestion(); MailLogic.getInstance().checkReadyToMail(); + everySundaySpecialClockTask(); } catch (Exception e) { e.printStackTrace(); LOGGER.error("Exception::13=>{}", e.toString()); @@ -169,6 +175,33 @@ public class MinuteTask extends Thread { } } + //每周一凌晨0点执行 + public void everyMondayZeroClockTask() { + Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + int w = calendar.get(Calendar.DAY_OF_WEEK) - 1; + + if (w == 1 && hour == 0 && minute == 0) { + LOGGER.info("everyMondayZeroClockTask start ..."); + GlobleSystemLogic.getInstence().doSplit(); + LOGGER.info("everyMondayZeroClockTask end ..."); + } + } + + public void everySundaySpecialClockTask() { + Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + int w = calendar.get(Calendar.DAY_OF_WEEK) - 1; + if (w == 0 && hour == 23 && minute == 0) { + LOGGER.info("everySundaySpecialClockTask worldArena send reward start ..."); + //九州每周日23.00分执行 + ArenaLogic.getInstance().worldSendRewardNew(); + LOGGER.info("everySundaySpecialClockTask worldArena send reward end ..."); + } + } + /** * 不用每分钟创建一个线程然后销毁 */ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java index 4879321..0108c96 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/MessageUtil.java @@ -113,7 +113,7 @@ public class MessageUtil { } - public static void sendRedIndication(int sendUid, int redType) throws Exception { + public static void sendRedIndication(int sendUid, int redType) { ISession session = OnlineUserManager.sessionMap.get(sendUid); if (session != null) { PlayerInfoProto.RedPointInfo redPointInfo = PlayerInfoProto.RedPointInfo.newBuilder().setType(redType).build(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/xxl/jobhandler/WorldArenaRewardJobHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/xxl/jobhandler/WorldArenaRewardJobHandler.java index 60649fe..6c1c93c 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/xxl/jobhandler/WorldArenaRewardJobHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/xxl/jobhandler/WorldArenaRewardJobHandler.java @@ -24,8 +24,8 @@ public class WorldArenaRewardJobHandler { public void arenaDailyRewardJobHandler() throws Exception { XxlJobHelper.log("worldArenaRewardJob start...."); - ArenaLogic.getInstance().worldSendReward(); - MongoUtil.getInstence().lastUpdate(); +// ArenaLogic.getInstance().worldSendReward(); +// MongoUtil.getInstence().lastUpdate(); XxlJobHelper.log("worldArenaRewardJob end...."); } } diff --git a/worldserver/src/main/java/com/world/handler/GetArenaRankRewardRequestHandler.java b/worldserver/src/main/java/com/world/handler/GetArenaRankRewardRequestHandler.java index 6a67fb7..275030c 100644 --- a/worldserver/src/main/java/com/world/handler/GetArenaRankRewardRequestHandler.java +++ b/worldserver/src/main/java/com/world/handler/GetArenaRankRewardRequestHandler.java @@ -26,9 +26,9 @@ public class GetArenaRankRewardRequestHandler extends gtGBaseHandler rankMap = ArenaLogic.ranInfo.get(proto.getGroupId()); for(Map.Entry entry:rankMap.entrySet()){ - if(entry.getValue().getServerID()!=serverId){ - continue; - } +// if(entry.getValue().getServerID()!=serverId){ +// continue; +// } response.addRankInfo(WorldProto.ArenaRank.newBuilder().setRank(entry.getKey()).setUid(entry.getValue().getEnemyId()).build()); } return response.build(); diff --git a/worldserver/src/main/java/com/world/logic/GlobalLogic.java b/worldserver/src/main/java/com/world/logic/GlobalLogic.java index 709e159..43d98c1 100644 --- a/worldserver/src/main/java/com/world/logic/GlobalLogic.java +++ b/worldserver/src/main/java/com/world/logic/GlobalLogic.java @@ -1,6 +1,7 @@ package com.world.logic; +import com.ljsd.GameApplication; import com.ljsd.jieling.db.redis.RedisKey; import com.world.redis.RedisUtil; import config.SGuildWarSetting; @@ -47,38 +48,51 @@ public class GlobalLogic { * 分组 */ public void doSplit() { - SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1); - RedisUtil redisUtil = RedisUtil.getInstence(); - //这里为所有服务器的世界等级 - Map worldLevelMap = redisUtil.getMapValues(RedisKey.SERVER_WORLDLEVE_INFO+":",String.class,Integer.class); + LOGGER.info("跨服分组验证处理"); + if(!GameApplication.serverProperties.isArenaCross()){ + LOGGER.error("跨服分组,测试服不做分组"); + return; + } + com.ljsd.jieling.db.redis.RedisUtil redisUtil = com.ljsd.jieling.db.redis.RedisUtil.getInstence(); + Object matched = redisUtil.get(RedisKey.MATCHED_SPLIT_KEY); + if(matched!=null){ + LOGGER.error("跨服分组,获取key:【MATCHED_SPLIT_KEY】失败, info:{}", matched); + return; + } + //使用分布式锁,保证只有一个服来分组 + boolean lock = redisUtil.lock("SERVER_SPLIT_REDIS_LOCK", TimeUtils.ONE_MINUTE * 2); + if(!lock){ + //没有拿到锁直接返回 + LOGGER.error("跨服分组,未获取到锁"); + return; + } - LOGGER.info("Global跨服竞技场 开始分组"); + LOGGER.info("跨服开始分组"); + // 周一零点时间戳,毫秒 long lastHour = TimeUtils.getLastOrUnderHour(TimeUtils.now(), 1, 0, 0, true); - lastHour+=(1*TimeUtils.WEEK); - int expireTime =(int)((lastHour-TimeUtils.now())/1000); - + // 加上七天,秒 + lastHour = (lastHour + TimeUtils.WEEK)/1000; + // 当前时间 + long expireTime = lastHour-TimeUtils.nowInt(); + redisUtil.set(RedisKey.MATCHED_SPLIT_KEY,String.valueOf(1),expireTime-60); //提前两分钟结算 redisUtil.set(RedisKey.MATCHED_VERSION,TimeUtils.getTimeStampYMD(System.currentTimeMillis()),expireTime-120); - worldLevelMap.forEach((k,v)->redisUtil.zsetAddOne(RedisKey.SERVER_LEVEL_RANK,k,v)); - Set> zsetRevRangeWithScore = redisUtil.getZsetRevRangeWithScore(RedisKey.SERVER_LEVEL_RANK, setting.getWorldLevel(), 999); - - int index = 0; - int areaId = 1; - Map split = new HashMap<>(zsetRevRangeWithScore.size()); - for(ZSetOperations.TypedTuple data:zsetRevRangeWithScore){ - if(index>=setting.getServerNum()){ - if((zsetRevRangeWithScore.size()-areaId*setting.getServerNum())>setting.getServerNum()/2){ - areaId++; - } - index=0; + // 分组逻辑 + Map cross = redisUtil.getMapValues(RedisKey.CROSS_SERVER_GROUP, "", String.class, Integer.class); + Map split = new HashMap<>(); + // 遍历gm分组,剔除所有分组id小于等于0的分组,这些默认不跨服 + for (Map.Entry entry : cross.entrySet()) { + if (entry.getValue()<=0){ + continue; } - split.put(data.getValue(),areaId); - - index++; + split.put(entry.getKey(),entry.getValue()); } - redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,split); - LOGGER.info("Global跨服竞技场 分组结束"); - splitInfo = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO,String.class,Integer.class); + // 删除上期分组数据,并赋值新分组数据 + redisUtil.remove(RedisKey.SERVER_SPLIT_INFO+RedisKey.Delimiter_colon); + redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,"",split); + //释放分布式锁 + redisUtil.del("SERVER_SPLIT_REDIS_LOCK"); + LOGGER.info("跨服分组结束"); } public int getSplitInfo(int serverId) { diff --git a/worldserver/src/main/java/com/world/logic/arean/ArenaLogic.java b/worldserver/src/main/java/com/world/logic/arean/ArenaLogic.java index 11d2f8f..065ad1d 100644 --- a/worldserver/src/main/java/com/world/logic/arean/ArenaLogic.java +++ b/worldserver/src/main/java/com/world/logic/arean/ArenaLogic.java @@ -16,6 +16,7 @@ import manager.STableManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.Cursor; +import util.TimeUtils; import java.io.IOException; import java.util.*; @@ -61,7 +62,7 @@ public class ArenaLogic { } public List getAndUpdateAllServerGroup(){ - Map newServerSplit = RedisUtil.getInstence().getMapValues(com.world.redis.RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class); + Map newServerSplit = RedisUtil.getInstence().getMapValues(com.world.redis.RedisKey.SERVER_SPLIT_INFO+RedisKey.Delimiter_colon, String.class, Integer.class); ArenaLogic.serverSplit = newServerSplit; return new ArrayList<>(serverSplit.values().stream().distinct().collect(Collectors.toList())); } @@ -95,7 +96,7 @@ public class ArenaLogic { public static void initRank() throws Exception { - Map serverSplit = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class); + Map serverSplit = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO+RedisKey.Delimiter_colon, String.class, Integer.class); serverSplit.forEach((s, integer) -> { HashSet strings = map.getOrDefault(integer, new HashSet<>()); strings.add(s); @@ -126,7 +127,6 @@ public class ArenaLogic { //跨服竞技场开启调用:初始化数据 public void arenaWorldOpen() { -// if (TimeUtils.getDayOfWeek(time) == 5 && TimeUtils.getHourOfDay(time) == 23 && TimeUtils.getMiunte(time) == 30) { LOGGER.info("跨服竞技场 进入新的一期"); onfinish(); LOGGER.info("-------onfinish---------"); @@ -136,7 +136,7 @@ public class ArenaLogic { //重新获取分组信息 // redisUtil.set(RedisKey.MATCHED_MY_VERSION, matched); - Map serverSplit = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, String.class, Integer.class); + Map serverSplit = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO+RedisKey.Delimiter_colon, String.class, Integer.class); serverSplit.forEach((s, integer) -> { HashSet strings = map.getOrDefault(integer, new HashSet<>()); strings.add(s); diff --git a/worldserver/src/main/java/com/world/thread/MinuteTask.java b/worldserver/src/main/java/com/world/thread/MinuteTask.java index 86f80eb..815f493 100644 --- a/worldserver/src/main/java/com/world/thread/MinuteTask.java +++ b/worldserver/src/main/java/com/world/thread/MinuteTask.java @@ -5,6 +5,7 @@ import com.world.logic.arean.ArenaLogic; import org.apache.dubbo.common.utils.NetUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.TimeUtils; /** * Author: zsx @@ -27,6 +28,12 @@ public class MinuteTask extends Thread { ArenaLogic.getInstance().minCheckSave(); //每分钟检测服务器是否注册 serverRegister2ZkCheck(); + long time = System.currentTimeMillis(); + int w = TimeUtils.getWeekOfYear(time) - 1; + //每周五23:30开启跨服竞技场 + if (w == 5 && TimeUtils.getHourOfDay(time) == 23 && TimeUtils.getMiunte(time) == 30) { + ArenaLogic.getInstance().arenaWorldOpen(); + } } catch (Exception e) { LOGGER.error("e",e); } diff --git a/worldserver/src/main/java/com/world/xxljob/handler/ArenaLogicCrossServerFightJobHandler.java b/worldserver/src/main/java/com/world/xxljob/handler/ArenaLogicCrossServerFightJobHandler.java index 7df30eb..4fcdd7c 100644 --- a/worldserver/src/main/java/com/world/xxljob/handler/ArenaLogicCrossServerFightJobHandler.java +++ b/worldserver/src/main/java/com/world/xxljob/handler/ArenaLogicCrossServerFightJobHandler.java @@ -17,7 +17,7 @@ public class ArenaLogicCrossServerFightJobHandler { public void arenaLogicCrossServerFightJob() throws Exception { XxlJobHelper.log("arenaLogicCrossServerFightJob start...."); - ArenaLogic.getInstance().arenaWorldOpen(); +// ArenaLogic.getInstance().arenaWorldOpen(); XxlJobHelper.log("arenaLogicCrossServerFightJob end...."); } } diff --git a/worldserver/src/main/java/com/world/xxljob/handler/EveryMondayZeroDoSplitHandler.java b/worldserver/src/main/java/com/world/xxljob/handler/EveryMondayZeroDoSplitHandler.java index 48319c6..1434b2a 100644 --- a/worldserver/src/main/java/com/world/xxljob/handler/EveryMondayZeroDoSplitHandler.java +++ b/worldserver/src/main/java/com/world/xxljob/handler/EveryMondayZeroDoSplitHandler.java @@ -9,8 +9,9 @@ import org.springframework.stereotype.Component; public class EveryMondayZeroDoSplitHandler { @XxlJob("globalArenaDoSplitJobHandler") public void serverSplitJob() throws Exception { + //弃用,xxljob的方法全部弃用 XxlJobHelper.log("serverSplitJob start...."); - GlobalLogic.getInstance().doSplit(); +// GlobalLogic.getInstance().doSplit(); XxlJobHelper.log("serverSplitJob end...."); } }