From 6c56cba35fa8cc0f359c788c48530c435dfc7413 Mon Sep 17 00:00:00 2001 From: duhui Date: Fri, 13 Aug 2021 10:37:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=81=E7=BB=9D=E9=98=B5=E8=B7=A8=E6=9C=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logic/family/CrossDeathPathLogic.java | 16 +-- .../jieling/logic/family/DeathPathLogic.java | 136 ++++++++---------- .../GetDeathPathFirstRequestHandler.java | 7 +- 3 files changed, 69 insertions(+), 90 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/CrossDeathPathLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/CrossDeathPathLogic.java index d43be7945..2d68589f6 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/CrossDeathPathLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/CrossDeathPathLogic.java @@ -69,14 +69,13 @@ public class CrossDeathPathLogic { /** * 首页公会 * @param redisUtil - * @param groupId * @param pathId * @return */ - private String firstGuild(RedisUtil redisUtil, int groupId, int pathId){ - String key = groupId + ":" + RedisKey.DEATH_PATH_EVERY_GUILD_RANK; + private String firstGuild(RedisUtil redisUtil, int pathId){ + AbstractRank totalGuild = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); Set> scores = redisUtil - .getZsetreverseRangeWithScores(key, String.valueOf(pathId), 0, 0,false); + .getZsetreverseRangeWithScores(totalGuild.getCrossRedisKey(), String.valueOf(pathId), 0, 0,false); return scores.iterator().hasNext()?scores.iterator().next().getValue():""; } @@ -85,13 +84,12 @@ public class CrossDeathPathLogic { * @param uid * @param damage * @param guildId - * @param groupId * @param pathId */ - void addCrossDeathPathRank(int uid, int damage, int guildId, int groupId, int pathId){ + void addCrossDeathPathRank(int uid, int damage, int guildId, int pathId){ RedisUtil redisUtil = RedisUtil.getInstence(); //操作每个关的公会、个人数据 - BigDecimal decimal = new BigDecimal(String.valueOf(damage)).divide(new BigDecimal(String.valueOf(Math.pow(10,15)))); + BigDecimal decimal = new BigDecimal(String.valueOf(damage)).divide(new BigDecimal(String.valueOf(Math.pow(10,15))),6,BigDecimal.ROUND_HALF_UP); long everyGuildChangeScore = (long)damage*1000; AbstractRank everyPerson = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType()); if(redisUtil.getZSetScore(everyPerson.getCrossRedisKey(),String.valueOf(pathId), String.valueOf(uid), false)==-1){ @@ -99,10 +97,10 @@ public class CrossDeathPathLogic { everyGuildChangeScore = everyGuildChangeScore+1; } - String before = firstGuild(redisUtil, groupId, pathId); + String before = firstGuild(redisUtil, pathId); AbstractRank everyGuild = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); redisUtil.incrementZsetScore(everyGuild.getCrossRedisKey(),String.valueOf(pathId),String.valueOf(guildId), everyGuildChangeScore, false); - String after = firstGuild(redisUtil, groupId, pathId); + String after = firstGuild(redisUtil, pathId); AbstractRank totalGuild = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); if(!before.equals(after)){ decimal = decimal.add(new BigDecimal(1)); 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 237a707f1..b815ea8c2 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 @@ -329,10 +329,10 @@ public class DeathPathLogic { } ZSetOperations.TypedTuple next = iterator.next(); int guildId = Integer.parseInt(next.getValue()); - GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + GuildInfoCache crossGuild = CrossDeathPathLogic.getCrossGuild(guildId); Integer serverId = Optional.ofNullable(CrossDeathPathLogic.getCrossGuild(guildId)).map(GuildInfoCache::getServerId).orElse(0); String serverName = CrossDeathPathLogic.getInstance().getServerNameByDeathPath(serverId); - Family.DeathPathInfo info = Family.DeathPathInfo.newBuilder().setGuildName(guildInfo.getName()).setPathId(i).setGid(guildId).setServerName(serverName).build(); + Family.DeathPathInfo info = Family.DeathPathInfo.newBuilder().setGuildName(crossGuild.getGuildName()).setPathId(i).setGid(guildId).setServerName(serverName).build(); response.addInfos(info); } MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); @@ -431,53 +431,54 @@ public class DeathPathLogic { //跨服 if(task.getGroupId()>0){ try { - CrossDeathPathLogic.getInstance().addCrossDeathPathRank(task.getUid(),task.getDamage(),task.getGuildId(),task.getGroupId(),task.getPathId()); + CrossDeathPathLogic.getInstance().addCrossDeathPathRank(task.getUid(),task.getDamage(),task.getGuildId(),task.getPathId()); LOGGER.info("==================跨服十绝阵上榜处理:{}",task.toString()); } catch (Exception e) { LOGGER.error("==================跨服十绝阵上榜异常:{}",e.getMessage()); } - return; - } - //操作每个关的公会数据 - task.setDamage(task.getDamage()); - AbstractRank guildRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); + // 本地 + }else { + LOGGER.info("==================本地十绝阵上榜处理:{}",task.toString()); + //操作每个关的公会数据 + task.setDamage(task.getDamage()); + AbstractRank guildRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()); - AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType()); + AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType()); - //操作总的个人伤害 - AbstractRank personTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType()); - personTotalRank.addRank(task.getUid(),"",task.getDamage()); - //操作总的工会伤害 - AbstractRank guildTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); + //操作总的个人伤害 + AbstractRank personTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType()); + personTotalRank.addRank(task.getUid(),"",task.getDamage()); + //操作总的工会伤害 + AbstractRank guildTotalRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); - Set> zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); - int firstGuildId; - Iterator> iterator = zSetReverseRangeWithScores.iterator(); - if(!iterator.hasNext()){ - guildTotalRank.addRank(task.getGuildId(),"",task.getDamage(),1); - //操作每个关的个人数据 - doRankAdd(personRank,guildRank,task); - //第一名推送 - sendChangeIndication(task.getGuildId(),task.getPathId()); + Set> zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); + int firstGuildId; + Iterator> iterator = zSetReverseRangeWithScores.iterator(); + if(!iterator.hasNext()){ + guildTotalRank.addRank(task.getGuildId(),"",task.getDamage(),1); + //操作每个关的个人数据 + doRankAdd(personRank,guildRank,task); + //第一名推送 + sendChangeIndication(task.getGuildId(),task.getPathId()); - }else{ - ZSetOperations.TypedTuple next = iterator.next(); - firstGuildId = Integer.parseInt(next.getValue()); - doRankAdd(personRank,guildRank,task); - Set> currScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); - Iterator> currIterator = currScores.iterator(); - ZSetOperations.TypedTuple currNext = currIterator.next(); - int currFirstGuildId = Integer.parseInt(currNext.getValue()); - if(currFirstGuildId==firstGuildId){ - guildTotalRank.addRank(task.getGuildId(),"",task.getDamage()); }else{ - //第一名更改时推送 - sendChangeIndication(currFirstGuildId,task.getPathId()); - guildTotalRank.addRank(currFirstGuildId,"",task.getDamage(),1); - guildTotalRank.addRank(firstGuildId,"",0,-1); + ZSetOperations.TypedTuple next = iterator.next(); + firstGuildId = Integer.parseInt(next.getValue()); + doRankAdd(personRank,guildRank,task); + Set> currScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(guildRank.getRedisKey(), String.valueOf(task.getPathId()), 0, 0); + Iterator> currIterator = currScores.iterator(); + ZSetOperations.TypedTuple currNext = currIterator.next(); + int currFirstGuildId = Integer.parseInt(currNext.getValue()); + if(currFirstGuildId==firstGuildId){ + guildTotalRank.addRank(task.getGuildId(),"",task.getDamage()); + }else{ + //第一名更改时推送 + sendChangeIndication(currFirstGuildId,task.getPathId()); + guildTotalRank.addRank(currFirstGuildId,"",task.getDamage(),1); + guildTotalRank.addRank(firstGuildId,"",0,-1); + } } } - } private void sendChangeIndication(int currFirstGuildId,int pathId){ @@ -610,9 +611,6 @@ public class DeathPathLogic { public void deleteDeathPathInfo() throws Exception { // redis工具 RedisUtil redisUtil = RedisUtil.getInstence(); - // 邮件标题和内容 - String mailTitle = SErrorCodeEerverConfig.getI18NMessage("guildwar_reward_title"); - String mailContent = SErrorCodeEerverConfig.getI18NMessage("guildwar_reward_txt"); // 本服id int serverId = GameApplication.serverId; if(getGroupId() > 0){ @@ -624,52 +622,24 @@ public class DeathPathLogic { return; } for (Map.Entry entry : map.entrySet()) { - int[] rewardByRank = getRewardByRank(entry.getKey()); DeathChallengeCount reward = redisUtil.getObject(serverId+":"+RedisKey.DEATH_PATH_TOTAL_CHALLENGE_COUNT+":"+entry.getValue(), DeathChallengeCount.class); - if(reward!=null&&reward.getUserReward().size()!=0){ - Map userReward = reward.getUserReward(); - for(Map.Entry rewardEntry:userReward.entrySet()){ - if(rewardEntry.getValue().getPosition()==0){ - MailLogic.getInstance().sendMail(rewardEntry.getKey(),mailTitle,mailContent,rewardByRank[0]+"#"+rewardByRank[1],TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); - } - } - } + int[] rewardByRank = getRewardByRank(entry.getKey()); + deathPathSendMail(reward,rewardByRank); } }else { LOGGER.info("===================本地十绝阵排行榜结束处理,分组:{},区服:{}",getGroupId(),serverId); //本服发奖 AbstractRank guildRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()); - AbstractRank personRank = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType()); Set> guildRankSet = guildRank.getRankByKey("", 0, -1); - Set> personRankSet = personRank.getRankByKey("", 0, -1); - if(guildRankSet.isEmpty()&&personRankSet.isEmpty()){ + if(guildRankSet.isEmpty()){ return; } - String[] removeGuildKey = new String[guildRankSet.size()]; - String[] removePersonKey = new String[personRankSet.size()]; - int index = 0; + int index = 1; for(ZSetOperations.TypedTuple item:guildRankSet){ - removeGuildKey[index] = RedisKey.getKey(RedisKey.DEATH_PATH_TOTAL_CHALLENGE_COUNT, item.getValue(),false); - index++; - } - index = 0; - for(ZSetOperations.TypedTuple item:personRankSet){ - removePersonKey[index] = RedisKey.getKey(RedisKey.DEATH_PATH_CHALLENGE_COUNT, item.getValue(),false); - index++; - } - - index = 1; - for(String key:removeGuildKey){ - int[] rewardByRank = getRewardByRank(index); + String key = RedisKey.getKey(RedisKey.DEATH_PATH_TOTAL_CHALLENGE_COUNT, item.getValue(),false); DeathChallengeCount reward = redisUtil.getObject(key, DeathChallengeCount.class); - if(reward!=null&&reward.getUserReward().size()!=0){ - Map userReward = reward.getUserReward(); - for(Map.Entry rewardEntry:userReward.entrySet()){ - if(rewardEntry.getValue().getPosition()==0){ - MailLogic.getInstance().sendMail(rewardEntry.getKey(),mailTitle,mailContent,rewardByRank[0]+"#"+rewardByRank[1],TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); - } - } - } + int[] rewardByRank = getRewardByRank(index); + deathPathSendMail(reward,rewardByRank); index++; } } @@ -684,6 +654,20 @@ public class DeathPathLogic { cursor.close(); } + private void deathPathSendMail(DeathChallengeCount reward,int[] rewardByRank) throws Exception { + // 邮件标题和内容 + String mailTitle = SErrorCodeEerverConfig.getI18NMessage("guildwar_reward_title"); + String mailContent = SErrorCodeEerverConfig.getI18NMessage("guildwar_reward_txt"); + if(reward!=null&&reward.getUserReward().size()!=0){ + Map userReward = reward.getUserReward(); + for(Map.Entry rewardEntry:userReward.entrySet()){ + if(rewardEntry.getValue().getPosition()==0){ + MailLogic.getInstance().sendMail(rewardEntry.getKey(),mailTitle,mailContent,rewardByRank[0]+"#"+rewardByRank[1],TimeUtils.nowInt(), Global.MAIL_EFFECTIVE_TIME); + } + } + } + } + public static int nextDiscrete(double[] probs) { double sum = 0.0; for (int i = 0; i < probs.length; i++) diff --git a/worldserver/src/main/java/com/world/handler/GetDeathPathFirstRequestHandler.java b/worldserver/src/main/java/com/world/handler/GetDeathPathFirstRequestHandler.java index 06d8cfa82..213ab5973 100644 --- a/worldserver/src/main/java/com/world/handler/GetDeathPathFirstRequestHandler.java +++ b/worldserver/src/main/java/com/world/handler/GetDeathPathFirstRequestHandler.java @@ -1,10 +1,7 @@ package com.world.handler; -import com.google.protobuf.GeneratedMessage; import com.ljsd.jieling.logic.dao.GuildInfoCache; -import com.ljsd.jieling.util.MonsterUtil; import com.world.db.mongo.MongoUtil; -import com.world.logic.rank.AbstractCrossRank; import com.world.logic.rank.DeathPathCrossEveryGuildRank; import com.world.redis.RedisKey; import com.world.redis.RedisUtil; @@ -30,7 +27,7 @@ public class GetDeathPathFirstRequestHandler extends gtGBaseHandler> zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(proto.getGroupId()+":"+ RedisKey.DEATH_PATH_EVERY_GUILD_RANK, String.valueOf(i), 0, 0); Iterator> iterator = zSetReverseRangeWithScores.iterator(); if(!iterator.hasNext()){ @@ -42,7 +39,7 @@ public class GetDeathPathFirstRequestHandler extends gtGBaseHandler