Sfoglia il codice sorgente

修改进入场景bug

flowerpig 4 mesi fa
parent
commit
b8b107976a
24 ha cambiato i file con 1305 aggiunte e 1043 eliminazioni
  1. 1 0
      gaming
  2. 3 2
      pom.xml
  3. 3 2
      x1-backstage/pom.xml
  4. 2 1
      x1-backstage/restart-backstage.sh
  5. 26 0
      x1-backstage/start.sh
  6. 2 0
      x1-battle/src/main/java/com/xiugou/x1/battle/BattleContext.java
  7. 4 0
      x1-battle/src/main/java/com/xiugou/x1/battle/IBattleProcessor.java
  8. 9 0
      x1-design/src/main/java/com/xiugou/x1/design/module/RobotListCache.java
  9. 107 107
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/ChannelSdkArgsAbstractCache.java
  10. 74 74
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageAutoAbstractCache.java
  11. 95 95
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageCustomizeAbstractCache.java
  12. 74 74
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageTipsAbstractCache.java
  13. 125 125
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/NameRandomAbstractCache.java
  14. 47 0
      x1-design/src/main/java/com/xiugou/x1/design/module/autogen/RobotListAbstractCache.java
  15. 2 1
      x1-game-server/src/main/java/com/xiugou/x1/game/server/X1GameServer.java
  16. 4 0
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/arena/service/ArenaDefBattleProcessor.java
  17. 34 4
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/BattleHandler.java
  18. 5 1
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/processor/BaseBattleProcessor.java
  19. 32 9
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/service/BattleService.java
  20. 413 353
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/mainline/service/MainlineBattleProcessor.java
  21. 1 0
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/player/PlayerHandler.java
  22. 1 1
      x1-game-server/src/main/java/com/xiugou/x1/game/server/module/tower/service/StrengthTowerBattleProcessor.java
  23. 238 194
      x1-protobuf/src/main/java/pb/xiugou/x1/protobuf/battle/Battle.java
  24. 3 0
      x1-protobuf/src/main/java/pb/xiugou/x1/protobuf/player/Player.java

+ 1 - 0
gaming

@@ -0,0 +1 @@
+Subproject commit 564ce96fe7c174deeb74469cf156fe3f80b2d027

+ 3 - 2
pom.xml

@@ -14,13 +14,14 @@
 	<version>0.0.1</version>
 
 	<modules>
+		<module>gaming</module>
 		<module>x1-protobuf</module>
 		<module>x1-battle</module>
 		<module>x1-design</module>
 		<module>x1-pojo</module>
 		<module>x1-game-server</module>
 		<module>x1-backstage</module>
-    <module>x1-cross-server</module>
+    	<module>x1-cross-server</module>
   </modules>
 
 	<properties>
@@ -68,7 +69,7 @@
 						<configuration>
 							<echo message="${project.build.directory}"/>
 						    <outputDirectory>${project.build.directory}/common-libs</outputDirectory>
-							<outputDirectory>../common-libs</outputDirectory>
+							<outputDirectory>./common-libs</outputDirectory>
 							<excludeGroupIds>game,xiugou,gaming-project</excludeGroupIds>
 						</configuration>
 					</execution>

+ 3 - 2
x1-backstage/pom.xml

@@ -15,15 +15,16 @@
 		<dependency>
 			<groupId>xiugou</groupId>
 			<artifactId>x1-pojo</artifactId>
-			<version>${xiugou.x1.version}</version>
+			<version>0.0.1</version>
 		</dependency>
 		<dependency>
 			<groupId>gaming-project</groupId>
 			<artifactId>gaming-backstage</artifactId>
-			<version>${gaming.version}</version>
+			<version>0.0.1</version>
 		</dependency>
 	</dependencies>
 
+
 	<build>
 		<plugins>
 			<plugin>

+ 2 - 1
x1-backstage/restart-backstage.sh

