True PVE是一个损害控制插件,最初旨在为希望真正成为PVE的服务器改进默认的服务器PVE模式(server.pve = true)。该插件也可用于微调 PVP 行为,从而实现一系列损害控制配置以自定义 PVP、PVE 以及介于两者之间的任何内容。
注意:TruePVE旨在与(PVP模式开启)一起使用!使用 运行 TruePVE 可能会产生意想不到的效果。server.pve false
server.pve true
在下载此插件的任何新版本之前,请阅读更新说明以了解更改的内容!重要的更新信息通常包含在这些注释中,并且会让您知道是否需要执行任何操作,以及您可以在新版本中看到哪些更改。
命令
控制台命令
tpve.def
– 擦除并创建默认配置/数据tpve.sched [enable|disable]
– 启用/禁用计划tpve.trace
– 切换跟踪;5M后自动禁用(硬编码),以防止意外日志溢出。有关跟踪的更多详细信息,请参阅下文。tpve.usage
– 显示命令使用信息
聊天命令
/tpve_prod
– 打印出正在查看的实体的类型和预制件名称(对于实体组)/tpve map [name] <target>
– 创建/更新/删除映射。[name] 是映射的名称或要映射的区域 ID。 是一个可选参数,用于定义要映射到的规则集名称或“排除”以跳过处理。留空将删除 [name] 的映射<target>
<target>
配置
TruePVE
config
- 配置版本 – 不更改
- 默认规则集 – 要使用的默认规则集的名称
- 配置选项 – 全局配置选项
- 处理损坏 – 启用 TruePVE 损坏处理
- 使用区域 – 允许使用特定于区域的损坏配置(需要区域管理器)
- 映射 – 将区域名称(LiteZones)或名称/ID(区域管理器)映射到规则集名称,或仅将规则集名称映射到自身。可用于将多个区域映射到同一规则集。也可用于通过映射到“排除”来创建排除区域(具有默认 rust 行为的区域)。例:
"Mappings": {
"default": "default",
"66499587": "killall",
"62819081": "exclude"
},
- 计划 – 计划规则集更改
- 已启用 – 启用计划使用
- 使用实时 – 启用使用实时(服务器时间)
- 广播 – 允许在计划的规则集更改时发送广播消息(但是如果没有为计划条目设置消息,则不会广播消息)
- 条目 – 计划条目 – 详见下文规则集 – 定义的损坏配置 – 详见下文 实体组 – 规则中使用的已定义实体分组 – 详见下文
调试
跟踪会打开基本的调试日志记录,以帮助调试和识别规则集、规则和实体组配置的问题。捕获损坏日志记录后,应手动关闭跟踪,但将在 5 分钟后自动禁用(硬编码) – 这是为了防止日志在意外打开时溢出。跟踪结果输出到 ./oxide/logs/TruePVE/truepve_ruletrace-[date].txt。
跟踪文本标识:
- 启动器类型和预制件名称
- 目标类型和预制件名称
- 排除组是否命中
- 命中哪些特殊逻辑块
- 使用哪个规则集
- 选择哪些实体组
- 评估哪些规则,以及最终结果(真:允许损坏,假:块损坏,空:Rust 默认损坏处理)
示例输出:
======================
== STARTING TRACE ==
== 15:09:18.38210 ==
======================
From: BasePlayer, player
To: Workbench, workbench3.deployed
No shared locations (empty location) - no exclusions
No exclusion found - lookup RuleSet
Using RuleSet "default"
No match in pre-checks; evaluating RuleSet rules...
Initator EntityGroup matches: players
Target EntityGroup matches: none
Evaluating Rules...
Checking direct initiator->target rules...
No direct match rules found; continuing...
Evaluating "players->any"...
No match found
No matching initiator->any rules found; continuing...
No matching any->target rules found; returning default value: False
======================
== STARTING TRACE ==
== 15:09:18.69712 ==
======================
From: BasePlayer, player
To: VendingMachine, vendingmachine.deployed
No shared locations (empty location) - no exclusions
No exclusion found - lookup RuleSet
Using RuleSet "default"
Door/StorageContainer detected with immortal flag; lock check results: null; continue checks
Initiator is player with authorization over non-player target; allow and return
实体组
毫不奇怪,实体组是定义一组实体的容器。
组名称在规则中用作引用,成员和排除项定义组中的实体。实体组在所有规则集之间共享,因此您无需为不同的规则集创建同一组的多个版本。
组的成员和排除项可以同时包含类型和预制件名称(通过 /tpve_prod 命令提供) – 这些字段区分大小写,通常 Type 为驼峰大小写,而预制件为小写。此外,通常,一个 Type 可以包含许多预制件,但预制件始终是相同的类型,因此您可以将 Type 定义为成员,并通过在排除项中定义不需要的单个预制件来排除它们。
// Example entity group
{
"name": "players",
"members": "BasePlayer",
"exclusions": ""
}
规则集
毫不奇怪,规则集是一组规则。
规则集的名称在计划规则集更改或特定于区域的配置时用作参考。
defaultAllowDamage 选项定义规则集的标准行为是什么 – 即,它是允许还是阻止整体损害。对于 PVE 规则集,这应始终设置为 false。
flags 选项允许您定义一些内置规则(需要在后台进行更专业编码的规则)。仅启用定义的标志,而自然禁用任何未定义的标志。可用标志的列表和说明如下。
规则部分是准语义准确的规则列表(没有更多的链接!它们定义一个规则集及其对另一个规则集的行为。格式为:[规则集 1
] [行为] [规则集 2],但是目前规则集是从规则的末端拉出来的,只有少数行为对规则有任何影响,所以你几乎可以在规则集 1 和 2 之间说任何话,它将被假定为“允许损害”。例外情况是,如果行为中出现“不能”或“不能”一词,则该规则将被否定并假定为“防止损害”。
此外,还有一些通用的规则集名称可用于定义更广泛的应用程序 – 术语“任何”、“无”、“一切”、“全部”、“任何”和“无”可用于规则集 1 或规则集 2。但同样,语义被考虑在内,因此“无”或“无”将再次有效地颠倒规则含义。因此,使用双重否定,如“玩家不能伤害任何东西”将转化为“玩家可以伤害一切”,并可能阻止你加入任何游艇俱乐部。
规则优先级
在编写规则时必须考虑一定的优先级。通常,更具体的规则会覆盖广泛的规则(带有“任何”或“无”等的规则)。如果你有两个规则:“任何东西都可以伤害玩家”和“路障不能伤害玩家”,那么路障规则将始终覆盖“任何东西”规则。
计划条目
计划条目定义计划的全局规则集更改,并已汇总到一行中,其中三 (3) 个部分由空格分隔:
- 时间 – 计划条目生效的时间。对于游戏内时间,格式为“hh:mm”,其中 hh 是小时(24 小时格式),mm 是分钟。但是,实时计划条目应输入为“d.hh:mm”,其中 d 是星期几,为 0-6(星期日至星期六)。星期几现在也接受(星号)作为通配符来表示每日,因此实时输入“*.08:00”将在每天 0800(上午 8:00)触发。请注意,对于实时,如果您不提供星期几,则假定为 0(星期日),并且您的计划条目只会在星期日触发!
*
- 规则集 – 要在指定时间全局设置的规则集名称
- 消息 – 规则集名称后的所有文本都用作广播消息,以便在规则集更改时发送给所有玩家。此消息也会发送给在计划条目期间登录的任何玩家。令人震惊的是,如果消息为空,则不会广播任何消息。
// Example schedule entries using realtime
"*.12:00 default PVE enabled!" // at 12:00 daily, set RuleSet "default" and broadcast "PVE enabled!"
"*.18:00 pvp PVP time!" // at 18:00 (6pm) daily, set RuleSet "pvp" and broadcast "PVP time!"
规则集标志
注意 – 这些标志中的大多数都是从以前的配置选项中继承而来的,但有些标志的功能略有改变。
覆盖规则: – 所有标志在使用时都会忽略规则的评估,但陷阱忽略玩家、炮塔忽略玩家、炮塔忽略科学家和 SamSitesIgnore玩家除外,它们只允许实体组中的例外
忽略所有规则: – NoHeliDamage,NoHeliDamagePlayer,NoHeliDamageQuarry需要处理Heli伤害。默认情况下,不使用直升机标志会造成损坏。无论哪种方式,都不会评估规则。
- 衰减损坏 – TruePVE 无法处理衰减损坏
- 抢劫 – TruePVE不处理抢劫。使用防止抢劫插件
- 动物伤害 – 不评估规则 – 允许此对象的所有伤害
- 高级圣诞灯 – 不评估规则 – 您必须能够构建以损坏此对象
- GrowableEntity – 不评估规则 – 您必须能够构建或成为所有者才能损坏此对象
- 授权损害是一个非常小众的标志,被严重误解。它允许玩家破坏他们拥有的实体,或拥有橱柜授权。当与橱柜所有权配对时,当没有工具橱柜保护实体时,它将允许损坏。授权损害要求所有权通过在玩家拥有实体、成为盟友或攻击不受工具柜保护的实体时允许伤害来帮助完善它。
- “授权损坏”会覆盖规则,除非这些规则适用于坐骑或坐骑。授权损害要求所有权会覆盖规则,除非玩家是盟友并且规则适用于坐骑。在这种情况下,如果损坏未被阻止,规则将继续评估。如果玩家不是盟友,那么除了坐骑之外,规则还可以覆盖 samsites。
- 自杀已阻止 – 阻止自杀 – 不使用规则
- 自我伤害 – 允许玩家(通常)伤害自己,例如使用C4或豆罐等。
- 橱柜所有权 – 启用授权损坏后,橱柜范围之外的实体将被视为无主实体,橱柜范围内的实体将需要授权。
- 树枝伤害 – 允许玩家破坏任何树枝积木,无论授权如何(以鼓励健全的建造实践)。这目前要求在重写之前也设置授权损坏标志。
- NoHeliDamage – 禁用直升机伤害(采石场使用NoHeliDamageQuarry,玩家使用NoHeliDamagePlayer)
- NoHeliDamagePlayer – 防止直升机伤害玩家
- 无直升机损坏采石场 – 防止直升机损坏采石场
- 直升机损坏已锁定 – 允许直升机损坏上锁的盒子/门(需要锁定的盒子不朽或锁定的门不朽)
- 人类NPC伤害 – 启用人类NPC伤害
- 锁定的盒子不朽 – 锁定的盒子是不朽的(_HeliDamageLocked _overrides这个)
- 锁门不朽 – 锁门是不朽的(_HeliDamageLocked _overrides这个)
- 管理员伤害睡眠者 – 管理员可以伤害睡眠者
- 受保护的睡眠者 – 睡眠者受到保护,免受NPC伤害
- 陷阱忽略玩家 – 玩家不触发陷阱(不适用于熊/快照陷阱)
- 炮塔忽略玩家 – 玩家不触发炮塔(不适用于火焰炮塔)
- 炮塔忽略科学家 – 科学家和所有其他 NPC 不会触发炮塔
- SamSitesIgnorePlayer – Sam 网站忽略所有玩家。要排除静态 Samsites(例如启动站点中的静态 samsites),请排除 SamSites 实体组中的sam_static(请勿将 SamSite 作为成员或排除项)。用于玩家萨姆特斯。
sam_site_turret_deployed
- MiniCopterIsImmuneToCollision – 已删除 – 使用规则作为实体组中的成员
mini cannot hurt mini
MiniCopter
- 迷你不能伤害玩家 – 已删除 – 使用规则作为实体组中的成员
mini cannot hurt players
MiniCopter
- 汽车免疫 – 已删除 – 请参阅默认配置作为此更大的规则和实体组。
- 无炮塔伤害玩家 – 移除 – 使用炮塔忽略玩家标志
- 无炮塔伤害科学家 – 移除 – 使用炮塔忽略科学家标志
对于开发人员
钩子可用于外部插件添加、更新和删除映射:
// add or update a mapping - returns true if successful
bool AddOrUpdateMapping(string key, string ruleset);
// remove a mapping - returns true if successful
bool RemoveMapping(string key);
//Get the current ruleset name
TruePVE.Call<string>("CurrentRuleSetName");
外部接口调用
我们在处理 OnEntityTakeDamage() 时调用以下钩子;
可以实体接受伤害:返回真/假将允许/不允许伤害并跳过正常的真PVE伤害评估。
object CanEntityTakeDamage(BaseCombatEntity entity, HitInfo hitinfo)
我们在处理 CanBeTargeted() 时调用以下钩子;
CanEntityBeTargeted:返回true/false将允许/禁止定位并跳过正常的TruePVE目标评估。
object CanEntityBeTargeted(BasePlayer player, BaseEntity turret)
我们在处理 OnTrapTrigger() 时调用以下钩子;
CanEntityTrapTrigger:返回true/false将允许/禁止触发事件并跳过正常的TruePVE触发器评估。
object CanEntityTrapTrigger(BaseTrap trap, BasePlayer player)
区域集成
从 ZoneManager 2.4.61 开始,您不再需要修改 ZoneManager!ZoneManager 3.0.0 不会为我们返回 zoneId。任何高于或低于的版本都应该有效。