Skip to content

Commit b0c0af3

Browse files
committed
添加DynamicInput(Parameters)和Trigger相关API
1 parent 43f2dba commit b0c0af3

File tree

10 files changed

+260
-3
lines changed

10 files changed

+260
-3
lines changed

common/src/main/java/mod/chloeprime/aaaparticles/api/client/effekseer/ParticleEmitter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ public float getDynamicInput(int index) {
126126
return manager.getImpl().GetDynamicInput(this.handle, index);
127127
}
128128

129+
public void sendTrigger(int index) {
130+
manager.getImpl().SendTrigger(this.handle, index);
131+
}
132+
129133
public interface PreDrawCallback {
130134
void accept(ParticleEmitter emitter, float partialTicks);
131135

common/src/main/java/mod/chloeprime/aaaparticles/api/common/AAALevel.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package mod.chloeprime.aaaparticles.api.common;
22

3+
import mod.chloeprime.aaaparticles.api.client.effekseer.ParticleEmitter;
34
import mod.chloeprime.aaaparticles.client.AAAParticlesClient;
45
import mod.chloeprime.aaaparticles.common.network.ModNetwork;
56
import mod.chloeprime.aaaparticles.common.network.S2CAddParticle;
7+
import mod.chloeprime.aaaparticles.common.network.S2CSendEmitterTrigger;
8+
import mod.chloeprime.aaaparticles.common.network.S2CUpdateEmitterParam;
9+
import net.minecraft.resources.ResourceLocation;
610
import net.minecraft.server.level.ServerLevel;
711
import net.minecraft.server.level.ServerPlayer;
12+
import net.minecraft.world.entity.player.Player;
813
import net.minecraft.world.level.Level;
14+
import org.jetbrains.annotations.ApiStatus;
915

1016
public class AAALevel {
1117
public static void addParticle(Level level, ParticleEmitterInfo info) {
@@ -29,6 +35,24 @@ public static void addParticle(Level level, double distance, ParticleEmitterInfo
2935
}
3036
}
3137

38+
@ApiStatus.Experimental
39+
public static void setParameterFor(Player player, ParticleEmitter.Type type, ResourceLocation effek, ResourceLocation emitterName, DynamicParameter[] parameters) {
40+
if (player.level().isClientSide) {
41+
AAAParticlesClient.setParam(type, effek, emitterName, parameters);
42+
} else {
43+
ModNetwork.CHANNEL.sendToPlayer((ServerPlayer) player, new S2CUpdateEmitterParam(type, effek, emitterName, parameters));
44+
}
45+
}
46+
47+
@ApiStatus.Experimental
48+
public static void sendTriggerFor(Player player, ParticleEmitter.Type type, ResourceLocation effek, ResourceLocation emitterName, int[] triggers) {
49+
if (player.level().isClientSide) {
50+
AAAParticlesClient.sendTrigger(type, effek, emitterName, triggers);
51+
} else {
52+
ModNetwork.CHANNEL.sendToPlayer((ServerPlayer) player, new S2CSendEmitterTrigger(type, effek, emitterName, triggers));
53+
}
54+
}
55+
3256
private static void sendToPlayer(ServerPlayer player, Level level, S2CAddParticle packet, double sqrDistance) {
3357
if (player.level() != level) {
3458
return;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package mod.chloeprime.aaaparticles.api.common;
2+
3+
public record DynamicParameter(
4+
int index,
5+
float value
6+
) {
7+
}

common/src/main/java/mod/chloeprime/aaaparticles/api/common/ParticleEmitterInfo.java

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package mod.chloeprime.aaaparticles.api.common;
22

3+
import it.unimi.dsi.fastutil.ints.IntArrayList;
4+
import it.unimi.dsi.fastutil.ints.IntList;
35
import mod.chloeprime.aaaparticles.client.installer.NativePlatform;
46
import mod.chloeprime.aaaparticles.client.registry.EffectRegistry;
57
import mod.chloeprime.aaaparticles.common.network.S2CAddParticle;
@@ -15,14 +17,29 @@
1517
import org.jetbrains.annotations.ApiStatus;
1618

1719
import java.lang.ref.WeakReference;
20+
import java.util.ArrayList;
21+
import java.util.List;
1822
import java.util.Optional;
1923

2024
public class ParticleEmitterInfo implements Cloneable {
2125
/**
22-
* Create a packet when on logic server
26+
* Create a packet when on logic server,
27+
* with an anonymous emitter that can't be referenced later.
2328
*/
2429
public static ParticleEmitterInfo create(Level level, ResourceLocation location) {
25-
return level.isClientSide() ? new ParticleEmitterInfo(location) : new S2CAddParticle(location);
30+
return level.isClientSide()
31+
? new ParticleEmitterInfo(location)
32+
: new S2CAddParticle(location);
33+
}
34+
35+
/**
36+
* Create a packet when on logic server,
37+
* with a named emitter that can be referenced later.
38+
*/
39+
public static ParticleEmitterInfo create(Level level, ResourceLocation location, ResourceLocation emitterName) {
40+
return level.isClientSide()
41+
? new ParticleEmitterInfo(location, emitterName)
42+
: new S2CAddParticle(location, emitterName);
2643
}
2744

2845
public final ResourceLocation effek;
@@ -33,12 +50,22 @@ public static ParticleEmitterInfo create(Level level, ResourceLocation location)
3350
protected float scaleX = 1, scaleY = 1, scaleZ = 1;
3451
protected double esX, esY, esZ;
3552
protected int boundEntity;
53+
protected final List<DynamicParameter> parameters = new ArrayList<>();
54+
protected final IntList triggers = new IntArrayList();
3655
private static final Vec3 VEC3_ONES = new Vec3(1, 1, 1);
3756

57+
/**
58+
* @see #create(Level, ResourceLocation)
59+
*/
60+
@ApiStatus.Internal
3861
public ParticleEmitterInfo(ResourceLocation effek) {
3962
this(effek, null);
4063
}
4164

65+
/**
66+
* @see #create(Level, ResourceLocation, ResourceLocation)
67+
*/
68+
@ApiStatus.Internal
4269
public ParticleEmitterInfo(ResourceLocation effek, ResourceLocation emitter) {
4370
this.effek = effek;
4471
this.emitter = emitter;
@@ -72,6 +99,14 @@ public final boolean isScaleSet() {
7299
return (flags & 8) != 0;
73100
}
74101

102+
public final boolean hasParameters() {
103+
return (flags & 128) != 0;
104+
}
105+
106+
public final boolean hasTriggers() {
107+
return (flags & 256) != 0;
108+
}
109+
75110
public final boolean hasBoundEntity() {
76111
return (flags & 16) != 0;
77112
}
@@ -153,6 +188,18 @@ public ParticleEmitterInfo scale(float x, float y, float z) {
153188
return this;
154189
}
155190

191+
public ParticleEmitterInfo parameter(int index, float value) {
192+
parameters.add(new DynamicParameter(index, value));
193+
flags |= 128;
194+
return this;
195+
}
196+
197+
public ParticleEmitterInfo trigger(int index) {
198+
triggers.add(index);
199+
flags |= 256;
200+
return this;
201+
}
202+
156203
public ParticleEmitterInfo bindOnEntity(Entity entity) {
157204
this.boundEntity = entity.getId();
158205
flags |= 16;
@@ -232,6 +279,16 @@ public void encode(FriendlyByteBuf buf) {
232279
buf.writeFloat(scaleY);
233280
buf.writeFloat(scaleZ);
234281
}
282+
if (hasParameters()) {
283+
buf.writeVarInt(parameters.size());
284+
parameters.forEach(param -> {
285+
buf.writeVarInt(param.index());
286+
buf.writeFloat(param.value());
287+
});
288+
}
289+
if (hasTriggers()) {
290+
buf.writeVarIntArray(triggers.toIntArray());
291+
}
235292
if (hasBoundEntity()) {
236293
buf.writeVarInt(boundEntity);
237294
}
@@ -265,6 +322,17 @@ public ParticleEmitterInfo(FriendlyByteBuf buf) {
265322
scaleY = buf.readFloat();
266323
scaleZ = buf.readFloat();
267324
}
325+
if (hasParameters()) {
326+
var paramCount = buf.readVarInt();
327+
for (int i = 0; i < paramCount; i++) {
328+
var index = buf.readVarInt();
329+
var value = buf.readFloat();
330+
parameters.add(new DynamicParameter(index, value));
331+
}
332+
}
333+
if (hasTriggers()) {
334+
triggers.addElements(0, buf.readVarIntArray());
335+
}
268336
if (hasBoundEntity()) {
269337
boundEntity = buf.readVarInt();
270338
}
@@ -275,6 +343,7 @@ public ParticleEmitterInfo(FriendlyByteBuf buf) {
275343
}
276344
}
277345

346+
@ApiStatus.Internal
278347
public void spawnInWorld(Level level, Player player) {
279348
if (NativePlatform.isRunningOnUnsupportedPlatform()) {
280349
return;
@@ -285,6 +354,8 @@ public void spawnInWorld(Level level, Player player) {
285354
var isPositionSet = isPositionSet();
286355
var isRotationSet = isRotationSet();
287356
var isScaleSet = isScaleSet();
357+
var hasParams = hasParameters();
358+
var hasTriggs = hasTriggers();
288359
float x, y, z;
289360
if (isPositionSet) {
290361
x = (float) this.x;
@@ -306,6 +377,15 @@ public void spawnInWorld(Level level, Player player) {
306377
emitter.setScale(scaleX, scaleY, scaleZ);
307378
}
308379

380+
if (hasParams) {
381+
for (var parameter : parameters) {
382+
emitter.setDynamicInput(parameter.index(), parameter.value());
383+
}
384+
}
385+
if (hasTriggs) {
386+
triggers.forEach(emitter::sendTrigger);
387+
}
388+
309389
if (hasBoundEntity) {
310390
var entity = new WeakReference<>(level.getEntity(boundEntity));
311391
var headSpace = usingEntityHeadSpace();
@@ -360,6 +440,10 @@ public void copyTo(ParticleEmitterInfo target) {
360440
target.scaleX = this.scaleX;
361441
target.scaleY = this.scaleY;
362442
target.scaleZ = this.scaleZ;
443+
target.parameters.clear();
444+
target.parameters.addAll(this.parameters);
445+
target.triggers.clear();
446+
target.triggers.addAll(this.triggers);
363447
target.boundEntity = this.boundEntity;
364448
}
365449
}

common/src/main/java/mod/chloeprime/aaaparticles/client/AAAParticlesClient.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22

33
import dev.architectury.registry.ReloadListenerRegistry;
44
import mod.chloeprime.aaaparticles.AAAParticles;
5+
import mod.chloeprime.aaaparticles.api.client.effekseer.ParticleEmitter;
6+
import mod.chloeprime.aaaparticles.api.common.DynamicParameter;
57
import mod.chloeprime.aaaparticles.api.common.ParticleEmitterInfo;
68
import mod.chloeprime.aaaparticles.client.installer.JarExtractor;
79
import mod.chloeprime.aaaparticles.client.installer.NativePlatform;
810
import mod.chloeprime.aaaparticles.client.loader.EffekAssetLoader;
11+
import mod.chloeprime.aaaparticles.client.registry.EffectRegistry;
912
import net.minecraft.client.Minecraft;
13+
import net.minecraft.resources.ResourceLocation;
1014
import net.minecraft.server.packs.PackType;
1115
import net.minecraft.world.level.Level;
1216

1317
import java.io.IOException;
18+
import java.util.Arrays;
19+
import java.util.Optional;
1420

1521
public class AAAParticlesClient
1622
{
@@ -52,4 +58,20 @@ public static void addParticle(Level level, ParticleEmitterInfo info) {
5258
}
5359
info.spawnInWorld(level, player);
5460
}
61+
62+
public static void setParam(ParticleEmitter.Type type, ResourceLocation effek, ResourceLocation emitterName, DynamicParameter[] params) {
63+
Optional.ofNullable(EffectRegistry.get(effek))
64+
.flatMap(mng -> mng.getNamedEmitter(type, emitterName))
65+
.ifPresent(emitter -> {
66+
for (var param : params) {
67+
emitter.setDynamicInput(param.index(), param.value());
68+
}
69+
});
70+
}
71+
72+
public static void sendTrigger(ParticleEmitter.Type type, ResourceLocation effek, ResourceLocation emitterName, int[] triggers) {
73+
Optional.ofNullable(EffectRegistry.get(effek))
74+
.flatMap(mng -> mng.getNamedEmitter(type, emitterName))
75+
.ifPresent(emitter -> Arrays.stream(triggers).forEach(emitter::sendTrigger));
76+
}
5577
}

common/src/main/java/mod/chloeprime/aaaparticles/client/registry/EffectDefinition.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public ParticleEmitter play(ParticleEmitter.Type type, ResourceLocation emitterN
4949
return emitter;
5050
}
5151

52+
public Optional<ParticleEmitter> getNamedEmitter(ParticleEmitter.Type type, ResourceLocation emitterName) {
53+
return Optional.ofNullable(namedEmitters.get(type).get(emitterName));
54+
}
55+
5256
public EffekseerManager getManager(ParticleEmitter.Type type) {
5357
return Objects.requireNonNull(managers.get(type));
5458
}

common/src/main/java/mod/chloeprime/aaaparticles/common/network/ModNetwork.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ public class ModNetwork {
88

99
public static void init() {
1010
CHANNEL.register(S2CAddParticle.class, S2CAddParticle::encode, S2CAddParticle::new, S2CAddParticle::handle);
11+
CHANNEL.register(S2CUpdateEmitterParam.class, S2CUpdateEmitterParam::encode, S2CUpdateEmitterParam::new, S2CUpdateEmitterParam::handle);
12+
CHANNEL.register(S2CUpdateEmitterParam.class, S2CUpdateEmitterParam::encode, S2CUpdateEmitterParam::new, S2CUpdateEmitterParam::handle);
13+
CHANNEL.register(S2CSendEmitterTrigger.class, S2CSendEmitterTrigger::encode, S2CSendEmitterTrigger::new, S2CSendEmitterTrigger::handle);
1114
}
1215
}

common/src/main/java/mod/chloeprime/aaaparticles/common/network/S2CAddParticle.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,24 @@
44
import mod.chloeprime.aaaparticles.api.common.ParticleEmitterInfo;
55
import net.minecraft.network.FriendlyByteBuf;
66
import net.minecraft.resources.ResourceLocation;
7+
import net.minecraft.world.level.Level;
8+
import org.jetbrains.annotations.ApiStatus;
79

810
import java.util.function.Supplier;
911

1012
public class S2CAddParticle extends ParticleEmitterInfo {
11-
13+
/**
14+
* @see #create(Level, ResourceLocation)
15+
*/
16+
@ApiStatus.Internal
1217
public S2CAddParticle(ResourceLocation effek) {
1318
super(effek);
1419
}
1520

21+
/**
22+
* @see #create(Level, ResourceLocation, ResourceLocation)
23+
*/
24+
@ApiStatus.Internal
1625
public S2CAddParticle(ResourceLocation effek, ResourceLocation emitter) {
1726
super(effek, emitter);
1827
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package mod.chloeprime.aaaparticles.common.network;
2+
3+
import dev.architectury.networking.NetworkManager;
4+
import mod.chloeprime.aaaparticles.api.client.effekseer.ParticleEmitter;
5+
import mod.chloeprime.aaaparticles.client.AAAParticlesClient;
6+
import net.minecraft.network.FriendlyByteBuf;
7+
import net.minecraft.resources.ResourceLocation;
8+
import org.jetbrains.annotations.ApiStatus;
9+
10+
import java.util.function.Supplier;
11+
12+
@ApiStatus.Experimental
13+
public class S2CSendEmitterTrigger {
14+
private final ParticleEmitter.Type type;
15+
private final ResourceLocation effek;
16+
private final ResourceLocation emitterName;
17+
private final int[] triggers;
18+
19+
public S2CSendEmitterTrigger(ParticleEmitter.Type type, ResourceLocation effek, ResourceLocation emitterName, int[] triggers) {
20+
this.type = type;
21+
this.effek = effek;
22+
this.emitterName = emitterName;
23+
this.triggers = triggers;
24+
}
25+
26+
S2CSendEmitterTrigger(FriendlyByteBuf buf) {
27+
type = buf.readEnum(ParticleEmitter.Type.class);
28+
effek = buf.readResourceLocation();
29+
emitterName = buf.readResourceLocation();
30+
this.triggers = buf.readVarIntArray();
31+
}
32+
33+
public void encode(FriendlyByteBuf buf) {
34+
buf.writeEnum(type);
35+
buf.writeResourceLocation(effek);
36+
buf.writeResourceLocation(emitterName);
37+
buf.writeVarIntArray(triggers);
38+
}
39+
40+
public void handle(Supplier<NetworkManager.PacketContext> ctx) {
41+
var context = ctx.get();
42+
context.queue(() -> AAAParticlesClient.sendTrigger(type, effek, emitterName, triggers));
43+
}
44+
}

0 commit comments

Comments
 (0)