跨服十绝阵修改

back_recharge
duhui 2021-07-30 15:03:17 +08:00
parent 66c2617d7f
commit 931db8e069
12 changed files with 110 additions and 66 deletions

View File

@ -1,6 +1,7 @@
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;
@ -434,7 +435,4 @@ public class RedisKey {
// }
}
}

View File

@ -984,10 +984,12 @@ public class RedisUtil {
return null;
}
public Long getZSetreverseRank(String type,String key, String value){
String rkey = getKey(type,key);
return getZSetreverseRank(type,key,value,true);
}
public Long getZSetreverseRank(String type,String key, String value, boolean choice){
String rkey = getKey(type,key,choice);
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
Long rank = redisTemplate.opsForZSet().reverseRank(rkey, value);
@ -1003,9 +1005,12 @@ public class RedisUtil {
return -1L;
}
public Double getZSetScore(String type,String key, String value){
String rkey = getKey(type, key);
return getZSetScore(type,key,value,true);
}
public Double getZSetScore(String type,String key, String value, boolean choice){
String rkey = getKey(type, key, choice);
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
Double score = redisTemplate.opsForZSet().score(rkey, value);
@ -1034,12 +1039,20 @@ public class RedisUtil {
}
public void incrementZsetScore(String type,String key, String value, int changeScore){
incrementZsetScore(type,key,value,(double)(changeScore));
public void incrementZsetScore(String type,String key, String value, int changeScore){
incrementZsetScore(type,key,value,(double)(changeScore), true);
}
public void incrementZsetScore(String type,String key, String value, double changeScore){
String rkey = getKey(type, key);
public void incrementZsetScore(String type,String key, String value, int changeScore, boolean choice){
incrementZsetScore(type,key,value,(double)(changeScore), choice);
}
public void incrementZsetScore(String type,String key, String value, double changeScore){
incrementZsetScore(type,key,value,changeScore, true);
}
public void incrementZsetScore(String type,String key, String value, double changeScore, boolean choice){
String rkey = getKey(type, key,choice);
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
redisTemplate.opsForZSet().incrementScore(rkey,value,changeScore);

View File

@ -252,6 +252,10 @@ public class GlobleSystemLogic implements IEventHandler {
index++;
}
// 跨服排行榜处理
CrossRankManager.getInstance().cleanCrossRank();
CrossRankManager.getInstance().crossRankHandle(true);
redisUtil.putMapEntrys(RedisKey.SERVER_SPLIT_INFO,"",split);
//发分组邮件
split.keySet().forEach(server->redisUtil.putMapEntry(RedisKey.SERVER_SPLIT_MAIL_INFO,"",server,0));

View File

@ -6,6 +6,9 @@ import com.ljsd.jieling.db.mongo.core.CServerInfo;
import com.ljsd.jieling.db.redis.RedisKey;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.logic.dao.GuildInfoCache;
import com.ljsd.jieling.logic.rank.RankContext;
import com.ljsd.jieling.logic.rank.RankEnum;
import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank;
import com.ljsd.jieling.tools.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -90,26 +93,30 @@ public class CrossDeathPathLogic {
//操作每个关的公会、个人数据
BigDecimal decimal = new BigDecimal(String.valueOf(damage)).divide(new BigDecimal(String.valueOf(Math.pow(10,15))));
long everyGuildChangeScore = (long)damage*1000;
if(redisUtil.getZSetScore(groupId+":"+RedisKey.DEATH_PATH_EVERY_PERSON_RANK,String.valueOf(pathId), String.valueOf(uid))==-1){
AbstractRank everyPerson = RankContext.getRankEnum(RankEnum.DEATH_PATH_EVERY_PERSON_RANK.getType());
if(redisUtil.getZSetScore(everyPerson.getCrossRedisKey(),String.valueOf(pathId), String.valueOf(uid), false)==-1){
//记录人数操作
everyGuildChangeScore = everyGuildChangeScore+1;
}
String before = firstGuild(redisUtil, groupId, pathId);
redisUtil.incrementZsetScore(groupId+":"+RedisKey.DEATH_PATH_EVERY_GUILD_RANK,String.valueOf(pathId),String.valueOf(guildId), everyGuildChangeScore);
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);
AbstractRank totalGuild = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType());
if(!before.equals(after)){
decimal = decimal.add(new BigDecimal(1));
if(!"".equals(before)){
redisUtil.incrementZsetScore(groupId+":"+RedisKey.DEATH_PATH_TOTAL_GUILD_RANK,"",before, -1);
redisUtil.incrementZsetScore(totalGuild.getCrossRedisKey(),"",before, -1,false);
}
}
AbstractRank totalPerson = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_PERSON_RANK.getType());
// 个人单个排行
redisUtil.incrementZsetScore(groupId+":"+RedisKey.DEATH_PATH_EVERY_PERSON_RANK,String.valueOf(pathId),String.valueOf(uid), damage);
redisUtil.incrementZsetScore(everyPerson.getCrossRedisKey(),String.valueOf(pathId),String.valueOf(uid), damage,false);
//操作总的个人伤害
redisUtil.incrementZsetScore(groupId+":"+RedisKey.DEATH_PATH_TOTAL_PERSON_RANK,"",String.valueOf(uid), damage);
redisUtil.incrementZsetScore(totalPerson.getCrossRedisKey(),"",String.valueOf(uid), damage,false);
//操作总的工会伤害
redisUtil.incrementZsetScore(groupId+":"+RedisKey.DEATH_PATH_TOTAL_GUILD_RANK,"",String.valueOf(guildId), decimal.doubleValue());
redisUtil.incrementZsetScore(totalGuild.getCrossRedisKey(),"",String.valueOf(guildId), decimal.doubleValue(),false);
// 结算标识设置
redisUtil.hset(RedisKey.DEATH_PATH_EVERY_OVER_HASH,String.valueOf(GameApplication.serverId),1);
}
@ -157,9 +164,10 @@ public class CrossDeathPathLogic {
*/
public Map<Integer,Integer> crossDeathPathReward(int groupId,int serverId){
if(TimeUtils.getHourOfDay()!=0){
return new HashMap<>();
return new HashMap<>(1);
}
Set<ZSetOperations.TypedTuple<String>> values = RedisUtil.getInstence().getZsetreverseRangeWithScores(groupId+":" + RedisKey.DEATH_PATH_TOTAL_GUILD_RANK, "", 0, -1);
AbstractRank totalGuild = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType());
Set<ZSetOperations.TypedTuple<String>> values = RedisUtil.getInstence().getZsetreverseRangeWithScores(totalGuild.getCrossRedisKey(), "", 0, -1, false);
HashMap<Integer, Integer> hashMap = new HashMap<>();
int rank =0;
for(ZSetOperations.TypedTuple<String> value:values){
@ -175,7 +183,7 @@ public class CrossDeathPathLogic {
Map<Object, Object> hmget = RedisUtil.getInstence().hmget(RedisKey.DEATH_PATH_EVERY_OVER_HASH);
if (hmget == null || hmget.size() < 1) {
Cursor<String> cursor = RedisUtil.getInstence().scan(groupId + ":DEATH_PATH*", -1);
Cursor<String> cursor = RedisUtil.getInstence().scan("DEATH_PATH*"+groupId+":*", -1);
while (cursor.hasNext()) {
//找到一次就添加一次
String next = cursor.next();

View File

@ -305,14 +305,16 @@ public class DeathPathLogic {
for (int i = 1; i <= 10; i++) {
String key;
// 是否是跨服
Set<ZSetOperations.TypedTuple<String>> zSetReverseRangeWithScores;
if (groupId > 0) {
key = groupId + ":" + guildRank.getRedisKey();
key = guildRank.getCrossRedisKey();
zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(key, String.valueOf(i), 0, 0,false);
LOGGER.info("========================获取十绝阵内部信息,跨服:{}",uid);
} else {
key = guildRank.getRedisKey();
zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(key, String.valueOf(i), 0, 0,true);
LOGGER.info("========================获取十绝阵内部信息,本地:{}",uid);
}
Set<ZSetOperations.TypedTuple<String>> zSetReverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(key, String.valueOf(i), 0, 0);
Iterator<ZSetOperations.TypedTuple<String>> iterator = zSetReverseRangeWithScores.iterator();
if (!iterator.hasNext()) {
continue;
@ -425,7 +427,6 @@ public class DeathPathLogic {
LOGGER.info("==================跨服十绝阵上榜处理:{}",task.toString());
} catch (Exception e) {
LOGGER.error("==================跨服十绝阵上榜异常:{}",e.getMessage());
e.printStackTrace();
}
return;
}
@ -551,15 +552,16 @@ public class DeathPathLogic {
}
//根据排名进行随机奖励
int rank;
String key;
AbstractRank rankEnum = RankContext.getRankEnum(RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType());
if(groupId>0){
key = groupId + ":" + RedisKey.DEATH_PATH_TOTAL_GUILD_RANK;
String key = rankEnum.getCrossRedisKey();
rank = RedisUtil.getInstence().getZSetreverseRank(key, "", String.valueOf(user.getPlayerInfoManager().getGuildId()),false).intValue();
LOGGER.info("==================获取十绝阵奖励,跨服,分组:{},玩家:{}",groupId,uid);
}else {
key = RedisKey.DEATH_PATH_TOTAL_GUILD_RANK;
String key = rankEnum.getRedisKey();
rank = RedisUtil.getInstence().getZSetreverseRank(key, "", String.valueOf(user.getPlayerInfoManager().getGuildId()),true).intValue();
LOGGER.info("==================获取十绝阵奖励,本地,分组:{},玩家:{}",groupId,uid);
}
rank = RedisUtil.getInstence().getZSetreverseRank(key, "", String.valueOf(user.getPlayerInfoManager().getGuildId())).intValue();
if(rank==-1||rank==0){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}

View File

@ -11,6 +11,7 @@ import com.ljsd.jieling.globals.BIReason;
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.OnlineUserManager;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.root.MailingSystem;
@ -424,6 +425,19 @@ public class MailLogic {
MongoUtil.getInstence().getMyMongoTemplate().saveWithoutMongoRoot(serverConfigTmp);
MailLogic.getInstance().sendSystemMail(title,new ArrayList<>(),content,nowTime,"",30*24*60*60,"system",TimeUtils.now(),"0");
sendCrossServerIndication();
}
/**
* 线
*/
public void sendCrossServerIndication(){
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
int result = crossGroup == -1 ? 0 : 1;
PlayerInfoProto.IsCrossResponse build = PlayerInfoProto.IsCrossResponse.newBuilder().setIsCross(result).build();
for(ISession session:OnlineUserManager.sessionMap.values()){
MessageUtil.sendIndicationMessage(session.getUid(),build);
}
}
/**

View File

@ -43,35 +43,11 @@ public class CrossRankManager {
*/
private long time = 0L;
/**
*
*/
// public void isDataHandle(){
// LOGGER.info("==========================开始验证是否需要进行跨服数据处理");
// // 获取全部服务器分组信息
// Map<Integer, Integer> groupValues = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, "", Integer.class, Integer.class);
// if (groupValues == null || groupValues.isEmpty()){
// return;
// }
// // 获取本服id和本服的分组信息
// int serverId = GameApplication.serverId;
// Integer groupId = groupValues.get(serverId);
// if (groupId == null || groupId <= 0){
// return;
// }
// // stream聚合 筛选条件value==groupId, 正序返回
// List<Integer> list = groupValues.entrySet().stream().filter(v -> v.getValue().equals(groupId)).map(Map.Entry::getKey).sorted().collect(Collectors.toList());
// // 缓存服务器列表,其他地方会用
// serverListByGroup.clear();
// serverListByGroup.addAll(list);
// LOGGER.info("==========================验证是否需要进行跨服数据处理结果");
// }
/**
*
*/
public void crossRankHandle(){
if (!isTime()){
public void crossRankHandle(boolean choice){
if (choice || !isTime()){
// 不是处理数据的服务器
return;
}
@ -85,7 +61,7 @@ public class CrossRankManager {
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
if(crossGroup != -1){
AbstractRank rank = RankContext.getRankEnum(type);
String key = RedisUtil.getInstence().getKey(rank.getRedisKey(),String.valueOf(crossGroup),false);
String key = RedisUtil.getInstence().getKey(rank.getCrossRedisKey(),"",false);
Set<ZSetOperations.TypedTuple<String>> range = RedisUtil.getInstence().getZsetreverseRangeWithScores(rank.getRedisKey(), "", 0, 100, true);
for (ZSetOperations.TypedTuple<String> tuple : range) {
if (tuple.getValue().length() == 8){
@ -126,4 +102,26 @@ public class CrossRankManager {
LOGGER.info("==================工会缓存处理=============");
}
/**
*
*/
public void cleanCrossRank(){
for (RankEnum value : RankEnum.values()) {
int type = value.getType();
if (RankContext.isCrossRank2(type)) {
//跨服
if (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);
LOGGER.info("=====================跨服排行榜清理========,key:{}", key);
}
}
}
}
}
}

View File

@ -76,9 +76,8 @@ public class RankLogic {
AbstractRank rank = RankContext.getRankEnum(type);
if(RankContext.isCrossRank(type) && isCross == 1){
//跨服
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
if(crossGroup>0){
rankResponse = rank.getCrossRank(session.getUid(),String.valueOf(crossGroup),index/20+1, 20);
if(GlobleSystemLogic.getInstence().getCrossGroup() > 0){
rankResponse = rank.getCrossRank(session.getUid(),rkey,index/20+1, 20);
}
}else{
rankResponse = rank.getRank(session.getUid(),rkey,index/20+1, 20);

View File

@ -75,8 +75,9 @@ public abstract class AbstractRank implements IRank {
page = 1;
}
int start = (page - 1) * rankEndLine, end = page * rankEndLine - 1;
Set<ZSetOperations.TypedTuple<String>> scores = RedisUtil.getInstence().getZsetreverseRangeWithScores(redisKey, rkey, start, end, false);
if(start%rankEndLine == 0){
Set<ZSetOperations.TypedTuple<String>> scores =
RedisUtil.getInstence().getZsetreverseRangeWithScores(getCrossRedisKey(), rkey, start, end, false);
if(start % rankEndLine == 0){
start++;
}
PlayerInfoProto.RankResponse.Builder allUserResponse = getAllUserResponse(scores,start);
@ -98,7 +99,7 @@ public abstract class AbstractRank implements IRank {
}
CrossServiceLogic.getInstance().dispose(user);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("================跨服排行榜缓存玩家数据报错=========,uid:{},error:{}",uid,e.getMessage());
}
}
@ -134,6 +135,11 @@ public abstract class AbstractRank implements IRank {
return redisKey;
}
public String getCrossRedisKey() {
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
return RedisUtil.getInstence().getKey(redisKey,String.valueOf(crossGroup),false);
}
public int getType() {
return type;
}

View File

@ -2,12 +2,11 @@ package com.ljsd.jieling.logic.rank.rankImpl;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.logic.dao.GuilidManager;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.GuildInfo;
import com.ljsd.jieling.logic.dao.root.User;
import org.springframework.data.redis.core.ZSetOperations;
import rpc.protocols.CommonProto;
import rpc.protocols.PlayerInfoProto;
import org.springframework.data.redis.core.ZSetOperations;
/**
@ -20,6 +19,7 @@ public class DeathPathEveryGuildRank extends AbstractRank {
super(type, redisKey);
}
@Override
protected void getOptional(int index, ZSetOperations.TypedTuple<String> data, PlayerInfoProto.RankResponse.Builder builder) {
GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(data.getValue()));
CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder()
@ -39,6 +39,7 @@ public class DeathPathEveryGuildRank extends AbstractRank {
return new long[]{(long)(score/1000),(int)(score%1000)};
}
@Override
public double getScore(double... data) {
long result = (long) (data[0]*1000);
if(data.length>1){

View File

@ -2,6 +2,7 @@ package com.ljsd.jieling.logic.rank.rankImpl;
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;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.GuildInfo;
@ -31,14 +32,14 @@ public class DeathPathTotalGuildRank extends AbstractRank{
@Override
public double getScore(double... data) {
BigDecimal decimal = null;
decimal = new BigDecimal(String.valueOf(data[0])).divide(new BigDecimal(String.valueOf(Math.pow(10,15))));
BigDecimal decimal = new BigDecimal(String.valueOf(data[0])).divide(new BigDecimal(String.valueOf(Math.pow(10,15))));
if(data.length>1){
decimal = decimal.add(new BigDecimal(data[1]));
}
return decimal.doubleValue();
}
@Override
protected void getOptional(int index, ZSetOperations.TypedTuple<String> data, PlayerInfoProto.RankResponse.Builder builder) throws Exception {
GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(data.getValue()));
DeathChallengeCount countInfo = RedisUtil.getInstence().get(RedisKey.DEATH_PATH_TOTAL_CHALLENGE_COUNT, String.valueOf(guildInfo.getId()), DeathChallengeCount.class);

View File

@ -146,7 +146,7 @@ public class MinuteTask extends Thread {
}
try {
CrossRankManager.getInstance().crossRankHandle();
CrossRankManager.getInstance().crossRankHandle(false);
}catch (Exception e){
e.printStackTrace();
LOGGER.error("跨服排行榜初始化一次Exception::=>{}",e.toString());