御剑飞行
parent
8903413162
commit
1e7cc6dea2
|
@ -302,6 +302,11 @@ public class TimeUtils {
|
||||||
return new SimpleDateFormat(ymdhms_Format_new).format(new Date(time));
|
return new SimpleDateFormat(ymdhms_Format_new).format(new Date(time));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Date dateFormat(String time) throws ParseException {
|
||||||
|
DateFormat format1 = new SimpleDateFormat(ymdhms_Format_new);
|
||||||
|
return format1.parse(time);
|
||||||
|
}
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * 是否是同一天
|
// * 是否是同一天
|
||||||
// *
|
// *
|
||||||
|
@ -725,7 +730,7 @@ public class TimeUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取几天后的当前时间点
|
* 获取明天零点
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static long getTomorrowZero() {
|
public static long getTomorrowZero() {
|
||||||
|
@ -738,7 +743,7 @@ public class TimeUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取几天后的当前时间点
|
* 获取明天零点
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static long getTomorrowZero2() {
|
public static long getTomorrowZero2() {
|
||||||
|
@ -842,7 +847,6 @@ public class TimeUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得当前周星期几的0点时间
|
* 获得当前周星期几的0点时间
|
||||||
* @param now
|
|
||||||
* @param targetWeekday
|
* @param targetWeekday
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.ljsd.jieling.config.json.ServerProperties;
|
||||||
import com.ljsd.jieling.db.mongo.MongoUtil;
|
import com.ljsd.jieling.db.mongo.MongoUtil;
|
||||||
import com.ljsd.jieling.db.redis.RedisKey;
|
import com.ljsd.jieling.db.redis.RedisKey;
|
||||||
import com.ljsd.jieling.db.redis.RedisUtil;
|
import com.ljsd.jieling.db.redis.RedisUtil;
|
||||||
|
import com.ljsd.jieling.hotfix.HotfixUtil;
|
||||||
import com.ljsd.jieling.logic.dao.ServerConfig;
|
import com.ljsd.jieling.logic.dao.ServerConfig;
|
||||||
import com.ljsd.jieling.logic.family.CrossDeathPathLogic;
|
import com.ljsd.jieling.logic.family.CrossDeathPathLogic;
|
||||||
import com.ljsd.jieling.logic.rank.CrossRankManager;
|
import com.ljsd.jieling.logic.rank.CrossRankManager;
|
||||||
|
@ -63,6 +64,9 @@ public class GameApplication {
|
||||||
SkyEyeService.getInstance().onStart();
|
SkyEyeService.getInstance().onStart();
|
||||||
CrossDeathPathLogic.getInstance().serverInit();
|
CrossDeathPathLogic.getInstance().serverInit();
|
||||||
CrossRankManager.getInstance().guildCacheHandle();
|
CrossRankManager.getInstance().guildCacheHandle();
|
||||||
|
HotfixUtil.getInstance();
|
||||||
|
// 开启定时任务
|
||||||
|
// TaskKit.reset();
|
||||||
//控制台gm
|
//控制台gm
|
||||||
Scanner sc = new Scanner(System.in);
|
Scanner sc = new Scanner(System.in);
|
||||||
while(sc.hasNext())
|
while(sc.hasNext())
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class CarDelayFunction implements FunctionManager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
MongoUtil.getLjsdMongoTemplate().lastUpdate();
|
MongoUtil.getLjsdMongoTemplate().lastUpdate();
|
||||||
RedisUtil.getInstence().rename(delKeys.toArray(new String[0]));
|
RedisUtil.getInstence().rename(60*60*24-60,delKeys.toArray(new String[0]));
|
||||||
// RedisUtil.getInstence().del(delKeys.toArray(new String[0]));
|
// RedisUtil.getInstence().del(delKeys.toArray(new String[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -396,6 +396,12 @@ public class RedisKey {
|
||||||
* 网页支付特殊处理用
|
* 网页支付特殊处理用
|
||||||
*/
|
*/
|
||||||
public static final String WEB_PAY = "WEB_PAY";
|
public static final String WEB_PAY = "WEB_PAY";
|
||||||
|
// 御剑飞行排行
|
||||||
|
public static final String RIDING_SWARD_RANK = "RIDING_SWARD_RANK";
|
||||||
|
// 御剑飞行记录
|
||||||
|
public static final String RIDING_SWARD_RECORD = "RIDING_SWARD_RECORD";
|
||||||
|
// 御剑飞行时间锁
|
||||||
|
public static final String RIDING_SWARD_TIME_LOCK = "RIDING_SWARD_TIME_LOCK";
|
||||||
|
|
||||||
public static Set<String> newAreaCacChe = new HashSet<>();//进程排行 合区统一
|
public static Set<String> newAreaCacChe = new HashSet<>();//进程排行 合区统一
|
||||||
|
|
||||||
|
|
|
@ -164,22 +164,24 @@ public class RedisUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* redis重命名
|
* redis重命名
|
||||||
|
* @param time 过期时间
|
||||||
* @param key,数组
|
* @param key,数组
|
||||||
*/
|
*/
|
||||||
public void rename(String... key) {
|
public void rename(long time, String... key) {
|
||||||
if (key != null && key.length > 0) {
|
if (key != null && key.length > 0) {
|
||||||
for (int i = 0; i < key.length; i++) {
|
for (int i = 0; i < key.length; i++) {
|
||||||
// 旧名字
|
// 旧名字
|
||||||
String oldName = key[i];
|
String oldName = key[i];
|
||||||
// 新名字
|
// 新名字
|
||||||
String newName = oldName+"BACK:"+System.currentTimeMillis();
|
String timeStamp2 = TimeUtils.getTimeStamp2(TimeUtils.now());
|
||||||
|
String newName = oldName+":BACK:"+timeStamp2;
|
||||||
// key是否存在
|
// key是否存在
|
||||||
boolean aBoolean = hasKey(oldName);
|
boolean aBoolean = hasKey(oldName);
|
||||||
if (aBoolean){
|
if (aBoolean){
|
||||||
// 重命名
|
// 重命名
|
||||||
redisTemplate.rename(oldName,newName);
|
redisTemplate.rename(oldName,newName);
|
||||||
// 设置过期时间
|
// 设置过期时间
|
||||||
expire(newName,60*60*24-60);
|
expire(newName,time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,6 +173,7 @@ public enum ErrorCode implements IErrorCode {
|
||||||
HONGMENG_ING(142,"英雄在鸿蒙阵中,操作失败"),
|
HONGMENG_ING(142,"英雄在鸿蒙阵中,操作失败"),
|
||||||
CHAT_NOT_CROSS(143,"聊天检查,没有跨服分组"),
|
CHAT_NOT_CROSS(143,"聊天检查,没有跨服分组"),
|
||||||
SIXIANG_UP_LIMIT(144,"强化已达上限"),
|
SIXIANG_UP_LIMIT(144,"强化已达上限"),
|
||||||
|
RIDING_SWARD_BET_TWO(145,"一轮比赛最多押注两次!"),
|
||||||
;
|
;
|
||||||
private static final Set<Integer> CodeSet = new HashSet<>();
|
private static final Set<Integer> CodeSet = new HashSet<>();
|
||||||
|
|
||||||
|
|
|
@ -357,5 +357,7 @@ public interface BIReason {
|
||||||
|
|
||||||
int SEVEN_WORLD_TREASURE = 1214;//七界秘宝
|
int SEVEN_WORLD_TREASURE = 1214;//七界秘宝
|
||||||
|
|
||||||
|
int RIDING_SWARD_REWARD = 1215;//御剑行领取奖励
|
||||||
|
int RIDING_SWARD_BET = 1216;//御剑行押注消耗
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.ljsd.jieling.handler.ridingsward;
|
||||||
|
|
||||||
|
import com.google.protobuf.GeneratedMessage;
|
||||||
|
import com.ljsd.jieling.handler.BaseHandler;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
|
import com.ljsd.jieling.network.session.ISession;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import rpc.protocols.ActivityProto;
|
||||||
|
import rpc.protocols.MessageTypeProto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/10/11 10:30:33
|
||||||
|
* @Description:
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RidingSwardActivityHandler extends BaseHandler<ActivityProto.RidingSwardActivityRequest> {
|
||||||
|
@Override
|
||||||
|
public MessageTypeProto.MessageType getMessageCode() {
|
||||||
|
return MessageTypeProto.MessageType.RidingSwardActivityRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processWithProto(ISession iSession, ActivityProto.RidingSwardActivityRequest proto) throws Exception {
|
||||||
|
RidingSwardLogic.getInstance().getRidingSwardActivity(iSession.getUid(),proto);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.ljsd.jieling.handler.ridingsward;
|
||||||
|
|
||||||
|
import com.ljsd.jieling.handler.BaseHandler;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
|
import com.ljsd.jieling.network.session.ISession;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import rpc.protocols.ActivityProto;
|
||||||
|
import rpc.protocols.MessageTypeProto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/10/12 10:50:16
|
||||||
|
* @Description: 投注
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RidingSwardBetHandler extends BaseHandler<ActivityProto.RidingSwardBetRequest> {
|
||||||
|
@Override
|
||||||
|
public MessageTypeProto.MessageType getMessageCode() {
|
||||||
|
return MessageTypeProto.MessageType.RidingSwardBetRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processWithProto(ISession iSession, ActivityProto.RidingSwardBetRequest proto) throws Exception {
|
||||||
|
RidingSwardLogic.getInstance().ridingSwardBet(iSession.getUid(),proto);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.ljsd.jieling.handler.ridingsward;
|
||||||
|
|
||||||
|
import com.ljsd.jieling.exception.ErrorCode;
|
||||||
|
import com.ljsd.jieling.exception.ErrorCodeException;
|
||||||
|
import com.ljsd.jieling.handler.BaseHandler;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
|
import com.ljsd.jieling.network.session.ISession;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import rpc.protocols.ActivityProto;
|
||||||
|
import rpc.protocols.MessageTypeProto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/10/11 15:55:32
|
||||||
|
* @Description:
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RidingSwardInfoHandler extends BaseHandler<ActivityProto.RidingSwardInfoRequest> {
|
||||||
|
@Override
|
||||||
|
public MessageTypeProto.MessageType getMessageCode() {
|
||||||
|
return MessageTypeProto.MessageType.RidingSwardInfoRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processWithProto(ISession iSession, ActivityProto.RidingSwardInfoRequest proto) throws Exception {
|
||||||
|
RidingSwardLogic.getInstance().sendRidingSwardInfo(iSession.getUid());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.ljsd.jieling.handler.ridingsward;
|
||||||
|
|
||||||
|
import com.ljsd.jieling.handler.BaseHandler;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
|
import com.ljsd.jieling.network.session.ISession;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import rpc.protocols.ActivityProto;
|
||||||
|
import rpc.protocols.MessageTypeProto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/10/12 10:50:16
|
||||||
|
* @Description:
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RidingSwardRewardHandler extends BaseHandler<ActivityProto.RidingSwardRewardRequest> {
|
||||||
|
@Override
|
||||||
|
public MessageTypeProto.MessageType getMessageCode() {
|
||||||
|
return MessageTypeProto.MessageType.RidingSwardRewardRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processWithProto(ISession iSession, ActivityProto.RidingSwardRewardRequest proto) throws Exception {
|
||||||
|
RidingSwardLogic.getInstance().getRidingSwardReward(iSession.getUid(),proto);
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,6 +38,7 @@ import com.ljsd.jieling.logic.mission.data.DataManagerDistributor;
|
||||||
import com.ljsd.jieling.logic.mission.event.MissionEventDistributor;
|
import com.ljsd.jieling.logic.mission.event.MissionEventDistributor;
|
||||||
import com.ljsd.jieling.logic.player.PlayerLogic;
|
import com.ljsd.jieling.logic.player.PlayerLogic;
|
||||||
import com.ljsd.jieling.logic.redpacket.WelfareRedPackSendHandler;
|
import com.ljsd.jieling.logic.redpacket.WelfareRedPackSendHandler;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic;
|
import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic;
|
||||||
import com.ljsd.jieling.logic.store.BuyGoodsNewLogic;
|
import com.ljsd.jieling.logic.store.BuyGoodsNewLogic;
|
||||||
import com.ljsd.jieling.logic.store.StoreLogic;
|
import com.ljsd.jieling.logic.store.StoreLogic;
|
||||||
|
@ -427,6 +428,8 @@ public class GlobalDataManaager implements IManager {
|
||||||
HelpHeroLogic.getInstance().clearHelpInfo(user);
|
HelpHeroLogic.getInstance().clearHelpInfo(user);
|
||||||
// 七界推送
|
// 七界推送
|
||||||
SevenWorldLogic.getInstance().sevenWorldInfoIndication(session);
|
SevenWorldLogic.getInstance().sevenWorldInfoIndication(session);
|
||||||
|
// 御剑行
|
||||||
|
RidingSwardLogic.getInstance().zeroClearRidingSwardByUser(user);
|
||||||
|
|
||||||
// GuildChallengeLogic.getInstance().resetBossDamage(user);
|
// GuildChallengeLogic.getInstance().resetBossDamage(user);
|
||||||
if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,0)){
|
if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,0)){
|
||||||
|
|
|
@ -153,45 +153,44 @@ public class GlobleSystemLogic implements IEventHandler {
|
||||||
* 2 高于50名
|
* 2 高于50名
|
||||||
*/
|
*/
|
||||||
public void calCulRank() {
|
public void calCulRank() {
|
||||||
//开服前7天不开放跨服功能
|
|
||||||
/*if(isOpenServer7()){
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
//不参与跨服,不用计算世界等级
|
|
||||||
if(!GameApplication.serverProperties.isArenaCross()){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
|
|
||||||
int rankEndLine = setting.getWorldLevLimit();
|
|
||||||
double sum=0;
|
|
||||||
int level = 1;
|
|
||||||
//直接从库里查
|
|
||||||
Query query = new Query();
|
|
||||||
query.with(new Sort(Sort.Direction.DESC,"playerManager.level"));
|
|
||||||
query.fields().include("playerManager.level");
|
|
||||||
query.limit(rankEndLine);
|
|
||||||
List<User> users = new ArrayList<>();
|
|
||||||
try {
|
try {
|
||||||
users = MongoUtil.getLjsdMongoTemplate().findAllByCondition(query, User.class);
|
//开服前7天不开放跨服功能
|
||||||
} catch (Exception e) {
|
/*if(isOpenServer7()){
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
//不参与跨服,不用计算世界等级
|
||||||
|
if(!GameApplication.serverProperties.isArenaCross()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SMServerArenaSetting setting = STableManager.getConfig(SMServerArenaSetting.class).get(1);
|
||||||
|
int rankEndLine = setting.getWorldLevLimit();
|
||||||
|
double sum=0;
|
||||||
|
int level = 1;
|
||||||
|
//直接从库里查
|
||||||
|
Query query = new Query();
|
||||||
|
query.with(new Sort(Sort.Direction.DESC,"playerManager.level"));
|
||||||
|
query.fields().include("playerManager.level");
|
||||||
|
query.limit(rankEndLine);
|
||||||
|
List<User> users = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
users = MongoUtil.getLjsdMongoTemplate().findAllByCondition(query, User.class);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
//如果达不到这些人,世界等级就为1
|
||||||
|
if(users.size()>=rankEndLine) {
|
||||||
|
for (int j = 0; j <users.size() ; j++) {
|
||||||
|
sum+=users.get(j).getPlayerInfoManager().getLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
level = (int) Math.ceil(sum / (double) Math.min(users.size(), rankEndLine==0?99999999:rankEndLine));
|
||||||
|
}
|
||||||
|
setGlobalWorldLevelCache(level);
|
||||||
|
LOGGER.info("总人数:{},计算了一次世界等级->{}",users.size(),level);
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("计算世界等级报错,{}",e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
//如果达不到这些人,世界等级就为1
|
|
||||||
if(users.size()>=rankEndLine) {
|
|
||||||
for (int j = 0; j <users.size() ; j++) {
|
|
||||||
sum+=users.get(j).getPlayerInfoManager().getLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
level = (int) Math.ceil(sum / (double) Math.min(users.size(), rankEndLine==0?99999999:rankEndLine));
|
|
||||||
}
|
|
||||||
|
|
||||||
setGlobalWorldLevelCache(level);
|
|
||||||
LOGGER.info("总人数:{},计算了一次世界等级->{}",users.size(),level);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getGlobalWorldLevelCache() {
|
public static int getGlobalWorldLevelCache() {
|
||||||
|
|
|
@ -112,4 +112,5 @@ public interface ActivityType {
|
||||||
int XUN_BAO_MI_ZONG = 82;//寻宝迷踪
|
int XUN_BAO_MI_ZONG = 82;//寻宝迷踪
|
||||||
|
|
||||||
int SEVEN_WORLD_TREASURE = 83;//七界秘宝
|
int SEVEN_WORLD_TREASURE = 83;//七界秘宝
|
||||||
|
int RIDING_SWARD = 84;//御剑飞行
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ public enum ActivityTypeEnum {
|
||||||
XUN_BAO_MI_ZONG(ActivityType.XUN_BAO_MI_ZONG,XunBaoMiZongActivity::new),
|
XUN_BAO_MI_ZONG(ActivityType.XUN_BAO_MI_ZONG,XunBaoMiZongActivity::new),
|
||||||
SEVEN_WORLD_TREASURE(ActivityType.SEVEN_WORLD_TREASURE,SevenWorldActivity::new),
|
SEVEN_WORLD_TREASURE(ActivityType.SEVEN_WORLD_TREASURE,SevenWorldActivity::new),
|
||||||
LING_LONG_PAVILION(ActivityType.LING_LONG_PAVILION,DefaultEmptyActivity::new),
|
LING_LONG_PAVILION(ActivityType.LING_LONG_PAVILION,DefaultEmptyActivity::new),
|
||||||
|
RIDING_SWARD(ActivityType.RIDING_SWARD,DefaultEmptyActivity::new),
|
||||||
;
|
;
|
||||||
|
|
||||||
private int type;
|
private int type;
|
||||||
|
|
|
@ -186,6 +186,9 @@ public class PlayerManager extends MongoBase {
|
||||||
*/
|
*/
|
||||||
private Map<Integer,Integer> sevenWorldRelic = new HashMap<>();
|
private Map<Integer,Integer> sevenWorldRelic = new HashMap<>();
|
||||||
|
|
||||||
|
// 御剑行游玩次数
|
||||||
|
private int ridingSwardNum;
|
||||||
|
|
||||||
public PlayerManager(){
|
public PlayerManager(){
|
||||||
this.setRootCollection(User._COLLECTION_NAME);
|
this.setRootCollection(User._COLLECTION_NAME);
|
||||||
}
|
}
|
||||||
|
@ -1278,4 +1281,13 @@ public class PlayerManager extends MongoBase {
|
||||||
this.sevenWorldRelic.put(id,status);
|
this.sevenWorldRelic.put(id,status);
|
||||||
updateString("sevenWorldRelic",sevenWorldRelic);
|
updateString("sevenWorldRelic",sevenWorldRelic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRidingSwardNum() {
|
||||||
|
return ridingSwardNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRidingSwardNum(int ridingSwardNum) {
|
||||||
|
this.ridingSwardNum = ridingSwardNum;
|
||||||
|
updateString("ridingSwardNum",ridingSwardNum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -330,12 +330,13 @@ public class HelpHeroLogic {
|
||||||
* 零点清理redis数据
|
* 零点清理redis数据
|
||||||
*/
|
*/
|
||||||
public void zeroClearRedisHelp(){
|
public void zeroClearRedisHelp(){
|
||||||
// 不是零点
|
try {
|
||||||
if (TimeUtils.getHourOfDay() != 0 || TimeUtils.getMiunte() != 0){
|
String pattern = GameApplication.serverId +":" + RedisKey.HELP_FIGHT + ".*";
|
||||||
return;
|
RedisUtil.getInstence().delVague(RedisKey.HELP_FIGHT_DELETE,pattern);
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("零点清理助战信息报错,{}",e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
String pattern = GameApplication.serverId +":" + RedisKey.HELP_FIGHT + ".*";
|
|
||||||
RedisUtil.getInstence().delVague(RedisKey.HELP_FIGHT_DELETE,pattern);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,544 @@
|
||||||
|
package com.ljsd.jieling.logic.ridingSward;
|
||||||
|
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
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.jbean.ActivityMission;
|
||||||
|
import com.ljsd.jieling.logic.activity.ActivityType;
|
||||||
|
import com.ljsd.jieling.logic.activity.crossService.CrossServiceLogic;
|
||||||
|
import com.ljsd.jieling.logic.dao.UserManager;
|
||||||
|
import com.ljsd.jieling.logic.dao.gm.ArenaOfUser;
|
||||||
|
import com.ljsd.jieling.logic.dao.root.User;
|
||||||
|
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.tools.Utils;
|
||||||
|
import com.ljsd.jieling.util.ItemUtil;
|
||||||
|
import com.ljsd.jieling.util.MessageUtil;
|
||||||
|
import config.SGlobalActivity;
|
||||||
|
import config.SRidingSwardConfig;
|
||||||
|
import config.SRidingSwardResult;
|
||||||
|
import manager.STableManager;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.data.redis.core.ZSetOperations;
|
||||||
|
import rpc.protocols.ActivityProto;
|
||||||
|
import rpc.protocols.CommonProto;
|
||||||
|
import rpc.protocols.MessageTypeProto;
|
||||||
|
import util.MathUtils;
|
||||||
|
import util.TimeUtils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/9/28 10:19:37
|
||||||
|
* @Description: 御剑飞行
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("ALL")
|
||||||
|
public class RidingSwardLogic{
|
||||||
|
// 日志
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(RidingSwardLogic.class);
|
||||||
|
// 获取单例
|
||||||
|
public static RidingSwardLogic instance = new RidingSwardLogic();
|
||||||
|
private RidingSwardLogic(){}
|
||||||
|
public static RidingSwardLogic getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
//当前状态,0:关闭,1:投注,2:比赛中
|
||||||
|
public static int state = 0;
|
||||||
|
private static long startTime = 0L;
|
||||||
|
private static long endTime = 0L;
|
||||||
|
private static long nextTime = 0L;
|
||||||
|
|
||||||
|
public void checkState(){
|
||||||
|
try {
|
||||||
|
// 活动过期
|
||||||
|
if (TimeUtils.now() > endTime || TimeUtils.now() < startTime){
|
||||||
|
state = 0;
|
||||||
|
}
|
||||||
|
// 关闭中,不进行处理
|
||||||
|
if (state == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
long now = TimeUtils.now();
|
||||||
|
// 配置表
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
// 投注时间
|
||||||
|
long bet = config.getTime()[0] * TimeUtils.ONE_SECOND;
|
||||||
|
// 比赛时间
|
||||||
|
long competition = config.getTime()[1] * TimeUtils.ONE_SECOND;
|
||||||
|
// 活动开始到现在经过了多少时间,计算第几轮, 取模,小于60000是比赛中,大于60000是投注
|
||||||
|
long time = (now - startTime) % (bet + competition);
|
||||||
|
long num = (now - startTime) / (bet + competition);
|
||||||
|
if (time > bet){
|
||||||
|
// 比赛阶段
|
||||||
|
state = 2;
|
||||||
|
nextTime = (num + 1) * (bet + competition) + startTime;
|
||||||
|
}else{
|
||||||
|
// 投注阶段
|
||||||
|
state = 1;
|
||||||
|
nextTime = num * (bet + competition) + bet + startTime;
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化比赛数据
|
||||||
|
*/
|
||||||
|
public void createExecuteScript(){
|
||||||
|
// 处理状态
|
||||||
|
checkState();
|
||||||
|
if (state == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RedisUtil redisUtil = RedisUtil.getInstence();
|
||||||
|
// 时间锁,同一天只会执行一次
|
||||||
|
String key = redisUtil.getKey(RedisKey.RIDING_SWARD_TIME_LOCK, "");
|
||||||
|
String timeLock = Optional.ofNullable(redisUtil.get(key)).map(Object::toString).orElse("0");
|
||||||
|
if (TimeUtils.now() < Long.parseLong(timeLock)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 配置表
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
TreeMap<Integer, SRidingSwardResult> treeMap = new TreeMap<>(STableManager.getConfig(SRidingSwardResult.class));
|
||||||
|
|
||||||
|
// 开始时间计算
|
||||||
|
boolean sameDay = TimeUtils.isSameDay(TimeUtils.now(), startTime);
|
||||||
|
long start = sameDay ? startTime : TimeUtils.getTodayZero();
|
||||||
|
// 结束时间计算
|
||||||
|
boolean sameDay2 = TimeUtils.isSameDay(TimeUtils.now(), endTime);
|
||||||
|
long end = sameDay2 ? endTime : TimeUtils.getTomorrowZero();
|
||||||
|
// 投注时间获取
|
||||||
|
long bet = config.getTime()[0] * TimeUtils.ONE_SECOND;
|
||||||
|
// 比赛时间获取
|
||||||
|
long competition = config.getTime()[1] * TimeUtils.ONE_SECOND;
|
||||||
|
|
||||||
|
// 今日比赛次数
|
||||||
|
long num = (end - start) / (bet + competition);
|
||||||
|
// 总权重
|
||||||
|
int sum = treeMap.values().stream().mapToInt(SRidingSwardResult::getRate).sum();
|
||||||
|
|
||||||
|
// map存储结果
|
||||||
|
HashMap<String, Integer> result = new HashMap<>();
|
||||||
|
long time = start;
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
// 比赛开始时间
|
||||||
|
long competitionIng = time += bet;
|
||||||
|
// 计算随机权重
|
||||||
|
int randomInt = MathUtils.randomInt(sum);
|
||||||
|
// 计算比赛脚本
|
||||||
|
for (SRidingSwardResult value : treeMap.values()) {
|
||||||
|
if (randomInt <= value.getRate()) {
|
||||||
|
// 存储
|
||||||
|
result.put(String.valueOf(competitionIng),value.getId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
randomInt-=value.getRate();
|
||||||
|
}
|
||||||
|
// 加上比赛用时,获得下一场投注开始时间
|
||||||
|
time = competitionIng + competition;
|
||||||
|
}
|
||||||
|
redisUtil.putMapEntrys(RedisKey.RIDING_SWARD_RANK, "", result);
|
||||||
|
LOGGER.info("御剑行日志:结果:{}", result.toString());
|
||||||
|
// 覆盖锁
|
||||||
|
redisUtil.set(key,String.valueOf(end));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证客户端信息,返回用户
|
||||||
|
* @param uid
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private User verifyUser(int uid) throws Exception {
|
||||||
|
// 用户信息
|
||||||
|
User user = UserManager.getUser(uid);
|
||||||
|
if (user == null) {
|
||||||
|
throw new ErrorCodeException(ErrorCode.UNKNOWN);
|
||||||
|
}
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取活动信息
|
||||||
|
* @param uid
|
||||||
|
* @param proto
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void getRidingSwardActivity(int uid, ActivityProto.RidingSwardActivityRequest proto) throws Exception {
|
||||||
|
User user = verifyUser(uid);
|
||||||
|
ActivityProto.RidingSwardActivityResponse.Builder build = ActivityProto.RidingSwardActivityResponse.newBuilder();
|
||||||
|
|
||||||
|
// 活动未开启
|
||||||
|
ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(proto.getActivityId());
|
||||||
|
if (mission == null || mission.getActivityState() != ActivityType.OPEN_STATE){
|
||||||
|
build.setState(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 初始化状态信息
|
||||||
|
if (state == 0) {
|
||||||
|
// 初始化活动数据
|
||||||
|
SGlobalActivity activity = SGlobalActivity.getsGlobalActivityMap().get(proto.getActivityId());
|
||||||
|
state = 1;
|
||||||
|
startTime = TimeUtils.stringToTimeLong(activity.getStartTime(), "yyyyMMdd HHmmss");
|
||||||
|
endTime = TimeUtils.stringToTimeLong(activity.getEndtime(), "yyyyMMdd HHmmss");
|
||||||
|
// 定时器启动
|
||||||
|
getInstance().createExecuteScript();
|
||||||
|
}
|
||||||
|
// 处理缓存
|
||||||
|
checkState();
|
||||||
|
// 活动未到开启时间
|
||||||
|
if (state == 0){
|
||||||
|
build.setState(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// 跨服排行榜玩家排名玩家信息
|
||||||
|
ArrayList<CommonProto.ModelUserInfo> infos = new ArrayList<>(4);
|
||||||
|
// 跨服排行数据
|
||||||
|
AbstractRank rank = RankContext.getRankEnum(RankEnum.CROSS_FORCE_CURR_RANK.getType());
|
||||||
|
Set<ZSetOperations.TypedTuple<String>> tupleSet = rank.getCrossRankByKey("", 1, 4);
|
||||||
|
for (ZSetOperations.TypedTuple<String> tuple : tupleSet) {
|
||||||
|
// 跨服排行榜玩家数据
|
||||||
|
ArenaOfUser query = CrossServiceLogic.getInstance().query(Integer.parseInt(tuple.getValue()));
|
||||||
|
CommonProto.ModelUserInfo.Builder builder = CommonProto.ModelUserInfo.newBuilder()
|
||||||
|
.setUserName(query.getPlayerManager().getName())
|
||||||
|
.setSex(query.getPlayerManager().getGender())
|
||||||
|
.setPracticeLevel(query.getPlayerManager().getPracticeLevel());
|
||||||
|
infos.add(builder.build());
|
||||||
|
}
|
||||||
|
build.addAllModelInfo(infos);
|
||||||
|
build.setState(state);
|
||||||
|
build.setTime(nextTime);
|
||||||
|
build.setRankId(getMatchRankId());
|
||||||
|
build.setBetCount(user.getPlayerInfoManager().getRidingSwardNum());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardActivityResponse_VALUE,build.build(),true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前比赛剧本id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int getMatchRankId(){
|
||||||
|
if (state == 2){
|
||||||
|
// 配置
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
long time = nextTime - config.getTime()[1] * TimeUtils.ONE_SECOND;
|
||||||
|
return getRankMap().getOrDefault(time,0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领取奖励
|
||||||
|
* @param uid
|
||||||
|
* @param proto
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void getRidingSwardReward(int uid,ActivityProto.RidingSwardRewardRequest proto) throws Exception {
|
||||||
|
// 玩家信息
|
||||||
|
User user = verifyUser(uid);
|
||||||
|
// 场次时间
|
||||||
|
long time = proto.getTime();
|
||||||
|
// 投注记录,key:时间戳,value:竞猜记录信息
|
||||||
|
Map<Long, List<RidingSwardRecord>> recordMap = getRecordList(uid);
|
||||||
|
// 配置
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
List<int[]> result = new ArrayList<>();
|
||||||
|
if (time == 0){
|
||||||
|
for (Map.Entry<Long, List<RidingSwardRecord>> entry : recordMap.entrySet()) {
|
||||||
|
for (RidingSwardRecord record : entry.getValue()) {
|
||||||
|
// 未领取奖励
|
||||||
|
if (record.getState() == 0){
|
||||||
|
int[] reward = {config.getMaxRaiseNum()[0],record.getGetNum()};
|
||||||
|
result.add(reward);
|
||||||
|
record.setState(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
// 单场领取
|
||||||
|
int swardId = proto.getSwardId();
|
||||||
|
List<RidingSwardRecord> records = recordMap.get(time);
|
||||||
|
if (records == null || records.isEmpty() || swardId == 0){
|
||||||
|
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"比赛场次不存在,领取失败");
|
||||||
|
}
|
||||||
|
for (RidingSwardRecord record : records) {
|
||||||
|
if (record.getState() == 0 && record.getBetSwardId() == swardId){
|
||||||
|
int[] reward = {config.getMaxRaiseNum()[0],record.getGetNum()};
|
||||||
|
result.add(reward);
|
||||||
|
record.setState(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(time),records);
|
||||||
|
}
|
||||||
|
// 奖励计算
|
||||||
|
int[][] changeList = Utils.changeList(result);
|
||||||
|
CommonProto.Drop.Builder drop = ItemUtil.drop(user, changeList, BIReason.RIDING_SWARD_REWARD);
|
||||||
|
ActivityProto.RidingSwardRewardResponse.Builder builder = ActivityProto.RidingSwardRewardResponse.newBuilder().setDrop(drop);
|
||||||
|
MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardRewardResponse_VALUE,builder.build(),true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 投注
|
||||||
|
* @param uid
|
||||||
|
* @param proto
|
||||||
|
*/
|
||||||
|
public void ridingSwardBet(int uid,ActivityProto.RidingSwardBetRequest proto) throws Exception {
|
||||||
|
if (state != 1){
|
||||||
|
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"活动关闭或正在比赛中,无法投标");
|
||||||
|
}
|
||||||
|
User user = verifyUser(uid);
|
||||||
|
// 配置
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
// 投注记录,key:时间戳,value:竞猜记录信息
|
||||||
|
Map<Long, List<RidingSwardRecord>> recordMap = getRecordList(uid);
|
||||||
|
// 获取下一场
|
||||||
|
List<RidingSwardRecord> records = recordMap.getOrDefault(nextTime,new ArrayList<>());
|
||||||
|
// 首次押注,验证次数消耗
|
||||||
|
if (records.isEmpty()){
|
||||||
|
// 验证押注次数
|
||||||
|
int betNum = user.getPlayerInfoManager().getRidingSwardNum();
|
||||||
|
if (betNum >= config.getJoinCount() && false){
|
||||||
|
throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT);
|
||||||
|
}
|
||||||
|
// 验证道具数量
|
||||||
|
if (proto.getCostNum() > config.getMaxRaiseNum()[1] || proto.getCostNum() < config.getJoinCost()[1]){
|
||||||
|
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH,"押注道具不满足最低或最高上限");
|
||||||
|
}
|
||||||
|
// 道具消耗
|
||||||
|
HashMap<Integer, Integer> map = new HashMap<>();
|
||||||
|
map.put(config.getMaxRaiseNum()[0],proto.getCostNum());
|
||||||
|
boolean checkCost = ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0);
|
||||||
|
if (!checkCost){
|
||||||
|
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH);
|
||||||
|
}
|
||||||
|
RidingSwardRecord record = new RidingSwardRecord(nextTime,proto.getSwardId(),proto.getCostNum());
|
||||||
|
records.add(record);
|
||||||
|
// 记录押注次数
|
||||||
|
user.getPlayerInfoManager().setRidingSwardNum(betNum + 1);
|
||||||
|
}
|
||||||
|
// 第二次押注,验证是否重复
|
||||||
|
else if (records.size() < 2){
|
||||||
|
for (RidingSwardRecord record : records) {
|
||||||
|
if (record.getBetSwardId() == proto.getSwardId()){
|
||||||
|
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"不能重复押注");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RidingSwardRecord record = new RidingSwardRecord(nextTime,proto.getSwardId(),proto.getCostNum());
|
||||||
|
records.add(record);
|
||||||
|
}else {
|
||||||
|
throw new ErrorCodeException(ErrorCode.RIDING_SWARD_BET_TWO,"一轮最大押注两次");
|
||||||
|
}
|
||||||
|
if (!records.isEmpty()){
|
||||||
|
RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(nextTime),records);
|
||||||
|
}
|
||||||
|
// 返回消息
|
||||||
|
sendRidingSwardInfo(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回御剑飞行信息
|
||||||
|
* @param uid
|
||||||
|
*/
|
||||||
|
public void sendRidingSwardInfo(int uid) throws Exception {
|
||||||
|
User user = verifyUser(uid);
|
||||||
|
ActivityProto.RidingSwardInfoResponse.Builder builder = ActivityProto.RidingSwardInfoResponse.newBuilder();
|
||||||
|
builder.addAllRecordLsit(getRidingSwardRecord(uid));
|
||||||
|
builder.addAllBetList(getRidingSwardBet(uid));
|
||||||
|
builder.setLastRank(getRidingSwardLastRank());
|
||||||
|
builder.setBetCount(user.getPlayerInfoManager().getRidingSwardNum());
|
||||||
|
MessageUtil.sendMessage(uid,1, MessageTypeProto.MessageType.RidingSwardInfoResponse_VALUE,builder.build(),true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取上一次排名,也就是最后一次比赛
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private CommonProto.RidingSwardLastRank getRidingSwardLastRank() throws ErrorCodeException {
|
||||||
|
Map<Long, Integer> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class);
|
||||||
|
// 配置
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
long time = 0;
|
||||||
|
// 押注阶段,返回上一层比赛结果
|
||||||
|
if (state == 1){
|
||||||
|
time = nextTime - (config.getTime()[0] + config.getTime()[1]) * TimeUtils.ONE_SECOND;
|
||||||
|
}
|
||||||
|
// 比赛阶段,返回当前比赛结果
|
||||||
|
else if (state == 2){
|
||||||
|
time = nextTime - (config.getTime()[0] + config.getTime()[1]*2) * TimeUtils.ONE_SECOND;
|
||||||
|
}else {
|
||||||
|
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
|
||||||
|
}
|
||||||
|
Integer integer = map.getOrDefault(time,0);
|
||||||
|
return CommonProto.RidingSwardLastRank.newBuilder()
|
||||||
|
.setRankTime(time)
|
||||||
|
.setRankId(integer)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取投注记录
|
||||||
|
* @param uid
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private List<CommonProto.RidingSwardRecord> getRidingSwardRecord(int uid){
|
||||||
|
// 返回值
|
||||||
|
List<CommonProto.RidingSwardRecord> list = new ArrayList<>();
|
||||||
|
// 投注记录,key:时间戳,value:竞猜记录信息list
|
||||||
|
Type valueType = new TypeToken<List<RidingSwardRecord>>() {}.getType();
|
||||||
|
Map<Long, List<RidingSwardRecord>> recordMap = getRecordList(uid);
|
||||||
|
// 比赛记录,key:场次时间戳,value:剧本id
|
||||||
|
Map<Long, Integer> rankMap = getRankMap();
|
||||||
|
// 配置表
|
||||||
|
Map<Integer, SRidingSwardResult> resultMap = STableManager.getConfig(SRidingSwardResult.class);
|
||||||
|
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
|
||||||
|
// 异常可以投注两次,所以最多会有两次记录
|
||||||
|
for (Map.Entry<Long, List<RidingSwardRecord>> entry : recordMap.entrySet()) {
|
||||||
|
boolean judge = false;
|
||||||
|
for (RidingSwardRecord record : entry.getValue()) {
|
||||||
|
// 当前比赛结果不能显示
|
||||||
|
if (record.getTime() >= (nextTime-config.getTime()[1]*TimeUtils.ONE_SECOND)){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// -1是未计算过的参数,需要算值
|
||||||
|
if (record.getState() == -1){
|
||||||
|
// 根据场次获取剧本id
|
||||||
|
Integer scriptId = rankMap.get(record.getTime());
|
||||||
|
if (scriptId == null){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// 剧本信息
|
||||||
|
SRidingSwardResult swardResult = resultMap.get(scriptId);
|
||||||
|
int winnerId = 0;
|
||||||
|
for (int i = 0; i < swardResult.getResult().length; i++) {
|
||||||
|
if (swardResult.getResult()[i][0] == 1){
|
||||||
|
winnerId = i+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 获胜剑id
|
||||||
|
record.setWinnerId(winnerId);
|
||||||
|
// 竞猜结果
|
||||||
|
int result = winnerId == record.getBetSwardId()?1:0;
|
||||||
|
record.setResult(result);
|
||||||
|
// 可领取得奖励数量
|
||||||
|
int getNum = (config.getLoseRate()/10000) * record.getBetNum();
|
||||||
|
if (result == 1){
|
||||||
|
getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000);
|
||||||
|
}
|
||||||
|
record.setGetNum(getNum);
|
||||||
|
// 领取状态
|
||||||
|
record.setState(0);
|
||||||
|
judge = true;
|
||||||
|
}
|
||||||
|
// 结果
|
||||||
|
CommonProto.RidingSwardRecord.Builder builder = CommonProto.RidingSwardRecord.newBuilder()
|
||||||
|
.setTime(record.getTime())// 赛场时间
|
||||||
|
.setCostNum(record.getBetNum())// 投注数量
|
||||||
|
.setBetSwardId(record.getBetSwardId())// 押注的剑
|
||||||
|
.setState(record.getState())// 领取状态
|
||||||
|
.setWinnerId(record.getWinnerId())// 获胜的剑
|
||||||
|
.setGetNum(record.getGetNum())// 可领取数量
|
||||||
|
.setResult(record.getResult()); // 输赢结果
|
||||||
|
list.add(builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新缓存对象类型
|
||||||
|
if (judge){
|
||||||
|
RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(entry.getKey()),entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前竞猜信息
|
||||||
|
* @param uid
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private List<CommonProto.RidingSwardBet> getRidingSwardBet(int uid){
|
||||||
|
List<CommonProto.RidingSwardBet> list = new ArrayList<>();
|
||||||
|
// 比赛记录,key:场次时间戳,value:剧本id
|
||||||
|
List<RidingSwardRecord> records = getRecordList(uid).get(nextTime);
|
||||||
|
if (records != null){
|
||||||
|
for (RidingSwardRecord record : records) {
|
||||||
|
// 竞猜信息
|
||||||
|
CommonProto.RidingSwardBet.Builder builder = CommonProto.RidingSwardBet.newBuilder();
|
||||||
|
builder.setSwardId(record.getBetSwardId());
|
||||||
|
builder.setCostNum(record.getBetNum());
|
||||||
|
list.add(builder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取排行榜
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private Map<Long, Integer> getRankMap(){
|
||||||
|
Map<Long, Integer> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", Long.class, Integer.class);
|
||||||
|
if (map == null){
|
||||||
|
return new HashMap<>();
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 投注记录,key:场次时间戳,value:竞猜记录信息
|
||||||
|
*/
|
||||||
|
private Map<Long, List<RidingSwardRecord>> getRecordList(int uid){
|
||||||
|
Type valueType = new TypeToken<List<RidingSwardRecord>>() {}.getType();
|
||||||
|
Map<Long, List<RidingSwardRecord>> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid), Long.class, valueType);
|
||||||
|
if (map == null){
|
||||||
|
map = new HashMap<>();
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getRankKey(){
|
||||||
|
return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, "");
|
||||||
|
}
|
||||||
|
private String getRecordKey(int uid){
|
||||||
|
return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 零点清理御剑行数据
|
||||||
|
* @param user
|
||||||
|
*/
|
||||||
|
public void zeroClearRidingSwardByUser(User user){
|
||||||
|
// 玩家信息清理
|
||||||
|
user.getPlayerInfoManager().setRidingSwardNum(0);
|
||||||
|
// 玩家记录信息
|
||||||
|
RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRecordKey(user.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 零点清理御剑行数据
|
||||||
|
* @param user
|
||||||
|
*/
|
||||||
|
public void zeroClearRidingSwardByRank(){
|
||||||
|
try {
|
||||||
|
RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*7/1000,getRankKey());
|
||||||
|
// 初始化第二天的比赛数据
|
||||||
|
getInstance().createExecuteScript();
|
||||||
|
}catch (Exception e){
|
||||||
|
LOGGER.error("零点处理御剑行排行数据报错,{}",e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package com.ljsd.jieling.logic.ridingSward;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author hj
|
||||||
|
* @Date 2021/10/11 17:27:10
|
||||||
|
* @Description:
|
||||||
|
* @Version 1.0
|
||||||
|
*/
|
||||||
|
public class RidingSwardRecord {
|
||||||
|
private long time;
|
||||||
|
private int betSwardId;
|
||||||
|
private int betNum;
|
||||||
|
// 领取状态,0:未领取,1:已领取
|
||||||
|
private int state;
|
||||||
|
private int result;
|
||||||
|
private int winnerId;
|
||||||
|
private int getNum;
|
||||||
|
|
||||||
|
public RidingSwardRecord(long time, int betSwardId, int betNum) {
|
||||||
|
this.time = time;
|
||||||
|
this.betSwardId = betSwardId;
|
||||||
|
this.betNum = betNum;
|
||||||
|
this.state = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RidingSwardRecord() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTime() {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTime(long time) {
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBetSwardId() {
|
||||||
|
return betSwardId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBetSwardId(int betSwardId) {
|
||||||
|
this.betSwardId = betSwardId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBetNum() {
|
||||||
|
return betNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBetNum(int betNum) {
|
||||||
|
this.betNum = betNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(int state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResult(int result) {
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWinnerId() {
|
||||||
|
return winnerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWinnerId(int winnerId) {
|
||||||
|
this.winnerId = winnerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGetNum() {
|
||||||
|
return getNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGetNum(int getNum) {
|
||||||
|
this.getNum = getNum;
|
||||||
|
}
|
||||||
|
}
|
|
@ -32,6 +32,7 @@ import com.ljsd.jieling.logic.help.HelpHeroLogic;
|
||||||
import com.ljsd.jieling.logic.mail.MailLogic;
|
import com.ljsd.jieling.logic.mail.MailLogic;
|
||||||
import com.ljsd.jieling.logic.question.QuestionLogic;
|
import com.ljsd.jieling.logic.question.QuestionLogic;
|
||||||
import com.ljsd.jieling.logic.rank.CrossRankManager;
|
import com.ljsd.jieling.logic.rank.CrossRankManager;
|
||||||
|
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
|
||||||
import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic;
|
import com.ljsd.jieling.logic.sevenworld.SevenWorldLogic;
|
||||||
import com.ljsd.jieling.logic.store.BuyGoodsNewLogic;
|
import com.ljsd.jieling.logic.store.BuyGoodsNewLogic;
|
||||||
import com.ljsd.jieling.logic.store.StoreLogic;
|
import com.ljsd.jieling.logic.store.StoreLogic;
|
||||||
|
@ -61,7 +62,6 @@ public class MinuteTask extends Thread {
|
||||||
LOGGER.info("MinuteTask start...");
|
LOGGER.info("MinuteTask start...");
|
||||||
LOGGER.info("online use num::"+ OnlineUserManager.sessionMap.entrySet().size());
|
LOGGER.info("online use num::"+ OnlineUserManager.sessionMap.entrySet().size());
|
||||||
//TODO 每分钟逻辑通过监听事件处理 已经迁移活动和热更新
|
//TODO 每分钟逻辑通过监听事件处理 已经迁移活动和热更新
|
||||||
HotfixUtil.getInstance();
|
|
||||||
Poster.getPoster().dispatchEvent(new MinuteTaskEvent());
|
Poster.getPoster().dispatchEvent(new MinuteTaskEvent());
|
||||||
|
|
||||||
AreaManager.getInstance().processAddServerAreaIsChange();
|
AreaManager.getInstance().processAddServerAreaIsChange();
|
||||||
|
@ -81,20 +81,6 @@ public class MinuteTask extends Thread {
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
LOGGER.error("Exception::=>{}",e.toString());
|
LOGGER.error("Exception::=>{}",e.toString());
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
// 四灵试炼开启状态刷新
|
|
||||||
if (TimeUtils.getHourOfDay() == 0 && TimeUtils.getMiunte() == 0){
|
|
||||||
FourChallengeLogic.getInstance().check();
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
LOGGER.error("Exception::=>{}",e.toString());
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// 助战英雄,redis缓存清空,此清理需要在everyZeroTask()之后,在everyZeroTask中有调用redis缓存得东西
|
|
||||||
HelpHeroLogic.getInstance().zeroClearRedisHelp();
|
|
||||||
}catch (Exception e){
|
|
||||||
LOGGER.error("Exception::=>{}",e.toString());
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
everyZeroTask();
|
everyZeroTask();
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
|
@ -218,29 +204,37 @@ public class MinuteTask extends Thread {
|
||||||
|
|
||||||
//每日凌晨零点执行
|
//每日凌晨零点执行
|
||||||
private void everyZeroTask(){
|
private void everyZeroTask(){
|
||||||
Calendar calendar = Calendar.getInstance();
|
if(TimeUtils.getHourOfDay() == 0 && TimeUtils.getMiunte() == 0){
|
||||||
int hour = calendar.get(Calendar.HOUR_OF_DAY);
|
|
||||||
int minute = calendar.get(Calendar.MINUTE);
|
|
||||||
if(hour == 0 && minute ==0){
|
|
||||||
|
|
||||||
//保证每分钟线程
|
//保证每分钟线程
|
||||||
try {
|
try {
|
||||||
|
// 计算世界等级
|
||||||
GlobleSystemLogic.getInstence().calCulRank();
|
GlobleSystemLogic.getInstence().calCulRank();
|
||||||
|
// 四灵开启状态检查
|
||||||
|
FourChallengeLogic.getInstance().check();
|
||||||
|
// 助战
|
||||||
|
HelpHeroLogic.getInstance().zeroClearRedisHelp();
|
||||||
|
// 御剑行处理
|
||||||
|
RidingSwardLogic.getInstance().zeroClearRidingSwardByRank();
|
||||||
|
|
||||||
|
// 公会信息处理
|
||||||
Map<Integer, GuildInfo> guildInfoMap = GuilidManager.guildInfoMap;
|
Map<Integer, GuildInfo> guildInfoMap = GuilidManager.guildInfoMap;
|
||||||
for(Map.Entry<Integer,GuildInfo> guildInfoEntry:guildInfoMap.entrySet()){
|
for(Map.Entry<Integer,GuildInfo> guildInfoEntry:guildInfoMap.entrySet()){
|
||||||
|
// 公会红包排行处理
|
||||||
RedisUtil.getInstence().del(RedisKey.getKey(RedisKey.GUILD_RED_PACKAGE_RANK,String.valueOf(guildInfoEntry.getKey()),false));
|
RedisUtil.getInstence().del(RedisKey.getKey(RedisKey.GUILD_RED_PACKAGE_RANK,String.valueOf(guildInfoEntry.getKey()),false));
|
||||||
|
// 公会祭祀处理
|
||||||
guildInfoEntry.getValue().reSetFete();
|
guildInfoEntry.getValue().reSetFete();
|
||||||
LOGGER.info("{}更新公会祭祀完毕",guildInfoEntry.getValue().getName());
|
LOGGER.info("{}更新公会祭祀完毕",guildInfoEntry.getValue().getName());
|
||||||
|
// 公会援助日志处理
|
||||||
GuildInfo guildInfo = guildInfoEntry.getValue();
|
GuildInfo guildInfo = guildInfoEntry.getValue();
|
||||||
// 公会援助日志
|
|
||||||
guildInfo.clearGuildHelpLog();
|
guildInfo.clearGuildHelpLog();
|
||||||
// 公会援助刷新
|
// 公会援助刷新
|
||||||
Set<Integer> sendUids = new HashSet<>();
|
Set<Integer> sendUids = new HashSet<>();
|
||||||
for (Set<Integer> items : guildInfo.getMembers().values()) {
|
guildInfo.getMembers().values().forEach(sendUids::addAll);
|
||||||
sendUids.addAll(items);
|
|
||||||
}
|
|
||||||
for (Integer sendUid : sendUids) {
|
for (Integer sendUid : sendUids) {
|
||||||
User target = UserManager.getUserInMem(sendUid);
|
User target = UserManager.getUserNotCache(sendUid);
|
||||||
|
if (target == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
AyyncWorker ayyncWorker = new AyyncWorker(target, true, user -> {
|
AyyncWorker ayyncWorker = new AyyncWorker(target, true, user -> {
|
||||||
GuildLogic.sendGuildHelpRewardEmail(target);
|
GuildLogic.sendGuildHelpRewardEmail(target);
|
||||||
GuildMyInfo guildMyInfo = target.getGuildMyInfo();
|
GuildMyInfo guildMyInfo = target.getGuildMyInfo();
|
||||||
|
|
|
@ -0,0 +1,189 @@
|
||||||
|
package com.ljsd.jieling.util;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import util.TimeUtils;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ScheduledFuture;
|
||||||
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:biezhi.me@gmail.com" target="_blank">biezhi</a>
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public abstract class TaskKit {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(TaskKit.class);
|
||||||
|
|
||||||
|
private static ScheduledThreadPoolExecutor taskScheduler = new ScheduledThreadPoolExecutor(getBestPoolSize());
|
||||||
|
private static List<Timer> timerList = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 立即启动,并以固定的频率来运行任务。后续任务的启动时间不受前次任务延时影响。
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param periodSeconds 每次执行任务的间隔时间(单位秒)
|
||||||
|
*/
|
||||||
|
public static ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long periodSeconds) {
|
||||||
|
return scheduleAtFixedRate(task, 0, periodSeconds, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的延时之后开始以固定的频率来运行任务。后续任务的启动时间不受前次任务延时影响。
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param initialDelay 首次执行任务的延时时间
|
||||||
|
* @param period 每次执行任务的间隔时间(单位秒)
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit) {
|
||||||
|
return taskScheduler.scheduleAtFixedRate(task, initialDelay, period, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的时间点开始以固定的频率运行任务。后续任务的启动时间不受前次任务延时影响。
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param startTime 首次运行的时间点,支持 "yyyy-MM-dd HH:mm:ss" 格式
|
||||||
|
* @param period 每次执行任务的间隔时间
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static void scheduleAtFixedRate(Runnable task, String startTime, long period, TimeUnit unit) throws ParseException {
|
||||||
|
Date dt = TimeUtils.dateFormat(startTime);
|
||||||
|
scheduleAtFixedRate(task, dt, period, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的时间点开始以固定的频率运行任务。后续任务的启动时间不受前次任务延时影响。
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param startTime 首次运行的时间点
|
||||||
|
* @param period 每次执行任务的间隔时间
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static void scheduleAtFixedRate(final Runnable task, Date startTime, final long period, final TimeUnit unit) {
|
||||||
|
final Timer timer = new Timer();
|
||||||
|
timer.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
taskScheduler.scheduleAtFixedRate(task, 0, period, unit);
|
||||||
|
timer.cancel();
|
||||||
|
timerList.remove(timer);
|
||||||
|
}
|
||||||
|
}, startTime);
|
||||||
|
timerList.add(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 立即启动,两次任务间保持固定的时间间隔
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param periodSeconds 两次任务的间隔时间(单位秒)
|
||||||
|
*/
|
||||||
|
public static ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long periodSeconds) {
|
||||||
|
return scheduleWithFixedDelay(task, 0, periodSeconds, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的延时之后启动,两次任务间保持固定的时间间隔
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param initialDelay 首次执行任务的延时时间
|
||||||
|
* @param period 两次任务的间隔时间(单位秒)
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long initialDelay, long period, TimeUnit unit) {
|
||||||
|
return taskScheduler.scheduleWithFixedDelay(task, initialDelay, period, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的时间点启动,两次任务间保持固定的时间间隔
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param startTime 首次运行的时间点,支持 "yyyy-MM-dd HH:mm:ss" 格式
|
||||||
|
* @param period 两次任务的间隔时间
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static void scheduleWithFixedDelay(Runnable task, String startTime, long period, TimeUnit unit) throws ParseException {
|
||||||
|
Date dt = TimeUtils.dateFormat(startTime);
|
||||||
|
scheduleWithFixedDelay(task, dt, period, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在指定的时间点启动,两次任务间保持固定的时间间隔
|
||||||
|
* @param task 具体待执行的任务
|
||||||
|
* @param startTime 首次运行的时间点
|
||||||
|
* @param period 两次任务的间隔时间
|
||||||
|
* @param unit 时间单位
|
||||||
|
*/
|
||||||
|
public static void scheduleWithFixedDelay(final Runnable task, Date startTime, final long period, final TimeUnit unit) {
|
||||||
|
final Timer timer = new Timer();
|
||||||
|
timer.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
taskScheduler.scheduleWithFixedDelay(task, 0, period, unit);
|
||||||
|
timer.cancel();
|
||||||
|
timerList.remove(timer);
|
||||||
|
}
|
||||||
|
}, startTime);
|
||||||
|
timerList.add(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调整线程池大小
|
||||||
|
* @param threadPoolSize
|
||||||
|
*/
|
||||||
|
public static void resizeThreadPool(int threadPoolSize) {
|
||||||
|
taskScheduler.setCorePoolSize(threadPoolSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回定时任务线程池,可做更高级的应用
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ScheduledThreadPoolExecutor getTaskScheduler() {
|
||||||
|
return taskScheduler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭定时任务服务
|
||||||
|
* <p>系统关闭时可调用此方法终止正在执行的定时任务,一旦关闭后不允许再向线程池中添加任务,否则会报RejectedExecutionException异常</p>
|
||||||
|
*/
|
||||||
|
public static void depose() {
|
||||||
|
int timerNum = timerList.size();
|
||||||
|
//清除Timer
|
||||||
|
synchronized (timerList) {
|
||||||
|
for (Timer t: timerList)
|
||||||
|
t.cancel();
|
||||||
|
timerList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Runnable> awaitingExecution = taskScheduler.shutdownNow();
|
||||||
|
LOGGER.info("Tasks stopping. Tasks awaiting execution: {}", timerNum + awaitingExecution.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重启动定时任务服务
|
||||||
|
*/
|
||||||
|
public static void reset() {
|
||||||
|
depose();
|
||||||
|
taskScheduler = new ScheduledThreadPoolExecutor(3);
|
||||||
|
LOGGER.info("定时器线程启动,线程数量:{}",3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据 Java 虚拟机可用处理器数目返回最佳的线程数。<br>
|
||||||
|
* 最佳的线程数 = CPU可用核心数 / (1 - 阻塞系数),其中阻塞系数这里设为0.9
|
||||||
|
*/
|
||||||
|
private static int getBestPoolSize() {
|
||||||
|
try {
|
||||||
|
// JVM可用处理器的个数
|
||||||
|
final int cores = Runtime.getRuntime().availableProcessors();
|
||||||
|
// 最佳的线程数 = CPU可用核心数 / (1 - 阻塞系数)
|
||||||
|
// TODO 阻塞系数是不是需要有个setter方法能让使用者自由设置呢?
|
||||||
|
return (int)(cores / (1 - 0.9));
|
||||||
|
}
|
||||||
|
catch (Throwable e) {
|
||||||
|
// 异常发生时姑且返回10个任务线程池
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package config;
|
||||||
|
|
||||||
|
import manager.STableManager;
|
||||||
|
import manager.Table;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Table(name ="RidingSwardConfig")
|
||||||
|
public class SRidingSwardConfig implements BaseConfig {
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private int joinCount;
|
||||||
|
|
||||||
|
private int[] joinCost;
|
||||||
|
|
||||||
|
private int[] maxRaiseNum;
|
||||||
|
|
||||||
|
private int winRate;
|
||||||
|
|
||||||
|
private int loseRate;
|
||||||
|
|
||||||
|
private int[] rateList;
|
||||||
|
|
||||||
|
private int[] time;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() throws Exception {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getJoinCount() {
|
||||||
|
return joinCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] getJoinCost() {
|
||||||
|
return joinCost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] getMaxRaiseNum() {
|
||||||
|
return maxRaiseNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWinRate() {
|
||||||
|
return winRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLoseRate() {
|
||||||
|
return loseRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] getRateList() {
|
||||||
|
return rateList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] getTime() {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package config;
|
||||||
|
|
||||||
|
import manager.Table;
|
||||||
|
|
||||||
|
@Table(name ="RidingSwardResult")
|
||||||
|
public class SRidingSwardResult implements BaseConfig {
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private int[][] result;
|
||||||
|
|
||||||
|
private int rate;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() throws Exception {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[][] getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRate() {
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue