Yamcl(YAMCore)

作者 Namikon 的 mod 开发核心库(README 自述 “Yet another modding CoreLib”,mcmod.info 描述为 “Yet another ModdingCore, for all your general-purpose modding needs”)。

⚠️ 分类名 yamcl 与 modid 完全不同。 仓库目录叫 Yamcl,但注册名是 YAMCore,包名是 eu.usrv.yamcore,资源域是 yamcore——三套命名互不相同。这是本 mod 最容易搞错的地方。

本 mod 注册 0 个方块、0 个物品、0 个实体、0 个 TileEntity、0 个多方块。 它是纯 API / 工具库,游戏内唯一可见的东西是一条调试指令。

项目 值
modid YAMCore(YAMCore.java:25 的 @Mod 注解硬编码)
包根 eu.usrv.yamcore(gradle.properties 的 modGroup)
资源域 yamcore(assets/yamcore/),与 modid 大小写不一致
分类名 yamcl(≠ modid)
源 commit 80ffa3a(2026-04-27)
Minecraft 1.7.10 / Forge 10.13.4.1614
硬依赖 无(@Mod 注解无 dependencies,mcmod.info 的 dependencies 为空数组)
主类 eu.usrv.yamcore.YAMCore(YAMCore.java:25)
主源文件数 80
语言文件 2 个(en_US、ru_RU)
版本号 ⚠️ 见「源码缺陷」第 1 条

物品 / 方块 / 实体 / 维度

全部为零。 源码里存在注册代码,但没有任何代码调用它:

