All versions
1.0.5-forge1.20.1
Release
Betterworld(village) 1.0.5-forge1.20.16 months ago 18
Compatibility
Minecraft: Java Edition
1.20.1
Platform
Forge
Supported environments
Singleplayer only
Changes
版本:1.0.5 可配置货币、NBT 物品交易和商人玩家兑换修正
货币兑换系统
-
新增镇方块货币兑换配置
- 镇方块主界面只保留“货币兑换”按钮,不再放物品槽和玩家物品栏。
- 点击后打开独立的
TownCurrencyMenu/TownCurrencyScreen,在新界面里配置货币规则。 - 玩家可以把物品放入槽位,配置“1 物品 = ? money”的兑换比例。
- 规则先在 GUI 内作为草稿编辑,点击“保存”后才写入
TownblockEntityNBT。 - 点击“取消”会关闭界面并丢弃未保存改动。
- 规则列表支持删除、上移和下移;从上到下即兑换优先级。
- 新城镇和旧城镇如果没有
CurrencyRules,默认都使用minecraft:emerald = 1 money。
-
支持多货币和 NBT 货币
- 货币规则使用完整
ItemStackKey,严格区分物品 ID 和 NBT。 - 普通物品如泥土没有 NBT 时按 ID 匹配。
- 命名物品、附魔书等带 NBT 的物品会按
ID + NBT区分,不会混在一起。 - 未配置货币规则时,继续使用绿宝石 1:1 的旧逻辑,兼容已有世界。
- 货币规则使用完整
-
实体早晚存取钱改为走镇货币规则
TakeMoneyTask改为读取实体家方块绑定的镇方块货币配置。- 早上从家容器取出配置货币物品,并按汇率转换为实体身上的数字
money。 PutMoneyTask改为把实体剩余money按镇货币规则兑换成货币物品并存回家容器。- 如果剩余 money 不足以兑换任意一个最低面额货币物品,会保留在实体身上。
- 交易、预算、价格计算仍然只使用数字
money,货币物品只在进出经济系统时兑换。
-
优化多面额货币的取钱和存钱
- AI 晚上存钱时会按汇率从高到低兑换,优先生成高面额货币物品,减少容器占用。
- 例如
1 钻石 = 100 money时,1000 money会优先存成 10 个钻石,而不是 1000 个绿宝石。 - AI 早上取钱时会先规划兑换组合,尽量接近目标金额,避免因为高面额货币导致明显超取。
- 如果能精确凑到目标,会优先精确取钱;如果凑不满,则尽量取接近目标的金额;只有必须超额时才取最小超额组合。
- 玩家卖货收款和交易找零也改为优先发放高面额货币,减少玩家背包压力。
-
明确职业取钱范围
- 农民、商人、工匠和资源工早上都会通过
TakeMoneyTask从家容器按镇货币规则取出工作资金。 - 资源工取钱后仍会去资源点容器拿资源产物,白天卖给商人获得数字
money。 - 资源工早晨取钱金额由
resource.morningCashTarget控制,默认 64。 - 资源工晚上会把当天剩余和卖资源赚到的
money按镇货币规则兑换成货币物品并存回家。
- 农民、商人、工匠和资源工早上都会通过
NBT 物品交易和库存
-
商人、工坊、资源点槽位支持同 ID 不同 NBT
- 价格、规则、库存和显示改为使用完整
ItemStackKey。 - 同一个物品 ID 但 NBT 不同的物品可以作为不同商品、不同资源规则或不同工坊材料/产物存在。
- 拿出、放入、交易保存和转移物品时保留 NBT,不再退化成纯物品 ID。
- 价格、规则、库存和显示改为使用完整
-
统一容器物品转移逻辑
- 整理
ContainerUtils,取物和存物优先走ItemStack/NBT 匹配路径。 - 移除旧的、已被替代的商人交互工具和重复交易方法,减少同一行为存在多套实现。
- AI 实体直接买卖、拿进拿出物品时,都会尽量保留原物品 NBT。
- 整理
-
商人价格和经济显示区分 NBT 物品
- 商人价格表和经济数据页继续按完整 key 记录和查询。
- 带 NBT 的物品显示名后增加
[NBT]标记,避免两个同名物品看起来像同一条记录。 - 删除某个带 NBT 商品的价格时,只影响对应 NBT 版本,不会误删同 ID 的其他版本。
玩家与商人交易
-
玩家付款改为使用镇货币规则
- 玩家向商人购买物品时,不再硬检查和扣除背包绿宝石。
- 交易仍然以 money 数字计价,但付款时会读取商人绑定镇方块的货币规则。
- 系统会在玩家背包中按镇货币规则寻找可用货币物品,按优先级混合扣款,严格匹配
ID + NBT。 - 交易会先模拟“扣款 + 找零”能否都成功,再真正执行;如果金额不够、背包装不下找零,或无法按规则凑出可用支付方案,交易直接失败。
- 找零也会按同一套镇货币规则返回玩家背包,不再只认单一绿宝石。
-
玩家卖货收款也走镇货币规则
- 玩家把物品卖给商人时,商人仍然用自身
money判断是否付得起。 - 给玩家的报酬不再固定发绿宝石,而是按镇货币规则兑换成货币物品放入玩家背包。
- 发放前会检查玩家背包是否能装下对应货币物品。
- 未配置镇货币规则时,仍然发放绿宝石 1:1。
- 玩家把物品卖给商人时,商人仍然用自身
-
修复商人玩家交易中的 NBT 丢失
MerchantTradeMenu生成交易报价时改为通过ItemStackKey.stackFromKey(...)还原物品。- 玩家购买、出售、缺货记录、买不起记录、交易统计和反向交易限制都使用完整
ItemStackKey。 - 玩家交易中的扣物、给物继续使用
ItemStack.isSameItemSameTags,同 ID 不同 NBT 不会串货。
镇方块
- 镇方块区域确认不再扫描容器
- 镇方块确认区域时只记录范围内的家方块、农场方块和商人方块等组织信息。
- 不再把范围内的普通箱子、木桶等容器记录为镇方块容器,避免误统计一批无关箱子。
- 旧存档中镇方块已保存的
Containers数据会被忽略,后续保存也不再写入镇方块容器列表。
- 镇方块新增 money 金库
TownblockEntity新增明确的money字段,用于保存镇金库资金。- 删除旧的
TaxTreasury字段和旧税收入口,镇金库只保存Money。 - 交易税现在直接进入镇方块
money,绑定公务员领取工资时也从该字段扣除。
囤积策略
- 新增恐慌性囤积
- 非商人实体在普通低价囤积之外,会观察商人出售价格的连续上涨趋势。
- 当某商品连续上涨达到配置天数、当前价仍未明显高于 7 日均价,并且存在缺货、买不起或真实成交等需求压力时,会进行小批量提前买入。
- 该逻辑用于模拟实体担心经常需要的商品继续涨价或断货时的备货行为,而不是单纯追求套利。
- 恐慌囤积仍受预算、保留闲钱、家中最大库存、单次购买上限、价格弹性、商人库存和食物保留规则限制。
- 新增恐慌囤积配置
trade.hoarding.panic.enabled控制是否启用恐慌囤积。trade.hoarding.panic.minRisingDays控制触发所需的连续上涨天数,默认 3。trade.hoarding.panic.maxAverageMultiplier控制当前价格相对均价的最高可接受倍率,默认 1.10。trade.hoarding.panic.minDemand控制触发所需的最低需求压力,默认 1。trade.hoarding.panic.maxUnitsPerTrip控制单次恐慌囤积购买上限,默认 8。- 五维性格会在这些基础配置上微调触发门槛:节俭、冒险、聪明的实体更早恐慌,挥霍或保守实体更晚触发。
- 囤积交易继续保留 NBT
- 囤积策略内部改为使用
ItemStackKey.stackFromKey(...)和ItemStack生成交易请求。 - 囤积卖出前从家里取货时使用
ItemStack精确匹配,避免同 ID 不同 NBT 的物品被混取。 - 囤积交易日志也记录完整
ItemStackKey,和商人价格表、经济数据保持一致。
- 囤积策略内部改为使用
AI 套利行为
- 新增空闲套利副业
- 非商人职业会在本职工作、吃饭、睡觉和收工之外的空闲时段尝试套利。
- 套利流程为:从同镇商人 A 买入商品,移动到同镇商人 B,再卖给商人 B。
- 商人职业不会套利,避免商人使用公共经营资金自买自卖。
- 套利交易继续走
TradeService,因此会保留 NBT、记录经济数据、遵守反向交易限制和税收逻辑。
- 新增套利限制
- 两个商人必须绑定同一个镇方块。
- 单次数量受
trade.arbitrage.maxUnitsPerTrip限制,默认 8。 - 成功后进入
trade.arbitrage.successCooldownTicks冷却,默认 2400 tick。 - 失败后进入
trade.arbitrage.failureCooldownTicks冷却,默认 1200 tick。 - 需要套利者有可支配 money,商人 A 有可卖库存,商人 B 有收购容量和足够 money。
- 预期利润必须至少达到
trade.arbitrage.minProfitMoney和trade.arbitrage.minProfitRate,默认至少 1 money 且 5%。
- 性格影响套利门槛
- 套利门槛由
PersonalityProfile.arbitrageProfitMultiplier按五维属性计算。 - 更聪明、更敢冒险的实体可以接受较低利润门槛。
- 保守、低慷慨或节俭倾向较强的实体会要求更高利润。
- 套利成功和失败都会写入活动日志,便于在实体信息书里追踪。
- 套利门槛由
性格机制
- 性格从枚举标签升级为五维属性
- 实体性格现在保存为合群、慷慨、聪明、勤勉、冒险 5 个 0-100 数值。
- 旧的合群、孤僻、节俭、挥霍仍保留为模板名、显示倾向和旧存档兼容入口,不再作为行为 switch 的唯一依据。
- 新生成实体会先选择一个可读模板,再对五维属性做随机扰动,因此保留“像某类人”的辨识度,同时拥有连续差异。
- 旧存档读取
Personality字符串时会自动映射到对应模板向量,保持兼容。
- 行为差异改为公式化
PersonalityProfile不再按性格枚举写 switch,而是从五维属性计算交易频率、本职交易次数、补给目标、囤积倾向、买价敏感度、比价范围、关系容量和套利利润门槛。tradeFrequencyMultiplier主要影响闲散交易、副业行为和非本职购买频率。workTradeMultiplier/scaleWorkTrips主要影响工匠买材料、卖成品等本职交易次数。supplyTargetMultiplier/scaleSupplyTarget主要影响农民种子、食物等补给目标。hoardingTendencyMultiplier让低慷慨、高冒险、高聪明的实体更容易囤积或恐慌备货。buyPriceSensitivityMultiplier让慷慨和冒险提高高价接受度,聪明会让实体更谨慎。merchantSearchRangeMultiplier让更聪明、更合群的实体检查更大范围的商人。arbitrageProfitMultiplier让更聪明、更敢冒险的实体接受更低利润门槛,保守或节俭倾向会要求更高利润。
- 社交和显示同步更新
- 傍晚社交不再直接判断
Personality.FRUGAL等枚举,而是根据连续属性判断节俭倾向、挥霍倾向、孤僻倾向和合群倾向。 - 对话类型仍会映射到合群、孤僻、节俭、挥霍这些可读倾向,避免翻译和台词系统失去语义。
- 实体信息界面会显示主倾向以及 5 个维度数值,方便观察每个实体的个性差异。
- 傍晚社交不再直接判断
新手教程书
- 教程书扩展到 16 页
TutorialBookScreen从 10 页扩展到 16 页。- 新增货币兑换、NBT 物品、价格和经济数据、职业经济链、性格囤积套利、日志社交等章节。
- 旧的“放绿宝石启动经济”说明改为“镇货币”,避免和可配置货币系统冲突。
- 中英文教程同步
zh_cn.json和en_us.json同步补齐gui.betterworld.tutorial_book.page_11到page_16。- 后续新增玩家可见系统时,教程书页数、中文翻译和英文翻译需要一起更新。
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:gCmdopNh"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:k233t5Y1:gCmdopNh"
}