@@ -22,13 +22,14 @@ import com.xiugou.x1.backstage.foundation.starting.ProjectBooter;
 public class X1BackStage {
 
 	public static void main(String[] args) {
+
 		SpringApplication springApplication = new SpringApplication();
 		// 服务器启动引导
 		springApplication.addListeners(new ProjectBooter());
-
 		springApplication.addPrimarySources(Collections.singletonList(X1BackStage.class));
 		springApplication.run(args);
 
+
 		ConsoleUtil.addFunction("stop", () -> { System.exit(0); });
 		ConsoleUtil.addFunction("printConsoleFunction", ConsoleUtil::printFunction);
 		ConsoleUtil.addFunction("printEventTrace", EventBus::printTrace);

+ 26 - 0
x1-backstage/start.sh

@@ -0,0 +1,26 @@
+#!/bin/bash
+
+server_path=$(cd "$(dirname "$0")"/; pwd)
+
+echo -e "\nstop $server_path "
+
+for (( i=1; i<=100; i++))
+do
+        process=`ps -ef |grep -v 'grep' | grep "java" | grep $server_path/ | awk '{print $2}'`
+        if [[ $process -gt 0 ]];then
+            kill -15 $process
+            echo "process lenght:${#process[*]} kill -15 $process "
+        else
+            echo "not java process"
+            break
+        fi
+        sleep 2
+done
+
+echo "stop $server_path end"
+
+echo "start $server_path"
+
+#nohup java -server -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx1024M -classpath $server_path/config/*:/game/x1/common-libs/*:$server_path/jar/*: com.xiugou.x1.backstage.X1BackStage > ./log_console.log &
+
+ java -server -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx1024M -classpath $server_path/config/*:/Users/pigflower/Code/server/x1-project/common-libs/*:$server_path/jar/*: com.xiugou.x1.backstage.X1BackStage

+ 2 - 0
x1-battle/src/main/java/com/xiugou/x1/battle/BattleContext.java

@@ -36,6 +36,7 @@ import com.xiugou.x1.battle.sprite.Sprite;
 import com.xiugou.x1.battle.sprite.Zone;
 import com.xiugou.x1.battle.template.TemplateSprite;
 
+
 /**
  * @author YY
  *
@@ -594,4 +595,5 @@ public class BattleContext extends SeedContext {
 	public void setClientParams(ByteString clientParams) {
 		this.clientParams = clientParams;
 	}
+
 }

+ 4 - 0
x1-battle/src/main/java/com/xiugou/x1/battle/IBattleProcessor.java

@@ -59,4 +59,8 @@ public interface IBattleProcessor {
 	List<Sprite> refreshMonster(BattleContext context, int zoneId, MapMonsterPoint monsterPoint);
 	
 	List<Sprite> specialRefreshMonster(BattleContext context, int zoneId);
+
+	void enterNextScene(BattleContext context,int nextSceneId);
+
+
 }

+ 9 - 0
x1-design/src/main/java/com/xiugou/x1/design/module/RobotListCache.java

@@ -0,0 +1,9 @@
+package com.xiugou.x1.design.module;
+
+
+import com.xiugou.x1.design.module.autogen.RobotListAbstractCache;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RobotListCache extends RobotListAbstractCache<RobotListAbstractCache.RobotListCfg> {
+}

+ 107 - 107
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/ChannelSdkArgsAbstractCache.java

@@ -1,108 +1,108 @@
-package com.xiugou.x1.design.module.autogen;
-
-
-public abstract class ChannelSdkArgsAbstractCache<T extends ChannelSdkArgsAbstractCache.ChannelSdkArgsCfg> extends org.gaming.design.loader.DesignCache<T> {
-	@Override
-	public String fileName() {
-		return "0渠道对接参数_ChannelSdkArgs";
-	}
-
-
-	@Override
-	protected final void loadAutoGenerate() {
-		//构建常量
-		java.util.HashMap<String, String> constMap = new java.util.HashMap<String, String>();
-		for(T data : all()) {
-			constMap.put(data.getKeyCol(), data.getValueCol());
-		}
-		this.loadConst(constMap);
-	}
-
-
-
-
-
-	public static class ChannelSdkArgsCfg implements org.gaming.design.loader.IDesignData {
-		/**
-		 * 序号
-		 */
-		protected int id;
-		/**
-		 * 键名
-		 */
-		protected String keyCol;
-		/**
-		 * 值类型
-		 */
-		protected String typeCol;
-		/**
-		 * 值
-		 */
-		protected String valueCol;
-		@Override
-		public int id() {
-			return id;
-		}
-		public int getId() {
-			return id;
-		}
-		public String getKeyCol() {
-			return keyCol;
-		}
-		public String getTypeCol() {
-			return typeCol;
-		}
-		public String getValueCol() {
-			return valueCol;
-		}
-	}
-
-	protected String yile_game_id;
-	public String getYile_game_id() {
-		return yile_game_id;
-	}
-	protected String yile_product_key;
-	public String getYile_product_key() {
-		return yile_product_key;
-	}
-	protected String yile_recharge_key;
-	public String getYile_recharge_key() {
-		return yile_recharge_key;
-	}
-	protected String yile_login_url;
-	public String getYile_login_url() {
-		return yile_login_url;
-	}
-	protected String wabo_game_id;
-	public String getWabo_game_id() {
-		return wabo_game_id;
-	}
-	protected String wabo_endpoint;
-	public String getWabo_endpoint() {
-		return wabo_endpoint;
-	}
-	protected String wabo_token_url;
-	public String getWabo_token_url() {
-		return wabo_token_url;
-	}
-	protected String wabo_orderquery_url;
-	public String getWabo_orderquery_url() {
-		return wabo_orderquery_url;
-	}
-	protected String wabo_callback_url;
-	public String getWabo_callback_url() {
-		return wabo_callback_url;
-	}
-	protected String hql_game_id;
-	public String getHql_game_id() {
-		return hql_game_id;
-	}
-	protected String hql_game_key;
-	public String getHql_game_key() {
-		return hql_game_key;
-	}
-	protected String hql_login_url;
-	public String getHql_login_url() {
-		return hql_login_url;
-	}
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class ChannelSdkArgsAbstractCache<T extends ChannelSdkArgsAbstractCache.ChannelSdkArgsCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "0渠道对接参数_ChannelSdkArgs";
+	}
+
+
+	@Override
+	protected final void loadAutoGenerate() {
+		//构建常量
+		java.util.HashMap<String, String> constMap = new java.util.HashMap<String, String>();
+		for(T data : all()) {
+			constMap.put(data.getKeyCol(), data.getValueCol());
+		}
+		this.loadConst(constMap);
+	}
+
+
+
+
+
+	public static class ChannelSdkArgsCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 键名
+		 */
+		protected String keyCol;
+		/**
+		 * 值类型
+		 */
+		protected String typeCol;
+		/**
+		 * 值
+		 */
+		protected String valueCol;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public String getKeyCol() {
+			return keyCol;
+		}
+		public String getTypeCol() {
+			return typeCol;
+		}
+		public String getValueCol() {
+			return valueCol;
+		}
+	}
+
+	protected String yile_game_id;
+	public String getYile_game_id() {
+		return yile_game_id;
+	}
+	protected String yile_product_key;
+	public String getYile_product_key() {
+		return yile_product_key;
+	}
+	protected String yile_recharge_key;
+	public String getYile_recharge_key() {
+		return yile_recharge_key;
+	}
+	protected String yile_login_url;
+	public String getYile_login_url() {
+		return yile_login_url;
+	}
+	protected String wabo_game_id;
+	public String getWabo_game_id() {
+		return wabo_game_id;
+	}
+	protected String wabo_endpoint;
+	public String getWabo_endpoint() {
+		return wabo_endpoint;
+	}
+	protected String wabo_token_url;
+	public String getWabo_token_url() {
+		return wabo_token_url;
+	}
+	protected String wabo_orderquery_url;
+	public String getWabo_orderquery_url() {
+		return wabo_orderquery_url;
+	}
+	protected String wabo_callback_url;
+	public String getWabo_callback_url() {
+		return wabo_callback_url;
+	}
+	protected String hql_game_id;
+	public String getHql_game_id() {
+		return hql_game_id;
+	}
+	protected String hql_game_key;
+	public String getHql_game_key() {
+		return hql_game_key;
+	}
+	protected String hql_login_url;
+	public String getHql_login_url() {
+		return hql_login_url;
+	}
 }

+ 74 - 74
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageAutoAbstractCache.java

@@ -1,75 +1,75 @@
-package com.xiugou.x1.design.module.autogen;
-
-
-public abstract class LanguageAutoAbstractCache<T extends LanguageAutoAbstractCache.LanguageAutoCfg> extends org.gaming.design.loader.DesignCache<T> {
-	@Override
-	public String fileName() {
-		return "YLanguageAuto_LanguageAuto";
-	}
-	protected java.util.HashMap<String, T> langIdIndex;
-
-
-	@Override
-	protected final void loadAutoGenerate() {
-		//构建索引langIdIndex
-		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
-		for(T data : all()) {
-			langIdIndex.put(data.getLangId(), data);
-		}
-		this.langIdIndex = langIdIndex;
-	}
-
-	public final T getInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("LanguageAutoCache.getInLangIdIndex", langId);
-		}
-		return t;
-	}
-
-	public final T findInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			return null;
-		}
-		return t;
-	}
-
-
-
-	public static class LanguageAutoCfg implements org.gaming.design.loader.IDesignData {
-		/**
-		 * 序号
-		 */
-		protected int id;
-		/**
-		 * 语言ID
-		 */
-		protected String langId;
-		/**
-		 * 简体中文
-		 */
-		protected String cn;
-		/**
-		 * 英文
-		 */
-		protected String en;
-		@Override
-		public int id() {
-			return id;
-		}
-		public int getId() {
-			return id;
-		}
-		public String getLangId() {
-			return langId;
-		}
-		public String getCn() {
-			return cn;
-		}
-		public String getEn() {
-			return en;
-		}
-	}
-
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class LanguageAutoAbstractCache<T extends LanguageAutoAbstractCache.LanguageAutoCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "YLanguageAuto_LanguageAuto";
+	}
+	protected java.util.HashMap<String, T> langIdIndex;
+
+
+	@Override
+	protected final void loadAutoGenerate() {
+		//构建索引langIdIndex
+		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
+		for(T data : all()) {
+			langIdIndex.put(data.getLangId(), data);
+		}
+		this.langIdIndex = langIdIndex;
+	}
+
+	public final T getInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("LanguageAutoCache.getInLangIdIndex", langId);
+		}
+		return t;
+	}
+
+	public final T findInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			return null;
+		}
+		return t;
+	}
+
+
+
+	public static class LanguageAutoCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 语言ID
+		 */
+		protected String langId;
+		/**
+		 * 简体中文
+		 */
+		protected String cn;
+		/**
+		 * 英文
+		 */
+		protected String en;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public String getLangId() {
+			return langId;
+		}
+		public String getCn() {
+			return cn;
+		}
+		public String getEn() {
+			return en;
+		}
+	}
+
 }

+ 95 - 95
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageCustomizeAbstractCache.java

