forked from mirror/NitWikit
Merge branch 'main' of https://github.com/postyizhan/Dumb_Service_Guide
This commit is contained in:
commit
acf7d6e1bf
11
docs/contribution/index.md
Normal file
11
docs/contribution/index.md
Normal file
@ -0,0 +1,11 @@
|
||||
---
|
||||
slug: /migration
|
||||
---
|
||||
|
||||
# 测试内容
|
||||
|
||||
[**Semantic Versioning**](https://semver.org/).
|
||||
|
||||
```bash npm2yarn
|
||||
npm install
|
||||
```
|
@ -15,23 +15,726 @@ sidebar_position: 3
|
||||
|
||||
适用于 Paper 版本 1.20 +
|
||||
|
||||
[在这里看!](https://github.com/YouHaveTrouble/minecraft-optimization)(200多配置项自己看吧)
|
||||
|
||||
# 更简单的
|
||||
|
||||
自动优化脚本,[下载](https://github.com/lilingfengdev/NitWiki-Script/releases/download/windows-latest/auto-optimize.exe),在服务器根目录执行,目前支持CraftBukkit,Spigot,Paper,PufferFish,Purpur,Gale,Leaf
|
||||
|
||||
|
||||
# 更详细的
|
||||
# 开始!!
|
||||
|
||||
[`SOG`]: https://www.spigotmc.org/threads/guide-server-optimization%E2%9A%A1.283181/
|
||||
[server.properties]: https://docs.papermc.io/paper/reference/server-properties
|
||||
[bukkit.yml]: https://docs.papermc.io/paper/reference/bukkit-configuration
|
||||
[spigot.yml]: https://docs.papermc.io/paper/reference/spigot-configuration
|
||||
[paper-global configuration]: https://docs.papermc.io/paper/reference/global-configuration
|
||||
[paper-world configuration]: https://docs.papermc.io/paper/reference/world-configuration
|
||||
[purpur.yml]: https://purpurmc.org/docs/Configuration/
|
||||
[pufferfish.yml]: https://docs.pufferfish.host/setup/pufferfish-fork-configuration/
|
||||
## 网络项
|
||||
|
||||
### [server.properties]
|
||||
|
||||
#### network-compression-threshold
|
||||
|
||||
在 `server.properties` 可以设置数据包压缩阈值:
|
||||
|
||||
```
|
||||
network-compression-threshold: 256
|
||||
```
|
||||
|
||||
当一个数据包的大小达到该值,服务器就会压缩它。设置得更高可以节省一些 CPU 资源,但会增加带宽占用,
|
||||
|
||||
将其设置为 -1 会禁用它。设置的太高有可能会影响到网速较慢的玩家。以下是不同情况下的推荐值:
|
||||
|
||||
| 推荐值 | 服务器情况 |
|
||||
|---------|------------------------|
|
||||
| 256 | 普通服务器 |
|
||||
| 0 - 127 | 带宽非常非常紧缺但CPU资源充裕 |
|
||||
| 128 | 带宽紧缺但 CPU 资源相对充裕 |
|
||||
| 512 + | 带宽宽裕但 CPU 资源相对紧缺 |
|
||||
| -1 | 在同一网络下使用反向代理(交给反向代理压缩) |
|
||||
|
||||
### [purpur.yml]
|
||||
|
||||
#### use-alternate-keepalive
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
此项可以启用 Purpur 的心跳检测,这样网络情况较差的玩家就不会经常超时。已知与 TCPShield 不兼容。
|
||||
|
||||
> 启用此功能后,每秒向玩家发送一次 keepalive 包,玩家在 30 秒内未响应才会超时。玩家以任何顺序响应都不会超时。
|
||||
~ https://purpurmc.org/docs/Configuration/#use-alternate-keepalive
|
||||
|
||||
---
|
||||
|
||||
## 区块生成项
|
||||
|
||||
### [server.properties]
|
||||
|
||||
#### simulation-distance 模拟距离
|
||||
|
||||
:::tip
|
||||
|
||||
在此之前,你必须了解的是模拟距离(Simulate distance)和视野距离(View distance)区别(下文用 SDT和 VDT 分别指代)。
|
||||
|
||||
模拟距离指的是玩家在这个范围内的游戏行为正常进行,如动物、怪物等 AI 的寻路,生物生成,草地扩散,水流流动等。
|
||||
|
||||
视野距离指的是服务器将发送给玩家的区块的数据包的距离,在这个范围内,游戏行为不一定会继续发生(这取决于 SDT)
|
||||
|
||||
当玩家移动导致一个区域不在玩家的 SDT 中而又在 VDT 中,那么服务器只会读取这个区域的方块信息并发送给玩家。
|
||||
|
||||
而不会对这个区域进行加载。这是各种游戏常见的处理方式,弱化远处的计算能够使得服务器更加流畅。
|
||||
|
||||
:::
|
||||
|
||||
您可以在末地设置更高的 `view-distance` ,这可以让鞘翅飞的更舒服而不会占用很多资源。
|
||||
|
||||
|
||||
另外,应该鼓励您的玩家安装 Bobby 或 Farsight 等 mod,可以在本地缓存区块,这不会对服务器性能造成任何影响!
|
||||
|
||||
##### 手动调整
|
||||
|
||||
在 `spigot.yml` 中可以设置服务器的模拟距离:
|
||||
|
||||
```yaml
|
||||
simulate-distance: 8
|
||||
```
|
||||
|
||||
如果你使用的默认 10 chunks 的模拟距离,这会非常影响性能,可以酌情减少,
|
||||
|
||||
```
|
||||
推荐值:3 - 8
|
||||
```
|
||||
|
||||
##### 自动调整
|
||||
|
||||
安装 [View Distance Tweaks](https://www.spigotmc.org/resources/view-distance-tweaks.75164/) 实现自动调整视野距离使得玩家增多时自动减少视野,玩家减少时自动增加视野。
|
||||
|
||||
#### view-distance 视距
|
||||
|
||||
`推荐值: 7`
|
||||
|
||||
此项为玩家能看到的距离(以区块为单位),类似于paper里的`no-tick-view-distance`。
|
||||
|
||||
实际总距离为`simulation-distance`和`view-distance`的最大值。 比如, 模拟距离是4 ,视距是12,那么玩家能看到的实际区块距离就是12。
|
||||
|
||||
### [spigot.yml]
|
||||
|
||||
#### view-distance
|
||||
|
||||
`推荐值: default`
|
||||
|
||||
如果不设置为`default`,此项将覆盖 server.properties。
|
||||
|
||||
### [paper-world configuration]
|
||||
|
||||
#### delay-chunk-unloads-by
|
||||
|
||||
区块的反复大量加载和卸载区块是很消耗性能的,而长期加载无效的区块也是浪费性能。
|
||||
|
||||
在 `paper-world-defaults.yml` 中可以调整玩家离开后多久开始卸载区块。
|
||||
|
||||
```yaml
|
||||
chunks:
|
||||
delay-chunk-unloads-by: 10s
|
||||
```
|
||||
|
||||
这有助于避免玩家来回移动时,服务器不断加载和卸载相同的区块。过高的值可能会导致一次加载太多区块。
|
||||
|
||||
在玩家频繁传送或加载的区域,可以考虑让该区域永久加载。这可以减轻服务器不小的负担。
|
||||
|
||||
| 推荐值 | 服务器类型 |
|
||||
|------|-------------------|
|
||||
| 5s | 开荒期、玩家会大范围跑图时 |
|
||||
| 10s | 普通服务器 |
|
||||
| >15s | 服务器玩法决定玩家不会大范围移动时 |
|
||||
|
||||
|
||||
#### max-auto-save-chunks-per-tick
|
||||
|
||||
在 `paper-world-defaults.yml` 中的参数,用于控制世界保存速度。
|
||||
|
||||
```
|
||||
max-auto-save-chunks-per-tick: 24
|
||||
```
|
||||
|
||||
这个值是每个 tick 最多可以保存的区块数量,通过降低世界区块保存速度可以提高平均性能。
|
||||
|
||||
如果一个 tick 加载区块超过本设定值,将在下一个 tick 继续保存剩余的待保存区块。
|
||||
|
||||
这个值应该与需要保存的区块及玩家人数相匹配,当人数更多有更多区块需要保存时应该适当增加。
|
||||
|
||||
保存区块的速度快意味着保存时负载高,但保存时间更短。如果遭遇断电、突然死机等情况时,
|
||||
|
||||
使用更高的保存速度是有利于降低丢失区块数据的可能性的。
|
||||
|
||||
| 推荐值 | 服务器人数 |
|
||||
|-----|------------|
|
||||
| 4 | 长期不到 10 人 |
|
||||
| 8 | 20 人左右(默认) |
|
||||
| 12 | 30 人左右 |
|
||||
| >24 | 长期大于 50 |
|
||||
|
||||
#### prevent-moving-into-unloaded-chunks
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
防止玩家进入未加载的区块,以避免同步加载区块造成的主线程卡顿。view-distance视距越小,玩家进入未加载区块的可能性就越大。
|
||||
|
||||
#### entity-per-chunk-save-limit
|
||||
|
||||
在保存区块时,服务器会一并保存区块对应位置的实体。
|
||||
|
||||
在 `paper-world-defaults.yml` 中的参数,用于控制世界保存时最大保存的某种实体数量。
|
||||
|
||||
推荐值:
|
||||
|
||||
```yaml
|
||||
chunks:
|
||||
entity-per-chunk-save-limit:
|
||||
area_effect_cloud: 8
|
||||
arrow: 16
|
||||
dragon_fireball: 3
|
||||
egg: 8
|
||||
ender_pearl: 8
|
||||
experience_bottle: 3
|
||||
experience_orb: 16
|
||||
eye_of_ender: 8
|
||||
fireball: 8
|
||||
firework_rocket: 8
|
||||
llama_spit: 3
|
||||
potion: 8
|
||||
shulker_bullet: 8
|
||||
small_fireball: 8
|
||||
snowball: 8
|
||||
spectral_arrow: 16
|
||||
trident: 16
|
||||
wither_skull: 4
|
||||
```
|
||||
|
||||
此项可以设置区块卸载后从内存保存到硬盘时每个区块最大的实体数量,可为每种实体规定一个限制,
|
||||
|
||||
以避免服务器尝试保存大量弹射物时崩溃,你还可以根据名称将其他实体添加到该列表中。
|
||||
|
||||
从而缓解某些玩家使用大量实体卡服。**并不适用于阻止玩家建造大型生物农场。**
|
||||
|
||||
### [pufferfish.yml]
|
||||
|
||||
#### max-loads-per-projectile
|
||||
|
||||
`推荐值: 8`
|
||||
|
||||
此项指定弹射物可以加载的最大区块数量。可减少弹射物造成的区块负载,但可能会导致末影珍珠等出现问题。
|
||||
|
||||
---
|
||||
|
||||
## 生物生成项
|
||||
|
||||
### [bukkit.yml]
|
||||
|
||||
在 `bukkit.yml` 和 `paper-world-default` 中都有一样的配置,但 paper 如果设置将覆盖 bukkit 的。
|
||||
|
||||
所以建议直接在 `paper-world-default` 中设置:
|
||||
|
||||
```yaml
|
||||
spawn-limits:
|
||||
monsters: 70
|
||||
#怪物包括 远古守卫者、末影人、监守者、蠹虫、猪灵蛮兵、流浪者、幻术师、骷髅、潜影贝、僵尸疣猪兽、守卫者、岩浆怪、僵尸村民、僵尸猪灵、卫道士、幻翼、猪灵、史莱姆、末影龙、溺尸、掠夺者、唤魔者、僵尸、蜘蛛、尸壳、恶魂、劫掠兽、疣猪兽、洞穴蜘蛛、女巫、枯萎、末影螨、凋灵骷髅、烈焰人、巨人、爬行者、恼鬼。
|
||||
animals: 10
|
||||
#动物包括 猪、北极熊、狐狸、猫、僵尸马、嗅探者、熊猫、兔子、狼、牛、海龟、青蛙、悦灵、行商羊驼、驴、蜜蜂、骆驼、绵羊、蝌蚪、豹猫、鸡、哞菇、马、羊驼、流浪商人、鹦鹉、山羊、骡、骷髅马刷、炽足兽.
|
||||
water-animals: 5
|
||||
# 包括鱿鱼和海豚
|
||||
water-ambient: 20
|
||||
# 包括鳕鱼、河豚、鲑鱼、热带鱼
|
||||
water-underground-creature: 5
|
||||
# 包括发光鱿鱼
|
||||
axolotls: 5
|
||||
# 美西螈
|
||||
ambient: 15
|
||||
# 只包括蝙蝠,建议0
|
||||
```
|
||||
|
||||
生物生成最大数量为 `玩家数量 * 生成限制`,该值越小,玩家能遇到的生物就越少,不同生物类型在每个玩家附近生成的概率是平均的。
|
||||
|
||||
这是一把双刃剑:较低的值会减轻服务器负担,但在大多数游戏模式中,自然生成的生物是游戏玩法的重要组成部分。
|
||||
|
||||
下表推荐了三种不同情况的推荐值,请结合服务器卡顿程度和玩法选择合适的值:
|
||||
|
||||
| 生物类型 | 推荐最小值 | 推荐值 | 推荐最大值 |
|
||||
|----------------------------|-------|-----|-------|
|
||||
| monster | 18 | 30 | 45 |
|
||||
| animal | 5 | 8 | 10 |
|
||||
| water-animals | 2 | 3 | 5 |
|
||||
| water-ambient | 2 | 3 | 5 |
|
||||
| water-underground-creature | 3 | 4 | 5 |
|
||||
| axolotls | 3 | 4 | 5 |
|
||||
| ambient | 0 | 1 | 1 |
|
||||
|
||||
#### ticks-per
|
||||
|
||||
在 `bukkit.yml` 中有关于生物生成频率的设置:
|
||||
|
||||
```yaml
|
||||
ticks-per:
|
||||
animal-spawns: 400
|
||||
monster-spawns: 1
|
||||
water-spawns: 1
|
||||
water-ambient-spawns: 1
|
||||
water-underground-creature-spawns: 1
|
||||
axolotl-spawns: 1
|
||||
ambient-spawns: 1
|
||||
```
|
||||
|
||||
这个参数控制了多少 tick 后服务器会进行一次生物的刷新,可以看到默认情况下是每个 tick 都刷新,即每秒 20 次。
|
||||
|
||||
这无疑是非常繁重的工作,但调整这个值到太高会导致即使服务器生物没有到达上限,生物刷新频率还是偏低。
|
||||
|
||||
```yaml
|
||||
推荐值:
|
||||
monster-spawns: 9
|
||||
animal-spawns: 399
|
||||
water-spawns: 199
|
||||
water-ambient-spawns: 399
|
||||
water-underground-creature-spawns: 399
|
||||
axolotl-spawns: 399
|
||||
ambient-spawns: 999
|
||||
```
|
||||
|
||||
:::tip
|
||||
|
||||
为什么选择 9 、199 之类的数字作为刷新频率而不是 10、200?
|
||||
|
||||
因为选择 10 和 200 时,每 200 tick 就会有多种类型的生物需要刷新,任务量集中在了某一刻度上,这会导致负载不平均。
|
||||
|
||||
使用 9、199 时,需要每 1791 tick 才会有多种类型生物需要被刷新,刷新任务被平均在了更多 tick 中。
|
||||
|
||||
:::
|
||||
|
||||
### [spigot.yml]
|
||||
|
||||
#### mob-spawn-range
|
||||
|
||||
`推荐值: 3`
|
||||
|
||||
```yaml
|
||||
mob-spawn-range: 8
|
||||
```
|
||||
|
||||
因为我们降低了总生物的刷新频率和数量,生物的总密度会明显下降,考虑到过远处的怪物对于游戏性影响非常小。
|
||||
|
||||
我们可以缩小生物刷新范围(以区块为单位,且不会大于[模拟距离](#手动调整))从而获得和原版接近的密度。
|
||||
|
||||
推荐值:
|
||||
|
||||
| `spawn-limit` 值 | 对应 `mob-spawn-range`推荐值 | 实际生物量 |
|
||||
|:---------------:|:-----------------------:|:---------:|
|
||||
| 70 (默认) | 8(默认) | 100% (默认) |
|
||||
| 56 | 6-7 | 90% |
|
||||
| 42 | 5-6 | 78% |
|
||||
| 28 | 4-5 | 65% |
|
||||
| 14 | 3-4 | 48% |
|
||||
|
||||
#### entity-activation-range
|
||||
|
||||
此项可以设置实体的激活AI距离(方块为单位)。降低这些值有助于提高性能,
|
||||
|
||||
但可能会导致怪物反应迟钝。将此值降低太多可能会破坏某些生物农场,比如刷铁机。
|
||||
|
||||
```yaml
|
||||
推荐值:
|
||||
entity-activation-range:
|
||||
animals: 16
|
||||
monsters: 24
|
||||
raiders: 48
|
||||
misc: 8
|
||||
water: 8
|
||||
villagers: 16
|
||||
flying-monsters: 48
|
||||
```
|
||||
|
||||
#### entity-tracking-range
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
players: 48
|
||||
animals: 48
|
||||
monsters: 48
|
||||
misc: 32
|
||||
other: 64
|
||||
```
|
||||
|
||||
此项可以设置实体的可见范围(方块为单位)。 距离外的实体将不会发送给客户端。 如果设置得太低,这可能会导致怪物突然出现在玩家附近。 此项应该大于`entity-activation-range`的值。
|
||||
|
||||
#### tick-inactive-villagers
|
||||
|
||||
```yaml
|
||||
tick-inactive-villagers: true
|
||||
```
|
||||
|
||||
非活跃的定义是村民在上述参数 `entity-activation-range` 中 `villagers` 所设定的范围外时。
|
||||
|
||||
禁用此功能将有助于提高性能,但在某些情况下会让远处的村民更蠢,此项还会降低刷铁机等的效率。
|
||||
|
||||
```
|
||||
推荐值:false
|
||||
```
|
||||
|
||||
#### nerf-spawner-mobs
|
||||
|
||||
```
|
||||
nerf-spawner-mobs: false
|
||||
```
|
||||
|
||||
打开此项可以卸载刷怪笼生成的生物的 AI,被卸载 AI 的生物将不会做任何事情。
|
||||
|
||||
```
|
||||
推荐值: true
|
||||
```
|
||||
|
||||
这一项打开时候会大幅影响刷怪塔及游戏体验,因此 paper 为此做了[更加人性化的选项](#spawner-nerfed-mobs-should-jump)。
|
||||
|
||||
##### spawner-nerfed-mobs-should-jump
|
||||
|
||||
```
|
||||
spawner-nerfed-mobs-should-jump: false
|
||||
```
|
||||
|
||||
这个参数控制了刷怪笼刷出的生物是否能给在水中跳跃,这修复了 `nerf-spawner-mobs` 导致的刷怪塔问题。
|
||||
|
||||
```
|
||||
推荐值: true
|
||||
```
|
||||
|
||||
#### despawn-ranges
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
ambient:
|
||||
hard: 72
|
||||
soft: 30
|
||||
axolotls:
|
||||
hard: 72
|
||||
soft: 30
|
||||
creature:
|
||||
hard: 72
|
||||
soft: 30
|
||||
misc:
|
||||
hard: 72
|
||||
soft: 30
|
||||
monster:
|
||||
hard: 72
|
||||
soft: 30
|
||||
underground_water_creature:
|
||||
hard: 72
|
||||
soft: 30
|
||||
water_ambient:
|
||||
hard: 72
|
||||
soft: 30
|
||||
water_creature:
|
||||
hard: 72
|
||||
soft: 30
|
||||
```
|
||||
|
||||
此项可以调整各种生物的消失范围(方块为单位)。降低这些值可以更快地清除远离玩家的生物。 您应该将 soft 软距离设置为约`30`,然后将 hard 硬性距离设置的稍微大于 simulation-distance,这样当玩家刚刚跑出区块时,生物不会立即消失(您可以一并调整 [paper-world configuration] 中的`delay-chunk-unloads-by`)。 当一个生物离开了 hard 距离,该生物会立刻消失。 当一个生物处于 soft 和 hard 距离之间,该生物将有概率消失。 您的 hard 距离应该大于 soft 距离。您应该根据模拟距离调整此项:`(simulation-distance * 16) + 8`。 此项还可能造成玩家经过后,区块不卸载的情况(因为生物还没消失)。
|
||||
|
||||
#### per-player-mob-spawns
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
该项决定生物生成是否应该考虑玩家周围已有的生物数量。此项可以解决一些生物生成不一致问题,如玩家建造的农场占满生物生成上限。这更像单人游戏的生物生成,允许您设置较低的`spawn-limits`。启用此项会对性能产生轻微影响,但它带来的好处大于其影响。
|
||||
|
||||
#### max-entity-collisions
|
||||
|
||||
`推荐值: 2`
|
||||
|
||||
覆盖 [spigot.yml] 中的同名项。它让您决定一个实体可以同时处理多少次碰撞。`0`将导致无法推动其他实体,包括玩家。`2`应该可以处理大部分情况。 值得注意的是,这将会破坏 maxEntityCramming gamerule 也就是生物堆叠窒息。
|
||||
|
||||
#### update-pathfinding-on-block-update
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
禁用此项将减少寻路次数,从而提高性能。在某些情况下,这会导致生物看起来更加迟钝;它们只会每 5 个 tick(0.25 秒)被动更新一次路径。
|
||||
|
||||
#### fix-climbing-bypassing-cramming-rule
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
是否修复实体在攀爬时不受实体挤压影响的问题。这将防止大量生物在攀爬时堆叠在狭小空间内(例如蜘蛛)。
|
||||
|
||||
#### armor-stands.tick
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
在大部分情况下,将该项设置为`false`是安全的。如果您使用盔甲架或任何相关的插件时遇到了问题,请重新启用它。这将防止盔甲架被水推动或受到重力的影响。
|
||||
|
||||
#### armor-stands.do-collision-entity-lookups
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
是否启用盔甲架碰撞。如果您有很多盔甲架,并且不想它们与任何东西发生碰撞,这将有所帮助。
|
||||
|
||||
#### tick-rates
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
behavior:
|
||||
villager:
|
||||
validatenearbypoi: 60
|
||||
acquirepoi: 120
|
||||
sensor:
|
||||
villager:
|
||||
secondarypoisensor: 80
|
||||
nearestbedsensor: 80
|
||||
villagerbabiessensor: 40
|
||||
playersensor: 40
|
||||
nearestlivingentitysensor: 40
|
||||
```
|
||||
|
||||
> 当 [Pufferfish或者Leaf DAB](#dabenabled) 启用时,不建议修改该项任何默认值。
|
||||
|
||||
这决定了触发AI行为和传感器的间隔。 `acquirepoi`是村民最频繁的行为, 因此它的间隔已经大大增加了。 如果村民有寻路问题,请减少此项。
|
||||
|
||||
### [pufferfish.yml]
|
||||
|
||||
#### dab.enabled
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
DAB(大脑动态激活)会随着实体与玩家距离的增大而减少实体运算次数。 DAB 采用梯度工作,而不是像`entity-activation-range`那样采用定值。 DAB 基于此结果 [dab.activation-dist-mod](#dabactivation-dist-mod)。
|
||||
|
||||
#### dab.max-tick-freq
|
||||
|
||||
`推荐值: 20`
|
||||
|
||||
无论 DAB 的结果如何,实体的 tick 都不会低于此值。如果将其设置为 20,则无论实体有多远,它每秒都会被计算至少一次。增加此值可能会提高远距离实体的性能,但可能会破坏农场或大大削弱生物行为。如果启用 DAB 会破坏刷怪塔,请尝试降低此值。
|
||||
|
||||
#### dab.activation-dist-mod
|
||||
|
||||
`推荐值: 8 或 7`
|
||||
|
||||
控制 DAB 的梯度。增加此值可使较远的实体更频繁地运算。减少此值可使较远的实体运算的更慢,从而提高 DAB 的性能,但会影响实体与周围环境的互动,并可能破坏刷怪塔。如果启用 DAB 会破坏刷怪塔,请尝试降低此值。
|
||||
|
||||
#### enable-async-mob-spawning
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
是否应启用异步怪物生成。要使此功能正常工作,必须启用 Paper 中的`per-player-mob-spawns`。此项实际上不会异步生成生物,但会将生成新生物所涉及的大量计算工作转移到不同的线程。对原版生存体验的影响很小。
|
||||
|
||||
#### enable-suffocation-optimization
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
此项将检查速率限制为伤害超时来优化窒息检查(检查生物是否在方块内以及它们是否应该受到窒息伤害)。除非您是生电玩家,能够使用精确计时窒息杀死实体的时间,否则这种优化应该是不可能注意到的。
|
||||
|
||||
#### inactive-goal-selector-throttle
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
在实体非活动时限制其目标选择器,让非活动实体每`20 tick`更新一次其目标选择器,而不是每 tick 更新一次。可以将性能提高几个百分点,而且对游戏体验的影响很小。
|
||||
|
||||
### [purpur.yml]
|
||||
|
||||
#### zombie.aggressive-towards-villager-when-lagging
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
当 TPS 低于`lagging-threshold`值 [purpur.yml] 时,启用此项会阻止僵尸追逐村民。
|
||||
|
||||
#### entities-can-use-portals
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
此项决定是否让除玩家之外的所有实体使用传送门。这可以防止实体在主线程上加载不必要的区块,但会破坏一些生电装置或地狱交通。
|
||||
|
||||
#### villager.lobotomize.enabled
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
> 仅当村民造成服务器卡顿时才应启用此项!否则,村民寻路会出现问题。
|
||||
|
||||
村民被卸载了AI后只会按时补货。启用此项会禁用村民自动寻路。
|
||||
|
||||
#### villager.search-radius
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
acquire-poi: 16
|
||||
nearest-bed-sensor: 16
|
||||
```
|
||||
|
||||
该项可以调整村民尝试搜索工作方块和床的半径。这大大提高了村民的性能,但会阻止他们探测到比设定值更远的工作方块或床。
|
||||
|
||||
---
|
||||
|
||||
## 杂项
|
||||
|
||||
### [spigot.yml]
|
||||
|
||||
#### merge-radius
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
item: 3.5
|
||||
exp: 4.0
|
||||
```
|
||||
|
||||
此项设置同类物品和经验球合并堆叠的距离,可减少地面未拾取物数量。 设置得太高会导致物品合并时像瞬间传送。也会使得物品穿过方块,可能破坏一些刷怪塔。 此项不会判断物品是否穿过墙壁 (除非开启 Paper 中的`fix-items-merging-through-walls)。经验球仅会在生成时合并。建议使用`alt-item-despawn-rate`来优化掉落物数量。
|
||||
|
||||
#### hopper-transfer
|
||||
|
||||
`推荐值: 8`
|
||||
|
||||
漏斗移动一个物品的频率(以 tick 为单位)。如果服务器上有大量漏斗,增加此值将有助于提高性能,但如果设置得太高,会破坏基于漏斗的红石计时器,甚至可能破坏物品分类装置。
|
||||
|
||||
#### hopper-check
|
||||
|
||||
`推荐值: 8`
|
||||
|
||||
漏斗检查上方的物品或容器的频率(以 tick 为单位)。如果服务器上有大量漏斗,增加此值将有助于提高性能,但如果设置得太高,会破坏基于漏斗的红石计时器,甚至可能破坏物品分类装置。
|
||||
|
||||
### [paper-world configuration]
|
||||
|
||||
#### alt-item-despawn-rate
|
||||
|
||||
```
|
||||
推荐值:
|
||||
|
||||
enabled: true
|
||||
items:
|
||||
cobblestone: 300
|
||||
netherrack: 300
|
||||
sand: 300
|
||||
red_sand: 300
|
||||
gravel: 300
|
||||
dirt: 300
|
||||
short_grass: 300
|
||||
pumpkin: 300
|
||||
melon_slice: 300
|
||||
kelp: 300
|
||||
bamboo: 300
|
||||
sugar_cane: 300
|
||||
twisting_vines: 300
|
||||
weeping_vines: 300
|
||||
oak_leaves: 300
|
||||
spruce_leaves: 300
|
||||
birch_leaves: 300
|
||||
jungle_leaves: 300
|
||||
acacia_leaves: 300
|
||||
dark_oak_leaves: 300
|
||||
mangrove_leaves: 300
|
||||
cactus: 300
|
||||
diorite: 300
|
||||
granite: 300
|
||||
andesite: 300
|
||||
scaffolding: 600
|
||||
```
|
||||
|
||||
此项可以设置指定物品消失的时间(tick 为单位)。 建议用此项替代扫地姬或`merge-radius`来提高性能。
|
||||
|
||||
#### redstone-implementation
|
||||
|
||||
`推荐值: ALTERNATE_CURRENT`
|
||||
|
||||
将红石系统替换为优化版本,减少冗余更新,降低服务器必须计算的逻辑量。可能会对个别的红石机器产生影响,但其提升利大于弊。甚至还可以修复 Bukkit 造成的红石同步问题。
|
||||
|
||||
`ALTERNATE_CURRENT`是基于 [Alternate Current](https://modrinth.com/mod/alternate-current)。 更多信息请阅读该页面。
|
||||
|
||||
#### hopper.disable-move-event
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
仅当有插件监听`InventoryMoveItemEvent`时才会触发该事件。 **如果您想使用侦听此事件的插件,请不要设置为 true,比如保护插件!**
|
||||
|
||||
#### hopper.ignore-occluding-blocks
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
确定漏斗是否会忽略完整方块内的容器,例如沙子或沙砾中的漏斗矿车。启用该项可能会破坏一些红石装置。
|
||||
|
||||
#### tick-rates.mob-spawner
|
||||
|
||||
`推荐值: 2`
|
||||
|
||||
此项调整刷怪笼的刷新频率。如果服务器有大量刷怪笼,则值越高意味着卡顿越少,但如果设置得太高,怪物刷怪率就会降低。
|
||||
|
||||
#### optimize-explosions
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
将此项设为`true`可以将原版爆炸算法替换成优化版本,但计算爆炸伤害时会略有不准确。 这通常不影响游戏体验。
|
||||
|
||||
#### treasure-maps.enabled
|
||||
|
||||
`推荐值: false`
|
||||
|
||||
生成藏宝图的性能占用极高,如果要定位的结构位于未生成的区块中,服务器甚至可能会未响应。只有在您预生成世界并设置原版世界边界的情况下,启用此功能才是安全的。
|
||||
|
||||
#### treasure-maps.find-already-discovered
|
||||
|
||||
```
|
||||
推荐值:
|
||||
loot-tables: true
|
||||
villager-trade: true
|
||||
```
|
||||
|
||||
此项的默认值强制新藏宝图寻找未探索过的结构,这些结构通常位于尚未生成的区块中。将其设置为 true 可使地图指向之前发现过的结构。如果不将其更改为 true,在生成新的藏宝图时可能会遇到服务器未响应或崩溃的情况。 `villager-trade`影响村民交易的地图,而`loot-tables`影响任何生成战利品的容器,如宝箱等。
|
||||
|
||||
#### tick-rates.grass-spread
|
||||
|
||||
`推荐值: 4`
|
||||
|
||||
服务器尝试扩散草方块或菌丝的频率(以 tick 为单位)。这会使大面积泥土需要更长的时间才能变成草或菌丝。如果您想在不明显降低扩散率的情况下优化性能,则将其设置为`4`左右应该不错。
|
||||
|
||||
#### tick-rates.container-update
|
||||
|
||||
`推荐值: 1`
|
||||
|
||||
容器更新频率(以 tick 为单位)。如果容器更新带来一些问题(这种情况很少发生),增加此间隔时间可能会有所帮助,但会让玩家在与库存(幽灵物品)交互时更容易遇到不同步的情况。
|
||||
|
||||
#### non-player-arrow-despawn-rate
|
||||
|
||||
`推荐值: 20`
|
||||
|
||||
怪物射出的箭消失的时间(以 tick 为单位)。因为玩家无法捡起这些箭,所以您不妨将其设置为`20`(1 秒)之类的值。
|
||||
|
||||
#### creative-arrow-despawn-rate
|
||||
|
||||
`推荐值: 20`
|
||||
|
||||
创造模式玩家射出的箭消失的时间(以 tick 为单位)。因为玩家无法捡起这些箭,所以您不妨将其设置为`20`(1 秒)之类的值。
|
||||
|
||||
### [pufferfish.yml]
|
||||
|
||||
#### disable-method-profiler
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
此选项将禁用游戏进行的一些其他性能分析。这些分析是非必需的,并且可能会导致额外的延迟。
|
||||
|
||||
### [purpur.yml]
|
||||
|
||||
#### dolphin.disable-treasure-searching
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
禁止海豚寻宝。
|
||||
|
||||
#### teleport-if-outside-border
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
如果玩家恰好在世界边界之外,该项会将其传送到世界出生点。这很有用,因为原版世界边界是可绕过的。
|
||||
|
||||
---
|
||||
|
||||
## 辅助项
|
||||
|
||||
### [paper-world configuration]
|
||||
|
||||
#### nether-ceiling-void-damage-height
|
||||
|
||||
`推荐值: 127`
|
||||
|
||||
如果此项大于`0`,地狱此高度之上的玩家就会像坠入虚空一样不断受到伤害。 防止玩家在地狱天花板之上建造建筑,原版地狱为128格高,所以您应该考虑将数值设定为`127`。 如果您以任何方式修改了下界的高度,您应该将其设置为`[地狱高度] - 1`。
|
||||
|
||||
---
|
||||
|
||||
:::warning
|
||||
|
||||
|
@ -1,133 +0,0 @@
|
||||
---
|
||||
title: 网络优化
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# 网络优化
|
||||
|
||||
网络优化主要目的是解决服务器上行带宽占用导致的玩家 **Ping**(即网络延迟)过高导致的糟糕游戏体验。
|
||||
|
||||
## 数据包压缩
|
||||
|
||||
在 `server.properties` 可以设置数据包压缩阈值:
|
||||
|
||||
```
|
||||
network-compression-threshold: 256
|
||||
```
|
||||
|
||||
当一个数据包的大小达到该值,服务器就会压缩它。设置得更高可以节省一些 CPU 资源,但会增加带宽占用,
|
||||
|
||||
将其设置为 -1 会禁用它。设置的太高有可能会影响到网速较慢的玩家。以下是不同情况下的推荐值:
|
||||
|
||||
| 推荐值 | 服务器情况 |
|
||||
| ------- | -------------------------------------------- |
|
||||
| 256 | 普通服务器 |
|
||||
| 0 - 127 | 带宽非常非常紧缺但CPU资源充裕 |
|
||||
| 128 | 带宽紧缺但 CPU 资源相对充裕 |
|
||||
| 512 + | 带宽宽裕但 CPU 资源相对紧缺 |
|
||||
| -1 | 在同一网络下使用反向代理(交给反向代理压缩) |
|
||||
|
||||
## 掉线优化
|
||||
|
||||
在 `purpur.yml` 可以启用 Purpur 的在线检测:
|
||||
|
||||
```
|
||||
use-alternate-keepalive: false
|
||||
```
|
||||
|
||||
`推荐值: true`
|
||||
|
||||
启用此功能后,每秒向玩家发送一次 keepalive 包,玩家在 30 秒内未响应才会超时。
|
||||
|
||||
玩家以任何顺序响应都不会超时。这样网络情况较差的玩家就不会经常超时。已知与 TCPShield 不兼容。
|
||||
|
||||
|
||||
## 降低服务器视野距离
|
||||
|
||||
:::warning
|
||||
|
||||
请注意视野距离和玩家体验相关性也较大,除非特殊情况否则不建议大幅压缩视野换取带宽占用。
|
||||
|
||||
:::
|
||||
|
||||
### 手动调整
|
||||
|
||||
在 `spigot.yml` 中可以设置服务器的视野距离:
|
||||
|
||||
```
|
||||
view-distance: 8
|
||||
#视野距离为 8 chunks
|
||||
```
|
||||
|
||||
`推荐值: 4 - 12`
|
||||
|
||||
如果你使用的默认 10 chunks 的视野距离,可能对于带宽来说有一定的压力,可以酌情减少,建议为 4 - 12。
|
||||
|
||||
如果不设置为 `default`,此项将覆盖 server.properties ,如果你不知道区分模拟距离和视野距离,请查看 [区分模拟和视野距离](performance-optimization.md/#降低服务器模拟距离即-simulate-distance)。
|
||||
|
||||
### 自动调整
|
||||
|
||||
安装 [View Distance Tweaks](https://www.spigotmc.org/resources/view-distance-tweaks.75164/) 实现自动调整视野距离使得玩家增多时自动减少视野,玩家减少时自动增加视野。
|
||||
|
||||
## 降低区块加载速度
|
||||
|
||||
在 `/config/paper-global.yml` 中有关于区块生成的一些参数
|
||||
|
||||
```yaml
|
||||
chunk-loading-basic:
|
||||
#注:以下的单位均为 chunks / seconds
|
||||
player-max-chunk-generate-rate: -1.0
|
||||
#为每个玩家生成分块的最大速率,设置为-1 则禁用。
|
||||
player-max-chunk-load-rate: 100
|
||||
#任何单个播放器加载块的最大速率,设置为-1 则禁用。
|
||||
player-max-chunk-send-rate: 75
|
||||
#服务器发送给单个玩家的最大速率。设置为-1 则禁用。
|
||||
```
|
||||
|
||||
其中 `player-max-chunk-send-rate` 对应服务器每秒钟最多向玩家发送多少区块包,设置得越低玩家收到完整的地图信息越慢,
|
||||
|
||||
服务器虽然总是会发送几乎同样多的区块信息,但由于发送速度降低,这会降低上行带宽的最大占用率,从而避免大量跑图导致的顿卡。
|
||||
|
||||
`推荐值: 40 - 60`
|
||||
|
||||
## 控制实体数量
|
||||
|
||||
Minecraft 服务端会将每个实体的行为实时发送给附近的玩家客户端,这个包通常来说占用是很少的,但是大量玩家处于实体密集型区域时将出现大量带宽占用。
|
||||
|
||||
这方面参数可以参考 [性能优化](performance-optimization.md/#控制实体数量)
|
||||
|
||||
## 更低的实体显示距离(不推荐)
|
||||
|
||||
降低实体显示距离可以让服务器少发送实体的刷新数据包,但是代价是玩家看不到远处的实体,即使在服务器上这些实体是存在的。
|
||||
|
||||
```yaml
|
||||
entity-tracking-range:
|
||||
players: 48
|
||||
animals: 48
|
||||
monsters: 48
|
||||
misc: 32
|
||||
other: 64
|
||||
```
|
||||
|
||||
## 选择更加合理的 AntiXray(反矿物透视)方式
|
||||
|
||||
:::warning
|
||||
|
||||
停止使用 [Orebfuscator](https://modrinth.com/plugin/orebfuscator) 等矿物混淆插件,使用 Paper 自带的矿物混淆。
|
||||
|
||||
使用 Paper 矿物混淆时候,尽量不要在非主世界开启 mode 2 或 mode 3
|
||||
|
||||
:::
|
||||
|
||||
参考文档内关于[反矿物透视](/docs/maintenance/anti-cheat/antixray.md)中标明能降低带宽占用的配置。
|
||||
|
||||
## 其他插件
|
||||
|
||||
常见的对带宽可能有一定占用的插件行为有:
|
||||
|
||||
* 某些 TAB / 计分板 / bossbar / actionbar 类插件时高频刷新
|
||||
* 某些写的特别烂的反作弊插件可能会每 tick 都向玩家发送数据包
|
||||
* 某些 **装饰类** 插件大量基于粒子效果或盔甲架的数据包发送
|
||||
* 欢迎补充
|
||||
|
||||
请适当使用使用以上类型的插件。使用时也尽量控制盔甲架、粒子效果等的量。
|
588
docs/process/plugin/other/Skript/AdvancedTutorials.md
Normal file
588
docs/process/plugin/other/Skript/AdvancedTutorials.md
Normal file
@ -0,0 +1,588 @@
|
||||
---
|
||||
title: 高级教程
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
<!-- @format -->
|
||||
|
||||
# 高级教程
|
||||
|
||||
## skript-reflect
|
||||
|
||||
**skript-reflect** 是 **Skript** 的一个拓展插件,允许你反射 java 类来进行更高级的操作,它旨在将 **Java** 的功能与 **Skript** 易于使用的开发环境相结合。
|
||||
|
||||
有了 **skript-reflect** 的 **Skript** 几乎可以完成插件能做的任何事,不过是复杂性的问题。
|
||||
|
||||
为什么需要 skript-reflect?
|
||||
|
||||
- 正确编写插件是很困难的,特别是如果你是 **Java** 的新手。 **skript-reflect** 将为您负重前行,让你专注于编写高质量的 **Skript** 脚本。
|
||||
|
||||
- 用 **skript-reflect** 编写的扩展可以快速测试,就像任何其他脚本一样。与需要编译和完全重新启动服务器的 **Skript** 插件不同, **skript-reflect** 脚本可以使用简单的 `sk reload`。
|
||||
|
||||
- 在 sk 脚本中实现某些功能可能需要使用反射来访问私有方法、字段和构造函数。 **skript-reflect** 的内置反射允许你无缝访问这些私人成员。
|
||||
|
||||
- **Skript** 的基本特性之一是其极大的可定制性。使用 **skript-reflect** 编写的扩展使 sk 的这点更为突出,这允许你在必要时快速更改您的代码。
|
||||
|
||||
|
||||
下面的代码块包含了一些 **skript-reflect** 基础的语法。
|
||||
|
||||
其作用是在有玩家使用 **EssentialsX** 的 tpa 尝试`/tpa lilingfeng`时阻止这件事
|
||||
|
||||
```sk
|
||||
import:
|
||||
net.ess3.api.events.TPARequestEvent # 导入java类
|
||||
|
||||
# 监听事件
|
||||
on TPARequestEvent:
|
||||
set {_ess_User} to event.getTarget() # 获取User对象
|
||||
set {_player} to {_ess_IUser}.getBase() # 获取Player对象
|
||||
# 判断玩家
|
||||
if {_player} is player("lilingfeng"):
|
||||
send "&clilingfeng是我的不准tpa到她那里🥵"
|
||||
cancel event # 取消事件
|
||||
```
|
||||
|
||||
下面来逐行解析
|
||||
|
||||
```sk
|
||||
import:
|
||||
net.ess3.api.events.TPARequestEvent
|
||||
```
|
||||
|
||||
这两行代码意为导入`net.ess3.api.events`包中的`TPARequestEvent`**类**。
|
||||
|
||||
`import:`块必须放在脚本的最左端,前面不能有缩进。
|
||||
|
||||
对类的调用必须在导入完成后进行,因此我们建议你尽可能将此语句放在脚本中靠顶端的位置。
|
||||
|
||||
通过`import:`块导入类后, **skript-reflect** 将创建一个 **Expressions** ,允许您通过其名称轻易地引用 Java 类。
|
||||
|
||||
```sk
|
||||
on TPARequestEvent:
|
||||
```
|
||||
|
||||
这行代码意为注册监听`TPARequestEvent`事件,与普通 sk 里注册事件的语法没啥区别。
|
||||
|
||||
```sk
|
||||
set {_ess_IUser} to event.getTarget() # 获取IUser对象
|
||||
set {_player} to {_ess_IUser}.getBase() # 获取Player对象
|
||||
```
|
||||
|
||||
这行代码意为调用这个事件里的`getTarget()`方法,来获取 tpa 的目标,其返回一个`IUser`。
|
||||
|
||||
这个`IUser`是 EssentialsX 的一个**接口**,`User`类**实现**了它,可以在[essentialsx 的 javadoc](https://jd-v2.essentialsx.net/net/ess3/api/iuser)里查看。
|
||||
|
||||
```sk
|
||||
if {_player} is player("lilingfeng"):
|
||||
send "&cliliangfeng是我的不准tpa到她那里🥵"
|
||||
cancel event
|
||||
```
|
||||
|
||||
这几行和普通的 sk 语法没什么区别,作用是判断然后取消事件。
|
||||
|
||||
### 使用方法
|
||||
|
||||
如果你需要调用其他的插件或是一些 **skript** 里没有而 [Bukkit API](https://bukkit.windit.net/javadoc/) 有的 API,那么会很棘手。
|
||||
|
||||
**skript-reflect** 很好的解决了这一点。
|
||||
|
||||
比如,你正在使用 **Leaves** 服务端,想要用sk来改变Leaves中假人在玩家列表中显示的名字,那么可以遵循以下步骤:
|
||||
|
||||
#### 查询 Javadoc
|
||||
|
||||
修改假人的名字这一行为应该在假人加入服务器时进行,所以我们得监听这一事件。
|
||||
|
||||
我们需要找到 bot 事件到底是哪个,查询[Leaves 的 Javadoc](https://repo.leavesmc.org/javadoc/snapshots/org/leavesmc/leaves/leaves-api/1.20.6-R0.1-SNAPSHOT):
|
||||
|
||||
![搜索事件](_images/SearchEvent.png)
|
||||
|
||||
这里查询找到了`org.leavesmc.leaves.event.bot.BotEvent`事件。
|
||||
|
||||
看命名就知道应该会有更详细的**子类**来**继承**它,点进去看看,可以看到:
|
||||
|
||||
![查找子类](_images/QuerySubclasses.png)
|
||||
|
||||
通过看类名可以知道,`BotJoinEvent`就是我们要的事件。
|
||||
|
||||
看介绍,发现这个事件会“Called when a fakeplayer joins a server”
|
||||
|
||||
接下来让我们看看这个类有哪些**方法**。
|
||||
|
||||
![查找方法](_images/SearchMethods.png)
|
||||
|
||||
可以看到,最主要的是一个`getBot()`方法,在让我们看看这个方法会返回什么。
|
||||
|
||||
点击超链接,可以看到这个方法会返回一个`Bot`对象。
|
||||
|
||||
这个`Bot`接口是继承自`Player`的,也就是说,`Player`有的方法,`Bot`都有。
|
||||
|
||||
再次查询 [Bukkit API](https://bukkit.windit.net/javadoc/org/bukkit/entity/Player.html) 可以找到`Player`类有的方法,如`Player#setPlayerListName()`,这正是我们需要的方法。
|
||||
|
||||
#### 编写程序
|
||||
|
||||
开始编写程序
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.leavesmc.leaves.event.bot.BotJoinEvent #导入类
|
||||
|
||||
# 监听事件
|
||||
on BotJoinEvent:
|
||||
set {_bot} to event.getBot() # 获取假人
|
||||
set {_bot_name} to {_bot}.getName() # 储存假人原本的名字
|
||||
{_bot}.setPlayerListName("假的%{_bot_name}%") # 修改假人在tab列表里的名字
|
||||
```
|
||||
|
||||
这一过程也可适用于其他插件,比如[zimzaza4大蛇](https://github.com/zimzaza4)的 [Skript-Floodgate-Api](https://github.com/zimzaza4/Skript-Floodgate-Api) ,
|
||||
就是利用 **skript-reflect** 来调用 [Floodagate API](https://wiki.geysermc.org/floodgate/api/) 的。
|
||||
|
||||
可以查看下面的教程来详细学习 **skript-reflect** 的基础功能(对,下面这一大坨只是基础)
|
||||
|
||||
### skript-reflect 基础教程
|
||||
|
||||
:::danger
|
||||
|
||||
此段部分或全部抄自 **skript-reflect** [官方文档](https://tpgamesnl.gitbook.io/skript-reflect/basics)
|
||||
|
||||
:::
|
||||
|
||||
#### 导入 Java 类
|
||||
|
||||
##### _在解析时导入类(推荐)_
|
||||
|
||||
在大多数情况下,无需运行脚本即可知道所需类的确切限定名称。如果是这种情况,您应该使用 **skript-reflect** 的`import`块:
|
||||
|
||||
:::info
|
||||
|
||||
为避免冲突,`import`块创建的表达式仅对导入它们的脚本可用。您必须在使用它们的每个脚本中导入 Java 类。
|
||||
|
||||
:::
|
||||
|
||||
```sk
|
||||
import:
|
||||
java.lang.System
|
||||
|
||||
command /example:
|
||||
trigger:
|
||||
message "%System%" # java.lang.System
|
||||
System.out.println("test")
|
||||
```
|
||||
|
||||
在大多数情况下,由`import`块创建的表达式不会相互冲突,也不会与其他 **Skript** 表达式冲突。如果类的简单名称与另一个表达式(如 `with Player and String` )冲突,则必须在别名下导入该类。
|
||||
|
||||
```sk
|
||||
import:
|
||||
java.lang.String as JavaString
|
||||
|
||||
command /example:
|
||||
trigger:
|
||||
message JavaString.format("Hello %%s", sender)
|
||||
```
|
||||
|
||||
:::info
|
||||
|
||||
别名必须是有效的 Java 标识符!
|
||||
|
||||
:::
|
||||
|
||||
###### 在低于 1.17 的 Minecraft 版本上导入 NMS 类
|
||||
|
||||
由于 **Minecraft** 1.17 以下版本的 **NMS** 包会随着每个 **Minecraft** 版本而变化,因此您应该动态生成包前缀。有关详细信息,请参阅[计算选项](https://tpgamesnl.gitbook.io/skript-reflect/advanced/computed-options#using-computed-options-for-nms-imports)。
|
||||
|
||||
|
||||
##### _在运行时导入类_
|
||||
|
||||
有时,在执行脚本之前,无法确定所需的类引用。
|
||||
|
||||
|
||||
###### 从完全限定的名称
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
[the] [java] class %text%
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
on script load:
|
||||
set {Player} to the class "org.bukkit.entity.Player"
|
||||
message "%{Player}%" # org.bukkit.entity.Player
|
||||
```
|
||||
|
||||
###### _从对象_
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
[the] [java] class[es] of %objects%
|
||||
%objects%'[s] [java] class[es]
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
command /example:
|
||||
executable by: players
|
||||
trigger:
|
||||
set {Player} to player's class
|
||||
message "%{Player}%" # org.bukkit.entity.Player
|
||||
```
|
||||
|
||||
###### 在effect命令中导入
|
||||
|
||||
由于导入块在 effect 命令中不可用,因此您可以使用 import effect(仅在 effect 命令中可用):
|
||||
|
||||
```sk
|
||||
import <fully qualified name> [as <alias>]
|
||||
```
|
||||
|
||||
此导入只能在以上效果命令中使用,直到您停止服务器。
|
||||
|
||||
##### _处理嵌套类_
|
||||
|
||||
有时,一个类可能嵌套在另一个类中。当引用类的完全限定名称时,嵌套类使用一个`$`而不是`.`
|
||||
|
||||
例如,将`org.bukkit.entity.EnderDragon.Phase`变成`org.bukkit.entity.EnderDragon$Phase`。
|
||||
|
||||
嵌套类通常比其周围的类具有更通用的名称,因此应在别名下导入这些名称:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.entity.EnderDragon$Phase as EnderDragonPhase
|
||||
```
|
||||
|
||||
导入这些类的另一种方法是只导入它们的封闭类:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.entity.EnderDragon
|
||||
|
||||
on load:
|
||||
set {phase} to EnderDragon.Phase.LEAVE_PORTAL
|
||||
```
|
||||
|
||||
#### 运行 Java 代码
|
||||
|
||||
##### _调用方法_
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
%object%.<method name>(%objects%)
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
event-block.breakNaturally()
|
||||
(last spawned creeper).setPowered(true)
|
||||
player.giveExpLevels({_levels})
|
||||
```
|
||||
|
||||
方法可以用作 **Effects** 、 **Expressions** 和 **Conditions** 。如果用作**Conditions**,则只要方法的返回值不是 `false` 、`null`或`0` ,这个 **Conditions** 就会通过。
|
||||
|
||||
###### 调用非公共方法
|
||||
|
||||
如果尝试调用的方法不是公共的,则可能需要在方法名称前面加上括号中的声明类。由于一个对象在多个超类中可能具有同名的非公共方法,因此必须显式指定在何处查找该方法。
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
{_arraylist}.[ArrayList]fastRemove(1)
|
||||
```
|
||||
|
||||
###### 调用重载的方法
|
||||
|
||||
通常, **skript-reflect** 可以从运行时传递的参数中推断出要调用的正确的重载方法。如果需要使用某个方法的某种实现,可以在方法名称的末尾附加一个逗号分隔的列表,并用括号括起来。
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
System.out.println[Object]({_something})
|
||||
|
||||
Math.max[int, int](0, {_value})
|
||||
```
|
||||
|
||||
##### _调用字段_
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
%object%.<descriptor>
|
||||
```
|
||||
|
||||
###### 调用非公共字段
|
||||
|
||||
如果您尝试访问的字段不是公共的,则可能需要在字段名称前面加上括号中的声明类。由于一个对象在多个超类中可能具有同名的非公共字段,因此必须显式指定查找该字段的位置。
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
{_hashmap}.[HashMap]modCount
|
||||
```
|
||||
|
||||
##### _调用构造函数_
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
[a] new %javatype%(%objects%)
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
new Location(player's world, 0, 0, 0)
|
||||
```
|
||||
|
||||
#### 处理事件
|
||||
|
||||
##### 监听事件
|
||||
|
||||
您可以通过引用导入的类来收听任何基于 Bukkit 的事件(包括其他插件添加的事件)。例如,如果要收听 `org.bukkit.event.entity.EnderDragonChangePhaseEvent`:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.event.entity.EnderDragonChangePhaseEvent
|
||||
|
||||
on EnderDragonChangePhaseEvent:
|
||||
# your code
|
||||
```
|
||||
|
||||
:::warn
|
||||
|
||||
一些插件使用自己的事件处理系统,或者不通过 **Bukkit** 的事件执行器传递他们的事件( **Skript** 的一些内部事件就是这种情况)。
|
||||
|
||||
为了侦听事件,它必须扩展`org.bukkit.event.Event`并由 **Bukkit** 的事件执行器执行。
|
||||
|
||||
:::
|
||||
|
||||
您还可以使用同一处理程序侦听多个事件。这些事件不必相关,但如果尝试访问在一个事件中可用但在另一个事件中不可用的方法,则应采取适当的预防措施。例如,如果要同时侦听`org.bukkit.event.entity.ProjectileLaunchEvent`和`org.bukkit.event.entity.ProjectileHitEvent`:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.event.entity.ProjectileLaunchEvent
|
||||
org.bukkit.event.entity.ProjectileHitEvent
|
||||
|
||||
on ProjectileLaunchEvent and ProjectileHitEvent:
|
||||
# your code
|
||||
```
|
||||
|
||||
##### 使用`event` **Expressions**
|
||||
|
||||
**skript-reflect** 公开一个叫做`event`的 **Expressions**,允许您使用反射访问事件值。
|
||||
|
||||
语法:
|
||||
|
||||
```sk
|
||||
[the] event
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.event.entity.EnderDragonChangePhaseEvent
|
||||
org.bukkit.entity.EnderDragon$Phase as EnderDragonPhase
|
||||
|
||||
on EnderDragonChangePhaseEvent:
|
||||
if event.getNewPhase() is EnderDragonPhase.CIRCLING:
|
||||
event.setNewPhase(EnderDragonPhase.CHARGE_PLAYER)
|
||||
```
|
||||
|
||||
:::info
|
||||
|
||||
该 event 表达式也可用于正常的 Skript 事件。
|
||||
|
||||
:::
|
||||
|
||||
##### 设置优先级
|
||||
|
||||
可以将事件的优先级设置为控制特定事件处理程序相对于其他事件处理程序的运行时间。
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.event.entity.EnderDragonChangePhaseEvent
|
||||
|
||||
on EnderDragonChangePhaseEvent with priority highest:
|
||||
# your code
|
||||
```
|
||||
|
||||
可以使用`org.bukkit.event.EventPriority`中定义的任何事件优先级。优先级较低的事件处理程序在优先级较高的事件处理程序之前运行。
|
||||
|
||||
事件优先级:
|
||||
```
|
||||
lowest
|
||||
low
|
||||
normal
|
||||
high
|
||||
highest
|
||||
monitor
|
||||
```
|
||||
|
||||
##### 处理已取消的事件
|
||||
|
||||
默认情况下,如果事件被优先级较低的处理程序取消,则不会调用事件处理程序。可以通过指定处理程序应处理`all`事件来更改此行为。
|
||||
|
||||
示例:
|
||||
|
||||
```sk
|
||||
import:
|
||||
org.bukkit.event.block.BlockBreakEvent
|
||||
|
||||
on all BlockBreakEvent:
|
||||
uncancel event
|
||||
```
|
||||
|
||||
#### 一些 **skript-reflect** 内置的小工具
|
||||
|
||||
##### Collect
|
||||
|
||||
```sk
|
||||
[%objects%]
|
||||
[%objects% as %javatype%]
|
||||
```
|
||||
|
||||
创建包含指定对象的数组。指定类型可确定生成数组的组件类型。
|
||||
|
||||
:::info
|
||||
|
||||
此语法中的括号是文字,不表示可选组。
|
||||
|
||||
:::
|
||||
|
||||
##### Spread
|
||||
|
||||
```sk
|
||||
...%object%
|
||||
```
|
||||
|
||||
返回单个数组、可迭代数组、迭代器或流的内容。
|
||||
|
||||
##### 创建数组
|
||||
|
||||
```sk
|
||||
new %javatype%[%integer%]
|
||||
```
|
||||
|
||||
创建给定类型和大小的数组。类型可能是原始类型,不需要导入。
|
||||
|
||||
:::info
|
||||
|
||||
此语法中的括号是文字,不表示可选组。
|
||||
|
||||
:::
|
||||
|
||||
##### 通过索引获取数组的值
|
||||
|
||||
```sk
|
||||
%array%[%integer%]
|
||||
```
|
||||
|
||||
表示数组的某个索引处的值。
|
||||
|
||||
可以读取和写入此值。
|
||||
|
||||
:::info
|
||||
|
||||
此语法中的括号是文字,不表示可选组。
|
||||
|
||||
:::
|
||||
|
||||
##### Null
|
||||
|
||||
```sk
|
||||
null
|
||||
```
|
||||
|
||||
在 **Java** 中表示 `null` 。这与 **Skript** 的`<none`>不同 .
|
||||
|
||||
##### Bits
|
||||
|
||||
```sk
|
||||
[the] (bit %number%|bit(s| range) [from] %number%( to |[ ]-[ ])%number%) of %numbers%
|
||||
%numbers%'[s] (bit %number%|1¦bit(s| range) [from] %number%( to |[ ]-[ ])%number%)
|
||||
```
|
||||
|
||||
表示数字中的位的子集。
|
||||
|
||||
可以读取和写入此值。
|
||||
|
||||
##### Raw Expression
|
||||
|
||||
```sk
|
||||
[the] raw %objects%
|
||||
```
|
||||
|
||||
返回表达式的基础对象。
|
||||
|
||||
:::info
|
||||
|
||||
与 [Expression](https://tpgamesnl.gitbook.io/skript-reflect/advanced/custom-syntax#expression) 一起使用时,可以将其设置为一个值,这将更改该参数的输入值。这可用于将数据存储在调用触发器的变量中。
|
||||
|
||||
```sk
|
||||
import:
|
||||
ch.njol.skript.lang.Variable
|
||||
|
||||
effect put %objects% in %objects%:
|
||||
parse:
|
||||
expr-2 is an instance of Variable # to check if the second argument is a variable
|
||||
continue
|
||||
trigger:
|
||||
set raw expr-2 to expr-1
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
##### 成员
|
||||
|
||||
```sk
|
||||
[the] (fields|methods|constructors) of %objects%
|
||||
%objects%'[s] (fields|methods|constructors)
|
||||
```
|
||||
|
||||
返回对象的字段、方法或构造函数的列表,包括其修饰符和参数。
|
||||
|
||||
如果需要不带修饰符或参数详细信息的字段或方法名称列表,请参阅[成员名称](https://tpgamesnl.gitbook.io/skript-reflect/basics/utilities#member-names)。
|
||||
|
||||
|
||||
##### 成员的名字
|
||||
|
||||
```sk
|
||||
[the] (field|method) names of %objects%
|
||||
%objects%'[s] (field|method) names
|
||||
```
|
||||
|
||||
返回对象的字段或方法的列表。
|
||||
|
||||
##### 是示例吗?
|
||||
|
||||
```sk
|
||||
%objects% (is|are) [a[n]] instance[s] of %javatypes%
|
||||
%objects% (is not|isn't|are not|aren't) [a[n]] instance[s] of %javatypes%
|
||||
```
|
||||
|
||||
检查对象是否是给定 **Java** 类型的实例。
|
||||
|
||||
##### 类引用
|
||||
|
||||
```sk
|
||||
%javatype%.class
|
||||
```
|
||||
|
||||
从给定的 **Java** 类型返回对类的引用。返回`java.lang.Class`类型的对象。此表达式还支持不需要导入的基元类型。
|
||||
|
||||
##### 插件实例
|
||||
|
||||
```sk
|
||||
[(an|the)] instance of [the] plugin %javatype/string%
|
||||
```
|
||||
|
||||
返回给定插件的实例(字符串形式的名称或插件类)。
|
||||
|
||||
|
||||
更高级的用法及详细内容请自行查阅[skript-reflect文档](https://tpgamesnl.gitbook.io/skript-reflect)
|
@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 基础教程
|
||||
sidebar_position: 3
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# 基础教程
|
||||
|
@ -57,7 +57,7 @@ on join:
|
||||
|
||||
### 拓展插件多
|
||||
|
||||
使用 Skript 时如果遇到 Skript 不包含的语法,可以使用其他拓展插件如 Skbee、Skript-reflect 等插件拓展。
|
||||
使用 Skript 时如果遇到 Skript 不包含的语法,可以使用其他拓展插件如 [Skbee](https://github.com/ShaneBeee/SkBee)、[Skript-reflect](https://github.com/SkriptLang/skript-reflect) 等插件拓展。
|
||||
|
||||
### 性能较低
|
||||
|
||||
@ -83,4 +83,4 @@ on join:
|
||||
|
||||
## 进阶教程
|
||||
|
||||
TODO
|
||||
见[“高级教程”](AdvancedTutorials.md)。
|
||||
|
BIN
docs/process/plugin/other/Skript/_images/QuerySubclasses.png
Normal file
BIN
docs/process/plugin/other/Skript/_images/QuerySubclasses.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
docs/process/plugin/other/Skript/_images/SearchEvent.png
Normal file
BIN
docs/process/plugin/other/Skript/_images/SearchEvent.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
BIN
docs/process/plugin/other/Skript/_images/SearchMethods.png
Normal file
BIN
docs/process/plugin/other/Skript/_images/SearchMethods.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 65 KiB |
Loading…
Reference in New Issue
Block a user