diff --git a/fightmanager/src/main/java/com/ljsd/fight/LingMaiSecretArea.java b/fightmanager/src/main/java/com/ljsd/fight/LingMaiSecretArea.java index 4d1175af3..53b2a19aa 100644 --- a/fightmanager/src/main/java/com/ljsd/fight/LingMaiSecretArea.java +++ b/fightmanager/src/main/java/com/ljsd/fight/LingMaiSecretArea.java @@ -4,7 +4,7 @@ public class LingMaiSecretArea { private int id; private int uid; private String serverName; - private int occupyTime;//占领的时长 以分钟为单位 + private int occupyTime; // 下面这四个参数用不到了 @Deprecated diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossLingmaiSecretAreaBattleHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossLingmaiSecretAreaBattleHandler.java index 12bc5962d..9a23f89e1 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossLingmaiSecretAreaBattleHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/crossServer/CrossLingmaiSecretAreaBattleHandler.java @@ -27,6 +27,9 @@ import com.ljsd.jieling.logic.fight.PVEFightEvent; import com.ljsd.jieling.logic.fight.result.FightResult; import com.ljsd.jieling.logic.hero.HeroLogic; 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.util.MessageUtil; import config.SArenaSetting; @@ -51,6 +54,7 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler 10 ? 10 : ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60); + int minute = ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60); + int second =((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) % 60) >60 ? + 60 : ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) % 60); + myLingmai.setScore1(myLingmai.getScore1() + minute*config.getRewardList()[0][1]+(second*config.getRewardList()[0][1]/60)); + //myLingmai.setGetAwardTimeOrOccupyTime(TimeUtils.nowInt()); + LOGGER.info("uid:"+uid+"first occupy myLingmaiId: "+myLingmaiId+" minute:"+minute+"second:"+second); + score = myLingmai.getScore1() + config.getRewardList()[0][1] * myLingmai.getOccupyTime()/60; + rank = RankContext.getRankEnum(RankEnum.CROSS_LINGMAI_RANK_PERSON.getType()); + rank.addRank(user.getId(), String.valueOf(crossGroup) + RedisKey.Delimiter_colon + group, score); //清除已有灵脉数据 RedisUtil.getInstence().old_removemapentry(key, groupKey, String.valueOf(myLingmaiId)); } @@ -131,7 +147,18 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler0){ + lingMaiSecretArea.setScore1((int) disappearScore); + } + } RedisUtil.getInstence().old_putmap(key, groupKey, String.valueOf(id), lingMaiSecretArea); } res.setResult(fightResult.getResult()); @@ -168,24 +195,50 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler 10 ? 10 : ((TimeUtils.nowInt() - (int)oldOwner.getGetAwardTimeOrOccupyTime()) / 60); + int minute = ((TimeUtils.nowInt() - (int)oldOwner.getGetAwardTimeOrOccupyTime()) / 60); + int second =((TimeUtils.nowInt() - (int)oldOwner.getGetAwardTimeOrOccupyTime()) % 60) >60 ? + 60 : ((TimeUtils.nowInt() - (int)oldOwner.getGetAwardTimeOrOccupyTime()) % 60); + long tempScore = second*config.getRewardList()[0][1]/60; + LOGGER.info("uid:"+uid+"pvp other occupy id:"+id+" minute:"+minute+"second:"+second); + //oldOwner.setScore1(oldOwner.getScore1()+minute*config.getRewardList()[0][1]+(int)tempScore); + int score1 =oldOwner.getScore1()+minute*config.getRewardList()[0][1]+(int)tempScore; + long scoreOld = score1 + config.getRewardList()[0][1]*(long)oldOwner.getOccupyTime()/60; + rank.addRank(defUid, String.valueOf(crossGroup) + RedisKey.Delimiter_colon + group, scoreOld); + LingMaiSecretArea myLingmai =null; if (myLingmaiId != 0) { //本人已有灵脉结算 - LingMaiSecretArea myLingmai = lingMaiMap.get(String.valueOf(myLingmaiId)); - CrossLingmaiLogic.getInstance().sendNormalMail(uid,myLingmai); + myLingmai = lingMaiMap.get(String.valueOf(myLingmaiId));//上一个占领者 + config = SLodeConfig.lodeConfig.get(myLingmaiId); + //minute = ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60) > 10 ? 10 : ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60); + minute = ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60); + second =((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) % 60) >60 ? + 60 : ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) % 60); + LOGGER.info("uid:"+uid+"pvp owner occupy id:"+myLingmaiId+" minute:"+minute+"second:"+second); + tempScore =(second*config.getRewardList()[0][1]/60); + score1 = myLingmai.getScore1()+minute*config.getRewardList()[0][1]+(int)tempScore; + //long newScore = score1+ + //myLingmai.setScore1(myLingmai.getScore1()+minute*config.getRewardList()[0][1]+(int)tempScore); + myLingmai.setGetAwardTimeOrOccupyTime(TimeUtils.nowInt()); + //我的 + long score = score1 + config.getRewardList()[0][1] * (long)myLingmai.getOccupyTime()/60; + rank = RankContext.getRankEnum(RankEnum.CROSS_LINGMAI_RANK_PERSON.getType()); + rank.addRank(user.getId(), String.valueOf(crossGroup) + RedisKey.Delimiter_colon + group, score); + myLingmai.setScore1((int)score); //清除已有灵脉数据 RedisUtil.getInstence().old_removemapentry(key, groupKey, String.valueOf(myLingmai.getId())); } + //易主 + LingMaiSecretArea lingMaiSecretArea = CrossLingmaiLogic.getLingaMaiData(id, uid,crossGroup,group); + if(myLingmai!=null){ + lingMaiSecretArea.setScore1(myLingmai.getScore1()); + } + RedisUtil.getInstence().old_putmap(key, groupKey, String.valueOf(id), lingMaiSecretArea); // 给失败者发邮件 LingMaiSecretArea nowLingMai = lingMaiMap.get(String.valueOf(id)); - CrossLingmaiLogic.getInstance().sendBeAckMail(nowLingMai.getUid(),nowLingMai,uid); - //清除已有灵脉数据 - RedisUtil.getInstence().old_removemapentry(key, groupKey, String.valueOf(nowLingMai.getId())); - - // 更新灵脉信息 - nowLingMai.setUid(uid); - nowLingMai.setServerName(serverName); - nowLingMai.setOccupyTime(nowInt); - RedisUtil.getInstence().old_putmap(key, groupKey, String.valueOf(id), nowLingMai); + CrossLingmaiLogic.getInstance().sendBeAckMail(defUid,nowLingMai,user.getPlayerInfoManager().getNickName()); //挑战者记录 String key1 = RedisKey.getKey(RedisKey.CROSS_LINGMAISECRET_RECORD, String.valueOf(user.getId())); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/CrossLingmaiLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/CrossLingmaiLogic.java index 0ca719ac5..b1e4c9d94 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/CrossLingmaiLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/arena/CrossLingmaiLogic.java @@ -102,17 +102,17 @@ public class CrossLingmaiLogic { String groupKey = crossGroup + RedisKey.Delimiter_colon + group; int second = SSpecialConfig.getIntegerValue(SSpecialConfig.lingmai_basic_configuration); Map mapValues = RedisUtil.getInstence().old_getmapvalue_toclass(key, groupKey, String.class, LingMaiSecretArea.class); - Iterator> iterator = mapValues.entrySet().iterator(); - while (iterator.hasNext()){ - Map.Entry next = iterator.next(); - LingMaiSecretArea lingMaiSecretArea = next.getValue(); - int time = nowInt - lingMaiSecretArea.getOccupyTime(); - if (time > second){ - iterator.remove(); - sendNormalMail(lingMaiSecretArea.getUid(),lingMaiSecretArea); - RedisUtil.getInstence().old_removemapentry(key, groupKey, String.valueOf(lingMaiSecretArea.getId())); - } - } +// Iterator> iterator = mapValues.entrySet().iterator(); +// while (iterator.hasNext()){ +// Map.Entry next = iterator.next(); +// LingMaiSecretArea lingMaiSecretArea = next.getValue(); +// int time = nowInt - lingMaiSecretArea.getOccupyTime(); +// if (time > second){ +// iterator.remove(); +// sendNormalMail(lingMaiSecretArea.getUid(),lingMaiSecretArea); +// RedisUtil.getInstence().old_removemapentry(key, groupKey, String.valueOf(lingMaiSecretArea.getId())); +// } +// } return mapValues; } @@ -129,15 +129,11 @@ public class CrossLingmaiLogic { LOGGER.info("灵脉发送正常结束邮件:{}",uid); } - public void sendBeAckMail(int uid, LingMaiSecretArea myLingmai, int ackId){ + public void sendBeAckMail(int uid, LingMaiSecretArea myLingmai, String atkName){ int nowInt = TimeUtils.nowInt(); - SLodeConfig sLodeConfig = SLodeConfig.lodeConfig.get(myLingmai.getId()); - int time = (nowInt - myLingmai.getOccupyTime()) / 60; - int minute = SSpecialConfig.getIntegerValue(SSpecialConfig.lingmai_basic_configuration)/60; - int minTime = Math.min(time, minute); String title = SErrorCodeEerverConfig.getI18NMessage("LingmaikaicaiReward1_mail_title"); - String content = SErrorCodeEerverConfig.getI18NMessage("LingmaikaicaiReward1_mail_txt", new Object[]{ackId,minTime}); - String reward = CrossLingmaiLogic.getInstance().getReward(minTime, sLodeConfig.getRewardList()); + String content = SErrorCodeEerverConfig.getI18NMessage("LingmaikaicaiReward1_mail_txt", new Object[]{atkName}); + String reward = ""; MailLogic.getInstance().sendMailToRedis(uid,title,content,reward,nowInt,Global.MAIL_EFFECTIVE_TIME); LOGGER.info("灵脉发送被占领结束邮件:{}",uid); } @@ -160,9 +156,9 @@ public class CrossLingmaiLogic { // 清理组别1 String groupKey1 = crossGroup + RedisKey.Delimiter_colon + 1; Map mapValues = redisUtil.old_getmapvalue_toclass(key, groupKey1, String.class, LingMaiSecretArea.class); - for (LingMaiSecretArea value : mapValues.values()) { - sendNormalMail(value.getUid(),value); - } +// for (LingMaiSecretArea value : mapValues.values()) { +// sendNormalMail(value.getUid(),value); +// } String key1 = redisUtil.getKeyLocal(key, groupKey1); redisUtil.del(key1); LOGGER.info("灵脉初始化,key:{}, 长度:{}",key1,mapValues.size()); @@ -171,9 +167,9 @@ public class CrossLingmaiLogic { // 清理组别2 String groupKey2 = crossGroup + RedisKey.Delimiter_colon + 2; Map mapValue2 = redisUtil.old_getmapvalue_toclass(key, groupKey1, String.class, LingMaiSecretArea.class); - for (LingMaiSecretArea value : mapValue2.values()) { - sendNormalMail(value.getUid(),value); - } +// for (LingMaiSecretArea value : mapValue2.values()) { +// sendNormalMail(value.getUid(),value); +// } String key2 = redisUtil.getKeyLocal(key, groupKey2); redisUtil.del(key2); LOGGER.info("灵脉初始化,key:{}, 长度:{}",key2,mapValue2.size()); @@ -210,6 +206,14 @@ public class CrossLingmaiLogic { if (crossGroup == -1) { return; } + //获取开服分布式锁,保证只有一个组计算 + String lockKey = "SERVER_LINGMAI_UPDATE_LOCK" + RedisKey.Delimiter_colon + crossGroup; + boolean lock = RedisUtil.getInstence().lock(lockKey, TimeUtils.ONE_SECOND * 60); + if (!lock) { + //没有拿到锁直接返回 + LOGGER.info("跨服灵脉,灵脉积分定时更新, key:{} 跨服分组 ={},未获取到锁",lockKey, crossGroup); + return; + } Map lingMaiMap1 = RedisUtil.getInstence().old_getmapvalue_toclass(RedisKey.CROSS_LINGMAISECRET_INFO, crossGroup + RedisKey.Delimiter_colon + 1, String.class, LingMaiSecretArea.class); Map lingMaiMap2 = RedisUtil.getInstence().old_getmapvalue_toclass(RedisKey.CROSS_LINGMAISECRET_INFO, crossGroup + RedisKey.Delimiter_colon + 2, String.class, LingMaiSecretArea.class); updateLingmaiData(lingMaiMap1, crossGroup, 1); @@ -222,28 +226,24 @@ public class CrossLingmaiLogic { String groupkey = crossGroup + RedisKey.Delimiter_colon + group; for (Map.Entry map : lingMaiMap.entrySet()) { try { - User user = UserManager.getUser(map.getValue().getUid()); - if (user != null) { - SLodeConfig config = SLodeConfig.lodeConfig.get(map.getValue().getId()); - if (config != null) { - int occupyTime = (int) map.getValue().getGetAwardTimeOrOccupyTime(); - //分钟 - int minute = (nowTime - occupyTime) / 60; - //秒 - int second = Math.min((nowTime - occupyTime) % 60, 60); - //difVal =1 ; - LOGGER.error("玩家" + map.getValue().getUid() + "原有秒:"+map.getValue().getOccupyTime()+" 获得秒:" + (minute*60+second)); - map.getValue().setOccupyTime(map.getValue().getOccupyTime() + minute*60+second); - map.getValue().setGetAwardTimeOrOccupyTime(nowTime); - - RedisUtil.getInstence().old_putmap(RedisKey.CROSS_LINGMAISECRET_INFO, groupkey, map.getKey(), map.getValue()); - AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_LINGMAI_RANK_PERSON.getType()); - LOGGER.error("minute:"+map.getValue().getOccupyTime()+" per:"+(config.getRewardList()[0][1]/60)); - long score = (long)map.getValue().getOccupyTime() * config.getRewardList()[0][1]/60 + map.getValue().getScore1(); - double test = rank.getScoreById(user.getId(), groupkey); - LOGGER.error("之前是:" + test + "之后是:" + score); - rank.addRank(user.getId(), groupkey, score); - } + SLodeConfig config = SLodeConfig.lodeConfig.get(map.getValue().getId()); + if (config != null) { + int occupyTime = (int) map.getValue().getGetAwardTimeOrOccupyTime(); + //分钟 + int minute = (nowTime - occupyTime) / 60; + //秒 + int second = Math.min((nowTime - occupyTime) % 60, 60); + //difVal =1 ; + LOGGER.error("玩家" + map.getValue().getUid() + "原有秒:"+map.getValue().getOccupyTime()+" 获得秒:" + (minute*60+second)); + map.getValue().setOccupyTime(map.getValue().getOccupyTime() + minute*60+second); + map.getValue().setGetAwardTimeOrOccupyTime(nowTime); + RedisUtil.getInstence().old_putmap(RedisKey.CROSS_LINGMAISECRET_INFO, groupkey, map.getKey(), map.getValue()); + AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_LINGMAI_RANK_PERSON.getType()); + LOGGER.error("second:"+map.getValue().getOccupyTime()+" perMinuteReward:"+(config.getRewardList()[0][1])); + long score = (long)map.getValue().getOccupyTime() * config.getRewardList()[0][1]/60 + map.getValue().getScore1(); + double test = rank.getScoreById(map.getValue().getUid(), groupkey); + LOGGER.error("之前是:" + test + "之后是:" + score); + rank.addRank(map.getValue().getUid(), groupkey, score); } } catch (Exception e) { e.printStackTrace();