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),对应「护盾气泡」提示,但源码中无任何引用这两个键的代码。
源码缺陷
-
版本号是未替换的构建期占位符。
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。两条机制并存配置,是技术债。 -
modid / 包名 / 资源域 / 分类名四套命名。modid
YAMCore、包eu.usrv.yamcore、资源域yamcore、仓库目录Yamcl、wiki 分类yamcl。日志名又是第五个:YAMCore.java:34的new LogHelper("Yamcl")。想在日志里过滤 YAMCore 的输出,得搜"Yamcl"。 -
/yamcore指令会发起外部 HTTP 请求。YAMCommand.java:110硬编码了一个 pastebin 地址:DonorController dc = new DonorController(new URL("http://pastebin.com/raw/Zx4nNcuZ"));
这是明文 HTTP(非 HTTPS),且指向第三方个人 pastebin。虽然只在调试模式(需手动创建
config/YAMCoreDebug文件)下该指令才注册,但它会同步阻塞服务器主线程去请求外部站点,且没有任何超时设置。pastebin 被墙或服主网络受限时,该指令会挂起服务器线程。 -
getCommandUsage返回"derp"(YAMCommand.java:47)。玩家执行/yamcore时看到的使用提示就是字面量derp,是明显的未完成占位。 -
/yamcore无参数长度检查。YAMCommand.java:59直接pArgs[0],玩家输入裸/yamcore会抛ArrayIndexOutOfBoundsException。 -
YAMCommand同时实现ICommand与ICommandSender,且getEntityWorld()、getPlayerCoordinates()、addChatMessage()全部返回null/ 空实现(:158-175)。它把自己当命令发送者用(icommandmanager.executeCommand(this, "tellraw ...")),这些空实现是该用法的必然结果,但getEntityWorld()返回null在某些命令上下文中会 NPE。 -
语言键是死键。
en_US.lang的yamcore.char.protection.give/.remove(护盾气泡提示)在源码中无任何引用。 -
BucketHandler带 BuildCraft 的 MMPL 版权头(BucketHandler.java:1-6),与本仓库其余文件的许可状态不一致(README 写 “You may use this mod in any modpack”)。 -
ConfigManager从不被调用,因此本 mod 没有任何配置文件。唯一影响行为的「配置」是config/YAMCoreDebug这个文件是否存在(YAMCore.java:48)。
相关条目
- 调试模式与 /yamcore 指令 - 调试开关与 10 个参数的行为
- API 一览 - 18 个包的类清单与调用方