简单来说,就是题主看到的混淆代码(universal)是供玩家使用的,而非混淆的代码(deobf和sources)是供开发者使用的。
详细说来,我们要从Minecraft这一游戏本身说起。
首先,Mojang并不为其开发的Minecraft游戏提供源代码,同时,其提供的游戏文件也是混淆过的,其中的类没有包名,类名方法名等也全都是abcdef这种无意义的字母组合。
不过,针对Minecraft的修改行为(也就是我们通常所说的Mod和插件)从Minecraft发布不久就有人着手去做了,后来Mojang在Minecraft的最终用户许可协议(EULA)中明确表示了对Mod的支持,包括默许反编译等行为。当然,Minecraft的Mod数量也非常之多,目前至少有上万个Minecraft Mod活跃在各个论坛社区中。
在Minecraft发布不久就出现了专门反编译和反混淆Minecraft代码的组织,这一组织就是MCP(Mod Coder Pack),MCP提供的若干个映射表,就把上面提到的一些无意义的字母组合(又称Notch Name),变成了有意义的方法名类名(又称MCP Name)等。这个映射表就应该是这个样子的:
不过这样就出现了一个问题:毕竟这些名称是从无到有猜测出来的,总有一些名称当时猜不出来,而另一些名称可能当时的猜测是错误的,所以其实这个映射表,是经常修改和补充的。但是,旧的Mod使用的是修改前的名称,而新制作的Mod使用的是修改后的名称,这样怎么能够放在一起运行呢?机智的人民群众很快就想到了一个办法:我们可以使用一套固定的名称索引起来,打包Mod和运行Mod的时候都使用这套名称不就可以了?所以映射表就变成了这样:
半混淆名有着形如func_xxxxxx_x或者field_xxxxxx_x的形式,一般情况下不会发生变动。半混淆名又名SRG Name,以纪念MCP的领导者,后来进入Mojang参与Minecraft开发的Searge。
Minecraft Forge,一套主流的Minecraft Mod API,在运行的时候使用的正是这套方式:编译并打包Mod的时候把其中的未混淆名变成半混淆名,运行Minecraft的时候把混淆名同样变成半混淆名,这样Mod就可以使用半混淆名正常工作了。
所以正如题主所见,在直接下载Mod文件并运行的时候,其中的代码已经使用的是半混淆名了。然而在开发Mod的时候,如果Mod开发者想要提供其他Mod的兼容支持,那么就需要链接其他Mod的类,此时因为开发环境使用的是未混淆名,所以引入的其他Mod也必须使用未混淆名,也就是题主所看到的deobf(提供编译后的后缀名为.class的文件)和source(直接提供后缀名为.java的源代码)两个JAR。