特征
- 允许自定义纪念碑自动售货机上出售的物品
- 支持拥有隐形自动售货机的供应商,例如土匪营地和渔村的自动售货机
- 为旅行供应商提供支持
- 支持所有纪念碑类型,包括自定义纪念碑
- 根据自动售货机与纪念碑的相对位置,保存自定义项以供将来重新启动和擦除
- 将编辑内容与重复纪念碑处的自动售货机副本同步
- 与 Monument Addons 等插件在纪念碑处生成的 NPC 自动售货机兼容
- 允许绕过每台自动售货机的动态定价
- 允许自定义自动售货机皮肤
- 允许禁用自动售货机地图标记
- 允许禁用送货无人机访问
- 支持将 Economics 和 Server Rewards 作为付款和商品
- 支持蓝图,以及具有自定义皮肤和名称的项目
- 支持附件和其他子项
- 支持其他弹药类型和数量
注意:不会影响玩家自动售货机。
可选插件
- 纪念碑查找器
- 安装 Monument Finder 允许您保存相对于纪念碑的自动售货机自定义设置,只要自动售货机不相对于纪念碑移动,就可以自动将这些自定义设置应用于不同的地图(Facepunch 可能会每隔几年在重新设计纪念碑时移动一次它们)。
- 无需配置,自定义纪念碑除外。
- 如果没有 Monument Finder,自动售货机自定义将仅应用于当前地图。
运作方式
当您打开 NPC 自动售货机时,如果您有权限,您将看到一个编辑按钮。单击该编辑按钮将显示一个容器 UI,您可以在其中自定义自动售货机。
- 通过在容器中添加和删除商品来更改出售的商品及其价格
- 通过重新排列容器中的项目来更改显示顺序
- 通过编辑每个项目旁边的注释来更改 Stock 设置
- 通过单击广播图标来切换是否启用地图标记(绿色 = 打开,灰色 = 关闭)
- 通过单击无人机图标(绿色 = 打开,灰色 = 关闭)来切换送货无人机是否可以访问自动售货机
- 通过单击右下角的注释并设置或(如果 conar 设置为
Bypass Dynamic Pricing: True
Bypass Dynamic Pricing: False
npcvendingmachine.dynamicpricingenabled
false
) - 通过单击右下角的注释并编辑其内容来更改自动售货机皮肤和商店名称
- 单击“保存”按钮保存更改
关于地图和无人机市场的限制
- 在地图上查看自动售货机时,皮肤叠加层不可见
- 经济和服务器奖励货币不能用于通过无人机市场购买物品
- 当通过无人机市场出售物品以获得经济或服务器奖励货币时,玩家将立即收到货币(无人机会旅行但不会运输任何物品)
关于出差供应商的限制
- 在原版 Rust 中,旅行商人每次生成时都有略微随机的物品和价格,但这个插件目前不提供这样的功能,所以如果你编辑旅行商人,它每次都会以相同的价格出售相同的物品,即使你有多个旅行商人
- 无法启用地图标记和无人机辅助功能
数据提供商
编辑自动售货机时,您将看到一些调试文本,上面写着“Data Provider: …”它通知您如何保存和检索您的自定义项。
- “Map” (映射) — 表示数据与此特定映射相关联,并且不会应用于其他映射。
- 数据将保存在路径 中。
oxide/data/CustomVendingSetup/MAP_NAME.json
- 数据将保存在路径 中。
- “Entity” — 指示数据与自动售货机的父实体相关联。在撰写本文时,这适用于旅行供应商。
- 数据将保存在路径 中。
oxide/data/CustomVendingSetup.json
- 数据将保存在路径 中。
- “Monument” (纪念碑) — 指示数据与最近的纪念碑相关联,由 Monument Finder 确定。
- 数据将保存在路径 中。
oxide/data/CustomVendingSetup.json
- 数据将保存在路径 中。
- “Plugin” — 表示另一个插件正在挂接到自定义自动售货机设置中,以处理该特定自动售货机的数据保存和检索。通常,这是由生成自动售货机的插件完成的。
- 数据可以保存在任何地方,因为它是由充当数据提供者的插件决定的。
- 对于 Monument Addons,数据将保存在生成自动售货机的配置文件中
oxide/data/MonumentAddons/PROFILE_NAME.json
- 对于 Talking Npc 供应商,数据将保存在自动售货机配置文件中,网址为
oxide/data/TalkingNpc/VendingMachines/PROFILE_NAME.json
- 对于 Monument Addons,数据将保存在生成自动售货机的配置文件中
- 数据可以保存在任何地方,因为它是由充当数据提供者的插件决定的。
如果您在纪念碑处看到 “Map”,则您没有安装 Monument Finder,或者您需要通过 Monument Finder 配置来增加纪念碑的边界以包围自动售货机的位置。配置纪念碑边界对于自定义纪念碑很重要,因为插件没有可靠的方法来自动知道自定义纪念碑有多大。
权限
此插件使用权限系统。要分配权限,请使用 。要删除权限,请使用 。
oxide.grant <user or group> <name or steam id> <permission>
oxide.revoke <user or group> <name or steam id> <permission>
customvendingsetup.use
— 允许在纪念碑处编辑 NPC 自动售货机。
配置
设置和选项可以在目录下的文件中进行配置。建议使用编辑器和验证器,以避免格式问题和语法错误。
CustomVendingSetup
config
默认配置:
{
"Shop UI settings": {
"Enable skin overlays": true
},
"Economics integration": {
"Enabled": false,
"Item short name": "paper",
"Item skin ID": 2420097877
},
"Server Rewards integration": {
"Enabled": false,
"Item short name": "paper",
"Item skin ID": 2420097877
},
"Override item max stack sizes (shortname: amount)": {}
}
Shop UI settings
Enable skin overlays
(true
或 ) — While ,皮肤图像将在需要时叠加在项目上。例如,显示货币皮肤。false
true
Economics integration
— 控制与 Economics 插件的集成。Enabled
(true
或 ) — 确定是否启用 Economics 集成。启用后,以下配置的项目将用作代理,以配置自动售货机来购买和出售 Economics 货币。false
Item short name
— 确定将与 Economics 货币关联的项。当您想配置销售报价以购买或出售 Economics 货币时,您必须在编辑自动售货机时将此项目放入相应的 “For Sale” 或 “Currency” 列中。您在此处配置的任何项目都将显示在商店视图中,但您可以通过将 non- 和 设置为 来用皮肤图像来掩盖它。0
Item skin ID
Enable skin overlays
true
Item skin ID
— 确定将与 Economics 货币关联的皮肤 ID。如果你将此项设置为 ,原版物品(没有皮肤)将显示在商店视图中。如果将此项设置为 non-,并且设置为 ,则皮肤将显示在商店视图中。0
0
Enable skin overlays
true
Server Rewards
— 控制与 Server Rewards 插件的集成。Enabled
(true
或 ) — 与 Economics 相同。false
Item short name
— 与经济学相同。Item skin ID
— 与经济学相同。
Override item max stack sizes (shortname: amount)
— 此部分允许您按物品短名称覆盖玩家在购买物品时可以获得的物品的最大堆叠大小。这是为了让玩家从自动售货机收到比从其他来源接收的更大的物品堆。例如,如果 wood 的最大堆叠大小是 ,在此处配置最大值将允许玩家获得具有堆叠大小的单个 wood 物品(前提是自动售货机有足够的木材库存)。5000
10000
10000
- 此功能仅适用于此插件定制的自动售货机。
- 此功能可能不适用于每个堆栈大小插件。最坏的情况是,编辑这些设置可能不起作用。
- 我不建议大多数服务器使用此功能。它是应要求添加的,因为该插件修复了一个原版错误,即玩家可以在服务器重启后从自动售货机获得更大堆叠的物品。一些服务器所有者希望以更一致的方式重新引入该行为。
覆盖堆栈大小的示例:
"Override item max stack sizes (shortname: amount)": {
"wood": 10000,
"stones": 5000
}
地方化
默认消息位于目录下的文件中。要添加对其他语言的支持,请创建一个新的语言文件夹(例如 对于德语),请将默认语言文件复制到新文件夹,然后自定义消息。
CustomVendingSetup
lang/en
de
常见问题
如何更快地购买物品(无交易延迟)?
安装 Instant Buy 插件。它是兼容的。
如何让商品立即补货?
安装 Vending In Stock 插件。它是兼容的。
或者,您可以通过更改相应物品备注中的“补充之间的秒数”值来更改每件物品、每台自动售货机的补货速度。将该值设置为将导致该商品在购买后立即补货。0
如何允许玩家批量购买更多物品?
您一次可以购买的商品数量取决于自动售货机的库存。默认情况下,自动售货机库存的商品足够购买 10 次,但在某些情况下可能会库存更多(请参阅下面的问题)。您可以通过更改相应商品备注中的“最大库存”值来更改每台自动售货机每件商品的最大库存。
请注意,由于客户端限制,某些商品(尤其是具有条件栏的商品)无法批量购买。插件无法轻松解决此限制。解决方法是,您可以为同一商品创建多个商品信息(例如,1 架无人机对应 10 个废料,10 架无人机对应 100 个废品,100 架无人机对应 1000 个废品)。
为什么某些项目显示的库存量超过配置的库存量?
这种情况可能发生在以多种数量出售商品的自动售货机(例如,废料到木头,石头到木头)。发生这种情况是因为每个自动售货机都使用一个库存容器来存放其销售的所有商品,因此它会尝试为需要最多库存的促销报价提供所需的库存量。
如果您希望所有商品都显示相同的库存数量(例如,10 件有货),您可以更改销售金额和货币金额,使销售金额与同一商品的其他商品信息相匹配。
示例问题:
- 1000 木材换 20 块废料(显示 10 块库存)
- 500 木材兑 150 块石头(显示 20 块库存)
示例解决方案 A(库存总计 10k 木,与原始相同):
- 1000 木材换 20 块废料(显示 10 块库存)
- 1000 木材换 300 块石头(显示 10 块库存)
示例解决方案 B(库存总计 5k 木,一半原始):
- 500 木材换 10 个废料(显示 10 个库存)
- 500 木材兑 150 颗宝石(显示 10 块库存)
为什么高汤和香草不同?
这种情况可能发生在以多种数量出售商品的自动售货机(例如,废料到木头,石头到木头)。发生这种情况是因为原版的 stocking logic 存在不一致之处,这些不一致在 plugin’s stocking logic中得到了修复。
我可以销售 7 件以上的商品吗?
不。每台自动售货机最多可以出售 7 件商品。由于原版游戏中的 UI 限制,无法销售更多。分页功能可能会在插件的未来版本中实现。
如何显示自定义项名称?
目前无法显示自定义项名称,但此功能已计划推出。但是,该插件确实会存储自定义物品名称,并在玩家购买的物品上正确设置这些名称。
如何设置自定义纪念碑?
如果您使用的是带有自定义纪念碑的地图,请首先问问自己,您是否打算在其他地图上使用自定义纪念碑?
- 如果答案是否定的,则您不需要 Monument Finder,您可以简单地使用此插件的地图数据提供程序功能。
- 如果答案是肯定的,您应该安装 Monument Finder 并配置自定义边界。继续阅读下面的内容。
为了让 Custom Vending Setup 知道要保存自动售货机自定义设置相对于哪个纪念碑,它需要了解所有纪念碑的位置和大小。Custom Vending Setup 将此责任委托给 Monument Finder 插件。Monument Finder 对大多数原版纪念碑都有硬编码的边界,但对于自定义纪念碑,您很可能必须对其进行配置,因为它没有可靠的方法来猜测自定义纪念碑的位置和大小。请参阅 Monument Finder 文档中标题为如何设置自定义纪念碑的部分。
通过 Monument Finder 配置自定义纪念碑后,与自动售货机交互,然后单击 Edit 按钮以确认自动售货机正在使用 Monument 数据提供程序(而不是地图数据提供程序)。如果您仍然看到 Map 数据提供商,则可能是由于以下两个原因之一。
- 如果您之前已使用 Map 数据提供程序保存了自动售货机的自定义设置,则需要重置自动售货机以允许其切换到 Monument 数据提供程序。
- 如果纪念碑边界没有包裹自动售货机的位置,则需要重新配置纪念碑边界,然后重试。
开发人员 API
API_IsCustomized
bool API_IsCustomized(NPCVendingMachine vendingMachine)
如果此插件自定义了自动售货机,则返回 ,否则返回。true
false
API_RefreshDataProvider
void API_RefreshDataProvider(NPCVendingMachine vendingMachine)
删除自动售货机当前分配的数据提供程序,并再次调用该钩子。如果没有插件响应该钩子,自动售货机将回退到使用基于 monument 的数据提供程序。OnCustomVendingSetupDataProvider
开发人员 Hook
OnCustomVendingSetup
object OnCustomVendingSetup(NPCVendingMachine vendingMachine)
- 当此插件想要在内部注册纪念碑自动售货机以允许对其进行编辑时调用
- 退回将阻止自动售货机被编辑
false
- 返回将允许编辑自动售货机
null
OnCustomVendingSetupGiveSoldItem
void OnCustomVendingSetupGiveSoldItem(NPCVendingMachine vendingMachine, Item item, BasePlayer player)
- 当此插件将覆盖从自动售货机向玩家提供物品的逻辑时调用
- 这对于想要观察玩家从自动售货机接收物品的插件来说非常有用,因为仅使用本身可能会导致物品不正确,因为在自定义自动售货机设置将物品提供给玩家后,该钩子可能会在你的插件上调用,该玩家可以将该物品与玩家库存中已有的其他物品合并
OnNpcGiveSoldItem
OnNpcGiveSoldItem
amount
用法示例:
[PluginReference]
Plugin CustomVendingSetup;
void OnCustomVendingSetupGiveSoldItem(NPCVendingMachine vendingMachine, Item item, BasePlayer player)
{
// Run some logic to count the purchase
}
void OnNpcGiveSoldItem(NPCVendingMachine vendingMachine, Item item, BasePlayer player)
{
// Don't count the purchase if CustomVendingSetup is controlling the vending machine,
// since `OnCustomVendingSetupGiveSoldItem` will also be called in that case
if (CustomVendingSetup?.Call("API_IsCustomized", vendingMachine) is true)
return;
// Run some logic to count the purchase
}
OnCustomVendingSetupDataProvider
Dictionary<string, object> OnCustomVendingSetupDataProvider(NPCVendingMachine vendingMachine)
- 当此插件想要在内部注册自动售货机时调用,然后再将其与内置地图或纪念碑数据提供程序关联
- 返回有效的字典将覆盖插件检索/保存数据的位置
- 返回将导致默认行为
null
字典应包含以下键。
"Plugin"
— 您的插件。提供此功能可让管理员看到您的插件是给定自动售货机的数据提供商。- 类型:
Oxide.Core.Plugins.Plugin
- 类型:
"GetData"
— Custom Vending Setup 将调用的方法,用于检索此自动售货机的数据。- 类型:
System.Func<JObject>
- 类型:
"SaveData"
— 自定义自动售货机设置在编辑或重置自动售货机选件后将调用以保存数据的方法。- 类型:
System.Action<JObject>
- 类型:
如果您打算让多台自动售货机共享相同的数据,请确保为所有自动售货机返回相同的字典实例。
例:
class PluginData
{
[JsonProperty("VendingProfile")]
public object VendingProfile;
}
PluginData _pluginData;
void Init()
{
_pluginData = Interface.Oxide.DataFileSystem.ReadObject<PluginData>("Test_VendingProfile") ?? new PluginData();
}
Dictionary<string, object> OnCustomVendingSetupDataProvider(NPCVendingMachine vendingMachine)
{
if (vendingMachine.net.ID == 123456)
{
return new Dictionary<string, object>
{
["Plugin"] = this,
["GetData"] = new System.Func<JObject>(() =>
{
return _pluginData.VendingProfile as JObject;
}),
["SaveData"] = new System.Action<JObject>(data =>
{
_pluginData.VendingProfile = data;
Interface.Oxide.DataFileSystem.WriteObject("Test_VendingProfile", _pluginData);
}),
};
}
return null;
}
学分
- Misticos,此插件 (v1) 的原作者
暂无评论内容