排行榜重构修改
parent
300e03d91a
commit
2e21d0f580
|
@ -30,6 +30,9 @@ import com.ljsd.jieling.logic.fight.FightType;
|
|||
import com.ljsd.jieling.logic.hero.HeroAttributeEnum;
|
||||
import com.ljsd.jieling.logic.hero.HeroLogic;
|
||||
import com.ljsd.jieling.logic.mission.GameEvent;
|
||||
import com.ljsd.jieling.logic.rank.AbstractRank;
|
||||
import com.ljsd.jieling.logic.rank.RankContext;
|
||||
import com.ljsd.jieling.logic.rank.RankEnum;
|
||||
import com.ljsd.jieling.logic.store.StoreLogic;
|
||||
import com.ljsd.jieling.logic.store.StoreType;
|
||||
import com.ljsd.jieling.network.session.ISession;
|
||||
|
@ -1075,8 +1078,11 @@ public class MapLogic {
|
|||
mapManager.setMapIntoFlag(1);
|
||||
if(mapManager.getTower()==STrialConfig.getHighestTower()){
|
||||
mapManager.setHighestTower(mapManager.getTower());
|
||||
if(TowerRankUtil.getRankNumber(mapManager.getTower(),(int)(mapManager.getCurrTowerTime()/1000))>RedisUtil.getInstence().getZSetScore(RedisKey.TOWER_RANK, "", String.valueOf(user.getId()))){
|
||||
RedisUtil.getInstence().zsetAddOne(RedisKey.getKey(RedisKey.TOWER_RANK,"",false),String.valueOf(user.getId()),TowerRankUtil.getRankNumber(mapManager.getTower(),(int)(mapManager.getCurrTowerTime()/1000)));
|
||||
AbstractRank towerRank = RankContext.getRankEnum(RankEnum.TOWER_RANK.getType());
|
||||
// TowerRankUtil.getRankNumber(mapManager.getTower(),(int)(mapManager.getCurrTowerTime()/1000))
|
||||
if(towerRank.getScore(mapManager.getTower(),(int)(mapManager.getCurrTowerTime()/1000))>towerRank.getScoreById(user.getId())){
|
||||
towerRank.addRank(user.getId(),mapManager.getTower(),(int)mapManager.getCurrTowerTime()/1000);
|
||||
// RedisUtil.getInstence().zsetAddOne(RedisKey.getKey(RedisKey.TOWER_RANK,"",false),String.valueOf(user.getId()),TowerRankUtil.getRankNumber(mapManager.getTower(),(int)(mapManager.getCurrTowerTime()/1000)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2930,49 +2936,52 @@ public class MapLogic {
|
|||
* @throws Exception
|
||||
*/
|
||||
public void getTowerRank(ISession session,MessageTypeProto.MessageType messageType) throws Exception {
|
||||
User user = UserManager.getUser(session.getUid());
|
||||
// User user = UserManager.getUser(session.getUid());
|
||||
|
||||
int rankEndLine = SSpecialConfig.getIntegerValue(SSpecialConfig.TRIAL_RANKINGSHOWNUM);
|
||||
Set<ZSetOperations.TypedTuple<String>> zsetreverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.TOWER_RANK, "", 0, rankEndLine);
|
||||
Iterator<ZSetOperations.TypedTuple<String>> iterator = zsetreverseRangeWithScores.iterator();
|
||||
MapInfoProto.TowerRankResponse.Builder response = MapInfoProto.TowerRankResponse.newBuilder();
|
||||
int rank = 1;
|
||||
while (iterator.hasNext()){
|
||||
ZSetOperations.TypedTuple<String> next = iterator.next();
|
||||
int data = next.getScore().intValue();
|
||||
int tower = TowerRankUtil.getTowerAndTime(data)[0];
|
||||
int time = TowerRankUtil.getTowerAndTime(data)[1];
|
||||
User everyUser = UserManager.getUser(Integer.parseInt(next.getValue()), true);
|
||||
if (null == everyUser) {
|
||||
continue;
|
||||
}
|
||||
CommonProto.TowerRankInfo everyRankInfo = CommonProto.TowerRankInfo.newBuilder()
|
||||
.setRank(rank)
|
||||
.setHighestTower(tower)
|
||||
.setTime(time)
|
||||
.build();
|
||||
CommonProto.TowerRank everyRank = CommonProto.TowerRank.newBuilder()
|
||||
.setUid(everyUser.getId())
|
||||
.setUserName(everyUser.getPlayerInfoManager().getNickName())
|
||||
.setHead(everyUser.getPlayerInfoManager().getHead())
|
||||
.setHeadFrame(everyUser.getPlayerInfoManager().getHeadFrame())
|
||||
.setLevel(everyUser.getPlayerInfoManager().getLevel())
|
||||
.setTowerRankInfo(everyRankInfo)
|
||||
.build();
|
||||
response.addTowerRanks(everyRank);
|
||||
rank++;
|
||||
}
|
||||
//当前用户信息
|
||||
int myRank= RedisUtil.getInstence().getZSetreverseRank(RedisKey.TOWER_RANK,"",Integer.toString(user.getId())).intValue();
|
||||
int zSetScore = RedisUtil.getInstence().getZSetScore(RedisKey.TOWER_RANK, "", Integer.toString(user.getId())).intValue();
|
||||
int[] towerAndTime = TowerRankUtil.getTowerAndTime(zSetScore);
|
||||
CommonProto.TowerRankInfo towerRankInfo = CommonProto.TowerRankInfo.newBuilder()
|
||||
.setRank(myRank)
|
||||
.setHighestTower(towerAndTime[0])
|
||||
.setTime(towerAndTime[1]).build();
|
||||
response.setUserRank(towerRankInfo);
|
||||
PlayerInfoProto.RankResponse rankResponse= RankContext.getRankEnum(1).getRank(session.getUid(), rankEndLine);
|
||||
|
||||
MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true);
|
||||
|
||||
// Set<ZSetOperations.TypedTuple<String>> zsetreverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.TOWER_RANK, "", 0, rankEndLine);
|
||||
// Iterator<ZSetOperations.TypedTuple<String>> iterator = zsetreverseRangeWithScores.iterator();
|
||||
// MapInfoProto.TowerRankResponse.Builder response = MapInfoProto.TowerRankResponse.newBuilder();
|
||||
// int rank = 1;
|
||||
// while (iterator.hasNext()){
|
||||
// ZSetOperations.TypedTuple<String> next = iterator.next();
|
||||
// int data = next.getScore().intValue();
|
||||
// int tower = TowerRankUtil.getTowerAndTime(data)[0];
|
||||
// int time = TowerRankUtil.getTowerAndTime(data)[1];
|
||||
// User everyUser = UserManager.getUser(Integer.parseInt(next.getValue()), true);
|
||||
// if (null == everyUser) {
|
||||
// continue;
|
||||
// }
|
||||
// CommonProto.TowerRankInfo everyRankInfo = CommonProto.TowerRankInfo.newBuilder()
|
||||
// .setRank(rank)
|
||||
// .setHighestTower(tower)
|
||||
// .setTime(time)
|
||||
// .build();
|
||||
// CommonProto.TowerRank everyRank = CommonProto.TowerRank.newBuilder()
|
||||
// .setUid(everyUser.getId())
|
||||
// .setUserName(everyUser.getPlayerInfoManager().getNickName())
|
||||
// .setHead(everyUser.getPlayerInfoManager().getHead())
|
||||
// .setHeadFrame(everyUser.getPlayerInfoManager().getHeadFrame())
|
||||
// .setLevel(everyUser.getPlayerInfoManager().getLevel())
|
||||
// .setTowerRankInfo(everyRankInfo)
|
||||
// .build();
|
||||
// response.addTowerRanks(everyRank);
|
||||
// rank++;
|
||||
// }
|
||||
// //当前用户信息
|
||||
// int myRank= RedisUtil.getInstence().getZSetreverseRank(RedisKey.TOWER_RANK,"",Integer.toString(user.getId())).intValue();
|
||||
// int zSetScore = RedisUtil.getInstence().getZSetScore(RedisKey.TOWER_RANK, "", Integer.toString(user.getId())).intValue();
|
||||
// int[] towerAndTime = TowerRankUtil.getTowerAndTime(zSetScore);
|
||||
// CommonProto.TowerRankInfo towerRankInfo = CommonProto.TowerRankInfo.newBuilder()
|
||||
// .setRank(myRank)
|
||||
// .setHighestTower(towerAndTime[0])
|
||||
// .setTime(towerAndTime[1]).build();
|
||||
// response.setUserRank(towerRankInfo);
|
||||
|
||||
MessageUtil.sendMessage(session,1,messageType.getNumber(),rankResponse,true);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.ljsd.jieling.handler.map.behavior;
|
||||
|
||||
import com.ljsd.jieling.logic.rank.RankContext;
|
||||
import com.ljsd.jieling.logic.rank.RankEnum;
|
||||
import config.SChallengeConfig;
|
||||
import config.STrialConfig;
|
||||
import com.ljsd.jieling.db.redis.RedisKey;
|
||||
|
@ -43,8 +45,9 @@ public class FourtyTwoBehavior extends BaseBehavior {
|
|||
mapManager.setHighestTower(mapManager.getTower());
|
||||
Double zSetScore = RedisUtil.getInstence().getZSetScore(RedisKey.TOWER_RANK, "", String.valueOf(user.getId()));
|
||||
if(TowerRankUtil.getRankNumber(mapManager.getTower(),(int)time/1000)>zSetScore){
|
||||
String key = RedisKey.getKey(RedisKey.TOWER_RANK,"",false);
|
||||
RedisUtil.getInstence().zsetAddOne(key,String.valueOf(user.getId()),TowerRankUtil.getRankNumber(mapManager.getTower(),(int)time/1000));
|
||||
// String key = RedisKey.getKey(RedisKey.TOWER_RANK,"",false);
|
||||
// RedisUtil.getInstence().zsetAddOne(key,String.valueOf(user.getId()),TowerRankUtil.getRankNumber(mapManager.getTower(),(int)time/1000));
|
||||
RankContext.getRankEnum(RankEnum.TOWER_RANK.getType()).addRank(user.getId(),mapManager.getTower(),(int)time/1000);
|
||||
}
|
||||
}
|
||||
user.getUserMissionManager().onGameEvent(user, GameEvent.COPY_TOWER_LEVEL, mapManager.getTower());
|
||||
|
|
|
@ -0,0 +1,154 @@
|
|||
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.dao.UserManager;
|
||||
import com.ljsd.jieling.logic.dao.root.User;
|
||||
import com.ljsd.jieling.protocols.CommonProto;
|
||||
import com.ljsd.jieling.protocols.PlayerInfoProto;
|
||||
import org.springframework.data.redis.core.ZSetOperations;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* @author lvxinran
|
||||
* @date 2019/11/26
|
||||
* @discribe 排行榜抽象类
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractRank implements IRank {
|
||||
protected String redisKey;
|
||||
protected int type;
|
||||
|
||||
/**
|
||||
* 获取排行榜数据,包括个人的排名和所有人的信息,获取调用此方法
|
||||
* @param uid 改用户id
|
||||
* @param rankEndLine 所有人条目上线
|
||||
* @return 当前排行榜数据
|
||||
* @throws Exception
|
||||
*/
|
||||
public PlayerInfoProto.RankResponse getRank(int uid,int rankEndLine) throws Exception {
|
||||
User user = UserManager.getUser(uid);
|
||||
Set<ZSetOperations.TypedTuple<String>> zsetreverseRangeWithScores = getRankByKey(rankEndLine);
|
||||
PlayerInfoProto.RankResponse.Builder allUserResponse = getAllUserResponse(zsetreverseRangeWithScores);
|
||||
//当前用户信息
|
||||
getMyInfo(user,allUserResponse);
|
||||
return allUserResponse.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 向排行榜添加或修改某条数据
|
||||
* @param uid 修改用户id
|
||||
* @param data 注意:此处为传入修改的分数需要的所有参数即可,里面调用getScore方法,注意参数顺序
|
||||
*/
|
||||
public void addRank(int uid,double... data){
|
||||
String key = RedisKey.getKey(redisKey,"",false);
|
||||
RedisUtil.getInstence().zsetAddOne(key,String.valueOf(uid), getScore(data));
|
||||
}
|
||||
AbstractRank(int type,String redisKey){
|
||||
this.type = type;
|
||||
this.redisKey = redisKey;
|
||||
}
|
||||
public String getRedisKey() {
|
||||
return redisKey;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public Set<ZSetOperations.TypedTuple<String>> getRankByKey(int maxCapacity){
|
||||
return RedisUtil.getInstence().getZsetreverseRangeWithScores(redisKey, "", 0, maxCapacity);
|
||||
}
|
||||
protected PlayerInfoProto.RankResponse.Builder getAllUserResponse(Set<ZSetOperations.TypedTuple<String>> zsetreverseRangeWithScores) throws Exception{
|
||||
PlayerInfoProto.RankResponse.Builder builder = PlayerInfoProto.RankResponse.newBuilder();
|
||||
forEach(1,zsetreverseRangeWithScores,(index,data)->{
|
||||
try {
|
||||
getOptional(index,data,builder);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
return builder;
|
||||
}
|
||||
protected void getOptional(int index,ZSetOperations.TypedTuple<String> data,PlayerInfoProto.RankResponse.Builder builder) throws Exception {
|
||||
|
||||
User everyUser = UserManager.getUser(Integer.parseInt(data.getValue()), true);
|
||||
CommonProto.RankInfo everyRankInfo = CommonProto.RankInfo.newBuilder()
|
||||
.setRank(index)
|
||||
.setParam1(getParam1(data.getScore()))
|
||||
.setParam2(getParam2(data.getScore()))
|
||||
.setParam3(getParam3(data.getScore()))
|
||||
.build();
|
||||
CommonProto.UserRank everyRank = CommonProto.UserRank.newBuilder()
|
||||
.setUid(everyUser.getId())
|
||||
.setUserName(everyUser.getPlayerInfoManager().getNickName())
|
||||
.setHead(everyUser.getPlayerInfoManager().getHead())
|
||||
.setHeadFrame(everyUser.getPlayerInfoManager().getHeadFrame())
|
||||
.setLevel(everyUser.getPlayerInfoManager().getLevel())
|
||||
.setRankInfo(everyRankInfo)
|
||||
.build();
|
||||
builder.addRanks(everyRank);
|
||||
}
|
||||
|
||||
protected void getMyInfo(User user,PlayerInfoProto.RankResponse.Builder allUserResponse){
|
||||
int myRank= RedisUtil.getInstence().getZSetreverseRank(redisKey,"",Integer.toString(user.getId())).intValue();
|
||||
Double zSetScore = RedisUtil.getInstence().getZSetScore(redisKey, "", Integer.toString(user.getId()));
|
||||
CommonProto.RankInfo towerRankInfo = CommonProto.RankInfo.newBuilder()
|
||||
.setRank(myRank)
|
||||
.setParam1(getParam1(zSetScore))
|
||||
.setParam2(getParam2(zSetScore)).build();
|
||||
allUserResponse.setMyRankInfo(towerRankInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 子类需重写此方法来获得Redis解析后所需要的数据数组
|
||||
* @param score
|
||||
* @return
|
||||
*/
|
||||
public abstract int[] getDataByScore(double score);
|
||||
|
||||
/**
|
||||
* 子类需重写此方法来获得向Redis里添加的数据,根据需要的参数进行组合
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
public abstract double getScore(double... data);
|
||||
|
||||
protected static <T> void forEach(int startIndex,Iterable<? extends T> elements, BiConsumer<Integer, ? super T> action) {
|
||||
Objects.requireNonNull(elements);
|
||||
Objects.requireNonNull(action);
|
||||
if(startIndex < 0) {
|
||||
startIndex = 0;
|
||||
}
|
||||
int index = 0;
|
||||
for (T element : elements) {
|
||||
index++;
|
||||
if(index <= startIndex) {
|
||||
continue;
|
||||
}
|
||||
|
||||
action.accept(index-1, element);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public int getParam1(double data) {
|
||||
|
||||
return getDataByScore(data).length>0?getDataByScore(data)[0]:0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getParam2(double data) {
|
||||
return getDataByScore(data).length>1?getDataByScore(data)[1]:0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getParam3(double data) {
|
||||
return getDataByScore(data).length>2?getDataByScore(data)[2]:0;
|
||||
}
|
||||
public double getScoreById(int uid){
|
||||
return RedisUtil.getInstence().getZSetScore(redisKey, "", String.valueOf(uid));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package com.ljsd.jieling.logic.rank;
|
||||
|
||||
import com.ljsd.jieling.protocols.PlayerInfoProto;
|
||||
|
||||
/**
|
||||
* @author lvxinran
|
||||
* @date 2019/11/26
|
||||
* @discribe
|
||||
*/
|
||||
public interface IRank {
|
||||
|
||||
PlayerInfoProto.RankResponse getRank(int uid,int rankEndLine) throws Exception ;
|
||||
|
||||
void addRank(int uid,double... data);
|
||||
|
||||
int getParam1(double data);
|
||||
|
||||
int getParam2(double data);
|
||||
|
||||
int getParam3(double data);
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package com.ljsd.jieling.logic.rank;
|
||||
|
||||
/**
|
||||
* @author lvxinran
|
||||
* @date 2019/11/26
|
||||
* @discribe
|
||||
*/
|
||||
public class RankContext {
|
||||
|
||||
public static AbstractRank getRankEnum(int type){
|
||||
return RankEnum.toRank(type);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
package com.ljsd.jieling.logic.rank;
|
||||
|
||||
import com.ljsd.jieling.db.redis.RedisKey;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
/**
|
||||
* @author lvxinran
|
||||
* @date 2019/11/26
|
||||
* @discribe
|
||||
*/
|
||||
public enum RankEnum {
|
||||
TOWER_RANK(1,RedisKey.TOWER_RANK,TowerRank::new),
|
||||
;
|
||||
private int type;
|
||||
private String redisKey;
|
||||
private BiFunction<Integer,String,AbstractRank> rankFunction;
|
||||
private static Map<Integer,RankEnum> rankMap;
|
||||
private static Map<Integer,AbstractRank> abstractRankMap;
|
||||
|
||||
static {
|
||||
rankMap = new HashMap<>();
|
||||
Arrays.stream(RankEnum.values()).forEach((rankEnum)->rankMap.put(rankEnum.getType(),rankEnum));
|
||||
}
|
||||
RankEnum(int type,String redisKey, BiFunction<Integer,String,AbstractRank> rankFunction){
|
||||
this.type = type;
|
||||
this.redisKey = redisKey;
|
||||
this.rankFunction = rankFunction;
|
||||
}
|
||||
|
||||
public static AbstractRank toRank(int type) {
|
||||
if (abstractRankMap.containsKey(type)) {
|
||||
return abstractRankMap.get(type);
|
||||
}
|
||||
RankEnum rankEnum = rankMap.get(type);
|
||||
AbstractRank abstractRank = rankEnum.getRankFunction().apply(type,rankEnum.getRedisKey());
|
||||
abstractRankMap.put(type, abstractRank);
|
||||
return abstractRank;
|
||||
}
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getRedisKey() {
|
||||
return redisKey;
|
||||
}
|
||||
|
||||
public BiFunction<Integer, String, AbstractRank> getRankFunction() {
|
||||
return rankFunction;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package com.ljsd.jieling.logic.rank;
|
||||
import com.ljsd.jieling.protocols.PlayerInfoProto;
|
||||
import config.SSpecialConfig;
|
||||
|
||||
|
||||
/**
|
||||
* @author lvxinran
|
||||
* @date 2019/11/26
|
||||
* @discribe
|
||||
*/
|
||||
public class TowerRank extends AbstractRank {
|
||||
TowerRank(Integer type,String redisKey){
|
||||
super(type,redisKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PlayerInfoProto.RankResponse getRank(int uid,int rankEndLine) throws Exception {
|
||||
rankEndLine = SSpecialConfig.getIntegerValue(SSpecialConfig.TRIAL_RANKINGSHOWNUM);
|
||||
return super.getRank(uid, rankEndLine);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getDataByScore(double score) {
|
||||
int[] array = new int [2];
|
||||
int scoreInt = Double.valueOf(score).intValue();
|
||||
array[0] = scoreInt/3601;
|
||||
array[1] =3600-scoreInt%3601;
|
||||
return array;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getScore(double... data) {
|
||||
return data[1]>3600?data[0]*3601:data[0]*3601+3600-data[1];
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue