PID: 75778903
唯一指定官方群“往世乐土”:792787604
————————————————保留节目————————————————
发完发布帖发现它从首页冒出来了……出问题。
赶紧施工教程……
等会儿吃个饭去,俩小时不知道能不能写完
笑死,俩小时?两天!
————————————————注意事项————————————————
1. 本教程适用于对塔科夫服务端以及json结构有基础了解,但没有能力编写服务端Mod的人群,并非面向完全小白。
2. 在制作扩展包时,推荐使用VSCode,当然你如果想用NotePad++我也没意见,总之别当记事本战神。
3. 关于超级模组以及MG-Mod的独立物品如何制作我不再赘述,如果你有相关的问题,可能不适合阅读这篇教程。
4. 如果遇到不懂的问题,建议优先参考Mod内置的示例包是否有相关内容,没有的话再来问我。
5. 读到这里如果你还想继续往下看,默认你拥有基础的电脑知识、VSCode的基础操作知识以及对json结构的基础了解。
6. 这条先放在这,后面需要再补充。
————————————————教程内容————————————————
1. 创建一个新的扩展包
1.1 在RITC的发布帖内找到下载链接,其内部有一个名为空白包的文件夹。
1.2 将「空白包」更改为你的扩展包所需要的名字,此处用「教程包」。
1.3 之后将更改完名字的扩展包复制到mod下的package文件夹内。
1.4 打开VSCode,将扩展包拖入VSCode以创建工作区。
1.5 打开package.json,修改其中的内容。
其中,pathname必须与扩展包文件夹的名字一致。
1.6 修改完成后按下保存或Ctrl+S进行保存,随后启动服务端,可以看到扩展包正常加载,不过现在没有任何实际内容。
2. 创建一个新的商人
2.1 找到示例包的traders文件夹,打开其下的trader文件夹。
可以看到有两个文件,这个就是商人的基础文件了。
2.2 将ExampleTrader.json复制到你的扩展包的相应目录下。
2.3 将其更改为你需要的商人的ID,这里使用GuideTrader。
2.4 在VSCode里打开对应的json文件。
将_id选项修改为你的商人ID。
2.5 修改商人描述等内容,这里我将暂时不需要讲解的内容折叠了。
瞎写的嗷,魂学家别来找我……
2.6 寻找一张合适的图片,裁切成正方形,后缀调整为jpg,将其重命名成你的商人的ID,然后放在res/avatar目录下。
推荐使用512×512像素。
2.7 保存,重新启动服务端,会看到一个错误提示,这是因为现在创建了一个商人,但是没有添加任何交易报价单导致的,先不急,启动游戏看看。
2.7 诶,有了。
可以看到商人现在没有任何内容,让我们继续下一步。
2.8 为商人启用各种功能(保险与维修)
控制保险相关的部分在商人文件内的insurance条目里
availability表示是否启用,默认呢为false。
excluded_category表示排除某项装备,这个我没试过,填的应该是装备栏名称……
max_return_hour和min_return_hour很好理解,就是保险最长和最短的归还时间。
max_storage_time表示最大存储时间,即保险经过多长时间后过期,单位为小时。
min_payment表示最少要支付多少?可能,我没试过。
insuranceChance表示回保概率,0-100,100则表示绝对不会有物品丢失,低于100有概率丢失物品。
insuranceMulti表示投保价格系数,0-1。
然后是本地化部分,insuranceLog负责本地化文本存储。
这里使用示例包讲解。
insuranceStart表示保险启用的文本,insuranceFound表示保险生效的文本,insuranceFailed和insuranceFailedLabs分别表示保险未成功失效(丢失)以及在实验室投保(实验室无论如何都不会回保)的对应文本,insuranceExpired则表示保险过期,最后的insuranceComplete表示保险完成?这个文本似乎不会被调用。
此处的本地化部分只需要填写本地化key,文本需要在本地化文本文件中编写。
找到res/locale/text.json,在其中填入对应内容。
比如图中示例商人2保险激活文本1,其在text.json中如下所示。
2.9 自定义商人的货币
比如你把东西卖给Peacekeeper,他会给你美元,你可以通过这个功能让你的商人在交易时使用自定义的货币。
又双叒叕是示例包。
如图所示,在商人处添加customcurrency和customcurrencyMulti,分别为自定义货币的物品ID与汇率。
举例,假设一个东西卖给你的商人能卖5000卢布,汇率填写100,最后你会得到5000/100=50自定义货币,小数点会自动向下取整。
此处强烈建议将倍率与你的自定义货币的价值设置为相同的数字。
如果想使用原版的美元或欧元则不需要这两个参数,只有自定义货币的商人需要这两个参数,原版的美元或欧元使用currency参数即可,参数值有三种,RUB、USD和EUR,分别代表卢布美元与欧元,具体参考原版商人。
3. 创建一个新的交易报价单
3.1 打开traders/AssortData.json,这里我把示例包也拉进了VSCode打开,不然来回找麻烦……
打开示例包的AssortData.json,这里以第一个作为参考。
依然是复制到你的扩展包的对应文件里,记得不要逗号嗷,这种基础知识我只讲一遍。
接下来是重点,我会讲解AssortData的格式。
ID:报价单选项的ID,拥有唯一性,不可重复。
Trader:报价单所属的商人的ID,原版商人的话自己查表,空白包里有查询表。(没错,支持给原版商人添加报价单)
Item:报价单的内容,即商人需要出售的物品的数据,这里由于只有一个物品,所以只有一个。
以下以Item[0]指代Item的第一个内容。
Item[0]的_id:与报价单的ID相同。
Item[0]的_tpl:商人出售的物品的ID。
parentId与slotId都为hideout,对于非预设物品报价单(包含多个物品的报价单,比如枪械、护甲、弹药包等物品)来说皆如此。
upd里的四个选项:
BuyRestrictionMax:单次补货的最大购买数量,即限购数量。
BuyRestrictionCurrent:不知道有啥用……默认是0。
StackObjectsCount:商人的存货数量,由于目前线上版本商人所有物品都不再会被买空,建议填写999999或99999999。
UnlimitedCount:控制物品是否显示为「大量」,设置为true即为大量,没有此关键字则显示具体数量(但其实你在跳蚤市场上还是能看到具体数量……)。
DogTag:参与兑换的狗牌的需求,详细的例子可以在示例包中找到,可以留空。
Barter:参与兑换的物品的需求,格式为itemid:count,前面填写物品id,后面填写物品数量。
TrustLevel:报价单所需的商人好感(信任度),分别为1234级(如果你的商人只有1级和皇冠则是1和2)。
isWeapon:是否将报价单按照武器处理,只有在报价单是武器时才能设置为true,否则产生问题概不负责。
Locked:报价单是否被锁定(需要任务解锁),设置为true即为锁定。
Quest:解锁报价单所需要完成的任务的ID。
3.2 讲完了,接下来让我们修改一下报价单的内容,为教程包的商人添加一个报价单。
修改完成后的内容如下。
用人能看懂的话呢就是为ID为GuideTrader的商人增加一个无需任务解锁的、ID为「教程包商人报价单1」的报价单,报价单的内容为使用400美元换取一根耐力针(SJ6 TGLabs),一次最多购买四个,信任度需求为1级。
3.3 让我们保存,重启服务端,进入游戏查看效果。
可以看到服务端不再反复提示先前的报错了。
进游戏看下,哎,非常完美。
3.3 附录:关于如何构建预设物品(武器、护甲、弹药包)报价单,这里只给出武器的例子,具体结构示例包里也有
目前呢有三种方法,不过不管哪种方法,我的推荐都是在游戏内先改好你需要的枪而不是真的嗯写。
这里放个简单的例子(因为复杂了写起来麻烦……)
方法1:手写
我们简单改一把CT同款usp
然后打开AssortData,还是老样子,复制个模板,改下基础数据。
首先查找usp的id,把Item[0]的_tpl修改为usp的id
重启,进入游戏,发现只有个红色的本体。
重启完发现我json文件写错了……少个逗号。
大家别学我。
再重启。
重启,进入游戏,发现只有个红色的本体。
别急,找到物品的原始文件(表里也有),搜索USP的ID。
拉到Slots部分,这个呢就是USP的本体上可以装备的所有配件槽。
让我们点开USP的本体,可以看到不算枪膛呢一共有七个槽位。
先把枪管想办法装上去,搜索我们改装好的USP的枪管的ID。
也就是它。
复制,返回到AssortData
这样在Items里创建一个新对象,_id随便填,手写的话最好像这样写可读性高的。
_tpl填写枪管的ID。
然后就是最重要的部分,parentId和slotId,parentId是这个物品安装在的物品的_id(不是_tpl,是_id!!),slotId为这个物品安装在的配件槽的名字。
比如枪管是安装在USP本体上的,parentId就填写USP本体的_id,slotId呢根据我们在物品文件里的查询可以看到是mod_barrel,于是就像下面这样。
老样子,保存,重启。
……写武器记得把isWeapon设置成true。
言传身授了属于是,草。
……一定记住是_id和_tpl(言传身授x2)。
回到正题,重进游戏发现有枪管了。
其他部件以此类推。
诶,那么有同学可能就会问了,啊手写好麻烦啊有没有简单点的办法。
当然有了,请看VCR啊呸,请继续往下看。
方法2:提取预设
回到第一步啊,改好的枪。
点击右上角的另存为,将它存储为一个新的预设。
之后保存,退出游戏,找到当前存档所对应的存档文件(位于user/profiles目录下)。
不知道是哪个的话,看启动器,启动器里你的名字下面那串东西就是存档ID。
拖入VSCode打开,搜索刚才保存的预设名字。
诶,有了。
然后我们把Item数组整个复制,替换掉我们AssortData里Item的内容。
记得把Item[0]的_id换成报价单的ID。
然后把upd的内容替换掉,当然,还有缺失的parentId和slotId。
保存,退出,重启,一气呵成。
诶,有了。
护甲呢也是一样的流程,不过护甲记得把isWeapon设置成flase,而且护甲不能保存预设,只能手写或者从原版的globals里导出。
好消息呢是护甲是不存在套娃的,不会说有部件(插板)上装部件的情况,因此手写起来比较简单。
方法3:安装塔科夫控制台Mod,使用控制台导出存档的预设
在服务端输入cwp + 玩家名,将导出该玩家保存的所有预设
找到对应的文件位置
就这样。
4. 创建一个新的任务
扩展包的任务文件被拆分成了三部分,任务初始化信息、任务条件和任务奖励(不考虑本地化)。
文件全部在traders/questdata里。
创建一个任务的第一步是将任务进行初始化,任务初始化信息由traders/questdata/initQuest.json存储。
4.1 老规矩啊,复制,修改。
initQuest的格式讲解:
ID:任务的ID,很好理解。
Type:任务的类型,这个影响的是任务的那个小的图案,PickUp是一个向上的手指、Elimination是一个骷髅头,etc.。
imagepath:任务图片的路径,除了最后的文件名,其余的不需要改动。
TraderID:任务发布者的商人的ID,也很好理解。
Location:地图,SearchMap里有查询表,填any的话就是任意地图。
Restartable:决定任务在失败后是否可以重新接取,设置为true则可以重新接取。
回到正题,修改好任务的初始化内容。
任务图片放置在res/image目录下。
随便挑一张,教程头图这张吧,记得把初始化里的图片名字改了。
保存,重启!
有了,本地化会在后面讲,先别急着接。
4.2 增添任务条件
任务条件由QuestConditions存储,key需要和任务ID对应。
创建教程任务1的空模板。
熟悉的关键字讲解环节,Start的内容表示接取任务所需的条件,Finish表示完成任务所需的条件,Fail则表示任务失败的条件。
所有条件都填入Data。
Override关键字设置为true时,加载器将先清除任务ID所对应任务的对应条件,然后再加载条件内容,这意味着你可以通过创建原版ID的任务条件数据并将Override设置为true,以修改原版任务。
由于一个讲太麻烦,这里就不一一示范了,我会把每一种条件都在下面列出来,使用示例包的任务进行说明。
任务开始条件:
第一种是要求某个任务的状态,如下
id和questid想必能读到这里的都能理解,后面就不过多描述了,type的Quest表示这是一个任务条件。
status里的数字代表任务状态,其中1为可接取,2为进行中,3为待交付,4为已完成,5为失败。
第二种是要求玩家达到指定等级
第三种是要求指定商人的好感达到指定等级
trader表示商人id,count表示需达到的等级
任务完成条件:
这个可以讲的就太多了,我们一个个来,先来简单的
寻找与上交物品:
结构完全一样,inraid表示是否要求物品拥有「在战局中找到」的状态
当然,它也可以是任务物品,任务物品的话建议将inraid设置为false,任务物品的部分会在后面讲
杀敌:
讲起来太麻烦了……推荐自己对照示例任务= =
熬了一天属实有点顶不住……
id和type就不讲了,onraid表示是否需要在单局内完成(未测试单局不完成是否会导致失败),count表示需求击杀的数量,bot表示要求击杀的敌人类型,可用参数包括Any(任意敌人)、Savage(Scav类型敌人)、Pmc(任意PMC干员)、Bear和Usec,错了的话以示例为准……
role用于细分Savage敌人类型,包括狙击手、Boss、游荡者、掠夺者等。
bodyPart表示要求造成部位击杀,留空则为无要求。
daytime表示要求的时间区间,24小时制。
distance表示要求的距离,distancetype表示距离的比较方式,>=是要求在xx距离外,<=则要求在xx距离内。
weapon表示要求的武器,Mod表示武器需要安装的配件(都是物品ID,留空则表示无要求)。
location表示条件要求的地图。
zone表示在指定的地点完成击杀,这个反查原版任务地点即可。
Equip表示需要穿戴的装备,其为二维数组,每一个数组里的装备只需要任意一个即可(比如原版的任意巴拉克拉瓦)。
踩点与撤离条件
踩点:
zoneid表示踩点的区域,依然可以从原版任务查找。
撤离:
oneraid、count不再解释……location表示在指定的地图撤离,一定要填!!全地图的话需要把所有地图写上。
status表示撤离状态,参数可以从原版任务查询,有幸存、匆匆逃离、失踪、死亡等。
chosenextractpoint表示是否需要指定撤离点,false的话下面那个参数不用填。
extractpoint表示指定的撤离点,只有在chosenextractpoint为true时有效,撤离点查地图文件。
达到指定等级、安放物品与达到指定技能等级条件:
这个也很好明白,安放需求的zoneid是区域,注意,虽然理论上通用,但踩点的zone和安放的zone有些无法通用,推测是判定问题,请自行尝试。
itemid是需要安放的物品,time是时间(感觉自己在说废话)。
失败条件由于未经测试,暂时空着,理论上击杀、撤离(死亡也是一种撤离状态)、等级、好感、完成任务都是支持的,有兴趣的可以自行尝试。
困困困……
算了,今天的工先施到这里……
没讲的部分真急需的话自己对照一下示例包吧,我先摸了,剩下的部分明天再施工= =
嗨嗨嗨,我又来辣!
堂堂复活!进入下一章节。
4.3 为任务创建奖励
突然发现任务奖励忘了写……
找到traders/questdata/QuestRewards.json
依然是复制啊,我这里就不复制了,拿示例包进行讲解。
任务奖励是数组,可以乱序,会在生成的时候自动重新排列。
经验奖励:
Condition的Finish表示任务阶段,意思是完成任务的奖励,相应的,Start表示在任务开始阶段给予的奖励,Failed则表示任务失败给予的奖励。
Quest表示对应的任务ID。
Count表示经验数量。
Name表示奖励的名称,同时也用作奖励的ID,最好不要重复。
Desc是任务奖励的介绍,仅为了提高可读性,可以重复。
商人好感(信任度)奖励:
重复的参数我就不再讲了。
Count表示的是增加的好感对应的数量,一次0.0几是很正常的。
TraderID表示增加好感的商人的ID。
解锁商人(类似耶格)的奖励:
Trader表示任务解锁的商人ID,初始锁定的商人需要在base文件里设置unlockByDefault,详见示例的ExampleTrader2。
物品奖励:
物品奖励比较特殊,首先是Items里可以存在多个物品,依然支持预设格式但是要去掉预设主物品的parentId和slotId,堆叠数量什么的也需要手动填写(单个堆叠可以不写)。
就像这样。
物品奖励的Count表示在外部显示的堆叠数量,与实际数量无关。
技能等级奖励:
Skill表示技能。
Count表示等级。
报价单和藏身处配方会在这两个地方单独处理。
4.4 为你的任务创建本地化文本
刚想起来我TM忘了讲这个……
任务的本地化文件位于res/locale/quest.json。
结构呢非常简单,name就是名字,note不知道干啥的,好像和笔记功能有关系,description是任务介绍。
failMessageText表示任务失败的文本。
startMessageText表示任务开始时发送的文本,一般与介绍相同。
successMessageText表示任务成功的文本。
conditions里填写任务条件的ID,用于为任务条件进行本地化。
你也可以把它们写到res/loclae/text.json里,和其他的本地化文本写在一起。
5. 创建独立物品
5.1 现成的独立物品安装
RITC支持三种格式的独立物品,包括超级模组、MG-Mod与RITC原生格式,items/superitem用于放置超级模组的独立物品;mgitem用于放置MG-Mod的独立物品,ritcitem用于放置RITC的独立物品。
5.2 创建RITC格式的独立物品
新建一个物品文件,填写如下信息。
其中_id为物品ID,推荐与文件名一致。
target为独立物品复制的物品ID,即原物品ID,这个做过独立物品的都能明白。
name可以不填,也可以不改,无影响。
_props里的这些都是重要数据
Name、ShortName和Description分别为物品的名字、缩略名字(物品图标右上角所显示的名字)和物品描述。
DefaultPrice是物品的预设价格,RagfairType为跳蚤市场分类标签,必填。
CanFindInRaid决定该物品是否可以在战局内刷新,默认为false,填true则可以在战局内找到。
注意:CanFindInRaid设置为false时,不会阻止物品在一些特殊渠道出现(如Fence、Scav宝箱等),如果希望阻止这些内容,需要配置BlackListType选项,这部分会在附录里讲解。
CustomLoot则表示是否自定义刷新,默认情况下,独立物品会与target共享刷新池,比如你的独立物品源物品是比特币,并且启用了战局内刷新,则所有能找到比特币的地方都有概率找到你的独立物品。
CustomLootTarget:你要自定义的刷新的目标物品。
isMoney:设置物品是否按照货币处理,只有在设置为true的情况下,才能正确处理自定义货币,否则在使用自定义货币购买物品时,将导致整叠物品被全部消耗。
剩下的属性呢和独立物品相同,把你需要修改的属性复制过来,修改对应的数据即可,其他数据无需补全,Mod会在加载时自动补充。
5.3 附录:关于部分特殊物品
以下直接使用示例物品讲解
独立任务物品:
isQuestItem:决定物品是否是任务物品,设置为true将被视作任务物品处理(记得target改成任务物品!!)。
QuestItemData:任务物品的刷新点数据。
locationId表示刷新点信息的索引,建议使用坐标。
probability表示概率,固定为1。
templete中ID表示刷新点的索引。
useGravity表示刷新是否受重力影响,建议设置为false以便于调整位置。
Position和Rotation表示刷新物品刷新的坐标和旋转角,关于如何创建自定义刷新点,请参考我之前的教程:[教程]自定义出生点/物品刷新点,不需要把任务物品写在原版的位置了(大概没人看)
Root表示刷新物品的ID。
Items里的参数我就不需要再讲解了吧……能看到这跟着做到这肯定能理解的。
注射器/带有buff的可使用物品(食物与饮品等):
StimulatorBuffs表示你的物品的buff所使用的索引ID,不可重复。
BuffValue表示你的物品的buff效果,这个可以参考原版进行编写。
原版抽奖箱:
isGiftBox:是否是原版抽奖箱,设置为true的话将按照原版抽奖箱处理。
BoxData:抽奖箱的数据。
Count:开启一次箱子获得的战利品数量。
Rewards:战利品池,格式为物品ID:权重。
别问我什么是权重。
原版抽奖箱性能极差,没有保底,不支持堆叠物品,不支持预设,推荐使用RITC提供的自定义抽奖箱。
请看VCR——
自定义抽奖箱(高级抽奖箱):
isadvGiftBox:同上,判断物品是否是高级抽奖箱。
advBoxData:高级抽奖箱的抽奖数据。
count:依然是开启一次箱子获得的物品数量(抽卡次数)。
forcefindinraid:是否强制给予带勾物品,设置为true的话无论开启的箱子是否带勾,开出的物品都会带勾;false则会让开出的物品带勾状态跟随箱子的带勾状态。
giftdata:卡池配置的ID。
卡池配置位于traders/GiftData.json
name和key就不需要讲了,basereward控制卡池内三种稀有度的参数,其结构相同(normal除外,因为除了金紫就只有normal),然后金和紫(superrare和rare)是一样的,这里就只讲结构了。
havebasereward:决定当前卡池是否存在保底,比如每10抽必出紫,每90抽必有金(这套系统的灵感来自哪里想必大家都能看出来)。
chance:单次抽卡命中的概率。
upchance:单次抽卡命中时抽中up的概率(没错,卡池支持配置up池^w^)。
upaddchance:单次抽卡没抽中up的话下次命中时抽到up的额外增加概率(比如up概率0.5,额外概率0.5,就能实现大小保底)。
chancegrowcount:第X-1抽依然未命中时,接下来的抽卡每一次都会增加额外的命中概率(仅在启用保底时有效)。
chancegrowpercount:第X-1抽依然未命中时,接下来的抽卡每一次增加的命中概率。
注意:X指的是增加开始前一次,比如第74次依然不出,接下来每次增加0.06,到第90抽时为0.06*(90-74)+0.04=1即必出,于是chancegrowcount填写73。
总之就是比实际计算开始次数少1,紫色的保底如果选择10次必出的话对着范例1的数据抄即可,其他的请自行计算……
itempool:这个参数表示卡池的内容
包括superrare、rare和normal,每个池子又分为chanceup和normal(即up内容和普通内容)。
卡池支持五种物品格式,Item(普通物品)、CustomPreset(自定义预设物品)、VanillaPreset(普通预设物品)、AmmoBox(子弹盒)以及Container(容器)。
Item的格式:
name表示物品名字,用于提升可读性。
itemid表示物品id(又是废话)。
type表示卡池内容的解析格式(废话)。
stackcount表示堆叠数量,不可堆叠物品填1,可堆叠随便填,不超过堆叠上限就可以。
CustomPreset的格式:
item是数组,其结构为预设,与AssortData的Item结构大体相同,从存档导出后无需任何修改即可使用,当然也支持手写。
反正我是直接从示例的报价单那边抄的……
VanillaPreset的格式:
item表示物品ID,Mod会自动寻找第一个符合物品ID的预设并返回。
AmmoBox的格式:
itemid表示物品ID,Mod会自动匹配弹药盒的容积大小。
Container的格式:
与预设比较接近,推荐在存档内编辑容器后截取内容进行修改粘贴。
固定抽奖箱(或者叫物资箱更合适):
isStaticBox:控制物品是否是固定抽奖箱。
StaticBoxData:内容物配置,与高级抽奖箱基本一致,count表示数量,forcefindinraid表示强制战局中发现状态。
giftdata是个数组,里面的内容与卡池内容的格式相同,不同之处在于固定抽奖箱的内容永远是固定的,比如你填五万美元,你开一万次它只会给你五万美元,不会给你别的。
注意:抽奖箱必须修改独立物品的name参数!!
通常用于处理从商人处单次交易获得多个物品的可能(原版并不允许这种事情),比如仅用一个物品换取可堆叠的一组物品。
独立武器:
FixMastering:是否修复添加专精。
CustomMasteringTarget:自定义专精修复目标,不留此参数的话修复专精默认选择复制目标。
AddMastering:是否为武器添加新的专精。
Mastering:添加的新专精内容。
5.4 杂项内容:
maxCountInRaid:战局最大携带数量,填写整数。
CustomFixID:自定义修复目标,不填写此条目则默认为复制目标
FixType:修复物品兼容度,格式为数组
其可用选项如下
None:不修复任何内容,填写了None请不要填写其它内容。
Mags:添加弹匣兼容,通常用于独立子弹。
Chamber:添加枪膛兼容,通常用于独立子弹。
Mods:添加配件兼容。
ModBlackList:添加冲突的配件兼容。
Container:添加容器的兼容。
ContainerBlackList:添加容器黑名单的兼容。
QuestEquip:添加任务装备的兼容。
QuestWeapon:添加单武器任务的武器使用兼容。
HandOverItem:添加单物品上交任务的上交物品兼容。
QuestWeaponGroup:添加任务的武器使用兼容。
HandOverItemgGroup:添加任务的上交物品兼容。
QuestEquipBlackList:添加任务屏蔽的装备的兼容。
InRaidCountLimit:添加战局携带限制,与复制目标相同,如果填写了maxCountInRaid自定义数量则无需此条。
BlackListType:屏蔽的可获取途径,格式为数组
其可用选项如下
AirDrop:阻止物品在空投中生成
PMCLoot:阻止物品在PMC身上生成
ScavCaseLoot:阻止物品在Scav宝箱中生成
Fence:阻止物品在Fence处出现
独立物品的部分到此结束,剩下的就是藏身处相关以及package的配置杂项了。
哦我任务奖励没写。
回来再写……
写完了。
6. 藏身处配方及自定义Scav宝箱项目
6.1 创建新的藏身处配方。
配方管理文件位于traders/RecipeData.json。
结构依然是非常简单,ID不用说。
Area表示配方所属的藏身处区域,依然有查询表。
AreaLevel表示区域对应的等级。
Output表示产出的物品的ID。
OutputCount表示产出的物品的数量。
Time是制作时间,秒为单位。
NeedFuel表示是否全程需要开启发电机,参考信号棒,不建议开启。
Locked和Quest依然表示是否需要任务解锁,参考前面。
Require里的Tool和Item分别表示需要的工具(不消耗)和物品(消耗),结构相同。
6.2 自定义Scav宝箱项目
自定义Scav宝箱的文件位于traders/ScavCaseData.json。
id,time,requires不需要多说了。
rewards分三个类型,common(普通)、rare(稀有)、superrare(超稀有),其数字分别表示最小数量和最大数量。
具体池子内容不清楚……没找到在哪。
7. 附录
7.1 配置自定义战利品黑名单
在package.json内找到Config里的LootBlackList,将你不希望在战局内(包括Scav宝箱、空投物资箱、PMC身上)找到的物品填入其中即可。
7.2 配置自定义物资刷新
在package.json内找到Config里的GenerateList,在这里配置自定义战利品刷新,格式为「需要刷新的物品ID:物品ID」。
比如你希望让自定义的物品在能出现比特币的地方刷新,那么就要把自定义物品ID写在冒号前,比特币写在冒号后。
7.3 配置自定义货币
在package.json内找到Config里的CustomMoney,将你的自定义货币的ID填入其中即可。
7.4 配置自定义跳蚤市场黑名单
在package.json内找到Config里的CustomRagfairBlackList,将你不希望能在跳蚤出售的物品ID填入其中即可,支持覆盖原版。
7.4 配置自定义跳蚤市场白名单
在package.json内找到Config里的CustomRagfairWhiteList,将你希望能在跳蚤出售的物品ID填入其中即可,支持覆盖原版。
————————————————更新日志————————————————
————————————————相关链接————————————————






























































































厉害啊佬
这必须给个赞
独立物品不在商人处显示
高质量教程贴