跨服提交

lvxinran 2021-07-03 21:36:27 +08:00
parent 966351e03c
commit 39bc93bbca
20 changed files with 807 additions and 244 deletions

View File

@ -325,6 +325,14 @@ public class RedisKey {
public static final String WORLD_ARENA_RANK_MY_MATH = "WORLD_ARENA_RANK_MY_MATH";//我匹配到的数据
//机器人膜拜次数
public static final String ARENA_PROUD_COUNT_ROBOT = "ARENA_PROUD_COUNT_ROBOT";
//玩家膜拜次数
public static final String ARENA_PROUD_COUNT = "ARENA_PROUD_COUNT";
//我自己的膜拜信息
public static final String WORLD_ARENA_MY_PRON = "WORLD_ARENA_MY_PRON";
public static final String WORLD_ARENA_RRECORD = "WORLD_ARENA_RRECORD";
public static Set<String> familyKey = new HashSet<>();

View File

@ -1257,15 +1257,14 @@ public class RedisUtil {
public String getKey(String type,String key){
if(RedisKey.PLAYER_INFO_CACHE.equals(type) ||RedisKey.FAMILY_INFO.equals(type)||RedisKey.PIDGIDTEMP.equals(type)||RedisKey.SERVER_WORLDLEVE_INFO.equals(type)|| RedisKey.GUILD_INFO_CACHE.equals(type)||RedisKey.SERVER_SPLIT_INFO.equals(type)||RedisKey.SERVER_SPLIT_MAIL_INFO.equals(type)) {
if(RedisKey.PLAYER_INFO_CACHE.equals(type) ||RedisKey.FAMILY_INFO.equals(type)||RedisKey.PIDGIDTEMP.equals(type)||RedisKey.SERVER_WORLDLEVE_INFO.equals(type)|| RedisKey.GUILD_INFO_CACHE.equals(type)||RedisKey.SERVER_SPLIT_INFO.equals(type)||RedisKey.SERVER_SPLIT_MAIL_INFO.equals(type)||RedisKey.CROSS_ARENA_ROBOT_INFO.equals(type)||RedisKey.CROSS_SERVICE_ARENA.equals(type)||RedisKey.WORLD_ARENA_RANK_MY_MATH.equals(type)||RedisKey.WORLD_ARENA_MY_PRON.equals(type)||RedisKey.WORLD_ARENA_RRECORD.equals(type)) {
return type + RedisKey.Delimiter_colon + key;
}
// if(RedisKey.familyKey.contains(type)){
// return GameApplication.serverProperties.getAreaId()+ RedisKey.Delimiter_colon+type + RedisKey.Delimiter_colon+key;
// }
if(RedisKey.TOKEN.equals(type)||RedisKey.USER_SERVER_INFO.equals(type)||
RedisKey.CDKEY.equals(type)||RedisKey.ServerArenaJob.equals(type)||
RedisKey.CROSS_SERVICE_ARENA.equals(type)){
RedisKey.CDKEY.equals(type)||RedisKey.ServerArenaJob.equals(type)){
return type + RedisKey.Delimiter_colon + key;
}

View File

@ -1,30 +1,52 @@
package com.ljsd.jieling.handler.gtw;
import com.ljsd.GameLogicService;
import com.ljsd.fight.CheckFight;
import com.ljsd.fight.FightType;
import com.ljsd.jieling.core.FunctionIdEnum;
import com.ljsd.jieling.core.HandlerLogicThread;
import com.ljsd.jieling.core.VipPrivilegeType;
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.globals.BIReason;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.GlobalDataManaager;
import com.ljsd.jieling.logic.GlobleSystemLogic;
import com.ljsd.jieling.logic.activity.crossService.CrossServiceLogic;
import com.ljsd.jieling.logic.arena.ArenaLogic;
import com.ljsd.jieling.logic.arenaworld.ArenaWorldLogic;
import com.ljsd.jieling.logic.dao.CrossArenaEnemy;
import com.ljsd.jieling.logic.dao.TimeControllerOfFunction;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.FightUtil;
import com.ljsd.jieling.logic.fight.result.FightResult;
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.network.server.GlobalidHelper;
import com.ljsd.jieling.network.server.WorldHelper;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.util.ItemUtil;
import com.ljsd.jieling.util.*;
import config.SArenaRobotConfig;
import config.SArenaSetting;
import config.SGlobalSystemConfig;
import config.SMServerArenaSetting;
import manager.STableManager;
import org.luaj.vm2.LuaValue;
import org.springframework.data.redis.core.ZSetOperations;
import rpc.protocols.CommonProto;
import rpc.protocols.MessageTypeProto;
import rpc.world.WorldProto;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Description: gs basehandler w
* Author: zsx
@ -39,10 +61,6 @@ public class GetWorldArenaChallengeRequestHandler extends BaseHandler<WorldProto
@Override
public void processWithProto(ISession iSession, WorldProto.GetWorldArenaChallengeRequest proto) throws Exception {
GlobalidHelper.WorldInfo worldInfo = GlobalidHelper.getWorldInfo();
if (null == worldInfo) {
throw new ErrorCodeException("world unavailable or play not open");
}
SGlobalSystemConfig sGlobalSystemConfig = STableManager.getConfig(SGlobalSystemConfig.class).get(FunctionIdEnum.World_Arena.getFunctionType());
if (!ArenaWorldLogic.checkOpen(String.valueOf(iSession.getUid()))) {
@ -70,50 +88,185 @@ public class GetWorldArenaChallengeRequestHandler extends BaseHandler<WorldProto
if (!ArenaWorldLogic.checkJoin(String.valueOf(iSession.getUid()))) {
throw new ErrorCodeException(ErrorCode.WORLD_LEVELIMIT);
}
boolean check = PlayerLogic.getInstance().checkAndUpdate(user, VipPrivilegeType.WORLD_ARENA_CHALLENGE_TIMES, 1);
if(!check){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}
//走特权
// if(user.getArenaManager().getWorldFreeChallengeTime()>0){
// //free
// user.getArenaManager().setWorldFreeChallengeTime(user.getArenaManager().getWorldFreeChallengeTime() -1);
// }else {
//check costs
// int[][] costItems = new int[1][];
// costItems[0]=setting.getCost();
// boolean enough = ItemUtil.itemCost(user, costItems, BIReason.WORLD_ARENA, 0);
// if (!enough) {
// throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH);
// }
// PlayerLogic.getInstance().checkAndUpdate()
// boolean b1 = PlayerLogic.getInstance().checkAndUpdate(user, VipPrivilegeType.SIGN_AGAIN, 1);
// if(!b1){
// throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF);
// boolean check = PlayerLogic.getInstance().checkAndUpdate(user, VipPrivilegeType.WORLD_ARENA_CHALLENGE_TIMES, 1);
// if(!check){
// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
// }
// }
boolean b;
if (proto.getSkipFight() == 0) {
WorldProto.GetWorldArenaChallengeRequest.Builder builder = WorldProto.GetWorldArenaChallengeRequest.newBuilder()
.setChallengeUid(proto.getChallengeUid())
.setTeamId(proto.getTeamId())
.setChallengeRank(proto.getChallengeRank())
.setSkipFight(proto.getSkipFight())
.setArenaEnemys(ArenaLogic.getInstance().getUserArenaEnemy(iSession.getUid(), proto.getTeamId()))
.setFightTeamInfo(FightUtil.getFightTeamInfo(user, proto.getTeamId()));
//转发到world服
b = WorldHelper.sendMessageToWord(iSession.getUid(), builder.build());
} else {
b = WorldHelper.sendMessageToWord(iSession.getUid(), proto);
}
user.getArenaManager().setCostDallyTime(user.getArenaManager().getCostDallyTime()+1);
if (!b) {
throw new ErrorCodeException(ErrorCode.UNKNOWN);
//返回数据
WorldProto.GetWorldArenaChallengeResponse.Builder builder1 = WorldProto.GetWorldArenaChallengeResponse.newBuilder();
if (proto.getSkipFight() == 1) {
builder1.setFightResult(1);
int[][] reward = new int[1][];
reward[0]=setting.getRespectReward();
CommonProto.Drop.Builder drop = ItemUtil.drop(UserManager.getUser(iSession.getUid()), reward, BIReason.WORLD_PRO_DROP);
builder1.setDrop(drop);
MessageUtil.sendMessage(iSession,1, MessageTypeProto.MessageType.GetWorldArenaChallengeResponse.getNumber(),builder1.build(),true);
return;
}
//战斗
CommonProto.FightTeamInfo teamInfo = null;
CommonProto.ArenaEnemy arenaEnemys = null;
CommonProto.ArenaEnemy arenaAttack = null;
int force;
//当前分组
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
int challengeRank = proto.getChallengeRank();
Set<ZSetOperations.TypedTuple<String>> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), challengeRank-1, challengeRank-1);
int myRank = rank.getRankIndexByKey(String.valueOf(crossGroup),iSession.getUid());
int newRank = 0;
if(rankByKey==null){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}
ZSetOperations.TypedTuple<String> next = rankByKey.iterator().next();
String value = next.getValue();
double score = next.getScore();
if(Integer.parseInt(value)!=proto.getChallengeUid()){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}
if (proto.getChallengeUid()>1000) {
ArenaOfUser arenaOfUser = CrossServiceLogic.getInstance().query(proto.getChallengeUid());
teamInfo = FightUtil.makeCrossPersonData(arenaOfUser);
} else {
//机器人
CrossArenaEnemy info = RedisUtil.getInstence().getMapEntry(RedisKey.CROSS_ARENA_ROBOT_INFO, String.valueOf(crossGroup), String.valueOf(proto.getChallengeUid()), CrossArenaEnemy.class);
teamInfo = FightUtil.makeRobotFightData(info.getEnemyId());
force = SArenaRobotConfig.getsArenaRobotConfigById(info.getEnemyId()).getTotalForce();
arenaEnemys =ArenaLogic.getInstance().getRobotCrossArenaEnemy(proto.getChallengeUid(),crossGroup).build();
arenaAttack = CommonProto.ArenaEnemy.newBuilder().setPersonInfo(CommonProto.ArenaPersonInfo.newBuilder().setUid(iSession.getUid())).build();
}
// boolean isRevert = proto.getTotalForce() < force;
int teamId = proto.getTeamId();
CommonProto.FightTeamInfo fightTeamInfo = FightUtil.makePersonFightData(UserManager.getUser(iSession.getUid()), teamId, null, null);
FightResult fightResult = getFightForPVP(iSession.getUid(), proto.getChallengeUid(), fightTeamInfo, teamInfo, FightUtil.getFightSeed(), false);
builder1.setFightResult((int)fightResult.getCheckResult()[0]);
int seed = fightResult.getSeed();
CommonProto.FightData build = CommonProto.FightData.newBuilder()
.setFightMaxTime(SArenaSetting.getSArenaSetting().getMostTime())
.setFightSeed(seed)
.setHeroFightInfos(fightResult.getFightTeamInfo())
.addMonsterList(fightResult.getDefFightTeamInfo())
.build();
builder1.setFightData(build);
WorldProto.WroldBattleRecord.Builder builder = WorldProto.WroldBattleRecord.newBuilder();
builder.setFightData(fightResult.getFightData());
builder.setResult((int)fightResult.getCheckResult()[0]);
String s = KeyGenUtils.produceIdByModule(UUIDEnum.ARENARECORD, iSession.getUid());
builder.setRecordId(s);
builder.setAttackTime((int)(System.currentTimeMillis()/1000));
//record
builder.setRedEnemy(arenaAttack);
builder.setBlueEnemy(arenaEnemys);
int[][] reward = new int[1][];
reward[0]=setting.getRespectReward();
CommonProto.Drop.Builder drop = ItemUtil.drop(UserManager.getUser(iSession.getUid()), reward, BIReason.WORLD_PRO_DROP);
builder1.setDrop(drop);
if (fightResult.getCheckResult()[0] > 0) {
//打赢机器人
if (proto.getChallengeUid() < 1000) {
RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(iSession.getUid()), new HashSet<>());
ArenaLogic.randomRank(iSession.getUid(), proto.getChallengeRank(), crossGroup);
if(myRank==-1){
rank.removeOneRankByPiece(String.valueOf(crossGroup),String.valueOf(proto.getChallengeRank()));
rank.addRank(iSession.getUid(), String.valueOf(crossGroup), score);
newRank = rank.getRankIndexByKey(String.valueOf(crossGroup),iSession.getUid());
}else if(rank.getScoreById(iSession.getUid(),String.valueOf(crossGroup))<rank.getScoreById(proto.getChallengeUid(),String.valueOf(crossGroup))){
rank.addRank(proto.getChallengeUid(),String.valueOf(crossGroup),rank.getScoreById(iSession.getUid(),String.valueOf(crossGroup)));
rank.addRank(iSession.getUid(), String.valueOf(crossGroup), score);
newRank = rank.getRankIndexByKey(String.valueOf(crossGroup),iSession.getUid());
}else{
newRank = myRank;
}
}
// //交换队伍
// Map.Entry<Integer, ArenaEnemy> myRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid());
// if (myRank != null) {
// builder.setOldrank(myRank.getKey());
// if(myRank.getKey()>proto.getChallengeRank()){
// arenaInfoBuild.setScore(proto.getChallengeRank());
// ArenaEnemy temp = new ArenaEnemy();
// temp = myRank.getValue();
// integerIntegerHashMap.put(myRank.getKey(), arenaEnemy);
// integerIntegerHashMap.put(proto.getChallengeRank(), temp);
// arenaInfoBuild.setScore(proto.getChallengeRank());
// }else{
// arenaInfoBuild.setScore(myRank.getKey());
// }
// if (arenaEnemy.getEnemyType() == 0) {
// //清空匹配
// RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(arenaEnemy.getEnemyId()), new HashSet<>());
// }
// } else {
// arenaInfoBuild.setScore(proto.getChallengeRank());
// builder.setOldrank(9999);
// integerIntegerHashMap.put(proto.getChallengeRank(), new ArenaEnemy(rpcMessage.getUid(), rpcMessage.getServerId(), 1, 0));
// }
// myRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid());
// //处理匹配信息
// RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(rpcMessage.getUid()), new HashSet<>());
// List<ArenaEnemy> arenaEnemies = ArenaLogic.randomRank(integerIntegerHashMap, rpcMessage.getUid(), myRank == null ? 9999 : myRank.getKey());
// //给对手重新匹配信息
// if(arenaEnemy.getEnemyType()==1){
// RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(proto.getChallengeUid()), new HashSet<>());
// ArenaLogic.randomRank(integerIntegerHashMap,proto.getChallengeUid(),proto.getMyCurrentRank());
// }
//
// //notify client
// 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),new LinkedList<>(strings));
// arenaInfoBuild.addAllArenaEnemys(arenaEnemyList);
// builder.setRank(myRank == null ? 9999 : myRank.getKey());
// }
MessageUtil.sendMessage(iSession, 1, MessageTypeProto.MessageType.GetWorldArenaChallengeResponse.getNumber(), builder1.build(), true);
}
builder.setRank(newRank);
builder.setOldrank(myRank==-1?9999:myRank);
RedisUtil.getInstence().putMapEntry(RedisKey.WORLD_ARENA_RRECORD,Integer.toString(iSession.getUid()), s, builder.build().toByteArray());
RedisUtil.getInstence().putMapEntry(RedisKey.WORLD_ARENA_RRECORD, Integer.toString(proto.getChallengeUid()), s, builder.build().toByteArray());
}
public static FightResult getFightForPVP(int attachId,int defUid,CommonProto.FightTeamInfo fightTeamInfo, CommonProto.FightTeamInfo deffightTeamInfo,int seed,boolean isRever) throws Exception {
LuaValue getFightData ;
if(isRever){
deffightTeamInfo = CommonProto.FightTeamInfo.newBuilder().mergeFrom(deffightTeamInfo).setFirstCamp(1).build();
getFightData = FightDataUtil.getFinalPlayerFightData(fightTeamInfo, deffightTeamInfo,true);//对方先手
}else {
getFightData = FightDataUtil.getFinalPlayerFightData(fightTeamInfo, deffightTeamInfo);
}
LuaValue getOptionData = FightDataUtil.getOptionData(attachId+"");
long[] fightResult = CheckFight.getInstance().checkFight(seed, SArenaSetting.getSArenaSetting().getMostTime(), getFightData, getOptionData, FightType.ArenaFight);
FightResult.Builder builder = FightResult.newBuilder();
builder.setCheckResult(fightResult);
builder.setSeed(seed);
builder.setFightTeamInfo(fightTeamInfo);
builder.setDefFightTeamInfo(deffightTeamInfo);
CommonProto.FightData fightData = CommonProto.FightData.newBuilder().setFightType(FightType.ArenaFight.getType()).setHeroFightInfos(fightTeamInfo).addMonsterList(deffightTeamInfo).setFightSeed(seed).setFightMaxTime(SArenaSetting.getSArenaSetting().getMostTime()).build();
builder.setFightData(fightData);
return builder.build();
}
}

View File

@ -26,10 +26,7 @@ import rpc.protocols.CommonProto;
import rpc.protocols.MessageTypeProto;
import rpc.world.WorldProto;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
@ -100,13 +97,14 @@ public class GetWorldArenaInfoRequestHandler extends BaseHandler<WorldProto.GetW
//如果是攻击阶段
if(ArenaLogic.getState()==ArenaLogic.BATTLE_STATE){
List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.randomRank(iSession.getUid(), score == -1 ? 9999 : (int) score,crossGroup);
builder1.addAllArenaEnemys(arenaEnemyList);
}else{
//拿前4个
Set<ZSetOperations.TypedTuple<String>> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), 0, 4);
Set<Integer> keys = new HashSet<>(4);
Set<ZSetOperations.TypedTuple<String>> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), 0, 3);
List<Integer> keys = new ArrayList<>(4);
rankByKey.forEach(n->keys.add(Integer.parseInt(n.getValue())));
List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(keys);
List<CommonProto.ArenaEnemy> arenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(iSession.getUid(),keys,crossGroup);
builder1.addAllArenaEnemys(arenaEnemyList);
}

View File

@ -2,8 +2,11 @@ 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.globals.BIReason;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.GlobalDataManaager;
import com.ljsd.jieling.logic.arenaworld.ArenaWorldLogic;
@ -12,9 +15,12 @@ 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.network.session.ISession;
import com.ljsd.jieling.util.ItemUtil;
import com.ljsd.jieling.util.MessageUtil;
import config.SGlobalSystemConfig;
import config.SMServerArenaSetting;
import manager.STableManager;
import rpc.protocols.CommonProto;
import rpc.protocols.MessageTypeProto;
import rpc.world.WorldProto;
@ -27,17 +33,12 @@ public class GetWorldArenaProudRequestHandler extends BaseHandler<WorldProto.Get
@Override
public MessageTypeProto.MessageType getMessageCode() {
return null;
return MessageTypeProto.MessageType.GetWorldArenaProudRequest;
}
@Override
public void processWithProto(ISession iSession, WorldProto.GetWorldArenaProudRequest proto) throws Exception {
GlobalidHelper.WorldInfo worldInfo = GlobalidHelper.getWorldInfo();
if (null == worldInfo){
throw new ErrorCodeException("world unavailable or play not open");
}
SGlobalSystemConfig sGlobalSystemConfig = STableManager.getConfig(SGlobalSystemConfig.class).get(FunctionIdEnum.World_Arena.getFunctionType());
if (!HandlerLogicThread.checkOpen(UserManager.getUser(iSession.getUid()),sGlobalSystemConfig)) {
throw new ErrorCodeException(ErrorCode.ACTIVITY_NOT_OPEN);
@ -54,6 +55,30 @@ public class GetWorldArenaProudRequestHandler extends BaseHandler<WorldProto.Get
}else {
throw new ErrorCodeException(ErrorCode.SERVER_DEFINE_SELF);
}
int[][] reward = new int[1][];
reward[0] = setting.getBattleWinReward();
CommonProto.Drop.Builder drop = ItemUtil.drop(UserManager.getUser(iSession.getUid()), reward, BIReason.WORLD_CHANGE_DROP);
WorldProto.GetWorldArenaProudResponse.Builder builder = WorldProto.GetWorldArenaProudResponse.newBuilder();
if(proto.getChallengeUid()<10000){
Object get = RedisUtil.getInstence().hget(RedisKey.ARENA_PROUD_COUNT_ROBOT,String.valueOf(proto.getChallengeRank()));
int proudTime = get==null?1:Integer.parseInt((String)get)+1;
RedisUtil.getInstence().hset(RedisKey.ARENA_PROUD_COUNT_ROBOT,String.valueOf(proto.getChallengeRank()),proudTime);
RedisUtil.getInstence().lSet(RedisKey.WORLD_ARENA_MY_PRON+":"+iSession.getUid(),String.valueOf(proto.getChallengeRank()));
builder.setWorshipTime(proudTime);
}else{
Object get = RedisUtil.getInstence().hget(RedisKey.ARENA_PROUD_COUNT, String.valueOf(proto.getChallengeUid()));
int proudTime = get==null?1:Integer.parseInt((String)get)+1;
RedisUtil.getInstence().hset(RedisKey.ARENA_PROUD_COUNT,String.valueOf(proto.getChallengeUid()),proudTime);
RedisUtil.getInstence().lSet(RedisKey.WORLD_ARENA_MY_PRON+":"+iSession.getUid(),String.valueOf(proto.getChallengeUid()));
builder.setWorshipTime(proudTime);
}
// builder.setErr()
builder.setDrop(drop);
MessageUtil.sendMessage(iSession,1, MessageTypeProto.MessageType.GetWorldArenaProudResponse.getNumber(),builder.build(),true);
// //rank limit
// if (!ArenaWorldLogic.checkJoin(String.valueOf(iSession.getUid()))) {
@ -61,9 +86,5 @@ public class GetWorldArenaProudRequestHandler extends BaseHandler<WorldProto.Get
// }
//转发到world服
boolean b = WorldHelper.sendMessageToWord(iSession.getUid(),proto);
if(!b){
throw new ErrorCodeException(ErrorCode.UNKNOWN);
}
}
}

