第三方模组开发者指南
我们非常欢迎您对MadParticle作出主动或被动的支持。
被动兼容
只需要让您的粒子继承TextureSheetParticle,按常规路径走原版ParticleEngine的各种逻辑,MadParticle会自动地按照用户的设置进行接管。
主动兼容
在以上所述的被动兼容的基础上,您还可以主动向MadParticle告知您的粒子是否支持并行计算,以及是否支持实例化渲染。
信息
如果您不确定您的粒子是否支持并行计算和实例化渲染:
- 只需要检查您的粒子
tick方法中的内容是否含有只能在主线程中执行的内容,例如对Minecraft对象的写操作; - 您的粒子是否含有特殊的渲染?比如具有固定旋转角度而不是常规billboard、材质不来源于
TextureAtlas.LOCATION_PARTICLES;
MadParticle在Particle类中注入了类型为枚举TakeOver.TickType的madparticleTickType字段,以表示这个粒子是否支持并行计算。TickType的值可以是SYNC、ASYNC和UNKNOWN。对于没有主动赋值的第三方粒子,默认值是UNKNOWN。
MadParticle依靠getGroup方法来判断粒子是否支持实例化渲染。如果方法的返回值为ModParticleRenderTypes.INSTANCED,则使用实例化渲染,并使用粒子Atlas材质;如果方法的返回值为ModParticleRenderTypes.INSTANCED_TERRAIN,则使用实例化渲染,并使用方块Atlas材质。返回其他的值,MadParticle便不会干涉粒子的渲染。
以下是完整的 参考代码:
public class YourParticle extends TextureSheetParticle {
private @NotNull ParticleRenderType particleRenderType;
public YourParticle(ClientLevel pLevel, double pX, double pY, double pZ, ParticleRenderType particleRenderType) {
super(pLevel, pX, pY, pZ);
if (ModList.get().isLoaded("madparticle")) {
try {
var tickType = Class.forName("cn.ussshenzhou.madparticle.particle.enums.TakeOver.TickType");
//SYNC ASYNC UNKNOWN
var sync = tickType.getMethod("valueOf", String.class).invoke(null, "SYNC");
var madparticleTickType = this.getClass().getField("madparticleTickType");
madparticleTickType.setAccessible(true);
madparticleTickType.set(this, sync);
var modParticleRenderTypes = Class.forName("cn.ussshenzhou.madparticle.particle.render.ModParticleRenderTypes");
//INSTANCED INSTANCED_TERRAIN
var instanced = modParticleRenderTypes.getDeclaredField("INSTANCED");
this.particleRenderType = (ParticleRenderType) instanced.get(null);
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException ignored) {
}
}
}
/**
* Do NOT put reflection or other logic here. This method should be as quick as possible.
*/
@Override
public ParticleRenderType getGroup() {
return particleRenderType;
}
}
当然,示例简单起见,此处的反射类、方法、字段均未缓存。
信息
这里利用了反射来避免在你的项目中引入MadParticle本身。如果你不太喜欢这样做,你也可以借助CurseMaven引入MadParticle。