Skip to content

chore(sync): merge upstream - #12

Open
Chloemlla wants to merge 8 commits into
Chloemlla:version/7.0.xfrom
EngineHub:version/7.0.x
Open

Chloemlla wants to merge 8 commits into
Chloemlla:version/7.0.xfrom
EngineHub:version/7.0.x

Conversation

@Chloemlla

@Chloemlla Chloemlla commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner

Automated upstream sync by fork-sync.

  • Parent: EngineHub version/7.0.x
  • Base: Chloemlla/WorldGuard version/7.0.x

If this PR has conflicts, please resolve manually. Clean PRs are auto-merged.

Summary by CodeRabbit

  • 版本更新
    • 更新至 7.0.22-SNAPSHOT。
  • 错误修复
    • 修正跨世界方块交互处理,避免处理不属于当前区域的方块。
    • 改进方块放置时的替换判断,并清理会话重置后的状态。
    • 增强 Folia 支持检测的警告信息。
  • 文档
    • 补充 7.0.21 版本记录,涵盖垫子放置保护、草床标记、苦力怕追踪、缓存回收及相关问题修复;同时更新命令反馈说明。

@monkeyscan

monkeyscan Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

PR Title: chore(sync): merge upstream

Commit: 488d94d

整体评估

本次变更为上游同步,主体是适配新版 WorldEdit/Paper API 的机械迁移(getId() 改为 id()、YAMLProcessor 改用 Path、Guava 缓存过期改用 Duration),并附带少量行为调整:bypass 缓存键改为世界名加玩家 UUID 以避免强引用世界对象、Folia 检测更细化、跨区域方块访问保护、放置方块时对被替换方块的保护检查修正,以及会话反初始化时清理缓存状态。整体改动方向一致,属于低风险维护性同步。

总结

未发现需要修复的高置信度问题,可以合并。唯一需要留意的是 bypass 缓存与会话生命周期相关改动处于并发敏感路径,建议发布前在常规服务器与 Folia 环境各做一次冒烟测试。

@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 802a32dc-fa79-40af-820a-6ddbeb4ab650

No actionable comments were generated in the recent review.

Walkthrough

此变更更新项目版本记录和构建版本,并调整 Bukkit 的 Folia 检测及方块事件处理。多个配置、类型标识和缓存期限调用改用新的 API。会话缓存键和会话状态清理逻辑也有调整。

Changes: 版本更新与核心调整

Layer / File(s) Summary
版本记录与构建版本
CHANGELOG.md, gradle.properties
新增 7.0.21 更新记录,并将构建版本更新为 7.0.22-SNAPSHOT。
配置、类型标识与缓存期限 API
worldguard-bukkit/.../BukkitWorldConfiguration.java, worldguard-bukkit/.../listener/WorldGuardBlockListener.java, worldguard-bukkit/.../listener/WorldGuardWeatherListener.java, worldguard-bukkit/.../listener/debounce/*, worldguard-core/.../Blacklist.java, worldguard-core/.../blacklist/target/*, worldguard-core/.../WorldConfiguration.java, worldguard-core/.../YamlConfigurationManager.java, worldguard-core/.../YamlRegionFile.java
配置处理器改用 Path,类型标识改用 id API,缓存期限改用 Duration。缓存期限和方块匹配条件保持不变。
Folia 与方块事件处理
worldguard-bukkit/.../WorldGuardPlugin.java, worldguard-bukkit/.../cause/Cause.java, worldguard-bukkit/.../listener/EventAbstractionListener.java
Folia 检测细化异常处理。Folia 环境下,getFirstBlock() 仅接受当前区域拥有的方块。方块放置时的破坏事件触发条件改为比较被替换方块与放置方块的类型。
会话缓存与玩家位置处理
worldguard-core/.../session/AbstractSessionManager.java, worldguard-core/.../session/Session.java, worldguard-core/.../session/WorldPlayerTuple.java, worldguard-core/.../util/report/ApplicableRegionsReport.java
会话缓存改用玩家 UUID 作为键。会话反初始化时清空两个状态字段。WorldPlayerTuple 标记为待移除,区域报告改用玩家方块位置。

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Other

Suggested reviewers: me4502

Merge Risk: Minimal · previous review 488d9

Cached player sessions are reset before movement resumes after rejoining; no actionable merge-blocking issue remains.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 41.18% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed

Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed 标题“chore(sync): merge upstream”准确说明了本次变更是上游代码同步,且简洁明确。
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 41.18% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 17 functions across 19 files. (2 skipped: 2 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches

Generate unit tests (beta)

  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Tip

🎯 Customize your risk assessments

Guide how CodeRabbit assesses merge risk and security architecture risk. Highlight sensitive changes and explain your security boundaries using Merge Risk Instructions and Security Risk Instructions in your review settings. Security architecture risk assessments require the Advanced plan or above.

✅ Automatic approvals, with your rules

Let CodeRabbit approve pull requests once required threads are resolved, pre-merge checks pass, and your risk limits are met. Enable Automatic approvals in review settings, with overrides for teams or file paths.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Recent review info

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: aca22b3f-afba-4c6f-8bc8-48553104f027
Commits

Reviewing files that changed from the base of the PR and between 0e3e5c0 and 488d94d.

Files selected for processing: 21

  • CHANGELOG.md
  • gradle.properties
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldConfiguration.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardBlockListener.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardWeatherListener.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/debounce/EventDebounce.java
  • worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/debounce/legacy/AbstractEventDebounce.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/Blacklist.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/BlockMatcher.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/ItemBlockMatcher.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/ItemMatcher.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/config/WorldConfiguration.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/config/YamlConfigurationManager.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/protection/managers/storage/file/YamlRegionFile.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/session/Session.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/session/WorldPlayerTuple.java
  • worldguard-core/src/main/java/com/sk89q/worldguard/util/report/ApplicableRegionsReport.java

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Recent review details

Additional context used

ast-grep (0.51.1)

worldguard-core/src/main/java/com/sk89q/worldguard/config/YamlConfigurationManager.java

[warning] 47-47: Prevent path traversal
Context: new File(getDataFolder(), "config.yml")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'). Security best practice.

(path-traversal-java)

Additional comments: 17

CHANGELOG.md: 1

3-10: LGTM!

Also applies to: 18-19

gradle.properties: 1

2-2: LGTM!

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldConfiguration.java: 1

94-94: LGTM!

Also applies to: 301-301

worldguard-core/src/main/java/com/sk89q/worldguard/config/YamlConfigurationManager.java: 1

47-47: LGTM!

worldguard-core/src/main/java/com/sk89q/worldguard/protection/managers/storage/file/YamlRegionFile.java: 1

336-336: LGTM!

worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/BlockMatcher.java: 1

34-34: LGTM!

worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/ItemBlockMatcher.java: 1

34-34: LGTM!

worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/target/ItemMatcher.java: 1

34-34: LGTM!

worldguard-core/src/main/java/com/sk89q/worldguard/config/WorldConfiguration.java: 1

215-215: LGTM!

Also applies to: 221-221, 245-245, 251-251

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardBlockListener.java: 1

157-157: LGTM!

Also applies to: 166-166, 236-240, 306-306, 514-514

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardWeatherListener.java: 1

85-85: LGTM!

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/debounce/EventDebounce.java: 1

30-30: LGTM!

Also applies to: 39-39

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/debounce/legacy/AbstractEventDebounce.java: 1

30-30: LGTM!

Also applies to: 39-39

worldguard-core/src/main/java/com/sk89q/worldguard/blacklist/Blacklist.java: 1

40-40: LGTM!

Also applies to: 56-56

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java: 1

563-567: LGTM!

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java: 1

182-183: LGTM!

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java: 1

249-249: LGTM!

@monkeyscan

monkeyscan Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

PR Title: chore(sync): merge upstream

Commit: 494f500

整体评估

上一轮已完成上游同步的机械迁移,未发现阻断性问题。本轮增量以发布流程提交为主,另有一处针对会话管理器缓存(Issue EngineHub#2330)的并发适配改动,延续了上一轮对会话生命周期路径的关注,但该改动落在并发敏感区域。

总结

整体仍属维护性修补,但会话缓存的创建逻辑由原子的 computeIfAbsent 改为 getIfPresent 加 put,存在重复创建 Session 的并发竞态,可能造成会话状态分裂,建议改为原子的 Cache 加载方式(如 Cache.get)后再合并。

Findings (1)

  • 🟠 [HIGH] worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java:184 — get() 的会话创建改为非原子的 getIfPresent 加 put,可能重复创建 Session
Prompt To Fix All With AI
This is a comment left during a code review.
Repository: https://github.com/Chloemlla/WorldGuard
Path: worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java
Line: 180-184

Comment:
get() 的会话创建改为非原子的 getIfPresent 加 put,可能重复创建 Session

AbstractSessionManager.get() 将原本原子的 sessions.asMap().computeIfAbsent 换成了 getIfPresent 加 put;同一玩家的两个线程同时进入时都可能读到 null 并各自创建 Session,后写入者覆盖前者。返回给其中一个调用方的 Session 随即脱离缓存,导致两套 Handler 状态(如 bypass 开关、进出区域与无敌状态)分裂,并可能重复执行初始化,应改用仍保持原子性的 sessions.get(uuid, () -> new Session(this)) 之类方式。
---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

if (session == null) {
session = new Session(this);
sessions.put(player.getUniqueId(), session);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 get() 的会话创建改为非原子的 getIfPresent 加 put,可能重复创建 Session

Category: 功能正确性

AbstractSessionManager.get() 将原本原子的 sessions.asMap().computeIfAbsent 换成了 getIfPresent 加 put;同一玩家的两个线程同时进入时都可能读到 null 并各自创建 Session,后写入者覆盖前者。返回给其中一个调用方的 Session 随即脱离缓存,导致两套 Handler 状态(如 bypass 开关、进出区域与无敌状态)分裂,并可能重复执行初始化,应改用仍保持原子性的 sessions.get(uuid, () -> new Session(this)) 之类方式。

Problem code:

Session session = sessions.getIfPresent(player.getUniqueId());
if (session == null) {
session = new Session(this);
sessions.put(player.getUniqueId(), session);
}

Recommendation:
使用 Cache.get(key, Callable) 或 putIfAbsent 等原子加载方式创建 Session,避免 check-then-act 竞态。

Prompt To Fix All With AI
This is a comment left during a code review.
Repository: https://github.com/Chloemlla/WorldGuard
Path: worldguard-core/src/main/java/com/sk89q/worldguard/session/AbstractSessionManager.java
Line: 180-184

Comment:
get() 的会话创建改为非原子的 getIfPresent 加 put,可能重复创建 Session

AbstractSessionManager.get() 将原本原子的 sessions.asMap().computeIfAbsent 换成了 getIfPresent 加 put;同一玩家的两个线程同时进入时都可能读到 null 并各自创建 Session,后写入者覆盖前者。返回给其中一个调用方的 Session 随即脱离缓存,导致两套 Handler 状态(如 bypass 开关、进出区域与无敌状态)分裂,并可能重复执行初始化,应改用仍保持原子性的 sessions.get(uuid, () -> new Session(this)) 之类方式。
---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix with MonkeyCode
Fix with Claude
Fix with Codex

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants