v1.1.9: 修复区域扩地接壤判断误把其他邦国领土计入,导致选中与己方不相邻的目标
这个提交包含在:
@@ -227,14 +227,17 @@ public final class ExpansionPlanner {
|
||||
ChunkPos start = this.chooseStart(borderChunks, minX, maxX, minZ, maxZ);
|
||||
// 生成 S 形扫描路径(覆盖矩形内所有区块,含已占领的)
|
||||
List<ChunkPos> sPath = this.buildSPath(start, minX, maxX, minZ, maxZ);
|
||||
// 已占领集合:己方领土 + 所有已占领 + 本次规划已纳入的区块
|
||||
// 己方领土集合(含本次规划已纳入的区块)。
|
||||
// 注意:这里绝不能把其他邦国的领土(allClaimed)混入接壤判断集合,
|
||||
// 否则会选中一个“挨着其他邦国、但与己方领土不相邻”的区块,
|
||||
// 服务器会因不接壤而拒绝开拓,导致玩家反复走到无效目标(历史 bug)。
|
||||
HashSet<ChunkPos> claimed = new HashSet<ChunkPos>(actualOwn);
|
||||
claimed.addAll(allClaimed);
|
||||
ArrayList<ChunkPos> result = new ArrayList<ChunkPos>();
|
||||
for (ChunkPos chunk : sPath) {
|
||||
if (result.size() >= limit) break;
|
||||
if (claimed.contains(chunk)) continue;
|
||||
// 必须与已占领领土接壤,保证能够开拓
|
||||
// 已被任何邦国(含己方)占领,或本次规划已纳入:跳过,避免重复/跨邦国开拓
|
||||
if (allClaimed.contains(chunk) || claimed.contains(chunk)) continue;
|
||||
// 必须与“己方”领土接壤(含本次已纳入的区块),保证服务器能成功开拓
|
||||
if (this.ownNeighbors(chunk, claimed) == 0) continue;
|
||||
result.add(chunk);
|
||||
claimed.add(chunk);
|
||||
@@ -478,7 +481,13 @@ public final class ExpansionPlanner {
|
||||
return Math.max(dx, dz = Math.abs(chunk.z() - config.regionCenterZ)) <= Math.max(1, config.regionRadius);
|
||||
}
|
||||
|
||||
/** 统计某区块周围(上下左右)属于给定集合的邻居数量 */
|
||||
/**
|
||||
* 统计某区块周围(上下左右四个正方向)属于给定集合的邻居数量。
|
||||
*
|
||||
* <p>调用方必须传入“己方领土”集合(含本次规划已纳入的区块)作为 {@code own},
|
||||
* 用于判断区块是否与己方领土接壤。绝不能把其他邦国的领土混入该集合,
|
||||
* 否则会误判“与他国接壤”为“可开拓”,选中一个与己方领土不相邻的无效目标。</p>
|
||||
*/
|
||||
private int ownNeighbors(ChunkPos chunk, Set<ChunkPos> own) {
|
||||
int count = 0;
|
||||
for (ChunkPos neighbor : this.cardinalNeighbors(chunk)) {
|
||||
|
||||
在新工单中引用
屏蔽一个用户