1 428
收录服务器
2 098
注册
29 138
玩家
Simple Anti-Mob Lag 简单反生物延迟
减少暴徒和农场的性能影响,而不影响游戏可玩性。
作 者 froobynooby
发布时间 2019年5月18日
支持核心 Spigot
原生版本
支持版本 1.9,1.10,1.11,1.12,1.13,1.14,1.15,1.16
点此下载

Simple Anti-Mob Lag (SAML) 旨在通过削弱或冻结特定群体的生物,来防止或减轻由生物引起的服务器TPS下降,且不影响游戏体验。插件通过配置禁用生物的部分寻路目标或完全冻结生物AI来实现优化。

请考虑使用FarmControl代替SAML。SAML在未来不太可能得到支持。


🎉 插件简介

Simple Anti-Mob Lag (SAML) 旨在防止或减轻由于服务器中大量的生物刷新导致的服务器TPS下降,SAML 通过禁用生物的部分AI来实现优化。

  • 被冻结的生物没有任何 AI,它们不会移动,不受重力影响,水无法推动它们,并且不执行一些实体特定的功能(例如绵羊再生羊毛)。
  • 被削弱的生物只会丢失一些寻路目标;丢失和保留的目标完全可配置。

默认情况下,插件会主动削弱所有动物农场。 默认情况下,所有这些操作(默认情况下)都会从农场中的动物身上移除“随机漫步”寻路目标,即它只是阻止动物随机走动。 如果农场没有过于密集地挤在一起,这会导致动物停止不断地相互碰撞(示例),并且这可以显着降低它们对服务器的性能影响。 默认情况下,当服务器的 TPS 降至 18.5 以下时,我们还会冻结大型群体中的生物,并且当 TPS 升至 19.5 以上并且足够稳定时,我们会小幅增加并解冻生物。 这里的一切都是可配置的。

📦 安装与配置

安装非常简单。 只需将 jar 文件放入 plugins 文件夹中,然后重启或重新加载服务器。 这将在插件目录的“SAML”文件夹中生成插件的配置文件。

有很多内容需要配置。 这是配置文件的样子:

config.yml

# 不要更改此项!
version: 8

# !! 请勿编辑包含“section-begin”或“section-end”的行。 这些用于更新配置!!

# +--------------------------------------------------------------------------------------------------------------------+
# |  特点                                                                                                          |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: features

# 您是否想要一个具有更多选项的配置文件来生成?
#   * advanced_config.yml 中的大多数选项只允许您指定“游戏设置”部分中每个实体类型的一些设置。
use-advanced-config: false

# 我们是否应该始终运行冻结任务,该任务将按照规范冻结生物?
#   * 您可以在“被动冻结参数”部分中定义应该或不应该冻结/削弱的内容。
#   * 这旨在用于冻结或削弱大型动物农场,其中生物实际上不需要 AI。
enable-passive-freeze-task: true

# 如果启用了上述功能,我们应该每隔多少个游戏刻运行此任务?
ticks-per-passive-freeze-task: 1200

# 我们是否应该运行一个单独的冻结任务,当 TPS 降至某个阈值以下时,该任务将冻结某些生物?
#   * 您可以在“TPS 冻结参数”部分中定义在此任务中将冻结/削弱的内容以及何时激活它。
#   * 想法是它应该比被动冻结任务更积极,这样您就可以牺牲生物 AI 来重新获得您的 TPS。
enable-tps-freeze-task: true

# 如果启用了上述功能,我们应该每隔多少个游戏刻运行此任务?
ticks-per-tps-freeze-task: 1200

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  冻结区块缓存设置                                                                                         |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: frozen_chunk_cache_settings

# 我们是否应该保留包含冻结生物的区块列表,以便如果插件没有正确关闭,我们可以解冻它们?
#   * 如果您认为您会在某个时候卸载此插件,请将其保留为 true。 这将使您可以轻松地解冻您世界中的所有冻结生物。
keep-frozen-chunk-cache: true

# 启动时,我们是否应该解冻以前未解冻的生物?
#   * 警告:此操作会加载区块,因此可能会导致大量滞后。
unfreeze-cached-chunks-on-startup: false

# 我们应该每隔多少个游戏刻解冻这些生物?
ticks-per-cached-chunk-unfreeze: 5

# 您是否使用 Paper? 如果是这样,您是否希望上述任务(缓存解冻任务)以更有效的方式运行?
use-paper-get-chunk-async: false

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  被动冻结参数                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: passive_freeze_parameters

# 当我们运行被动冻结任务时,应该冻结哪些生物组?
passive-freeze-groups:
#  - dense_animal_farm

# 当我们运行被动冻结任务时,我们不应该冻结哪些生物组?
passive-freeze-exclude-groups:

# 当我们运行被动冻结任务时,应该削弱哪些生物组?
passive-nerf-groups:
  - animal_farm

# 当我们运行被动冻结任务时,我们不应该削弱哪些生物组?
passive-nerf-exclude-groups:
#  - dense_animal_farm

# 如果先前被动冻结/削弱的生物不再位于上述指定的组中,我们是否应该解冻/取消削弱它们?
#   * 例如:如果一头牛因为在一个大型生物农场而被冻结,如果上述设置为 true,则如果该农场中的所有其他生物都被杀死,它将被解冻。
passive-do-cleanup: true

# 当开始/完成被动冻结任务时,我们是否应该向控制台发送消息?
#   * 消息可以在 messages.yml 文件中指定。
passive-freeze-broadcast-to-console: false

# 当开始/完成被动冻结任务时,我们是否应该向具有权限“saml.notify”的玩家发送消息?
#   * 消息可以在 messages.yml 文件中指定。
passive-freeze-broadcast-to-ops: false

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  Tps 冻结参数                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: passive_freeze_parameters

# 当我们运行 TPS 冻结任务时,应该冻结哪些生物组?
tps-freeze-groups:
  - default_group # <- 请参阅“默认组设置”部分以调整此组的工作方式。
  - lag_causers
#  - default_singular # <- 只需冻结所有内容!

# 当我们运行 TPS 冻结任务时,我们不应该冻结哪些生物组?
tps-freeze-exclude-groups:

# 当我们运行 TPS 冻结任务时,应该削弱哪些生物组?
tps-nerf-groups:

# 当我们运行 TPS 冻结任务时,我们不应该削弱哪些生物组?
tps-nerf-exclude-groups:

# 当服务器的 TPS 降至此值以下时,我们将开始冻结生物。
tps-freezing-threshold: 18.5

# 当服务器的 TPS 升至此值以上时,我们将再次开始解冻生物。
#   * 这应该高于 tps-freezing-threshold!
tps-unfreezing-threshold: 19.5

# 在我们开始解冻生物之前,TPS 与 tps-unfreezing-threshold 之间至少应该有多少个标准差?
#   * TPS 的标准差实际上是稳定性的衡量标准。 此设置使插件仅在 TPS 相当稳定时才解冻生物。
#   * 较高的置信范围意味着我们需要更高的稳定性。
#   * 最好将此值保持在 1 到 5 的范围内。
tps-unfreeze-confidence-range: 2.5

# 在任何给定的操作中,最多应该解冻多少个生物?
tps-unfreeze-limit: 40

# 某些类型的生物应该对上述解冻限制做出多大贡献?
#   * 如果未指定,则默认情况下,一个生物将对解冻限制贡献 1。
#   * 例如,如果掠夺者的权重为 10,且解冻限制为 40,则最多将解冻 4 个掠夺者,因为 4 * 10 = 40。
#   * 解冻限制永远不会超过; 例如,如果解冻限制为 40,且鸡的权重为 41,则永远不会解冻鸡。
tps-unfreeze-weights:
  PILLAGER: 8
  VILLAGER: 4
  fish: 2

