From 39bc93bbca5566316ebcb220f5ba3707feb1f6c7 Mon Sep 17 00:00:00 2001 From: lvxinran Date: Sat, 3 Jul 2021 21:36:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=A8=E6=9C=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/db/redis/RedisKey.java | 8 + .../com/ljsd/jieling/db/redis/RedisUtil.java | 5 +- .../GetWorldArenaChallengeRequestHandler.java | 241 ++++++++++++++---- .../gtw/GetWorldArenaInfoRequestHandler.java | 14 +- .../gtw/GetWorldArenaProudRequestHandler.java | 41 ++- ...GetWorldArenaRecordInfoRequestHandler.java | 57 ++++- .../handler/player/GetPlayerOneTeamInfo.java | 14 +- .../crossService/CrossServiceLogic.java | 110 +++++++- .../ljsd/jieling/logic/arena/ArenaLogic.java | 135 ++++++++-- .../jieling/logic/dao/CrossArenaEnemy.java | 8 +- .../jieling/logic/dao/gm/ArenaOfHero.java | 89 +++---- .../logic/dao/gm/ArenaOfHeroManager.java | 31 +-- .../logic/dao/gm/ArenaOfPlayerManager.java | 32 +-- .../jieling/logic/dao/gm/ArenaOfUser.java | 32 +-- .../ljsd/jieling/logic/fight/FightUtil.java | 31 +++ .../ljsd/jieling/logic/hero/HeroLogic.java | 75 ++++++ .../jieling/logic/player/PlayerLogic.java | 8 + .../com/ljsd/jieling/logic/rank/RankEnum.java | 2 +- .../ljsd/jieling/logic/rank/RankLogic.java | 17 +- .../logic/rank/rankImpl/CrossArenaRank.java | 101 ++++++++ 20 files changed, 807 insertions(+), 244 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CrossArenaRank.java diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java index 644e272c4..65a7c0c99 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisKey.java @@ -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 familyKey = new HashSet<>(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java index 980270b66..b7faa2f74 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/db/redis/RedisUtil.java @@ -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; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeRequestHandler.java index e6f688ad8..60956befa 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaChallengeRequestHandler.java @@ -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 BaseHandler0){ -// //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> 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 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)) 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 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 strings = RedisUtil.getInstence().lGet(RedisKey.WORLD_ARENA_MY_PRON,String.valueOf(rpcMessage.getUid()), 0, -1); +// List 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(); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaInfoRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaInfoRequestHandler.java index f9a266bc0..b7971b5f7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaInfoRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaInfoRequestHandler.java @@ -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 arenaEnemyList = ArenaLogic.randomRank(iSession.getUid(), score == -1 ? 9999 : (int) score,crossGroup); + builder1.addAllArenaEnemys(arenaEnemyList); }else{ //拿前4个 - Set> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), 0, 4); - Set keys = new HashSet<>(4); + Set> rankByKey = rank.getRankByKey(String.valueOf(crossGroup), 0, 3); + List keys = new ArrayList<>(4); rankByKey.forEach(n->keys.add(Integer.parseInt(n.getValue()))); - List arenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(keys); + List arenaEnemyList = ArenaLogic.getInstance().getCrossArenaEnemyList(iSession.getUid(),keys,crossGroup); builder1.addAllArenaEnemys(arenaEnemyList); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaProudRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaProudRequestHandler.java index 159b4dc57..10e5160f3 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaProudRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/gtw/GetWorldArenaProudRequestHandler.java @@ -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 { @Override public MessageTypeProto.MessageType getMessageCode() { - return null; + return MessageTypeProto.MessageType.GetWorldArenaRecordInfoRequest; } @Override @@ -35,16 +42,48 @@ public class GetWorldArenaRecordInfoRequestHandler extends BaseHandler integerIntegerHashMap = ArenaLogic.ranInfo.get(integer); + //个人信息 +// Map.Entry challRank = ArenaLogic.getKey(integerIntegerHashMap, rpcMessage.getUid()); +// if (challRank == null) { +// return builder.build(); +// } + Map 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 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); +// } } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/player/GetPlayerOneTeamInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/player/GetPlayerOneTeamInfo.java index cb5e1c9e6..39119ee76 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/player/GetPlayerOneTeamInfo.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/player/GetPlayerOneTeamInfo.java @@ -23,14 +23,14 @@ public class GetPlayerOneTeamInfo extends BaseHandler1000&&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); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/crossService/CrossServiceLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/crossService/CrossServiceLogic.java index 746b8edd3..54db2faf7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/crossService/CrossServiceLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/crossService/CrossServiceLogic.java @@ -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 pokemons = new HashMap<>(); + Map pokemonMap = user.getPokemonManager().getPokemonMap(); + Map 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> teams = new HashMap<>(); + List infos = + user.getTeamPosManager().getTeamPosForHero().getOrDefault(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,new ArrayList<>()); + teams.put(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,infos); + // 英雄 + Map heroes = new HashMap<>(); + Map heroMap = user.getHeroManager().getHeroMap(); + infos.forEach(v->{ + Hero hero = heroMap.get(v.getHeroId()); + heroes.put(v.getHeroId(),buildArenaOfHero(user,hero)); + }); + // 魂宝灵宝 + Map jewels = new HashMap<>(); + + Map 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; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java index 968c0be28..1f75d71a6 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/ArenaLogic.java @@ -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 randomCrossRobot(int start, int end, int nums) { + List 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 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 getCrossArenaEnemyList(Set ids){ + public List getCrossArenaEnemyList(int uid,List ids,int groupId){ + List arenaEnemyList = new ArrayList<>(); + List 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 randomRank(HashMap integerIntegerHashMap, int uid, int myRank) { + public static List randomRank(int uid, int myRank,int crossGroup) { //缓存每次匹配结果 Set hisRank = RedisUtil.getInstence().getObject( RedisUtil.getInstence().getKey(RedisKey.WORLD_ARENA_RANK_MY_MATH, String.valueOf(uid)) , new TypeToken>() {}.getType()); - List arenaEnemies = new ArrayList<>(); - TreeSet 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 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> rankByKey = rankEnum.getRankByKey(String.valueOf(crossGroup),rank-1,rank-1); + ZSetOperations.TypedTuple 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 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) + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CrossArenaEnemy.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CrossArenaEnemy.java index ba1a1250b..1fab1fa5f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CrossArenaEnemy.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/CrossArenaEnemy.java @@ -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; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHero.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHero.java index 00bfb3e52..651519ceb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHero.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHero.java @@ -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 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 equipByPositionMap, Map soulEquipByPositionMap, int breakId, int starBreakId, int createTime, int especialEquipLevel, int createType, int changeId, Set 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 jewelInfo) { this.jewelInfo = jewelInfo; } + + public int getCreateType() { + return createType; + } + + public void setCreateType(int createType) { + this.createType = createType; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHeroManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHeroManager.java index 26abd5e75..92d85cf48 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHeroManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfHeroManager.java @@ -29,28 +29,15 @@ public class ArenaOfHeroManager { private int totalForce; - public ArenaOfHeroManager(User user) { - // 阵容信息 - teams = new HashMap<>(); - List infos = - user.getTeamPosManager().getTeamPosForHero().getOrDefault(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,new ArrayList<>()); - teams.put(GlobalsDef.WORLD_TEAM_ARENA_DEFENSE,infos); - // 英雄 - heros = new HashMap<>(); - Map 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 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> teams, Map heros, Map jewels, int totalForce) { + this.teams = teams; + this.heros = heros; + this.jewels = jewels; + this.totalForce = totalForce; + } + + public ArenaOfHeroManager() { } public Map> getTeams() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfPlayerManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfPlayerManager.java index 3d458ce26..88382b5f7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfPlayerManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfPlayerManager.java @@ -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() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfUser.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfUser.java index f7e9e2db5..ffe546664 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfUser.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/gm/ArenaOfUser.java @@ -37,27 +37,17 @@ public class ArenaOfUser { @Field(value = "arenaOfGuildSkill") private Map 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 pokemonMap = user.getPokemonManager().getPokemonMap(); - Map 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 pokemons, Map seals, Map 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 seals) { this.seals = seals; } + + } \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java index 10aa7ff4d..d6a691522 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/FightUtil.java @@ -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 heroFightInfos = new ArrayList<>(); + List 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(); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java index efba25510..958b8353f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/hero/HeroLogic.java @@ -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 skillList = new ArrayList<>(); + SCHero tempHero = SCHero.getsCHero().get(hero.getTemplateId()); + List 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 soulEquipByPositionMap = hero.getSoulEquipByPositionMap(); + Map 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() 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 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 surnameMap = SRandomName.getSurnameMap(); + Map 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 ; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankEnum.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankEnum.java index f7ec23b4f..921f27c2f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankEnum.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankEnum.java @@ -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; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java index 371fff797..13372829a 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/RankLogic.java @@ -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); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CrossArenaRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CrossArenaRank.java new file mode 100644 index 000000000..1fdd6bde0 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/CrossArenaRank.java @@ -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 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(); + } + } +}