View File

@ -3,19 +3,26 @@ package com.ljsd.jieling.handler.gtw;
import com.google.protobuf.GeneratedMessage;
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.OnlineUserManager;
import com.ljsd.jieling.logic.arena.ArenaLogic;
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.network.session.ISession;
import com.ljsd.jieling.util.MessageUtil;
import config.SGlobalSystemConfig;
import manager.STableManager;
import rpc.protocols.MessageTypeProto;
import rpc.world.WorldProto;
import java.util.*;
import java.util.stream.Collectors;
/**
* Description: des
* Author: zsx
@ -24,7 +31,7 @@ import rpc.world.WorldProto;
public class GetWorldArenaRecordInfoRequestHandler extends BaseHandler<WorldProto.GetWorldArenaRecordInfoRequest> {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return null;
return MessageTypeProto.MessageType.GetWorldArenaRecordInfoRequest;
}
@Override
@ -35,16 +42,48 @@ public class GetWorldArenaRecordInfoRequestHandler extends BaseHandler<WorldProt
throw new ErrorCodeException(ErrorCode.ACTIVITY_NOT_OPEN);
}
GlobalidHelper.WorldInfo worldInfo = GlobalidHelper.getWorldInfo();
if (null == worldInfo){
throw new ErrorCodeException("world unavailable or play not open");
WorldProto.GetWorldArenaRecordInfoResponse.Builder builder = WorldProto.GetWorldArenaRecordInfoResponse.newBuilder();
// Integer integer = ArenaLogic.serverSplit.get(String.valueOf(serverId));
// HashMap<Integer, ArenaEnemy> integerIntegerHashMap = ArenaLogic.ranInfo.get(integer);
//个人信息
// Map.Entry<Integer, ArenaEnemy> challRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid());
// if (challRank == null) {
// return builder.build();
// }
Map<String, byte[]> result = RedisUtil.getInstence().getMapValues(RedisKey.WORLD_ARENA_RRECORD, Integer.toString(iSession.getUid()), String.class, byte[].class);
if (result != null && !result.isEmpty()) {
List< byte[]> arenaRecordList = new ArrayList<>(result.values());
List<WorldProto.WroldBattleRecord> collect = arenaRecordList.stream().map(bytes -> {try {
return WorldProto.WroldBattleRecord.parseFrom(bytes);
}catch (Exception e){}
return null;
}).collect(Collectors.toList());
collect.sort(Comparator.comparingInt(WorldProto.WroldBattleRecord::getAttackTime));
Collections.reverse(collect);
int size = arenaRecordList.size();
if (size > 15) {
String[] removeMapKeys = new String[size - 15];
for (int i = 0; i < size - 15; i++) {
WorldProto.WroldBattleRecord remove = collect.remove(size-i-1);
String removeId = remove.getRecordId();
removeMapKeys[i] = (removeId);
}
RedisUtil.getInstence().removeMapEntrys(RedisKey.WORLD_ARENA_RRECORD, Integer.toString(iSession.getUid()), removeMapKeys);
}
builder.addAllWroldBattleRecord(collect);
}
//转发到world服
boolean b = WorldHelper.sendMessageToWord(iSession.getUid(),proto);
if(!b){
throw new ErrorCodeException(ErrorCode.UNKNOWN);
}
MessageUtil.sendMessage(iSession,1, MessageTypeProto.MessageType.GetWorldArenaRecordInfoResponse.getNumber(),builder.build(),true);
// //转发到world服
// boolean b = WorldHelper.sendMessageToWord(iSession.getUid(),proto);
// if(!b){
// throw new ErrorCodeException(ErrorCode.UNKNOWN);
// }
}
}

View File

@ -23,14 +23,14 @@ public class GetPlayerOneTeamInfo extends BaseHandler<PlayerInfoProto.GetPlayerO
if(proto.getServerId()!=0&&proto.getServerId()!= AreaManager.areaId){
WorldProto.GetPlayerOneTeamInfoRequest build = WorldProto.GetPlayerOneTeamInfoRequest.newBuilder().setPlayerId(proto.getPlayerId()).setTeamId(proto.getTeamId()).build();
if(proto.getPlayerId()>1000&&proto.getServerId()!=0&&proto.getServerId()!= AreaManager.areaId){
// WorldProto.GetPlayerOneTeamInfoRequest build = WorldProto.GetPlayerOneTeamInfoRequest.newBuilder().setPlayerId(proto.getPlayerId()).setTeamId(proto.getTeamId()).build();
PlayerInfoProto.GetPlayerOneTeamInfoResponse rewardResponse = WorldHelper.sendMessageToWorldWithResult(0, build,PlayerInfoProto.GetPlayerOneTeamInfoResponse.class);
if(rewardResponse==null){
rewardResponse = PlayerInfoProto.GetPlayerOneTeamInfoResponse.newBuilder().build();
}
// PlayerInfoProto.GetPlayerOneTeamInfoResponse viewHeroInfoResponse = PlayerInfoProto.GetPlayerOneTeamInfoResponse.newBuilder().setTeamInfo(rewardResponse.getTeamInfo()).build();
PlayerInfoProto.GetPlayerOneTeamInfoResponse rewardResponse = PlayerInfoProto.GetPlayerOneTeamInfoResponse.newBuilder().build();
;
// PlayerInfoProto.GetPlayerOneTeamInfoResponse viewHeroInfoResponse = PlayerInfoProto.GetPlayerOneTeamInfoResponse.newBuilder().setTeamInfo(rewardResponse.getTeamInfo()).build();
int resMsgId = MessageTypeProto.MessageType.GET_PLAYER_ONE_TEAM_INFO_RESPONSE_VALUE;
MessageUtil.sendMessage(iSession,1,resMsgId,rewardResponse,true);

View File

@ -1,11 +1,12 @@
package com.ljsd.jieling.logic.activity.crossService;
import com.ljsd.GameApplication;
import com.ljsd.jieling.core.GlobalsDef;
import com.ljsd.jieling.db.mongo.MongoUtil;
import com.ljsd.jieling.logic.arena.ArenaLogic;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.gm.CoreOfServerInfo;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.gm.*;
import com.ljsd.jieling.logic.dao.root.GuildInfo;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.hero.HeroLogic;
import org.slf4j.Logger;
@ -16,6 +17,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.net.UnknownHostException;
import java.util.*;
/**
* @Author hj
@ -44,9 +46,9 @@ public class CrossServiceLogic {
}
public void insert(User user) throws UnknownHostException {
ArenaOfUser arenaOfUser = new ArenaOfUser(user);
MongoTemplate core = MongoUtil.getCoreMongoTemplate();
core.insert(arenaOfUser,"arenaOfUser");
// ArenaOfUser arenaOfUser = new ArenaOfUser(user);
// MongoTemplate core = MongoUtil.getCoreMongoTemplate();
// core.insert(arenaOfUser,"arenaOfUser");
}
public void update(ArenaOfUser arenaOfUser) throws Exception {
@ -96,12 +98,106 @@ public class CrossServiceLogic {
// 更新
else {
// 获取新的跨服用户信息
ArenaOfUser arenaOfUser = new ArenaOfUser(user);
ArenaOfUser arenaOfUser = buildArenaOfUser(user);
// 计算战力
countForce(arenaOfUser);
// 更新数据
update(arenaOfUser);
}
}
public ArenaOfUser buildArenaOfUser(User user){
ArenaOfUser arenaOfUser = new ArenaOfUser();
arenaOfUser.setId(user.getId());
HeroManager heroManager = user.getHeroManager();
// 玩家基本信息
arenaOfUser.setPlayerManager(buildArenaOfPlayerManager(user));
// 英雄
arenaOfUser.setHeroManager(buildArenaOfHeroManager(user));
// 灵兽
Map<String,Pokemon> pokemons = new HashMap<>();
Map<String, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
Map<Integer, String> teamMap = user.getPokemonManager().getPokemonTeamMap();
teamMap.values().forEach(v->{
// clone 深度复制
Pokemon pokemon = (Pokemon)pokemonMap.get(v).clone();
pokemons.put(v,pokemon);
});
arenaOfUser.setPokemons(pokemons);
// 紫府神印
arenaOfUser.setSeals(new HashMap<>(heroManager.getPurpleMansionSeal()));
// 公会技能
arenaOfUser.setGuildSkill(new HashMap<>(user.getGuildMyInfo().getGuildSkill()));
return arenaOfUser;
}
private ArenaOfPlayerManager buildArenaOfPlayerManager(User user){
ArenaOfPlayerManager arenaOfPlayerManager = new ArenaOfPlayerManager();
PlayerManager player = user.getPlayerInfoManager();
int guildId = player.getGuildId();
arenaOfPlayerManager.setuId(user.getId());
arenaOfPlayerManager.setLevel(player.getLevel());
arenaOfPlayerManager.setName(player.getNickName());
arenaOfPlayerManager.setHead(player.getHead());
arenaOfPlayerManager.setHeadFrame(player.getHeadFrame());
GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId);
arenaOfPlayerManager.setGuildName(guildInfo==null?"":guildInfo.getName());
arenaOfPlayerManager.setUserTitle(player.getUserTitle());
arenaOfPlayerManager.setPracticeLevel(user.getHeroManager().getPracticeLevel());
arenaOfPlayerManager.setServerId(GameApplication.serverId);
try {
arenaOfPlayerManager.setServerName(CrossServiceLogic.getInstance().findServerName(GameApplication.serverId));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return arenaOfPlayerManager;
}
private ArenaOfHeroManager buildArenaOfHeroManager(User user){
Map<Integer,List<TeamPosHeroInfo>> teams = new HashMap<>();
List<TeamPosHeroInfo> infos =
user.getTeamPosManager().getTeamPosForHero().getOrDefault(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,new ArrayList<>());
teams.put(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,infos);
// 英雄
Map<String,ArenaOfHero> heroes = new HashMap<>();
Map<String, Hero> heroMap = user.getHeroManager().getHeroMap();
infos.forEach(v->{
Hero hero = heroMap.get(v.getHeroId());
heroes.put(v.getHeroId(),buildArenaOfHero(user,hero));
});
// 魂宝灵宝
Map<String, PropertyItem> jewels = new HashMap<>();
Map<String, PropertyItem> equipMap = user.getEquipManager().getEquipMap();
heroMap.values().forEach(v-> v.getJewelInfo().forEach(v2->{
PropertyItem item = (PropertyItem)equipMap.get(v2).clone();
jewels.put(v2,item);
}));
// 总战力
int totalForce = HeroLogic.getInstance().calTeamTotalForce(user, GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,false);
ArenaOfHeroManager arenaOfHeroManager = new ArenaOfHeroManager(teams,heroes,jewels,totalForce);
return arenaOfHeroManager;
}
private ArenaOfHero buildArenaOfHero(User user,Hero hero){
HeroManager heroManager = user.getHeroManager();
ArenaOfHero arenaOfHero = new ArenaOfHero();
arenaOfHero.setId(hero.getId());
arenaOfHero.setTemplateId(hero.getTemplateId());
arenaOfHero.setLevel(hero.getLevel(heroManager));
arenaOfHero.setStar(hero.getStar());
arenaOfHero.setEquipByPositionMap(new HashMap<>(hero.getEquipByHongmengPositionMap(heroManager)));
arenaOfHero.setSoulEquipByPositionMap(new HashMap<>(hero.getSoulEquipByPositionMap()));
arenaOfHero.setBreakId(hero.getBreakIdByHongMeng(heroManager));
arenaOfHero.setStarBreakId(hero.getStarBreakId());
arenaOfHero.setCreateTime(hero.getCreateTime());
arenaOfHero.setEspecialEquipLevel(hero.getEspecialEquipLevelByHongmeng(heroManager,hero.getId()));
arenaOfHero.setJewelInfo(new HashSet<>(hero.getJewelInfo()));
arenaOfHero.setCreateTime(hero.getCreateType());
arenaOfHero.setChangeId(hero.getChangeId());
return arenaOfHero;
}
}

View File

@ -2,6 +2,7 @@ package com.ljsd.jieling.logic.arena;
import com.google.gson.reflect.TypeToken;
import com.ljsd.fight.ArenaRecord;
import com.ljsd.jieling.config.clazzStaticCfg.SArenaRobotStaticConfig;
import com.ljsd.jieling.core.FunctionIdEnum;
import com.ljsd.fight.FightType;
import com.ljsd.jieling.core.GlobalsDef;
@ -17,8 +18,10 @@ 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.crossService.CrossServiceLogic;
import com.ljsd.jieling.logic.activity.event.Poster;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.*;
import com.ljsd.jieling.logic.fight.result.FightResult;
@ -51,6 +54,7 @@ import util.MathUtils;
import util.StringUtil;
import util.TimeUtils;
import java.net.UnknownHostException;
import java.util.*;
public class ArenaLogic {
@ -73,9 +77,9 @@ public class ArenaLogic {
private static int state = 0;
private final static int NORMAL_STATE = 1;
private final static int BATTLE_STATE = 2;
private final static int RELAX_STATE = 3;
public final static int NORMAL_STATE = 1;
public final static int BATTLE_STATE = 2;
public final static int RELAX_STATE = 3;
public int getCurSeason() {
return curSeason;
@ -744,6 +748,7 @@ public class ArenaLogic {
public void e2b(){
if(state != BATTLE_STATE){
initRank();
LOGGER.info("罗浮争霸:转到战斗状态,nowstate:{} to BATTLE_STATE",state);
setState(BATTLE_STATE);
}
@ -759,13 +764,27 @@ public class ArenaLogic {
SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
if (diff > setting.getBattleTime()[0] && diff <= setting.getBattleTime()[1]) {
e2b();
}else if (diff > setting.getBattleTime()[1] && diff <= setting.getRestTime()[0]) {
}else if (diff > setting.getBattleTime()[1] && diff <= setting.getRestTime()[1]) {
b2r();
} else if (diff > setting.getRestTime()[1]) {
r2e();
}
}
static List<Integer> randomCrossRobot(int start, int end, int nums) {
List<Integer> robotIds = new LinkedList<>();
int index = 0;
while (robotIds.size() < nums) {
index++;
if (index == 10000) {
break;
}
double v = Math.random() * (end - start) + start;
int robotId = SArenaRobotStaticConfig.getFloorForce2robotId((int) v);
robotIds.add(robotId);
}
return robotIds;
}
//初始化机器人信息
private void initRank(){
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
@ -781,10 +800,15 @@ public class ArenaLogic {
if(v==crossGroup) groupList.add(k);
});
int[] fightArea = STableManager.getConfig(SMServerArenaSetting.class).get(1).getFightArea();
SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
int robotNum = setting.getRobotNum();
List<Integer> robotIds = randomCrossRobot(fightArea[0], fightArea[1], robotNum);
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()));
rank.addRank(robotIndex,String.valueOf(crossGroup),robotNum-robotIndex);
robotInfo.put(String.valueOf(robotIndex),new CrossArenaEnemy(robotIds.get(robotIndex),robotIndex,groupList.get(server),0,0,random.nextBoolean(),PlayerLogic.getInstance().getRandomName2WithOutVerify()));
}
RedisUtil.getInstence().putMapEntrys(RedisKey.CROSS_ARENA_ROBOT_INFO,String.valueOf(crossGroup),robotInfo);
@ -792,9 +816,43 @@ public class ArenaLogic {
}
//获取跨服信息
public List<CommonProto.ArenaEnemy> getCrossArenaEnemyList(Set<Integer> ids){
public List<CommonProto.ArenaEnemy> getCrossArenaEnemyList(int uid,List<Integer> ids,int groupId){
List<CommonProto.ArenaEnemy> arenaEnemyList = new ArrayList<>();
List<String> list = RedisUtil.getInstence().lGet(RedisKey.WORLD_ARENA_MY_PRON, String.valueOf(uid), 0, -1);
ids.forEach(id->{
if(id<1000){
CommonProto.ArenaEnemy.Builder robotCrossArenaEnemy = getRobotCrossArenaEnemy(id, groupId);
if(list!=null&&list.size()>0){
robotCrossArenaEnemy.setHadProud(list.contains(String.valueOf(robotCrossArenaEnemy.getPersonInfo().getUid())));
}
arenaEnemyList.add(robotCrossArenaEnemy.build());
}else{
arenaEnemyList.add(getUserCrossArenaEnemy(groupId,id));
}
});
return arenaEnemyList;
}
//获取单个玩家信息(玩家)
public CommonProto.ArenaEnemy getUserCrossArenaEnemy(int crossGroup,int id) {
ArenaOfUser user = null;
CommonProto.ArenaEnemy.Builder userCrossArenaEnemy = null;
try {
user = CrossServiceLogic.getInstance().query(id);
userCrossArenaEnemy = getUserCrossArenaEnemy(crossGroup,user);
} catch (UnknownHostException e) {
e.printStackTrace();
return null;
}
return userCrossArenaEnemy.build();
}
//获取单个信息(机器人)
return null;
public CommonProto.ArenaEnemy.Builder getRobotCrossArenaEnemy(int id,int groupId){
CrossArenaEnemy info = RedisUtil.getInstence().getMapEntry(RedisKey.CROSS_ARENA_ROBOT_INFO, String.valueOf(groupId), String.valueOf(id), CrossArenaEnemy.class);
if(info==null){
return null;
}
return getRobotCrossArenaEnemy(id,info);
}
/**
@ -819,15 +877,13 @@ public class ArenaLogic {
}
/**
*
*
*/
public static List<CrossArenaEnemy> randomRank(HashMap<Integer, CrossArenaEnemy> integerIntegerHashMap, int uid, int myRank) {
public static List<CommonProto.ArenaEnemy> randomRank(int uid, int myRank,int crossGroup) {
//缓存每次匹配结果
Set<Integer> hisRank = RedisUtil.getInstence().getObject(
RedisUtil.getInstence().getKey(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(uid))
, new TypeToken<Set<Integer>>() {}.getType());
List<CrossArenaEnemy> arenaEnemies = new ArrayList<>();
TreeSet<Integer> matchRank;
if (hisRank == null || hisRank.size() == 0) {
//获取匹配对手
@ -835,19 +891,58 @@ public class ArenaLogic {
} else {
matchRank = new TreeSet<>(hisRank);
}
AbstractRank rankEnum = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
List<Integer> ids = new ArrayList<>(4);
RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(uid), matchRank);
matchRank.forEach(rank -> {
if (!integerIntegerHashMap.containsKey(rank)) {
return;
Set<ZSetOperations.TypedTuple<String>> rankByKey = rankEnum.getRankByKey(String.valueOf(crossGroup),rank-1,rank-1);
ZSetOperations.TypedTuple<String> next = rankByKey.iterator().next();
if(next!=null){
ids.add(Integer.parseInt(next.getValue()));
}
CrossArenaEnemy matchInfo = integerIntegerHashMap.get(rank);
matchInfo.setRank(rank);
arenaEnemies.add(matchInfo);
// matchRank.add(rank);
});
RedisUtil.getInstence().set(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(uid), matchRank);
return arenaEnemies;
List<CommonProto.ArenaEnemy> crossArenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(uid,ids,crossGroup);
return crossArenaEnemyList;
}
public CommonProto.ArenaEnemy.Builder getRobotCrossArenaEnemy(int rank,CrossArenaEnemy enemy){
Object get = RedisUtil.getInstence().hget(RedisKey.ARENA_PROUD_COUNT_ROBOT, String.valueOf(enemy.getEnemyId_UUid()));
int proudTime = get==null?1:Integer.parseInt((String)get);
int enemyId = enemy.getEnemyId();
SArenaRobotConfig sArenaRobotConfig = SArenaRobotConfig.getsArenaRobotConfigById(enemyId);
CommonProto.Team teamBuild = CommonProto.Team.newBuilder().addAllHeroTid(sArenaRobotConfig.getHeroList()).build();
CommonProto.ArenaPersonInfo personInfoBuild = CommonProto.ArenaPersonInfo.newBuilder()
.setUid(enemy.getEnemyId_UUid())
.setLevel(sArenaRobotConfig.getRobotLevel())
.setName(enemy.getRandomName()==null?"":enemy.getRandomName())
.setScore(sArenaRobotConfig.getRobotScore())
.setTotalForce(sArenaRobotConfig.getTotalForce())
.setServername(String.valueOf(enemy.getServerID()))
.setRank(rank)
.build();
return CommonProto.ArenaEnemy.newBuilder()
.setPersonInfo(personInfoBuild)
.setWorshipTime(proudTime)
.setTeam(teamBuild);
}
public CommonProto.ArenaEnemy.Builder getUserCrossArenaEnemy(int crossGroup,ArenaOfUser enemy){
AbstractRank rankEnum = RankContext.getRankEnum(RankEnum.CROSS_SERVICE_ARENA.getType());
int enemyId = enemy.getId();
int rank = rankEnum.getRankIndexByKey(String.valueOf(crossGroup), enemyId);
CommonProto.ArenaPersonInfo personInfoBuild = CommonProto.ArenaPersonInfo.newBuilder()
.setUid(enemyId)
.setLevel(enemy.getPlayerManager().getLevel())
.setName(enemy.getPlayerManager().getName())
.setServername(enemy.getPlayerManager().getServerName())
.setTotalForce(enemy.getHeroManager().getTotalForce())
.setRank(rank)
.build();
return CommonProto.ArenaEnemy.newBuilder()
.setPersonInfo(personInfoBuild);
// .setTeam(teamBuild)
}
}

View File

@ -26,15 +26,15 @@ public class CrossArenaEnemy {
this.rank = rank;
}
public CrossArenaEnemy(int enemyId, int serverID, int enemyType, int enemyStatus,boolean gender,String randomName) {
public CrossArenaEnemy(int enemyId,int enemyId_UUid, int serverID, int enemyType, int enemyStatus,boolean gender,String randomName) {
this(enemyId,serverID,enemyType,enemyStatus);
this(enemyId,enemyId_UUid,serverID,enemyType,enemyStatus);
this.gender=gender;
this.randomName = randomName;
}
public CrossArenaEnemy(int enemyId, int serverID, int enemyType, int enemyStatus) {
public CrossArenaEnemy(int enemyId,int enemyId_UUid, int serverID, int enemyType, int enemyStatus) {
this.enemyId = enemyId;
this.enemyId_UUid=enemyId;
this.enemyId_UUid=enemyId_UUid;
this.serverID = serverID;
this.enemyType = enemyType;
this.enemyStatus = enemyStatus;

View File

@ -1,10 +1,9 @@
package com.ljsd.jieling.logic.dao.gm;
import com.ljsd.jieling.logic.dao.Hero;
import com.ljsd.jieling.logic.dao.HeroManager;
import com.ljsd.jieling.logic.dao.root.User;
import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @Author hj
@ -22,32 +21,30 @@ public class ArenaOfHero {
private int breakId;
private int starBreakId;
private int createTime;
private int lastUpdateEnergyTime;
private int speed;
private int especialEquipLevel;
private int isLock;
private int createType;
private int changeId;
private Set<String> jewelInfo = new HashSet<>();
public ArenaOfHero(User user, Hero hero) {
HeroManager heroManager = user.getHeroManager();
this.id = hero.getId();
this.templateId = hero.getTemplateId();
this.level = hero.getLevel(heroManager);
this.star = hero.getStar();
this.equipByPositionMap = new HashMap<>(hero.getEquipByHongmengPositionMap(heroManager));
this.soulEquipByPositionMap = new HashMap<>(hero.getSoulEquipByPositionMap());
this.breakId = hero.getBreakIdByHongMeng(heroManager);
this.starBreakId = hero.getStarBreakId();
this.createTime = hero.getCreateTime();
this.lastUpdateEnergyTime = hero.getLastUpdateEnergyTime();
this.speed = hero.getSpeed();
this.especialEquipLevel = hero.getEspecialEquipLevelByHongmeng(heroManager,hero.getId());
this.isLock = hero.getIsLock();
this.createType = hero.getCreateType();
this.changeId = hero.getChangeId();
this.jewelInfo = new HashSet<>(hero.getJewelInfo());
public ArenaOfHero(String id, int templateId, int level, int star, Map<Integer, Integer> equipByPositionMap, Map<Integer, Integer> soulEquipByPositionMap, int breakId, int starBreakId, int createTime, int especialEquipLevel, int createType, int changeId, Set<String> jewelInfo) {
this.id = id;
this.templateId = templateId;
this.level = level;
this.star = star;
this.equipByPositionMap = equipByPositionMap;
this.soulEquipByPositionMap = soulEquipByPositionMap;
this.breakId = breakId;
this.starBreakId = starBreakId;
this.createTime = createTime;
this.especialEquipLevel = especialEquipLevel;
this.createType = createType;
this.changeId = changeId;
this.jewelInfo = jewelInfo;
}
public ArenaOfHero() {
}
public String getId() {
@ -122,22 +119,6 @@ public class ArenaOfHero {
this.createTime = createTime;
}
public int getLastUpdateEnergyTime() {
return lastUpdateEnergyTime;
}
public void setLastUpdateEnergyTime(int lastUpdateEnergyTime) {
this.lastUpdateEnergyTime = lastUpdateEnergyTime;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getEspecialEquipLevel() {
return especialEquipLevel;
}
@ -146,22 +127,6 @@ public class ArenaOfHero {
this.especialEquipLevel = especialEquipLevel;
}
public int getIsLock() {
return isLock;
}
public void setIsLock(int isLock) {
this.isLock = isLock;
}
public int getCreateType() {
return createType;
}
public void setCreateType(int createType) {
this.createType = createType;
}
public int getChangeId() {
return changeId;
}
@ -177,4 +142,12 @@ public class ArenaOfHero {
public void setJewelInfo(Set<String> jewelInfo) {
this.jewelInfo = jewelInfo;
}
public int getCreateType() {
return createType;
}
public void setCreateType(int createType) {
this.createType = createType;
}
}

View File

@ -29,28 +29,15 @@ public class ArenaOfHeroManager {
private int totalForce;
public ArenaOfHeroManager(User user) {
// 阵容信息
teams = new HashMap<>();
List<TeamPosHeroInfo> infos =
user.getTeamPosManager().getTeamPosForHero().getOrDefault(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,new ArrayList<>());
teams.put(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,infos);
// 英雄
heros = new HashMap<>();
Map<String, Hero> heroMap = user.getHeroManager().getHeroMap();
infos.forEach(v->{
Hero hero = heroMap.get(v.getHeroId());
heros.put(v.getHeroId(),new ArenaOfHero(user,hero));
});
// 魂宝灵宝
jewels = new HashMap<>();
Map<String, PropertyItem> equipMap = user.getEquipManager().getEquipMap();
heroMap.values().forEach(v-> v.getJewelInfo().forEach(v2->{
PropertyItem item = (PropertyItem)equipMap.get(v2).clone();
jewels.put(v2,item);
}));
// 总战力
totalForce = HeroLogic.getInstance().calTeamTotalForce(user, GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,false);
public ArenaOfHeroManager(Map<Integer, List<TeamPosHeroInfo>> teams, Map<String, ArenaOfHero> heros, Map<String, PropertyItem> jewels, int totalForce) {
this.teams = teams;
this.heros = heros;
this.jewels = jewels;
this.totalForce = totalForce;
}
public ArenaOfHeroManager() {
}
public Map<Integer, List<TeamPosHeroInfo>> getTeams() {

View File

@ -32,25 +32,21 @@ public class ArenaOfPlayerManager {
private int serverId;
private String serverName;
public ArenaOfPlayerManager(User user) throws UnknownHostException {
PlayerManager player = user.getPlayerInfoManager();
int guildId = player.getGuildId();
this.uId = user.getId();
this.level = player.getLevel();
this.name = player.getNickName();
this.head = player.getHead();
this.headFrame = player.getHeadFrame();
if (guildId == 0){
this.guildName = "";
}else {
GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId);
this.guildName = guildInfo.getName();
}
this.userTitle = player.getUserTitle();
this.practiceLevel = user.getHeroManager().getPracticeLevel();
this.serverId = GameApplication.serverId;
this.serverName = CrossServiceLogic.getInstance().findServerName(serverId);
public ArenaOfPlayerManager(int uId, int level, String name, int head, int headFrame, String guildName, int userTitle, int practiceLevel, int serverId, String serverName) {
this.uId = uId;
this.level = level;
this.name = name;
this.head = head;
this.headFrame = headFrame;
this.guildName = guildName;
this.userTitle = userTitle;
this.practiceLevel = practiceLevel;
this.serverId = serverId;
this.serverName = serverName;
}
public ArenaOfPlayerManager() {
}
public int getuId() {

View File

@ -37,27 +37,17 @@ public class ArenaOfUser {
@Field(value = "arenaOfGuildSkill")
private Map<Integer,Integer> guildSkill = new HashMap<>(4);
public ArenaOfUser(User user) throws UnknownHostException {
this.id = user.getId();
HeroManager heroManager = user.getHeroManager();
// 玩家基本信息
this.playerManager = new ArenaOfPlayerManager(user);
// 英雄
this.heroManager = new ArenaOfHeroManager(user);
// 灵兽
pokemons = new HashMap<>();
Map<String, Pokemon> pokemonMap = user.getPokemonManager().getPokemonMap();
Map<Integer, String> teamMap = user.getPokemonManager().getPokemonTeamMap();
teamMap.values().forEach(v->{
// clone 深度复制
Pokemon pokemon = (Pokemon)pokemonMap.get(v).clone();
pokemons.put(v,pokemon);
});
// 紫府神印
seals = new HashMap<>(heroManager.getPurpleMansionSeal());
// 公会技能
guildSkill = new HashMap<>(user.getGuildMyInfo().getGuildSkill());
public ArenaOfUser(int id, ArenaOfPlayerManager playerManager, ArenaOfHeroManager heroManager, Map<String, Pokemon> pokemons, Map<Integer, PurpleMansionSeal> seals, Map<Integer, Integer> guildSkill) {
this.id = id;
this.playerManager = playerManager;
this.heroManager = heroManager;
this.pokemons = pokemons;
this.seals = seals;
this.guildSkill = guildSkill;
}
public ArenaOfUser() {
}
public int getId() {
@ -107,4 +97,6 @@ public class ArenaOfUser {
public void setSeals(Map<Integer, PurpleMansionSeal> seals) {
this.seals = seals;
}
}

View File

@ -9,12 +9,15 @@ 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.globals.Global;
import com.ljsd.jieling.handler.map.TrailHero;
import com.ljsd.jieling.handler.map.behavior.BehaviorUtil;
import com.ljsd.jieling.logic.blood.BloodLogic;
import com.ljsd.jieling.logic.dao.Hero;
import com.ljsd.jieling.logic.dao.TeamPosHeroInfo;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.gm.ArenaOfHero;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.fight.result.FightResult;
import com.ljsd.jieling.logic.fight.robot.RobotInfo;
@ -569,5 +572,33 @@ public class FightUtil {
robotInfo.setPassiveSkill(SRobotSkill.getPassiveSkill(heroTid,property.getSkillPool()-1));
return robotInfo;
}
public static CommonProto.FightTeamInfo makeCrossPersonData(ArenaOfUser arenaOfUser){
List<CommonProto.FightUnitInfo> heroFightInfos = new ArrayList<>();
List<TeamPosHeroInfo> teamPosHeroInfos = arenaOfUser.getHeroManager().getTeams().get(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE);
for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) {
ArenaOfHero hero = arenaOfUser.getHeroManager().getHeros().get(teamPosHeroInfo.getHeroId());
if (hero == null) {
continue;
}
StringBuilder propertySb = new StringBuilder();
String heroSkill = HeroLogic.getInstance().getCrossHeroSkillStr(arenaOfUser,hero).toString();
String property = HeroLogic.getInstance().getHeroProperty(user,hero,propertySb,isMySelf,teamId).toString();
CommonProto.FightUnitInfo heroFightInfo = CommonProto.FightUnitInfo
.newBuilder()
.setUnitId(Integer.toString(hero.getTemplateId()))
.setUnitSkillIds(heroSkill.substring(0,heroSkill.length()-1))
.setProperty(property.substring(0, property.length()-1))
.setPosition(teamPosHeroInfo.getPosition())
.setStar(hero.getStar())
.build();
heroFightInfos.add(heroFightInfo);
}
return CommonProto.FightTeamInfo.
newBuilder()
.addAllFightUnitList(heroFightInfos)
.addAllPokemonUnitList(HeroLogic.getInstance().getPokemonSkills(user))
.setTeamPassiveList(HeroLogic.getInstance().getPokenmonPassiveSkills(user,teamId))
.build();
}
}

View File

@ -25,6 +25,8 @@ import com.ljsd.jieling.logic.activity.event.*;
import com.ljsd.jieling.logic.activity.eventhandler.HeroFiveStarGetEventHandler;
import com.ljsd.jieling.logic.activity.eventhandler.PokemonFiveStarGetEventHandler;
import com.ljsd.jieling.logic.dao.*;
import com.ljsd.jieling.logic.dao.gm.ArenaOfHero;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.expedition.ExpeditionLogic;
import com.ljsd.jieling.logic.fight.CombatLogic;
@ -1525,6 +1527,79 @@ public class HeroLogic{
return skillList;
}
public StringBuilder getCrossHeroSkillStr(ArenaOfUser user, ArenaOfHero hero){
List<Integer> skillList = new ArrayList<>();
SCHero tempHero = SCHero.getsCHero().get(hero.getTemplateId());
List<Integer> skillListByStar = tempHero.getSkillListByStar(hero.getStar());
if(skillListByStar!=null){
skillList.addAll(skillListByStar);
}
// 大于10星觉醒技
if (hero.getStar() > HERO_MAX_STAR) {
skillList.addAll(tempHero.getAwakSkills(1, hero.getBreakId()));
skillList.addAll(tempHero.getAwakSkills(2, hero.getStarBreakId()));
} else {
skillList.addAll(tempHero.getPassiveSkills(1, hero.getBreakId()));
skillList.addAll(tempHero.getPassiveSkills(2, hero.getStarBreakId()));
}
//魂印
Map<Integer, Integer> soulEquipByPositionMap = hero.getSoulEquipByPositionMap();
Map<Integer, SEquipConfig> config = STableManager.getConfig(SEquipConfig.class);
soulEquipByPositionMap.values().forEach(e->{
Arrays.stream(config.get(e).getPassiveSkill()).forEach(skillList::add);
});
//法宝技能
int[] equipTalismana = tempHero.getEquipTalismana();
if(equipTalismana.length<1 ||hero.getStar()<equipTalismana[0]){
return skillList;
}
int especialEquipLevel = hero.getEspecialEquipLevel();
int especialEquipId = equipTalismana[1];
Map<Integer,SEquipTalismana> sEquipTalismana = SEquipTalismana.equipTalismanaStarMap.get(especialEquipId);
sEquipTalismana.forEach((k,v)->{
if(k<=especialEquipLevel&&v.getOpenSkillRules()!=null){
Arrays.stream(v.getOpenSkillRules()).forEach(i->skillList.add(i));
}
});
// 紫府神印技能
Collection<PurpleMansionSeal> seals = user.getSeals().values();
seals.forEach(v->{
// 使用中神印
if (v.getState() == 1){
// 附身神印
if (v.getType() == 1){
if (v.getSubId().equals(hero.getId())){
getPurpleMansionSealSkill(v.getSealId(),tempHero,skillList);
}
}
// 通用神印
else {
getPurpleMansionSealSkill(v.getSealId(),tempHero,skillList);
}
}
});
StringBuilder sb = new StringBuilder();
coverSkill(skillList);
for(int i=0;i<skillList.size();i++){
Integer skill = skillList.get(i);
if(i<2){
sb.append(skill).append(DIVISION);
continue;
}
SPassiveSkillLogicConfig config = SPassiveSkillLogicConfig.getConfig(skill);
if(config!=null &&config.getEffectiveRange()==1){
sb.append(skill).append(DIVISION);
}
}
return sb;
}
/**
*
* @param sealId

View File

@ -118,6 +118,14 @@ public class PlayerLogic {
while (checkNameShield(name));
return name;
}
public String getRandomName2WithOutVerify() {
String name = "";
Map<Integer, String> surnameMap = SRandomName.getSurnameMap();
Map<Integer, String> nameMap = SRandomName.getNameMap();
name = surnameMap.get(MathUtils.random(1, surnameMap.size())) + nameMap.get(MathUtils.random(1, nameMap.size()));
return name;
}
public String[] getRandomNameWithPreAndPost() {
String name ;

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,true)
CROSS_SERVICE_ARENA(32,RedisKey.CROSS_SERVICE_ARENA,CrossArenaRank::new,true)
;
private int type;

View File

@ -6,6 +6,7 @@ import com.ljsd.jieling.exception.ErrorCodeException;
import com.ljsd.jieling.globals.BIReason;
import com.ljsd.jieling.ktbeans.ReportEventEnum;
import com.ljsd.jieling.ktbeans.ReportUtil;
import com.ljsd.jieling.logic.GlobleSystemLogic;
import com.ljsd.jieling.logic.dao.Hero;
import com.ljsd.jieling.logic.dao.PlayerManager;
import com.ljsd.jieling.logic.dao.TeamPosHeroInfo;
@ -76,20 +77,10 @@ public class RankLogic {
AbstractRank rank = RankContext.getRankEnum(type);
if(RankContext.isCrossRank(type)){
//跨服
int myGroup = GlobalidHelper.getWorldInfo().getMyGroup();
int protoId = session.getUid();
if(type==RankEnum.DEATH_PATH_TOTAL_GUILD_RANK.getType()||type== RankEnum.DEATH_PATH_EVERY_GUILD_RANK.getType()){
protoId = UserManager.getUser(session.getUid()).getPlayerInfoManager().getGuildId();
int crossGroup = GlobleSystemLogic.getInstence().getCrossGroup();
if(crossGroup>0){
rankResponse = rank.getRank(session.getUid(),String.valueOf(crossGroup),index/20+1, 20);
}
rankResponse = WorldHelper.sendMessageToWorldWithResult(session.getUid(), WorldProto.GetRankRequest.newBuilder().setUid(protoId).setAcitvityId(activityId).setType(type).setCrossId(myGroup).build(), PlayerInfoProto.RankResponse.class);
if(rankResponse==null){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}
}else{
rankResponse = rank.getRank(session.getUid(),rkey,index/20+1, 20);
}

View File

@ -0,0 +1,101 @@
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.activity.crossService.CrossServiceLogic;
import com.ljsd.jieling.logic.dao.CrossArenaEnemy;
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
import com.ljsd.jieling.logic.dao.root.User;
import org.springframework.data.redis.core.ZSetOperations;
import rpc.protocols.CommonProto;
import rpc.protocols.PlayerInfoProto;
import java.net.UnknownHostException;
/**
* @author lvxinran
* @date 2021/6/26
* @discribe
*/
public class CrossArenaRank extends AbstractRank {
public CrossArenaRank(int type, String redisKey) {
super(type, redisKey);
}
@Override
public void addRank(int uid, String rkey, double... data) {
String key = RedisUtil.getInstence().getKey(redisKey,rkey);
RedisUtil.getInstence().zsetAddOne(key,String.valueOf(uid), getScore(data));
}
@Override
public long[] getDataByScore(Double score) {
return new long[]{score.intValue()};
}
@Override
public double getScore(double... data) {
return data[0];
}
public void removeOneRankByPiece(String rkey,String value){
RedisUtil.getInstence().zsetRemoveOne(RedisUtil.getInstence().getKey(redisKey,rkey),value);
}
@Override
protected void getOptional(int index, ZSetOperations.TypedTuple<String> data, PlayerInfoProto.RankResponse.Builder builder) throws Exception {
if(Integer.parseInt(data.getValue())<1000){
CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder()
.setRank(index)
.setParam1(1000000)
.setParam2(getParam2(data.getScore()))
.setParam3(getParam3(data.getScore()));
CrossArenaEnemy mapEntry = RedisUtil.getInstence().getMapEntry(RedisKey.CROSS_ARENA_ROBOT_INFO, String.valueOf(GlobleSystemLogic.getInstence().getCrossGroup()), data.getValue(), CrossArenaEnemy.class);
if(mapEntry==null){
return;
}
CommonProto.UserRank.Builder everyRank = CommonProto.UserRank.newBuilder()
.setUid(mapEntry.getEnemyId_UUid())
.setUserName(mapEntry.getRandomName())
.setLevel(100)
.setUserSkin(80012)
.setRankInfo(everyRankInfo)
.setForce(1000000)
.setSex(0);
builder.addRanks(everyRank);
}else{
ArenaOfUser query = CrossServiceLogic.getInstance().query(Integer.valueOf(data.getValue()));
CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder()
.setRank(index)
.setParam1(query.getHeroManager().getTotalForce())
.setParam2(getParam2(data.getScore()))
.setParam3(getParam3(data.getScore()));
CommonProto.UserRank.Builder everyRank = CommonProto.UserRank.newBuilder()
.setUid(query.getId())
.setUserName(query.getPlayerManager().getName())
.setLevel(query.getPlayerManager().getLevel())
.setUserSkin(80012)
.setRankInfo(everyRankInfo)
.setForce(query.getHeroManager().getTotalForce())
.setSex(0);
builder.addRanks(everyRank);
}
}
protected void getMyInfo(User user, String rkey, PlayerInfoProto.RankResponse.Builder allUserResponse){
int myRank= RedisUtil.getInstence().getZSetreverseRank(redisKey,rkey,Integer.toString(user.getId())).intValue();
Double zSetScore = RedisUtil.getInstence().getZSetScore(redisKey, rkey, Integer.toString(user.getId()));
try {
ArenaOfUser query = CrossServiceLogic.getInstance().query(user.getId());
CommonProto.RankInfo towerRankInfo = CommonProto.RankInfo.newBuilder()
.setRank(myRank)
.setParam1(query.getHeroManager().getTotalForce())
.setParam2(getParam2(zSetScore)).build();
allUserResponse.setMyRankInfo(towerRankInfo);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}