御剑行合并

back_recharge
duhui 2021-10-20 13:44:18 +08:00
commit 606b22a670
29 changed files with 1270 additions and 93 deletions

View File

@ -302,6 +302,11 @@ public class TimeUtils {
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
*/
public static long getTomorrowZero() {
@ -738,7 +743,7 @@ public class TimeUtils {
}
/**
*
*
* @return
*/
public static long getTomorrowZero2() {
@ -842,7 +847,6 @@ public class TimeUtils {
/**
* 0
* @param now
* @param targetWeekday
* @return
*/

View File

@ -4,8 +4,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.lang.reflect.Array;
import java.security.MessageDigest;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -131,7 +134,12 @@ public class Utils {
return cloneObj;
}
public static int[][] changeList(List<int[]> list){
/**
* intlist
* @param list
* @return
*/
public static int[][] getTwoArrayObject(List<int[]> list){
int[][] objects = new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
objects[i] = list.get(i);
@ -139,4 +147,25 @@ public class Utils {
return objects;
}
/**
* map
*/
public static Object[][] getTwoArrayObject(Map map) {
Object[][] object = null;
if (map != null && !map.isEmpty()) {
int size = map.size();
object = new Object[size][2];
Iterator iterator = map.entrySet().iterator();
for (int i = 0; i < size; i++) {
Map.Entry entry = (Map.Entry) iterator.next();
Object key = entry.getKey();
Object value = entry.getValue();
object[i][0] = key;
object[i][1] = value;
}
}
return object;
}
}

View File

@ -5,6 +5,7 @@ import com.ljsd.jieling.config.json.ServerProperties;
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.hotfix.HotfixUtil;
import com.ljsd.jieling.logic.dao.ServerConfig;
import com.ljsd.jieling.logic.family.CrossDeathPathLogic;
import com.ljsd.jieling.logic.rank.CrossRankManager;
@ -63,6 +64,9 @@ public class GameApplication {
SkyEyeService.getInstance().onStart();
CrossDeathPathLogic.getInstance().serverInit();
CrossRankManager.getInstance().guildCacheHandle();
HotfixUtil.getInstance();
// 开启定时任务
// TaskKit.reset();
//控制台gm
Scanner sc = new Scanner(System.in);
while(sc.hasNext())

View File

@ -38,7 +38,7 @@ public class CarDelayFunction implements FunctionManager {
}
});
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]));
}

View File

