一键导入
pasterdream-particle-api
PasterDream模组粒子注册专用API,提供Facade+Builder模式一键注册自定义粒子效果。在需要创建新粒子、配置粒子属性/纹理/多帧动画或生成粒子JSON时调用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
PasterDream模组粒子注册专用API,提供Facade+Builder模式一键注册自定义粒子效果。在需要创建新粒子、配置粒子属性/纹理/多帧动画或生成粒子JSON时调用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Guides API-Split multi-module architecture decisions for NeoPasterDream (NeoForge 1.21.1). Invoke when deciding where to place new code (PasterDreamAPI vs PasterDream), creating Builder/Facade/Result/Config classes, or designing new registration systems.
PasterDream模组药水效果注册专用API,提供Facade+Builder模式一键注册自定义MobEffect。在需要创建新状态效果、配置效果属性/着色器/粒子/回调/药水酿造时调用。
PasterDream模组实体注册专用API,提供Facade+Builder模式一键注册自定义实体。在需要创建新实体、配置实体属性/AI/碰撞箱/追踪范围/生物技能、动画系统或注册渲染器时调用。
PasterDream NeoForge 1.21.1 模组开发指南。提供项目结构、注册系统、实体系统、物品系统等的开发规范,以及常见崩溃问题的解决方案。Invoke when developing or modifying PasterDream mod features, creating new items/blocks/entities, fixing crashes, or when needing to understand the mod's architecture.
PasterDream 物品移植 API —— 用于将原 FixPasterDream 模组(MCreator 生成)中的物品系统化移植到 NeoForge 1.21.1。提供 Builder 模式、批量注册、迁移追踪、配方生成、战利品表生成、方块数据生成、创造标签页生成、语言文件生成及超级快速导入器等一站式工具链。Invoke when needing to port items from the old FixPasterDream mod, register new items in PDItems.java, batch-create items with consistent patterns, generate recipes/loot tables/block tags, or create creative tab registration code.
Minecraft NeoForge 1.21.1 方块掉落问题诊断与修复指南。Invoke when user encounters block drop issues, missing loot drops, or needs to implement custom block drops. Covers getDrops() override, BlockItem registration, and loot table JSON troubleshooting.
基于 SOC 职业分类
| name | pasterdream-particle-api |
| description | PasterDream模组粒子注册专用API,提供Facade+Builder模式一键注册自定义粒子效果。在需要创建新粒子、配置粒子属性/纹理/多帧动画或生成粒子JSON时调用。 |
本 Skill 提供 PasterDream 模组粒子注册专用 API 的使用指南,采用 Facade + Builder 模式(与 BlockAPI / DimensionAPI 风格一致),通过链式调用即可完成粒子类型的注册、纹理配置和资源文件生成。
particles/{name}.json)textures/particle/{name}.json)// ====== 1. 在 PDParticles.java(或任意注册类)中注册粒子 ======
ParticleResult sparkle = ParticleAPI.createParticle("sparkle")
.alwaysShow() // 粒子始终更新渲染
.texture("pasterdream:sparkle") // 设置粒子纹理
.withGravity(0.05f) // 设置重力参考值
.build(); // 注册 + 生成 JSON
// ====== 2. 在 ClientSetup.java 中注册 Provider ======
@SubscribeEvent
public static void registerParticles(RegisterParticleProvidersEvent event) {
ParticleAPI.registerProviderSprite(event, "sparkle",
(SpriteSet spriteSet) -> new SparkleParticle.Provider(spriteSet));
}
// ====== 3. 在代码中生成粒子 ======
ParticleType<?> type = ParticleAPI.getParticleType("sparkle");
level.addParticle(type, x, y, z, vx, vy, vz);
在 PasterDreamMod 构造函数中注册 ParticleAPI 的 REGISTRY:
public PasterDreamMod(IEventBus modEventBus) {
// ... 其他注册器 ...
ParticleAPI.REGISTRY.register(modEventBus);
}
ParticleAPI ← Facade 门面
├── createParticle(name) ← 工厂方法 → ParticleBuilder
├── registerProviderSprite() ← Provider 注册(SpriteSet)
├── getParticle(name) ← 查询 ParticleResult
├── getParticleType(name) ← 查询 ParticleType
├── getParticleSupplier(name) ← 查询 ParticleType Supplier
└── getRegisteredParticles() ← 所有已注册粒子的不可变视图
ParticleBuilder ← Builder 构建器
├── alwaysShow()/alwaysShow(boolean) ← 始终更新
├── texture(String) ← 纹理路径
├── withGravity(float) ← 重力参考值(文档用途)
├── generateJson(boolean) ← 是否自动生成 JSON
├── basePath(String) ← 资源文件基础路径
└── build() ← 注册 + 生成 JSON → ParticleResult
ParticleResult ← Record 结果
├── name() → String(粒子注册名)
├── holder() → DeferredHolder
├── typeSupplier() → Supplier<ParticleType<?>>
├── particleType() → ParticleType<?>
└── textureId() → String(如 "pasterdream:sparkle")
| 方法 | 参数 | 说明 |
|---|---|---|
alwaysShow() | — | 粒子始终更新渲染(等同于 alwaysShow(true)) |
alwaysShow(boolean) | bool | 设置 alwaysUpdate 参数 |
texture(String) | 纹理路径 | 粒子纹理路径(如 pasterdream:sparkle,默认 = {modId}:{name}) |
withGravity(float) | 重力值 | 重力参考值(正数向下加速,实际重力需在 Particle 类中实现) |
generateJson(boolean) | bool | 是否自动生成 JSON 文件(默认 true) |
basePath(String) | 路径 | 资源文件基础路径(默认 src/main/resources) |
| 方法 | 说明 |
|---|---|
ParticleBuilder.builder(String name) | 直接创建构建器(无需通过 ParticleAPI) |
// 注册
ParticleResult sparkle = ParticleAPI.createParticle("sparkle")
.alwaysShow()
.withGravity(0.05f)
.build();
// Provider(使用 SpriteSet)
public static class SparkleParticle extends TextureSheetParticle {
protected SparkleParticle(ClientLevel level, double x, double y, double z,
SpriteSet spriteSet, double vx, double vy, double vz) {
super(level, x, y, z, vx, vy, vz);
this.setSpriteFromAge(spriteSet);
this.gravity = 0.05f;
this.lifetime = 30;
}
@Override
public ParticleRenderType getRenderType() {
return ParticleRenderType.PARTICLE_SHEET_OPAQUE;
}
public record Provider(SpriteSet sprite) implements ParticleProvider<SimpleParticleType> {
@Override
public Particle createParticle(SimpleParticleType type, ClientLevel level,
double x, double y, double z,
double vx, double vy, double vz) {
return new SparkleParticle(level, x, y, z, sprite, vx, vy, vz);
}
}
}
// 注册(配合多帧纹理)
ParticleResult crystal = ParticleAPI.createParticle("crystal_particle")
.texture("pasterdream:crystal_particle")
.build();
// 自定义纹理添加帧(手动生成器)
new ParticleGenerator("pasterdream", "crystal_particle")
.withFrames("pasterdream:crystal_particle", 4) // 生成 4 帧
.saveToFile("src/main/resources");
// 生命周期长、有重力的粒子
ParticleResult leaf = ParticleAPI.createParticle("falling_leaf")
.alwaysShow()
.withGravity(0.01f)
.build();
// 查询并使用
ParticleType<?> leafType = ParticleAPI.getParticleType("falling_leaf");
level.addParticle(leafType, x, y, z,
random.nextGaussian() * 0.02,
-0.05,
random.nextGaussian() * 0.02);
src/main/resources/
└── assets/{modId}/
├── particles/{name}.json ← 粒子定义(纹理列表)
└── textures/particle/{name}.json ← 粒子纹理元数据(重力、路径参考)
{
"textures": [
"pasterdream:sparkle"
]
}
{
"particle": "pasterdream:sparkle",
"gravity": 0.05,
"texture_dir": "assets/pasterdream/textures/particle/",
"texture_base": "pasterdream:sparkle"
}
assets/{modId}/textures/particle/{name}.png ← 粒子纹理图片
对于多帧粒子,建议使用精灵表(Sprite Sheet)或在 textures/particle/ 目录下放置多张 PNG:
assets/{modId}/textures/particle/{name}_1.pngassets/{modId}/textures/particle/{name}_2.png在使用 ParticleAPI.registerProviderSprite() 时,粒子名称必须与 createParticle() 传入的名称一致。API 内部会通过缓存查找已注册的粒子类型,如果找不到会发出警告。
@SubscribeEvent
public static void registerParticles(RegisterParticleProvidersEvent event) {
// ✅ 正确:名称匹配
ParticleAPI.registerProviderSprite(event, "sparkle", SparkleParticle.Provider::new);
// ⚠️ 警告:名称不匹配(找不到 sparkle_miss)
ParticleAPI.registerProviderSprite(event, "sparkle_miss", SomeProvider::new);
}