跨服第一版

lvxinran 2021-06-26 01:56:46 +08:00
parent af83955bd5
commit 040a412069
8 changed files with 257 additions and 113 deletions

View File

@ -320,6 +320,9 @@ public class RedisKey {
// 跨服 排行
public static final String CROSS_SERVICE_ARENA = "CROSS_SERVICE_ARENA";
//跨服机器人信息
public static final String CROSS_ARENA_ROBOT_INFO = "CROSS_ARENA_ROBOT_INFO";
public static Set<String> familyKey = new HashSet<>();

View File

@ -56,9 +56,7 @@ public class GetWorldArenaChallengeRequestHandler extends BaseHandler<WorldProto
TimeControllerOfFunction timeControllerOfFunction = GlobalDataManaager.getInstance().getTimeControllerOfFunctionByFunctinoType(FunctionIdEnum.World_Arena);
long diff = (System.currentTimeMillis() - timeControllerOfFunction.getStartTime())/1000;
if (diff > setting.getBattleTime()[0] && diff < setting.getBattleTime()[1]) {
} else {
if (diff < setting.getBattleTime()[0] || diff > setting.getBattleTime()[1]) {
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF);
}
User user = UserManager.getUser(iSession.getUid());

View File

@ -2,22 +2,35 @@ package com.ljsd.jieling.handler.gtw;
import com.ljsd.jieling.core.FunctionIdEnum;
import com.ljsd.jieling.core.HandlerLogicThread;
import com.ljsd.jieling.db.redis.RedisKey;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.exception.ErrorCode;
import com.ljsd.jieling.exception.ErrorCodeException;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.GlobalDataManaager;
import com.ljsd.jieling.logic.GlobleSystemLogic;
import com.ljsd.jieling.logic.arena.ArenaLogic;
import com.ljsd.jieling.logic.arenaworld.ArenaWorldLogic;
import com.ljsd.jieling.logic.dao.TimeControllerOfFunction;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.network.server.GlobalidHelper;
import com.ljsd.jieling.network.server.WorldHelper;
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.network.session.ISession;
import com.ljsd.jieling.util.MessageUtil;
import config.SGlobalSystemConfig;
import config.SMServerArenaSetting;
import manager.STableManager;
import org.springframework.data.redis.core.ZSetOperations;
import rpc.protocols.CommonProto;
import rpc.protocols.MessageTypeProto;
import rpc.world.WorldProto;
import java.util.Map;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Description: gs basehandler w
@ -28,7 +41,7 @@ public class GetWorldArenaInfoRequestHandler extends BaseHandler<WorldProto.GetW
@Override
public MessageTypeProto.MessageType getMessageCode() {
return null;
return MessageTypeProto.MessageType.GetWorldArenaInfoRequest;
}
@Override
@ -54,16 +67,108 @@ public class GetWorldArenaInfoRequestHandler extends BaseHandler<WorldProto.GetW
}
GlobalidHelper.WorldInfo worldInfo = GlobalidHelper.getWorldInfo();
if (null == worldInfo){
throw new ErrorCodeException("world unavailable or play not open");
WorldProto.GetWorldArenaInfoResponse.Builder builder = WorldProto.GetWorldArenaInfoResponse.newBuilder();
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
builder.setIsGroup(crossGroup==-1?0:1);
builder.setStage(ArenaLogic.getState());
if (diff > setting.getRestTime()[0] && diff < setting.getRestTime()[1]) {
//多加1分钟 周期间隔后 client再发起请求
builder.setEndTime((int)(timeControllerOfFunction.getStartTime()/1000+setting.getRestTime()[1])+61);
} else if (diff > setting.getBattleTime()[0] && diff < setting.getBattleTime()[1]) {
builder.setEndTime((int)(timeControllerOfFunction.getStartTime()/1000+setting.getBattleTime()[1])+10);
} else {
throw new ErrorCodeException(ErrorCode.ACTIVITY_NOT_OPEN);
}
//转发到world服
boolean b = WorldHelper.sendMessageToWord(iSession.getUid(),proto);
if(!b){
throw new ErrorCodeException(ErrorCode.UNKNOWN);
if (!ArenaWorldLogic.checkJoin(String.valueOf(iSession.getUid()))) {
builder.setEnterable(-1);
}
CommonProto.ArenaInfo.Builder builder1 = CommonProto.ArenaInfo.newBuilder();
// try {
//// Lockeys.getInstance().lock("arena", rpcMessage.getServerId());
// int serverId = rpcMessage.getServerId();
// Integer integer = ArenaLogic.serverSplit.get(String.valueOf(serverId));
// HashMap<Integer, ArenaEnemy> integerIntegerHashMap = ArenaLogic.ranInfo.get(integer);
// if (integerIntegerHashMap == null) {
// builder.setStage(1);
// return builder.build();
// }
//获取我的排名
// Map.Entry<Integer, ArenaEnemy> myRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid());
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
double score = rank.getRankIndexByKey(String.valueOf(crossGroup),iSession.getUid());
builder1.setScore(score==-1?9999:(int)score);
//如果是攻击阶段
if(ArenaLogic.getState()==ArenaLogic.BATTLE_STATE){
}else{
//拿前4个
Set<ZSetOperations.TypedTuple<String>> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), 0, 4);
Set<Integer> keys = new HashSet<>(4);
rankByKey.forEach(n->keys.add(Integer.parseInt(n.getValue())));
List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(keys);
builder1.addAllArenaEnemys(arenaEnemyList);
}
// List<String> strings = RedisUtil.getInstence().lGet(RedisKey.WORLD_ARENA_MY_PRON,String.valueOf(iSession.getUid()), 0, -1);
builder.setArenaInfo(builder1.build());
MessageUtil.sendMessage(iSession,1, MessageTypeProto.MessageType.GetWorldArenaInfoResponse.getNumber(),builder.build(),true);
// List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getArenaEnemyList(new LinkedList<>(arenaEnemies),strings);
// builder1.setScore(myIndex)
// .addAllArenaEnemys(arenaEnemyList)
// .build();
// //根据我的排名获取
// int myIndex = 9999;
// if (myRank != null) {
// myIndex = myRank.getKey();
// }
// List<ArenaEnemy> arenaEnemies;
// if(proto.getIsPro()){
// //获取前4名
// arenaEnemies = new LinkedList<>();
// for (int i = 1; i <=4 ; i++) {
// ArenaEnemy arenaEnemy = integerIntegerHashMap.get(i);
// if(arenaEnemy.getRank()==0){
// arenaEnemy.setRank(i);
// }
// arenaEnemies.add(arenaEnemy);
// }
// }else {
// arenaEnemies = ArenaLogic.randomRank(integerIntegerHashMap, rpcMessage.getUid(), myIndex);
// }
//
// builder.setStage(2);
// List<String> strings = RedisUtil.getInstence().lGet(RedisKey.WORLD_ARENA_MY_PRON,String.valueOf(rpcMessage.getUid()), 0, -1);
// List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getArenaEnemyList(new LinkedList<>(arenaEnemies),strings);
// builder1.setScore(myIndex)
// .addAllArenaEnemys(arenaEnemyList)
// .build();
//
// } catch (Exception e) {
// e.printStackTrace();
// LOGGER.error(e.toString());
// } finally {
// // Lockeys.getInstance().reset();
// }
// builder.setArenaInfo(builder1)
// return builder.build();
// if (proto.getStage() != 1) {
// WorldProto.GetWorldArenaInfoResponse.Builder builder = WorldProto.GetWorldArenaInfoResponse.newBuilder(proto);
// SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
// if (setting == null) {
// throw new ErrorCodeException(ErrorCode.CFG_NULL);
// }
// TimeControllerOfFunction timeControllerOfFunction = GlobalDataManaager.getInstance().getTimeControllerOfFunctionByFunctinoType(FunctionIdEnum.World_Arena);
// long diff = (System.currentTimeMillis() - timeControllerOfFunction.getStartTime())/1000;
//
//
// if (!ArenaWorldLogic.checkJoin(String.valueOf(rpcMessage.getUid()))) {
// builder.setEnterable(-1);
// }
//
// proto = builder.build();
// }
}
}