@@ -1,96 +1,96 @@
-package com.xiugou.x1.design.module.autogen;
-
-
-public abstract class LanguageCustomizeAbstractCache<T extends LanguageCustomizeAbstractCache.LanguageCustomizeCfg> extends org.gaming.design.loader.DesignCache<T> {
-	@Override
-	public String fileName() {
-		return "YL语言表自定义填写_LanguageCustomize";
-	}
-	protected java.util.HashMap<String, T> langIdIndex;
-
-
-	@Override
-	protected final void loadAutoGenerate() {
-		//构建索引langIdIndex
-		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
-		for(T data : all()) {
-			langIdIndex.put(data.getLangId(), data);
-		}
-		this.langIdIndex = langIdIndex;
-	}
-
-	public final T getInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("LanguageCustomizeCache.getInLangIdIndex", langId);
-		}
-		return t;
-	}
-
-	public final T findInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			return null;
-		}
-		return t;
-	}
-
-
-
-	public static class LanguageCustomizeCfg implements org.gaming.design.loader.IDesignData {
-		/**
-		 * 序号
-		 */
-		protected int id;
-		/**
-		 * 语言ID
-		 */
-		protected String langId;
-		/**
-		 * 简体中文
-		 */
-		protected String cn;
-		/**
-		 * 繁体中文
-		 */
-		protected String hk;
-		/**
-		 * 英语
-		 */
-		protected String en;
-		/**
-		 * 日语
-		 */
-		protected String jap;
-		/**
-		 * 韩语
-		 */
-		protected String kr;
-		@Override
-		public int id() {
-			return id;
-		}
-		public int getId() {
-			return id;
-		}
-		public String getLangId() {
-			return langId;
-		}
-		public String getCn() {
-			return cn;
-		}
-		public String getHk() {
-			return hk;
-		}
-		public String getEn() {
-			return en;
-		}
-		public String getJap() {
-			return jap;
-		}
-		public String getKr() {
-			return kr;
-		}
-	}
-
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class LanguageCustomizeAbstractCache<T extends LanguageCustomizeAbstractCache.LanguageCustomizeCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "YL语言表自定义填写_LanguageCustomize";
+	}
+	protected java.util.HashMap<String, T> langIdIndex;
+
+
+	@Override
+	protected final void loadAutoGenerate() {
+		//构建索引langIdIndex
+		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
+		for(T data : all()) {
+			langIdIndex.put(data.getLangId(), data);
+		}
+		this.langIdIndex = langIdIndex;
+	}
+
+	public final T getInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("LanguageCustomizeCache.getInLangIdIndex", langId);
+		}
+		return t;
+	}
+
+	public final T findInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			return null;
+		}
+		return t;
+	}
+
+
+
+	public static class LanguageCustomizeCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 语言ID
+		 */
+		protected String langId;
+		/**
+		 * 简体中文
+		 */
+		protected String cn;
+		/**
+		 * 繁体中文
+		 */
+		protected String hk;
+		/**
+		 * 英语
+		 */
+		protected String en;
+		/**
+		 * 日语
+		 */
+		protected String jap;
+		/**
+		 * 韩语
+		 */
+		protected String kr;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public String getLangId() {
+			return langId;
+		}
+		public String getCn() {
+			return cn;
+		}
+		public String getHk() {
+			return hk;
+		}
+		public String getEn() {
+			return en;
+		}
+		public String getJap() {
+			return jap;
+		}
+		public String getKr() {
+			return kr;
+		}
+	}
+
 }

+ 74 - 74
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/LanguageTipsAbstractCache.java

@@ -1,75 +1,75 @@
-package com.xiugou.x1.design.module.autogen;
-
-
-public abstract class LanguageTipsAbstractCache<T extends LanguageTipsAbstractCache.LanguageTipsCfg> extends org.gaming.design.loader.DesignCache<T> {
-	@Override
-	public String fileName() {
-		return "YLanguageTips_LanguageTips";
-	}
-	protected java.util.HashMap<String, T> langIdIndex;
-
-
-	@Override
-	protected final void loadAutoGenerate() {
-		//构建索引langIdIndex
-		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
-		for(T data : all()) {
-			langIdIndex.put(data.getLangId(), data);
-		}
-		this.langIdIndex = langIdIndex;
-	}
-
-	public final T getInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("LanguageTipsCache.getInLangIdIndex", langId);
-		}
-		return t;
-	}
-
-	public final T findInLangIdIndex(String langId) {
-		T t = langIdIndex.get(langId);
-		if(t == null) {
-			return null;
-		}
-		return t;
-	}
-
-
-
-	public static class LanguageTipsCfg implements org.gaming.design.loader.IDesignData {
-		/**
-		 * 序号
-		 */
-		protected int id;
-		/**
-		 * 语言ID
-		 */
-		protected String langId;
-		/**
-		 * 简体中文
-		 */
-		protected String cn;
-		/**
-		 * 英文
-		 */
-		protected String en;
-		@Override
-		public int id() {
-			return id;
-		}
-		public int getId() {
-			return id;
-		}
-		public String getLangId() {
-			return langId;
-		}
-		public String getCn() {
-			return cn;
-		}
-		public String getEn() {
-			return en;
-		}
-	}
-
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class LanguageTipsAbstractCache<T extends LanguageTipsAbstractCache.LanguageTipsCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "YLanguageTips_LanguageTips";
+	}
+	protected java.util.HashMap<String, T> langIdIndex;
+
+
+	@Override
+	protected final void loadAutoGenerate() {
+		//构建索引langIdIndex
+		java.util.HashMap<String, T> langIdIndex = new java.util.HashMap<String, T>();
+		for(T data : all()) {
+			langIdIndex.put(data.getLangId(), data);
+		}
+		this.langIdIndex = langIdIndex;
+	}
+
+	public final T getInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("LanguageTipsCache.getInLangIdIndex", langId);
+		}
+		return t;
+	}
+
+	public final T findInLangIdIndex(String langId) {
+		T t = langIdIndex.get(langId);
+		if(t == null) {
+			return null;
+		}
+		return t;
+	}
+
+
+
+	public static class LanguageTipsCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 语言ID
+		 */
+		protected String langId;
+		/**
+		 * 简体中文
+		 */
+		protected String cn;
+		/**
+		 * 英文
+		 */
+		protected String en;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public String getLangId() {
+			return langId;
+		}
+		public String getCn() {
+			return cn;
+		}
+		public String getEn() {
+			return en;
+		}
+	}
+
 }

