排行榜重构修改

back_recharge
lvxinran 2019-11-27 10:49:05 +08:00
parent 300e03d91a
commit 2e21d0f580
7 changed files with 334 additions and 44 deletions

View File

@ -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);
}

View File

@ -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());

View File

@ -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));
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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];
}
}