“How settlements work”的版本间的差异

来自骑砍中文百科
跳转至: 导航搜索
距离缓存相关
 
(未显示同一用户的3个中间版本)
第1行: 第1行:
 
[https://docs.bannerlordmodding.com/_tutorials/new_settlements.html <big>访问源文档</big>]<br>
 
[https://docs.bannerlordmodding.com/_tutorials/new_settlements.html <big>访问源文档</big>]<br>
[[骑马与砍杀2:霸主 MOD API|<big>返回目录</big>]]
+
[[骑马与砍杀2:霸主 MOD API|<big>返回目录</big>]]<br>
 +
<br>
 +
== 论坛相关教程帖 ==
 +
# <big>https://bbs.mountblade.com.cn/thread-2064137-1-1.html</big>
 
== 定居点工作机制 ==
 
== 定居点工作机制 ==
 
<big>本游戏添加定居点的机制就是结合两个XML文件:一个定义定居点的类型(藏身点、村庄、城镇、城堡等),还有如产出、繁荣、村庄所属的城镇等其它相关参数,这个定义在基础游戏的 Modules/SandBox/ModuleData/settlements.xml 中。另一个文件是定义距离缓存的,在 Modules/SandBox/ModuleSata/Settlements_distance_cache.bin 中,可以通过代码生成。</big><br>
 
<big>本游戏添加定居点的机制就是结合两个XML文件:一个定义定居点的类型(藏身点、村庄、城镇、城堡等),还有如产出、繁荣、村庄所属的城镇等其它相关参数,这个定义在基础游戏的 Modules/SandBox/ModuleData/settlements.xml 中。另一个文件是定义距离缓存的,在 Modules/SandBox/ModuleSata/Settlements_distance_cache.bin 中,可以通过代码生成。</big><br>
第13行: 第16行:
  
 
== 如何覆盖游戏默认定居点 ==
 
== 如何覆盖游戏默认定居点 ==
 +
<big>当创建mod时你可以复写 SandBox 模组中的定义,但在文件中append(添加)内容是不可能的,所以如果要做更改就要一次性修改所有文件。</big><br>
 +
<br>
 +
<big>首先将 '''Modules/SandBox/ModuleData/settlements.xml''' 复制到 '''Modules/你的模组名/ModuleData/settlements.xml''' ,并且把 '''Modules/SandBox/SceneObj/Main_map''' (一个文件夹)复制到 '''Modules/你的模组名/SceneObj/Main_map'''。</big><br>
 +
<big>如果可能的话,请避免用记事本这类普通编辑器对文件进行编辑,而是使用像 Notepad++ 这类更强大的编辑器。</big><br>
 +
<br>
 +
<big>在 Modules/你的模组名/submodule.xml 添加以下这个 XmlNode:</big>
 +
<nowiki>
 +
<XmlNode>
 +
<XmlName id="Settlements" path="settlements"/>
 +
<IncludeGameTypes>
 +
<GameType value = "Campaign"/>
 +
<GameType value = "CampaignStoryMode"/>
 +
</IncludeGameTypes>
 +
</XmlNode>
 +
</nowiki>
 +
<big>Main_map 会被自动加载。</big><br>
 +
<br>
 +
<big>你现在可以在 settlements.xml 中根据你的所想自定义定居点,或者修改一些现有的定居点(如改变领主、繁荣度、产出等)。settlements.xml 中的每个实体都要有自己的id。</big><br>
 +
<big>在你的模组文件里的 Main_map/scene.xscene 中的每个 game_entity 都要在 settlements.xml 中有一个id,并且确保它们不会重复。</big><br>
 +
<br>
 +
<big>一个添加新实体的例子(添加到已有文件,不完全替换其中的内容),向 settlements.xml 中添加一个城镇两个村庄。</big>[https://pastebin.com/BuSbQ6x2 <big>查看示例</big>]<br>
 +
<big>请注意,village_M1_1 和 village_M1_2 两个村庄实体都要绑定到所属城镇:</big>
 +
<nowiki>trade_bound="Settlement.town_M1" bound="Settlement.town_M1"</nowiki>
 +
<br>
 +
<big>目前尚不清楚这两者有何不同,建议你将它们放在你希望它们属于的城镇,这些村庄还包括你希望它们生产什么的定义:</big>
 +
<nowiki>village_type="VillageType.fisherman"</nowiki><br>
 +
<big>村庄类型在 Modules/SandBox/ModuleData/spprojects.xml 中定义。</big>
 +
<big>这三个新的定居点 game_entity 需要在 Main_map/scene.xscene 文件中定义:</big>[https://pastebin.com/dXcKT7wf <big>查看示例</big>]

2020年5月24日 (日) 15:31的最新版本

访问源文档
返回目录

论坛相关教程帖

  1. https://bbs.mountblade.com.cn/thread-2064137-1-1.html

定居点工作机制

本游戏添加定居点的机制就是结合两个XML文件:一个定义定居点的类型(藏身点、村庄、城镇、城堡等),还有如产出、繁荣、村庄所属的城镇等其它相关参数,这个定义在基础游戏的 Modules/SandBox/ModuleData/settlements.xml 中。另一个文件是定义距离缓存的,在 Modules/SandBox/ModuleSata/Settlements_distance_cache.bin 中,可以通过代码生成。

但以上定义并没有定义定居点的实际外观,外观都定义在 Modules/SandBox/SceneObj/Main_map/scene.xscene 文件中。

未来SDK支持相关

从其它可用的 DLLs 中可以看出,未来定居点应该是可以通过编辑器直接编辑的。这个编辑器可以帮助放置定居点、定义定居点外观和自动生成距离缓存等相关文件。但是在目前,编辑器还未发布,只能借助于XML文件进行修改与定义。

距离缓存相关

目前尚不清楚距离缓存有何作用。在不使用它时,AI仍旧可正常访问定居点,招募军队、贩卖俘虏和购买物品,玩家也可以正常访问定居点。距离缓存可能与一些AI决策有关,这只是猜测。这个距离缓存可以通过 SettlementPositionScript 中的 SaveSettlementDistanceCache() 方法创建,但 SettlementPositionScript 目前未在游戏中使用,它可能用于前面所提到的地图编辑器。这个类可以在 SandBox.View.dll 中找到。

如何覆盖游戏默认定居点

当创建mod时你可以复写 SandBox 模组中的定义,但在文件中append(添加)内容是不可能的,所以如果要做更改就要一次性修改所有文件。

首先将 Modules/SandBox/ModuleData/settlements.xml 复制到 Modules/你的模组名/ModuleData/settlements.xml ,并且把 Modules/SandBox/SceneObj/Main_map (一个文件夹)复制到 Modules/你的模组名/SceneObj/Main_map
如果可能的话,请避免用记事本这类普通编辑器对文件进行编辑,而是使用像 Notepad++ 这类更强大的编辑器。

在 Modules/你的模组名/submodule.xml 添加以下这个 XmlNode:

		<XmlNode>
			<XmlName id="Settlements" path="settlements"/>
			<IncludeGameTypes>
				<GameType value = "Campaign"/>
				<GameType value = "CampaignStoryMode"/>
			</IncludeGameTypes>
		</XmlNode> 	

Main_map 会被自动加载。

你现在可以在 settlements.xml 中根据你的所想自定义定居点,或者修改一些现有的定居点(如改变领主、繁荣度、产出等)。settlements.xml 中的每个实体都要有自己的id。
在你的模组文件里的 Main_map/scene.xscene 中的每个 game_entity 都要在 settlements.xml 中有一个id,并且确保它们不会重复。

一个添加新实体的例子(添加到已有文件,不完全替换其中的内容),向 settlements.xml 中添加一个城镇两个村庄。查看示例
请注意,village_M1_1 和 village_M1_2 两个村庄实体都要绑定到所属城镇:

trade_bound="Settlement.town_M1" bound="Settlement.town_M1"


目前尚不清楚这两者有何不同,建议你将它们放在你希望它们属于的城镇,这些村庄还包括你希望它们生产什么的定义:

village_type="VillageType.fisherman"

村庄类型在 Modules/SandBox/ModuleData/spprojects.xml 中定义。 这三个新的定居点 game_entity 需要在 Main_map/scene.xscene 文件中定义:查看示例