back_recharge
wangyuan 2019-04-23 18:22:02 +08:00
parent ae0e068b35
commit 4289588f92
8 changed files with 179 additions and 23 deletions

View File

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

View File

@ -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<Integer, Integer> guidePoints = user.getPlayerInfoManager().getGuidePoints();
List<CommonProto.NewPlayerGuidePoint> list = new ArrayList<>();

View File

@ -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<Integer> 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<Integer, SGlobalActivity> 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<Integer, Integer> activityState = activityManager.getActivityState();
Map<Integer, SGlobalActivity> 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(now<startTime){
continue;
}
if(endTime!=0 && now>endTime){
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<values[0][0]){
LOGGER.error("the uid={} the misionId={},the missionProgress={},the require is={} ",uid,missionId,missionProgress,values[0][0]);
MessageUtil.sendErrorResponse(session,0,rewardResponseValue,"time not");
return;
}
break;
}
int[][] reward = sActivityRewardConfig.getReward();
CommonProto.Drop.Builder drop = ItemUtil.drop(user, reward);
@ -155,4 +193,78 @@ public class ActivityLogic {
MessageUtil.sendMessage(session,1,rewardResponseValue,build,true);
}
public void updateActivityMissionProgress(User user,int activityType,int count){
ActivityManager activityManager = user.getActivityManager();
Map<Integer, Integer> activityState = activityManager.getActivityState();
Map<Integer, ActivityMission> activityMissionMap = activityManager.getActivityMissionMap();
for(Map.Entry<Integer,Integer> 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<Integer, Integer> allMissionProgress = activityMission.getAllMissionProgress();
int progress;
switch (activityType){
default:
for (Map.Entry<Integer, Integer> item : allMissionProgress.entrySet()) {
progress = item.getValue() + count;
activityMission.updateMissionProgress(item.getKey(), progress);
}
break;
}
}
public void checkActivityIsFinish(User user){
ActivityManager activityManager = user.getActivityManager();
Map<Integer, Integer> activityState = activityManager.getActivityState();
Map<Integer, ActivityMission> activityMissionMap = activityManager.getActivityMissionMap();
for(Map.Entry<Integer,Integer> 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<Integer, Integer> allMissionStatus = activityMission.getAllMissionStatus();
boolean isAllTaked = true;
for(Map.Entry<Integer,Integer> 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;
}
}

View File

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

View File

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

View File

@ -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<String, Hero> heroMap = heroManager.getHeroMap();
TeamPosManager teamPosManager = user.getTeamPosManager();
teamPosManager.addTeamOfInitPlayer(heroMap.values());
ActivityLogic.getInstance().newPlayerOpenActivityMission(user);
}

View File

@ -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<Integer, AdventureStateInfo> adventureStateInfoMap = adventureManager.getAdventureStateInfoMap();
List<CommonProto.AdventureStateInfo> 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<int[], Float> tempDropRation = new HashMap<>();
Map<int[], Float> onlineReward = new HashMap<>();
AdventureManager adventureManager = user.getAdventureManager();
Map<Integer, AdventureStateInfo> 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);
}

View File

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