diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildLevelConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildLevelConfig.java index 4ccdb4c28..6848672cb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildLevelConfig.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildLevelConfig.java @@ -23,7 +23,7 @@ public class SGuildLevelConfig implements BaseConfig { public static Map sGuildLevelConfigMap; @Override public void init() throws Exception { - + sGuildLevelConfigMap = STableManager.getConfig(SGuildLevelConfig.class); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildScoreConfig.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildScoreConfig.java index f4aa554c7..bcc6f4ccb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildScoreConfig.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildScoreConfig.java @@ -18,10 +18,11 @@ public class SGuildScoreConfig implements BaseConfig { private int[][] starExp; - - @Override + public static Map sGuildScoreConfigMap; + + @Override public void init() throws Exception { - + sGuildScoreConfigMap = STableManager.getConfig(SGuildScoreConfig.class); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildSetting.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildSetting.java index 17cb09482..2e8b2b172 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildSetting.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SGuildSetting.java @@ -129,4 +129,24 @@ public class SGuildSetting implements BaseConfig { public int[][] getBuildingBuff() { return buildingBuff; } + + public float getDefendScore() { + return defendScore; + } + + public float getForceScore() { + return forceScore; + } + + public float getLoseScore() { + return loseScore; + } + + public float getWinScore() { + return winScore; + } + + public float getExpansionScore() { + return expansionScore; + } } \ No newline at end of file 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 253b27a47..4179140a8 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 @@ -116,17 +116,21 @@ public class RedisKey { public static final String FAMILY_ID = "FAMILY_ID"; public static final String FAMILY_FIGHT = "FAMILY_FIGHT" ; - public static final String FAMILY_ATTACK_RECORD = "FAMILY_ATTACK_RECORD"; + public static final String FAMILY_ATTACK_BLOOD = "FAMILY_ATTACK_BLOOD"; public static final String FAMILY_FIGHT_RANK = "FAMILY_FIGHT_RANK"; public static final String FAMILY_FIGHT_MATCHING_RANK ="FAMILY_FIGHT_MATCHING_RANK"; //公会战进攻获得星数排行榜 public static final String FAMILY_FIGHT_STAR_RANK = "FAMILY_FIGHT_STAR_RANK"; + //公会战击破建筑星数 + public static final String FAMILY_FIGHT_EXTRA_STAR = "FAMILY_FIGHT_EXTRA_STAR"; //公会战公会统计 public static final String FAMILY_FIGHT_CAL_STAR = "FAMILY_FIGHT_CAL_STAR"; //公会战buff缓存 public static final String FAMILY_FIGHT_BUFF = "FAMILY_FIGHT_BUFF"; //公会战进攻次数缓存 public static final String FAMILY_FIGHT_ATTACK_COUNT = "FAMILY_FIGHT_ATTACK_COUNT"; + //公会总星数 + public static final String FAMILY_FIGHT_TOTAL_STAR = "FAMILY_FIGHT_TOTAL_STAR"; //给用户发送邮件 public static final String READY_TO_USER_MAIL = "READY_TO_USER_MAIL"; //把用户踢下线 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyChangeJoinHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyChangeJoinHandler.java index c33691c90..fd5261f42 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyChangeJoinHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyChangeJoinHandler.java @@ -19,6 +19,7 @@ public class FamilyChangeJoinHandler extends BaseHandler { public void process(ISession iSession, PacketNetData netData) throws Exception { byte[] bytes = netData.parseClientProtoNetData(); Family.FamilyChangeJoinTypeRequest familyChangeJoinTypeRequest = Family.FamilyChangeJoinTypeRequest.parseFrom(bytes); - GuildLogic.changeJoinType(iSession,familyChangeJoinTypeRequest.getType()); + + GuildLogic.changeJoinType(iSession,familyChangeJoinTypeRequest.getType(),familyChangeJoinTypeRequest.getIntoLevel()); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyFightAttackBloodHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyFightAttackBloodHandler.java new file mode 100644 index 000000000..398f0be52 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/family/FamilyFightAttackBloodHandler.java @@ -0,0 +1,21 @@ +package com.ljsd.jieling.handler.family; + +import com.ljsd.jieling.handler.BaseHandler; +import com.ljsd.jieling.logic.family.GuildFightLogic; +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 FamilyFightAttackBloodHandler extends BaseHandler { + @Override + public MessageTypeProto.MessageType getMessageCode() { + return MessageTypeProto.MessageType.FAMILY_ATTACK_BLOOD_REQUEST; + } + + @Override + public void process(ISession iSession, PacketNetData netData) throws Exception { + GuildFightLogic.getAttackHeroBlood(iSession, MessageTypeProto.MessageType.FAMILY_ATTACK_BLOOD_RESPONSE); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java index 9bd83962a..d4d93c3af 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/root/GuildInfo.java @@ -39,8 +39,12 @@ public class GuildInfo extends MongoBase { private Map fightResult = new HashMap<>(); + private int continueCount;//连胜连败场数:负数为连败场次、正数为连胜场次 + private int icon; + private int intoLevel; + public GuildInfo() { setRootCollection(_COLLECTION_NAME); } @@ -128,6 +132,10 @@ public class GuildInfo extends MongoBase { public int getLevel() { return level; } + public void updateLevel(int level){ + updateString("level",level); + this.level = level; + } public int getExp() { return exp; @@ -147,9 +155,12 @@ public class GuildInfo extends MongoBase { } public void removeDefendInfo(int uid){ defendInfo.remove(uid); - removeString(getMongoKey()+".defendInfo."+uid); + removeString("defendInfo."+uid); + } + public void removeAllDefendInfo(){ + defendInfo = new HashMap<>(); + updateString("defendInfo",new HashMap<>()); } - public int getIcon() { return icon; } @@ -164,5 +175,25 @@ public class GuildInfo extends MongoBase { fightResult.put(type,value); updateString("fightResult."+type,value); } + public void updateExp(int exp){ + updateString("exp",exp); + this.exp = exp; + } + public void updateContinueCount(int count){ + updateString("continueCount",count); + this.continueCount = count; + } + public int getContinueCount() { + return continueCount; + } + + public int getIntoLevel() { + return intoLevel; + } + + public void updateIntoLevel(int intoLevel){ + this.intoLevel = intoLevel; + updateString("intoLevel",intoLevel); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildFightLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildFightLogic.java index 59372ff18..b4a5c355a 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildFightLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/family/GuildFightLogic.java @@ -1,8 +1,11 @@ package com.ljsd.jieling.logic.family; import com.google.gson.Gson; +import com.ljsd.jieling.config.SArenaSetting; import com.ljsd.jieling.config.SGuildLevelConfig; +import com.ljsd.jieling.config.SGuildScoreConfig; import com.ljsd.jieling.config.SGuildSetting; +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.handler.family.FamilyRound; @@ -28,7 +31,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.ZSetOperations; +import java.net.UnknownHostException; import java.util.*; +import java.util.stream.Collectors; public class GuildFightLogic { private static final Logger LOGGER = LoggerFactory.getLogger(GuildFightLogic.class); @@ -38,6 +43,7 @@ public class GuildFightLogic { private static int status; private static boolean startMatching; + static{ int hour = TimeUtils.getHourOfDay(); switch (hour){ @@ -61,6 +67,13 @@ public class GuildFightLogic { break; } } + public static int getStatus() { + return status; + } + + public static void setStatus(int status) { + GuildFightLogic.status = status; + } /** * 查看工会布防信息 * @@ -74,9 +87,11 @@ public class GuildFightLogic { GuildInfo guildInfo = GuilidManager.guildInfoMap.get(gid); Map defendInfo = guildInfo.getDefendInfo(); Family.FamilyDefendViewResponse.Builder response = Family.FamilyDefendViewResponse.newBuilder(); + SGuildSetting guildSetting = SGuildSetting.sGuildSetting; for (Map.Entry entry : defendInfo.entrySet()) { + int memberType = GuildLogic.getMemberType(entry.getKey(), guildInfo.getMembers()); Family.FamilyDefendInfo.Builder defend = Family.FamilyDefendInfo.newBuilder(); - defend.setStarCount(5); + defend.setStarCount(guildSetting.getStarNum()[memberType-1]); defend.setUid(entry.getKey()); defend.setBuildId(entry.getValue()); defend.setCurForce(HeroLogic.getInstance().calTeamTotalForce(UserManager.getUser(entry.getKey()), 501, false)); @@ -227,26 +242,33 @@ public class GuildFightLogic { } RedisUtil redisUtil = RedisUtil.getInstence(); String key = RedisKey.getKey(RedisKey.FAMILY_FIGHT_RANK, "", false); - Set rank = redisUtil.getZset(key, 0, redisUtil.getZsetSize(key)); SGuildSetting guildSetting = SGuildSetting.sGuildSetting; for (Integer gid : guildIds) { Map configMap = SGuildLevelConfig.sGuildLevelConfigMap; //匹配处理 GuildInfo guildInfo = GuilidManager.guildInfoMap.get(gid); - int guildTotalExp = guildInfo.getExp(); - for(int i = 1 ; i > entry:guildInfo.getMembers().entrySet()){ + for(Integer uid:entry.getValue()){ + int maxForce = UserManager.getUser(uid).getPlayerInfoManager().getMaxForce(); + totalForce+=maxForce; + } } + if (guildInfo.getDefendInfo() != null && guildInfo.getDefendInfo().size() > 0) { + int loseWinScore = guildInfo.getContinueCount(); + if(guildInfo.getContinueCount()<0){ + loseWinScore *= guildSetting.getLoseScore(); + }else{ + loseWinScore *= guildSetting.getWinScore(); + } + float guildTotalScore =totalForce*guildSetting.getForceScore()+guildInfo.getDefendInfo().size()*guildSetting.getDefendScore()+loseWinScore; String matchingKey = RedisKey.getKey(RedisKey.FAMILY_FIGHT_MATCHING_RANK, "", false); int random = MathUtils.randomInt(30); - if (!rank.contains(gid.toString())) { - redisUtil.zsetAddOne(key, gid.toString(), guildTotalExp); - redisUtil.zsetAddOne(matchingKey, gid.toString(), guildTotalExp + random); - } else { - Double zSetScore = redisUtil.getZSetScore(RedisKey.FAMILY_FIGHT_RANK, "", gid.toString()); - redisUtil.zsetAddOne(matchingKey, gid.toString(), zSetScore + random); - } + redisUtil.zsetAddOne(key, gid.toString(), guildTotalScore); + Double zSetScore = redisUtil.getZSetScore(RedisKey.FAMILY_FIGHT_RANK, "", gid.toString()); + redisUtil.zsetAddOne(matchingKey, gid.toString(), zSetScore + random); + } Map defendInfo = guildInfo.getDefendInfo(); if (defendInfo == null || defendInfo.size() < 1) { @@ -263,6 +285,7 @@ public class GuildFightLogic { int[] resultBuff= MathUtils.randomFromWeightWithTaking(randomBuff,buff[0]); redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT_BUFF,gid.toString(),String.valueOf(i+1),resultBuff); } + int familyTotalStar = 0; //血量记录处理,星级记录处理 for (Map.Entry entry : defendInfo.entrySet()) { User user = UserManager.getUser(entry.getKey()); @@ -290,7 +313,13 @@ public class GuildFightLogic { fightInfo.setBuildId(entry.getValue()); fightInfo.setStarCount(guildSetting.getStarNum()[memberType-1]); redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT, String.valueOf(guildInfo.getId()), String.valueOf(entry.getKey()), fightInfo); + familyTotalStar+=fightInfo.getStarCount(); } + for(Integer star:guildSetting.getStarNum()){ + familyTotalStar+=star; + } + redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT_TOTAL_STAR,"",String.valueOf(gid),familyTotalStar); + } for (Integer gid : guildIds) { GuildInfo guildInfo = GuilidManager.guildInfoMap.get(gid); @@ -314,6 +343,9 @@ public class GuildFightLogic { private static int getEnemyFamily(int myFamilyId) { RedisUtil redisUtil = RedisUtil.getInstence(); Long matchingRank = redisUtil.getZSetreverseRank(RedisKey.FAMILY_FIGHT_MATCHING_RANK, "", String.valueOf(myFamilyId)); + if(matchingRank==-1){ + return -1; + } int enmeyFamilyId; long rank; if (matchingRank % 2 == 1) { @@ -350,7 +382,6 @@ public class GuildFightLogic { int defendBuildId = GuilidManager.guildInfoMap.get(defendGuildId).getDefendInfo().get(defendUid); FamilyFightInfo defendInfo = redisUtil.getMapEntry(RedisKey.FAMILY_FIGHT, String.valueOf(defendGuildId), String.valueOf(userDefend.getId()), FamilyFightInfo.class); Map heroAttribute = defendInfo.getHeroAttribute(); - int seed = (int) (System.currentTimeMillis() / 1000); List heroDefendFightInfos = new ArrayList<>(); for (Map.Entry entry : heroAttribute.entrySet()) { Hero hero = userDefend.getHeroManager().getHero(entry.getKey()); @@ -374,10 +405,51 @@ public class GuildFightLogic { .addAllFightUnitList(heroDefendFightInfos) .setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(userDefend, 1)) .build(); - CommonProto.FightTeamInfo fightAttackTeamInfo = BehaviorUtil.getFightTeamInfo(userAttack, 502, true); + //攻击者血量处理 + CommonProto.FightTeamInfo fightAttackTeamInfo = null; + List heroAttackFightInfos = new ArrayList<>(); + Map attackBloodMap = redisUtil.getMapValues(RedisKey.FAMILY_ATTACK_BLOOD, String.valueOf(userAttack.getId()), String.class, String.class); + List teamAttack = userAttack.getTeamPosManager().getTeamPosForHero().get(502); + if(attackBloodMap!=null&&attackBloodMap.size()>0){ + for(TeamPosHeroInfo teamHero: teamAttack){ + for(Map.Entry blood:attackBloodMap.entrySet()){ + if(teamHero.getHeroId().equals(blood.getKey())){ + Hero hero = userAttack.getHeroManager().getHero(teamHero.getHeroId()); + if (hero == null) { + continue; + } + StringBuilder skillSb = new StringBuilder(); + StringBuilder propertySb = new StringBuilder(); + String heroSkill = HeroLogic.getInstance().getHeroSkills(userDefend, hero, skillSb).toString(); + Map heroAttributeMap = HeroLogic.getInstance().calHeroNotBufferAttribute(userAttack, hero, false, 502); + heroAttributeMap.put(HeroAttributeEnum.CurHP.getPropertyId(),heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId())-Integer.parseInt(blood.getValue())*heroAttributeMap.get(HeroAttributeEnum.Hp.getPropertyId())/100); + String property = HeroLogic.getInstance().getHeroPropertyBuilder(propertySb, hero, 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)) + .build(); + heroAttackFightInfos.add(heroFightInfo); + } + } + } + CommonProto.FightTeamInfo.Builder fightAttackTeamInfoBuilder = CommonProto.FightTeamInfo.newBuilder().addAllFightUnitList(heroAttackFightInfos) + .setTeamSkillList(HeroLogic.getInstance().getPokenmonSkills(userAttack, 1)); + fightAttackTeamInfo = fightAttackTeamInfoBuilder.build(); + }else{ + fightAttackTeamInfo = BehaviorUtil.getFightTeamInfo(userAttack,502,true); + } + LuaValue getFightData = FightDataUtil.getFinalPlayerFightData(fightAttackTeamInfo, fightDefendTeamInfo); LuaValue getOptionData = FightDataUtil.getOptionData(""); - + int seed = (int) (System.currentTimeMillis() / 1000); + CommonProto.FightData fightData = CommonProto.FightData.newBuilder() + .setFightMaxTime(SArenaSetting.getSArenaSetting().getMostTime()) + .setFightSeed(seed) + .setHeroFightInfos(fightAttackTeamInfo) + .addMonsterList(fightDefendTeamInfo) + .build(); int[] fightResult = CheckFight.getInstance().checkFight(seed, 1000, getFightData, getOptionData); for (int i = 0; i < fightResult.length; i++) { System.out.println(fightResult[i]); @@ -404,21 +476,33 @@ public class GuildFightLogic { //获得星数 int getStar; if (fightResult[0] == 1) { - //发送indication - Family.DefeatResponse response = Family.DefeatResponse.newBuilder().setUid(defendUid).build(); - GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(userDefend.getPlayerInfoManager().getGuildId()), MessageTypeProto.MessageType.FAMILY_DEFEATE_INDICATION,response); - GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(userAttack.getPlayerInfoManager().getGuildId()), MessageTypeProto.MessageType.FAMILY_DEFEATE_INDICATION,response); + getStar = defendInfo.getStarCount(); defendInfo.setStarCount(0); + int indexAttack =2; + for(TeamPosHeroInfo attack:teamAttack){ + Hero hero = userAttack.getHeroManager().getHeroMap().get(attack.getHeroId()); + Map integerIntegerMap = HeroLogic.getInstance().calHeroNotBufferAttribute(userAttack, hero, false, 502); + int bloodLess = ((integerIntegerMap.get(HeroAttributeEnum.Hp.getPropertyId())-fightResult[indexAttack])) *100/ integerIntegerMap.get(HeroAttributeEnum.Hp.getPropertyId()); + redisUtil.putMapEntry(RedisKey.FAMILY_ATTACK_BLOOD,String.valueOf(userAttack.getId()),attack.getHeroId(),bloodLess); + indexAttack++; + } }else{ int memberType = GuildLogic.getMemberType(defendUid, GuilidManager.guildInfoMap.get(defendGuildId).getMembers()); - int maxStar = SGuildSetting.sGuildSetting.getStarNum()[memberType]; + int maxStar = SGuildSetting.sGuildSetting.getStarNum()[memberType-1]; int lessStar = maxStar - dieCount*maxStar/5; //倍数k(maxStar/5) getStar = defendInfo.getStarCount()-lessStar; defendInfo.setStarCount(lessStar); + for(TeamPosHeroInfo attack:teamAttack){ + redisUtil.putMapEntry(RedisKey.FAMILY_ATTACK_BLOOD,String.valueOf(userAttack.getId()),attack.getHeroId(),100); + } } redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT, String.valueOf(defendGuildId), String.valueOf(userDefend.getId()), defendInfo); + //发送indication + Family.DefeatResponse fightResponse = Family.DefeatResponse.newBuilder().setUid(defendUid).setTeamLostStar(getStar).build(); + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(userDefend.getPlayerInfoManager().getGuildId()), MessageTypeProto.MessageType.FAMILY_DEFEATE_INDICATION,fightResponse); + GuildLogic.sendIndicationToMember(GuilidManager.guildInfoMap.get(userAttack.getPlayerInfoManager().getGuildId()), MessageTypeProto.MessageType.FAMILY_DEFEATE_INDICATION,fightResponse); //获得星数处理 int attackGuildId = userAttack.getPlayerInfoManager().getGuildId(); String attackRankKey = RedisKey.getKey(RedisKey.FAMILY_FIGHT_STAR_RANK, String.valueOf(attackGuildId), false); @@ -433,7 +517,7 @@ public class GuildFightLogic { haveGotStar = 0; } redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT_CAL_STAR,String.valueOf(attackGuildId),String.valueOf(defendBuildId),haveGotStar+getStar); - Family.FamilyFightAttackResponse response = Family.FamilyFightAttackResponse.newBuilder().setResult(fightResult[0]).setStarCount(getStar).build(); + Family.FamilyFightAttackResponse response = Family.FamilyFightAttackResponse.newBuilder().setResult(fightResult[0]).setStarCount(getStar).setData(fightData).build(); MessageUtil.sendMessage(session, 1, messageType.getNumber(), response, true); } @@ -518,14 +602,14 @@ public class GuildFightLogic { LOGGER.info("阶段变为进攻"); } else if (status == 3 && hour == FamilyRound.FAMILY_FIGHT_ATTACK_END) { + accountFamilyFightResult(); + MongoUtil.getLjsdMongoTemplate().lastUpdate(); status = 4; LOGGER.info("阶段变为结算"); - } else if (status == 4 && hour == FamilyRound.FAMILY_FIGHT_END) { - status = 0; LOGGER.info("阶段变为等待"); - } else if (hour > FamilyRound.FAMILY_FIGHT_END || hour < FamilyRound.FAMILY_FIGHT_START) { + } else if (hour >= FamilyRound.FAMILY_FIGHT_END || hour < FamilyRound.FAMILY_FIGHT_START) { status = 0; removeMatchingInfo(); startMatching = true; @@ -542,7 +626,8 @@ public class GuildFightLogic { String matchingKey = RedisKey.getKey(RedisKey.FAMILY_FIGHT_MATCHING_RANK,"",false); //攻击次数信息 String attackCountKey = RedisKey.getKey(RedisKey.FAMILY_FIGHT_ATTACK_COUNT, "", false); - + //额外星数信息 + String extraStar = RedisKey.getKey(RedisKey.FAMILY_FIGHT_EXTRA_STAR,"",false); Set matchingRank = redisUtil.getZset(matchingKey, 0, redisUtil.getZsetSize(matchingKey)); for(String index:matchingRank){ Map fightDefend = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT, index, Integer.class, FamilyFightInfo.class); @@ -563,8 +648,24 @@ public class GuildFightLogic { //删除buff信息 redisUtil.removeMapEntrys(RedisKey.FAMILY_FIGHT_BUFF,index,String.valueOf(i)); } + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(index)); + //删除进攻血量信息 + for(Map.Entry> entry:guildInfo.getMembers().entrySet()){ + for(Integer attackId:entry.getValue()){ + String key = RedisKey.getKey(RedisKey.FAMILY_ATTACK_BLOOD, String.valueOf(attackId), false); + if(redisUtil.hasKey(key)){ + redisUtil.del(key); + } + } + } + + + //清除额外星数信息 +// redisUtil.removeMapEntrys(RedisKey.FAMILY_FIGHT_EXTRA_STAR,""); + //清除布防信息 +// GuilidManager.guildInfoMap.get(index).removeAllDefendInfo(); } - redisUtil.del(matchingKey,attackCountKey); + redisUtil.del(matchingKey,attackCountKey,extraStar); // 删除匹配信息 // redisUtil.removeZSetRangeByRank(matchingKey,0,redisUtil.getZsetSize(matchingKey)); @@ -572,13 +673,99 @@ public class GuildFightLogic { /** * 公会战结算(Redis中数据同到mongo) */ - public void accountFamilyFightResult() { + public static void accountFamilyFightResult() throws Exception { RedisUtil redisUtil = RedisUtil.getInstence(); String key = RedisKey.getKey(RedisKey.FAMILY_FIGHT_MATCHING_RANK,"",false); - int size = redisUtil.getZsetSize(key); - - - } + Set matchingRank = redisUtil.getZset(key, 0, redisUtil.getZsetSize(key)); + int[] buildingStar = SGuildSetting.sGuildSetting.getBuildingStar(); + for(String str:matchingRank){ + int[] buildStar = new int[3]; + int enemyFamily = getEnemyFamily(Integer.parseInt(str)); + if(enemyFamily==-1){ + continue; + } + LOGGER.info("{}公会结算",str); + Map enemyDefendInfo = GuilidManager.guildInfoMap.get(enemyFamily).getDefendInfo(); + for(Map.Entry defend:enemyDefendInfo.entrySet()){ + FamilyFightInfo mapEntry = redisUtil.getMapEntry(RedisKey.FAMILY_FIGHT, String.valueOf(enemyFamily), String.valueOf(defend.getKey()), FamilyFightInfo.class); + if(mapEntry!=null){ + buildStar[defend.getValue()-1] = buildStar[defend.getValue()-1]+mapEntry.getStarCount(); + } + } + for(int i = 0 ; i < buildStar.length;i++){ + if(buildStar[i]==0){ + buildStar[i] = buildingStar[i]; + LOGGER.info("结算额外星数{}",buildStar[i]); + continue; + }else{ + buildStar[i] = 0; + LOGGER.info("结算额外星数{}",buildStar[i]); + continue; + } + } + redisUtil.putMapEntry(RedisKey.FAMILY_FIGHT_EXTRA_STAR,"",str,buildStar); + } + Map levelConfigMap = SGuildLevelConfig.sGuildLevelConfigMap; + Map sGuildScoreConfigMap = SGuildScoreConfig.sGuildScoreConfigMap; + Map totalStarMap = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT_TOTAL_STAR, "", String.class, Integer.class); + for(String str:matchingRank) { + int enemyFamily = getEnemyFamily(Integer.parseInt(str)); + if(enemyFamily==-1){ + continue; + } + int getStar = getTotalStar(Integer.parseInt(str)); + int loseStar = getTotalStar(enemyFamily); + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(str)); + LOGGER.info("公会{}获得星数:{},失去星数{}",str,getStar,loseStar); + //战绩结算 + int getExp = 0; + Double rank = redisUtil.getZSetScore(RedisKey.FAMILY_FIGHT_RANK, "", str); + for(Map.Entry entry:sGuildScoreConfigMap.entrySet()){ + if(rankentry.getValue().getScoreMax()){ + continue; + } + int[] resultExp = entry.getValue().getResultExp(); + //胜负判断 + if(getStar>loseStar){ + getExp+=resultExp[0]; + guildInfo.updateResult(1,guildInfo.getResult(1)+1); + if(guildInfo.getContinueCount()<0){ + guildInfo.updateContinueCount(1); + }else{ + guildInfo.updateContinueCount(guildInfo.getContinueCount()+1); + } + }else if(getStar ==loseStar){ + getExp+=resultExp[1]; + guildInfo.updateResult(2,guildInfo.getResult(2)+1); + guildInfo.updateContinueCount(0); + }else{ + getExp+=resultExp[2]; + guildInfo.updateResult(3,guildInfo.getResult(3)+1); + if(guildInfo.getContinueCount()<0){ + guildInfo.updateContinueCount(guildInfo.getContinueCount()-1); + }else{ + guildInfo.updateContinueCount(-1); + } + } + //星数判断 + for(int i = 0 ;ientry.getValue().getStarExp()[i][0]){ + getExp+=entry.getValue().getStarExp()[i][0]; + }else{ + break; + } + } + break; + } + if(guildInfo.getExp()+getExp>=levelConfigMap.get(guildInfo.getLevel()).getExp()){ + guildInfo.updateExp(guildInfo.getExp()+getExp-levelConfigMap.get(guildInfo.getLevel()).getExp()); + guildInfo.updateLevel(guildInfo.getLevel()+getExp); + }else{ + guildInfo.updateExp(guildInfo.getExp()+getExp); + } + } + MongoUtil.getLjsdMongoTemplate().lastUpdate(); + } /** * 查询该公会个人战绩 @@ -601,7 +788,7 @@ public class GuildFightLogic { PlayerManager playerInfoManager = UserManager.getUser(uid).getPlayerInfoManager(); Family.PersonalFightResult.Builder fightResult = Family.PersonalFightResult.newBuilder() .setRank(rank) - .setAttackCount(2) + .setAttackCount(RedisUtil.getInstence().getMapEntry(RedisKey.FAMILY_FIGHT_ATTACK_COUNT,"",String.valueOf(uid),Integer.class)) .setUid(uid) .setHead(1) .setHeadFrame(playerInfoManager.getHeadFrame()) @@ -618,20 +805,88 @@ public class GuildFightLogic { * 工会总战绩 */ public static void guildFightResult(ISession session,MessageTypeProto.MessageType messageType) throws Exception { + RedisUtil redisUtil = RedisUtil.getInstence(); int guildId=UserManager.getUser(session.getUid()).getPlayerInfoManager().getGuildId(); int enemyFamily = getEnemyFamily(guildId); Family.GuildFightResultResponse.Builder response = Family.GuildFightResultResponse.newBuilder(); - response.setGetExp(10); + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + if(enemyFamily==-1){ + MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); + return; + } + int winStar = getTotalStar(guildId); + int defeatStar = getTotalStar(enemyFamily); + if(winStar mapValues = RedisUtil.getInstence().getMapValues(RedisKey.FAMILY_FIGHT_CAL_STAR, String.valueOf(guildId), Integer.class, Integer.class); + Map mapValues = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT_CAL_STAR, String.valueOf(guildId), Integer.class, Integer.class); //失去星星 - Map mapEnemyValues = RedisUtil.getInstence().getMapValues(RedisKey.FAMILY_FIGHT_CAL_STAR, String.valueOf(enemyFamily), Integer.class, Integer.class); + Map mapEnemyValues = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT_CAL_STAR, String.valueOf(enemyFamily), Integer.class, Integer.class); response.addStar(mapValues.get(1)==null?0:mapValues.get(1)); response.addStar(mapValues.get(2)==null?0:mapValues.get(2)); response.addStar(mapValues.get(3)==null?0:mapValues.get(3)); - response.addStar(mapEnemyValues.get(1)==null?0:mapValues.get(1)); - response.addStar(mapEnemyValues.get(2)==null?0:mapValues.get(2)); - response.addStar(mapEnemyValues.get(3)==null?0:mapValues.get(3)); + response.addStar(mapEnemyValues.get(1)==null?0:mapEnemyValues.get(1)); + response.addStar(mapEnemyValues.get(2)==null?0:mapEnemyValues.get(2)); + response.addStar(mapEnemyValues.get(3)==null?0:mapEnemyValues.get(3)); + + + int[] buildStar = new int[6]; + int[] getStar= redisUtil.getMapEntry(RedisKey.FAMILY_FIGHT_EXTRA_STAR, "", String.valueOf(guildId), int[].class); + int[] loseStar = redisUtil.getMapEntry(RedisKey.FAMILY_FIGHT_EXTRA_STAR, "", String.valueOf(enemyFamily), int[].class); + for(int i = 0 ; i list = Arrays.stream(buildStar).boxed().collect(Collectors.toList()); + response.addAllExtraStar(list); MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); } + + /** + * 获取攻击者血量 + * + */ + public static void getAttackHeroBlood(ISession session, MessageTypeProto.MessageType messageType){ + Family.GetAttackHeroBloodResponse.Builder response = Family.GetAttackHeroBloodResponse.newBuilder(); + Map bloodValues = RedisUtil.getInstence().getMapValues(RedisKey.FAMILY_ATTACK_BLOOD, String.valueOf(session.getUid()), String.class, String.class); + if(bloodValues!=null&&bloodValues.size()>0){ + for(Map.Entry blood:bloodValues.entrySet()){ + CommonProto.HeroBloodInfo heroBloodInfo = CommonProto.HeroBloodInfo.newBuilder().setHeroId(blood.getKey()).setLostBlood(Integer.parseInt(blood.getValue())).build(); + response.addBlood(heroBloodInfo); + } + } + MessageUtil.sendMessage(session,1,messageType.getNumber(),response.build(),true); + } + + private static int getTotalStar(int gid){ + RedisUtil redisUtil = RedisUtil.getInstence(); + int totalStar = 0; + Map extraStar = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT_EXTRA_STAR, "", Integer.class, int[].class); + Map getStar = redisUtil.getMapValues(RedisKey.FAMILY_FIGHT_CAL_STAR, String.valueOf(gid), Integer.class, Integer.class); + for(Map.Entry entry:getStar.entrySet()){ + totalStar+= entry.getValue(); + } + int[] buildExtra = extraStar.get(gid); + for(int i = 0 ;i 3){ MessageUtil.sendErrorResponse(session,0,msgId,"参数错误"); @@ -595,6 +605,7 @@ public class GuildLogic { MessageUtil.sendErrorResponse(session,0,msgId,"无权操作"); return; } + guildInfo.updateIntoLevel(joinLevel); guildInfo.setJoinType(joinType); sendFamilyBaseUpdateIndication(guildInfo); MessageUtil.sendMessage(session,1,msgId,null,true); @@ -665,6 +676,9 @@ public class GuildLogic { MessageUtil.sendErrorResponse(session,0,msgId,"会长不能退出公会"); return; } + if(guildInfo.getDefendInfo().containsKey((uid))){ + guildInfo.removeDefendInfo(uid); + } guildInfo.removeMember(uidType,uid); user.getPlayerInfoManager().setGuildId(0); user.getGuildMyInfo().clearOfLevelGuild(); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java index 5309e3e0c..b032af1a4 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/CBean2Proto.java @@ -359,6 +359,7 @@ public class CBean2Proto { .setTotalNum(guildInfo.getTotalMembers()) .setIcon(guildInfo.getIcon()) .setFightResult(familyContribute) + .setPlayerIntoLevel(guildInfo.getIntoLevel()) .build(); }