循环活动初版

master_otnew
grimm 2024-01-29 17:25:51 +08:00
parent 702bc42abd
commit 19fbf52c46
7 changed files with 95 additions and 55 deletions

View File

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

View File

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

View File

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

View File

@ -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; //未领取

View File

@ -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) {

View File

@ -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){

View File

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