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 8b4b5bca1..4910e998b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GetPlayerInfoHandler.java @@ -7,11 +7,12 @@ import com.ljsd.jieling.db.redis.RedisKey; import com.ljsd.jieling.db.redis.RedisUtil; import com.ljsd.jieling.globals.Global; import com.ljsd.jieling.handler.map.MapManager; +import com.ljsd.jieling.jbean.ActivityMission; import com.ljsd.jieling.ktbeans.ReportEventEnum; import com.ljsd.jieling.ktbeans.ReportUtil; import com.ljsd.jieling.logic.GlobalDataManaager; import com.ljsd.jieling.logic.GlobleSystemLogic; -import com.ljsd.jieling.logic.activity.ActivityLogic; +import com.ljsd.jieling.logic.activity.*; import com.ljsd.jieling.logic.activity.event.*; import com.ljsd.jieling.logic.activity.fourChallenge.FourChallengeLogic; import com.ljsd.jieling.logic.dao.*; @@ -253,6 +254,8 @@ public class GetPlayerInfoHandler extends BaseHandler{ Poster.getPoster().dispatchEvent(new SuperBoxEvent(user.getId(),SuperBoxEvent.fund_old_user)); // 登峰造极孙悟空 Poster.getPoster().dispatchEvent(new HeroUpStarEvent(user.getId(),10023,0)); + // 常驻活动重置 + finalActivityReset(user); // 无尽秘宝处理 endLessTreasureHandler(user); expeditionTreasureHandler(user); @@ -270,6 +273,26 @@ public class GetPlayerInfoHandler extends BaseHandler{ } } + /** + * 常驻活动重置 + * @param user + */ + private void finalActivityReset(User user){ + Map missionMap = user.getActivityManager().getActivityMissionMap(); + // 限时招募 + ActivityMission mission = missionMap.get(20012); + if (mission != null){ + ChoiceDrawCardActivity activity = (ChoiceDrawCardActivity)ActivityTypeEnum.getActicityType(20012); + activity.checkResetProgress(user,mission); + } + // 灵兽招募 + ActivityMission mission2 = missionMap.get(14501); + if (mission2 != null){ + LimitRandomSpecialMonsterActivityNew activity = (LimitRandomSpecialMonsterActivityNew)ActivityTypeEnum.getActicityType(14501); + activity.checkResetProgress(user,mission2); + } + } + /** * 无尽秘宝刷新 * @param user diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java index 085341af1..04ba87d09 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobalDataManaager.java @@ -420,10 +420,10 @@ public class GlobalDataManaager implements IManager { // 需要隔天刷新的字段统一在这里处理 if (TimeUtils.isOverTime(0,user.getPlayerInfoManager().getLoginTime())) { // 周一零点执行逻辑,跨周执行 - if (!TimeUtils.isSameWeek7(user.getPlayerInfoManager().getLoginTime())){ - // 灵兽限时抽卡重置 - ActivityLogic.getInstance().zeroResetSpecialMonsterActivity(session); - } +// if (!TimeUtils.isSameWeek7(user.getPlayerInfoManager().getLoginTime())){ +// // 灵兽限时抽卡重置 +// ActivityLogic.getInstance().zeroResetSpecialMonsterActivity(session); +// } //活动刷新 ActivityLogic.getInstance().flushEveryDay(user,fBuilder); PlayerLogic.getInstance().vipflushEveryDay(user,fBuilder); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/AbstractActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/AbstractActivity.java index 0c226df3f..beefabef8 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/AbstractActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/AbstractActivity.java @@ -144,6 +144,7 @@ public abstract class AbstractActivity implements IActivity, IEventHandler { /** * 领奖默认方法 走统一奖励配置表 + * 有独立逻辑的领取重写此方法,不要在这里加if * 重写此类 记得重写onActivityEndOnMySelf 否者活动结束走默认配置表发邮件奖 */ @Override @@ -176,15 +177,7 @@ public abstract class AbstractActivity implements IActivity, IEventHandler { SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id); //up miss - int[][] reward = new int[1][2]; - if(sGlobalActivity.getType() == ActivityType.SPECIAL_MONSTER_RANDOM_ACTIVITY) { - int summonId=activityMission.getActivityMissionMap().get(0).getProgrss(); - if (summonId>0){ - SSpiritAnimalSummon summonConfig=STableManager.getConfig(SSpiritAnimalSummon.class).get(summonId); - reward[0][0]=summonConfig.getOriginalItem(); - reward[0][1]=sActivityRewardConfig.getReward()[0][1]; - } - } + int[][] reward = sActivityRewardConfig.getReward(); CommonProto.Drop.Builder drop = ItemUtil.drop(user, reward, BIReason.TAKE_ACTIVITY_REWARD); checkAndSetProgress(activityMission, activityProgressInfo, missionId); @@ -400,7 +393,7 @@ public abstract class AbstractActivity implements IActivity, IEventHandler { * * @param filterMissId miss过滤 */ - public void sendActivityProgress(ISession session, ActivityMission activityMission, Set filterMissId) { + public void sendActivityProgress(ISession session, ActivityMission activityMission, Set filterMissId) { PlayerInfoProto.ActivityUpateProgressIndication.Builder builder = PlayerInfoProto.ActivityUpateProgressIndication.newBuilder(); builder.setActivityInfo(CommonProto.ActivityInfo.newBuilder().setValue(activityMission.getV()).addAllMission(getAllMissInfo(activityMission, filterMissId)).setActivityId(id)); if (session != null) { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java index d4c454507..ca67d3d8b 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java @@ -40,7 +40,7 @@ public enum ActivityTypeEnum { LUCK_WHEEL(ActivityType.LUCK_WHEEL, LuckWheelNormalActivity::new), LUCK_WHEEL_ADVANCE(ActivityType.LUCK_WHEEL_ADVANCE, LuckWheelAdvancedActivity::new), NEW_WELFARE(ActivityType.NEW_WELFARE, NewWelfareActivity::new), - LIMIT_RANDOM_CARD(ActivityType.LIMIT_RANDOM_CARD,LimitRandomCardActivity::new), +// LIMIT_RANDOM_CARD(ActivityType.LIMIT_RANDOM_CARD,LimitRandomCardActivity::new), LIMIT_UP_CARD(ActivityType.LIMIT_UP_CARD,LimitUpCardActivity::new), MISSIONSEARCH_EXPERT(ActivityType.MISSIONSEARCH_EXPERT,MissSearchExpectRankActivity::new), LUCKWHEEL_EXPERT(ActivityType.LUCKWHEEL_EXPERT,LuckWheelExpectRankActivity::new), @@ -62,7 +62,7 @@ public enum ActivityTypeEnum { SHEJI_ACTIVITY(ActivityType.SHEJI_ACTIVITY,SheJiActivity::new), SUB_ACTIVITY(ActivityType.SUB_ACTIVITY, SubActivity::new), SKIN_RECHARGE_ACTIVITY(ActivityType.SKIN_RECHARGE_ACTIVITY, DefaultEmptyActivity::new), - SPECIAL_MONSTER_RANDOM_ACTIVITY(ActivityType.SPECIAL_MONSTER_RANDOM_ACTIVITY,LimitRandomSpecialMonsterActivity::new), + SPECIAL_MONSTER_RANDOM_ACTIVITY(ActivityType.SPECIAL_MONSTER_RANDOM_ACTIVITY,LimitRandomSpecialMonsterActivityNew::new), SPECIAL_MONSTER_GIFT_ACTIVITY(ActivityType.SPECIAL_MONSTER_GIFT_ACTIVITY,DefaultEmptyActivity::new), DEMON_TREASURE(ActivityType.DEMON_TREASURE,LimitRandomSpecialMonsterActivity::new), NEW_GENERAL_ATTACK(ActivityType.NEW_GENERAL_ATTACK,DefaultEmptyActivity::new), @@ -124,7 +124,7 @@ public enum ActivityTypeEnum { */ public static AbstractActivity getActicityType(int id) { SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id); - if (activityEnumMap.containsKey(sGlobalActivity.getType())){ + if (sGlobalActivity != null && activityEnumMap.containsKey(sGlobalActivity.getType())){ return activityEnumMap.get(sGlobalActivity.getType()).toActivity(id); } return null; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ChoiceDrawCardActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ChoiceDrawCardActivity.java index c475f7914..7e0fc7527 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ChoiceDrawCardActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ChoiceDrawCardActivity.java @@ -104,7 +104,7 @@ public class ChoiceDrawCardActivity extends AbstractActivity { PlayerInfoProto.TakeActivityRewardResponse build = PlayerInfoProto.TakeActivityRewardResponse.newBuilder().setDrop(drop).build(); MessageUtil.sendMessage(session, 1, rewardResponseValue, build, true); // 检查是否需要重启奖励 - checkResetProgress(mission,missionId); + checkResetProgress(user,mission); // 状态推送 sendActivityProgress(session, mission, null); // 打点上报 @@ -113,22 +113,21 @@ public class ChoiceDrawCardActivity extends AbstractActivity { } /** - * 充值奖励 + * 重置奖励 * @param mission * @param missionId */ - private void checkResetProgress(ActivityMission mission,int missionId){ - // 获取全部未领取的mission - List collect = mission.getActivityMissionMap().values().stream().filter(v -> v.getState() == 0).collect(Collectors.toList()); - // 为空,表示全部领取,重置奖励 - if (collect.isEmpty()){ + public void checkResetProgress(User user,ActivityMission mission){ + // 是否已领取全部奖励 + if (checkActivityMissionFinishAndTake(user.getId(),id,mission)){ // 配置表 List configs = SActivityRewardConfig.getsActivityRewardConfigByActivityId(id); // 获取最大奖励值 List collect2 = configs.stream().mapToInt(v -> v.getValues()[0][0]).boxed().collect(Collectors.toList()); Integer max = Collections.max(collect2); // 获取盈余的积分 - int progrss = mission.getActivityMissionMap().get(missionId).getProgrss(); + Integer maxMissionId = Collections.max(mission.getActivityMissionMap().keySet()); + int progrss = mission.getActivityMissionMap().get(maxMissionId).getProgrss(); int count = (progrss-max)>0?(progrss-max):0; // 重置全部mission为新积分 List missionIds = configs.stream().mapToInt(SActivityRewardConfig::getId).boxed().collect(Collectors.toList()); @@ -144,6 +143,29 @@ public class ChoiceDrawCardActivity extends AbstractActivity { } } + /** + * 检查活动是否完成或者可以领取 + * @param uid + * @param activityId + * @param activityMission + * @return + */ + @Override + public boolean checkActivityMissionFinishAndTake(int uid, int activityId, ActivityMission activityMission) { + Map activityProgressInfoMap = activityMission.getActivityMissionMap(); + if (activityProgressInfoMap.isEmpty()) { + return false; + } + for (Map.Entry item : activityProgressInfoMap.entrySet()) { + ActivityProgressInfo activityProgressInfo = item.getValue(); + int missionStatus = activityProgressInfo.getState(); + if (missionStatus == ActivityType.WILL_TAKE) { + return false; + } + } + return true; + } + /** * 特殊处理奖励 * @param reward 默认奖励配置 diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/LimitRandomSpecialMonsterActivityNew.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/LimitRandomSpecialMonsterActivityNew.java new file mode 100644 index 000000000..a71378f81 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/LimitRandomSpecialMonsterActivityNew.java @@ -0,0 +1,181 @@ +package com.ljsd.jieling.logic.activity; + +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.BIReason; +import com.ljsd.jieling.jbean.ActivityMission; +import com.ljsd.jieling.jbean.ActivityProgressInfo; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.util.ItemUtil; +import com.ljsd.jieling.util.MessageUtil; +import config.SActivityRewardConfig; +import config.SSpiritAnimalSummon; +import manager.STableManager; +import rpc.protocols.CommonProto; +import rpc.protocols.PlayerInfoProto; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @author lvxinran + * @date 2020/11/11 + * @discribe + */ +public class LimitRandomSpecialMonsterActivityNew extends LimitRandomCardActivity { + + public LimitRandomSpecialMonsterActivityNew(int id) { + super(id); + } + + @Override + public void initActivity(User user) { + super.initActivity(user); + Map activityMissionMap = user.getActivityManager().getActivityMissionMap(); + ActivityMission activityMission = activityMissionMap.get(id); + if(activityMission!=null){ + activityMission.getActivityMissionMap().put(0,new ActivityProgressInfo()); + } + + } + + @Override + void updateProgress(ActivityMission activityMission, int count) { + Map activityProgressInfoMap = activityMission.getActivityMissionMap(); + int progress; + for (Map.Entry item : activityProgressInfoMap.entrySet()) { + if(item.getKey()==0){ + continue; + } + ActivityProgressInfo activityProgressInfo = item.getValue(); + progress = item.getValue().getProgrss() + count; + activityProgressInfo.setProgrss(progress); + activityMission.getActivityMissionMap().put(item.getKey(), activityProgressInfo); + } + } + + @Override + public boolean takeReward(ISession session, int missionId) throws Exception { + User user = UserManager.getUser(session.getUid()); + //checkAndUpdate cfg + SActivityRewardConfig config = SActivityRewardConfig.getsActivityRewardConfigByMissionId(missionId); + if (config == null || config.getActivityId() != id) { + throw new ErrorCodeException(ErrorCode.CFG_NULL,"功能不存在:"+missionId); + } + // acitvityinfo check + ActivityMission mission = user.getActivityManager().getActivityMissionMap().get(id); + if (mission == null){ + throw new ErrorCodeException(ErrorCode.SERVER_SELF_DEFINE,"数据错误"); + } + if (mission.getActivityState() != ActivityType.OPEN_STATE || mission.getOpenType() == 0) { + throw new ErrorCodeException(ErrorCode.ACTIVITY_NOT_OPEN,"活动未开启"); + } + ActivityProgressInfo progressInfo = mission.getActivityMissionMap().get(missionId); + if (progressInfo == null || progressInfo.getState() == ActivityType.HAD_TAKED) { + throw new ErrorCodeException(ErrorCode.newDefineCode("活动奖励已经领取")); + } + //take rewards checkAndUpdate + if (!takeRewardsProcess(session, config, progressInfo)) { + throw new ErrorCodeException(ErrorCode.newDefineCode("未达到领取条件")); + } + checkAndSetProgress(mission, progressInfo, missionId); + //up miss + int summonId = mission.getActivityMissionMap().get(0).getProgrss(); + int[][] reward = getReward(config.getReward(),summonId); + CommonProto.Drop.Builder drop = ItemUtil.drop(user, reward, BIReason.TAKE_ACTIVITY_REWARD); + PlayerInfoProto.TakeActivityRewardResponse build = PlayerInfoProto.TakeActivityRewardResponse.newBuilder().setDrop(drop).build(); + MessageUtil.sendMessage(session, 1, rewardResponseValue, build, true); + // 检查是否需要重启奖励 + checkResetProgress(user,mission); + // 状态推送 + sendActivityProgress(session, mission, null); + // 打点上报 + reportTakeActivityReward(user,reward,missionId); + return true; + } + + /** + * 特殊处理奖励 + * @param reward 默认奖励配置 + * @param summonId 替换得奖励配置 + * @return + */ + private int[][] getReward(int[][] reward, int summonId){ + if (summonId <= 0){ + return reward; + } + SSpiritAnimalSummon summonConfig = STableManager.getConfig(SSpiritAnimalSummon.class).get(summonId); + int[][] result = new int[reward.length][2]; + for (int i = 0; i < reward.length; i++) { + result[i][0] = summonConfig.getOriginalItem(); + result[i][1] = reward[i][1]; + } + return result; + } + + /** + * 充值奖励 + * @param user + * @param mission + */ + public void checkResetProgress(User user,ActivityMission mission){ + // 是否已领取全部奖励 + if (checkActivityMissionFinishAndTake(user.getId(),id,mission)){ + // 配置表 + List configs = SActivityRewardConfig.getsActivityRewardConfigByActivityId(id); + // 获取最大奖励值 + List collect2 = configs.stream().mapToInt(v -> v.getValues()[0][0]).boxed().collect(Collectors.toList()); + Integer max = Collections.max(collect2); + // 获取盈余的积分 + Integer maxMissionId = Collections.max(mission.getActivityMissionMap().keySet()); + int progrss = mission.getActivityMissionMap().get(maxMissionId).getProgrss(); + int count = Math.max((progrss - max), 0); + // 获取已选中的灵兽 + int summonId = Optional.ofNullable(mission.getActivityMissionMap().get(0)).map(ActivityProgressInfo::getProgrss).orElse(0); + // 重置全部mission为新积分 + List missionIds = configs.stream().mapToInt(SActivityRewardConfig::getId).boxed().collect(Collectors.toList()); + for(Integer id : missionIds){ + ActivityProgressInfo activityProgressInfo = new ActivityProgressInfo(); + activityProgressInfo.setProgrss(count); + activityProgressInfo.setState(0); + mission.getActivityMissionMap().put(id, activityProgressInfo); + } + // 重新赋值灵兽 + ActivityProgressInfo progressInfo = new ActivityProgressInfo(); + progressInfo.setProgrss(summonId); + mission.getActivityMissionMap().put(0, progressInfo); + + mission.setOpenType(1); + mission.setV(0); + mission.setActivityState(ActivityType.OPEN_STATE); + } + } + + /** + * 检查活动是否完成或者可以领取 + * @param uid + * @param activityId + * @param activityMission4 + * @return + */ + @Override + public boolean checkActivityMissionFinishAndTake(int uid, int activityId, ActivityMission activityMission) { + Map activityProgressInfoMap = activityMission.getActivityMissionMap(); + if (activityProgressInfoMap.isEmpty()) { + return false; + } + for (Map.Entry item : activityProgressInfoMap.entrySet()) { + ActivityProgressInfo activityProgressInfo = item.getValue(); + int missionStatus = activityProgressInfo.getState(); + if (missionStatus == ActivityType.WILL_TAKE && item.getKey() != 0) { + return false; + } + } + return true; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/OnlineRewardActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/OnlineRewardActivity.java index 84e469d7c..f0000d9f0 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/OnlineRewardActivity.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/OnlineRewardActivity.java @@ -5,11 +5,11 @@ import com.ljsd.jieling.jbean.ActivityProgressInfo; import com.ljsd.jieling.logic.dao.UserManager; import com.ljsd.jieling.logic.dao.root.User; import com.ljsd.jieling.network.session.ISession; -import rpc.protocols.CommonProto; -import rpc.protocols.PlayerInfoProto; import com.ljsd.jieling.util.ItemUtil; import com.ljsd.jieling.util.MessageUtil; import config.SActivityRewardConfig; +import rpc.protocols.CommonProto; +import rpc.protocols.PlayerInfoProto; import util.TimeUtils; import java.util.*;