From bdb1de4a3fea8fd0797eb09580e9427052d56ebb Mon Sep 17 00:00:00 2001 From: jiahuiwen <1024696487@qq.com> Date: Fri, 19 Apr 2019 11:34:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ljsd/jieling/db/redis/RedisUtil.java | 4 +- .../handler/GameGM/GMRequestHandler.java | 27 +-- .../map/MapBuyFightCountRequestHandler.java | 23 ++ .../map/MapFastFightRequestHandler.java | 20 ++ .../ljsd/jieling/handler/map/MapLogic.java | 218 +++++++++++++++++- .../handler/map/behavior/BehaviorUtil.java | 2 +- 6 files changed, 257 insertions(+), 37 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapBuyFightCountRequestHandler.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapFastFightRequestHandler.java 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 723d96f00..8e39c8db7 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 @@ -705,10 +705,10 @@ public class RedisUtil { } } - public Set getZset(String key,double min,double max){ + public Set getZset(String key,long min,long max){ for (int i = 0; i < MAX_TRY_TIMES; i++) { try { - return redisTemplate.opsForZSet().rangeByScore(key, min, max); + return redisTemplate.opsForZSet().reverseRange(key, min, max); } catch (Exception e) { TimeUtils.sleep(FAILED_SLEEP); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java index 79ac329a8..64c8760c0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java @@ -94,32 +94,7 @@ public class GMRequestHandler extends BaseHandler{ } break; case GlobalGm.OPEN_MAP: -// SChallengeMapConfig scMapConfig = SChallengeMapConfig.integerSChallengeMapConfigMap.get(100 + prarm1); -// Set missionIds = new HashSet<>(); -// MapManager mapManager = cUser.getMapManager(); -// if (scMapConfig != null) { -// for (int i = 1; i <= prarm1; i++) { -// int mapId = 100 + i; -// SCMapConfig crossMap = SCMapConfig.getsCMapSize().get(mapId); -// if (crossMap.getOpenRule() != null && crossMap.getOpenRule().length > 0) { -// missionIds.add(crossMap.getOpenRule()[0]); -// } -// initFininshMapMission(mapManager,mapId); -// } -// } -// cUser.getPlayerInfoManager().setMapId(scMapConfig.getId()); -// SCMapConfig crossMap = SCMapConfig.getsCMapSize().get(scMapConfig.getId() + 1); -// if (crossMap == null || crossMap.getOpenRule().length == 0) { -// return; -// } -// Map doingMissions = cUser.getMissionManager().getDoingMissions(); -// for (Integer key : doingMissions.keySet()) { -// cUser.getMissionManager().removeDoingMissions(key); -// } -// Mission mission = new Mission(); -// mission.setMissionId(crossMap.getOpenRule()[0]); -// mission.setMissionStep(0); -// cUser.getMissionManager().updateOneDoingMissions(crossMap.getOpenRule()[0], mission); + MapLogic.getInstance().gmCrossFight(uid, prarm1); break; case GlobalGm.ONE_KEY_ITEM_OR_HERO:{ //道具 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapBuyFightCountRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapBuyFightCountRequestHandler.java new file mode 100644 index 000000000..2c7d5a51d --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapBuyFightCountRequestHandler.java @@ -0,0 +1,23 @@ +package com.ljsd.jieling.handler.map; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.netty.cocdex.PacketNetData; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.protocols.MapInfoProto; +import com.ljsd.jieling.protocols.MessageTypeProto; +import org.springframework.stereotype.Component; + +@Component +public class MapBuyFightCountRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.MAP_BUY_FIGHT_COUNT_REQUEST; + } + + @Override + public void process(ISession iSession, PacketNetData netData) throws Exception { + byte[] message = netData.parseClientProtoNetData(); + MapInfoProto.MapBuyFightCountRequest mapBuyFightCountRequest = MapInfoProto.MapBuyFightCountRequest.parseFrom(message); + MapLogic.getInstance().buyFightCount(iSession, mapBuyFightCountRequest.getBuyCount(), MessageTypeProto.MessageType.MAP_SWEEP_RESPONSE); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapFastFightRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapFastFightRequestHandler.java new file mode 100644 index 000000000..1c96e2784 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapFastFightRequestHandler.java @@ -0,0 +1,20 @@ +package com.ljsd.jieling.handler.map; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.netty.cocdex.PacketNetData; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.protocols.MessageTypeProto; +import org.springframework.stereotype.Component; + +@Component +public class MapFastFightRequestHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.MAP_FAST_FIGHT_REQUEST; + } + + @Override + public void process(ISession iSession, PacketNetData netData) throws Exception { + MapLogic.getInstance().fastFight(iSession, MessageTypeProto.MessageType.MAP_FAST_FIGHT_RESPONSE); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java index f0025df2c..859534dc2 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/MapLogic.java @@ -755,6 +755,167 @@ public class MapLogic { } } + /** + * 快速战斗 + * @param session + * @param messageType + */ + public void fastFight(ISession session, MessageTypeProto.MessageType messageType) throws Exception { + int uid = session.getUid(); + User user = UserManager.getUser(uid); + MapManager mapManager = user.getMapManager(); + if (mapManager.getMapInfo() == null) { + LOGGER.info("fastFight mapManager.getMapInfo() == null"); + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), ""); + return; + } + if (mapManager.getCanMoveTime() > 0) { + long leftTime = mapManager.getCanMoveTime() - TimeUtils.now(); + if (leftTime > 0) { + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), "英雄 " + (leftTime / 1000) + " 秒后复活"); + return; + } + } + Cell cell = mapManager.getMapInfo().get(mapManager.getTriggerXY()); + if (cell == null) { + cell = mapManager.getMapInfo().get(mapManager.getCurXY()); + if (cell == null) { + LOGGER.info("cell == null xy is wrong =>{} triggerXY=>{}", mapManager.getCurXY(), mapManager.getTriggerXY()); + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), ""); + return; + } + } + int bigEventId = cell.getEventId(); + SEventPointConfig sEventPointConfig = SEventPointConfig.sEventPointConfigMap.get(bigEventId); + if (sEventPointConfig == null) { + LOGGER.info("sEventPointConfig == null"); + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), ""); + return; + } + String fightReadyKey = RedisKey.getKey(RedisKey.FIGHT_READY, Integer.toString(uid), false); + String fightReady = (String) RedisUtil.getInstence().get(fightReadyKey); + int groupId, destoryXY = 0; + String missionId = "0", destroyId = "0", nextEventId = "0"; + if (fightReady != null) { + String[] split = fightReady.split("#"); + RedisUtil.getInstence().del(fightReadyKey); + groupId = Integer.parseInt(split[0]); + if (split.length > 1) { + missionId = split[1]; + } + if (split.length > 2) { + destroyId = split[2]; + } + if (split.length > 3) { + nextEventId = split[3]; + } + } else { + int[] option = sEventPointConfig.getOption(); + if (option == null) { + LOGGER.info("option == null sEventPointConfig.getId()=>{}", sEventPointConfig.getId()); + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), ""); + return; + } + groupId = option[0]; + destoryXY = mapManager.getTriggerXY(); + } + CommonProto.FightTeamInfo fightTeamInfo = BehaviorUtil.getFightTeamInfo(user, mapManager.getTeamId()); + Map> monsterByGroup = MonsterUtil.getMonsterByGroup(groupId); + List monsterTeamList = new ArrayList<>(3); + List monsterGroupList = BehaviorUtil.getFightTeamInfos(groupId,monsterByGroup, Global.MONSTER_1); + monsterTeamList.addAll(monsterGroupList); + List monsterGroupList1 = BehaviorUtil.getFightTeamInfos(groupId,monsterByGroup, Global.MONSTER_2); + monsterTeamList.addAll(monsterGroupList1); + List monsterGroupList2 = BehaviorUtil.getFightTeamInfos(groupId,monsterByGroup, Global.MONSTER_3); + monsterTeamList.addAll(monsterGroupList2); + //设置战斗随机种子 + int seed = (int)(System.currentTimeMillis()/1000); + LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList); + LuaValue getOptionData = FightDataUtil.getOptionData(""); + int[] checkResult = CheckFight.getInstance().checkFight(seed, getFightData, getOptionData); + List remainHp = new ArrayList<>(5); + for (int i = 1; i < checkResult.length; i++) { + remainHp.add(checkResult[i]); + } + //校验结果码 1:胜利 + int resultCode = checkResult[0]; + if (resultCode == -1) { + MessageUtil.sendErrorResponse(session, 0, messageType.getNumber(), "战斗异常!"); + return; + } else if (resultCode == 0) { + // 失败需要等待n秒后复活所有英雄 + int dieCount = user.getMapManager().getDieCount(); + dieCount++; + user.getMapManager().setDieCount(dieCount); + SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(user.getMapManager().getCurMapId()); + int[] reviveTime = sChallengeConfig.getReviveTime(); + long time = (long) (MathUtils.calABX(dieCount, reviveTime) * 1000); + user.getMapManager().setCanMoveTime(TimeUtils.now() + time); + int leftTime = getLeftTime(user); + remainHp.clear(); + if (leftTime <= (int) (time / 1000)) { + resetMapInfo(user, false); + } else { + List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(mapManager.getTeamId()); + for (TeamPosHeroInfo heroInfo : teamPosHeroInfos) { + Hero hero = user.getHeroManager().getHero(heroInfo.getHeroId()); + if (hero == null) { + continue; + } + Map heroAttributeMap = HeroLogic.getInstance().calHeroFinalAttribute(user, hero); + hero.setCurHp(heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId())); + hero.setSpeed(heroAttributeMap.get(HeroAttributeEnum.Speed.getPropertyId())); + remainHp.add((int) hero.getCurHp()); + } + } + CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); + FightInfoProto.FightEndResponse fightEndResponse = FightInfoProto.FightEndResponse + .newBuilder() + .setResult(resultCode) + .setEnventDrop(dropBuilder) + .addAllRemainHpList(remainHp) + .build(); + MessageUtil.sendMessage(session, 1, messageType.getNumber(), fightEndResponse, true); + return; + } + int teamId = mapManager.getTeamId(); + List team = user.getTeamPosManager().getTeamPosForHero().get(teamId); + for (TeamPosHeroInfo teamPosHeroInfo : team){ + Hero hero = user.getHeroManager().getHero(teamPosHeroInfo.getHeroId()); + hero.setCurHp(checkResult[teamPosHeroInfo.getPosition()]); + } + CommonProto.Drop.Builder drop = ItemUtil.drop(user, new int[0], 1, 1); + FightInfoProto.FastFightResponse.Builder fastFightResponse = FightInfoProto.FastFightResponse.newBuilder(); + fastFightResponse.setEnventDrop(drop.build()); + fastFightResponse.setResult(resultCode); + fastFightResponse.addAllRemainHpList(remainHp); + fastFightResponse.build(); + if (!missionId.isEmpty()) { + MapInfoProto.EventUpdateResponse.Builder eventUpdateResponse = MapInfoProto.EventUpdateResponse.newBuilder(); + BehaviorUtil.updateMission(user, Integer.parseInt(missionId), eventUpdateResponse); + fastFightResponse.setMission(eventUpdateResponse.getMission()); + if (eventUpdateResponse.getDrop() != null) { + fastFightResponse.setMissionDrop(eventUpdateResponse.getDrop()); + } + } + if (!destroyId.isEmpty()) { + BehaviorUtil.destoryPoint(user, mapManager.getCurMapId(), Integer.parseInt(destroyId)); + } + if (destoryXY != 0) { + BehaviorUtil.destoryApointXY(user, destoryXY); + } + if (!nextEventId.isEmpty()) { + int triggerXY = mapManager.getTriggerXY(); + cell.setEventId(Integer.parseInt(nextEventId)); + mapManager.addOrUpdateCell(triggerXY, cell); + updateMapMission(mapManager,EventType.updateEvent,cell.getEventId(),0); + } +// LOGGER.info("endFight() uid=>{},nextEventId=>{}", uid, nextEventId); + updateMapMission(mapManager,EventType.fightEvent,0, 1); +// LOGGER.info("endFight() uid=>{} sMonsterGroup.getRewardgroup()=>{} misson=>{} eventDrop=>{}, missionDrop=>{}", uid, sMonsterGroup.getRewardgroup(), fastFightResponse.getMission(), fastFightResponse.getEnventDrop(), fastFightResponse.getMissionDrop()); + MessageUtil.sendMessage(session, 1, messageType.getNumber(), fastFightResponse.build(), true); + } + /** * 开始战斗 * @param session @@ -1269,13 +1430,15 @@ public class MapLogic { int uid = session.getUid(); User user = UserManager.getUser(uid); MapManager mapManager = user.getMapManager(); - SChallengeSetting sChallengeSetting = SChallengeSetting.challengeSetting; - if (mapManager.getBuyFightCount() + buyCount > sChallengeSetting.getLimit()) { - LOGGER.info("buyFightCount over max count: {}", (mapManager.getBuyFightCount() + buyCount)); - MessageUtil.sendErrorResponse(session,0, messageType.getNumber(), ""); - return; - } + // TODO 购买上限 +// SVipLevelConfig sVipLevelConfig = SVipLevelConfig.getsVipLevelConfigMap().get(user.getPlayerInfoManager().getVipLevel()); +// if (mapManager.getBuyFightCount() + buyCount > sChallengeSetting.getLimit()) { +// LOGGER.info("buyFightCount over max count: {}", (mapManager.getBuyFightCount() + buyCount)); +// MessageUtil.sendErrorResponse(session,0, messageType.getNumber(), ""); +// return; +// } int needGem = 0; + SChallengeSetting sChallengeSetting = SChallengeSetting.challengeSetting; for (int i = 1; i < buyCount; i++) { mapManager.setBuyFightCount(mapManager.getBuyFightCount() + 1); needGem += MathUtils.calABX(mapManager.getBuyFightCount(), sChallengeSetting.getCost()); @@ -1287,6 +1450,8 @@ public class MapLogic { MessageUtil.sendErrorResponse(session,0, messageType.getNumber(), ""); return; } + int dayFightCount = mapManager.getDayFightCount(); + mapManager.setDayFightCount(dayFightCount - buyCount < 0 ? 0 : dayFightCount - buyCount); MessageUtil.sendMessage(session, 1, messageType.getNumber(), null, true); } @@ -1297,7 +1462,7 @@ public class MapLogic { * @param messageType */ public void sweep(ISession session, int mapId, int count, MessageTypeProto.MessageType messageType) throws Exception { - if (count <= 0 || count>= 100) { + if (count <= 0 || count >= 100) { count = 1; } int uid = session.getUid(); @@ -1316,7 +1481,7 @@ public class MapLogic { } SChallengeSetting sChallengeSetting = SChallengeSetting.challengeSetting; if (mapManager.getDayFightCount() + count > sChallengeSetting.getLimit()) { - LOGGER.info("sweep over max count: {}", (mapManager.getBuyFightCount() + count)); + LOGGER.info("sweep over max count: {}", (mapManager.getDayFightCount() + count)); MessageUtil.sendErrorResponse(session,0, messageType.getNumber(), ""); return; } @@ -1367,6 +1532,16 @@ public class MapLogic { } MapInfoProto.getAllLevelDifficultyInfosResponse.Builder builder = MapInfoProto.getAllLevelDifficultyInfosResponse.newBuilder(); builder.addAllLevelDifficultyInfos(levelDifficultyInfos); + Map crossInfoMap = user.getMapManager().getCrossInfoMap(); + for (Map.Entry entry : crossInfoMap.entrySet()) { + CommonProto.MapInfo mapInfo = CommonProto.MapInfo + .newBuilder() + .setMapId(entry.getKey()) + .setLeastTime(entry.getValue().getLeastTime()) + .addAllStars(entry.getValue().getStars()) + .build(); + builder.addMapInfos(mapInfo); + } MessageUtil.sendMessage(iSession,1, msgId,builder.build(),true); } @@ -1615,4 +1790,31 @@ public class MapLogic { } } + + + + public void gmCrossFight (int uid, int arrayMapId) throws Exception { + User user = UserManager.getUser(uid); + if (user == null || user.getMapManager() == null) { + return; + } + MapManager mapManager = user.getMapManager(); + Map crossInfoMap = mapManager.getCrossInfoMap(); + for (int i = 100; i <= arrayMapId; i++) { + SChallengeMapConfig sChallengeMapConfig = SChallengeMapConfig.integerSChallengeMapConfigMap.get(i); + if (sChallengeMapConfig == null) { + continue; + } + CrossInfo crossInfo = crossInfoMap.get(i); + if (crossInfo == null) { + crossInfo = new CrossInfo(); + } + crossInfo.getStars().add(STAR_1); + crossInfo.getStars().add(STAR_2); + crossInfo.getStars().add(STAR_3); + crossInfoMap.put(i, crossInfo); + mapManager.updateCrossInfoMap(i, crossInfo); + } + } + } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/BehaviorUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/BehaviorUtil.java index b0b4f7e58..6bd3a947e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/BehaviorUtil.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/BehaviorUtil.java @@ -142,7 +142,7 @@ public class BehaviorUtil { * @param teamId * @return */ - private static CommonProto.FightTeamInfo getFightTeamInfo(User user, int teamId) { + public static CommonProto.FightTeamInfo getFightTeamInfo(User user, int teamId) { List heroFightInfos = new ArrayList<>(); List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) {