循环活动初版
parent
702bc42abd
commit
19fbf52c46
|
|
@ -901,4 +901,16 @@ public class TimeUtils {
|
||||||
public static long getToTomorrowTimeS(){
|
public static long getToTomorrowTimeS(){
|
||||||
return getTomorrowZero() - now();
|
return getTomorrowZero() - now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给定三个时间,一个开始时间,一个间隔时间,一个当前时间
|
||||||
|
* 计算距离当前时间最近的开始时间,两个开始时间需间隔一个间隔时间
|
||||||
|
* @param startTimeMillis 开始时间
|
||||||
|
* @param currentMillis 当前时间
|
||||||
|
* @param intervalMillis 间隔时间
|
||||||
|
* @return 最近得开始时间
|
||||||
|
*/
|
||||||
|
public static long getLatelyTime(long startTimeMillis, long currentMillis, long intervalMillis){
|
||||||
|
return startTimeMillis + (currentMillis - startTimeMillis) / intervalMillis * intervalMillis;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -229,7 +229,7 @@ public abstract class AbstractActivity implements IActivity, IEventHandler {
|
||||||
User user = UserManager.getUser(session.getUid());
|
User user = UserManager.getUser(session.getUid());
|
||||||
List<int[][]> itemArrs = new LinkedList<>();
|
List<int[][]> itemArrs = new LinkedList<>();
|
||||||
getAllMissRewards(user, session, itemArrs);
|
getAllMissRewards(user, session, itemArrs);
|
||||||
if (itemArrs.size() == 0) {
|
if (itemArrs.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id);
|
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id);
|
||||||
|
|
|
||||||
|
|
@ -190,22 +190,22 @@ public class ActivityLogic implements IEventHandler{
|
||||||
openActivityIds.remove(id);
|
openActivityIds.remove(id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long gapEndTime = endTime+sGlobalActivity.getGapTime()*TimeUtils.DAY;
|
long gapEndTime = endTime + sGlobalActivity.getGapTime() * TimeUtils.DAY;
|
||||||
if (endTime != 0 && now > endTime) {
|
if (endTime != 0 && now > endTime) {
|
||||||
if (!openActivityIds.contains(id)) {
|
if (!openActivityIds.contains(id)) {
|
||||||
if(now<gapEndTime){
|
if(now < gapEndTime){
|
||||||
openActivityIds.add(id);
|
openActivityIds.add(id);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(now>gapEndTime){
|
if(now > gapEndTime){
|
||||||
openActivityIds.remove(id);
|
openActivityIds.remove(id);
|
||||||
}
|
}
|
||||||
if (null == activity) {
|
if (null == activity) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//活動結束 預約的展示期間
|
//活動結束 預約的展示期間
|
||||||
if(now<gapEndTime){
|
if(now < gapEndTime){
|
||||||
GlobalSystemControl globalSystemControl = GlobalSystemControl.getGlobalSystemControl();
|
GlobalSystemControl globalSystemControl = GlobalSystemControl.getGlobalSystemControl();
|
||||||
HashMap<Integer, Long> activityPreMap = globalSystemControl.getActivityPreEnd();
|
HashMap<Integer, Long> activityPreMap = globalSystemControl.getActivityPreEnd();
|
||||||
if(activityPreMap.containsKey(id)){
|
if(activityPreMap.containsKey(id)){
|
||||||
|
|
@ -422,7 +422,7 @@ public class ActivityLogic implements IEventHandler{
|
||||||
}
|
}
|
||||||
} else if (activityMissionMap.containsKey(activityId)) {
|
} else if (activityMissionMap.containsKey(activityId)) {
|
||||||
//如果活动没有开启,但是玩家有这个活动的数据,则清除,并通知客户端活动关闭
|
//如果活动没有开启,但是玩家有这个活动的数据,则清除,并通知客户端活动关闭
|
||||||
if(TimeUtils.now() < startTime){
|
if(now < startTime && time != ActivityType.OPEN_TYPE_CYCLE){
|
||||||
LOGGER.info("[活动延期,清除遗留玩家数据] [uid:{}] [activityId:{}] [activityType:{}] [activityStartTime:{}]",user.getId(),activityId, type, startTimeLong);
|
LOGGER.info("[活动延期,清除遗留玩家数据] [uid:{}] [activityId:{}] [activityType:{}] [activityStartTime:{}]",user.getId(),activityId, type, startTimeLong);
|
||||||
activityMissionMap.remove(activityId);
|
activityMissionMap.remove(activityId);
|
||||||
if (builder != null) {
|
if (builder != null) {
|
||||||
|
|
@ -430,12 +430,13 @@ public class ActivityLogic implements IEventHandler{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
boolean isRemove = now > gepTimeLong;
|
||||||
if (time == ActivityType.OPEN_TYPE_ROLE) {//创角
|
if (time == ActivityType.OPEN_TYPE_ROLE) {//创角
|
||||||
if (now < startTime) {
|
if (now < startTime) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (endTime != 0 && now > endTime) {
|
if (endTime != 0 && now > endTime) {
|
||||||
goRewardActivity(user,activityId,builder,now > gepTimeLong);
|
goRewardActivity(user,activityId,builder, isRemove);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean checked = checkStateAndInitFromActivity(user, activityId);
|
boolean checked = checkStateAndInitFromActivity(user, activityId);
|
||||||
|
|
@ -444,26 +445,47 @@ public class ActivityLogic implements IEventHandler{
|
||||||
}
|
}
|
||||||
openNewActivityIds.add(activityId);
|
openNewActivityIds.add(activityId);
|
||||||
}
|
}
|
||||||
if (time == ActivityType.OPEN_TYPE_CYCLE){// 循环
|
else if (time == ActivityType.OPEN_TYPE_CYCLE){//循环
|
||||||
ActivityMission mission = activityMissionMap.get(activityId);
|
// 循环时间
|
||||||
if (mission == null){
|
long cycleTime = sGlobalActivity.getCycleMinute() * TimeUtils.ONE_MINUTE;
|
||||||
|
// 最近的开始时间
|
||||||
|
long latelyStartTime = TimeUtils.getLatelyTime(startTime, now, cycleTime);
|
||||||
|
// 当前期活动未开始
|
||||||
|
if (now < latelyStartTime) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long creatTime = mission.getCreatTime();
|
// 最近的结束时间
|
||||||
// 活动创建时间在当前开始时间之前,表示开启了新一期活动
|
long latelyEndTime = latelyStartTime + (endTime - startTime);
|
||||||
//
|
|
||||||
if (creatTime < startTimeLong && now > gepTimeLong){
|
ActivityMission mission = activityMissionMap.get(activityId);
|
||||||
checkStateAndInitFromActivity(user, activityId);
|
// 活动存在,当前时间大于最近的结束时间,表示当期活动结束
|
||||||
|
if (mission != null && now > latelyEndTime){
|
||||||
|
goRewardActivity(user,activityId,builder, isRemove);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
if (now > latelyEndTime){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (mission == null){
|
||||||
|
boolean checked = checkStateAndInitFromActivity(user, activityId);
|
||||||
|
if (checked){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openNewActivityIds.add(activityId);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
goRewardActivity(user,activityId,builder,now > gepTimeLong);
|
goRewardActivity(user,activityId,builder, isRemove);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return openNewActivityIds;
|
return openNewActivityIds;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化活动并校验活动状态是否开启
|
||||||
|
* @return true 未开启, false 开启
|
||||||
|
*/
|
||||||
private boolean checkStateAndInitFromActivity(User user, int activityId) throws Exception {
|
private boolean checkStateAndInitFromActivity(User user, int activityId) throws Exception {
|
||||||
ActivityManager activityManager = user.getActivityManager();
|
ActivityManager activityManager = user.getActivityManager();
|
||||||
initAllActivityMission(activityManager.getActivityMissionMap(),activityId);
|
initAllActivityMission(activityManager.getActivityMissionMap(),activityId);
|
||||||
|
|
@ -477,19 +499,21 @@ public class ActivityLogic implements IEventHandler{
|
||||||
return activityOpenState == ActivityType.UNOPEN_STATE;
|
return activityOpenState == ActivityType.UNOPEN_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 活动结束,(存在发奖操作,看配置)删除活动
|
||||||
|
*/
|
||||||
private static void goRewardActivity(User user,int activityId,PlayerInfoProto.ActivityUpateIndication.Builder builder,boolean isRemoveInfo) throws Exception {
|
private static void goRewardActivity(User user,int activityId,PlayerInfoProto.ActivityUpateIndication.Builder builder,boolean isRemoveInfo) throws Exception {
|
||||||
ActivityMission activityMission = user.getActivityManager().getActivityMissionMap().get(activityId);
|
ActivityMission activityMission = user.getActivityManager().getActivityMissionMap().get(activityId);
|
||||||
if (activityMission != null) {
|
if (activityMission != null) {
|
||||||
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(activityId);
|
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(activityId);
|
||||||
if (null==abstractActivity) {
|
if (null == abstractActivity) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(activityMission.getOpenType()!=ActivityType.CLOSE_STATE){
|
if(activityMission.getOpenType() != ActivityType.CLOSE_STATE){
|
||||||
abstractActivity.onActivityEndSelfWithDealReward(user);
|
abstractActivity.onActivityEndSelfWithDealReward(user);
|
||||||
abstractActivity.setOpenState(user,ActivityType.CLOSE_STATE);
|
abstractActivity.setOpenState(user,ActivityType.CLOSE_STATE);
|
||||||
Poster.getPoster().dispatchEvent(new ActivityStateChangeEvent(user.getId(),activityId,ActivityType.CLOSE_STATE));
|
Poster.getPoster().dispatchEvent(new ActivityStateChangeEvent(user.getId(),activityId,ActivityType.CLOSE_STATE));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isRemoveInfo){
|
if(isRemoveInfo){
|
||||||
user.getActivityManager().getActivityMissionMap().remove(activityId);
|
user.getActivityManager().getActivityMissionMap().remove(activityId);
|
||||||
LOGGER.info("the uid={},remove the activity id ={}", user.getId(), activityId);
|
LOGGER.info("the uid={},remove the activity id ={}", user.getId(), activityId);
|
||||||
|
|
@ -562,15 +586,17 @@ public class ActivityLogic implements IEventHandler{
|
||||||
if(sGlobalActivity == null){
|
if(sGlobalActivity == null){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
int type = sGlobalActivity.getType();
|
||||||
|
int gapTime = sGlobalActivity.getGapTime();
|
||||||
///旧版积天豪礼数据兼容
|
///旧版积天豪礼数据兼容
|
||||||
if (sGlobalActivity.getType()==ActivityType.RECHARGE_SUM_DAY){
|
if (type ==ActivityType.RECHARGE_SUM_DAY){
|
||||||
if (activityMissionMap.get(activityId).getV()<=0||activityMissionMap.get(activityId).getV()>=15) {
|
if (activityMissionMap.get(activityId).getV()<=0||activityMissionMap.get(activityId).getV()>=15) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(activityStatus == ActivityType.CLOSE_STATE){
|
if(activityStatus == ActivityType.CLOSE_STATE){
|
||||||
long prepareTime = ToolsUtil.getEndTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),0, sGlobalActivity.getGapTime());
|
long prepareTime = ToolsUtil.getEndTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),0, gapTime);
|
||||||
activityInfoList.add(CommonProto.ActivityInfo.newBuilder().setActivityId(activityId).setEndTime((int)(prepareTime/1000)).build());
|
activityInfoList.add(CommonProto.ActivityInfo.newBuilder().setActivityId(activityId).setEndTime((int)(prepareTime/1000)).build());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -594,24 +620,29 @@ public class ActivityLogic implements IEventHandler{
|
||||||
if (sGlobalActivity.getIsSaving()==0 && activityStatus != ActivityType.OPEN_STATE) {
|
if (sGlobalActivity.getIsSaving()==0 && activityStatus != ActivityType.OPEN_STATE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int startTime,endTime;
|
int startTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 1) / 1000);
|
||||||
if(sGlobalActivity.getType() == ActivityType.DAILY_PREFERENTIAL_GIFT){
|
int endTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 2) / 1000);;
|
||||||
startTime=(int)(activityState.getValue().getCreatTime()/1000);
|
|
||||||
|
if(type == ActivityType.DAILY_PREFERENTIAL_GIFT){ // 每日特惠活动
|
||||||
|
startTime = (int)(activityState.getValue().getCreatTime()/1000);
|
||||||
endTime = startTime+604800;
|
endTime = startTime+604800;
|
||||||
}else{
|
}
|
||||||
startTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 1) / 1000);
|
else if (sGlobalActivity.getTime() == ActivityType.OPEN_TYPE_CYCLE){
|
||||||
if(sGlobalActivity.getGapTime()!=0){
|
long now = TimeUtils.now();
|
||||||
endTime = (int) (ToolsUtil.getEndTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, sGlobalActivity.getGapTime()) / 1000);
|
long cycleTime = sGlobalActivity.getCycleMinute() * TimeUtils.ONE_MINUTE;
|
||||||
}else{
|
long latelyStarTime = TimeUtils.getLatelyTime(startTime * 1000L, now, cycleTime);
|
||||||
endTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 2) / 1000);
|
startTime = (int) (latelyStarTime/1000);
|
||||||
}
|
endTime = (int) ((latelyStarTime + cycleTime + TimeUtils.DAY * gapTime)/1000);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
endTime = endTime + (int) (TimeUtils.DAY * gapTime / 1000);
|
||||||
}
|
}
|
||||||
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(sGlobalActivity.getId());
|
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(sGlobalActivity.getId());
|
||||||
if(abstractActivity==null){
|
if(abstractActivity==null){
|
||||||
LOGGER.error(sGlobalActivity.getId()+":活动类型不存在");
|
LOGGER.error(sGlobalActivity.getId()+":活动类型不存在");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
List<CommonProto.ActivityInfo.MissionInfo> missionInfos =abstractActivity.getAllMissInfo(user,activityMission);
|
List<CommonProto.ActivityInfo.MissionInfo> missionInfos = abstractActivity.getAllMissInfo(user,activityMission);
|
||||||
CommonProto.ActivityInfo build = CommonProto.ActivityInfo.newBuilder()
|
CommonProto.ActivityInfo build = CommonProto.ActivityInfo.newBuilder()
|
||||||
.setActivityId(activityId)
|
.setActivityId(activityId)
|
||||||
.addAllMission(missionInfos)
|
.addAllMission(missionInfos)
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ public interface ActivityType {
|
||||||
int OPEN_TYPE_ROLE = 2; // 活动开启类型:创角时间
|
int OPEN_TYPE_ROLE = 2; // 活动开启类型:创角时间
|
||||||
int OPEN_TYPE_SERVER = 3; // 活动开启类型:开服时间
|
int OPEN_TYPE_SERVER = 3; // 活动开启类型:开服时间
|
||||||
int OPEN_TYPE_MONTHS = 5; // 活动开启类型:开服自然月
|
int OPEN_TYPE_MONTHS = 5; // 活动开启类型:开服自然月
|
||||||
int OPEN_TYPE_CYCLE = 6; // 循环活动
|
int OPEN_TYPE_CYCLE = 6; // 活动开启类型:循环活动
|
||||||
|
|
||||||
|
|
||||||
int WILL_TAKE = 0; //未领取
|
int WILL_TAKE = 0; //未领取
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ public abstract class AbstractMissionType {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Integer> getDoingMissionIds() {
|
public Set<Integer> getDoingMissionIds() {
|
||||||
return doingMissionIds;
|
return doingMissionIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFinishMissionId(int missionId) {
|
public void addFinishMissionId(int missionId) {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,15 @@ import java.util.*;
|
||||||
|
|
||||||
public class ToolsUtil {
|
public class ToolsUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据不同类型获取活动时间
|
||||||
|
* @param startTimeLong 表里面得开始时间
|
||||||
|
* @param endTimeLong 表里面得结束时间
|
||||||
|
* @param time 时间类型
|
||||||
|
* @param createUserTime 创角时间
|
||||||
|
* @param type 1 开始时间, 2 结束时间
|
||||||
|
* @return 时间
|
||||||
|
*/
|
||||||
public static long getTimeLong(long startTimeLong, long endTimeLong, int time, long createUserTime, int type){
|
public static long getTimeLong(long startTimeLong, long endTimeLong, int time, long createUserTime, int type){
|
||||||
long baseTime = startTimeLong;
|
long baseTime = startTimeLong;
|
||||||
if(type == 2){
|
if(type == 2){
|
||||||
|
|
@ -15,7 +24,8 @@ public class ToolsUtil {
|
||||||
}
|
}
|
||||||
long resultTime=0;
|
long resultTime=0;
|
||||||
switch (time){
|
switch (time){
|
||||||
case ActivityType.OPEN_TYPE_TIME:
|
case ActivityType.OPEN_TYPE_TIME://开服时间
|
||||||
|
case ActivityType.OPEN_TYPE_CYCLE://循环活动
|
||||||
resultTime = baseTime;
|
resultTime = baseTime;
|
||||||
break;
|
break;
|
||||||
case ActivityType.OPEN_TYPE_ROLE:
|
case ActivityType.OPEN_TYPE_ROLE:
|
||||||
|
|
@ -41,25 +51,6 @@ public class ToolsUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActivityType.OPEN_TYPE_CYCLE://循环活动
|
|
||||||
long now = TimeUtils.now();
|
|
||||||
// 未到开启时间
|
|
||||||
if (now >= startTimeLong) {
|
|
||||||
long timeLong = endTimeLong - startTimeLong;
|
|
||||||
while (endTimeLong < now){
|
|
||||||
endTimeLong += timeLong;
|
|
||||||
}
|
|
||||||
startTimeLong = endTimeLong - timeLong;
|
|
||||||
}
|
|
||||||
// 开始时间
|
|
||||||
if(type == 1){
|
|
||||||
resultTime = startTimeLong;
|
|
||||||
}
|
|
||||||
// 结束时间
|
|
||||||
if(type == 2){
|
|
||||||
resultTime = endTimeLong;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
// 开始时间
|
// 开始时间
|
||||||
if(type == 1){
|
if(type == 1){
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ public class SGlobalActivity implements BaseConfig {
|
||||||
|
|
||||||
private int time;
|
private int time;
|
||||||
|
|
||||||
|
private int cycleMinute;
|
||||||
|
|
||||||
private long startTimeLong;
|
private long startTimeLong;
|
||||||
|
|
||||||
private long endTimeLong;
|
private long endTimeLong;
|
||||||
|
|
@ -170,6 +172,10 @@ public class SGlobalActivity implements BaseConfig {
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCycleMinute() {
|
||||||
|
return cycleMinute;
|
||||||
|
}
|
||||||
|
|
||||||
public static List<SGlobalActivity> getsGlobalActivityMapByType(int type) {
|
public static List<SGlobalActivity> getsGlobalActivityMapByType(int type) {
|
||||||
return sGlobalActivityMapByType.get(type);
|
return sGlobalActivityMapByType.get(type);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue