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 的名称。 是一个可选参数,用于定义要映射到的 RuleSet 名称或“排除”以跳过处理。留空将删除 [name] 的映射<target>
<target>
配置
TruePVE
config
- 配置版本 – 不更改
- 默认规则集 — 要使用的默认规则集的名称
- 配置选项 – 全局配置选项
- handleDamage – 启用 TruePVE 损坏处理
- useZones – 允许使用特定于区域的损坏配置(需要 ZoneManager)
- 映射 – 将区域名称 (LiteZones) 或名称/ID (ZoneManager) 映射到 RuleSet 名称,或者将 RuleSet 名称映射到自身。可用于将多个区域映射到同一个 RuleSet。也可以用于通过映射到 “exclude” 来创建禁区(具有默认 Rust 行为的区域)。例:
"Mappings": {
"default": "default",
"66499587": "killall",
"62819081": "exclude"
},
- Schedule – 计划 RuleSet 更改
- enabled – 启用计划使用
- useRealtime – 启用使用 realtime(服务器时间)
- broadcast – 允许在计划规则集更改时发送广播消息(但如果没有为计划条目设置消息,则不会广播消息)
- 条目 – 计划条目 – 有关详细信息,请参见下文规则集 – 定义的损坏配置 – 有关详细信息,请参见下文实体组 – 规则中使用的已定义实体分组 – 有关详细信息,请参见下文
调试
跟踪将打开基本的调试日志记录,以帮助调试和识别 RuleSet、rule 和 EntityGroup 配置的问题。捕获损坏日志记录后,应手动关闭跟踪,但会在 5 分钟后自动禁用(硬编码)——这是为了防止日志在不小心打开时溢出。跟踪结果输出到 ./oxide/logs/TruePVE/truepve_ruletrace-[date].txt。
跟踪文本标识:
- 启动器类型和预制件名称
- 目标类型和预制件名称
- 是否命中排除组
- 命中哪些特殊逻辑块
- 使用哪个 RuleSet
- 选择了哪些 EntityGroups
- 评估哪些规则,以及最终结果(true:允许损坏,false:阻止损坏,null: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,因此您可以将 Type 定义为成员,并通过在排除项中定义它们来排除不需要的单个预制件。
// Example entity group
{
"name": "players",
"members": "BasePlayer",
"exclusions": ""
}
规则集
RuleSet 也是一组规则,这并不奇怪。
在计划 RuleSet 更改或特定于区域的配置时,RuleSet 的名称用作参考。
defaultAllowDamage 选项定义 RuleSet 的标准行为,即它是允许还是阻止整体损坏。对于 PVE 规则集,这应始终设置为 false。
flags 选项允许您定义一些内置规则(需要在后台进行更专业编码的规则)。仅启用已定义的标志,而任何未定义的标志自然会被禁用。下面是可用标志的列表和说明。
规则部分是语义上准准确的规则列表(没有更多链接!它们定义一个规则集及其对另一个规则集的行为。格式为:[RuleSet 1] [behavior] [RuleSet 2]
,但目前 RuleSet 是从规则的两端拉出来的,只有少数行为对规则有任何影响,所以你几乎可以说 RuleSet 1 和 2 之间的任何内容,它将被假定为“允许损坏”。例外情况是,如果行为中出现“不能”或“不能”等词,则该规则将被否定并假定为“防止损害”。
此外,还有一些通用的 RuleSet 名称可用于定义更广泛的应用程序 – 单词“anything”、“nothing”、“everything”、“all”、“any”和“none”可用于 RuleSet 1 或 RuleSet 2。不过,同样,语义也被考虑在内,因此“无”或“无”将再次有效地反转规则含义。因此,使用“玩家不能伤害任何东西”这样的双重否定将转化为“玩家可以伤害一切”,并可能阻止您加入任何游艇俱乐部。
规则优先级
在编写规则时,必须考虑一定的优先级。通常,更具体的规则会覆盖宽泛的规则(带有“任何”或“无”等的规则)。如果您有两条规则:“任何东西都可以伤害玩家”和“路障不能伤害玩家”,那么路障规则将始终覆盖“任何东西”规则。
计划条目
计划条目定义计划的全局 RuleSet 更改,并已滚动到一行中,其中三 (3) 个部分由空格分隔:
- 时间 – 计划条目生效的时间。对于游戏内时间,格式为“hh:mm”,其中 hh 是小时(24 小时格式),mm 是分钟。但是,实时计划条目应输入为“d.hh:mm”,其中 d 是星期几,为 0-6(周日至周六)。星期几现在也接受(星号)作为通配符来指示每天,因此“*.08:00”的实时条目将在每天 0800(上午 8:00)触发。请注意,对于实时信息,如果您未提供星期几,则假定为 0(星期日),并且您的计划条目将仅在周日触发!
*
- RuleSet – 在指定时间全局设置的 RuleSet 名称
- 消息 – 当规则集更改时,规则集名称后的所有文本都用作广播消息,以发送给所有玩家。此消息也会发送给在计划条目期间登录的任何玩家。令人震惊的是,如果消息为空,则不会广播任何消息。
// 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!"
RuleSet 标志
注 – 这些标志中的大多数都是从以前的配置选项继承而来的,但有些标志的功能略有变化。
覆盖规则: – 所有标志在使用时都会忽略规则的评估,但 TrapsIgnorePlayers、TurretsIgnorePlayers、TurretsIgnoreScientist、StaticSamSitesIgnorePlayers 和 PlayerSamSitesIgnorePlayers 除外,它们只允许实体组中的异常
忽略所有规则: – 需要 NoHeliDamage、NoHeliDamagePlayer、NoHeliDamageQuarry 来处理直升机伤害。默认情况下,不使用直升机标志会造成损坏。无论哪种方式,都不会评估规则。
- 衰减伤害 – TruePVE 不处理衰减伤害
- 抢劫 – TruePVE 不处理抢劫。使用 Prevent Looting 插件
- 动物伤害 – 不评估规则 – 允许对该物体造成任何伤害
- AdvancedChristmasLights – 不评估规则 – 您必须能够构建以损坏此对象
- GrowableEntity – 不评估规则 – 您必须能够构建或成为所有者才能损坏此对象
- AuthorizedDamage 是一个非常小众的标志,被严重误解了。它允许玩家破坏他们拥有的实体,或拥有橱柜授权的实体。当与 CupboardOwnership 配对时,它将在没有工具柜保护实体的情况下造成损坏。AuthorizedDamageRequiresOwnership 通过允许玩家在拥有实体、成为盟友或攻击不受工具柜保护的实体时造成伤害来帮助完善它。
- AuthorizeDamage 会覆盖规则,除非这些规则适用于装载或 samsites。AuthorizedDamageRequiresOwnership 会覆盖规则,除非玩家是盟友并且规则适用于坐骑。在这种情况下,如果损坏未被阻止,规则将继续评估。如果玩家不是盟友,那么除了坐骑之外,规则还可以覆盖萨姆斯。
- SuicideBlocked – 阻止自杀 – 不使用规则
- 自我伤害 – 允许玩家(通常)伤害自己,例如使用 C4 或 BeanCans 等。
- CupboardOwnership – 启用 AuthorizedDamage 后,橱柜范围之外的实体将被视为无主实体,而橱柜范围内的实体将需要授权。
- TwigDamage – 允许玩家破坏任何树枝积木,无论是否获得授权(以鼓励合理的建筑实践)
- NoHeliDamage – 禁用直升机伤害(对采石场使用 NoHeliDamageQuarry,对玩家使用 NoHeliDamagePlayer)
- NoHeliDamagePlayer – 防止直升机伤害玩家
- NoHeliDamageQuarry – 防止直升机损坏采石场
- HeliDamageLocked – 允许直升机损坏上锁的箱子/门(需要 LockedBoxesImmortal 或 LockedDoorsImmortal)
- HumanNPCDamage – 启用人类NPC伤害
- LockedBoxesImmortal – 上锁的盒子是不朽的(_HeliDamageLocked _overrides这个)
- LockedDoorsImmortal – 上锁的门是不朽的(_HeliDamageLocked _overrides这个)
- AdminsHurtSleepers – 管理员可以伤害睡眠者
- ProtectedSleepers – 保护睡眠者免受 NPC 伤害
- TrapsIgnorePlayers – 玩家不会触发陷阱(不适用于熊/捕捉陷阱)
- 炮塔IgnorePlayers – 玩家不会触发炮塔(不适用于火焰炮塔)
- 炮塔IgnoreScientists – 科学家和所有其他 NPC 不会触发炮塔
- StaticSamSitesIgnorePlayers – 静态 sam 站点会忽略所有玩家,例如来自 Launch Site 或已将 SamSite.staticRespawn 设置为 true 的插件。
- PlayerSamSitesIgnorePlayers – 玩家 sam 站点忽略所有玩家,例如来自已部署的 sam 站点。如果另一个插件将 SamSite.staticRespawn 设置为 true,则此标志将不适用于该 sam 站点。
- MiniCopterIsImmuneToCollision – 已删除 – 将规则用作实体组中的成员
mini cannot hurt mini
MiniCopter
- MiniCannotHurtPlayers – 已删除 – 将规则用作实体组中的成员
mini cannot hurt players
MiniCopter
- CarsImmunity – 已删除 – 请参阅默认配置作为此更大的规则和实体组。
- NoTurretDamagePlayer – 已删除 – 使用 TurretsIgnorePlayers 标志
- NoTurretDamageScientist – 已删除 – 使用 TurretsIgnoreScientists 标志
对于开发人员
钩子可用于外部插件,用于添加、更新和删除映射:
// 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");
外部 API 调用
我们在处理 OnEntityTakeDamage() 时调用以下钩子;
CanEntityTakeDamage:返回 true/false 将允许/不允许伤害并跳过正常的 TruePVE 伤害评估。
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 不会为我们返回 zoneIds。任何高于或低于的版本都应该可以工作。