All versions
1.0.7-forge1.20.1
Alpha
Betterworld(village) 1.0.7-forge1.20.16 months ago 18
Compatibility
Minecraft: Java Edition
1.20.1
Platform
Forge
Supported environments
Singleplayer only
Changes
版本:1.0.7 多实体绑定与居民管理
多实体绑定
- 家方块、农场方块、工坊方块、资源点方块支持多实体绑定。
- 绑定列表使用
BoundEntities保存,列表首位仍作为 owner 兼容旧存档。 - 家方块容量改为手动可调,不再由床数直接决定。
- 各方块管理页新增分页、解绑、容量调整和每个实体的“详细”入口。
居民与镇管理
- 镇方块新增居民管理入口,可汇总镇范围内所有家方块的居民名单。
- 支持手动登记镇居民、排除镇居民,以及查看居民详情。
- 居民详情页改为打开独立的 Steve 信息界面,支持 ESC 返回上一页。
镇强加载
- 镇管理页新增“强加载”子页面,可为当前镇开启或关闭强加载。
- 强加载范围按区块半径配置,当前上限为 8 个区块半径,并会在页面中显示预计区块数量和大致方块宽度。
- 设置保存在
TownblockEntity的ForceLoadEnabled和ForceLoadRangeChunksNBT 字段中。 - 开启后镇方块会通过
ServerLevel.setChunkForced(...)保持周围区块加载;关闭、调整范围或镇方块被替换/破坏时会撤销旧范围。 - 强加载开启时,镇会被视为持续精确运行状态,不触发无人镇离线补算,避免真实 tick 和离线模拟重复结算。
床位与睡觉
- Steve 床位统一改为
BedInfo,保存床头、床脚和朝向。 SleepTask和离线睡眠都直接按BedInfo定位,不再使用旧的BedPos三元坐标。- 修复睡觉时实体落到床下面的问题:
BedInfo.sleepY()现在使用床面高度Y + 0.5625,在线睡觉和离线回城睡觉都会使用同一坐标。
离线模拟拆分
- 离线模拟逻辑已拆到
src/main/java/com/BetterWorld/block/entity/townblock/offline/。 - 新增
OfflineTradeExecutor复用实时交易的核心校验,离线流程不再写第二套交易逻辑。 - 离线补算继续按天循环,维持资源点、农民、工匠、生活费、商人日结的顺序。
修复 部分
- 管理居民/工人页面的“详细”按钮现在打开独立 Steve 信息界面,不再把详情挤在原页面右侧。
- 从 Steve 信息书直接打开详情时,按 ESC 关闭;从家、农场、工坊、资源点或镇管理页面打开详情时,按 ESC 返回上一管理页面。
- Steve 信息菜单改为保存实体 ID 并延迟解析实体,避免从管理页点“详细”后一闪而过或立刻关闭。
- 从管理页查看居民详情时不再强制要求玩家离该 Steve 足够近,只要服务端能找到该 Steve,就允许打开资料页。
- 如果客户端暂时还没同步到目标 Steve,资料页会显示“正在加载史蒂夫资料...”,而不是空白或直接关闭。
- 绑定容量不能被减到当前绑定人数以下;继续点击减号会提示玩家先解绑多余成员。
- 镇居民列表里的家方块坐标显示位置左移,避免太靠右导致页面拥挤。
交易资金不足回家取钱
- 新增通用交易补钱流程:AI 交易遇到
buyer_no_money、buyer_payment_failed或merchant_no_money时,会登记补钱请求并尝试回家从家容器取镇货币。 - 买家钱不够时买家回家取钱;商人收购物品时钱不够,则由商人自己回家取钱。
- 补钱目标通过
TradeMoneyRefillGoal/TradeMoneyRefillTask执行,优先级高于普通工作和交易,但低于危险、睡觉和吃饭。 - 普通职业交易、买食物、工坊买材料/卖成品、资源工卖货、囤积交易和套利交易都会识别资金不足失败。
- 对于还没进入
TradeService就被预算预判挡住的情况,农民买种子、买食物和工坊买材料也会主动登记补钱请求。 - 如果只是资金不足,不会立刻挂长交易失败冷却;补钱后可以重新尝试。家里没有可用货币时会写日志并进入短冷却,避免反复跑家。
- 补钱请求会去重,同一段时间内不会刷屏;如果后续交易需要更多钱,会抬高已有请求金额并刷新 TTL。
性能说明
- 在线真实运行时,主要性能消耗仍来自实体 AI、寻路、Sensor 扫描、农民巡田、商人查找和容器/方块交互;多实体绑定会增加实体数量带来的线性成本,但不会额外引入每 tick 的全镇大扫描。
- 镇方块居民页和绑定总览主要在打开 GUI 或渲染页面时汇总当前镇数据,不应放到高频 tick 中反复扫描。
- 无人镇会让商人和资源点跳过精确 tick,再在玩家回镇时走镇级离线摘要补算;离线模拟按天、按镇、按容器做低粒度估算,成本通常比让所有实体持续真实跑 AI 低得多。
- 后续如果出现卡顿,优先检查
SensorSystem、MerchantFinder、农民巡田扫描、资源点生产频率、活跃 Steve 数量和正在打开的管理 GUI,而不是先怀疑离线模拟。 - 关闭默认
AIDebug控制台输出,避免大量 AI 目标/移动/交易日志拖慢 tick。 - 商人绑定实体查询增加同 tick 缓存;
MerchantFinder只需要排除“商人自己”时改为直接比 UUID,减少 256 格实体扫描。 - 多实体绑定查询增加同 tick 缓存,降低家/农场/工坊/资源点反复读取绑定实体时的扫描成本。
- 资源点 tick 优化为只有真正产出时才查找可投递资源工;普通规则进度不再每 tick 同步方块实体。
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:k233t5Y1:jvQNmyIB"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:k233t5Y1:jvQNmyIB"
}

