v1.1.9: 修复区域扩地接壤判断误把其他邦国领土计入,导致选中与己方不相邻的目标
这个提交包含在:
@@ -6,17 +6,18 @@
|
|||||||
|
|
||||||
- 从远程 `markers.json` 拉取各国领土边界
|
- 从远程 `markers.json` 拉取各国领土边界
|
||||||
- 四种扩地策略:方形外扩、区域扩地、玩家周围、绕国一圈
|
- 四种扩地策略:方形外扩、区域扩地、玩家周围、绕国一圈
|
||||||
- 区域扩地采用 S 形扫描:从与现有领土接壤的区块开始,横向/纵向 S 形扫过整个矩形,不沿邦国边界,但保证每个新占领区块都与已占领领土接壤
|
- 区域扩地采用 S 形扫描:从与己方领土接壤的区块开始,横向/纵向 S 形扫过整个矩形,不沿邦国边界,但保证每个新占领区块都与**己方领土**接壤(仅四个正方向,不把其他邦国领土计入接壤)
|
||||||
- 自动寻路(Baritone)前往目标区块,寻路优先走地面减少走入矿洞,超时自动 `/u return` 回城自救
|
- 自动寻路(Baritone)前往目标区块,寻路优先走地面减少走入矿洞,超时自动 `/u return` 回城自救
|
||||||
- 目标有效性校验:寻路/等待/重试前实时校验目标是否仍与己方领土接壤,不接壤立即跳过并重新规划
|
- 目标有效性校验:寻路/等待/重试前实时校验目标是否仍未被他人占领,已被占领则跳过并重新规划
|
||||||
- 自动进食(饥饿时自动吃背包食物)
|
- 自动进食(饥饿时自动吃背包食物)
|
||||||
- 实时地图 GUI(通过 Ctrl+R 打开)
|
- 实时地图 GUI(通过 Ctrl+R 打开)
|
||||||
- 监听聊天/字幕消息判断开垦结果
|
- 监听聊天/字幕消息判断开垦结果
|
||||||
|
- 刷新地图时与最新 `markers.json` 核对已占领区块,丢弃地图未确认的超期假占领,避免高地扩地残留空洞
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
1. 安装 Fabric Loader 0.16.14+ 和 Fabric API
|
1. 安装 Fabric Loader 0.16.14+ 和 Fabric API
|
||||||
2. 将 `autostore-1.1.8.jar` 放入 `.minecraft/mods/` 目录
|
2. 将 `autostore-1.1.9.jar` 放入 `.minecraft/mods/` 目录
|
||||||
3. 启动游戏,按 `Ctrl+R` 打开 GUI
|
3. 启动游戏,按 `Ctrl+R` 打开 GUI
|
||||||
|
|
||||||
## 构建
|
## 构建
|
||||||
@@ -26,4 +27,4 @@
|
|||||||
./build_mod.sh
|
./build_mod.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
输出文件:`autostore-1.1.7.jar`
|
输出文件:`autostore-1.1.9.jar`
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ yarn_mappings=1.21.4+build.8
|
|||||||
loader_version=0.19.3
|
loader_version=0.19.3
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version=1.1.8
|
mod_version=1.1.9
|
||||||
maven_group=autostore
|
maven_group=autostore
|
||||||
archives_base_name=autostore
|
archives_base_name=autostore
|
||||||
|
|
||||||
|
|||||||
@@ -227,14 +227,17 @@ public final class ExpansionPlanner {
|
|||||||
ChunkPos start = this.chooseStart(borderChunks, minX, maxX, minZ, maxZ);
|
ChunkPos start = this.chooseStart(borderChunks, minX, maxX, minZ, maxZ);
|
||||||
// 生成 S 形扫描路径(覆盖矩形内所有区块,含已占领的)
|
// 生成 S 形扫描路径(覆盖矩形内所有区块,含已占领的)
|
||||||
List<ChunkPos> sPath = this.buildSPath(start, minX, maxX, minZ, maxZ);
|
List<ChunkPos> sPath = this.buildSPath(start, minX, maxX, minZ, maxZ);
|
||||||
// 已占领集合:己方领土 + 所有已占领 + 本次规划已纳入的区块
|
// 己方领土集合(含本次规划已纳入的区块)。
|
||||||
|
// 注意:这里绝不能把其他邦国的领土(allClaimed)混入接壤判断集合,
|
||||||
|
// 否则会选中一个“挨着其他邦国、但与己方领土不相邻”的区块,
|
||||||
|
// 服务器会因不接壤而拒绝开拓,导致玩家反复走到无效目标(历史 bug)。
|
||||||
HashSet<ChunkPos> claimed = new HashSet<ChunkPos>(actualOwn);
|
HashSet<ChunkPos> claimed = new HashSet<ChunkPos>(actualOwn);
|
||||||
claimed.addAll(allClaimed);
|
|
||||||
ArrayList<ChunkPos> result = new ArrayList<ChunkPos>();
|
ArrayList<ChunkPos> result = new ArrayList<ChunkPos>();
|
||||||
for (ChunkPos chunk : sPath) {
|
for (ChunkPos chunk : sPath) {
|
||||||
if (result.size() >= limit) break;
|
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;
|
if (this.ownNeighbors(chunk, claimed) == 0) continue;
|
||||||
result.add(chunk);
|
result.add(chunk);
|
||||||
claimed.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);
|
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) {
|
private int ownNeighbors(ChunkPos chunk, Set<ChunkPos> own) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (ChunkPos neighbor : this.cardinalNeighbors(chunk)) {
|
for (ChunkPos neighbor : this.cardinalNeighbors(chunk)) {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"schemaVersion":1,"id":"autostore","version":"1.1.8","name":"AutoStore","description":"","authors":[],"contact":{},"license":"All-Rights-Reserved","environment":"client","entrypoints":{"fabric-datagen":["autostore.client.AutoStoreModDataGenerator"],"client":["autostore.client.AutoStoreModClient"],"main":["autostore.AutoStoreMod"]},"mixins":["autostore.mixins.json",{"config":"autostore.client.mixins.json","environment":"client"}],"depends":{"fabricloader":">=0.16.14","fabric-api":"*","minecraft":"1.21.4"},"jars":[{"file":"META-INF/jars/baritone-api-fabric-1.13.1.jar"}]}
|
{"schemaVersion":1,"id":"autostore","version":"1.1.9","name":"AutoStore","description":"","authors":[],"contact":{},"license":"All-Rights-Reserved","environment":"client","entrypoints":{"fabric-datagen":["autostore.client.AutoStoreModDataGenerator"],"client":["autostore.client.AutoStoreModClient"],"main":["autostore.AutoStoreMod"]},"mixins":["autostore.mixins.json",{"config":"autostore.client.mixins.json","environment":"client"}],"depends":{"fabricloader":">=0.16.14","fabric-api":"*","minecraft":"1.21.4"},"jars":[{"file":"META-INF/jars/baritone-api-fabric-1.13.1.jar"}]}
|
||||||
在新工单中引用
屏蔽一个用户