True PVE 是一个损害控制插件,最初旨在为希望真正成为 PVE 的服务器改进默认服务器 PVE 模式 (server.pve = true)。该插件也可用于微调 PVP 行为,从而实现一系列伤害控制配置以自定义 PVP、PVE 以及介于两者之间的任何内容。

注意:TruePVE 旨在与(PVP 模式开启)一起使用!运行 TruePVE 可能会产生意想不到的效果。server.pve falseserver.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>

配置

可以在目录下的文件中配置设置和选项。建议使用编辑器和验证器,以避免格式问题和语法错误。TruePVEconfig
  • 配置版本 – 不更改
  • 默认规则集 — 要使用的默认规则集的名称
  • 配置选项 – 全局配置选项
    • 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) 个部分由空格分隔:

  1. 时间 – 计划条目生效的时间。对于游戏内时间,格式为“hh:mm”,其中 hh 是小时(24 小时格式),mm 是分钟。但是,实时计划条目应输入为“d.hh:mm”,其中 d 是星期几,为 0-6(周日至周六)。星期几现在也接受(星号)作为通配符来指示每天,因此“*.08:00”的实时条目将在每天 0800(上午 8:00)触发。请注意,对于实时信息,如果您未提供星期几,则假定为 0(星期日),并且您的计划条目将仅在周日触发!*
  2. RuleSet – 在指定时间全局设置的 RuleSet 名称
  3. 消息 – 当规则集更改时,规则集名称后的所有文本都用作广播消息,以发送给所有玩家。此消息也会发送给在计划条目期间登录的任何玩家。令人震惊的是,如果消息为空,则不会广播任何消息。
// 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 miniMiniCopter
  • MiniCannotHurtPlayers – 已删除 – 将规则用作实体组中的成员mini cannot hurt playersMiniCopter
  • 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。任何高于或低于的版本都应该可以工作。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。