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,与上述公共动作类并存。

相关条目