渲染管线

基本信息

属性 值
事件处理器 com.jadarstudios.developercapes.RenderEventHandler
事件 RenderPlayerEvent.Specials.Pre(@SubscribeEvent)
挂载时机 DevCapes 单例构造时 MinecraftForge.EVENT_BUS.register(...)
披风接口 ICape / AbstractCape / StaticCape
平台 纯客户端(AbstractClientPlayer、客户端纹理系统)

唯一的渲染钩子

整个库只有一个 Forge 事件订阅:

@SubscribeEvent
public void renderPlayer(RenderPlayerEvent.Specials.Pre event) {
    AbstractClientPlayer player = (AbstractClientPlayer) event.entityPlayer;
    User user = UserManager.getInstance().getUser(player.getUniqueID().toString());
    if (user == null) return;
    ICape cape = user.capes.get(0);
    if (cape == null) return;
    if (!cape.isTextureLoaded(player)) cape.loadTexture(player);
}

执行逻辑:

  1. 监听每个玩家模型渲染前的 Specials.Pre
  2. 用 player.getUniqueID().toString() 查 UserManager——因此认的是 UUID
  3. 查不到玩家就 return(绝大多数玩家走这条早退,开销极小)
  4. 取 user.capes.get(0),只渲染第一个披风
  5. 纹理未加载则触发 loadTexture

[!NOTE] 处理器在 Specials.**Pre** 阶段只负责把纹理准备好,本身不绘制任何几何。真正的披风几何由接入方自己的 RenderPlayerEvent.Pre 处理——即 DeveloperCapes 提供「谁有披风 + 披风纹理是什么」,绘制留给使用它的 mod。

ICape 接口

public interface ICape {
    String getName();
    ITextureObject getTexture();
    ResourceLocation getLocation();
    void loadTexture(AbstractClientPlayer player);
    boolean isTextureLoaded(AbstractClientPlayer player);
}

AbstractCape 是抽象基类,持有 name / texture / location 三个 protected 字段并提供 getter,但不实现 loadTexture / isTextureLoaded——这两个必须由子类实现。

StaticCape 是 AbstractCape 的具体实现。CapeManager 是全局单例,用 HashMap<String, ICape> 按披风名字索引;addCape 的守卫同样是 containsValue(按对象身份而非名字去重)。

HD 披风

HDImageBuffer 提供非 16×16 的高分辨率披风处理。1.7.10 原版玩家模型只支持 64×32 的披风贴图,本库额外提供 HD 缓冲以便渲染更高清的披风。

[!NOTE] HDImageBuffer 依赖 cpw.mods.fml.relauncher.Side / SideOnly 做客户端隔离,与 RenderEventHandler 一样是纯客户端代码。整个库没有任何服务端逻辑——披风是纯视觉的,服务器无需安装。

资源位置的生成

getLocation() 返回的 ResourceLocation 通常由披风名派生(如 devcapes/capes/<name>),配合 getName() 供接入方查自己的 ResourceLocation 缓存。由于披风图片可来自远程 URL,而 Minecraft 1.7.10 的纹理系统只认 ResourceLocation 指向的本地 ITextureObject,loadTexture 内部必然要把下载到的流喂给 ITextureObject——getStreamForURL / getStreamForFile 正是为此暴露给接入方与内部复用的。

相关条目