还原灵脉

master_yuenan
DESKTOP-C3M45P4\dengdan 2025-07-04 17:33:37 +08:00
parent 761347b776
commit 5e4cf04ff7
3 changed files with 122 additions and 69 deletions

View File

@ -4,7 +4,7 @@ public class LingMaiSecretArea {
private int id;
private int uid;
private String serverName;
private int occupyTime;//占领的时长 以分钟为单位
private int occupyTime;
// 下面这四个参数用不到了
@Deprecated

View File

@ -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<ArenaInfoPr
@Override
public void processWithProto(ISession session, ArenaInfoProto.CrossLingmaiSecretAreaRequest request) throws Exception {
int uid = session.getUid();
User user = UserManager.getUser(uid);
if (user == null) {
return;
@ -79,15 +83,6 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler<ArenaInfoPr
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.CrossLingmaiSecretAreaResponse.getNumber(), res.build(), true);
return;
}
//跨服灵脉锁
RedisUtil redisUtil = RedisUtil.getInstence();
String lockKey = "SERVER_LINGMAI_LOCK" + RedisKey.Delimiter_colon + crossGroup + RedisKey.Delimiter_colon + group;
boolean lock = redisUtil.lock(lockKey, TimeUtils.ONE_MINUTE);
if (!lock) {
//没有拿到锁直接返回
LOGGER.info("跨服灵脉,跨服分组 ={},灵脉分组 ={},未获取到锁", crossGroup, group);
return;
}
//检测特权次数
boolean countBol = PlayerLogic.getInstance().check(user, request.getPrivilageTypeId(), 1);
if (request.getPrivilageTypeId() == 0 || !countBol) {
@ -95,9 +90,19 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler<ArenaInfoPr
throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT, "挑战次数不足");
}
SLodeConfig config = SLodeConfig.lodeConfig.get(id);
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_LINGMAI_RANK_PERSON.getType());
if (config == null) {
return;
}
//跨服灵脉锁
RedisUtil redisUtil = RedisUtil.getInstence();
String lockKey = "SERVER_LINGMAI_LOCK" + RedisKey.Delimiter_colon + crossGroup + RedisKey.Delimiter_colon + group;
boolean lock = redisUtil.lock(lockKey, TimeUtils.ONE_SECOND * 10);
if (!lock) {
//没有拿到锁直接返回
LOGGER.info("跨服灵脉,跨服分组 ={},灵脉分组 ={},未获取到锁", crossGroup, group);
return;
}
String serverName = CrossServiceLogic.simplifyServerName(GameApplication.serverId);
String key = RedisKey.CROSS_LINGMAISECRET_INFO;
int nowInt = TimeUtils.nowInt();
@ -121,9 +126,20 @@ public class CrossLingmaiSecretAreaBattleHandler extends BaseHandler<ArenaInfoPr
//赢了
if (fightResult.getResult() == 1) {
//结算已有的灵脉
int score =0;
if (myLingmaiId != 0){
LingMaiSecretArea myLingmai = lingMaiMap.get(String.valueOf(myLingmaiId));
CrossLingmaiLogic.getInstance().sendNormalMail(uid,myLingmai);
config = SLodeConfig.lodeConfig.get(myLingmaiId);
//int minute = ((TimeUtils.nowInt() - (int)myLingmai.getGetAwardTimeOrOccupyTime()) / 60) > 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 BaseHandler<ArenaInfoPr
lingMaiSecretArea.setId(id);
lingMaiSecretArea.setUid(uid);
lingMaiSecretArea.setServerName(serverName);
lingMaiSecretArea.setOccupyTime(nowInt);
lingMaiSecretArea.setGetAwardTimeOrOccupyTime(nowInt);
lingMaiSecretArea.setBeginOccupyTime(nowInt);
if(myLingmaiId != 0 && score!=0){
lingMaiSecretArea.setScore1(score);
}
//被打下榜 重新上
if(myLingmaiId ==0){
double disappearScore = rank.getScoreById(uid, crossGroup + RedisKey.Delimiter_colon + group);
if(disappearScore>0){
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<ArenaInfoPr
LOGGER.error("跨服灵脉秘境真人战斗结果:"+result);
if (result == 1) {
//赢了 我有灵脉 我没灵脉
//别人积分收益结算
LingMaiSecretArea oldOwner = lingMaiMap.get(String.valueOf(id));//上一个占领者
//int minute = ((TimeUtils.nowInt() - (int)oldOwner.getGetAwardTimeOrOccupyTime()) / 60) > 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()));

View File

@ -102,17 +102,17 @@ public class CrossLingmaiLogic {
String groupKey = crossGroup + RedisKey.Delimiter_colon + group;
int second = SSpecialConfig.getIntegerValue(SSpecialConfig.lingmai_basic_configuration);
Map<String, LingMaiSecretArea> mapValues = RedisUtil.getInstence().old_getmapvalue_toclass(key, groupKey, String.class, LingMaiSecretArea.class);
Iterator<Map.Entry<String, LingMaiSecretArea>> iterator = mapValues.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, LingMaiSecretArea> 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<Map.Entry<String, LingMaiSecretArea>> iterator = mapValues.entrySet().iterator();
// while (iterator.hasNext()){
// Map.Entry<String, LingMaiSecretArea> 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<String, LingMaiSecretArea> 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<String, LingMaiSecretArea> 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<String, LingMaiSecretArea> lingMaiMap1 = RedisUtil.getInstence().old_getmapvalue_toclass(RedisKey.CROSS_LINGMAISECRET_INFO, crossGroup + RedisKey.Delimiter_colon + 1, String.class, LingMaiSecretArea.class);
Map<String, LingMaiSecretArea> 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<String, LingMaiSecretArea> 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();