From 4289588f923fb767ecdffdf1b7f3d9a4cb922423 Mon Sep 17 00:00:00 2001 From: wangyuan Date: Tue, 23 Apr 2019 18:22:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/jieling/config/SGlobalActivity.java | 8 +- .../jieling/handler/GetPlayerInfoHandler.java | 7 +- .../jieling/logic/activity/ActivityLogic.java | 126 +++++++++++++++++- .../jieling/logic/activity/ActivityType.java | 5 +- .../jieling/logic/dao/ActivityMission.java | 8 +- .../ljsd/jieling/logic/dao/UserManager.java | 2 + .../ljsd/jieling/logic/fight/CombatLogic.java | 36 ++++- .../network/server/ProtocolsManager.java | 10 +- 8 files changed, 179 insertions(+), 23 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/config/SGlobalActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/config/SGlobalActivity.java index 310710590..500ecf841 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/config/SGlobalActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/config/SGlobalActivity.java @@ -38,15 +38,15 @@ public class SGlobalActivity implements BaseConfig { int time = sGlobalActivity.getTime(); String startTime = sGlobalActivity.getStartTime(); String endtime = sGlobalActivity.getEndtime(); - if(time == 1 ){ + if(time == ActivityType.OPEN_TYPE_TIME ){ if("0".equals(endtime)){ continue; } - setStartTimeLong(TimeUtils.parseTimeToMiles(startTime,"YYYYMMdd hh:mm:ss")); + sGlobalActivity.setStartTimeLong(TimeUtils.parseTimeToMiles(startTime,"YYYYMMdd hh:mm:ss")); continue; } - setStartTimeLong(Long.parseLong(startTime)); - setStartTimeLong(Long.parseLong(endtime)); + sGlobalActivity.setStartTimeLong(Long.parseLong(startTime)); + sGlobalActivity.setEndTimeLong(Long.parseLong(endtime)); } sGlobalActivityMap = config; } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java index 3b053e0fc..792be9f4f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -1,6 +1,8 @@ package com.ljsd.jieling.handler; import com.ljsd.jieling.handler.map.MapLogic; +import com.ljsd.jieling.logic.activity.ActivityLogic; +import com.ljsd.jieling.logic.activity.ActivityType; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.netty.cocdex.PacketNetData; @@ -45,10 +47,11 @@ public class GetPlayerInfoHandler extends BaseHandler{ User user = UserManager.getUser(userId); // 需要隔天刷新的字段统一在这里处理 if (TimeUtils.isOverTime(5, user.getPlayerInfoManager().getLoginTime())) { - user.getPlayerInfoManager().setLoginTime(TimeUtils.now()); MapLogic.getInstance().resetDayInfo(user); - + //活动刷新 + ActivityLogic.getInstance().flushEveryDay(user); } + user.getPlayerInfoManager().setLoginTime(TimeUtils.now()); MapLogic.getInstance().checkIsInMap(user); Map guidePoints = user.getPlayerInfoManager().getGuidePoints(); List list = new ArrayList<>(); 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 9c0bed777..e8bac294d 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 @@ -4,6 +4,7 @@ import com.ljsd.jieling.config.SActivityRewardConfig; import com.ljsd.jieling.config.SGlobalActivity; import com.ljsd.jieling.logic.dao.ActivityManager; import com.ljsd.jieling.logic.dao.ActivityMission; +import com.ljsd.jieling.logic.dao.PlayerManager; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.network.session.ISession; @@ -12,6 +13,7 @@ import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.protocols.PlayerInfoProto; import com.ljsd.jieling.util.ItemUtil; import com.ljsd.jieling.util.MessageUtil; +import com.ljsd.jieling.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +26,12 @@ public class ActivityLogic { private Set openActivityIds =new HashSet<>(); + public void flushEveryDay(User user) { + updateActivityMissionProgress(user, ActivityType.SevenLogin,1); + checkActivityIsFinish(user); + checkActivityOfUser(user); + } + public static class Instance { public final static ActivityLogic instance = new ActivityLogic(); @@ -34,7 +42,7 @@ public class ActivityLogic { Map sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap(); for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){ int time = sGlobalActivity.getTime(); - if(time ==3 ){ + if(time ==2 ){ continue; } long startTime = sGlobalActivity.getTimeLong(0,1); @@ -48,11 +56,14 @@ public class ActivityLogic { } openActivityIds.add(sGlobalActivity.getId()); } + } + public void newPlayerOpenActivityMission(User user){ + checkActivityOfUser(user); } public void checkActivityOfUser(User user){ - long now = System.currentTimeMillis(); + long now = TimeUtils.now(); ActivityManager activityManager = user.getActivityManager(); Map activityState = activityManager.getActivityState(); Map sGlobalActivityMap = SGlobalActivity.getsGlobalActivityMap(); @@ -63,16 +74,20 @@ public class ActivityLogic { long userCreateTime = user.getPlayerInfoManager().getCreateTime(); for(SGlobalActivity sGlobalActivity:sGlobalActivityMap.values()){ int activityId = sGlobalActivity.getId(); - if(!openActivityIds.contains(activityId)){ + if(openActivityIds.contains(activityId)){ continue; } int time = sGlobalActivity.getTime(); - if(time ==3 ){ + if(time ==ActivityType.OPEN_TYPE_ROLE ){ long startTime = sGlobalActivity.getTimeLong(userCreateTime,1); long endTime = sGlobalActivity.getTimeLong(userCreateTime,2); if(nowendTime){ + activityState.put(activityId,ActivityType.CLOSE_STATE); + continue; + } activityManager.initAllActivityMission(activityId); }else{ activityState.put(activityId,ActivityType.CLOSE_STATE); @@ -99,19 +114,42 @@ public class ActivityLogic { ActivityManager activityManager = user.getActivityManager(); ActivityMission activityMission = activityManager.getActivityMissionMap().get(activityId); Integer missionState = activityMission.getAllMissionStatus().get(missionId); + Integer missionProgress = activityMission.getAllMissionProgress().get(missionId); if( null == missionState || missionState == ActivityType.HAD_TAKED){ MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"had taked"); return; } SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(activityId); int[][] values = sActivityRewardConfig.getValues(); - if(sGlobalActivity.getType() == ActivityType.ChapterReward){ - - /* LevelDifficulty levelDifficulty = user.getLevelDifficultyManager().getLevelDifficultyInfosMap().get(values[0][0]); + switch (sGlobalActivity.getType()){ + case ActivityType.ChapterReward:{ + /* LevelDifficulty levelDifficulty = user.getLevelDifficultyManager().getLevelDifficultyInfosMap().get(values[0][0]); if(levelDifficulty == null || levelDifficulty.getState()!= Global.FIGHT_CLEARANCE){ MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"not pass"); return; }*/ + } + break; + case ActivityType.OnlineReward:{ + long now = TimeUtils.now(); + PlayerManager playerInfoManager = user.getPlayerInfoManager(); + long loginTime = playerInfoManager.getLoginTime(); + int limitTime = values[0][0]; + long remainTime = now - loginTime - limitTime * TimeUtils.ONE_MINUTE + missionProgress * TimeUtils.ONE_SECOND; + if(now - loginTime - limitTime * TimeUtils.ONE_MINUTE + missionProgress * TimeUtils.ONE_SECOND<0){ + LOGGER.error("the uid={} remain time is={}ms,the require time is={}ms",uid,remainTime,limitTime * TimeUtils.ONE_MINUTE); + MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"time not"); + return; + } + } + break; + default: + if(missionProgress activityState = activityManager.getActivityState(); + Map activityMissionMap = activityManager.getActivityMissionMap(); + for(Map.Entry item : activityState.entrySet()){ + Integer activityStatus = item.getValue(); + if(activityStatus != ActivityType.OPEN_STATE){ + continue; + } + Integer activityId= item.getKey(); + SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(activityId); + int targetActivityType = sGlobalActivity.getType(); + if(targetActivityType != activityType){ + continue; + } + updateProgress(activityType,activityMissionMap.get(activityId),count); + return; + } + } + + private void updateProgress(int activityType,ActivityMission activityMission,int count){ + Map allMissionProgress = activityMission.getAllMissionProgress(); + int progress; + switch (activityType){ + default: + for (Map.Entry item : allMissionProgress.entrySet()) { + progress = item.getValue() + count; + activityMission.updateMissionProgress(item.getKey(), progress); + } + break; + } + } + + public void checkActivityIsFinish(User user){ + ActivityManager activityManager = user.getActivityManager(); + Map activityState = activityManager.getActivityState(); + Map activityMissionMap = activityManager.getActivityMissionMap(); + for(Map.Entry item : activityState.entrySet()){ + Integer activityStatus = item.getValue(); + if(activityStatus != ActivityType.OPEN_STATE){ + continue; + } + Integer activityId= item.getKey(); + checkActivityMissionFinishAndTaked(activityManager,activityId,activityMissionMap.get(activityId)); + return; + } + } + + private void checkActivityMissionFinishAndTaked(ActivityManager activityManager,int activityId,ActivityMission activityMission){ + Map allMissionStatus = activityMission.getAllMissionStatus(); + boolean isAllTaked = true; + for(Map.Entry item : allMissionStatus.entrySet()){ + Integer missionStatus = item.getValue(); + if(missionStatus == ActivityType.WILL_TAKE){ + isAllTaked = false; + } + } + if(isAllTaked){ + activityManager.updateActivityState(activityId,ActivityType.FINISH_STATE); + } + } + + public int getInitActivityMissionProgress(int activityId){ + int defalutProgress = 0; + switch (activityId){ + case ActivityType.SevenLogin: + defalutProgress =1; + break; + default: + break; + } + return defalutProgress; + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java index 7de51dbb9..fd72844ce 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityType.java @@ -7,8 +7,9 @@ public interface ActivityType { int FINISH_STATE =2; int OPEN_TYPE_TIME = 1; // 活动开启类型:绝对时间 - int OPEN_TYPE_SERVER = 2; // 活动开启类型:开服时间 - int OPEN_TYPE_ROLE = 3; // 活动开启类型:创角时间 + int OPEN_TYPE_ROLE = 2; // 活动开启类型:创角时间 + int OPEN_TYPE_SERVER = 3; // 活动开启类型:开服时间 + int WILL_TAKE = 0; //未领取 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityMission.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityMission.java index 36b19f9a3..3c4c56825 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityMission.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/ActivityMission.java @@ -2,6 +2,7 @@ package com.ljsd.jieling.logic.dao; import com.ljsd.common.mogodb.MongoBase; import com.ljsd.jieling.config.SActivityRewardConfig; +import com.ljsd.jieling.logic.activity.ActivityLogic; import java.util.List; import java.util.Map; @@ -17,11 +18,16 @@ public class ActivityMission extends MongoBase { allMissionStatus.put(missionId,status); } + public void updateMissionProgress(int missionId,int progress){ + updateString("allMissionProgress."+missionId,progress); + allMissionProgress.put(missionId,progress); + } + public void initMissionInfo(int activityId){ List sActivityRewardConfigs = SActivityRewardConfig.getsActivityRewardConfigByActivityId(activityId); for(SActivityRewardConfig sActivityRewardConfig : sActivityRewardConfigs){ allMissionStatus.put(sActivityRewardConfig.getId(), 0); - allMissionProgress.put(sActivityRewardConfig.getId(), 0); + allMissionProgress.put(sActivityRewardConfig.getId(), ActivityLogic.getInstance().getInitActivityMissionProgress(activityId)); } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java index 5fe661298..7b8b81658 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/dao/UserManager.java @@ -4,6 +4,7 @@ package com.ljsd.jieling.logic.dao; import com.ljsd.jieling.config.SGameSetting; import com.ljsd.jieling.config.SPlayerLevelConfig; import com.ljsd.jieling.db.mongo.MongoUtil; +import com.ljsd.jieling.logic.activity.ActivityLogic; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.util.ItemUtil; import com.ljsd.jieling.util.TimeUtils; @@ -83,6 +84,7 @@ public class UserManager { Map heroMap = heroManager.getHeroMap(); TeamPosManager teamPosManager = user.getTeamPosManager(); teamPosManager.addTeamOfInitPlayer(heroMap.values()); + ActivityLogic.getInstance().newPlayerOpenActivityMission(user); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java index bdff0237c..a48d9fe04 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java @@ -37,13 +37,18 @@ public class CombatLogic { int uid = session.getUid(); User user = UserManager.getUser(uid); PlayerManager playerInfoManager = user.getPlayerInfoManager(); - int offLineTime = (int)((System.currentTimeMillis() -playerInfoManager.getOffLineTime())/1000); + int offLineTime = 0; AdventureManager adventureManager = user.getAdventureManager(); Map adventureStateInfoMap = adventureManager.getAdventureStateInfoMap(); List result = new ArrayList<>(); CommonProto.Drop.Builder dropBuilder = calAdvenrureReward(user, false,0); + boolean hasAdventure = false; for(AdventureStateInfo item : adventureStateInfoMap.values()){ result.add(CBean2Proto.getAdventureStateInfo(item,item.getPosition())); + hasAdventure =true; + } + if(hasAdventure){ + offLineTime = (int)((System.currentTimeMillis() -playerInfoManager.getOffLineTime())/1000); } FightInfoProto.GetAdventureStateInfoResponse response = FightInfoProto.GetAdventureStateInfoResponse.newBuilder().addAllAdventureStateInfoList(result).setDrop(dropBuilder.build()).setOutTime(offLineTime). build(); @@ -131,10 +136,12 @@ public class CombatLogic { //消耗道具全部加一遍基础奖励。 public CommonProto.Drop.Builder calAdvenrureReward(User user, boolean isOnLine,int position) throws Exception { Map tempDropRation = new HashMap<>(); + Map onlineReward = new HashMap<>(); AdventureManager adventureManager = user.getAdventureManager(); Map adventureStateInfoMap = adventureManager.getAdventureStateInfoMap(); int now = (int)(System.currentTimeMillis()/1000); int adventureRefresh = SGameSetting.getGameSetting().getAdventureRefresh(); + int offLineTime = (int)(user.getPlayerInfoManager().getOffLineTime()); for(AdventureStateInfo adventureStateInfoTmp:adventureStateInfoMap.values()){ int positionTmp = adventureStateInfoTmp.getPosition(); if(position!=0 && positionTmp!=position){ @@ -143,18 +150,32 @@ public class CombatLogic { int startTime = adventureStateInfoTmp.getStartTime(); int times = (now - startTime)/adventureRefresh; int size = adventureStateInfoTmp.getHeroIds().size(); + int onlineTimesOfOffline=0; + if(!isOnLine){ + onlineTimesOfOffline = (offLineTime - startTime)/adventureRefresh; + } if(times>0){ adventureStateInfoTmp.setStartTime(startTime+times*adventureRefresh); SAdventureConfig sAdventureConfig = SAdventureConfig.getSAdventureConfigByPosition(positionTmp); int leaveBonus = sAdventureConfig.getLeaveBonus(); int maxTimes = leaveBonus * 3600 / adventureRefresh; - if(!isOnLine){ - times = times>maxTimes?maxTimes:times; - } int baseRewardGroup[] = sAdventureConfig.getBaseRewardGroup(); float rewardRation = calRation(size,sAdventureConfig.getNumIncome()); - tempDropRation.put(baseRewardGroup,rewardRation * times); - adventureManager.updateTemp(sAdventureConfig.getRandomRewardGroup(),rewardRation*times); + if(!isOnLine){ + int reallyOfflineTims = times - onlineTimesOfOffline; + if(reallyOfflineTims>0){ + reallyOfflineTims = reallyOfflineTims>maxTimes?reallyOfflineTims:times; + tempDropRation.put(baseRewardGroup,rewardRation * reallyOfflineTims); + adventureManager.updateTemp(sAdventureConfig.getRandomRewardGroup(),rewardRation*reallyOfflineTims); + } + if(onlineTimesOfOffline!=0){ + onlineReward.put(baseRewardGroup,rewardRation * onlineTimesOfOffline); + } + }else{ + onlineReward.put(baseRewardGroup,rewardRation * times); + adventureManager.updateTemp(sAdventureConfig.getRandomRewardGroup(),rewardRation*times); + } + } } if(!isOnLine){ @@ -164,6 +185,9 @@ public class CombatLogic { } adventureManager.clearTemp(); } + if(!onlineReward.isEmpty()){ + ItemUtil.drop(user, onlineReward); + } return ItemUtil.drop(user, tempDropRation); } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java index 5e57844c5..740a9afa7 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java @@ -10,6 +10,9 @@ import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.exception.ErrorCode; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.logic.OnlineUserManager; +import com.ljsd.jieling.logic.activity.ActivityLogic; +import com.ljsd.jieling.logic.activity.ActivityType; +import com.ljsd.jieling.logic.dao.PlayerManager; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.netty.cocdex.PacketNetData; @@ -20,6 +23,7 @@ import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.session.GameSession; import com.ljsd.jieling.util.MathUtils; import com.ljsd.jieling.util.MessageUtil; +import com.ljsd.jieling.util.TimeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -229,7 +233,11 @@ public class ProtocolsManager implements ProtocolsAbstract { try { OnlineUserManager.userOffline(session.getUid()); User user = UserManager.getUser(session.getUid()); - user.getPlayerInfoManager().setOffLineTime(System.currentTimeMillis()); + PlayerManager playerInfoManager = user.getPlayerInfoManager(); + playerInfoManager.setOffLineTime(TimeUtils.now()); + long onlineTime = playerInfoManager.getOffLineTime() - playerInfoManager.getLoginTime(); + //更新在线时长 + ActivityLogic.getInstance().updateActivityMissionProgress(user, ActivityType.OnlineReward,(int)(onlineTime/TimeUtils.ONE_SECOND)); MongoUtil.getInstence().lastUpdate(); // 下线处理的逻辑需要添加在这里 } catch (Exception e) {