循环活动初版

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(){
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());
List<int[][]> itemArrs = new LinkedList<>();
getAllMissRewards(user, session, itemArrs);
if (itemArrs.size() == 0) {
if (itemArrs.isEmpty()) {
return;
}
SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id);

View File

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

View File

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

View File

@ -80,7 +80,7 @@ public abstract class AbstractMissionType {
}
public Set<Integer> getDoingMissionIds() {
return doingMissionIds;
return doingMissionIds;
}
public void addFinishMissionId(int missionId) {

View File

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

View File

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