diff --git a/plugins/generator-1.20.1/forge-1.20.1/templates/particle.java.ftl b/plugins/generator-1.20.1/forge-1.20.1/templates/particle.java.ftl index 4d73949c4d..c613677d9b 100644 --- a/plugins/generator-1.20.1/forge-1.20.1/templates/particle.java.ftl +++ b/plugins/generator-1.20.1/forge-1.20.1/templates/particle.java.ftl @@ -1,7 +1,7 @@ <#-- # MCreator (https://mcreator.net/) # Copyright (C) 2012-2020, Pylo - # Copyright (C) 2020-2023, Pylo, opensource contributors + # Copyright (C) 2020-2024, Pylo, opensource contributors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -64,7 +64,10 @@ package ${package}.client.particle; this.spriteSet = spriteSet; this.setSize(${data.width}f, ${data.height}f); - <#if data.scale != 1>this.quadSize *= ${data.scale}f; + + <#if data.scale.getFixedValue() != 1 && !hasProcedure(data.scale)> + this.quadSize *= ${data.scale.getFixedValue()}f; + <#if (data.maxAgeDiff > 0)> this.lifetime = (int) Math.max(1, ${data.maxAge} + (this.random.nextInt(${data.maxAgeDiff * 2}) - ${data.maxAgeDiff})); @@ -101,6 +104,13 @@ package ${package}.client.particle; return ParticleRenderType.PARTICLE_SHEET_${data.renderType}; } + <#if hasProcedure(data.scale)> + @Override public float getQuadSize(float scale) { + Level world = this.level; + return super.getQuadSize(scale) * (float) <@procedureOBJToConditionCode data.scale/>; + } + + @Override public void tick() { super.tick(); diff --git a/plugins/generator-1.20.4/neoforge-1.20.4/templates/particle.java.ftl b/plugins/generator-1.20.4/neoforge-1.20.4/templates/particle.java.ftl index 9fa53e66ed..a13bfc4133 100644 --- a/plugins/generator-1.20.4/neoforge-1.20.4/templates/particle.java.ftl +++ b/plugins/generator-1.20.4/neoforge-1.20.4/templates/particle.java.ftl @@ -53,7 +53,7 @@ package ${package}.client.particle; } private final SpriteSet spriteSet; - + <#if data.angularVelocity != 0 || data.angularAcceleration != 0> private float angularVelocity; private float angularAcceleration; @@ -64,7 +64,10 @@ package ${package}.client.particle; this.spriteSet = spriteSet; this.setSize(${data.width}f, ${data.height}f); - <#if data.scale != 1>this.quadSize *= ${data.scale}f; + + <#if data.scale.getFixedValue() != 1 && !hasProcedure(data.scale)> + this.quadSize *= ${data.scale.getFixedValue()}f; + <#if (data.maxAgeDiff > 0)> this.lifetime = (int) Math.max(1, ${data.maxAge} + (this.random.nextInt(${data.maxAgeDiff * 2}) - ${data.maxAgeDiff})); @@ -101,6 +104,13 @@ package ${package}.client.particle; return ParticleRenderType.PARTICLE_SHEET_${data.renderType}; } + <#if hasProcedure(data.scale)> + @Override public float getQuadSize(float scale) { + Level world = this.level; + return super.getQuadSize(scale) * (float) <@procedureOBJToConditionCode data.scale/>; + } + + @Override public void tick() { super.tick(); diff --git a/src/main/java/net/mcreator/element/types/Particle.java b/src/main/java/net/mcreator/element/types/Particle.java index 63ac221479..070d0a2334 100644 --- a/src/main/java/net/mcreator/element/types/Particle.java +++ b/src/main/java/net/mcreator/element/types/Particle.java @@ -19,6 +19,7 @@ package net.mcreator.element.types; import net.mcreator.element.GeneratableElement; +import net.mcreator.element.parts.procedure.NumberProcedure; import net.mcreator.element.parts.procedure.Procedure; import net.mcreator.io.FileIO; import net.mcreator.minecraft.MinecraftImageGenerator; @@ -45,7 +46,7 @@ public class Particle extends GeneratableElement { public double width; public double height; - public double scale; + public NumberProcedure scale; public double speedFactor; public double gravity; public int maxAge; diff --git a/src/main/java/net/mcreator/ui/modgui/ParticleGUI.java b/src/main/java/net/mcreator/ui/modgui/ParticleGUI.java index ead5e4f5c1..33d0981077 100644 --- a/src/main/java/net/mcreator/ui/modgui/ParticleGUI.java +++ b/src/main/java/net/mcreator/ui/modgui/ParticleGUI.java @@ -29,6 +29,8 @@ import net.mcreator.ui.help.HelpUtils; import net.mcreator.ui.init.L10N; import net.mcreator.ui.minecraft.TextureHolder; +import net.mcreator.ui.procedure.AbstractProcedureSelector; +import net.mcreator.ui.procedure.NumberProcedureSelector; import net.mcreator.ui.procedure.ProcedureSelector; import net.mcreator.ui.validation.AggregatedValidationResult; import net.mcreator.ui.validation.validators.TileHolderValidator; @@ -49,7 +51,7 @@ public class ParticleGUI extends ModElementGUI { private final JSpinner width = new JSpinner(new SpinnerNumberModel(0.2, 0, 4096, 0.1)); private final JSpinner height = new JSpinner(new SpinnerNumberModel(0.2, 0, 4096, 0.1)); - private final JSpinner scale = new JSpinner(new SpinnerNumberModel(1, 0.1, 4096, 0.1)); + private NumberProcedureSelector scale; private final JSpinner gravity = new JSpinner(new SpinnerNumberModel(0, -100, 100, 0.1)); private final JSpinner speedFactor = new JSpinner(new SpinnerNumberModel(1, -100, 100, 0.1)); private final JSpinner maxAge = new JSpinner(new SpinnerNumberModel(7, 0, 100000, 1)); @@ -73,6 +75,10 @@ public ParticleGUI(MCreator mcreator, ModElement modElement, boolean editingMode } @Override protected void initGUI() { + scale = new NumberProcedureSelector(this.withEntry("particle/scale"), mcreator, + L10N.t("elementgui.particle.visual_scale"), AbstractProcedureSelector.Side.CLIENT, + new JSpinner(new SpinnerNumberModel(1, 0.1, 4096, 0.1)), 0, + Dependency.fromString("x:number/y:number/z:number/world:world/age:number/scale:number")); additionalExpiryCondition = new ProcedureSelector(this.withEntry("particle/additional_expiry_condition"), mcreator, L10N.t("elementgui.particle.expiry_condition"), ProcedureSelector.Side.CLIENT, true, VariableTypeLoader.BuiltInTypes.LOGIC, Dependency.fromString( @@ -160,6 +166,7 @@ public ParticleGUI(MCreator mcreator, ModElement modElement, boolean editingMode super.reloadDataLists(); additionalExpiryCondition.refreshListKeepSelected(); + scale.refreshListKeepSelected(); } @Override protected AggregatedValidationResult validatePage(int page) { @@ -173,7 +180,7 @@ public ParticleGUI(MCreator mcreator, ModElement modElement, boolean editingMode StringUtils.removeEnd(particle.texture, ".png")); // legacy, old workspaces stored name with extension width.setValue(particle.width); height.setValue(particle.height); - scale.setValue(particle.scale); + scale.setSelectedProcedure(particle.scale); gravity.setValue(particle.gravity); speedFactor.setValue(particle.speedFactor); frameDuration.setValue(particle.frameDuration); @@ -193,7 +200,7 @@ public ParticleGUI(MCreator mcreator, ModElement modElement, boolean editingMode particle.texture = texture.getID() + ".png"; // legacy, old workspaces stored name with extension particle.width = (double) width.getValue(); particle.height = (double) height.getValue(); - particle.scale = (double) scale.getValue(); + particle.scale = scale.getSelectedProcedure(); particle.gravity = (double) gravity.getValue(); particle.speedFactor = (double) speedFactor.getValue(); particle.maxAge = (int) maxAge.getValue(); diff --git a/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java b/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java index 5bf0d48d03..a457f85614 100644 --- a/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java +++ b/src/test/java/net/mcreator/integration/TestWorkspaceDataProvider.java @@ -1432,7 +1432,7 @@ Color.white, new Procedure("condition4"), particle.width = 2.3; particle.frameDuration = 2; particle.height = 1.38; - particle.scale = 1.38; + particle.scale = new NumberProcedure(emptyLists ? null : "number1", 1.38); particle.gravity = 12.3; particle.speedFactor = 1.3; particle.canCollide = _true;