diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java index 35a2b2ccc..f3054d5a4 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityLogic.java @@ -7,6 +7,7 @@ import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.handler.activity.BlessInfoConfig; import com.ljsd.jieling.ktbeans.KtEventUtils; import com.ljsd.jieling.ktbeans.parmsBean.ParamEventBean; +import com.ljsd.jieling.logic.OnlineUserManager; import com.ljsd.jieling.logic.dao.*; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.logic.mission.GameEvent; @@ -38,7 +39,7 @@ public class ActivityLogic { public void flushForLogin(User user) throws Exception { checkActivityIsFinish(user); - checkActivityOfUser(user); + checkActivityOfUser(user,null); } @@ -46,7 +47,7 @@ public class ActivityLogic { public final static ActivityLogic instance = new ActivityLogic(); } - public void checkActiviyStatus() { + public void checkActiviyStatus() throws Exception { long now = System.currentTimeMillis(); Map sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap(); for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){ @@ -65,13 +66,30 @@ public class ActivityLogic { } openActivityIds.add(sGlobalActivity.getId()); } + for(Map.Entry entry:OnlineUserManager.sessionMap.entrySet()){ + User user = UserManager.getUserInMem(entry.getKey()); + PlayerInfoProto.ActivityUpateIndication.Builder builder = PlayerInfoProto.ActivityUpateIndication.newBuilder(); + Set openNews = checkActivityOfUser(user,builder); + if(!openNews.isEmpty()){ + Map activityMissionMap = user.getActivityManager().getActivityMissionMap(); + Map activityUpdateMap = new HashMap<>(); + for(Integer activityId : openNews){ + activityUpdateMap.put(activityId,activityMissionMap.get(activityId)); + } + List activityInfos = getActivityInfos(activityUpdateMap, user.getPlayerInfoManager().getCreateTime()); + builder.addAllActivityInfo(activityInfos); + } + if(builder.getActivityInfoCount()>0 || builder.getCloseActivityIdCount() >0 ){ + MessageUtil.sendIndicationMessage(entry.getValue(),1, MessageTypeProto.MessageType.ACTIVITY_UPDATE_INDICATION_VALUE,builder.build(),true); + } + } } public void newPlayerOpenActivityMission(User user) throws Exception { - checkActivityOfUser(user); + checkActivityOfUser(user,null); } - public void checkActivityOfUser(User user) throws Exception { + public Set checkActivityOfUser(User user, PlayerInfoProto.ActivityUpateIndication.Builder builder) throws Exception { long now = TimeUtils.now(); ActivityManager activityManager = user.getActivityManager(); Map sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap(); @@ -80,6 +98,7 @@ public class ActivityLogic { } Map activityMissionMap = activityManager.getActivityMissionMap(); long userCreateTime = user.getPlayerInfoManager().getCreateTime(); + Set openNewActivityIds = new HashSet<>(); for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){ int activityId = sGlobalActivity.getId(); if(openActivityIds.contains(activityId)){ @@ -95,7 +114,11 @@ public class ActivityLogic { if(endTime!=0 && now>endTime){ ActivityMission activityMission = activityMissionMap.get(activityId); if(activityMission!=null){ - activityMission.updateActivityState(ActivityType.CLOSE_STATE); + activityManager.removeActivity(activityId); + LOGGER.info("the uid={},remove the activity id ={}",user.getId(),activityId); + if(builder!=null){ + builder.addCloseActivityId(activityId); + } } continue; } @@ -105,13 +128,19 @@ public class ActivityLogic { } activityManager.initAllActivityMission(activityId); initOtherActivity(user,sGlobalActivity); + openNewActivityIds.add(activityId); }else{ ActivityMission activityMission = activityMissionMap.get(activityId); if(activityMission!=null){ - activityMission.updateActivityState(ActivityType.CLOSE_STATE); + activityManager.removeActivity(activityId); + LOGGER.info("the uid={},remove the activity id ={}",user.getId(),activityId); + if(builder!=null){ + builder.addCloseActivityId(activityId); + } } } } + return openNewActivityIds; } @@ -197,7 +226,7 @@ public class ActivityLogic { dropList.add(finalSTreasureConfig.getTreasureReward()); } activityProgressInfo.setState(changeState); - activityMission.updateProgressInfo(missionId,activityProgressInfo); + activityMission.updateProgressInfo(finalSTreasureConfig.getId(),activityProgressInfo); KtEventUtils.onKtEvent(user, ParamEventBean.UserActivityEvent,activityId,finalSTreasureConfig.getId()); } } @@ -343,16 +372,19 @@ public class ActivityLogic { User user = UserManager.getUser(uid); long createTime = user.getPlayerInfoManager().getCreateTime(); int rewardResponseValue = MessageTypeProto.MessageType.GET_ALL_ACTIVITY_RESPONSE_VALUE; - checkActivityOfUser(user); - ActivityManager activityManager = user.getActivityManager(); - Map activityMissionMap = activityManager.getActivityMissionMap(); + checkActivityOfUser(user,null); + List activityInfoList =getActivityInfos(user.getActivityManager().getActivityMissionMap(), createTime); + PlayerInfoProto.GetAllActivityResponse build = PlayerInfoProto.GetAllActivityResponse.newBuilder().addAllActivityInfo(activityInfoList).build(); + MessageUtil.sendMessage(session,1,rewardResponseValue,build,true); + } + + private List getActivityInfos(Map activityMissionMap, long createTime){ Map sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap(); List activityInfoList = new ArrayList<>(activityMissionMap.size()); for(Map.Entry activityState : activityMissionMap.entrySet()){ Integer activityId = activityState.getKey(); ActivityMission activityMission = activityState.getValue(); int activityStatus = activityMission.getActivityState(); - if(SGlobalActivity.getsGlobalActivityMap().get(activityId).getType()!=7&&activityStatus != ActivityType.OPEN_STATE){ continue; } @@ -368,9 +400,7 @@ public class ActivityLogic { } activityInfoList.add(CommonProto.ActivityInfo.newBuilder().setActivityId(activityId).addAllMission(missionInfos).setStartTime(startTime).setEndTime(endTime).setReallyOpen(activityMission.getOpenType()).build()); } - PlayerInfoProto.GetAllActivityResponse build = PlayerInfoProto.GetAllActivityResponse.newBuilder().addAllActivityInfo(activityInfoList).build(); - MessageUtil.sendMessage(session,1,rewardResponseValue,build,true); - + return activityInfoList; } public void openActivityReallyOpen(User user,int activityType){ @@ -442,11 +472,11 @@ public class ActivityLogic { if(activityMission.getActivityState() != ActivityType.OPEN_STATE){ continue; } - checkActivityMissionFinishAndTaked(activityMission); + checkActivityMissionFinishAndTaked(item.getKey(),activityMission); } } - private void checkActivityMissionFinishAndTaked(ActivityMission activityMission){ + private void checkActivityMissionFinishAndTaked(int activityId,ActivityMission activityMission){ Map activityProgressInfoMap = activityMission.getActivityProgressInfoMap(); boolean isAllTaked = true; for(Map.Entry item : activityProgressInfoMap.entrySet()){ @@ -455,6 +485,11 @@ public class ActivityLogic { if(missionStatus == ActivityType.WILL_TAKE){ isAllTaked = false; } + if(SGlobalActivity.getsGlobalActivityMap().get(activityId).getType() == ActivityType.TREASURE){ + if(missionStatus == ActivityType.HAD_TAKED){ + isAllTaked = false; + } + } } if(isAllTaked){ activityMission.updateActivityState(ActivityType.FINISH_STATE); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityManager.java index 5f318b80c..8cbd5e3fd 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityManager.java @@ -33,6 +33,11 @@ public class ActivityManager extends MongoBase { updateString("activityMissionMap." + activityId,activityMission); } + public void removeActivity(int activityId){ + activityMissionMap.remove(activityId); + removeString(getMongoKey() + ".activityMissionMap." + activityId); + } + public long getTrsendTime() { return trsendTime; }