# 在冻结一个生物之后,我们应该等待的最短时间(以毫秒为单位)是多少,然后才能解冻它?
tps-minimum-freeze-time: 300000

# 我们是否应该解冻/取消削弱先前受 TPS 冻结影响的生物,但它们当前的状态不会受到影响?
#   * 这不如使用被动冻结任务那么重要,因为由 TPS 冻结任务冻结/削弱的生物将在 TPS 升高时解冻/取消削弱。
tps-do-cleanp: false

# 当开始/完成 TPS 冻结任务时,我们是否应该向控制台发送消息?
#   * 消息可以在 messages.yml 文件中指定。
tps-freeze-broadcast-to-console: true

# 当开始/完成 TPS 冻结任务时,我们是否应该向具有权限“saml.notify”的玩家发送消息?
#   * 消息可以在 messages.yml 文件中指定。
tps-freeze-broadcast-to-ops: false

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  TPS 计算器设置                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: tps_calculator_settings

# 我们应该在多少个游戏刻上计算 TPS?
tps-sample-size: 900

# 我们使用加权平均值来计算 TPS,以便更好地反映服务器的当前状态。 我们应该使用什么因子进行缩放?
tps-weighting-factor: 0.995

# 我们在一段时间内平均 TPS,因此它不受短暂的滞后峰值的影响。 我们应该在多少个游戏刻上平均 TPS?
tps-smoothing-sample-size: 400

# 我们是否应该使用内置的 Minecraft TPS?
#   * 如果设置为 true,则 tps-sample-size 设置将不起作用。 样本大小将固定为一分钟(1200 个游戏刻)。
use-nms-tps: false

# 我们应该每隔多少个游戏刻获取 TPS 样本以计算标准差?
tps-deviation-sample-rate: 50

# 我们应该在标准差的计算中包括多少个 TPS 样本?
#   * 建议此值应使 (tps-deviation-sample-rate)*(tps-deviation-sample-size) 大致等于 2*(ticks-per-operation)。
tps-deviation-sample-size: 24

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  通用冻结参数                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: generic_freeze_parameters

# 应该允许冻结操作花费多长时间(以毫秒为单位)?
#   * 如果此设置过高,则当我们冻结生物时可能会出现明显的滞后峰值(除非您将 use-async-grouping 设置为 true)。
#   * 如果此设置过低,则可能没有足够的时间对所有实体进行分组。
#   * 如果您将 use-async-grouping 设置为 false,最好将其设置为低于 500 以避免明显的滞后峰值。
maximum-operation-time: 5000

# 我们是否应该异步运行生物分组算法?
#   * 将此设置为 true 意味着服务器在运行冻结时不会挂起。
#   * 没有理由将其设置为 false; 此选项存在于此的唯一原因是异步分组导致错误。
use-async-grouping: true

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  默认组设置                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: default_group_settings

# 如果在彼此的 group-maximum-radius 内的生物数量超过 group-minimum-size,这将构成一组生物。
group-minimum-size: 10
group-maximum-radius: 8.0

# 我们是否应该仅对相同类型的生物进行分组?
#   * 如果将此设置为 true,则由 2 匹马、3 头猪和 4 头牛组成的集合不会构成一组,但由 10 只鸡组成的集合会构成一组。
#   * 如果您只想冻结农场,这是一个不错的选择。
group-require-same-type: false

# 我们是否应该根据服务器的滞后程度来缩放组的最大半径和最小大小要求?
group-use-smart-scaling: true

# 如果我们确实缩放了最大半径和最小大小,我们应该在什么限制下不再进一步缩放它们?
group-minimum-scaled-size: 5
group-maximum-scaled-radius: 20

# 在 TPS 冻结阈值与当前 TPS 的什么比率下应达到上述限制?
#   * 即,当 TPS 达到 minimum-scale-tps-ratio * tps-freezing-threshold 时,组的最小大小和最大半径将为上述值。
group-minimum-scale-tps-ratio: 0.50

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  兼容性设置                                                                                             |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: compatibility_settings

# 我们永远不会忽略此列表上具有元数据的生物。
#   * 插件可以向实体添加元数据,以便其他插件可以使用该插件识别它们。
#   * 如果 SAML 干扰了其他插件的实体,请让该插件的开发人员向它们添加标识元数据。
ignore-metadata:
  - Elitemob  # 这会忽略插件 EliteMobs 中的精英生物。
  - Elitemobs_NPC # 这会忽略插件 EliteMobs 中的 NPC。
  - infernalMetadata # 这会忽略插件 InfernalMobs 中的地狱生物。
  - NPC # 这会忽略插件 Citizens 中的 NPC。
  - shopkeeper # 这会忽略插件 Shopkeepers 中的店主。
  - mythicmob
#  - Supermob  # 这会忽略插件 EliteMobs 中的超级生物。

# 我们永远不会在这些世界中运行冻结。
ignore-world:
  - example_world_the_end

# 我们是否应该仅解冻已被 SAML 标记的生物(即我们确定已冻结的生物)?
#   * 如果您使用另一个冻结生物的插件,或者如果您使用“NoAI”标签召唤生物,请将此选项保留为 true。
#   * 请注意,对于 1.14 之前的版本,无法在服务器重启之间保留元数据,因此如果此选项设置为 true 且某些 SAML 冻结的实体在服务器重启后保持冻结状态,SAML 将不会解冻它们。
only-unfreeze-tagged: true

# 我们是否应该在生物所在的区块卸载时解冻生物?
unfreeze-on-unload: true

# 我们是否应该在插件关闭时解冻所有已加载的生物?
unfreeze-on-shutdown: true

# section-end
# +--------------------------------------------------------------------------------------------------------------------+
# |  游戏设置                                                                                                 |
# +--------------------------------------------------------------------------------------------------------------------+
# section-begin: gameplay_settings

# 我们是否应该阻止生物以冻结的生物为目标?
#   * 这主要与防止生物攻击冻结的生物有关。
prevent-targeting-frozen: true

# 我们是否应该阻止生物能够伤害冻结的生物?
prevent-damaging-frozen: true

# 我们是否应该阻止玩家能够伤害冻结的生物?
prevent-player-damaging-frozen: false

# 我们是否应该在玩家交互时解冻生物?
unfreeze-on-interact: true

# 在低于什么 TPS 时,我们应该忽略上述选项,而不是解冻交互的生物?
#   * 设置为 0 可禁用此选项。
unfreeze-on-interact-tps-threshold: 0

# 我们是否应该在生物受到伤害时解冻生物?
unfreeze-on-damage: true

# 在低于什么 TPS 时,我们应该忽略上述选项,而不是解冻受到伤害的生物?
#   * 设置为 0 可禁用此选项。
unfreeze-on-damage-tps-threshold: 0

# 我们是否应该永远不冻结驯服的生物(猫、狗、马等)?
ignore-tamed: true

# 在低于什么 TPS 时,我们应该忽略上述选项,并开始冻结驯服的生物?
#   * 设置为 0 可禁用此选项。
ignore-tamed-tps-threshold: 0

# 我们是否应该忽略用名称标签命名的生物?
ignore-named: true

# 在低于什么 TPS 时,我们应该忽略上述选项,并开始冻结命名的生物?
#   * 设置为 0 可禁用此选项。
ignore-named-tps-threshold: 0

# 我们是否应该忽略被拴住的生物?
ignore-leashed: true

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略被拴住的生物?
#   * 设置为 0 可禁用此选项。
ignore-leashed-tps-threshold: 0

# 我们是否应该忽略处于爱情模式(繁殖模式)的生物?
ignore-love-mode: true

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略处于爱情模式的生物?
#   * 设置为 0 可禁用此选项。
ignore-love-mode-tps-threshold: 0