+ 125 - 125
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/NameRandomAbstractCache.java

@@ -1,126 +1,126 @@
-package com.xiugou.x1.design.module.autogen;
-
-
-public abstract class NameRandomAbstractCache<T extends NameRandomAbstractCache.NameRandomCfg> extends org.gaming.design.loader.DesignCache<T> {
-	@Override
-	public String fileName() {
-		return "M名字随机_NameRandom";
-	}
-
-	protected java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>> sexTypeCollector;
-	protected java.util.HashMap<Integer, java.util.ArrayList<T>> typeCollector;
-
-	@Override
-	protected final void loadAutoGenerate() {
-		//构建索引sexTypeCollector
-		java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>> sexTypeCollector = new java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>>();
-		for(T data : all()) {
-			java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(data.getSex());
-			if(layer1Map == null) {
-				layer1Map = new java.util.HashMap<Integer, java.util.ArrayList<T>>();
-				sexTypeCollector.put(data.getSex(), layer1Map);
-			}
-			java.util.ArrayList<T> collector = layer1Map.get(data.getType());
-			if(collector == null) {
-				collector = new java.util.ArrayList<>();
-				layer1Map.put(data.getType(), collector);
-			}
-			collector.add(data);
-		}
-		this.sexTypeCollector = sexTypeCollector;
-		//构建索引typeCollector
-		java.util.HashMap<Integer, java.util.ArrayList<T>> typeCollector = new java.util.HashMap<Integer, java.util.ArrayList<T>>();
-		for(T data : all()) {
-			java.util.ArrayList<T> collector = typeCollector.get(data.getType());
-			if(collector == null) {
-				collector = new java.util.ArrayList<>();
-				typeCollector.put(data.getType(), collector);
-			}
-			collector.add(data);
-		}
-		this.typeCollector = typeCollector;
-	}
-
-
-
-	public final java.util.ArrayList<T> getInSexTypeCollector(int sex, int type) {
-		java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(sex);
-		if(layer1Map == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInSexTypeCollector", sex, type);
-		}
-		java.util.ArrayList<T> ts = layer1Map.get(type);
-		if(ts == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInSexTypeCollector", sex, type);
-		}
-		return ts;
-	}
-	public final java.util.ArrayList<T> getInTypeCollector(int type) {
-		java.util.ArrayList<T> ts = typeCollector.get(type);
-		if(ts == null) {
-			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInTypeCollector", type);
-		}
-		return ts;
-	}
-
-	public final java.util.ArrayList<T> findInSexTypeCollector(int sex, int type) {
-		java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(sex);
-		if(layer1Map == null) {
-			return null;
-		}
-		java.util.ArrayList<T> ts = layer1Map.get(type);
-		if(ts == null) {
-			return null;
-		}
-		return ts;
-	}
-	public final java.util.ArrayList<T> findInTypeCollector(int type) {
-		java.util.ArrayList<T> ts = typeCollector.get(type);
-		if(ts == null) {
-			return null;
-		}
-		return ts;
-	}
-
-	public static class NameRandomCfg implements org.gaming.design.loader.IDesignData {
-		/**
-		 * 序号
-		 */
-		protected int id;
-		/**
-		 * 性别
-		 */
-		protected int sex;
-		/**
-		 * 类型
-		 */
-		protected int type;
-		/**
-		 * 字库
-		 */
-		protected String name;
-		/**
-		 * 英文字库
-		 */
-		protected String en;
-		@Override
-		public int id() {
-			return id;
-		}
-		public int getId() {
-			return id;
-		}
-		public int getSex() {
-			return sex;
-		}
-		public int getType() {
-			return type;
-		}
-		public String getName() {
-			return name;
-		}
-		public String getEn() {
-			return en;
-		}
-	}
-
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class NameRandomAbstractCache<T extends NameRandomAbstractCache.NameRandomCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "M名字随机_NameRandom";
+	}
+
+	protected java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>> sexTypeCollector;
+	protected java.util.HashMap<Integer, java.util.ArrayList<T>> typeCollector;
+
+	@Override
+	protected final void loadAutoGenerate() {
+		//构建索引sexTypeCollector
+		java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>> sexTypeCollector = new java.util.HashMap<Integer, java.util.HashMap<Integer, java.util.ArrayList<T>>>();
+		for(T data : all()) {
+			java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(data.getSex());
+			if(layer1Map == null) {
+				layer1Map = new java.util.HashMap<Integer, java.util.ArrayList<T>>();
+				sexTypeCollector.put(data.getSex(), layer1Map);
+			}
+			java.util.ArrayList<T> collector = layer1Map.get(data.getType());
+			if(collector == null) {
+				collector = new java.util.ArrayList<>();
+				layer1Map.put(data.getType(), collector);
+			}
+			collector.add(data);
+		}
+		this.sexTypeCollector = sexTypeCollector;
+		//构建索引typeCollector
+		java.util.HashMap<Integer, java.util.ArrayList<T>> typeCollector = new java.util.HashMap<Integer, java.util.ArrayList<T>>();
+		for(T data : all()) {
+			java.util.ArrayList<T> collector = typeCollector.get(data.getType());
+			if(collector == null) {
+				collector = new java.util.ArrayList<>();
+				typeCollector.put(data.getType(), collector);
+			}
+			collector.add(data);
+		}
+		this.typeCollector = typeCollector;
+	}
+
+
+
+	public final java.util.ArrayList<T> getInSexTypeCollector(int sex, int type) {
+		java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(sex);
+		if(layer1Map == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInSexTypeCollector", sex, type);
+		}
+		java.util.ArrayList<T> ts = layer1Map.get(type);
+		if(ts == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInSexTypeCollector", sex, type);
+		}
+		return ts;
+	}
+	public final java.util.ArrayList<T> getInTypeCollector(int type) {
+		java.util.ArrayList<T> ts = typeCollector.get(type);
+		if(ts == null) {
+			throw new org.gaming.design.exception.DesignNotFoundException("NameRandomCache.getInTypeCollector", type);
+		}
+		return ts;
+	}
+
+	public final java.util.ArrayList<T> findInSexTypeCollector(int sex, int type) {
+		java.util.HashMap<Integer, java.util.ArrayList<T>> layer1Map = sexTypeCollector.get(sex);
+		if(layer1Map == null) {
+			return null;
+		}
+		java.util.ArrayList<T> ts = layer1Map.get(type);
+		if(ts == null) {
+			return null;
+		}
+		return ts;
+	}
+	public final java.util.ArrayList<T> findInTypeCollector(int type) {
+		java.util.ArrayList<T> ts = typeCollector.get(type);
+		if(ts == null) {
+			return null;
+		}
+		return ts;
+	}
+
+	public static class NameRandomCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 性别
+		 */
+		protected int sex;
+		/**
+		 * 类型
+		 */
+		protected int type;
+		/**
+		 * 字库
+		 */
+		protected String name;
+		/**
+		 * 英文字库
+		 */
+		protected String en;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public int getSex() {
+			return sex;
+		}
+		public int getType() {
+			return type;
+		}
+		public String getName() {
+			return name;
+		}
+		public String getEn() {
+			return en;
+		}
+	}
+
 }

