渲染管线
基本信息
| 属性 | 值 |
|---|---|
| 事件处理器 | 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);
}
执行逻辑:
- 监听每个玩家模型渲染前的
Specials.Pre - 用
player.getUniqueID().toString()查UserManager——因此认的是 UUID - 查不到玩家就
return(绝大多数玩家走这条早退,开销极小) - 取
user.capes.get(0),只渲染第一个披风 - 纹理未加载则触发
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 正是为此暴露给接入方与内部复用的。
相关条目
- registerConfig - 挂载本处理器的入口
- UUID 身份模型 -
capes.get(0)与多披风的取舍 - 披风配置 JSON - 披风地址从哪来