汉化自官网论坛大神 sphereii 的教程帖子 点击前往论坛发布贴
授权声明,本帖尚未汉化完成,请等待更新!
七日杀在A17里内置了XPath,那么XPath是什么呢?
XPath是一种添加,更改或删除XML配置内容和设置值的方法,无需直接编辑更改原版XML文件。
XML又是什么呢?七日杀的内容都是由XML里面的配置文件来控制的,方块,物品,伤害都保存在这些文件中
它位于七日杀根目录的Data\Config目录下
七日杀更新A17以后的Mod结构:
Mods(游戏根目录的Mods文件夹) / <Mod名称> / Config(配置文件) / ItemIcons(物品图片) / ModInfo.xml(MOD信息) ...... <MMod名称2> / Config(配置文件) / ModInfo.xml(MOD信息) ......
之前在其他帖子说过,MOD中含有ModInfo.xml才能被游戏识别为MOD进行加载
通过上面的代码大家可以看出,采用XPath编辑方式后允许多个MOD同时进行加载
一般来说只要不是功能冲突都可以正常的运行在游戏中
附上ModInfo.xml文件代码
<xml> <ModInfo> <Name value="七日杀中文网合成配方修改范文" /> (MOD名称) <Description value="为新手提供修改合成配方的教程." /> (MOD描述) <Author value="英雄大人" /> (MOD作者) <Version value="1.0.0" /> (MOD版本号) </ModInfo> </xml>
此Config文件夹(游戏设置配置文件夹)将支持在以下文件夹结构中加载使用xpath编写的XML文件:
Config / entityclasses.xml (实体类参数) Config / gamestages.xml (游戏阶段参数) Config / items.xml (物品参数) Config / blocks.xml (方块参数) Config / ..... (注明,目前暂时还无法直接读取MOD中的本地化文件Localization.txt)
Config文件夹中的文件不是复制原版的文件来直接进行修改。
相反,你只需要在文件内写入你想要修改的内容即可。
Config下的文件必须与原版文件名一致,不一致将无法加载。
你无法创建多个同样文件如items2.xml、items3.xml等,它不会被正常加载的。
每个XML文件的所有更改都是在各自的XML文件内完成(例如items.xml(物品)、blocks.xml(方块))
但是,每个mod都可以拥有自己的items.xml(只要不是修改相同的东西就不会起冲突)
在游戏初始化期间,MOD将在内存中和原版XML文件进行合并;实际上不会修改任何文件。
这意味着什么?
采用XPath制作的MOD不会修改你的任何游戏文件,不需要这个MOD可以直接删除,
并不需要再重新安装游戏等操作。
这对我们来说意味着我们将能够制作各种比较常见和需要的小mod,我一直称之为【modlets】
它可以添加,删除和更改游戏的小部分功能、设置(比如安安大神的除草MOD)。
它们可以一起使用(功能不同的XPath制作的MOD一般不会起冲突),也可以添加到大修模式中,以便让您的游戏更轻松。
这些modlet是存放在游戏数据之外的文件夹,比如过去您在修改了原版XML之后,Steam将游戏更新为17.2,您将丢失所有更改。
但如果它们作为modlet存在,则在Mods文件夹下,它们将是安全的。
只要您的xpath对新XML仍然有效,它就能够正常加载而不需要您做任何额外的工作。
通过正确构建的modlet,我们将能够拼凑出新的游戏风格,供玩家欣赏和分享。
让我们开始你的旅程……
XPath set命令
对于不熟悉语法的人来说,XPath可能看起来有点吓人。
让我们看看我们是否可以通过一个例子来解释简单xpath的格式。
首先,我们将使用set的xpath命令,它允许我们更改项目的属性或值。另一篇文章将展示更多的xpath命令,但我们将从最简单的开始。
所有xpath命令都使用xpath =“”参数来告诉游戏您要进行更改的位置。然后是更改值,删除值,添加新的内容或您尝试执行的任何操作。
下面是自行车的背包代码,我们想要更改自行车的背包大小。
<lootcontainers> <!-- 其他背包容器 --> <!-- 自行车背包 --> <lootcontainer id="62" count="0" size="4,3" sound_open="UseActions/open_shopping_basket" open_time="0" sound_close="UseActions/close_shopping_basket" loot_quality_template="baseTemplate"> </lootcontainer> <!-- 其他背包容器 --> </lootcontainers>
我们需要准确的标明我们要修改的项目、数值的分类、数值的内容。
我们想要修改自行车背包的size大小,但肯定是不能直接定位size。
因为每个背包容器都有自己的size,我们需要先找到自行车背包!
大家看上面的原版代码可以看到,这个XML里面是有ID的,自行车的背包ID为62
当我们想在xpath中引用修改XML节点时,我们将使用/set
xpath="/lootcontainers/lootcontainer"
上面这个代码可以定位到背包中,但是其中有很多个背包,我们需要定位自行车的ID
xpath="/lootcontainers/lootcontainer[@id='62']
上面这段代码让文件直接定位到了自行车背包!
文件里ID为62的是唯一的,所以我们不会存在任何错误风险。
接下来我们想要更改大小(size)到我们想要的数值。
xpath="/lootcontainers/lootcontainer[@id='62']/@size"
上面这段代码很清楚的标明了,我们要更改ID为62的背包的size值(大小值)
所以我们的全套xpath命令看起来像这样:
<set xpath="/lootcontainers/lootcontainer[@id='62']/@size">7,6</set>
接下来演示一下另外一个例子!
这一次,我们想要添加一个名为“NoAmmo”的新弹药类型。
对于弹药类型,我们想要为每个使用9毫米子弹的枪添加【NoAmmo】。
可能只有一支枪或者有很多枪使用它。
无论哪种方式,我们都希望能够成功的使用。
由于我们正在更换使用9毫米子弹的所有枪支,因此我们不必指定ID或名称。
相反,我们将寻找具有“9mmBullet(9毫米子弹的英文代码)”值的每个Magazine_items(枪支弹药类型)。
这是XML的代码片段。为了节省空间,我删除了额外的行,并留下了我们想要看到的代码。
<items> <item id="40" name="gunPistol"> <!-- 省略代码 --> <property class="Action0"> <!-- 省略代码 --> <property name="Magazine_items" value="9mmBullet" /> </property> </item> </items>
下面是完整的MOD更改代码
<set xpath="/items/item/property[@class='Action0']/property[@name='Magazine_items'][@value='9mmBullet']/@value">9mmBullet,NoAmmo</set>
对于具有属性类“Action0(动作类别)”的每个项目,
并且具有弹药类型“Magazine_Items”的属性,
值为9mmBullet的枪支,
将值更改为9mmBullet,NoAmmo (这样枪支的增加弹药类型就完成)
注意到了吗? [@ name ='Magazine_items'] [@ value ='9mmBullet ']
我们告诉xpath属性名称必须是Magazine_Items(枪支弹药类型),并且在我们添加NoAmmo之前它的值必须是9mmBullet。
但是大家注意到了吗?我们目前只是更改了枪支弹药类型加入了”NoAmmo”
但是物品列表里面目前并不存在这个弹药,所以我们需要下一步,加入NoAmmo这个物品!
XPath append命令
以前,我们已经介绍了set命令,它允许我们更改单个值和属性。
我想将接下来的部分专门用于讲解append命令,
因为它可能是第二个使用的最多的xpath命令。
首先:
append命令可以做两件事:
添加一个新的XML配置物品(方块、物品、弹药、武器、参数等等等)
或者在原有的基础上添加一个额外的值。
在上一篇文章中我们给使用9mm子弹的武器加入了NoAmmo这个弹药。
<set xpath="/items/item/property[@class='Action0']/property[@name='Magazine_items' and @value='9mmBullet']/@value">9mmBullet,NoAmmo</set>
其实用append命了也可以达到,并且更简单,
我们不需要指定现有的弹药值,直接在符合条件的情况下加入NoAmmo
<append xpath="/items/item/property[@class='Action0']/property[@name='Magazine_items' and @value='9mmBullet']/@value">,NoAmmo</append>
大家用心看上面这段代码,直接在符合条件的值后加入NoAmmo,并不需要再次写上“9mmBullet”
但是注意,因为游戏运行时会与原版合并,所以NoAmmo前面要加上【,】英文逗号隔开2种弹药类型!
[附加节点]
append的另一种方式可以帮助我们添加更大的项目。
我将使用 xyth(国外的MOD作者)的垃圾物品项目mod的一部分来演示我们可以在items.xml中添加多个项目的位置。
XPath会把附加到 /items 节点的底部。
这会将其保留在<items> </ items>块中,但会将其添加到文件末尾。
Mods/JunkItems/Config/items.xml:
<configs> <append xpath="/items"> <!-- 添加两种xyth的垃圾物品的代码 --> <item name="itemMaster"> <property name="Meshfile" value="Items/Misc/sackPrefab" /> <property name="DropMeshfile" value="Items/Misc/sack_droppedPrefab" /> <property name="Material" value="organic" /> <property name="HoldType" value="45" /> <property name="Stacknumber" value="500" /> <property name="Weight" value="5" /> <property name="Group" value="Resources" /> <property name="SellableToTrader" value="false" /> </item> <item name="scrapSteel"> <property name="Extends" value="itemMaster" /> <property name="CustomIcon" value="ui_game_symbol_scrapSteel" /> <property name="Material" value="Msteel" /> <property name="Weight" value="1" /> <property name="MeltTimePerUnit" value="0.5" /> <property name="RepairAmount" value="10" /> </item> </append> </configs>
请注意,在代码尾部我们要结束添加,注意添加相对应的结束代码 </append>
总结
以前,我们刚刚介绍了set命令来更改单个值。xpath中还支持以下命令。可能会有更多,但这些将涵盖我们的大部分用途。
<set xpath =””>
允许您更改值
示例:
此行更改背包容器 ID 62,并将其大小更改为7,6。
<set xpath="/lootcontainers/lootcontainer[@id='62']/@size">7,6</set>
<append xpath =””>
这允许您在xpath中位置的末尾添加<append>和</ append>之间存在的任何XML,但仍在其范围内。
您可以使用append添加大量的XML项目。
示例:
此行将新实体添加到entity_classes的底部。它将添加到顶级类别<entity_classes> </ entity_classes> xml中。
<append xpath="/entity_classes"> <entity_class name="PassiveFlight" extends="animalChicken"> <!-- 省略内容 --> </append>
它还可以允许我们将值附加到现有值。(这需要测试)
示例:
此行可能会将NoAmmo添加到9mmBullet的现有值。
<append xpath="/items/item/property[@class='Action0']/property[@name='Magazine_items' and @value='9mmBullet']/@value">,NoAmmo</append>
<insertAfter xpath =””>
允许您在指定的xpath之后添加节点。它找到您要搜索的XML节点,然后添加<insertAfter>块内的任何内容。
示例:
下面的代码段允许您在windowVehicleStats窗口中添加新内容,在recti调用'content'之后,在XUi / windows.xml中:
<insertAfter xpath="/windows/window[@name='windowVehicleStats']/rect[@name='content']" > <panel pos="240, 0" style="header.panel"> <sprite style="header.icon" sprite="ui_game_symbol_add"/> <label style="header.name" text="COMBINE" text_key="xuiCombine"/> </panel> </insertAfter>