Skip to content

Commit fe9d40b

Browse files
committed
Emitter rotation
1 parent 7a7cb4d commit fe9d40b

3 files changed

Lines changed: 40 additions & 34 deletions

File tree

src/main/java/runtime/ParticleEmitter.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import emitters.init.EmitterInitialization;
77
import emitters.init.EmitterLocalSpace;
88
import net.hollowcube.mql.foreign.Query;
9+
import net.minestom.server.coordinate.Point;
910
import net.minestom.server.coordinate.Vec;
1011
import net.minestom.server.network.packet.server.play.ParticlePacket;
1112
import particle.ParticleAppearanceTinting;
@@ -38,7 +39,9 @@ public class ParticleEmitter extends ParticleInterface {
3839
private final ParticleAppearanceTinting particleColour;
3940
private final ParticleInitialSpeed particleSpeed;
4041
private final ParticleLifetime particleLifetime;
41-
private Vec offset = Vec.ZERO;
42+
43+
private Point offset = Vec.ZERO;
44+
private float yaw;
4245

4346
@Query
4447
public int particle_count() {
@@ -85,10 +88,14 @@ public double particle_random_4() {
8588
return 0;
8689
}
8790

88-
public void setPosition(Vec offset) {
91+
public void setPosition(Point offset) {
8992
this.offset = offset;
9093
}
9194

95+
public void setRotation(float yaw) {
96+
this.yaw = yaw;
97+
}
98+
9299
public ParticleEmitter(int updatesPerSecond, EmitterInitialization initialization, EmitterLocalSpace local_space,
93100
EmitterLifetime lifetime, EmitterRate rate, EmitterShape shape,
94101
ParticleInitialSpeed particleSpeed, ParticleAppearanceTinting particleColour, ParticleLifetime particleLifetime) {
@@ -141,18 +148,23 @@ public Collection<ParticlePacket> tick() throws InvocationTargetException, NoSuc
141148
boolean canCreateParticle = rate.canEmit(this);
142149

143150
if (canCreateParticle) {
144-
Vec position = shape.emitPosition(this).add(this.offset);
145-
Vec direction = shape.emitDirection(this);
146-
if (direction == null) direction = Vec.ZERO;
151+
Vec position = rotateAroundOrigin(yaw, shape.emitPosition(this)).add(this.offset);
152+
// Vec direction = shape.emitDirection(this);
153+
// if (direction == null) direction = Vec.ZERO;
154+
// direction = direction.rotateFromView(yaw, 0);
147155

148-
Particle particle = new Particle(position, direction, this, particleColour, particleLifetime);
156+
Particle particle = new Particle(position, Vec.ZERO, this, particleColour, particleLifetime);
149157
// particles.add(particle);
150158
return List.of(particle.getPacket());
151159
}
152160

153161
return List.of();
154162
}
155163

164+
private Vec rotateAroundOrigin(float yaw, Vec emitPosition) {
165+
return emitPosition.rotateAroundY(Math.toRadians(yaw));
166+
}
167+
156168
@Override
157169
public String toString() {
158170
return "ParticleEmitter{" +

src/test/java/Demo.java

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,18 @@
99
import net.minestom.server.entity.Player;
1010
import net.minestom.server.event.GlobalEventHandler;
1111
import net.minestom.server.event.player.PlayerLoginEvent;
12+
import net.minestom.server.event.player.PlayerMoveEvent;
1213
import net.minestom.server.instance.InstanceContainer;
1314
import net.minestom.server.instance.InstanceManager;
1415
import net.minestom.server.instance.block.Block;
1516
import net.minestom.server.network.packet.server.play.ParticlePacket;
1617
import net.minestom.server.timer.ExecutionType;
1718
import net.minestom.server.timer.TaskSchedule;
1819
import runtime.Parser;
19-
import runtime.ParticleEmitter;
2020

2121
import java.io.*;
2222
import java.lang.reflect.InvocationTargetException;
23-
import java.util.ArrayList;
2423
import java.util.Collection;
25-
import java.util.List;
2624

2725
public class Demo {
2826
static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
@@ -35,14 +33,11 @@ public static void main(String[] args) throws FileNotFoundException, Unsupported
3533
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
3634
instanceContainer.setGenerator(unit -> unit.modifier().fillHeight(0, 40, Block.STONE));
3735

38-
List<ParticleEmitter> emitters = new ArrayList<>();
39-
for (int x = 0; x < 1; ++x) {
40-
File file = new File("./src/test/resources/particles/cool.particle.json");
41-
FileInputStream fis = new FileInputStream(file);
42-
JsonReader reader = new JsonReader(new InputStreamReader(fis, "UTF-8"));
43-
JsonObject map = GSON.fromJson(reader, JsonObject.class);
44-
emitters.add(Parser.parse(2000, map));
45-
}
36+
File file = new File("./src/test/resources/particles/cool.particle.json");
37+
FileInputStream fis = new FileInputStream(file);
38+
JsonReader reader = new JsonReader(new InputStreamReader(fis, "UTF-8"));
39+
JsonObject map = GSON.fromJson(reader, JsonObject.class);
40+
var emitter = Parser.parse(1000, map);
4641

4742
// Add an event callback to specify the spawning instance (and the spawn position)
4843
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
@@ -52,25 +47,24 @@ public static void main(String[] args) throws FileNotFoundException, Unsupported
5247
player.setGameMode(GameMode.CREATIVE);
5348
event.setSpawningInstance(instanceContainer);
5449
player.setRespawnPoint(new Pos(0, 42, 0));
55-
for (ParticleEmitter emitter : emitters) {
56-
emitter.setPosition(new Vec(0, 60, 0));
57-
}
50+
emitter.setPosition(new Vec(0, 60, 0));
5851
});
5952

53+
// globalEventHandler.addListener(PlayerMoveEvent.class, event -> {
54+
// emitter.setRotation(-event.getPlayer().getPosition().yaw());
55+
// emitter.setPosition(event.getPlayer().getPosition().add(0, 1.1, 0));
56+
// });
57+
6058
MinecraftServer.getSchedulerManager().scheduleTask(() -> {
6159
Collection<ParticlePacket> packets = null;
62-
for (ParticleEmitter emitter : emitters) {
63-
try {
64-
for (int i = 0; i <= 1; ++i) {
65-
packets = emitter.tick();
66-
packets.forEach(packet -> {
67-
instanceContainer.getPlayers().forEach(p -> p.sendPackets(packet));
68-
});
69-
}
70-
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
71-
IllegalAccessException e) {
72-
throw new RuntimeException(e);
73-
}
60+
try {
61+
packets = emitter.tick();
62+
packets.forEach(packet -> {
63+
instanceContainer.getPlayers().forEach(p -> p.sendPackets(packet));
64+
});
65+
} catch (InvocationTargetException | NoSuchMethodException | InstantiationException |
66+
IllegalAccessException e) {
67+
throw new RuntimeException(e);
7468
}
7569
}, TaskSchedule.immediate(), TaskSchedule.millis(1), ExecutionType.ASYNC);
7670

src/test/resources/particles/magic.particle.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
"rotation": true
1515
},
1616
"minecraft:emitter_rate_steady": {
17-
"spawn_rate": 300,
17+
"spawn_rate": 200,
1818
"max_particles": 1000
1919
},
2020
"minecraft:emitter_lifetime_expression": {
2121
"activation_expression": 1
2222
},
2323
"minecraft:emitter_shape_point": {
24-
"offset": ["((2 * Math.sin(variable.emitter_age * 360))) * Math.cos(variable.emitter_age * 30)", "((2 * Math.sin( variable.emitter_age * 360))) * Math.sin(variable.emitter_age * 30)", "2 * Math.cos(variable.emitter_age * 360)"]
24+
"offset": ["((1.5 * Math.sin(variable.emitter_age * 360))) * Math.cos(variable.emitter_age * 30)", "((1.5 * Math.sin( variable.emitter_age * 360))) * Math.sin(variable.emitter_age * 30)", "1.5 * Math.cos(variable.emitter_age * 360)"]
2525
},
2626
"minecraft:particle_lifetime_expression": {
2727
"max_lifetime": 0.7

0 commit comments

Comments
 (0)