@ -402,6 +402,12 @@ public class RedisKey {
*
*/
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<>();//进程排行 合区统一

View File

@ -1,28 +1,26 @@
package com.ljsd.jieling.db.redis;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ljsd.GameApplication;
import com.ljsd.common.mogodb.util.GlobalData;
import com.ljsd.jieling.db.mongo.AreaManager;
import com.ljsd.jieling.util.ConfigurableApplicationContextManager;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.RedisSerializer;
import util.StringUtil;
import util.TimeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.ReturnType;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.util.CollectionUtils;
import redis.clients.jedis.Protocol;
import util.StringUtil;
import util.TimeUtils;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import java.util.regex.Pattern;
@SuppressWarnings("ALL")
@ -164,22 +162,24 @@ public class RedisUtil {
/**
* redis
* @param time
* @param key
*/
public void rename(String... key) {
public void rename(long time, String... key) {
if (key != null && key.length > 0) {
for (int i = 0; i < key.length; i++) {
// 旧名字
String oldName = key[i];
// 新名字
String newName = oldName+"BACK:"+System.currentTimeMillis();
String timeStamp2 = TimeUtils.getTimeStamp(TimeUtils.now());
String newName = oldName+"BACK_"+timeStamp2;
// key是否存在
boolean aBoolean = hasKey(oldName);
if (aBoolean){
// 重命名
redisTemplate.rename(oldName,newName);
// 设置过期时间
expire(newName,60*60*24-60);
expire(newName,time);
}
}
}

View File

@ -174,6 +174,7 @@ public enum ErrorCode implements IErrorCode {
CHAT_NOT_CROSS(143,"聊天检查,没有跨服分组"),
SIXIANG_UP_LIMIT(144,"强化已达上限"),
CROSS_YXLD_OVER(145,"赛季结算中"),
RIDING_SWARD_BET_TWO(146,"一轮比赛最多押注两次!"),
;
private static final Set<Integer> CodeSet = new HashSet<>();

View File

@ -360,5 +360,9 @@ public interface BIReason {
int SEVEN_WORLD_FUNCTION_END = 1212;//七界功能结束
int SEVEN_WORLD_ACTIVITY_END = 1213;//七界活动结束
int SEVEN_WORLD_TREASURE = 1214;//七界秘宝
int RIDING_SWARD_REWARD = 1215;//御剑行领取奖励
int RIDING_SWARD_BET = 1216;//御剑行押注消耗
int LEVEL_UP_REWARD = 1220;// 玩家升级赠与的道具
}

View File

@ -74,7 +74,6 @@ public interface Global {
int LUXURYMONTHCARDID =11;//6豪华月卡 废弃 改版
int WEEKCARDID = 10; //月卡
int MONTHCARDID =1;//1月卡
int LMONTHCARDID =2;//2豪华月卡
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}

View File

@ -0,0 +1,29 @@
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 com.ljsd.jieling.util.MessageUtil;
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 {
ActivityProto.RidingSwardRewardResponse reward = RidingSwardLogic.getInstance().getRidingSwardReward(iSession.getUid(), proto);
MessageUtil.sendMessage(iSession.getUid(),1, MessageTypeProto.MessageType.RidingSwardRewardResponse_VALUE,reward,true);
}
}

View File

@ -39,6 +39,7 @@ import com.ljsd.jieling.logic.mission.data.DataManagerDistributor;
import com.ljsd.jieling.logic.mission.event.MissionEventDistributor;
import com.ljsd.jieling.logic.player.PlayerLogic;
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.store.BuyGoodsNewLogic;
import com.ljsd.jieling.logic.store.StoreLogic;
@ -428,6 +429,8 @@ public class GlobalDataManaager implements IManager {
HelpHeroLogic.getInstance().clearHelpInfo(user);
// 七界推送
SevenWorldLogic.getInstance().sevenWorldInfoIndication(session);
// 御剑行
RidingSwardLogic.getInstance().zeroClearRidingSwardByUser(user);
// GuildChallengeLogic.getInstance().resetBossDamage(user);
if(TimeUtils.isSpanTime(user.getPlayerInfoManager().getLoginTime(),TimeUtils.now(),1,0)){

View File

@ -153,45 +153,44 @@ public class GlobleSystemLogic implements IEventHandler {
* 2 50
*/
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 {
users = MongoUtil.getLjsdMongoTemplate().findAllByCondition(query, User.class);
} catch (Exception e) {
//开服前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 {
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();
}
//如果达不到这些人世界等级就为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() {

View File

@ -1747,7 +1747,7 @@ public class ActivityLogic implements IEventHandler{
}
}
// 处理奖励
int[][] rewards = Utils.changeList(list);
int[][] rewards = Utils.getTwoArrayObject(list);
CommonProto.Drop.Builder drop = ItemUtil.dropPer(user, rewards, BIReason.QIMENDUNJIA_DRAW);
// 事件分发
Poster.getPoster().dispatchEvent(new QiMenDunJiaEvent(user.getId(),activityId,num));

View File

@ -112,4 +112,5 @@ public interface ActivityType {
int XUN_BAO_MI_ZONG = 82;//寻宝迷踪
int SEVEN_WORLD_TREASURE = 83;//七界秘宝
int RIDING_SWARD = 84;//御剑飞行
}

View File

@ -85,6 +85,7 @@ public enum ActivityTypeEnum {
XUN_BAO_MI_ZONG(ActivityType.XUN_BAO_MI_ZONG,XunBaoMiZongActivity::new),
SEVEN_WORLD_TREASURE(ActivityType.SEVEN_WORLD_TREASURE,SevenWorldActivity::new),
LING_LONG_PAVILION(ActivityType.LING_LONG_PAVILION,DefaultEmptyActivity::new),
RIDING_SWARD(ActivityType.RIDING_SWARD,RidingSwardActivity::new),
;
private int type;

View File

@ -1,8 +1,6 @@
package com.ljsd.jieling.logic.activity;
import com.ljsd.jieling.db.redis.RedisKey;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.jbean.ActivityMission;
import com.ljsd.jieling.jbean.ActivityProgressInfo;
@ -15,14 +13,19 @@ import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank;
import com.ljsd.jieling.network.server.ProtocolsManager;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.thread.ThreadManager;
import com.ljsd.jieling.util.AyncWorkerRunnable;
import com.ljsd.jieling.util.AyyncWorker;
import com.ljsd.jieling.util.ItemUtil;
import util.TimeUtils;
import config.*;
import config.SActivityRankingReward;
import config.SActivityRewardConfig;
import config.SErrorCodeEerverConfig;
import config.SGlobalActivity;
import org.springframework.data.redis.core.ZSetOperations;
import util.TimeUtils;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
class ExpectRankActivity extends AbstractActivity {

View File

@ -0,0 +1,67 @@
package com.ljsd.jieling.logic.activity;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.globals.Global;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.mail.MailLogic;
import com.ljsd.jieling.logic.ridingSward.RidingSwardLogic;
import com.ljsd.jieling.logic.ridingSward.RidingSwardRecord;
import config.SErrorCodeEerverConfig;
import config.SRidingSwardConfig;
import manager.STableManager;
import util.TimeUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author hj
*
*/
public class RidingSwardActivity extends AbstractActivity{
public RidingSwardActivity(int id) {
super(id);
}
@Override
public void onActivityEndOnMySelf(User user){
// 关闭活动
RidingSwardLogic.getInstance().checkState();
// 记录数据
Map<Long, List<RidingSwardRecord>> list = RidingSwardLogic.getRecordList(user.getId());
// 配置
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
HashMap<Integer, Integer> map = new HashMap<>();
for (Map.Entry<Long, List<RidingSwardRecord>> entry : list.entrySet()) {
for (RidingSwardRecord record : entry.getValue()) {
// 处理记录
RidingSwardLogic.recordBuild(record,RidingSwardLogic.getRankBack());
// 未领取的记录
if (record.getState() == 0){
Integer num = map.getOrDefault(config.getMaxRaiseNum()[0], 0);
map.put(config.getMaxRaiseNum()[0],num+record.getGetNum());
record.setState(1);
}
}
// 更新数据
RidingSwardLogic.putRecordList(user.getId(),entry.getKey(),entry.getValue());
}
// 有未领取的奖励,发送邮件
if (!map.isEmpty()){
StringBuilder builder = new StringBuilder();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
builder.append(entry.getKey()).append("#").append(entry.getValue()).append("|");
}
String reward = builder.substring(0, builder.length() - 1);
// 标题和内容
String title = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_title");
String content = SErrorCodeEerverConfig.getI18NMessage("RidingSwordReward_mail_txt");
// 发送邮件
MailLogic.getInstance().sendMail(user.getId(),title,content,reward,TimeUtils.nowInt(),Global.MAIL_EFFECTIVE_TIME);
}
// 删除key
RedisUtil.getInstence().rename(TimeUtils.ONE_DAY*3/1000,RidingSwardLogic.getRecordKey(user.getId()));
}
}

View File

@ -7,12 +7,10 @@ import com.ljsd.jieling.jbean.ActivityMission;
import com.ljsd.jieling.jbean.ActivityProgressInfo;
import com.ljsd.jieling.logic.activity.event.IEvent;
import com.ljsd.jieling.logic.activity.event.Poster;
import com.ljsd.jieling.logic.activity.event.SevenWorldIntegralEvent;
import com.ljsd.jieling.logic.activity.event.SuperBoxEvent;
import com.ljsd.jieling.logic.dao.Item;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.logic.item.ItemLogic;
import com.ljsd.jieling.logic.store.newRechargeInfo.bean.ReceiveWelfareBag;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.tools.Utils;
@ -142,7 +140,7 @@ public class SevenWorldActivity extends AbstractActivity {
if (rewardList.isEmpty()){
throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE);
}
int[][] rewards = Utils.changeList(rewardList);
int[][] rewards = Utils.getTwoArrayObject(rewardList);
ItemUtil.drop(user, rewards, drop, BIReason.SEVEN_WORLD_TREASURE);
reportTakeActivityReward(user,treasure.getTreasureReward(),missionId);
// 更新数据库

View File

@ -186,6 +186,9 @@ public class PlayerManager extends MongoBase {
*/
private Map<Integer,Integer> sevenWorldRelic = new HashMap<>();
// 御剑行游玩次数
private int ridingSwardNum;
public PlayerManager(){
this.setRootCollection(User._COLLECTION_NAME);
}
@ -1279,5 +1282,12 @@ public class PlayerManager extends MongoBase {
updateString("sevenWorldRelic",sevenWorldRelic);
}
public int getRidingSwardNum() {
return ridingSwardNum;
}
public void setRidingSwardNum(int ridingSwardNum) {
this.ridingSwardNum = ridingSwardNum;
updateString("ridingSwardNum",ridingSwardNum);
}
}

View File

@ -330,12 +330,13 @@ public class HelpHeroLogic {
* redis
*/
public void zeroClearRedisHelp(){
// 不是零点
if (TimeUtils.getHourOfDay() != 0 || TimeUtils.getMiunte() != 0){
return;
try {
String pattern = GameApplication.serverId +":" + RedisKey.HELP_FIGHT + ".*";
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);
}
/**

View File

@ -0,0 +1,565 @@
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;
putRankBack();
}
// 关闭中,不进行处理
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 = (endTime - startTime) / (bet + competition);
// 总权重
int sum = treeMap.values().stream().mapToInt(SRidingSwardResult::getRate).sum();
// map存储结果
HashMap<String, Integer> result = new HashMap<>();
long time = startTime;
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(endTime));
}
/**
*
* @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 ActivityProto.RidingSwardRewardResponse 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);
}
}
putRecordList(uid,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);
}
}
putRecordList(uid,time,records);
}
// 奖励计算
int[][] changeList = Utils.getTwoArrayObject(result);
CommonProto.Drop.Builder drop = ItemUtil.drop(user, changeList, BIReason.RIDING_SWARD_REWARD);
return ActivityProto.RidingSwardRewardResponse.newBuilder().setDrop(drop).build();
}
/**
*
* @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);
// 验证道具数量
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 cost = ItemUtil.checkCost(user, map);
if (!cost){
throw new ErrorCodeException(ErrorCode.ITEM_NOT_ENOUGH);
}
// 投注记录,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()){
throw new ErrorCodeException(ErrorCode.REFRESH_WHEL_TIME_NOT);
}
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()){
putRecordList(uid,nextTime,records);
}
// 道具消耗
ItemUtil.itemCost(user, map, BIReason.RIDING_SWARD_BET,0);
// 返回消息
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 = getRankMap();
// 配置
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
*/
public List<CommonProto.RidingSwardRecord> getRidingSwardRecord(int uid){
// 返回值
List<CommonProto.RidingSwardRecord> list = new ArrayList<>();
// 投注记录,key:时间戳value竞猜记录信息list
Map<Long, List<RidingSwardRecord>> recordMap = getRecordList(uid);
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;
}
judge = recordBuild(record,getRankMap());
// 结果
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){
putRecordList(uid,entry.getKey(),entry.getValue());
}
}
return list;
}
/**
*
*/
public static boolean recordBuild(RidingSwardRecord record,Map<Long, Integer> rankMap){
// 配置表
Map<Integer, SRidingSwardResult> resultMap = STableManager.getConfig(SRidingSwardResult.class);
SRidingSwardConfig config = STableManager.getConfig(SRidingSwardConfig.class).get(1);
// 不需要处理的数据
if (record.getState() != -1){
return false;
}
// 根据场次获取剧本id
Integer scriptId = rankMap.get(record.getTime());
if (scriptId == null){
return false;
}
// 剧本信息
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);
// 可领取得奖励数量
double getNum = (config.getLoseRate()/10000.0) * record.getBetNum();
if (result == 1){
getNum = record.getBetNum() * (config.getRateList()[winnerId-1]/10000.0);
}
record.setGetNum((int) Math.ceil(getNum));
// 领取状态
record.setState(0);
return true;
}
/**
*
* @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
*/
public static 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;
}
public static String getRankKey(){
return RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, "");
}
/**
*
*/
public void putRankBack(){
// 获取当前排行榜数据
Map<String, Integer> rankMap = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "", String.class, Integer.class);
// 备份数据
RedisUtil.getInstence().putMapEntrys(RedisKey.RIDING_SWARD_RANK, "BACK", rankMap);
// 设置过期时间
String key = RedisUtil.getInstence().getKey(RedisKey.RIDING_SWARD_RANK, "BACK");
RedisUtil.getInstence().expire(key, TimeUtils.ONE_DAY*15/1000);
// 删除旧榜
RedisUtil.getInstence().del(getRankKey());
}
/**
*
* @return
*/
public static Map<Long, Integer> getRankBack(){
Map<Long, Integer> map = RedisUtil.getInstence().getMapValues(RedisKey.RIDING_SWARD_RANK, "BACK", Long.class, Integer.class);
if (map == null){
return new HashMap<>();
}
return map;
}
/**
* ,key:value
*/
public static 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;
}
public static void putRecordList(int uid,long time,List<RidingSwardRecord> records){
RedisUtil.getInstence().putMapEntry(RedisKey.RIDING_SWARD_RECORD, String.valueOf(uid),String.valueOf(time),records);
}
public static 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);
}
}

View File

@ -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;
}
}

View File

@ -33,6 +33,7 @@ import com.ljsd.jieling.logic.help.HelpHeroLogic;
import com.ljsd.jieling.logic.mail.MailLogic;
import com.ljsd.jieling.logic.question.QuestionLogic;
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.store.BuyGoodsNewLogic;
import com.ljsd.jieling.logic.store.StoreLogic;
@ -62,7 +63,6 @@ public class MinuteTask extends Thread {
LOGGER.info("MinuteTask start...");
LOGGER.info("online use num::"+ OnlineUserManager.sessionMap.entrySet().size());
//TODO 每分钟逻辑通过监听事件处理 已经迁移活动和热更新
HotfixUtil.getInstance();
Poster.getPoster().dispatchEvent(new MinuteTaskEvent());
AreaManager.getInstance().processAddServerAreaIsChange();
@ -82,20 +82,6 @@ public class MinuteTask extends Thread {
}catch (Exception e){
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 {
everyZeroTask();
}catch (Exception e){
@ -221,34 +207,43 @@ public class MinuteTask extends Thread {
//每日凌晨零点执行
private void everyZeroTask(){
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
if(hour == 0 && minute ==0){
if(TimeUtils.getHourOfDay() == 0 && TimeUtils.getMiunte() == 0){
//保证每分钟线程
try {
// 计算世界等级
GlobleSystemLogic.getInstence().calCulRank();
ArenaLogic.getInstance().sendReward(GlobalsDef.ARENA_DAILY_REWARD);
if(calendar.get(Calendar.DAY_OF_WEEK) == 2){ //玉虚论道重置
//玉虚论道重置
if(Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == 2){
CrossYuxulundaoLogic.getInstance().initRank();
}
// 四灵开启状态检查
FourChallengeLogic.getInstance().check();
// 助战
HelpHeroLogic.getInstance().zeroClearRedisHelp();
// 御剑行创建新脚本
// RidingSwardLogic.getInstance().createExecuteScript();
// 公会信息处理
Map<Integer, GuildInfo> guildInfoMap = GuilidManager.guildInfoMap;
for(Map.Entry<Integer,GuildInfo> guildInfoEntry:guildInfoMap.entrySet()){
// 公会红包排行处理
RedisUtil.getInstence().del(RedisKey.getKey(RedisKey.GUILD_RED_PACKAGE_RANK,String.valueOf(guildInfoEntry.getKey()),false));
// 公会祭祀处理
guildInfoEntry.getValue().reSetFete();
LOGGER.info("{}更新公会祭祀完毕",guildInfoEntry.getValue().getName());
// 公会援助日志处理
GuildInfo guildInfo = guildInfoEntry.getValue();
// 公会援助日志
guildInfo.clearGuildHelpLog();
// 公会援助刷新
Set<Integer> sendUids = new HashSet<>();
for (Set<Integer> items : guildInfo.getMembers().values()) {
sendUids.addAll(items);
}
guildInfo.getMembers().values().forEach(sendUids::addAll);
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 -> {
GuildLogic.sendGuildHelpRewardEmail(target);
GuildMyInfo guildMyInfo = target.getGuildMyInfo();

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}