+ 47 - 0
x1-design/src/main/java/com/xiugou/x1/design/module/autogen/RobotListAbstractCache.java

@@ -0,0 +1,47 @@
+package com.xiugou.x1.design.module.autogen;
+
+
+public abstract class RobotListAbstractCache<T extends RobotListAbstractCache.RobotListCfg> extends org.gaming.design.loader.DesignCache<T> {
+	@Override
+	public String fileName() {
+		return "Z_机器人表_RobotList";
+	}
+
+
+	@Override
+	protected final void loadAutoGenerate() {
+	}
+
+
+
+
+
+	public static class RobotListCfg implements org.gaming.design.loader.IDesignData {
+		/**
+		 * 序号
+		 */
+		protected int id;
+		/**
+		 * 昵称
+		 */
+		protected String nickanme;
+		/**
+		 * 等级
+		 */
+		protected int lv;
+		@Override
+		public int id() {
+			return id;
+		}
+		public int getId() {
+			return id;
+		}
+		public String getNickanme() {
+			return nickanme;
+		}
+		public int getLv() {
+			return lv;
+		}
+	}
+
+}

+ 2 - 1
x1-game-server/src/main/java/com/xiugou/x1/game/server/X1GameServer.java

@@ -29,7 +29,8 @@ public class X1GameServer {
         SpringApplication springApplication = new SpringApplication();
         //服务器启动引导
         springApplication.addListeners(new ProjectBooter());
-
+        String workingDirectory = System.getProperty("user.dir");
+        System.out.println("当前项目运行目录: " + workingDirectory);
         springApplication.addPrimarySources(Collections.singletonList(X1GameServer.class));
         springApplication.run(args);
 

+ 4 - 0
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/arena/service/ArenaDefBattleProcessor.java

@@ -47,6 +47,10 @@ public class ArenaDefBattleProcessor extends BaseBattleProcessor<PbArenaBattlePa
 		throw new UnsupportedOperationException("不该被调用的函数");
 	}
 
+	@Override
+	public void enterNextScene(BattleContext context, int nextSceneId) {
+		throw new UnsupportedOperationException("不该被调用的函数");
+	}
 	@Override
 	public List<PbKillSprite> onKillSprite(BattleContext context, List<Integer> spriteIds) {
 		throw new UnsupportedOperationException("不该被调用的函数");

+ 34 - 4
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/BattleHandler.java

@@ -3,12 +3,16 @@
  */
 package com.xiugou.x1.game.server.module.battle;
 
-import java.util.List;
+import java.util.*;
 
+import com.xiugou.x1.game.server.module.battle.service.BattleService;
+import com.xiugou.x1.game.server.module.mainline.MainlineHandler;
+import com.xiugou.x1.game.server.module.player.AbstractModuleHandler;
 import org.gaming.fakecmd.annotation.PlayerCmd;
 import org.gaming.prefab.exception.Asserts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 
 import com.xiugou.x1.battle.BattleContext;
@@ -22,6 +26,7 @@ import com.xiugou.x1.game.server.module.battle.constant.BattleType;
 import com.xiugou.x1.game.server.module.battle.processor.BaseBattleProcessor;
 import com.xiugou.x1.game.server.module.battle.processor.BattleManager;
 
+import pb.xiugou.x1.protobuf.battle.Battle;
 import pb.xiugou.x1.protobuf.battle.Battle.BattleGiveUpRequest;
 import pb.xiugou.x1.protobuf.battle.Battle.BattleGiveUpResponse;
 import pb.xiugou.x1.protobuf.battle.Battle.BattleKillSpriteRequest;
@@ -43,6 +48,8 @@ import pb.xiugou.x1.protobuf.battle.Battle.SwitchBattleHeroResponse;
 import pb.xiugou.x1.protobuf.battle.Battle.ZoneInfoRequest;
 import pb.xiugou.x1.protobuf.battle.Battle.ZoneInfoResponse;
 import pb.xiugou.x1.protobuf.formation.Formation.PbFormationPos;
+import pb.xiugou.x1.protobuf.battle.Battle.BattleNextSceneResponse;
+import pb.xiugou.x1.protobuf.battle.Battle.BattleNextSceneRequest;
 
 /**
  * @author YY
@@ -50,7 +57,10 @@ import pb.xiugou.x1.protobuf.formation.Formation.PbFormationPos;
  */
 @Controller
 public class BattleHandler {
-	
+
+    @Autowired
+	private BattleService battleService;
+
 	static Logger logger = LoggerFactory.getLogger(BattleHandler.class);
 
 	@PlayerCmd
@@ -72,6 +82,11 @@ public class BattleHandler {
         for (Sprite hero : context.getAtkTeam().getAllSpriteMap().values()) {
             response.addHeroes(hero.build());
         }
+        Battle.PbSpriteRow.Builder rowBuilder = Battle.PbSpriteRow.newBuilder();
+        for (Sprite robot : battleService.getRobotList().values()) {
+            rowBuilder.addSprites(robot.build());
+        }
+        response.addRobHeroes(rowBuilder.build());
         response.setMainHero(context.getMainHeroIdentity());
         response.setBattleParams(context.getClientParams());
         response.setType(request.getType());
@@ -88,7 +103,7 @@ public class BattleHandler {
         processor.hasThisZone(context, request.getZoneId());
 
 //        System.out.println("进入区域成功 " + playerContext.getId() + " zone_id参数" + request.getZoneId());
-        
+
         boolean enter = processor.doEnterZone(context, request.getZoneId());
         Asserts.isTrue(enter, TipsCode.BATTLE_ZONE_NOT_INIT, request.getZoneId());
         
@@ -164,7 +179,22 @@ public class BattleHandler {
         processor.onGiveUp(context);
         return BattleGiveUpResponse.getDefaultInstance();
     }
-    
+
+    @PlayerCmd
+    public BattleNextSceneResponse nextScene(PlayerContext playerContext, BattleNextSceneRequest request) {
+        BattleContext context = BaseBattleProcessor.getCurrContext(playerContext.getId());
+        Asserts.isTrue(context != null, TipsCode.BATTLE_CONTEXT_MISS);
+        IBattleProcessor processor = context.getBattleProcessor();
+        processor.enterNextScene(context,request.getSceneId());
+        BattleNextSceneResponse.Builder response = Battle.BattleNextSceneResponse.newBuilder();
+        response.setSceneId(request.getSceneId());
+        AbstractModuleHandler handler = AbstractModuleHandler.getHandler(MainlineHandler.class.getSimpleName());
+        if (handler != null) {
+        handler.pushInfo(playerContext);
+        }
+        return response.build();
+    }
+
 	@PlayerCmd
     public BattleKillSpriteResponse killSprite(PlayerContext playerContext, BattleKillSpriteRequest request) {
     	//System.out.println("killSprite");

+ 5 - 1
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/processor/BaseBattleProcessor.java

@@ -151,7 +151,11 @@ public abstract class BaseBattleProcessor<P extends GeneratedMessageV3> implemen
         BaseBattleProcessor.setCurr(context);
         return context;
     }
-    
+    @Override
+    public void enterNextScene(BattleContext context, int nextSceneId) {
+        throw new UnsupportedOperationException("不该被调用的函数");
+    }
+
     @Override
 	public boolean doEnterZone(BattleContext context, int zoneId) {
 		return context.enterZone(zoneId);

+ 32 - 9
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/battle/service/BattleService.java

@@ -1,8 +1,12 @@
 /**
- * 
+ *
  */
 package com.xiugou.x1.game.server.module.battle.service;
 
+import com.xiugou.x1.battle.constant.SpriteType;
+import com.xiugou.x1.battle.sprite.Sprite;
+import com.xiugou.x1.design.module.RobotListCache;
+import com.xiugou.x1.design.module.autogen.RobotListAbstractCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -10,6 +14,9 @@ import com.xiugou.x1.game.server.foundation.player.PlayerContext;
 import com.xiugou.x1.game.server.foundation.player.PlayerContextManager;
 import com.xiugou.x1.game.server.module.battle.message.BattleTickMessage;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author YY
  *
@@ -17,13 +24,29 @@ import com.xiugou.x1.game.server.module.battle.message.BattleTickMessage;
 @Service
 public class BattleService {
 
-	@Autowired
-	private PlayerContextManager playerContextManager;
-	
-	protected void runInSchedule() {
-		for(PlayerContext playerContext : playerContextManager.onlines()) {
-			playerContext.tell(BattleTickMessage.of(playerContext.getId()));
-		}
-	}
+    @Autowired
+    private PlayerContextManager playerContextManager;
+
+    @Autowired
+    private RobotListCache robotListCache;
+
+    protected void runInSchedule() {
+        for (PlayerContext playerContext : playerContextManager.onlines()) {
+            playerContext.tell(BattleTickMessage.of(playerContext.getId()));
+        }
+    }
 
+    //获取机器人
+    public Map<Integer, Sprite> getRobotList() {
+        Map<Integer, Sprite> allSpriteMap = new HashMap<>();
+        int count = 0;
+        for (RobotListAbstractCache.RobotListCfg config : robotListCache.all()) {
+            if (count > 10) break;
+            Sprite sprite = new Sprite(config.getId(), SpriteType.HERO);
+            sprite.setLevel(config.getLv());
+            allSpriteMap.put(config.getId(), sprite);
+            count++;
+        }
+        return allSpriteMap;
+    }
 }

+ 413 - 353
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/mainline/service/MainlineBattleProcessor.java

@@ -72,370 +72,430 @@ import pojo.xiugou.x1.pojo.log.mainline.MainlineBossTiming;
 @Component
 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;
-	@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);
 		}
-		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;
-		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.setRebornTime(sprite.getRebornTime());
-		
-		outRewards.addAll(rewardList);
-		return builder.build();
-	}
+        }
+        builder.setRebornTime(sprite.getRebornTime());
+
+        outRewards.addAll(rewardList);
+        return builder.build();
+    }
 }