View File

@ -10,7 +10,6 @@ import com.ljsd.jieling.logic.activity.ActivityLogic;
import com.ljsd.jieling.logic.activity.ActivityType;
import com.ljsd.jieling.logic.activity.IEventHandler;
import com.ljsd.jieling.logic.activity.event.*;
import com.ljsd.jieling.logic.dao.ServerConfig;
import com.ljsd.jieling.logic.dao.root.GlobalSystemControl;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.util.InnerMessageUtil;
@ -189,6 +188,7 @@ public class GlobleSystemLogic implements IEventHandler {
}
public static int getGlobalWorldLevelCache() {
GLOABLE_WORLD_LEVE_CACHE = 120;
if (GLOABLE_WORLD_LEVE_CACHE!=0)
return GLOABLE_WORLD_LEVE_CACHE;
Integer level = RedisUtil.getInstence().getMapValue(RedisKey.SERVER_WORLDLEVE_INFO, "",String.valueOf(GameApplication.serverId),Integer.class);

View File

@ -14,6 +14,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.activity.event.Poster;
import com.ljsd.jieling.logic.dao.*;
@ -25,6 +26,9 @@ import com.ljsd.jieling.logic.mail.MailLogic;
import com.ljsd.jieling.logic.mission.GameEvent;
import com.ljsd.jieling.logic.mission.event.MissionEventDistributor;
import com.ljsd.jieling.logic.player.PlayerLogic;
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.logic.redpacket.WelfareRedPackEvent;
import com.ljsd.jieling.logic.redpacket.WelfareRedPacketType;
import com.ljsd.jieling.network.server.GlobalidHelper;
@ -66,9 +70,9 @@ public class ArenaLogic {
private int curSeason;
private int viewSeason;
private static int state = 0;
private final static int BATTLE_STATE = 1;
private final static int RELAX_STATE = 2;
private static int state = 1;
public final static int BATTLE_STATE = 2;
public final static int RELAX_STATE = 3;
public int getCurSeason() {
return curSeason;
@ -727,11 +731,13 @@ public class ArenaLogic {
public void r2e(){
LOGGER.info("罗浮争霸:休息状态转到未开始状态");
setState(0);
setState(1);
}
public void e2b(){
if(state==BATTLE_STATE)return;
LOGGER.info("罗浮争霸:未开始状态转到战斗状态");
initRank();
setState(BATTLE_STATE);
}
@ -743,23 +749,43 @@ public class ArenaLogic {
}
long diff = (System.currentTimeMillis() - timeControllerOfFunction.getStartTime())/1000;
SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
switch(state){
case 0:
if (diff > setting.getBattleTime()[0] && diff <= setting.getBattleTime()[1]) {
e2b();
}
break;
case 1:
if (diff > setting.getBattleTime()[1] && diff <= setting.getRestTime()[0]) {
b2r();
}
break;
case 2:
if (diff > setting.getRestTime()[1]) {
r2e();
}
break;
if (diff > setting.getBattleTime()[0] && diff <= setting.getBattleTime()[1]) {
e2b();
}else if (diff > setting.getBattleTime()[1] && diff <= setting.getRestTime()[0]) {
b2r();
} else if (diff > setting.getRestTime()[1]) {
r2e();
}
}
//初始化机器人信息
private void initRank(){
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
int robotIndex = 1000;
Random random = new Random();
Map<String,CrossArenaEnemy> robotInfo = new HashMap<>(1000);
Map<Integer, Integer> groupValues = RedisUtil.getInstence().getMapValues(RedisKey.SERVER_SPLIT_INFO, "", Integer.class, Integer.class);
List<Integer> groupList = new ArrayList<>(8);
groupValues.forEach((k,v)->{
if(v==crossGroup) groupList.add(k);
});
while(--robotIndex>0){
int server = random.nextInt(groupList.size());
rank.addRank(robotIndex,String.valueOf(crossGroup),robotIndex);
robotInfo.put(String.valueOf(robotIndex),new CrossArenaEnemy(robotIndex,groupList.get(server),0,0,random.nextBoolean(),PlayerLogic.getInstance().getRandomName2()));
}
RedisUtil.getInstence().putMapEntrys(RedisKey.CROSS_ARENA_ROBOT_INFO,String.valueOf(crossGroup),robotInfo);
}
//获取跨服信息
public List<CommonProto.ArenaEnemy> getCrossArenaEnemyList(Set<Integer> ids){
return null;
}
}

View File

@ -0,0 +1,88 @@
package com.ljsd.jieling.logic.dao;
/**
* @author lvxinran
* @date 2021/6/26
* @discribe
*/
public class CrossArenaEnemy {
private int enemyId;
private int enemyId_UUid;//机器人唯一ID
private int serverID;
// 0机器人
private int enemyType;
// 0未挑战1挑战成功2挑战失败
private int enemyStatus;
private int rank;//排名
private boolean gender;
private String randomName;
public CrossArenaEnemy(int enemyId, int enemyId_UUid, int serverID, int enemyType, int enemyStatus, int rank) {
this.enemyId = enemyId;
this.enemyId_UUid = enemyId_UUid;
this.serverID = serverID;
this.enemyType = enemyType;
this.enemyStatus = enemyStatus;
this.rank = rank;
}
public CrossArenaEnemy(int enemyId, int serverID, int enemyType, int enemyStatus,boolean gender,String randomName) {
this(enemyId,serverID,enemyType,enemyStatus);
this.gender=gender;
this.randomName = randomName;
}
public CrossArenaEnemy(int enemyId, int serverID, int enemyType, int enemyStatus) {
this.enemyId = enemyId;
this.enemyId_UUid=enemyId;
this.serverID = serverID;
this.enemyType = enemyType;
this.enemyStatus = enemyStatus;
}
public CrossArenaEnemy(){
}
public int getEnemyId_UUid() {
return enemyId_UUid;
}
public void setEnemyId_UUid(int enemyId_UUid) {
this.enemyId_UUid = enemyId_UUid;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public int getServerID() {
return serverID;
}
public int getEnemyId() {
return enemyId;
}
public int getEnemyType() {
return enemyType>0?1:0;
}
public int getEnemyStatus() {
return enemyStatus;
}
public boolean isGender() {
return gender;
}
public String getRandomName() {
return randomName;
}
}

View File

@ -45,7 +45,7 @@ public enum RankEnum {
SHAN_HE_SHE_JI_STAR_RANK(30,RedisKey.SHAN_HE_SHE_JI_STAR_RANK,ShanHeSheJiTuStarRank::new,false),//山河社稷星星排行榜
TA_SUI_LING_XIAO_RANK(31,RedisKey.TA_SUI_LING_XIAO_RANK,TaSuiLingXiaoRank::new,false),
CROSS_SERVICE_ARENA(32,RedisKey.CROSS_SERVICE_ARENA,ArenaRank::new,false)
CROSS_SERVICE_ARENA(32,RedisKey.CROSS_SERVICE_ARENA,ArenaRank::new,true)
;
private int type;

View File

@ -1,76 +0,0 @@
package com.world.handler;
import com.google.protobuf.GeneratedMessage;
import com.world.logic.arean.ArenaEnemy;
import com.world.logic.arean.ArenaLogic;
import com.world.redis.RedisKey;
import com.world.redis.RedisUtil;
import rpc.net.RpcMessage;
import rpc.net.gtGBaseHandler;
import rpc.protocols.CommonProto;
import rpc.world.WorldProto;
import util.Lockeys;
import java.util.*;
/**
* Description:
* Author: zsx
* CreateDate: 2020/11/19 10:51
*/
public class GetWorldArenaInfoRequestHandler extends gtGBaseHandler<WorldProto.GetWorldArenaInfoRequest> {
@Override
public GeneratedMessage processWithProto(RpcMessage rpcMessage, WorldProto.GetWorldArenaInfoRequest proto) throws Exception {
WorldProto.GetWorldArenaInfoResponse.Builder builder = WorldProto.GetWorldArenaInfoResponse.newBuilder();
CommonProto.ArenaInfo.Builder builder1 = CommonProto.ArenaInfo.newBuilder();
try {
// Lockeys.getInstance().lock("arena", rpcMessage.getServerId());
int serverId = rpcMessage.getServerId();
Integer integer = ArenaLogic.serverSplit.get(String.valueOf(serverId));
HashMap<Integer, ArenaEnemy> integerIntegerHashMap = ArenaLogic.ranInfo.get(integer);
if (integerIntegerHashMap == null) {
builder.setStage(1);
return builder.build();
}
//获取我的排名
Map.Entry<Integer, ArenaEnemy> myRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid());
//根据我的排名获取
int myIndex = 9999;
if (myRank != null) {
myIndex = myRank.getKey();
}
List<ArenaEnemy> arenaEnemies;
if(proto.getIsPro()){
//获取前4名
arenaEnemies = new LinkedList<>();
for (int i = 1; i <=4 ; i++) {
ArenaEnemy arenaEnemy = integerIntegerHashMap.get(i);
if(arenaEnemy.getRank()==0){
arenaEnemy.setRank(i);
}
arenaEnemies.add(arenaEnemy);
}
}else {
arenaEnemies = ArenaLogic.randomRank(integerIntegerHashMap, rpcMessage.getUid(), myIndex);
}
builder.setStage(2);
List<String> strings = RedisUtil.getInstence().lGet(RedisKey.WORLD_ARENA_MY_PRON,String.valueOf(rpcMessage.getUid()), 0, -1);
List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getArenaEnemyList(new LinkedList<>(arenaEnemies),strings);
builder1.setScore(myIndex)
.addAllArenaEnemys(arenaEnemyList)
.build();
} catch (Exception e) {
e.printStackTrace();
LOGGER.error(e.toString());
} finally {
// Lockeys.getInstance().reset();
}
return builder.setArenaInfo(builder1).build();
}
}