diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/function/EndlessFunction.java b/serverlogic/src/main/java/com/ljsd/jieling/core/function/EndlessFunction.java index 8692d5a3d..03b85ed01 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/function/EndlessFunction.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/function/EndlessFunction.java @@ -37,8 +37,8 @@ public class EndlessFunction implements FunctionManager { public void startAction(TimeControllerOfFunction timeControllerOfFunction) throws Exception { int times = timeControllerOfFunction.getTimes(); int[] maps = new int[]{4001,4002}; - - int mapId = maps[times % maps.length]; +// maps[times % maps.length]; + int mapId = 4001; MapLogic.endlessMapId = mapId; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/EventType.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/EventType.java index dcd2a3579..d752de268 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/EventType.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/EventType.java @@ -120,6 +120,8 @@ public class EventType { public static final int fourtyNine = 49; public static final int fifty = 50; public static final int fiftyone = 51; + public static final int fiftytwo = 52; + public static final int fiftythree = 53; public static final int updatePonintEvent = 1; public static final int fightEvent = 2; 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 dafeff296..99f83c611 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 @@ -3348,7 +3348,8 @@ public class MapLogic { int uid = session.getUid(); User user = UserManager.getUser(uid); EndlessTreasureReward worldTreasureReward = user.getMapManager().getEndlessTreasureReward(); - + //检测一下刷新 + flushEndlessTreasure(user); MapInfoProto.EndlessTreasureInfoResponse.Builder response = MapInfoProto.EndlessTreasureInfoResponse.newBuilder(); // if(worldTreasureReward.getFirstStartTime()!=0&&worldTreasureReward.getFirstStartTime()<=TimeUtils.nowInt()&&worldTreasureReward.getCreateTime()>TimeUtils.now()/1000){ Map rewardStatusMap = worldTreasureReward.getRewardStatusMap(); @@ -3369,13 +3370,12 @@ public class MapLogic { MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); } public void flushEndlessTreasure(User user) throws Exception { - if(user.getMapManager().getEndlessTreasureReward().getCreateTime()0){ item.setItemNum(0); } - } } } 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 dd7215fda..864720007 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 @@ -162,11 +162,16 @@ public class BehaviorUtil { * @param fightStartRespons * @throws Exception */ - public static void getFightInfo(User user, int teamId,int groupId, FightInfoProto.FightStartResponse.Builder fightStartRespons, String pointId,int maxTime,boolean isMyself) throws Exception { + public static void getFightInfo(User user, int teamId,int groupId, FightInfoProto.FightStartResponse.Builder fightStartRespons, String pointId,int maxTime,boolean isMyself,Map bloodMap) throws Exception { MapManager mapManager = user.getMapManager(); CommonProto.FightData.Builder fightData = CommonProto.FightData.newBuilder(); - CommonProto.FightTeamInfo fightTeamInfo = getFightTeamInfo(user, teamId,isMyself); + CommonProto.FightTeamInfo fightTeamInfo; + if(teamId==GlobalsDef.ENDLESS_TEAM){ + fightTeamInfo = FightUtil.makePersonFightData(user,teamId,bloodMap,null); + }else{ + fightTeamInfo = getFightTeamInfo(user, teamId,isMyself); + } fightData.setHeroFightInfos(fightTeamInfo); //monster Map> monsterByGroup = MonsterUtil.getMonsterByGroup(groupId); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyThreeBehavior.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyThreeBehavior.java new file mode 100644 index 000000000..5226a9b75 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyThreeBehavior.java @@ -0,0 +1,43 @@ +package com.ljsd.jieling.handler.map.behavior; + +import com.ljsd.jieling.handler.map.EndlessMapInfo; +import com.ljsd.jieling.handler.map.EventType; +import com.ljsd.jieling.logic.dao.root.User; +import org.springframework.stereotype.Component; +import rpc.protocols.MapInfoProto; +import util.MathUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author lvxinran + * @date 2021/5/26 + * @discribe + */ +@Component +public class FiftyThreeBehavior extends BaseBehavior { + @Override + public int getBehaviorType() { + return EventType.fiftythree; + } + + @Override + public boolean process(int optionId, User user, int[][] behaviorTypeValues, MapInfoProto.EventUpdateResponse.Builder eventUpdateResponse) throws Exception { + //回复血量 + EndlessMapInfo endlessMapInfo = user.getMapManager().getEndlessMapInfo(); + + Map endlessHeroInfo = endlessMapInfo.getEndlessHeroInfo(); + + Map newHpMap = new HashMap<>(); + + endlessHeroInfo.forEach((k,v)-> newHpMap.put(k,v==0?0: Math.min(v+behaviorTypeValues[0][0],10000))); + + user.getMapManager().updateEndlessHero(newHpMap); + + //计算时间 + BehaviorUtil.refreshTimeMonster(user,behaviorTypeValues[0][1]); + + return true; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyTwoBehavior.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyTwoBehavior.java new file mode 100644 index 000000000..6fe4f3283 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/behavior/FiftyTwoBehavior.java @@ -0,0 +1,56 @@ +package com.ljsd.jieling.handler.map.behavior; + +import com.ljsd.jieling.handler.map.Cell; +import com.ljsd.jieling.handler.map.EventType; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.mission.GameEvent; +import org.springframework.stereotype.Component; +import rpc.protocols.FightInfoProto; +import rpc.protocols.MapInfoProto; +import util.CellUtil; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * @author lvxinran + * @date 2021/5/25 + * @discribe + */ +@Component +public class FiftyTwoBehavior extends BaseBehavior { + @Override + public int getBehaviorType() { + return EventType.fiftytwo; + } + + @Override + public boolean process(int optionId, User user, int[][] behaviorTypeValues, MapInfoProto.EventUpdateResponse.Builder eventUpdateResponse) throws Exception { + String readyInfo = behaviorTypeValues[0][0] + "#" + Integer.toString(optionId); + BehaviorUtil.fightReady(user.getId(), readyInfo); + return true; + } + + @Override + public boolean afterFight(User user, int[][] behaviorTypeValues, FightInfoProto.FightEndResponse.Builder fightEndResponse) throws Exception { + + BehaviorUtil.destoryPoint(user,behaviorTypeValues[0][1]); + + int[] behaviorTypeValue = behaviorTypeValues[1]; + Set checkPoint = new HashSet<>(); + Arrays.stream(behaviorTypeValue).forEach(checkPoint::add); + for(Map.Entry entry:user.getMapManager().getMapInfo().entrySet()){ + int pointId = entry.getValue().getPointId(); + if(checkPoint.contains(pointId)){ + return true; + } + } + int[] add = behaviorTypeValues[2]; + BehaviorUtil.addBehaviorInfo(add[2],user, CellUtil.xy2Pos(add[0],add[1])); + user.getUserMissionManager().onGameEvent(user, GameEvent.ENDLESS_KILL_SMALL_BOSS); + + return true; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/AbstractMap.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/AbstractMap.java index b349b131d..ae005fc37 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/AbstractMap.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/AbstractMap.java @@ -218,53 +218,53 @@ public abstract class AbstractMap implements IMap { * @throws Exception */ public void startFight(int uid,FightInfoProto.FightStartResponse.Builder responseBuilder) throws Exception{ - User user = UserManager.getUser(uid); - MapManager mapManager = user.getMapManager(); - if (mapManager.getMapInfo() == null) { - LOGGER.info("mapManager.getMapInfo() == null"); -// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); - } - if (mapManager.getCanMoveTime() > 0) { - long leftTime = mapManager.getCanMoveTime() - TimeUtils.now(); - if (leftTime > 0) { -// throw new ErrorCodeException(ErrorCode.HERO_LIVE_AGAIN,Collections.singletonList((leftTime / 1000)+"")); - } - } - 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()); -// throw new ErrorCodeException(ErrorCode.newDefineCode("cell == null")); - } - } - int bigEventId = cell.getEventId(); - SEventPointConfig sEventPointConfig = STableManager.getConfig(SEventPointConfig.class).get(bigEventId); - if (sEventPointConfig == null) { - LOGGER.info("sEventPointConfig == null"); -// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); - } - String fightReadyKey = RedisKey.getKey(RedisKey.FIGHT_READY, Integer.toString(uid), false); - String fightReady = (String) RedisUtil.getInstence().get(fightReadyKey); - int groupId; - String pointId = "0"; - if (fightReady != null) { - String[] split = fightReady.split("#"); - RedisUtil.getInstence().del(fightReadyKey); - groupId = monsterGroupChange(Integer.parseInt(split[0]),user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); - if (split.length > 1) { - pointId = split[1]; - } - } else { - int[] option = sEventPointConfig.getOption(); - if (option == null||option.length<1) { - LOGGER.info("option == null sEventPointConfig.getId()=>{}", sEventPointConfig.getId()); -// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); - } - groupId = monsterGroupChange(option[0],user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); - } - SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()); - BehaviorUtil.getFightInfo(user,401, groupId, responseBuilder, pointId, sChallengeConfig.getMostTime(), true); +// User user = UserManager.getUser(uid); +// MapManager mapManager = user.getMapManager(); +// if (mapManager.getMapInfo() == null) { +// LOGGER.info("mapManager.getMapInfo() == null"); +//// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); +// } +// if (mapManager.getCanMoveTime() > 0) { +// long leftTime = mapManager.getCanMoveTime() - TimeUtils.now(); +// if (leftTime > 0) { +//// throw new ErrorCodeException(ErrorCode.HERO_LIVE_AGAIN,Collections.singletonList((leftTime / 1000)+"")); +// } +// } +// 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()); +//// throw new ErrorCodeException(ErrorCode.newDefineCode("cell == null")); +// } +// } +// int bigEventId = cell.getEventId(); +// SEventPointConfig sEventPointConfig = STableManager.getConfig(SEventPointConfig.class).get(bigEventId); +// if (sEventPointConfig == null) { +// LOGGER.info("sEventPointConfig == null"); +//// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); +// } +// String fightReadyKey = RedisKey.getKey(RedisKey.FIGHT_READY, Integer.toString(uid), false); +// String fightReady = (String) RedisUtil.getInstence().get(fightReadyKey); +// int groupId; +// String pointId = "0"; +// if (fightReady != null) { +// String[] split = fightReady.split("#"); +// RedisUtil.getInstence().del(fightReadyKey); +// groupId = monsterGroupChange(Integer.parseInt(split[0]),user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); +// if (split.length > 1) { +// pointId = split[1]; +// } +// } else { +// int[] option = sEventPointConfig.getOption(); +// if (option == null||option.length<1) { +// LOGGER.info("option == null sEventPointConfig.getId()=>{}", sEventPointConfig.getId()); +//// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); +// } +// groupId = monsterGroupChange(option[0],user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); +// } +// SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()); +// BehaviorUtil.getFightInfo(user,401, groupId, responseBuilder, pointId, sChallengeConfig.getMostTime(), true); } public void fastFight(int uid, FightInfoProto.FastFightResponse.Builder fastFightResponseBuilder) throws Exception { @@ -272,157 +272,7 @@ public abstract class AbstractMap implements IMap { } public void endFight(int uid, String frames, FightInfoProto.FightEndResponse.Builder builder,int dropout) throws Exception { - User user = UserManager.getUser(uid); - String key = RedisKey.getKey(RedisKey.FIGHT, Integer.toString(uid), false); - Map valueMap = RedisUtil.getInstence().hmget(key); - RedisUtil.getInstence().del(key); - if (valueMap == null || valueMap.isEmpty()) { - LOGGER.info("endFight() uid=>{} not start fight", uid); - throw new ErrorCodeException(ErrorCode.newDefineCode("此战斗已结算过")); - } - MapManager mapManager = user.getMapManager(); - if (user.getMapManager().getCanMoveTime() > 0) { - long leftTime = user.getMapManager().getCanMoveTime() - TimeUtils.now(); - if (leftTime > 0) { - throw new ErrorCodeException(ErrorCode.HERO_LIVE_AGAIN,Collections.singletonList((leftTime / 1000)+"")); - } - } - int triggerXY = mapManager.getTriggerXY(); - int optionId = Integer.parseInt((String) valueMap.get(RedisKey.NEED_VICTORY_AFTER)); - int nextEventId = 0; - SOptionConfig sOptionConfig = SOptionConfig.sOptionConfigMap.get(optionId); - SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(user.getMapManager().getCurMapId()); - //校验结果码 1:胜利 - int resultCode=0; - long[] checkResult = new long[0]; - int monsterGroupId=0; - - List remainHp = new ArrayList<>(6); - int seed = Integer.parseInt((String) valueMap.get(RedisKey.FIGHT_SEED)); - monsterGroupId = Integer.parseInt((String) valueMap.get(RedisKey.FIGHT_GROUPID)); - CommonProto.FightTeamInfo.Builder fightTeamBuilder = CommonProto.FightTeamInfo.newBuilder(); - JsonFormat.merge((String) valueMap.get(RedisKey.FIGHT_HEROES), fightTeamBuilder); - CommonProto.FightTeamInfo fightTeamInfo = fightTeamBuilder.build(); - List monsterTeamList = BehaviorUtil.getFightTeamInfos(valueMap); - SMonsterGroup sMonsterGroup = SMonsterGroup.getsMonsterGroupMap().get(monsterGroupId); - if (sMonsterGroup == null) { - LOGGER.info("endFight() uid=>{} monsterGroupId=>{} sMonsterGroup == null", uid, monsterGroupId); - throw new ErrorCodeException(ErrorCode.CFG_NULL); - } - LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList); - LuaValue getOptionData = FightDataUtil.getOptionData(frames); - int mostTime = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getMostTime(); - checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData, FightType.MapExploreFight); - resultCode = (int) checkResult[0]; - if (resultCode == -1) { - throw new ErrorCodeException(ErrorCode.FIGHT_EXCEPTION); - } - - mapManager.setLastFightResult(resultCode); - if (resultCode == 0) { - //todo 无尽副本复活 - //无尽副本复活消耗 -// revive(user,sChallengeConfig,remainHp,mapManager.getTeamId()); - CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); - builder.setResult(resultCode); - builder.setEnventDrop(dropBuilder); - builder.addAllRemainHpList(remainHp); - builder.setLastXY(mapManager.getLastXY()); - mapManager.setCurXY(mapManager.getLastXY()); - if (SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getType() == 2) { - builder.setLastTowerTime((int) (mapManager.getCurrTowerTime() / 1000)); - } - if (sOptionConfig != null) { - int[][] jumpTypeValues = sOptionConfig.getJumpTypeValues(); - if (jumpTypeValues.length > 0 && sOptionConfig.getJumpType() == 3) { - SOptionAddCondition sOptionAddConditions = SOptionAddCondition.sOptionAddConditionMap.get(jumpTypeValues[1][1]); - if (sOptionAddConditions != null && sOptionAddConditions.getType() == 7) { - Cell cell = mapManager.getMapInfo().get(triggerXY); - if (cell != null) { - nextEventId = MapLogic.getInstance().getNextEventId(user, cell, sOptionConfig); - cell.setEventId(nextEventId); - mapManager.addOrUpdateCell(triggerXY, cell); - builder.setEventId(nextEventId); - } - } - } - } - return; - } - - //无尽本更新血量 - if(mapManager.getCurMapType()==MapEnum.ENDLESS_MAP.getType()){ - List team = user.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.ENDLESS_TEAM); - for (int i = 0 ; i heroAllAttribute = HeroLogic.getInstance().calHeroNotBufferAttribute(user, hero,false,GlobalsDef.ENDLESS_TEAM); - int per = (int)(checkResult[position+1] / (double) heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId())*10000); - if(checkResult[i+1]>0&&per<=0){ - per = 1; - } - mapManager.updateEndlessHeroHp(team.get(i).getHeroId(),per); - } - } - - for (int i = 2; i < checkResult.length; i++) { - if (checkResult[i] <= 0) { - remainHp.add((long) 0); - } else { - remainHp.add(checkResult[i]); - } - } - //血量更新 -// refreshHp(user, mapManager.getTeamId(),checkResult); - CommonProto.Drop.Builder drop = ItemUtil.drop(user, sMonsterGroup.getRewardgroup(), 1, 0, BIReason.MAP_GENERAL_FIGHT_REWARD); - builder.setEnventDrop(drop.build()); - builder.setResult(resultCode); - builder.addAllRemainHpList(remainHp); - builder.build(); - //todo 无尽本待定 -// if(SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getType()==4){ -// endlessRefreshMonster(session,triggerXY); -// } - if (sOptionConfig != null) { - int behaviorType = sOptionConfig.getBehaviorType(); - int[][] behaviorTypeValues = sOptionConfig.getBehaviorTypeValues(); - BaseBehavior baseBehavior = MapLogic.getInstance().baseBehaviorMap.get(behaviorType); - if (baseBehavior != null) { - baseBehavior.afterFight(user, behaviorTypeValues, builder); - } - }else{ - BehaviorUtil.destoryApointXY(user,triggerXY); - } - - if (monsterGroupId == mapManager.getSuddenlyBoss()) { - mapManager.findSuddenlyBoss(0, 0); - - }else{ - if(sOptionConfig!=null){ - Cell cell = mapManager.getMapInfo().get(triggerXY); - if (cell != null ) { - nextEventId = MapLogic.getInstance().getNextEventId(user, cell, sOptionConfig); - cell.setEventId(nextEventId); - mapManager.addOrUpdateCell(triggerXY, cell); - } - } - - } - builder.setEventId(nextEventId); - MapMissionManager.updateMapMission(user, EventType.fightEvent, monsterGroupId, (int) checkResult[1]); - if (monsterGroupId == mapManager.getSuddenlyBoss()) { - mapManager.findSuddenlyBoss(0, 0); - } - if(mapManager.getTrialInfo().getFloor()==STrialConfig.getHighestTower()&&mapManager.getBossType()!=0){ - - int time = (int)((TimeUtils.now()-mapManager.getTowerStartTime())/1000); - mapManager.setCurrTowerTime(time*1000); - LOGGER.info("此层为最后一层,使用时间为{}",time); - builder.setLastTowerTime(time); - }else{ - builder.setLastTowerTime(0); - } } public void revive(User user,SChallengeConfig sChallengeConfig,List remainHp,int teamId) throws Exception { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/EndlessMap.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/EndlessMap.java index adcdeec9d..74b27bdbc 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/EndlessMap.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/map/mapType/EndlessMap.java @@ -1,12 +1,18 @@ package com.ljsd.jieling.handler.map.mapType; +import com.googlecode.protobuf.format.JsonFormat; +import com.ljsd.fight.CheckFight; +import com.ljsd.fight.FightType; import com.ljsd.jieling.core.FunctionIdEnum; import com.ljsd.jieling.core.GlobalsDef; import com.ljsd.jieling.db.mongo.MongoUtil; +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.map.*; +import com.ljsd.jieling.handler.map.behavior.BaseBehavior; import com.ljsd.jieling.handler.map.behavior.BehaviorUtil; import com.ljsd.jieling.logic.GlobalDataManaager; import com.ljsd.jieling.logic.OnlineUserManager; @@ -20,6 +26,8 @@ import com.ljsd.jieling.logic.fight.result.FightResult; import com.ljsd.jieling.logic.hero.HeroAttributeEnum; import com.ljsd.jieling.logic.hero.HeroLogic; import com.ljsd.jieling.logic.mission.GameEvent; +import com.ljsd.jieling.util.FightDataUtil; +import org.luaj.vm2.LuaValue; import rpc.protocols.CommonProto; import rpc.protocols.FightInfoProto; import rpc.protocols.MapInfoProto; @@ -31,6 +39,7 @@ import config.*; import manager.STableManager; import util.CellUtil; import util.MathUtils; +import util.TimeUtils; import java.util.*; @@ -237,9 +246,10 @@ public class EndlessMap extends AbstractMap{ }else{ for (TeamPosHeroInfo info:team) { int position = info.getPosition(); - Hero hero = user.getHeroManager().getHero(info.getHeroId()); - Map heroAllAttribute = HeroLogic.getInstance().calHeroNotBufferAttribute(user, hero,false,GlobalsDef.ENDLESS_TEAM); - int per = (int)(checkResult[position+1] *10000d / heroAllAttribute.get(HeroAttributeEnum.Hp.getPropertyId())); + Hero hero = user.getHeroManager().getEndlessHeroInfo().get(info.getHeroId()); + Map heroAttributeMap = SEndlessHeroProp.propsMap.get(hero.getTemplateId()); + + int per = (int)(checkResult[position+1] *10000d / heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId())); if(checkResult[position+1]>0&&per<=0){ per = 1; } @@ -255,6 +265,7 @@ public class EndlessMap extends AbstractMap{ } } user.getTeamPosManager().updateTeamPosByTeamId(GlobalsDef.ENDLESS_TEAM, updateTeam); + user.getUserMissionManager().onGameEvent(user,GameEvent.ENDLESS_KILL_MONTER); } @@ -285,17 +296,19 @@ public class EndlessMap extends AbstractMap{ private void checkMoraleLevel(User user) throws Exception { Map itemMap = user.getItemManager().getItemMap(); - if(!itemMap.containsKey(100)){ - return; - } - int moraleLevel = user.getMapManager().getEndlessMapInfo().getMoraleLevel(); Map config = STableManager.getConfig(SEndlessMorale.class); + int moraleLevel = user.getMapManager().getEndlessMapInfo().getMoraleLevel(); SEndlessMorale expConfig = config.get(moraleLevel + 1); - if(expConfig==null||expConfig.getExp()==0){ + int[] exp = expConfig.getExp(); + if(exp==null|| exp.length==0){ return; } - boolean itemCost = ItemUtil.itemCost(user, new int[][]{{100, expConfig.getExp()}}, BIReason.MORALE_LEVEL_UP_CONSUME, 1); - + if(!itemMap.containsKey(exp[0])){ + return; + } + Map costMap = new HashMap<>(); + costMap.put(exp[0],exp[1]); + boolean itemCost = ItemUtil.checkCost(user,costMap); if(!itemCost){ return; } @@ -500,4 +513,228 @@ public class EndlessMap extends AbstractMap{ public void updateLocation(User user,int xy) { user.getMapManager().updateEndlessLocation(xy); } + + /** + * 开始战斗 + * @param uid + * @param responseBuilder + * @throws Exception + */ + public void startFight(int uid,FightInfoProto.FightStartResponse.Builder responseBuilder) throws Exception{ + User user = UserManager.getUser(uid); + MapManager mapManager = user.getMapManager(); + if (mapManager.getMapInfo() == null) { + LOGGER.info("mapManager.getMapInfo() == null"); +// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + if (mapManager.getCanMoveTime() > 0) { + long leftTime = mapManager.getCanMoveTime() - TimeUtils.now(); + if (leftTime > 0) { +// throw new ErrorCodeException(ErrorCode.HERO_LIVE_AGAIN,Collections.singletonList((leftTime / 1000)+"")); + } + } + 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()); +// throw new ErrorCodeException(ErrorCode.newDefineCode("cell == null")); + } + } + int bigEventId = cell.getEventId(); + SEventPointConfig sEventPointConfig = STableManager.getConfig(SEventPointConfig.class).get(bigEventId); + if (sEventPointConfig == null) { + LOGGER.info("sEventPointConfig == null"); +// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + String fightReadyKey = RedisKey.getKey(RedisKey.FIGHT_READY, Integer.toString(uid), false); + String fightReady = (String) RedisUtil.getInstence().get(fightReadyKey); + int groupId; + String pointId = "0"; + if (fightReady != null) { + String[] split = fightReady.split("#"); + RedisUtil.getInstence().del(fightReadyKey); + groupId = monsterGroupChange(Integer.parseInt(split[0]),user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); + if (split.length > 1) { + pointId = split[1]; + } + } else { + int[] option = sEventPointConfig.getOption(); + if (option == null||option.length<1) { + LOGGER.info("option == null sEventPointConfig.getId()=>{}", sEventPointConfig.getId()); +// throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + groupId = monsterGroupChange(option[0],user.getPlayerInfoManager().getLevel(),mapManager.getCurMapId()); + } + SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()); + Map endlessHeroInfo = mapManager.getEndlessMapInfo().getEndlessHeroInfo(); + List endteam = user.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.ENDLESS_TEAM); + Map bloodMap = new HashMap<>(); + for (int i = 0 ; i valueMap = RedisUtil.getInstence().hmget(key); + RedisUtil.getInstence().del(key); + if (valueMap == null || valueMap.isEmpty()) { + LOGGER.info("endFight() uid=>{} not start fight", uid); + throw new ErrorCodeException(ErrorCode.newDefineCode("此战斗已结算过")); + } + MapManager mapManager = user.getMapManager(); + if (user.getMapManager().getCanMoveTime() > 0) { + long leftTime = user.getMapManager().getCanMoveTime() - TimeUtils.now(); + if (leftTime > 0) { + throw new ErrorCodeException(ErrorCode.HERO_LIVE_AGAIN,Collections.singletonList((leftTime / 1000)+"")); + } + } + + int triggerXY = mapManager.getTriggerXY(); + int optionId = Integer.parseInt((String) valueMap.get(RedisKey.NEED_VICTORY_AFTER)); + int nextEventId = 0; + SOptionConfig sOptionConfig = SOptionConfig.sOptionConfigMap.get(optionId); + SChallengeConfig sChallengeConfig = SChallengeConfig.sChallengeConfigs.get(user.getMapManager().getCurMapId()); + //校验结果码 1:胜利 + int resultCode=0; + long[] checkResult = new long[0]; + int monsterGroupId=0; + + List remainHp = new ArrayList<>(6); + int seed = Integer.parseInt((String) valueMap.get(RedisKey.FIGHT_SEED)); + monsterGroupId = Integer.parseInt((String) valueMap.get(RedisKey.FIGHT_GROUPID)); + CommonProto.FightTeamInfo.Builder fightTeamBuilder = CommonProto.FightTeamInfo.newBuilder(); + JsonFormat.merge((String) valueMap.get(RedisKey.FIGHT_HEROES), fightTeamBuilder); + CommonProto.FightTeamInfo fightTeamInfo = fightTeamBuilder.build(); + List monsterTeamList = BehaviorUtil.getFightTeamInfos(valueMap); + SMonsterGroup sMonsterGroup = SMonsterGroup.getsMonsterGroupMap().get(monsterGroupId); + if (sMonsterGroup == null) { + LOGGER.info("endFight() uid=>{} monsterGroupId=>{} sMonsterGroup == null", uid, monsterGroupId); + throw new ErrorCodeException(ErrorCode.CFG_NULL); + } + LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterTeamList); + LuaValue getOptionData = FightDataUtil.getOptionData(frames); + int mostTime = SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getMostTime(); + checkResult = CheckFight.getInstance().checkFight(seed, mostTime, getFightData, getOptionData, FightType.MapExploreFight); + resultCode = (int) checkResult[0]; + if (resultCode == -1) { + throw new ErrorCodeException(ErrorCode.FIGHT_EXCEPTION); + } + + mapManager.setLastFightResult(resultCode); + if (resultCode == 0) { + //无尽副本复活消耗 +// revive(user,sChallengeConfig,remainHp,mapManager.getTeamId()); + CommonProto.Drop.Builder dropBuilder = CommonProto.Drop.newBuilder(); + builder.setResult(resultCode); + builder.setEnventDrop(dropBuilder); + builder.addAllRemainHpList(remainHp); + builder.setLastXY(mapManager.getLastXY()); + mapManager.setCurXY(mapManager.getLastXY()); + if (SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getType() == 2) { + builder.setLastTowerTime((int) (mapManager.getCurrTowerTime() / 1000)); + } + if (sOptionConfig != null) { + int[][] jumpTypeValues = sOptionConfig.getJumpTypeValues(); + if (jumpTypeValues.length > 0 && sOptionConfig.getJumpType() == 3) { + SOptionAddCondition sOptionAddConditions = SOptionAddCondition.sOptionAddConditionMap.get(jumpTypeValues[1][1]); + if (sOptionAddConditions != null && sOptionAddConditions.getType() == 7) { + Cell cell = mapManager.getMapInfo().get(triggerXY); + if (cell != null) { + nextEventId = MapLogic.getInstance().getNextEventId(user, cell, sOptionConfig); + cell.setEventId(nextEventId); + mapManager.addOrUpdateCell(triggerXY, cell); + builder.setEventId(nextEventId); + } + } + } + } + if(mapManager.getCurMapType()==MapEnum.ENDLESS_MAP.getType()){ + List team = user.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.ENDLESS_TEAM); + for (int i = 0 ; i team = user.getTeamPosManager().getTeamPosForHero().get(GlobalsDef.ENDLESS_TEAM); + for (int i = 0 ; i heroAttributeMap = SEndlessHeroProp.propsMap.get(hero.getTemplateId()); + + int per = (int)(checkResult[position+1] / (double) heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId())*10000); + if(checkResult[i+1]>0&&per<=0){ + per = 1; + } + mapManager.updateEndlessHeroHp(team.get(i).getHeroId(),per); + } + } + + for (int i = 2; i < checkResult.length; i++) { + if (checkResult[i] <= 0) { + remainHp.add((long) 0); + } else { + remainHp.add(checkResult[i]); + } + } + //血量更新 +// refreshHp(user, mapManager.getTeamId(),checkResult); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, sMonsterGroup.getRewardgroup(), 1, 0, BIReason.MAP_GENERAL_FIGHT_REWARD); + builder.setEnventDrop(drop.build()); + builder.setResult(resultCode); + builder.addAllRemainHpList(remainHp); + builder.build(); + //todo 无尽本待定 +// if(SChallengeConfig.sChallengeConfigs.get(mapManager.getCurMapId()).getType()==4){ +// endlessRefreshMonster(session,triggerXY); +// } + if (sOptionConfig != null) { + int behaviorType = sOptionConfig.getBehaviorType(); + int[][] behaviorTypeValues = sOptionConfig.getBehaviorTypeValues(); + BaseBehavior baseBehavior = MapLogic.getInstance().baseBehaviorMap.get(behaviorType); + if (baseBehavior != null) { + baseBehavior.afterFight(user, behaviorTypeValues, builder); + } + }else{ + BehaviorUtil.destoryApointXY(user,triggerXY); + } + + if (monsterGroupId == mapManager.getSuddenlyBoss()) { + mapManager.findSuddenlyBoss(0, 0); + + }else{ + if(sOptionConfig!=null){ + Cell cell = mapManager.getMapInfo().get(triggerXY); + if (cell != null ) { + nextEventId = MapLogic.getInstance().getNextEventId(user, cell, sOptionConfig); + cell.setEventId(nextEventId); + mapManager.addOrUpdateCell(triggerXY, cell); + } + } + + } + builder.setEventId(nextEventId); + MapMissionManager.updateMapMission(user, EventType.fightEvent, monsterGroupId, (int) checkResult[1]); + if (monsterGroupId == mapManager.getSuddenlyBoss()) { + mapManager.findSuddenlyBoss(0, 0); + } + if(mapManager.getTrialInfo().getFloor()==STrialConfig.getHighestTower()&&mapManager.getBossType()!=0){ + + int time = (int)((TimeUtils.now()-mapManager.getTowerStartTime())/1000); + mapManager.setCurrTowerTime(time*1000); + LOGGER.info("此层为最后一层,使用时间为{}",time); + builder.setLastTowerTime(time); + }else{ + builder.setLastTowerTime(0); + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserMissionManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserMissionManager.java index 80dbee57c..ed9b9e1c3 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserMissionManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserMissionManager.java @@ -804,4 +804,8 @@ public class UserMissionManager extends MongoBase { public EndlessMissionType getEndlessMissionType() { return endlessMissionType; } + + public CumulationData getEndlessTask() { + return endlessTask; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/GameEvent.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/GameEvent.java index 92c6cceda..8c18aaae8 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/GameEvent.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/GameEvent.java @@ -115,5 +115,7 @@ public enum GameEvent { ENDLESS_MISSION_REWARD, ENDLESS_MORALE_LEVEL_UP, ENDLESS_KILL_MONTER, + ENDLESS_KILL_SMALL_BOSS, + ENDLESS_KILL_LAST_BOSS, ENDLESS_OPEN_MAP } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/MissionLoigc.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/MissionLoigc.java index 1bfaa9072..b33095880 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/MissionLoigc.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/MissionLoigc.java @@ -381,16 +381,23 @@ public class MissionLoigc { BitSet rewardedMissionIds = missionType.getRewardedMissionIds(); Collection values = STableManager.getConfig(SEndlessTask.class).values(); + CumulationData treasureCumulationData = user.getUserMissionManager().getEndlessTask(); + values.forEach(v->{ int id = v.getId(); + SEndlessTask config = STableManager.getConfig(SEndlessTask.class).get(id); CommonProto.UserMissionInfo.Builder info = CommonProto.UserMissionInfo.newBuilder(); info.setMissionId(id); info.setType(GameMisionType.ENDLESS_MISSION.getType()); if (doingMissionIds.contains(id)){ info.setState(MissionState.DOING.getState()); + int doingProgress = getDoingProgress(user, treasureCumulationData, config.getType(), config.getValues()[0]); + info.setProgress(doingProgress); } if (finishMissionIds.contains(id)){ + int finishProgress = config.getValues()[1][0]; info.setState(MissionState.FINISH.getState()); + info.setProgress(finishProgress); } if (rewardedMissionIds.get(id)){ info.setState(MissionState.REWARD.getState()); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/data/EndlessMoraleDataManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/data/EndlessMoraleDataManager.java index c64338cff..fab41b2de 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/data/EndlessMoraleDataManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/data/EndlessMoraleDataManager.java @@ -12,7 +12,7 @@ import com.ljsd.jieling.logic.mission.MissionType; public class EndlessMoraleDataManager extends AbstractDataManager { @Override public CumulationData.Result updateData(CumulationData data, MissionType missionType, Object... parm) { - data.endlessMorale+=(int)parm[0]; + data.endlessMorale=(int)parm[0]; return new CumulationData.Result(missionType); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/event/MissionEventDistributor.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/event/MissionEventDistributor.java index 8d118f37d..cbadec217 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/event/MissionEventDistributor.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/mission/event/MissionEventDistributor.java @@ -439,12 +439,24 @@ public class MissionEventDistributor { typeList = new ArrayList<>(); typeList.add(MissionType.ENDLESS_MONSTER_KILL); - typeList.add(MissionType.ENDLESS_BOSS_KILL); - typeList.add(MissionType.ENDLESS_LAST_BOSS); eventEnumListMap.put(GameEvent.ENDLESS_KILL_MONTER, typeList); eventProcessor.put(GameEvent.ENDLESS_KILL_MONTER, new CumulationDataEventProcessor()); + + typeList = new ArrayList<>(); + typeList.add(MissionType.ENDLESS_BOSS_KILL); + eventEnumListMap.put(GameEvent.ENDLESS_KILL_SMALL_BOSS, typeList); + eventProcessor.put(GameEvent.ENDLESS_KILL_SMALL_BOSS, new CumulationDataEventProcessor()); + + + typeList = new ArrayList<>(); + typeList.add(MissionType.ENDLESS_LAST_BOSS); + eventEnumListMap.put(GameEvent.ENDLESS_KILL_LAST_BOSS, typeList); + eventProcessor.put(GameEvent.ENDLESS_KILL_LAST_BOSS, new CumulationDataEventProcessor()); + + + typeList = new ArrayList<>(); typeList.add(MissionType.ENDLESS_OPEN_PERCENT); eventEnumListMap.put(GameEvent.ENDLESS_OPEN_MAP, typeList); @@ -537,7 +549,7 @@ public class MissionEventDistributor { if(gameMisionType == GameMisionType.COPYMISSION || gameMisionType == GameMisionType.TREASUREMISSION || gameMisionType == GameMisionType.SEVENMISSION || gameMisionType == GameMisionType.BLOODYMISSION || gameMisionType == GameMisionType.ACHIEVEMISSION || gameMisionType == GameMisionType.JADE_DYNASTY_MISSION - || gameMisionType == GameMisionType.COWFLYSKYMISSION ){ + || gameMisionType == GameMisionType.COWFLYSKYMISSION||gameMisionType==GameMisionType.ENDLESS_MISSION){ progress = missionStateChangeInfo.getProgress(); } if(missionState == MissionState.DOING){ diff --git a/tablemanager/src/main/java/config/SEndlessMorale.java b/tablemanager/src/main/java/config/SEndlessMorale.java index cce78a6fe..10fb893f8 100644 --- a/tablemanager/src/main/java/config/SEndlessMorale.java +++ b/tablemanager/src/main/java/config/SEndlessMorale.java @@ -12,7 +12,7 @@ public class SEndlessMorale implements BaseConfig { private int level; - private int exp; + private int[] exp; private int[][] props; @@ -33,7 +33,7 @@ public class SEndlessMorale implements BaseConfig { return level; } - public int getExp() { + public int[] getExp() { return exp; }