$ grep -rn "GameRegistry.register" src/main/java
src/main/java/eu/usrv/yamcore/blocks/ModBlockManager.java:72:      GameRegistry.registerBlock(
src/main/java/eu/usrv/yamcore/fluids/ModFluidManager.java:113:         GameRegistry.registerItem(
src/main/java/eu/usrv/yamcore/fluids/ModFluidManager.java:120:             .registerBlock(modFluid, _mModID + "_" + modFluid.getUnlocalizedName().substring(5));
src/main/java/eu/usrv/yamcore/items/ModItemManager.java:74:         GameRegistry.registerItem(
src/main/java/eu/usrv/yamcore/items/ModItemManager.java:130:            GameRegistry.registerItem(pModItem.getConstructedItem(), pModItem.getUnlocalizedNameForRegistration());

这 5 处全在 Manager 类内部,而 4 个 Manager 自身从不被实例化:

Manager 被谁引用
ModBlockManager 仅自身
ModItemManager 仅自身
ModFluidManager 仅自身
CreativeTabsManager 被 3 个 Manager 引用(但那 3 个本身是死的)
ConfigManager 仅自身

YAMCore 主类的 4 个生命周期方法中,只有 preInit 有实际逻辑(探测调试文件 + 注册 BucketHandler):

@EventHandler public void Init(FMLInitializationEvent event) {}          // 空
@EventHandler public void postInit(FMLPostInitializationEvent event) { }  // 空

因此本 mod 在游戏内不添加任何内容。它是给其它 mod 开发时继承 / 调用的。

唯一的运行时行为

1. 调试模式开关

YAMCore.preInit(YAMCore.java:46-57)检查 config/YAMCoreDebug 这个文件是否存在:

File tFile = new File(event.getModConfigurationDirectory() + "/YAMCoreDebug");
tDebugFilePresent = tFile.exists();

存在即视为调试模式,启用 log 输出并注册调试指令。没有配置项,只看文件是否存在。

2. 桶填充事件

BucketHandler(events/BucketHandler.java)监听 FillBucketEvent,维护一个 Map<Block, Item> buckets 供其它 mod 注册「某方块 → 装成某物品」的桶对应关系。本 mod 自己不往 map 里放任何条目,所以该监听器在无外部注册时完全无效果。

⚠️ 该文件头部是 BuildCraft 的 MMPL 1.0 版权头(Copyright (c) SpaceToad, 2011),代码从 BuildCraft 复制而来。

3. 调试指令 /yamcore

YAMCommand(command/YAMCommand.java),仅在调试模式(存在 config/YAMCoreDebug 文件)时注册(YAMCore.java:67-70)。权限 canCommandSenderUseCommand 恒返回 true,即任何玩家可用。

参数 作用
/yamcore 1 简单消息
/yamcore 2 带 hover 提示的消息
/yamcore 3 带物品 hover(minecraft:stone)的消息
/yamcore 4 建议命令(/suicide)
/yamcore 5 直接执行命令(/suicide)
/yamcore 6 金色消息
/yamcore 7 发送 4 条原始 JSON 消息
/yamcore 8 格式化 JSON 消息(SendJsonFormatted)
/yamcore 9 联网请求 http://pastebin.com/raw/Zx4nNcuZ 并显示 UUID / 赞助等级
其它 回落到 tFunc = 1

参数缺失会抛 ArrayIndexOutOfBoundsException(pArgs[0] 无长度检查)。

供其它 mod 调用的 API

这是本 mod 的全部价值所在,共 80 个类分 18 个包。

注册管理器(给内容 mod 用)

类 作用
ModBlockManager 批量注册方块(BlockBase / ModSimpleBaseBlock)
ModItemManager 批量注册物品(ItemBase / ModSimpleBaseItem)
ModFluidManager 批量注册流体 + 桶(ModSimpleBaseFluid / ModBucketItem)
CreativeTabsManager / ModCreativeTab 创造模式物品栏管理

基类

blocks/BlockBase、blocks/ModSimpleBaseBlock、items/ItemBase、items/ModSimpleBaseItem、fluids/ModSimpleBaseFluid、fluids/ModBucketItem。

接口(iface/,6 个)

接口 用途
IExtendedBlockProperties 统一暴露方块属性:getMaterial / getUnbreakable / getHarvestLevel / getOpacity / getHardness / getLightLevel / getResistance / getBlockName / getTextureName / getHarvestToolClass / getStepSound / getIsOpaqueCube
IExtendedItemProperties 物品属性扩展
IExtendedModItem<T extends Item> 带泛型的物品扩展
IModItem 物品统一入口
IPersistedDataBase 持久化:setValue / getValueAsInt / getValue / Load / Save

工具类(auxiliary/,18 个)

DonorController、EntityHelper、FluidHelper、Hacks、IngameErrorLog、IntHelper、ItemDescriptor、LogHelper、MathHelper、PermConfigHelper、Placeable、PlayerChatHelper、PlayerHelper、TabText、TextFormatHelper、TimeHelper、WorldHelper,加 classes/JSONChatText + JSONClickEvent + JSONHoverEvent 与 enums/ItemEqualsCompareMethodEnum + ItemRecipeBehaviorEnum。

auxiliary/classes/ 的 3 个 JSON 聊天类实现的是 1.12+ 的富文本格式,在 1.7.10 上是通过 tellraw 指令模拟的(见 YAMCommand.java:128-129)。

其它子系统

包 内容
client/dynamicgui/ 动态 GUI 框架,20 个类:DynGUIScreen / DynGUIContainer + elements/(按钮、进度条、文本框、槽位)+ backgrounds/ + skins/ + widgets/ + helper/
datasource/ SQL 数据源:DatasourceSQL / Schema + bridge/(Bridge、BridgeMySQL、BridgeSQL)
network/ 封包分发:PacketDispatcher + AbstractMessageHandler + client/ / server/ 两侧基类
persisteddata/ PersistedDataBase(IPersistedDataBase 的实现)
gameregistry/ DamageTypeHelper / PotionHelper
config/ ConfigManager
world/ EzCoords(坐标工具)
client/ GuiNotification / Notification / NotificationTickHandler(客户端通知)

⚠️ datasource/bridge/BridgeMySQL.java 提供了 MySQL 连接能力,且 YAMCommand 9 会主动发起外部 HTTP 请求。详见「已知缺陷」。

本 mod 没有的内容

以下经源码检索确认完全没有,故不建目录、不建条目:

  • 任何注册内容:方块、物品、流体、实体、TileEntity、多方块、机器、GUI 容器全部为零。
  • 配方:grep -rn "addRecipe" src/main/java 无输出。
  • 附魔 / 药水效果:PotionHelper 只是个注册辅助类,本 mod 不注册任何效果。gameregistry/DamageTypeHelper 同理。
  • 成就 / 维度 / 群系 / 世界生成:grep -rn "registerDimension\|extends WorldProvider\|extends BiomeGenBase\|Achievement" src/main/java 无输出。
  • 结构 / 多方块:grep -rn "Multiblock\|extends TileEntity" src/main/java 无输出。
  • 语言键只覆盖一个未实现的特性:en_US.lang 仅 2 条(yamcore.char.protection.give / .remove),对应「护盾气泡」提示,但源码中无任何引用这两个键的代码。

源码缺陷

  1. 版本号是未替换的构建期占位符。YAMCore.java:25 写死:

    @Mod(modid = "YAMCore", name = "YAMCore", version = "GRADLETOKEN_VERSION")
    

    gradle.properties 靠 replaceGradleTokenInFile = YAMCore.java 做字符串替换。这本身可行,但 gradle.properties 同时有 generateGradleTokenClass =(空值)与 gradleTokenVersion = GRADLETOKEN_VERSION——即本 mod 没有用现代的 generateGradleTokenClass 机制,而是靠旧的 replaceGradleTokenInFile。两条机制并存配置,是技术债。

  2. modid / 包名 / 资源域 / 分类名四套命名。modid YAMCore、包 eu.usrv.yamcore、资源域 yamcore、仓库目录 Yamcl、wiki 分类 yamcl。日志名又是第五个:YAMCore.java:34 的 new LogHelper("Yamcl")。想在日志里过滤 YAMCore 的输出,得搜 "Yamcl"。

  3. /yamcore 指令会发起外部 HTTP 请求。YAMCommand.java:110 硬编码了一个 pastebin 地址:

    DonorController dc = new DonorController(new URL("http://pastebin.com/raw/Zx4nNcuZ"));
    

    这是明文 HTTP(非 HTTPS),且指向第三方个人 pastebin。虽然只在调试模式(需手动创建 config/YAMCoreDebug 文件)下该指令才注册,但它会同步阻塞服务器主线程去请求外部站点,且没有任何超时设置。pastebin 被墙或服主网络受限时,该指令会挂起服务器线程。

  4. getCommandUsage 返回 "derp"(YAMCommand.java:47)。玩家执行 /yamcore 时看到的使用提示就是字面量 derp,是明显的未完成占位。

  5. /yamcore 无参数长度检查。YAMCommand.java:59 直接 pArgs[0],玩家输入裸 /yamcore 会抛 ArrayIndexOutOfBoundsException。

  6. YAMCommand 同时实现 ICommand 与 ICommandSender,且 getEntityWorld()、getPlayerCoordinates()、addChatMessage() 全部返回 null / 空实现(:158-175)。它把自己当命令发送者用(icommandmanager.executeCommand(this, "tellraw ...")),这些空实现是该用法的必然结果,但 getEntityWorld() 返回 null 在某些命令上下文中会 NPE。

  7. 语言键是死键。en_US.lang 的 yamcore.char.protection.give / .remove(护盾气泡提示)在源码中无任何引用。

  8. BucketHandler 带 BuildCraft 的 MMPL 版权头(BucketHandler.java:1-6),与本仓库其余文件的许可状态不一致(README 写 “You may use this mod in any modpack”)。

  9. ConfigManager 从不被调用,因此本 mod 没有任何配置文件。唯一影响行为的「配置」是 config/YAMCoreDebug 这个文件是否存在(YAMCore.java:48)。

相关条目