Minecraft 层 API
基本信息
| 属性 | 值 |
|---|---|
| 覆盖范围 | api/ 中与玩家、服务器、游戏、格式化、数据相关的脚本类型 |
| 1.7.10 实现包 | minetweaker/mc1710/(69 个文件) |
| 平台工具类 | api/minecraft/MineTweakerMC.java(api/ 下唯一的 minecraft 包文件) |
| 游戏元数据实现 | mc1710/game/MCGame.java |
MineTweakerMC 是 MC 类型与 API 类型之间的转换枢纽,没有 @ZenClass,属 Java 侧工具类(api/minecraft/MineTweakerMC.java)。
核心脚本类型
| 脚本名 | Java 接口 | 源码 | 脚本方法数 |
|---|---|---|---|
minetweaker.player.IPlayer |
api/player/IPlayer.java |
:11 |
16 |
minetweaker.server.IServer |
api/server/IServer.java |
:11 |
6 |
minetweaker.game.IGame |
api/game/IGame.java |
— | 10 |
minetweaker.formatting.IFormattedText |
api/formatting/IFormattedText.java |
— | — |
minetweaker.data.IData |
api/data/IData.java |
:13 |
1 |
minetweaker.mods.ILoadedMods |
api/mods/ILoadedMods.java |
:8 |
0 @ZenMethod,2 个 @ZenOperator |
minetweaker.api.IClient |
api/client/IClient.java |
:11 |
2(Java 实现) |
IPlayer 与 IServer 的脚本方法数由 grep -cE '^\s*@ZenMethod|^\s*@ZenGetter' 统计(IPlayer.java → 16,IServer.java → 6)。1.7.10 实现为 MCPlayer(mc1710/player/MCPlayer.java)、MCServer(mc1710/server/MCServer.java),另有 RconPlayer 与 CommandBlockPlayer 两个命令发送者包装(mc1710/player/)。
ILoadedMods 不靠方法而靠运算符暴露(api/mods/ILoadedMods.java:9-18):
@ZenClass("minetweaker.mods.ILoadedMods")
@IterableSimple("minetweaker.mods.IMod")
public interface ILoadedMods extends Iterable<IMod> {
@ZenOperator(OperatorType.CONTAINS)
boolean contains(String name);
@ZenOperator(OperatorType.INDEXGET)
IMod get(String name);
}
即脚本里可写 "IC2" in loadedMods 与 loadedMods["IC2"],并可 for 遍历。注意元素类型 IMod 没有 @ZenClass(见类型系统与扩展),只有 @IterableSimple 里的字符串名。@ModOnly 门控正是靠 contains 实现的(MineTweakerAPI.java:249)。
game —— 游戏元数据
IGame(api/game/IGame.java)10 个脚本方法:
| 方法 | 返回 | 源码行 |
|---|---|---|
getItems |
IItemDefinition[] |
IGame.java:26 |
getBlocks |
IBlockDefinition[] |
IGame.java:34 |
getLiquids |
ILiquidDefinition[] |
IGame.java:42 |
getBiomes |
IBiome[] |
IGame.java:50 |
getEntities |
IEntityDefinition[] |
IGame.java:58 |
getEntity |
(String) → IEntityDefinition |
IGame.java:61 |
setLocalization |
(String, String) 与 (String, String, String) |
IGame.java:70、:80 |
localize |
(String) 与 (String, String) |
IGame.java:90、:101 |
lock |
锁定脚本,禁止再次重载 | IGame.java:109 |
isLocked |
→ boolean |
IGame.java:117 |
实体掉落实现在同一文件:MCGame.getEntity(name).getDropsToAdd() / getDropsToAddPlayerOnly() / getDropsToRemove() 三个映射驱动 ForgeEventHandler.onLivingDeathDrops(mc1710/ForgeEventHandler.java:73-140)。该处理器在 Forge 的 LivingDropsEvent 上直接增删 ev.drops,不经过 minetweaker.event.PlayerDeathDropsEvent(后者从未被发布,见事件系统)。
setLocalization 的底层是 SetTranslation 动作(MCGame.java:188),注释标为 “Ported from ModTweaker”(MCGame.java:184)。
缺陷:lock() 的 GUI 提示已被注释掉
MCGame.signalLockError() 全文(MCGame.java:166-177):
public void signalLockError() {
MineTweakerAPI.getLogger().logError("Reload of scripts blocked (script lock)");
if (Minecraft.isGuiEnabled()) {
// Commented out due to unresolved import
/**
* Minecraft.getMinecraft().displayGuiScreen( new GuiCannotRemodify( "Minecraft has been tweaked for another
* server", "with modifications that cannot be rolled back.", "Please restart your game."));
**/
}
}
GuiCannotRemodify(mc1710/GuiCannotRemodify.java:12)是本仓唯一的 GuiScreen 子类,构造它的语句是全仓唯一引用,且被注释(grep -rn GuiCannotRemodify 命中 3 处:类声明 1 处 + 注释 2 处)。结论:脚本锁定失败时只写一行日志,玩家看不到任何界面提示。该 GUI 属死代码。
物品与方块的 1.7.10 实现
| 脚本类型 | 1.7.10 实现 | 备注 |
|---|---|---|
minetweaker.item.IItemStack |
mc1710/item/MCItemStack.java |
包 net.minecraft.item.ItemStack |
minetweaker.item.IItemDefinition |
mc1710/item/MCItemDefinition.java |
— |
minetweaker.block.IBlockDefinition |
mc1710/block/MCBlockDefinition.java |
另有 MCItemBlock、MCSpecificBlock、MCWorldBlock |
minetweaker.entity.IEntityDefinition |
mc1710/entity/MCEntityDefinition.java |
— |
minetweaker.liquid.ILiquidStack |
mc1710/liquid/MCLiquidStack.java |
底层 FluidStack |
minetweaker.world.IDimension |
mc1710/world/MCDimension.java |
另有 MCBiome |
minetweaker.data.IData |
mc1710/data/NBTConverter.java / NBTUpdater.java |
NBT 双向转换 |
api/ 另有 4 个方块相关类型 IBlock、IBlockDefinition、IBlockPattern、IBlockGroup,其中 minetweaker.world.IBlockGroup 属世界分组。
交互副作用动作
mc1710/actions/ 下 4 个动作类提供脚本可触发的属性修改,全部实现 IUndoableAction 以便 /mt 重载时回滚:
| 动作 | 作用对象 |
|---|---|
SetBlockHardnessAction.java |
方块硬度 |
SetStackSizeAction.java |
最大堆叠数 |
SetStackmaxDamageAction.java |
最大耐久 |
SetTranslationAction.java |
显示名翻译 |
MCGame 内另有私有 SetTranslation(MCGame.java:188-194)服务于 game.setLocalization,与上述公共动作类并存。