+ 1 - 0
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/player/PlayerHandler.java

@@ -97,6 +97,7 @@ public class PlayerHandler {
 
     @PlayerCmd(needLogin = false)
     public LoginResponse login(PlayerContext playerContext, LoginRequest request) {
+        request.setServerId(1);// TODO 修改区服为1,开发环境
         Asserts.isTrue(applicationSettings.getGameServerId() == request.getServerId(), TipsCode.SERVER_NOT_MATCH);
         Asserts.isTrue(request.getOpenId() != null && !"".equals(request.getOpenId().trim()), TipsCode.OPENID_NOT_EMPTY);
 

+ 1 - 1
x1-game-server/src/main/java/com/xiugou/x1/game/server/module/tower/service/StrengthTowerBattleProcessor.java

@@ -5,6 +5,7 @@ package com.xiugou.x1.game.server.module.tower.service;
 
 import java.util.List;
 
+import com.xiugou.x1.battle.BattleContext;
 import org.gaming.tool.LocalDateTimeUtil;
 import org.springframework.stereotype.Service;
 
@@ -35,7 +36,6 @@ public class StrengthTowerBattleProcessor extends BaseTowerBattleProcessor {
 		tower.setStrengthLayer(tower.getStrengthLayer() + 1);
 		return tower.getStrengthLayer();
 	}
-	
 	@Override
 	public int getTowerLayer(Tower tower) {
 		return tower.getStrengthLayer();

File diff suppressed because it is too large
+ 238 - 194
x1-protobuf/src/main/java/pb/xiugou/x1/protobuf/battle/Battle.java


+ 3 - 0
x1-protobuf/src/main/java/pb/xiugou/x1/protobuf/player/Player.java

@@ -592,6 +592,9 @@ public final class Player {
     public int getServerId() {
       return serverId_;
     }
+    public void setServerId( int id){
+       this.serverId_ = 1;
+    }
 
     public static final int DEVICE_TYPE_FIELD_NUMBER = 3;
     private volatile java.lang.Object deviceType_;

Some files were not shown because too many files changed in this diff