Skip to content

Commit

Permalink
fix particle packet issue + per player glow (#13)
Browse files Browse the repository at this point in the history
* per player color

---------

Co-authored-by: iam4722202468 <aceparent@gmail.com>
  • Loading branch information
steamworksmc and iam4722202468 committed Mar 10, 2024
1 parent 2236bd2 commit 4dfe193
Show file tree
Hide file tree
Showing 14 changed files with 207 additions and 25 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ publishing {
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
implementation("net.minestom:minestom-snapshots:aad7bdab0f")
implementation("net.minestom:minestom-snapshots:2ff143a61d")

implementation("commons-io:commons-io:2.11.0")
implementation("org.zeroturnaround:zt-zip:1.8")
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/net/worldseed/multipart/GenericModel.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package net.worldseed.multipart;

import net.kyori.adventure.util.RGBLike;
import net.minestom.server.Viewable;
import net.minestom.server.collision.Shape;
import net.minestom.server.color.Color;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
import net.minestom.server.event.EventHandler;
import net.minestom.server.instance.Instance;
import net.worldseed.multipart.animations.AnimationHandlerImpl;
Expand Down Expand Up @@ -131,7 +132,10 @@ public interface GenericModel extends Viewable, EventHandler<ModelEvent>, Shape
void setScale(float scale);

void removeGlowing();
void setGlowing(Color color);
void setGlowing(RGBLike color);

void removeGlowing(Player player);
void setGlowing(Player player, RGBLike color);

void attachModel(GenericModel model, String boneName);
Map<String, List<GenericModel>> getAttachedModels();
Expand Down
21 changes: 20 additions & 1 deletion src/main/java/net/worldseed/multipart/GenericModelImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.MinecraftServer;
import net.minestom.server.ServerProcess;
import net.minestom.server.collision.BoundingBox;
Expand Down Expand Up @@ -57,6 +58,7 @@ public abstract class GenericModelImpl implements GenericModel {

private final Set<Player> viewers = ConcurrentHashMap.newKeySet();
private final EventNode<ModelEvent> eventNode;
private final Map<Player, RGBLike> playerGlowColors = Collections.synchronizedMap(new WeakHashMap<>());

public GenericModelImpl() {
final ServerProcess process = MinecraftServer.process();
Expand Down Expand Up @@ -369,6 +371,11 @@ public void sendPacketToViewersAndSelf(@NotNull SendablePacket packet) {
@Override
public boolean addViewer(@NotNull Player player) {
getParts().forEach(part -> part.addViewer(player));

var foundPlayerGlowing = this.playerGlowColors.get(player);
if(foundPlayerGlowing != null)
this.viewableBones.forEach(part -> part.setGlowing(player, foundPlayerGlowing));

return this.viewers.add(player);
}

Expand Down Expand Up @@ -451,7 +458,7 @@ public boolean intersectBoxSwept(@NotNull Point rayStart, @NotNull Point rayDire
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {
this.viewableBones.forEach(part -> part.setGlowing(color));
}

Expand All @@ -460,6 +467,18 @@ public void removeGlowing() {
this.viewableBones.forEach(ModelBoneImpl::removeGlowing);
}

@Override
public void setGlowing(Player player, RGBLike color) {
this.playerGlowColors.put(player, color);
this.viewableBones.forEach(part -> part.setGlowing(player, color));
}

@Override
public void removeGlowing(Player player) {
this.playerGlowColors.remove(player);
this.viewableBones.forEach(part -> part.removeGlowing(player));
}

@Override
public void attachModel(GenericModel model, String boneName) {
ModelBone bone = this.parts.get(boneName);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.worldseed.multipart.model_bones;

import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
Expand Down Expand Up @@ -47,7 +47,10 @@ public interface ModelBone {
void setScale(float scale);

void removeGlowing();
void setGlowing(Color color);
void setGlowing(RGBLike color);

void removeGlowing(Player player);
void setGlowing(Player player, RGBLike color);

void attachModel(GenericModel model);
List<GenericModel> getAttachedModels();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.worldseed.multipart.model_bones.armour_stand;

import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
Expand Down Expand Up @@ -41,10 +41,20 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {
if (this.stand != null) this.stand.setGlowing(true);
}

@Override
public void removeGlowing(Player player) {

}

@Override
public void setGlowing(Player player, RGBLike color) {

}

@Override
public void attachModel(GenericModel model) {
throw new UnsupportedOperationException("Cannot attach a model to this bone type");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package net.worldseed.multipart.model_bones.display_entity;

import net.minestom.server.MinecraftServer;
import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.metadata.display.ItemDisplayMeta;
import net.minestom.server.entity.metadata.other.ArmorStandMeta;
import net.minestom.server.instance.Instance;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.play.EntityMetaDataPacket;
import net.minestom.server.network.packet.server.play.SetPassengersPacket;
import net.worldseed.multipart.GenericModel;
import net.worldseed.multipart.Quaternion;
Expand All @@ -22,7 +23,9 @@
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

public class ModelBonePartDisplay extends ModelBoneImpl implements ModelBoneViewable {
Expand Down Expand Up @@ -57,16 +60,64 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {
if (this.stand != null) {
int rgb = 0;
rgb |= color.red() << 16;
rgb |= color.green() << 8;
rgb |= color.blue();

var meta = (ItemDisplayMeta) this.stand.getEntityMeta();
meta.setHasGlowingEffect(true);
meta.setGlowColorOverride(color.asRGB());
meta.setGlowColorOverride(rgb);
}

this.attached.forEach(model -> model.setGlowing(color));
}

@Override
public void removeGlowing(Player player) {
if(this.stand == null)
return;

EntityMetaDataPacket oldMetadataPacket = this.stand.getMetadataPacket();
Map<Integer, Metadata.Entry<?>> oldEntries = oldMetadataPacket.entries();
byte previousFlags = oldEntries.containsKey(0)
? (byte) oldEntries.get(0).value()
: 0;

Map<Integer, Metadata.Entry<?>> entries = new HashMap<>(oldMetadataPacket.entries());
entries.put(0, Metadata.Byte((byte) (previousFlags & ~0x40)));
entries.put(22, Metadata.VarInt(-1));

player.sendPacket(new EntityMetaDataPacket(this.stand.getEntityId(), entries));
this.attached.forEach(model -> model.removeGlowing(player));
}

@Override
public void setGlowing(Player player, RGBLike color) {
if(this.stand == null)
return;

int rgb = 0;
rgb |= color.red() << 16;
rgb |= color.green() << 8;
rgb |= color.blue();

EntityMetaDataPacket oldMetadataPacket = this.stand.getMetadataPacket();
Map<Integer, Metadata.Entry<?>> oldEntries = oldMetadataPacket.entries();
byte previousFlags = oldEntries.containsKey(0)
? (byte) oldEntries.get(0).value()
: 0;

Map<Integer, Metadata.Entry<?>> entries = new HashMap<>(oldEntries);
entries.put(0, Metadata.Byte((byte) (previousFlags | 0x40)));
entries.put(22, Metadata.VarInt(rgb));

player.sendPacket(new EntityMetaDataPacket(this.stand.getEntityId(), entries));
this.attached.forEach(model -> model.setGlowing(player, color));
}

@Override
public void attachModel(GenericModel model) {
attached.add(model);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package net.worldseed.multipart.model_bones.misc;

import com.google.gson.JsonArray;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.MinecraftServer;
import net.minestom.server.color.Color;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
Expand Down Expand Up @@ -59,7 +59,15 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {
}

@Override
public void removeGlowing(Player player) {
}

@Override
public void setGlowing(Player player, RGBLike color) {
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.worldseed.multipart.model_bones.misc;

import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
Expand Down Expand Up @@ -30,7 +30,17 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {

}

@Override
public void removeGlowing(Player player) {

}

@Override
public void setGlowing(Player player, RGBLike color) {

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.worldseed.multipart.model_bones.misc;

import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
Expand Down Expand Up @@ -35,7 +35,17 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {

}

@Override
public void removeGlowing(Player player) {

}

@Override
public void setGlowing(Player player, RGBLike color) {

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.worldseed.multipart.model_bones.misc;

import net.minestom.server.color.Color;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
Expand Down Expand Up @@ -106,8 +106,18 @@ public void removeGlowing() {
}

@Override
public void setGlowing(Color color) {
public void setGlowing(RGBLike color) {
this.attached.forEach(model -> model.setGlowing(color));
}

@Override
public void removeGlowing(Player player) {
this.attached.forEach(model -> model.removeGlowing(player));
}

@Override
public void setGlowing(Player player, RGBLike color) {
this.attached.forEach(model -> model.setGlowing(player, color));
}

}
15 changes: 14 additions & 1 deletion src/test/java/demo_models/bulbasaur/BulbasaurMob.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,23 @@ public void remove() {
this.animationHandler.playOnce("animation.bulbasaur.faint", (cb) -> {
this.model.destroy();
this.animationHandler.destroy();
ParticlePacket packet = new ParticlePacket(Particle.POOF, position.x(), position.y() + 1, position.z(), 1, 1, 1, 0, 50);

ParticlePacket packet = new ParticlePacket(
Particle.POOF,
false,
this.position.x(),
this.position.y() + 1,
this.position.z(),
1,
1,
1,
0,
50
);
viewers.forEach(v -> v.sendPacket(packet));

super.remove();
});
}

}

0 comments on commit 4dfe193

Please sign in to comment.