# 在什么距离(以方块为单位)内,我们应该忽略该距离内的生物?
#   * 请注意,这是一个非常昂贵的检查。 如果您有很多玩家,可能会使冻结操作持续更长时间。
#   * 设置为 0 可禁用此选项。
ignore-player-proximity: 0

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略靠近玩家的生物?
#   * 设置为 0 可禁用此选项。
ignore-player-proximity-tps-threshold: 0

# 对于什么年龄(以游戏刻为单位),我们应该忽略比该年龄小的生物?
#   * 此选项实际上允许您忽略最近生成的生物。 它非常适合防止某些类型的农场或研磨机堵塞。
#   * 设置为 0 可禁用此选项。
ignore-younger-than-ticks: 600

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略任何给定年龄的生物?
#   * 设置为 0 可禁用此选项。
ignore-younger-than-ticks-tps-threshold: 0

# 我们是否应该忽略以玩家为目标的生物(例如,攻击玩家的生物)?
ignore-target-player: true

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略以玩家为目标的生物?
#   * 设置为 0 可禁用此选项。
ignore-target-player-tps-threshold: 0

# 我们将忽略其类型在此列表上的生物。
#   * 有关类型列表,请参阅 https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html。
#   * 这是区分大小写的!
never-freeze:
  - PILLAGER
  - VINDICATOR
  - VEX
  - WITCH
  - RAVAGER
  - ILLUSIONER
  - EVOKER

# 在低于什么 TPS 时,我们应该忽略上述选项,并停止忽略此列表上具有类型的生物?
#   * 设置为 0 可禁用此选项。
never-freeze-tps-threshold: 0

# section-end

📜 命令与权限

命令:

  • /saml - 插件基础命令,显示插件版本。
  • /saml reload - 重新加载插件配置文件。
  • /saml stats - 显示服务器范围内和每个世界的冻结生物总数。

权限:

  • saml.saml - 允许使用 /saml 命令。
  • saml.notify - 在冻结操作开始和结束时收到通知(如果在配置中启用)。

🤝 兼容性

该插件可在 1.9 到 1.16 之间的版本上运行。但是,并非所有功能都适用于较低版本。 在 1.13 以下的版本中,无法在配置中使用 ignore-love-modeuse-paper-get-chunk-async 选项。 这是因为它使用了当时不存在的 API。 不幸的是,永远无法支持 1.8,因为我们用来“冻结”生物的主要 API 在 1.8 中不存在。

您将需要 Java 8 或更高版本才能运行此插件。

🧑‍🌾 1.14 中的村民

如果您使用的是 1.14.2+,您可能对以下插件感兴趣:Villager Optimiser。 这可以通过强制他们减少执行寻路操作的频率来大大提高村民的性能。 如果您在计时报告中看到较高的“tickEntity”读数,并且没有其他突出的内容,请尝试一下 - 它可能会有所帮助!

🔮 计划功能

  • 自定义组 - 更好地决定应冻结哪些生物。 例如,铁农场、养鸡场、末影人研磨机等中的村民。
  • 异步实体分组。
  • 能够通过命令执行冻结 - 具有许多可用选项。
  • 被动冻结生物:能够选择应始终冻结的生物组或类型,即使 TPS 不低。
  • 选择使用“软”冻结,该冻结不禁用某些东西,例如绵羊吃草。
  • 选择使用更敏感的 TPS 值,以防止生物不断冻结、解冻、冻结、...的乒乓效应。
  • 更多减少对游戏玩法影响的选项。
  • 请随时在讨论主题中留下任何建议。

请注意:如果您在配置中禁用 unfreeze-on-unloadunfreeze-on-shutdown,则冻结的实体将被保存到您的世界。 如果您随后卸载该插件,这些实体将不会被解冻。 如果您不想要启用这两个选项中的任何一个,并且如果您认为您会在某个时候卸载该插件,建议将配置中的“keep-frozen-chunk-cache”选项设置为 true。

Metrics: We use bStats to collect some non-identifying information about servers using this plugin. You can opt-out by editing the config.yml in the 'bStats' directory of your plugins folder.