Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ContributorsForksStargazersIssuesAPACHE-2.0 License


Logo

ParticleEmitter

Report Bug · Request Feature

About The Project

Logo

With this library, you can design particle animations with snowstorm and draw them in a Minecraft world.

Currently only Minestom is supported.

Getting Started

A full, runnable example server can be found in here

Particle examples can be found here

Adding as a dependency

Add the following to your build.gradle.kts file:

repositories {
maven("https://reposilite.atlasengine.ca/public")
}

Add the library as a dependency

dependencies {
implementation("net.worldseed.particleemitter:ParticleEmitter:<version>")
}

The lastest version number can be found here

JAVA FLAGS

To execute the code you must add the java VM flag --add-opens java.base/java.lang=ALL-UNNAMED.

Features

ParticleEmitter supports the following features

  • Emitter lifetime expression, loop and once
  • Emitter rate instant and steady
  • Emitter shape box, disc, point and sphere
  • Particle tinting (colour)

Limitations

Minecraft Query Language (MQL) does not fully support Molang

  • Variables do not work
  • Functions do not work

Particle Restrictions

  • Velocity only works on certain particles and acceleration don't work on any particles
  • Custom particle textures don't work
  • Curves have not been implemented
  • Particle lifetimes have not been implemented

Usage notes

Particle amounts

You may notice in practice that only one particle gets spawned per emitter.tick(). In some cases, this may be a problem as you may want to have more control over the amount of particles spawned for the same animation as demonstrated in the following video where the same animation is being played in 4 different positions with differing particle amounts: https://github.com/user-attachments/assets/8fd4f277-eb8d-4a3e-b068-18533f72346a

This can be achieved by using a for loop around the emitter.tick() like so:

Collection<ParticlePacket> packets = newArrayList<>();
for (inti = 0; i < amount; i++) {
packets.addAll(emitter.tick());
}
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
}

However, this method will require each emitter to have a different updatesPerSecond parameter equal to x*amount for the animations to be synchronised and play at the same time with differing particle counts, otherwise the animation may speed up or slow down.

List<ParticleEmitter> emitters = newArrayList<>();
{
varemitter = ParticleParser.parse(Particle.DUST_COLOR_TRANSITION, 1000*amount, map);
emitters.add(emitter);
}

Sample code for how this can be done in practice can be found in the src/test/java/ParticleManagerDemo.java file, where the video demonstration above was created with these calls:

ParticleManager.playParticle("rect.particle.json", newVec(0, 45, 0), 1, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(3, 45, 0), 2, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(6, 45, 0), 3, instanceContainer, false);
ParticleManager.playParticle("rect.particle.json", newVec(9, 45, 0), 4, instanceContainer, false);

Playing a particle animation "once" over its lifetime

If you want to have an animation play just once over its lifetime, you will need to use a Timer that gets cancelled once the emitter state is "DEAD" (meaning the animation completed successfully). Here is how that would be done in practice:

newTimer().schedule(newTimerTask() {
publicvoidrun() {
try {
for (varemitter : emitters) {
for (inti = 0; i < amount; i++) {
Collection<ParticlePacket> packets = emitter.tick();
if (emitter.status() != EmitterLifetime.LifetimeState.DEAD) {
packets.forEach(packet -> {
instance.getPlayers().forEach(p -> p.sendPackets(packet));
});
} else {
emitter.reset();
// Cancel the timer so it doesn't keep loopingthis.cancel();
}
}
}
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
IllegalAccessExceptione) {
thrownewRuntimeException(e);
}
}
}, 1, 1);

(back to top)

About

Library for drawing particle effects in Minecraft java edition using bedrock json files

Topics

Resources

Stars

80 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages