循环活动初版
parent
702bc42abd
commit
19fbf52c46
|
@ -901,4 +901,16 @@ public class TimeUtils {
|
|||
public static long getToTomorrowTimeS(){
|
||||
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());
|
||||
List<int[][]> itemArrs = new LinkedList<>();
|
||||
getAllMissRewards(user, session, itemArrs);
|
||||
if (itemArrs.size() == 0) {
|
||||
if (itemArrs.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id);
|
||||
|
|
|
@ -190,22 +190,22 @@ public class ActivityLogic implements IEventHandler{
|
|||
openActivityIds.remove(id);
|
||||
continue;
|
||||
}
|
||||
long gapEndTime = endTime+sGlobalActivity.getGapTime()*TimeUtils.DAY;
|
||||
long gapEndTime = endTime + sGlobalActivity.getGapTime() * TimeUtils.DAY;
|
||||
if (endTime != 0 && now > endTime) {
|
||||
if (!openActivityIds.contains(id)) {
|
||||
if(now<gapEndTime){
|
||||
if(now < gapEndTime){
|
||||
openActivityIds.add(id);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if(now>gapEndTime){
|
||||
if(now > gapEndTime){
|
||||
openActivityIds.remove(id);
|
||||
}
|
||||
if (null == activity) {
|
||||
continue;
|
||||
}
|
||||
//活動結束 預約的展示期間
|
||||
if(now<gapEndTime){
|
||||
if(now < gapEndTime){
|
||||
GlobalSystemControl globalSystemControl = GlobalSystemControl.getGlobalSystemControl();
|
||||
HashMap<Integer, Long> activityPreMap = globalSystemControl.getActivityPreEnd();
|
||||
if(activityPreMap.containsKey(id)){
|
||||
|
@ -422,7 +422,7 @@ public class ActivityLogic implements IEventHandler{
|
|||
}
|
||||
} 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);
|
||||
activityMissionMap.remove(activityId);
|
||||
if (builder != null) {
|
||||
|
@ -430,12 +430,13 @@ public class ActivityLogic implements IEventHandler{
|
|||
}
|
||||
}
|
||||
}
|
||||
boolean isRemove = now > gepTimeLong;
|
||||
if (time == ActivityType.OPEN_TYPE_ROLE) {//创角
|
||||
if (now < startTime) {
|
||||
continue;
|
||||
}
|
||||
if (endTime != 0 && now > endTime) {
|
||||
goRewardActivity(user,activityId,builder,now > gepTimeLong);
|
||||
goRewardActivity(user,activityId,builder, isRemove);
|
||||
continue;
|
||||
}
|
||||
boolean checked = checkStateAndInitFromActivity(user, activityId);
|
||||
|
@ -444,26 +445,47 @@ public class ActivityLogic implements IEventHandler{
|
|||
}
|
||||
openNewActivityIds.add(activityId);
|
||||
}
|
||||
if (time == ActivityType.OPEN_TYPE_CYCLE){// 循环
|
||||
ActivityMission mission = activityMissionMap.get(activityId);
|
||||
if (mission == null){
|
||||
else if (time == ActivityType.OPEN_TYPE_CYCLE){//循环
|
||||
// 循环时间
|
||||
long cycleTime = sGlobalActivity.getCycleMinute() * TimeUtils.ONE_MINUTE;
|
||||
// 最近的开始时间
|
||||
long latelyStartTime = TimeUtils.getLatelyTime(startTime, now, cycleTime);
|
||||
// 当前期活动未开始
|
||||
if (now < latelyStartTime) {
|
||||
continue;
|
||||
}
|
||||
long creatTime = mission.getCreatTime();
|
||||
// 活动创建时间在当前开始时间之前,表示开启了新一期活动
|
||||
//
|
||||
if (creatTime < startTimeLong && now > gepTimeLong){
|
||||
checkStateAndInitFromActivity(user, activityId);
|
||||
// 最近的结束时间
|
||||
long latelyEndTime = latelyStartTime + (endTime - startTime);
|
||||
|
||||
ActivityMission mission = activityMissionMap.get(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 {
|
||||
goRewardActivity(user,activityId,builder,now > gepTimeLong);
|
||||
goRewardActivity(user,activityId,builder, isRemove);
|
||||
}
|
||||
}
|
||||
return openNewActivityIds;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化活动并校验活动状态是否开启
|
||||
* @return true 未开启, false 开启
|
||||
*/
|
||||
private boolean checkStateAndInitFromActivity(User user, int activityId) throws Exception {
|
||||
ActivityManager activityManager = user.getActivityManager();
|
||||
initAllActivityMission(activityManager.getActivityMissionMap(),activityId);
|
||||
|
@ -477,19 +499,21 @@ public class ActivityLogic implements IEventHandler{
|
|||
return activityOpenState == ActivityType.UNOPEN_STATE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 活动结束,(存在发奖操作,看配置)删除活动
|
||||
*/
|
||||
private static void goRewardActivity(User user,int activityId,PlayerInfoProto.ActivityUpateIndication.Builder builder,boolean isRemoveInfo) throws Exception {
|
||||
ActivityMission activityMission = user.getActivityManager().getActivityMissionMap().get(activityId);
|
||||
if (activityMission != null) {
|
||||
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(activityId);
|
||||
if (null==abstractActivity) {
|
||||
AbstractActivity abstractActivity = ActivityTypeEnum.getActicityById(activityId);
|
||||
if (null == abstractActivity) {
|
||||
return;
|
||||
}
|
||||
if(activityMission.getOpenType()!=ActivityType.CLOSE_STATE){
|
||||
if(activityMission.getOpenType() != ActivityType.CLOSE_STATE){
|
||||
abstractActivity.onActivityEndSelfWithDealReward(user);
|
||||
abstractActivity.setOpenState(user,ActivityType.CLOSE_STATE);
|
||||
Poster.getPoster().dispatchEvent(new ActivityStateChangeEvent(user.getId(),activityId,ActivityType.CLOSE_STATE));
|
||||
}
|
||||
|
||||
if(isRemoveInfo){
|
||||
user.getActivityManager().getActivityMissionMap().remove(activityId);
|
||||
LOGGER.info("the uid={},remove the activity id ={}", user.getId(), activityId);
|
||||
|
@ -562,15 +586,17 @@ public class ActivityLogic implements IEventHandler{
|
|||
if(sGlobalActivity == null){
|
||||
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) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
continue;
|
||||
}
|
||||
|
@ -594,24 +620,29 @@ public class ActivityLogic implements IEventHandler{
|
|||
if (sGlobalActivity.getIsSaving()==0 && activityStatus != ActivityType.OPEN_STATE) {
|
||||
continue;
|
||||
}
|
||||
int startTime,endTime;
|
||||
if(sGlobalActivity.getType() == ActivityType.DAILY_PREFERENTIAL_GIFT){
|
||||
startTime=(int)(activityState.getValue().getCreatTime()/1000);
|
||||
int startTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 1) / 1000);
|
||||
int endTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 2) / 1000);;
|
||||
|
||||
if(type == ActivityType.DAILY_PREFERENTIAL_GIFT){ // 每日特惠活动
|
||||
startTime = (int)(activityState.getValue().getCreatTime()/1000);
|
||||
endTime = startTime+604800;
|
||||
}else{
|
||||
startTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 1) / 1000);
|
||||
if(sGlobalActivity.getGapTime()!=0){
|
||||
endTime = (int) (ToolsUtil.getEndTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, sGlobalActivity.getGapTime()) / 1000);
|
||||
}else{
|
||||
endTime = (int) (ToolsUtil.getTimeLong(sGlobalActivity.getStartTimeLong(),sGlobalActivity.getEndTimeLong(),sGlobalActivity.getTime(),createTime, 2) / 1000);
|
||||
}
|
||||
}
|
||||
else if (sGlobalActivity.getTime() == ActivityType.OPEN_TYPE_CYCLE){
|
||||
long now = TimeUtils.now();
|
||||
long cycleTime = sGlobalActivity.getCycleMinute() * TimeUtils.ONE_MINUTE;
|
||||
long latelyStarTime = TimeUtils.getLatelyTime(startTime * 1000L, now, cycleTime);
|
||||
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());
|
||||
if(abstractActivity==null){
|
||||
LOGGER.error(sGlobalActivity.getId()+":活动类型不存在");
|
||||
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()
|
||||
.setActivityId(activityId)
|
||||
.addAllMission(missionInfos)
|
||||
|
|
|
@ -12,7 +12,7 @@ public interface ActivityType {
|
|||
int OPEN_TYPE_ROLE = 2; // 活动开启类型:创角时间
|
||||
int OPEN_TYPE_SERVER = 3; // 活动开启类型:开服时间
|
||||
int OPEN_TYPE_MONTHS = 5; // 活动开启类型:开服自然月
|
||||
int OPEN_TYPE_CYCLE = 6; // 循环活动
|
||||
int OPEN_TYPE_CYCLE = 6; // 活动开启类型:循环活动
|
||||
|
||||
|
||||
int WILL_TAKE = 0; //未领取
|
||||
|
|
|
@ -80,7 +80,7 @@ public abstract class AbstractMissionType {
|
|||
}
|
||||
|
||||
public Set<Integer> getDoingMissionIds() {
|
||||
return doingMissionIds;
|
||||
return doingMissionIds;
|
||||
}
|
||||
|
||||
public void addFinishMissionId(int missionId) {
|
||||
|
|
|
@ -8,6 +8,15 @@ import java.util.*;
|
|||
|
||||
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){
|
||||
long baseTime = startTimeLong;
|
||||
if(type == 2){
|
||||
|
@ -15,7 +24,8 @@ public class ToolsUtil {
|
|||
}
|
||||
long resultTime=0;
|
||||
switch (time){
|
||||
case ActivityType.OPEN_TYPE_TIME:
|
||||
case ActivityType.OPEN_TYPE_TIME://开服时间
|
||||
case ActivityType.OPEN_TYPE_CYCLE://循环活动
|
||||
resultTime = baseTime;
|
||||
break;
|
||||
case ActivityType.OPEN_TYPE_ROLE:
|
||||
|
@ -41,25 +51,6 @@ public class ToolsUtil {
|
|||
}
|
||||
}
|
||||
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:
|
||||
// 开始时间
|
||||
if(type == 1){
|
||||
|
|
|
@ -19,6 +19,8 @@ public class SGlobalActivity implements BaseConfig {
|
|||
|
||||
private int time;
|
||||
|
||||
private int cycleMinute;
|
||||
|
||||
private long startTimeLong;
|
||||
|
||||
private long endTimeLong;
|
||||
|
@ -170,6 +172,10 @@ public class SGlobalActivity implements BaseConfig {
|
|||
return time;
|
||||
}
|
||||
|
||||
public int getCycleMinute() {
|
||||
return cycleMinute;
|
||||
}
|
||||
|
||||
public static List<SGlobalActivity> getsGlobalActivityMapByType(int type) {
|
||||
return sGlobalActivityMapByType.get(type);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue