|
@@ -72,370 +72,430 @@ import pojo.xiugou.x1.pojo.log.mainline.MainlineBossTiming;
|
|
|
@Component
|
|
@Component
|
|
|
public class MainlineBattleProcessor extends BaseBattleProcessor<PbMainlineBattleParam> {
|
|
public class MainlineBattleProcessor extends BaseBattleProcessor<PbMainlineBattleParam> {
|
|
|
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private MainlinePlayerService mainlinePlayerService;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private MainlineSceneService mainlineSceneService;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private ItemRandomPackCache itemRandomPackCache;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private PlayerService playerService;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private BattleConstCache battleConstCache;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private MainlineDotLogger mainlineDotLogger;
|
|
|
|
|
- @Autowired
|
|
|
|
|
- private ExpLimitCache expLimitCache;
|
|
|
|
|
- @Autowired
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MainlinePlayerService mainlinePlayerService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MainlineSceneService mainlineSceneService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private ItemRandomPackCache itemRandomPackCache;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private PlayerService playerService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private BattleConstCache battleConstCache;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MainlineDotLogger mainlineDotLogger;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private ExpLimitCache expLimitCache;
|
|
|
|
|
+ @Autowired
|
|
|
private MainlineTreasureBoxCache mainlineTreasureBoxCache;
|
|
private MainlineTreasureBoxCache mainlineTreasureBoxCache;
|
|
|
- @Autowired
|
|
|
|
|
- private MainlineSceneCache mainlineSceneCache;
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public BattleType battleType() {
|
|
|
|
|
- return BattleType.MAINLINE;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public void canEnter(long playerId, int sceneId, PbMainlineBattleParam params) {
|
|
|
|
|
- MainlineScene mainlineScene = mainlineSceneService.getOrNull(playerId, sceneId);
|
|
|
|
|
- Asserts.isTrue(mainlineScene != null, TipsCode.MAINLINE_LOCK, sceneId);
|
|
|
|
|
-
|
|
|
|
|
- // TODO param.getStage()有没有超出最大难度
|
|
|
|
|
- Asserts.isTrue(mainlineScene.getMaxStage() + 1 >= params.getStage(), TipsCode.MAINLINE_STAGE_FRONT);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public BattleContext hasCurrContext(long playerId, int sceneId, PbMainlineBattleParam params) {
|
|
|
|
|
- int stage = params.getStage();
|
|
|
|
|
- if (stage == 0) {
|
|
|
|
|
- stage = 1;
|
|
|
|
|
- }
|
|
|
|
|
- BattleContext context = getContext(playerId);
|
|
|
|
|
- if (context != null && context.getSceneId() == sceneId && context.getStage() == stage) {
|
|
|
|
|
- return context;
|
|
|
|
|
- }
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- protected void doEnterSetParam(BattleContext context, PbMainlineBattleParam params) {
|
|
|
|
|
- int stage = params.getStage();
|
|
|
|
|
- if (stage == 0) {
|
|
|
|
|
- stage = 1;
|
|
|
|
|
- }
|
|
|
|
|
- context.setStage(stage);
|
|
|
|
|
-
|
|
|
|
|
- MainlinePlayer player = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
- player.setCurrBattleType(battleType().getValue());
|
|
|
|
|
- player.setCurrScene(context.getSceneId());
|
|
|
|
|
- mainlinePlayerService.update(player);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public Zone getZoneInfo(BattleContext context, int zoneId) {
|
|
|
|
|
- SceneZoneCfg sceneZoneCfg = sceneZoneCache.getInSceneIdZoneIdIndex(context.getSceneId(), zoneId);
|
|
|
|
|
- if (sceneZoneCfg.getSafeZone() == 1 || sceneZoneCfg.getSafeZone() == 0) {
|
|
|
|
|
- // TODO 进入安全区的时候复活所有参战英雄,并重置可复活次数
|
|
|
|
|
- MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
- entity.setReviveNum(battleConstCache.getMainline_revive_num());
|
|
|
|
|
- mainlinePlayerService.update(entity);
|
|
|
|
|
- context.reviveAllHero();
|
|
|
|
|
- }
|
|
|
|
|
- MapData2 mapData = MapCacheManager2.getMapcache().get(sceneZoneCfg.getMapData());
|
|
|
|
|
-
|
|
|
|
|
- MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), context.getSceneId());
|
|
|
|
|
- Zone zone = context.buildZone(zoneId, mapData, false);
|
|
|
|
|
- List<Sprite> removeSprites = null;
|
|
|
|
|
- for(Sprite sprite : zone.getSprites()) {
|
|
|
|
|
- if(mainlineScene.getKillMonsters().contains(sprite.getConfigId())) {
|
|
|
|
|
- if(removeSprites == null) {
|
|
|
|
|
- removeSprites = new ArrayList<>();
|
|
|
|
|
- }
|
|
|
|
|
- removeSprites.add(sprite);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if(removeSprites != null) {
|
|
|
|
|
- for(Sprite sprite : removeSprites) {
|
|
|
|
|
- zone.getSprites().remove(sprite);
|
|
|
|
|
- context.burySprite(sprite);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return zone;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public void onGiveUp(BattleContext context) {
|
|
|
|
|
- Asserts.isTrue(false, TipsCode.MAINLINE_NO_GIVEUP);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public void hasThisZone(BattleContext context, int zoneId) {
|
|
|
|
|
- // TODO 读配置
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public int switchHeroes(BattleContext context, int mainHero, List<PbFormationPos> pbPosList) {
|
|
|
|
|
- // TODO 判断当前区域是不是非交战区域
|
|
|
|
|
- FormationResult formationResult = this.updateFormation(context.getPlayerId(), mainHero, pbPosList);
|
|
|
|
|
- List<Hero> heroes = formationResult.getList().stream().map(v -> v.getHero()).collect(Collectors.toList());
|
|
|
|
|
- context.setHeroes(heroes, TeamSide.ATK);
|
|
|
|
|
- return formationResult.getMainHero();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public boolean canRebornWithTime() {
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public void doTeamRevive(BattleContext context) {
|
|
|
|
|
- MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
- // Asserts.isTrue(entity.getReviveNum() <= 0, TipsCode.BATTLE_NO_REVIVE);
|
|
|
|
|
-
|
|
|
|
|
- thingService.cost(context.getPlayerId(), battleConstCache.getMainline_revive_cost(), GameCause.MAINLINE_REVIVE);
|
|
|
|
|
-
|
|
|
|
|
- entity.setReviveNum(entity.getReviveNum() - 1);
|
|
|
|
|
- mainlinePlayerService.update(entity);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 返回到主线场景中
|
|
|
|
|
- public void returnToMainlineScene(long playerId) {
|
|
|
|
|
- BattleContext context = this.getContext(playerId);
|
|
|
|
|
- if(context != null) {
|
|
|
|
|
- BaseBattleProcessor.setCurr(context);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private MainlineSceneCache mainlineSceneCache;
|
|
|
|
|
|
|
|
- @Override
|
|
|
|
|
- public List<PbKillSprite> onKillSprite(BattleContext context, List<Integer> spriteIds) {
|
|
|
|
|
- MainlinePlayer mainlinePlayer = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
- MainlineSceneCfg mainlineSceneCfg = mainlineSceneCache.getOrThrow(context.getSceneId());
|
|
|
|
|
-
|
|
|
|
|
- long now = DateTimeUtil.currMillis();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public BattleType battleType() {
|
|
|
|
|
+ return BattleType.MAINLINE;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- List<PbKillSprite> killSprites = new ArrayList<>();
|
|
|
|
|
- List<RewardThing> allRewardList = new ArrayList<>();
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 通过实际场景ID查找配置
|
|
|
|
|
+ * @param sceneId 实际场景ID(配置表中的 sceneId 字段)
|
|
|
|
|
+ * @return 配置对象,如果找不到返回 null
|
|
|
|
|
+ */
|
|
|
|
|
+ private MainlineSceneCfg findConfigBySceneId(int sceneId) {
|
|
|
|
|
+ for (MainlineSceneCfg sceneCfg : mainlineSceneCache.all()) {
|
|
|
|
|
+ if (sceneCfg.getSceneId() == sceneId) {
|
|
|
|
|
+ return sceneCfg;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- boolean hasDropTreasureBox = false;
|
|
|
|
|
- Map<Integer, Integer> monsterMap = new HashMap<>();
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void canEnter(long playerId, int sceneId, PbMainlineBattleParam params) {
|
|
|
|
|
+ // 通过 sceneId 找到对应的配置(sceneId 是关联场景ID,配置表的 id 是主线ID)
|
|
|
|
|
+ MainlineSceneCfg cfg = findConfigBySceneId(sceneId);
|
|
|
|
|
+ Asserts.isTrue(cfg != null, TipsCode.MAINLINE_LOCK, sceneId);
|
|
|
|
|
+
|
|
|
|
|
+ // 使用配置的 id(主线ID)来查找玩家的场景数据
|
|
|
|
|
+ MainlineScene mainlineScene = mainlineSceneService.getOrNull(playerId, cfg.getId());
|
|
|
|
|
+ Asserts.isTrue(mainlineScene != null, TipsCode.MAINLINE_LOCK, sceneId);
|
|
|
|
|
|
|
|
- boolean needUpdate = false;
|
|
|
|
|
- for (int spriteId : spriteIds) {
|
|
|
|
|
- Sprite sprite = context.getAllSprites().get(spriteId);
|
|
|
|
|
- if (sprite == null) {
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- if (sprite.getSide() == TeamSide.ATK) {
|
|
|
|
|
- sprite.setAlive(false);
|
|
|
|
|
- sprite.setRebornTime(
|
|
|
|
|
- context.getNow() + battleConstCache.getMainline_revive_time() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
-
|
|
|
|
|
- PbKillSprite.Builder builder = PbKillSprite.newBuilder();
|
|
|
|
|
- builder.setId(sprite.getId());
|
|
|
|
|
- builder.setRebornTime(sprite.getRebornTime());
|
|
|
|
|
- killSprites.add(builder.build());
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- if (sprite.getRebornTime() > now || sprite.getRebornTime() < 0) {
|
|
|
|
|
- // 还没复活
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- monsterMap.put(sprite.getIdentity(), monsterMap.getOrDefault(sprite.getIdentity(), 0) + 1); // 击杀怪物ID
|
|
|
|
|
- needUpdate = true;
|
|
|
|
|
|
|
+ // TODO param.getStage()有没有超出最大难度
|
|
|
|
|
+ Asserts.isTrue(mainlineScene.getMaxStage() + 1 >= params.getStage(), TipsCode.MAINLINE_STAGE_FRONT);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- PbKillSprite pbSprite = killSprite(context, sprite, mainlinePlayer, allRewardList, hasDropTreasureBox);
|
|
|
|
|
- if(pbSprite.getHasBox()) {
|
|
|
|
|
- hasDropTreasureBox = true;
|
|
|
|
|
- }
|
|
|
|
|
- killSprites.add(pbSprite);
|
|
|
|
|
-
|
|
|
|
|
- if(sprite.getConfigId() == mainlineSceneCfg.getBossId() && mainlineSceneCfg.getNextScene() > 0) {
|
|
|
|
|
- MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), mainlineSceneCfg.getId());
|
|
|
|
|
- if(!mainlineScene.isOpenNext()) {
|
|
|
|
|
- mainlineScene.setOpenNext(true);
|
|
|
|
|
- mainlineSceneService.update(mainlineScene);
|
|
|
|
|
- //初始化下一场景的数据
|
|
|
|
|
- MainlineScene newScene = mainlineSceneService.newScene(context.getPlayerId(), mainlineSceneCfg.getNextScene());
|
|
|
|
|
- //推送开启下一场景入口
|
|
|
|
|
- MainlineOpenNextMessage.Builder message = MainlineOpenNextMessage.newBuilder();
|
|
|
|
|
- message.setCurrSceneId(mainlineScene.getIdentity());
|
|
|
|
|
- message.setCurrOpenNext(mainlineScene.isOpenNext());
|
|
|
|
|
- message.setNewScene(MainlineSceneService.build(newScene));
|
|
|
|
|
- playerContextManager.push(mainlineScene.getPid(), MainlineOpenNextMessage.Proto.ID, message.build());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public BattleContext hasCurrContext(long playerId, int sceneId, PbMainlineBattleParam params) {
|
|
|
|
|
+ int stage = params.getStage();
|
|
|
|
|
+ if (stage == 0) {
|
|
|
|
|
+ stage = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ BattleContext context = getContext(playerId);
|
|
|
|
|
+ if (context != null && context.getSceneId() == sceneId && context.getStage() == stage) {
|
|
|
|
|
+ return context;
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ protected void doEnterSetParam(BattleContext context, PbMainlineBattleParam params) {
|
|
|
|
|
+ int stage = params.getStage();
|
|
|
|
|
+ if (stage == 0) {
|
|
|
|
|
+ stage = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ context.setStage(stage);
|
|
|
|
|
+
|
|
|
|
|
+ MainlinePlayer player = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ player.setCurrBattleType(battleType().getValue());
|
|
|
|
|
+ player.setCurrScene(context.getSceneId());
|
|
|
|
|
+ mainlinePlayerService.update(player);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if(!monsterMap.isEmpty()) {
|
|
|
|
|
- if (!allRewardList.isEmpty()) {
|
|
|
|
|
- if(mainlinePlayer.isCamping()) {
|
|
|
|
|
- //记录露营过程中产生的奖励
|
|
|
|
|
- mainlinePlayer.addCampProduces(allRewardList);
|
|
|
|
|
- }
|
|
|
|
|
- for(RewardThing rewardThing : allRewardList) {
|
|
|
|
|
- if(rewardThing.getNum() <= 0) {
|
|
|
|
|
- logger.error("奖励有0值{}", GsonUtil.toJson(allRewardList));
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- thingService.add(context.getPlayerId(), allRewardList, GameCause.MAINLINE_DROP, NoticeType.SLIENT);
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Zone getZoneInfo(BattleContext context, int zoneId) {
|
|
|
|
|
+ // 通过实际场景ID找到配置(context.getSceneId() 是实际场景ID,需要转换为配置表的ID)
|
|
|
|
|
+ MainlineSceneCfg cfg = findConfigBySceneId(context.getSceneId());
|
|
|
|
|
+ Asserts.isTrue(cfg != null, TipsCode.MAINLINE_LOCK, context.getSceneId());
|
|
|
|
|
+
|
|
|
|
|
+ // 使用配置的 sceneId(关联场景ID)查找区域配置
|
|
|
|
|
+ SceneZoneCfg sceneZoneCfg = sceneZoneCache.getInSceneIdZoneIdIndex(cfg.getSceneId(), zoneId);
|
|
|
|
|
+ if (sceneZoneCfg.getSafeZone() == 1 || sceneZoneCfg.getSafeZone() == 0) {
|
|
|
|
|
+ // TODO 进入安全区的时候复活所有参战英雄,并重置可复活次数
|
|
|
|
|
+ MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ entity.setReviveNum(battleConstCache.getMainline_revive_num());
|
|
|
|
|
+ mainlinePlayerService.update(entity);
|
|
|
|
|
+ context.reviveAllHero();
|
|
|
|
|
+ }
|
|
|
|
|
+ MapData2 mapData = MapCacheManager2.getMapcache().get(sceneZoneCfg.getMapData());
|
|
|
|
|
+
|
|
|
|
|
+ // 使用配置的 id(主线ID)查找玩家的场景数据
|
|
|
|
|
+ MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), cfg.getId());
|
|
|
|
|
+ Zone zone = context.buildZone(zoneId, mapData, false);
|
|
|
|
|
+ List<Sprite> removeSprites = null;
|
|
|
|
|
+ for (Sprite sprite : zone.getSprites()) {
|
|
|
|
|
+ if (mainlineScene.getKillMonsters().contains(sprite.getConfigId())) {
|
|
|
|
|
+ if (removeSprites == null) {
|
|
|
|
|
+ removeSprites = new ArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+ removeSprites.add(sprite);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (removeSprites != null) {
|
|
|
|
|
+ for (Sprite sprite : removeSprites) {
|
|
|
|
|
+ zone.getSprites().remove(sprite);
|
|
|
|
|
+ context.burySprite(sprite);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return zone;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void onGiveUp(BattleContext context) {
|
|
|
|
|
+ Asserts.isTrue(false, TipsCode.MAINLINE_NO_GIVEUP);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void hasThisZone(BattleContext context, int zoneId) {
|
|
|
|
|
+ // TODO 读配置
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int switchHeroes(BattleContext context, int mainHero, List<PbFormationPos> pbPosList) {
|
|
|
|
|
+ // TODO 判断当前区域是不是非交战区域
|
|
|
|
|
+ FormationResult formationResult = this.updateFormation(context.getPlayerId(), mainHero, pbPosList);
|
|
|
|
|
+ List<Hero> heroes = formationResult.getList().stream().map(v -> v.getHero()).collect(Collectors.toList());
|
|
|
|
|
+ context.setHeroes(heroes, TeamSide.ATK);
|
|
|
|
|
+ return formationResult.getMainHero();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean canRebornWithTime() {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void doTeamRevive(BattleContext context) {
|
|
|
|
|
+ MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ // Asserts.isTrue(entity.getReviveNum() <= 0, TipsCode.BATTLE_NO_REVIVE);
|
|
|
|
|
+
|
|
|
|
|
+ thingService.cost(context.getPlayerId(), battleConstCache.getMainline_revive_cost(), GameCause.MAINLINE_REVIVE);
|
|
|
|
|
+
|
|
|
|
|
+ entity.setReviveNum(entity.getReviveNum() - 1);
|
|
|
|
|
+ mainlinePlayerService.update(entity);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 返回到主线场景中
|
|
|
|
|
+ public void returnToMainlineScene(long playerId) {
|
|
|
|
|
+ BattleContext context = this.getContext(playerId);
|
|
|
|
|
+ if (context != null) {
|
|
|
|
|
+ BaseBattleProcessor.setCurr(context);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //进入下一个场景,领地,特殊处理
|
|
|
|
|
+ public void enterNextScene(BattleContext context, int nextSceneId) {
|
|
|
|
|
+ MainlinePlayer mainlinePlayer = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ // 通过实际场景ID找到配置(context.getSceneId() 是实际场景ID,需要转换为配置表的ID)
|
|
|
|
|
+ MainlineSceneCfg mainlineSceneCfg = findConfigBySceneId(context.getSceneId());
|
|
|
|
|
+ Asserts.isTrue(mainlineSceneCfg != null, TipsCode.MAINLINE_LOCK, context.getSceneId());
|
|
|
|
|
+ boolean needUpdate = false;
|
|
|
|
|
+ //1001000是领地
|
|
|
|
|
+ if (mainlineSceneCfg.getSceneId()== 1001000 && mainlineSceneCfg.getNextScene() > 0) {
|
|
|
|
|
+ // 使用配置的 id(主线ID)查找玩家的场景数据
|
|
|
|
|
+ MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), mainlineSceneCfg.getId());
|
|
|
|
|
+ if (!mainlineScene.isOpenNext()) {
|
|
|
|
|
+ mainlineScene.setOpenNext(true);
|
|
|
|
|
+ mainlineSceneService.update(mainlineScene);
|
|
|
|
|
+ //初始化下一场景的数据
|
|
|
|
|
+ MainlineScene newScene = mainlineSceneService.newScene(context.getPlayerId(), mainlineSceneCfg.getNextScene());
|
|
|
|
|
+ //推送开启下一场景入口
|
|
|
|
|
+ MainlineOpenNextMessage.Builder message = MainlineOpenNextMessage.newBuilder();
|
|
|
|
|
+ message.setCurrSceneId(mainlineScene.getIdentity());
|
|
|
|
|
+ message.setCurrOpenNext(mainlineScene.isOpenNext());
|
|
|
|
|
+ message.setNewScene(MainlineSceneService.build(newScene));
|
|
|
|
|
+ playerContextManager.push(mainlineScene.getPid(), MainlineOpenNextMessage.Proto.ID, message.build());
|
|
|
|
|
+ needUpdate = true;
|
|
|
}
|
|
}
|
|
|
- EventBus.post(KillMonsterEvent.of(mainlinePlayer.getPid(), monsterMap, allRewardList));
|
|
|
|
|
}
|
|
}
|
|
|
- if(needUpdate) {
|
|
|
|
|
|
|
+ if (needUpdate) {
|
|
|
mainlinePlayerService.update(mainlinePlayer);
|
|
mainlinePlayerService.update(mainlinePlayer);
|
|
|
}
|
|
}
|
|
|
- return killSprites;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public PbBattleEndData checkBattleEnd(BattleContext context) {
|
|
|
|
|
- if (!context.isAtkTeamAllDead()) {
|
|
|
|
|
- PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
- builder.setStatus(PbBattleEndStatus.BATTLING);
|
|
|
|
|
- return builder.build();
|
|
|
|
|
- }
|
|
|
|
|
- MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
- if (entity.isCamping()) {
|
|
|
|
|
- PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
- builder.setStatus(PbBattleEndStatus.ATK_ALL_DEAD_CAMPING);
|
|
|
|
|
- return builder.build();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- //TODO 攻方已经全死
|
|
|
|
|
- entity.setAllDeadNum(entity.getAllDeadNum() + 1);
|
|
|
|
|
- mainlinePlayerService.update(entity);
|
|
|
|
|
-
|
|
|
|
|
- EventBus.post(MainlineAllDeadEvent.of(context.getPlayerId()));
|
|
|
|
|
-
|
|
|
|
|
- if (entity.getReviveNum() <= 0) {
|
|
|
|
|
- PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
- builder.setStatus(PbBattleEndStatus.FAIL);
|
|
|
|
|
- return builder.build();
|
|
|
|
|
- }
|
|
|
|
|
- PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
- builder.setStatus(PbBattleEndStatus.WAIT_REVIVE);
|
|
|
|
|
-
|
|
|
|
|
- PbMainlineBattleResult.Builder result = PbMainlineBattleResult.newBuilder();
|
|
|
|
|
- result.setReviveNum(entity.getReviveNum());
|
|
|
|
|
- builder.setData(result.build().toByteString());
|
|
|
|
|
- return builder.build();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public List<Sprite> refreshMonster(BattleContext context, int zoneId, MapMonsterPoint monsterPoint) {
|
|
|
|
|
- // 主线战斗不用刷怪点的方式刷怪
|
|
|
|
|
- return Collections.emptyList();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- protected PbMainlineBattleParam parseParams(ByteString params) {
|
|
|
|
|
- try {
|
|
|
|
|
- return PbMainlineBattleParam.parseFrom(params);
|
|
|
|
|
- } catch (InvalidProtocolBufferException e) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public void cleanBattle() {
|
|
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
|
|
- for(BattleContext battleContext : this.playerToContextMap.values()) {
|
|
|
|
|
- if(playerContextManager.isOnline(battleContext.getPlayerId())) {
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
- Player player = playerService.getEntity(battleContext.getPlayerId());
|
|
|
|
|
- if(player.getLastLogoutTime().plusMinutes(30).isBefore(now)) {
|
|
|
|
|
- this.playerToContextMap.remove(battleContext.getPlayerId());
|
|
|
|
|
-
|
|
|
|
|
- BattleContext currContext = BaseBattleProcessor.getCurrContext(player.getId());
|
|
|
|
|
- if(currContext != null && currContext.getBattleType().getValue() == BattleType.MAINLINE.getValue()) {
|
|
|
|
|
- BaseBattleProcessor.cleanCurr(currContext);
|
|
|
|
|
- }
|
|
|
|
|
- logger.info("玩家{}-{}离线后回收战斗上下文", player.getId(), player.getNick());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private TreasureBox dropTreasureBox(Player player, MainlinePlayer mainlinePlayer, MonsterCfg monsterCfg) {
|
|
|
|
|
- if(mainlinePlayer.getTreasureNum() >= battleConstCache.getMainline_box_max_num()) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- if(player.getLevel() - monsterCfg.getLevel() >= battleConstCache.getBoss_drop_level_limit()) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- //击杀BOSS
|
|
|
|
|
- MainlineTreasureBoxCfg mainlineTreasureBoxCfg = mainlineTreasureBoxCache.getBossBox(monsterCfg.getId());
|
|
|
|
|
- if(mainlineTreasureBoxCfg == null) {
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- TreasureBox treasureBox = new TreasureBox();
|
|
|
|
|
- treasureBox.setBoxType(MlTreasureBoxType.BOSS.getValue());
|
|
|
|
|
- treasureBox.setDisappearTime(DateTimeUtil.currMillis() + battleConstCache.getMainline_box_time() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
- treasureBox.setBoxArg(monsterCfg.getId());
|
|
|
|
|
- mainlinePlayer.setBossTreasure(treasureBox);
|
|
|
|
|
- return treasureBox;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private PbKillSprite killSprite(BattleContext context, Sprite sprite, MainlinePlayer mainlinePlayer, List<RewardThing> outRewards, boolean hasDropTreasureBox) {
|
|
|
|
|
- MonsterConfig monsterCfg = monsterCache.getOrThrow(sprite.getIdentity());
|
|
|
|
|
- sprite.setAlive(false);
|
|
|
|
|
- if(monsterCfg.getRefreshTime() > 0) {
|
|
|
|
|
- sprite.setRebornTime(context.getNow() + monsterCfg.getRefreshTime() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
- } else {
|
|
|
|
|
- sprite.setRebornTime(-1);
|
|
|
|
|
- MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), context.getSceneId());
|
|
|
|
|
- mainlineScene.getKillMonsters().add(monsterCfg.getId());
|
|
|
|
|
- mainlineSceneService.update(mainlineScene);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- PbKillSprite.Builder builder = PbKillSprite.newBuilder();
|
|
|
|
|
- builder.setId(sprite.getId());
|
|
|
|
|
- if (monsterCfg.getType() == 3) {
|
|
|
|
|
- Player player = playerService.getEntity(context.getPlayerId());
|
|
|
|
|
- //判断BOSS掉落宝箱
|
|
|
|
|
- if(!hasDropTreasureBox) {
|
|
|
|
|
- TreasureBox treasureBox = dropTreasureBox(player, mainlinePlayer, monsterCfg);
|
|
|
|
|
- if(treasureBox != null) {
|
|
|
|
|
- builder.setHasBox(true);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- //挂机BOSS的ID
|
|
|
|
|
- if(mainlinePlayer.getHangBossId() == 0) {
|
|
|
|
|
- mainlinePlayer.setHangBossId(monsterCfg.getId());
|
|
|
|
|
- } else {
|
|
|
|
|
- MonsterConfig currBossCfg = monsterCache.getOrThrow(mainlinePlayer.getHangBossId());
|
|
|
|
|
- if(monsterCfg.getLevel() > currBossCfg.getLevel()) {
|
|
|
|
|
- mainlinePlayer.setHangBossId(monsterCfg.getId());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- mainlineDotLogger.addBossDot(player.getId(), player.getFighting(), monsterCfg, MainlineBossTiming.KILL);
|
|
|
|
|
- }
|
|
|
|
|
- mainlinePlayer.setKillNum(mainlinePlayer.getKillNum() + 1);
|
|
|
|
|
- //奖励相关
|
|
|
|
|
- List<RewardThing> rewardList = new ArrayList<>();
|
|
|
|
|
- float expRate = expLimitCache.getExpRate(mainlinePlayer.getKillNum());
|
|
|
|
|
- RewardThing rewardThing = ThingUtil.multiplyReward(monsterCfg.getProduce(), expRate);
|
|
|
|
|
- //高级露营中经验翻倍
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<PbKillSprite> onKillSprite(BattleContext context, List<Integer> spriteIds) {
|
|
|
|
|
+ MainlinePlayer mainlinePlayer = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ // 通过实际场景ID找到配置(context.getSceneId() 是实际场景ID,需要转换为配置表的ID)
|
|
|
|
|
+ MainlineSceneCfg mainlineSceneCfg = findConfigBySceneId(context.getSceneId());
|
|
|
|
|
+ Asserts.isTrue(mainlineSceneCfg != null, TipsCode.MAINLINE_LOCK, context.getSceneId());
|
|
|
|
|
+
|
|
|
|
|
+ long now = DateTimeUtil.currMillis();
|
|
|
|
|
+
|
|
|
|
|
+ List<PbKillSprite> killSprites = new ArrayList<>();
|
|
|
|
|
+ List<RewardThing> allRewardList = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ boolean hasDropTreasureBox = false;
|
|
|
|
|
+ Map<Integer, Integer> monsterMap = new HashMap<>();
|
|
|
|
|
+
|
|
|
|
|
+ boolean needUpdate = false;
|
|
|
|
|
+ for (int spriteId : spriteIds) {
|
|
|
|
|
+ Sprite sprite = context.getAllSprites().get(spriteId);
|
|
|
|
|
+ if (sprite == null) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sprite.getSide() == TeamSide.ATK) {
|
|
|
|
|
+ sprite.setAlive(false);
|
|
|
|
|
+ sprite.setRebornTime(
|
|
|
|
|
+ context.getNow() + battleConstCache.getMainline_revive_time() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
+
|
|
|
|
|
+ PbKillSprite.Builder builder = PbKillSprite.newBuilder();
|
|
|
|
|
+ builder.setId(sprite.getId());
|
|
|
|
|
+ builder.setRebornTime(sprite.getRebornTime());
|
|
|
|
|
+ killSprites.add(builder.build());
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sprite.getRebornTime() > now || sprite.getRebornTime() < 0) {
|
|
|
|
|
+ // 还没复活
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ monsterMap.put(sprite.getIdentity(), monsterMap.getOrDefault(sprite.getIdentity(), 0) + 1); // 击杀怪物ID
|
|
|
|
|
+ needUpdate = true;
|
|
|
|
|
+
|
|
|
|
|
+ PbKillSprite pbSprite = killSprite(context, sprite, mainlinePlayer, allRewardList, hasDropTreasureBox);
|
|
|
|
|
+ if (pbSprite.getHasBox()) {
|
|
|
|
|
+ hasDropTreasureBox = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ killSprites.add(pbSprite);
|
|
|
|
|
+ if (sprite.getConfigId() == mainlineSceneCfg.getBossId() && mainlineSceneCfg.getNextScene() > 0) {
|
|
|
|
|
+ MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), mainlineSceneCfg.getId());
|
|
|
|
|
+ if (!mainlineScene.isOpenNext()) {
|
|
|
|
|
+ mainlineScene.setOpenNext(true);
|
|
|
|
|
+ mainlineSceneService.update(mainlineScene);
|
|
|
|
|
+ //初始化下一场景的数据
|
|
|
|
|
+ MainlineScene newScene = mainlineSceneService.newScene(context.getPlayerId(), mainlineSceneCfg.getNextScene());
|
|
|
|
|
+ //推送开启下一场景入口
|
|
|
|
|
+ MainlineOpenNextMessage.Builder message = MainlineOpenNextMessage.newBuilder();
|
|
|
|
|
+ message.setCurrSceneId(mainlineScene.getIdentity());
|
|
|
|
|
+ message.setCurrOpenNext(mainlineScene.isOpenNext());
|
|
|
|
|
+ message.setNewScene(MainlineSceneService.build(newScene));
|
|
|
|
|
+ playerContextManager.push(mainlineScene.getPid(), MainlineOpenNextMessage.Proto.ID, message.build());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!monsterMap.isEmpty()) {
|
|
|
|
|
+ if (!allRewardList.isEmpty()) {
|
|
|
|
|
+ if (mainlinePlayer.isCamping()) {
|
|
|
|
|
+ //记录露营过程中产生的奖励
|
|
|
|
|
+ mainlinePlayer.addCampProduces(allRewardList);
|
|
|
|
|
+ }
|
|
|
|
|
+ for (RewardThing rewardThing : allRewardList) {
|
|
|
|
|
+ if (rewardThing.getNum() <= 0) {
|
|
|
|
|
+ logger.error("奖励有0值{}", GsonUtil.toJson(allRewardList));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ thingService.add(context.getPlayerId(), allRewardList, GameCause.MAINLINE_DROP, NoticeType.SLIENT);
|
|
|
|
|
+ }
|
|
|
|
|
+ EventBus.post(KillMonsterEvent.of(mainlinePlayer.getPid(), monsterMap, allRewardList));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (needUpdate) {
|
|
|
|
|
+ mainlinePlayerService.update(mainlinePlayer);
|
|
|
|
|
+ }
|
|
|
|
|
+ return killSprites;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PbBattleEndData checkBattleEnd(BattleContext context) {
|
|
|
|
|
+ if (!context.isAtkTeamAllDead()) {
|
|
|
|
|
+ PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
+ builder.setStatus(PbBattleEndStatus.BATTLING);
|
|
|
|
|
+ return builder.build();
|
|
|
|
|
+ }
|
|
|
|
|
+ MainlinePlayer entity = mainlinePlayerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ if (entity.isCamping()) {
|
|
|
|
|
+ PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
+ builder.setStatus(PbBattleEndStatus.ATK_ALL_DEAD_CAMPING);
|
|
|
|
|
+ return builder.build();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //TODO 攻方已经全死
|
|
|
|
|
+ entity.setAllDeadNum(entity.getAllDeadNum() + 1);
|
|
|
|
|
+ mainlinePlayerService.update(entity);
|
|
|
|
|
+
|
|
|
|
|
+ EventBus.post(MainlineAllDeadEvent.of(context.getPlayerId()));
|
|
|
|
|
+
|
|
|
|
|
+ if (entity.getReviveNum() <= 0) {
|
|
|
|
|
+ PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
+ builder.setStatus(PbBattleEndStatus.FAIL);
|
|
|
|
|
+ return builder.build();
|
|
|
|
|
+ }
|
|
|
|
|
+ PbBattleEndData.Builder builder = PbBattleEndData.newBuilder();
|
|
|
|
|
+ builder.setStatus(PbBattleEndStatus.WAIT_REVIVE);
|
|
|
|
|
+
|
|
|
|
|
+ PbMainlineBattleResult.Builder result = PbMainlineBattleResult.newBuilder();
|
|
|
|
|
+ result.setReviveNum(entity.getReviveNum());
|
|
|
|
|
+ builder.setData(result.build().toByteString());
|
|
|
|
|
+ return builder.build();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<Sprite> refreshMonster(BattleContext context, int zoneId, MapMonsterPoint monsterPoint) {
|
|
|
|
|
+ // 主线战斗不用刷怪点的方式刷怪
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ protected PbMainlineBattleParam parseParams(ByteString params) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return PbMainlineBattleParam.parseFrom(params);
|
|
|
|
|
+ } catch (InvalidProtocolBufferException e) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void cleanBattle() {
|
|
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
|
|
+ for (BattleContext battleContext : this.playerToContextMap.values()) {
|
|
|
|
|
+ if (playerContextManager.isOnline(battleContext.getPlayerId())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ Player player = playerService.getEntity(battleContext.getPlayerId());
|
|
|
|
|
+ if (player.getLastLogoutTime().plusMinutes(30).isBefore(now)) {
|
|
|
|
|
+ this.playerToContextMap.remove(battleContext.getPlayerId());
|
|
|
|
|
+
|
|
|
|
|
+ BattleContext currContext = BaseBattleProcessor.getCurrContext(player.getId());
|
|
|
|
|
+ if (currContext != null && currContext.getBattleType().getValue() == BattleType.MAINLINE.getValue()) {
|
|
|
|
|
+ BaseBattleProcessor.cleanCurr(currContext);
|
|
|
|
|
+ }
|
|
|
|
|
+ logger.info("玩家{}-{}离线后回收战斗上下文", player.getId(), player.getNick());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private TreasureBox dropTreasureBox(Player player, MainlinePlayer mainlinePlayer, MonsterCfg monsterCfg) {
|
|
|
|
|
+ if (mainlinePlayer.getTreasureNum() >= battleConstCache.getMainline_box_max_num()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (player.getLevel() - monsterCfg.getLevel() >= battleConstCache.getBoss_drop_level_limit()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ //击杀BOSS
|
|
|
|
|
+ MainlineTreasureBoxCfg mainlineTreasureBoxCfg = mainlineTreasureBoxCache.getBossBox(monsterCfg.getId());
|
|
|
|
|
+ if (mainlineTreasureBoxCfg == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ TreasureBox treasureBox = new TreasureBox();
|
|
|
|
|
+ treasureBox.setBoxType(MlTreasureBoxType.BOSS.getValue());
|
|
|
|
|
+ treasureBox.setDisappearTime(DateTimeUtil.currMillis() + battleConstCache.getMainline_box_time() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
+ treasureBox.setBoxArg(monsterCfg.getId());
|
|
|
|
|
+ mainlinePlayer.setBossTreasure(treasureBox);
|
|
|
|
|
+ return treasureBox;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private PbKillSprite killSprite(BattleContext context, Sprite sprite, MainlinePlayer mainlinePlayer, List<RewardThing> outRewards, boolean hasDropTreasureBox) {
|
|
|
|
|
+ MonsterConfig monsterCfg = monsterCache.getOrThrow(sprite.getIdentity());
|
|
|
|
|
+ sprite.setAlive(false);
|
|
|
|
|
+ if (monsterCfg.getRefreshTime() > 0) {
|
|
|
|
|
+ sprite.setRebornTime(context.getNow() + monsterCfg.getRefreshTime() * DateTimeUtil.ONE_SECOND_MILLIS);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ sprite.setRebornTime(-1);
|
|
|
|
|
+ // 通过实际场景ID找到配置,然后使用配置的 id(主线ID)查找玩家的场景数据
|
|
|
|
|
+ MainlineSceneCfg cfg = findConfigBySceneId(context.getSceneId());
|
|
|
|
|
+ if (cfg != null) {
|
|
|
|
|
+ MainlineScene mainlineScene = mainlineSceneService.getOrThrow(context.getPlayerId(), cfg.getId());
|
|
|
|
|
+ mainlineScene.getKillMonsters().add(monsterCfg.getId());
|
|
|
|
|
+ mainlineSceneService.update(mainlineScene);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ PbKillSprite.Builder builder = PbKillSprite.newBuilder();
|
|
|
|
|
+ builder.setId(sprite.getId());
|
|
|
|
|
+ if (monsterCfg.getType() == 3) {
|
|
|
|
|
+ Player player = playerService.getEntity(context.getPlayerId());
|
|
|
|
|
+ //判断BOSS掉落宝箱
|
|
|
|
|
+ if (!hasDropTreasureBox) {
|
|
|
|
|
+ TreasureBox treasureBox = dropTreasureBox(player, mainlinePlayer, monsterCfg);
|
|
|
|
|
+ if (treasureBox != null) {
|
|
|
|
|
+ builder.setHasBox(true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ //挂机BOSS的ID
|
|
|
|
|
+ if (mainlinePlayer.getHangBossId() == 0) {
|
|
|
|
|
+ mainlinePlayer.setHangBossId(monsterCfg.getId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ MonsterConfig currBossCfg = monsterCache.getOrThrow(mainlinePlayer.getHangBossId());
|
|
|
|
|
+ if (monsterCfg.getLevel() > currBossCfg.getLevel()) {
|
|
|
|
|
+ mainlinePlayer.setHangBossId(monsterCfg.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ mainlineDotLogger.addBossDot(player.getId(), player.getFighting(), monsterCfg, MainlineBossTiming.KILL);
|
|
|
|
|
+ }
|
|
|
|
|
+ mainlinePlayer.setKillNum(mainlinePlayer.getKillNum() + 1);
|
|
|
|
|
+ //奖励相关
|
|
|
|
|
+ List<RewardThing> rewardList = new ArrayList<>();
|
|
|
|
|
+ float expRate = expLimitCache.getExpRate(mainlinePlayer.getKillNum());
|
|
|
|
|
+ RewardThing rewardThing = ThingUtil.multiplyReward(monsterCfg.getProduce(), expRate);
|
|
|
|
|
+ //高级露营中经验翻倍
|
|
|
float campingAdvRate = 1.0f;
|
|
float campingAdvRate = 1.0f;
|
|
|
- if(mainlinePlayer.isCampingAdv()) {
|
|
|
|
|
- campingAdvRate = battleConstCache.getCamp_adv_exp_buff() / 10000.0f;
|
|
|
|
|
- }
|
|
|
|
|
- if(rewardThing.getNum() > 0) {
|
|
|
|
|
- if(campingAdvRate > 1) {
|
|
|
|
|
- rewardThing = ThingUtil.multiplyReward(rewardThing, campingAdvRate);
|
|
|
|
|
- }
|
|
|
|
|
- rewardList.add(rewardThing);
|
|
|
|
|
- }
|
|
|
|
|
- if (!monsterCfg.getRandomProduce().isEmpty()) {
|
|
|
|
|
- rewardList.addAll(itemRandomPackCache.randomReward(monsterCfg.getRandomProduce()));
|
|
|
|
|
- }
|
|
|
|
|
- for (RewardThing reward : rewardList) {
|
|
|
|
|
|
|
+ if (mainlinePlayer.isCampingAdv()) {
|
|
|
|
|
+ campingAdvRate = battleConstCache.getCamp_adv_exp_buff() / 10000.0f;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (rewardThing.getNum() > 0) {
|
|
|
|
|
+ if (campingAdvRate > 1) {
|
|
|
|
|
+ rewardThing = ThingUtil.multiplyReward(rewardThing, campingAdvRate);
|
|
|
|
|
+ }
|
|
|
|
|
+ rewardList.add(rewardThing);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!monsterCfg.getRandomProduce().isEmpty()) {
|
|
|
|
|
+ rewardList.addAll(itemRandomPackCache.randomReward(monsterCfg.getRandomProduce()));
|
|
|
|
|
+ }
|
|
|
|
|
+ for (RewardThing reward : rewardList) {
|
|
|
builder.addDrops(PbHelper.build(reward));
|
|
builder.addDrops(PbHelper.build(reward));
|
|
|
- }
|
|
|
|
|
- builder.setRebornTime(sprite.getRebornTime());
|
|
|
|
|
-
|
|
|
|
|
- outRewards.addAll(rewardList);
|
|
|
|
|
- return builder.build();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ builder.setRebornTime(sprite.getRebornTime());
|
|
|
|
|
+
|
|
|
|
|
+ outRewards.addAll(rewardList);
|
|
|
|
|
+ return builder.build();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|