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 81684f1e8..cd9d04282 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 @@ -261,6 +261,8 @@ public class RedisKey { public static final String DEATH_PATH_TOTAL_GUILD_RANK = "DEATH_PATH_TOTAL_GUILD_RANK"; + public static final String SITUATION_RANK = "SITUATION_RANK"; + public static final String DEATH_PAHT_TOTAL_CHALLENGE_COUNT = "DEATH_PAHT_TOTAL_CHALLENGE_COUNT"; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java index bc15371d7..65fad884e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/globals/BIReason.java @@ -144,6 +144,8 @@ public interface BIReason { int EQUIP_UNLOAD_REWARD = 79; int ESPECIAL_BACK = 80;//法宝归元获得 + int SITUATION_CHALLENGE_REWARD = 81;//轩辕宝镜获得 + int ADVENTURE_UPLEVEL_CONSUME = 1000;//秘境升级 int SECRETBOX_CONSUME = 1001;//秘盒抽卡 int DECOMPOSE_ITEM_CONSUME = 1002;//分解道具消耗 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java index 3cda67beb..a6a71fef1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java @@ -332,7 +332,9 @@ public class GlobalDataManaager implements IManager { FriendLogic.getInstance().refreshState(session); PlayerLogic.getInstance().sendTimingMail(user); user.getGuildMyInfo().setLastHurt(0); - + if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,5)){ + user.getPlayerInfoManager().updateSituationPass(new HashMap<>()); + } if(fBuilder!=null){ fBuilder.setSignInInfo(CommonProto.SignInInfo.newBuilder().setDays(user.getPlayerInfoManager().getSign()+1).setState(user.getPlayerInfoManager().getSignTotay()).build()); user.getPlayerInfoManager().setLoginTime(TimeUtils.now()); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/SituationLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/SituationLogic.java index 1ec7273df..91501af08 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/SituationLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/SituationLogic.java @@ -1,39 +1,44 @@ package com.ljsd.jieling.logic; +import com.ljsd.fight.CheckFight; import com.ljsd.jieling.core.FunctionIdEnum; import com.ljsd.jieling.core.GlobalsDef; import com.ljsd.jieling.exception.ErrorCode; 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.dao.PlayerManager; +import com.ljsd.jieling.logic.dao.TeamPosHeroInfo; import com.ljsd.jieling.logic.dao.TimeControllerOfFunction; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; -import com.ljsd.jieling.logic.fight.FightDispatcher; -import com.ljsd.jieling.logic.fight.GameFightType; -import com.ljsd.jieling.logic.fight.PVEFightEvent; +import com.ljsd.jieling.logic.fight.*; import com.ljsd.jieling.logic.fight.result.FightResult; import com.ljsd.jieling.logic.mission.GameEvent; 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.session.ISession; import com.ljsd.jieling.protocols.CommonProto; import com.ljsd.jieling.protocols.MapInfoProto; import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.protocols.PlayerInfoProto; +import com.ljsd.jieling.util.FightDataUtil; import com.ljsd.jieling.util.ItemUtil; import com.ljsd.jieling.util.MessageUtil; import com.ljsd.jieling.util.MonsterUtil; -import config.SDailyChallengeConfig; -import config.SMainLevelConfig; -import config.SRaceTowerConfig; -import config.SSpecialConfig; +import config.*; import manager.STableManager; +import org.luaj.vm2.LuaValue; import util.TimeUtils; import java.util.*; +import static com.ljsd.jieling.logic.fight.FightUtil.makePersonFightData; + /** * @author lvxinran * @date 2020/8/6 @@ -56,7 +61,7 @@ public class SituationLogic { private int[] overTime; - public void createCheckstatusTask(){ + public void createCheckStatusTask(){ Runnable runnable = this::checkStatus; runnable.run(); } @@ -80,6 +85,7 @@ public class SituationLogic { if(hourOfDay<5){ week = week==0?7:week-1; } + boolean isIndication = false; for(int[] config:openConfig){ boolean isOpen = false; for(int i = 1;i sessionMap = OnlineUserManager.sessionMap; + for(Map.Entry entry:sessionMap.entrySet()){ + //发推送 + PlayerManager playerInfoManager= UserManager.getUser(entry.getKey()).getPlayerInfoManager(); + if (remove){ + playerInfoManager.updateSituationPass(new HashMap<>()); + } + MapInfoProto.GetAllSituationInfoResponse.Builder indication = MapInfoProto.GetAllSituationInfoResponse.newBuilder(); + for(int i = 0 ; i < status.length;i++){ + if(status[i]==0){ + continue; + } + CommonProto.SituationInfo info = CommonProto.SituationInfo.newBuilder().setId(i+1) + .setOverTime(overTime[i]) + .setPassId(playerInfoManager.getSituationPass().getOrDefault(i+1,0)).build(); + indication.addInfos(info); + } + MessageUtil.sendIndicationMessage(entry.getValue(),1,MessageTypeProto.MessageType.SITUATION_INFO_INDICATION_VALUE,indication.build(),true); + } + } catch (Exception e) { + e.printStackTrace(); + } + } } - public void getAllSituationStatus(ISession session, MessageTypeProto.MessageType messageType){ - + public void getAllSituationStatus(ISession session, MessageTypeProto.MessageType messageType) throws Exception { + User user = UserManager.getUser(session.getUid()); MapInfoProto.GetAllSituationInfoResponse.Builder response = MapInfoProto.GetAllSituationInfoResponse.newBuilder(); + Map situationPass = user.getPlayerInfoManager().getSituationPass(); for(int i = 0 ; i < status.length;i++){ if(status[i]==0){ continue; } - CommonProto.SituationInfo info = CommonProto.SituationInfo.newBuilder().setId(i+1).setOverTime(overTime[i]).build(); + CommonProto.SituationInfo info = CommonProto.SituationInfo.newBuilder().setId(i+1) + .setOverTime(overTime[i]) + .setPassId(situationPass.getOrDefault(i+1,0)).build(); response.addInfos(info); } + MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); } @@ -113,27 +156,49 @@ public class SituationLogic { PlayerManager playerInfoManager = user.getPlayerInfoManager(); // //次数校验 SRaceTowerConfig sRaceTowerConfig = STableManager.getConfig(SRaceTowerConfig.class).get(id); - Set situationPass = playerInfoManager.getSituationPass(); + Map situationPass = playerInfoManager.getSituationPass(); boolean consumeCount = false; if(type==2){ - if(!situationPass.contains(id)){ + if(!situationPass.containsKey(sRaceTowerConfig.getType())||situationPass.get(sRaceTowerConfig.getType()) teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(formation); + if(teamPosHeroInfos==null||teamPosHeroInfos.isEmpty()){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); + } + int[] heroType = new int[5]; + teamPosHeroInfos.forEach(hero->{ + int tempId = user.getHeroManager().getHero(hero.getHeroId()).getTemplateId(); + int profession = SCHero.getsCHero().get(tempId).getPropertyName(); + heroType[profession] = heroType[profession]+1; + }); + for(int[] rule:sRaceTowerConfig.getTeamRules()){ + if(heroType[rule[0]]> buffMap = new HashMap<>(); + for(int[] buffid:sRaceTowerConfig.getAttribute()){ + buffMap.computeIfAbsent(buffid[0],n->new ArrayList<>()).add(buffid[1]); + } + //组装战斗数据 + PVEFightEvent pveFightEvent = new PVEFightEvent(user.getId(), formation, 20, "", GameFightType.DailyChallenge, sRaceTowerConfig.getMonsterId(), 3); +// FightResult fightResult = FightDispatcher.dispatcher(pveFightEvent); + FightResult fightResult = getFightForSituation(pveFightEvent, buffMap); CommonProto.FightData fightData = CommonProto.FightData.newBuilder() .setFightMaxTime(20) .setFightSeed(fightResult.getSeed()) @@ -142,11 +207,15 @@ public class SituationLogic { .build(); int[] checkResult = fightResult.getCheckResult(); builder.setFightData(fightData); + //挑战成功 if(checkResult[0]>0){ - CommonProto.Drop.Builder drop = ItemUtil.drop(user, sRaceTowerConfig.getFirstReward(), 1, 0, 1); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, sRaceTowerConfig.getFirstReward(), 1, 0, BIReason.SITUATION_CHALLENGE_REWARD); builder.setDrop(drop); - situationPass.add(id); + situationPass.put(sRaceTowerConfig.getType(),id); playerInfoManager.updateSituationPass(situationPass); + AbstractRank rankEnum = RankContext.getRankEnum(RankEnum.SITUATION_RANK.getType()); + int score = Double.valueOf(rankEnum.getScoreById(user.getId(), "")).intValue(); + rankEnum.addRank(user.getId(),"",score==-1?1:score+1); consumeCount = true; } }else{ @@ -154,7 +223,7 @@ public class SituationLogic { } // ReportUtil.onReportEvent(user, ReportEventEnum.START_DAILY_DUNGEON.getType(),id,sDailyChallengeConfig.getMonsterId(), MonsterUtil.getMonsterForce(new int[]{sDailyChallengeConfig.getMonsterId()}),"",0); if(consumeCount){ - boolean consume = PlayerLogic.getInstance().checkAndUpdate(user, sRaceTowerConfig.getPrivilege()[1], 1); + boolean consume = PlayerLogic.getInstance().checkAndUpdate(user, sRaceTowerConfig.getPrivilege()[0], 1); if(!consume){ throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE); } @@ -162,5 +231,24 @@ public class SituationLogic { // user.getUserMissionManager().onGameEvent(user, GameEvent.DAILY_CHALLENGE,sDailyChallengeConfig.getType()); MessageUtil.sendMessage(session,1,messageType.getNumber(),builder.build()); } + public static FightResult getFightForSituation(FightEvent fightEvent,Map> buffInfo){ + PVEFightEvent pveFightEvent = (PVEFightEvent)fightEvent; + User userInMem = UserManager.getUserInMem(pveFightEvent.getAttackUid()); + CommonProto.FightTeamInfo fightTeamInfo = FightUtil.getFightTeamInfoWithSomeBuff(userInMem, pveFightEvent.getTeamId(),pveFightEvent.getAttackBloodMap(),buffInfo); + int fightSeed = FightUtil.getFightSeed(); + List monsterfightTeamInfos = FightUtil.makeMonsterFightData(pveFightEvent.getMonsterGroupId(), pveFightEvent.getNums()); + LuaValue getFightData = FightDataUtil.getFinalFightData(fightTeamInfo, monsterfightTeamInfos); + LuaValue getOptionData = FightDataUtil.getOptionData(pveFightEvent.getAttackUid()+""); + int[] fightResult = CheckFight.getInstance().checkFight(fightSeed, fightEvent.getMostTime(), getFightData, getOptionData, fightEvent.getFightType().getFightType()); + + FightResult.Builder builder = FightResult.newBuilder(); + builder.setCheckResult(fightResult); + builder.setSeed(fightSeed); + builder.setFightTeamInfo(fightTeamInfo); + builder.setMonsterTeamList(monsterfightTeamInfos); + CommonProto.FightData fightData = CommonProto.FightData.newBuilder().setFightType(fightEvent.getFightType().getFightType().getType()).setHeroFightInfos(fightTeamInfo).addAllMonsterList(monsterfightTeamInfos).setFightSeed(fightSeed).setFightMaxTime(fightEvent.getMostTime()).build(); + builder.setFightData(fightData); + return builder.build(); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java index 548e82051..74674defb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/PlayerManager.java @@ -116,7 +116,7 @@ public class PlayerManager extends MongoBase { private String ip; - private Set situationPass = new HashSet<>(); + private Map situationPass = new HashMap<>(); public PlayerManager(){ @@ -777,11 +777,13 @@ public class PlayerManager extends MongoBase { } - public Set getSituationPass() { + + public Map getSituationPass() { return situationPass; } - public void updateSituationPass(Set dailyPass){ - this.dailyPass = dailyPass; + + public void updateSituationPass(Map situationPass){ + this.situationPass = situationPass; updateString("situationPass",situationPass); } } 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 b95e1ffd0..1a8d035e4 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 @@ -287,6 +287,42 @@ public class FightUtil { .setSpecialPassive(SpecialForTeamBuildEnum.toParm(teamId,user)) .build(); } + // + public static CommonProto.FightTeamInfo getFightTeamInfoWithSomeBuff(User user, int teamId, Map attackBloodMap,Map> buffInfo) { + user.getTeamPosManager().setCurTeamPosId(teamId); + List heroFightInfos = new ArrayList<>(); + List teamPosHeroInfos = user.getTeamPosManager().getTeamPosForHero().get(teamId); + for (TeamPosHeroInfo teamPosHeroInfo : teamPosHeroInfos) { + Hero hero = user.getHeroManager().getHero(teamPosHeroInfo.getHeroId()); + if (hero == null) { + continue; + } + Map heroAttributeMap = HeroLogic.getInstance().calHeroNotBufferAttribute(user, hero, false, teamId); + SCHero scHero = SCHero.getsCHero().get(hero.getTemplateId()); + if(buffInfo.containsKey(scHero.getPropertyName())){ + CombatLogic.getInstance().bufferOneHeroAttrAfterEat(heroAttributeMap,buffInfo.get(scHero.getPropertyName())); + } + StringBuilder skillSb = new StringBuilder(); + StringBuilder propertySb = new StringBuilder(); + String heroSkill = HeroLogic.getInstance().getHeroSkills(user,hero,skillSb).toString(); + String property = HeroLogic.getInstance().getHeroPropertyBuilder(propertySb, hero.getTemplateId(),hero.getLevel(), heroAttributeMap).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)) + .setStar(hero.getStar()) + .build(); + heroFightInfos.add(heroFightInfo); + } + return CommonProto.FightTeamInfo. + newBuilder() + .addAllFightUnitList(heroFightInfos) + .setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(user,teamId)) + .setTeamPassiveList(HeroLogic.getInstance().getPokenmonPassiveSkills(user,teamId)) + .setSpecialPassive(SpecialForTeamBuildEnum.toParm(teamId,user)) + .build(); + } /** 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 9914fd3a2..517eb41fb 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 @@ -1,6 +1,7 @@ package com.ljsd.jieling.logic.rank; import com.ljsd.jieling.db.redis.RedisKey; +import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.logic.rank.rankImpl.*; import java.util.Arrays; @@ -30,8 +31,10 @@ public enum RankEnum { DEATH_PATH_TOTAL_GUILD_RANK(18,RedisKey.DEATH_PATH_TOTAL_GUILD_RANK,DeathPathTotalGuildRank::new),//param1:工会总伤害 param2:无 param3:无 GUILD_FORCE_RANK(20,RedisKey.GUILD_FORCE_RANK,GuildForceRank::new),//param1:公会总战力 param2:无 param3:无 EXPERT_RANK(21,RedisKey.EXPERT_RANK,GoldRank::new),//param1:活动进度 param2:无 param3:无 - FORCE_CURR_RANK(22,RedisKey.FORCE_CURR_RANK,ForceCurrRank::new);//param1:人物战力 param2:无 param3:无 + FORCE_CURR_RANK(22,RedisKey.FORCE_CURR_RANK,ForceCurrRank::new),//param1:人物战力 param2:无 param3:无 + SITUATION_RANK(24,RedisKey.SITUATION_RANK,SituationRank::new),//param1:通关次数 param2:无 param3:无 + ; private int type; private String redisKey; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/SituationRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/SituationRank.java new file mode 100644 index 000000000..b3860bd53 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/SituationRank.java @@ -0,0 +1,25 @@ +package com.ljsd.jieling.logic.rank.rankImpl; + +import util.TimeUtils; + +/** + * @author lvxinran + * @date 2020/8/14 + * @discribe + */ +public class SituationRank extends AbstractRank { + + public SituationRank(int type, String redisKey) { + super(type, redisKey); + } + + @Override + public long[] getDataByScore(Double score) { + return new long[]{score.longValue()}; + } + + @Override + public double getScore(double... data) { + return data[0]+ TimeUtils.getDoubleTime(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index c8bafbaf1..dc4d807c4 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -70,7 +70,7 @@ public class MinuteTask extends Thread { ActivityLogic.getInstance().checkSecretBoxSeason(); StoreLogic.checkGlobalStore(false); MapLogic.getInstance().minuteCheckAndRemoveMapRank(); - + SituationLogic.getInstance().createCheckStatusTask(); everyZeroTask(); everyFiveTask(); everyMondyFiveClockTask(); @@ -87,7 +87,6 @@ public class MinuteTask extends Thread { BuyGoodsLogic.minuteCheckReharge(); RedisUtil.getInstence().set(RedisKey.ONLINE_NUM+RedisKey.Delimiter_colon+GameApplication.serverId, String.valueOf(OnlineUserManager.sessionMap.entrySet().size())); DeathPathLogic.getInstance().statusCheck(); - SituationLogic.getInstance().createCheckstatusTask(); GuildFightLogic.minuteCheckForCarFight(); reportUserOnline(); OnlineUserManager.checkOnline(); @@ -134,8 +133,6 @@ public class MinuteTask extends Thread { LOGGER.info("everyHourTask end ..."); } } - - //每日凌晨执行 public void everyZeroTask() throws Exception { Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); diff --git a/tablemanager/src/main/java/config/SRaceTowerConfig.java b/tablemanager/src/main/java/config/SRaceTowerConfig.java index c3653ab19..35b916133 100644 --- a/tablemanager/src/main/java/config/SRaceTowerConfig.java +++ b/tablemanager/src/main/java/config/SRaceTowerConfig.java @@ -26,7 +26,7 @@ public class SRaceTowerConfig implements BaseConfig { private int[] privilege; - private String remarks; + private int formation; @Override @@ -71,9 +71,7 @@ public class SRaceTowerConfig implements BaseConfig { return privilege; } - public String getremarks() { - return remarks; + public int getFormation() { + return formation; } - - } \ No newline at end of file