Skip to content

Commit

Permalink
🔥 Impl trait system and debug testing
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt-MX committed Sep 11, 2024
1 parent bbcc69c commit 98bb44c
Show file tree
Hide file tree
Showing 9 changed files with 190 additions and 15 deletions.
14 changes: 9 additions & 5 deletions src/main/java/com/mattmx/nametags/EventsListener.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.mattmx.nametags;

import com.github.retrooper.packetevents.protocol.world.Location;
import com.mattmx.nametags.entity.NameTagEntity;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
Expand All @@ -14,7 +12,7 @@ public class EventsListener implements Listener {

@EventHandler
public void onPlayerJoin(@NotNull PlayerJoinEvent event) {
NameTagEntity nameTagEntity = NameTags.getInstance()
NameTags.getInstance()
.getEntityManager()
.getOrCreateNameTagEntity(event.getPlayer());
}
Expand All @@ -27,17 +25,23 @@ public void onPlayerQuit(@NotNull PlayerQuitEvent event) {

if (entity == null) return;

entity.getPassenger().despawn();
entity.destroy();
}

@EventHandler
public void onChangeWorld(@NotNull PlayerChangedWorldEvent event) {
public void onPlayerChangeWorld(@NotNull PlayerChangedWorldEvent event) {
NameTagEntity nameTagEntity = NameTags.getInstance()
.getEntityManager()
.getNameTagEntity(event.getPlayer());

if (nameTagEntity == null) return;

nameTagEntity.updateLocation();

if (NameTags.getInstance().getConfig().getBoolean("show-self", false)) {
nameTagEntity.getPassenger().removeViewer(nameTagEntity.getBukkitEntity().getUniqueId());
nameTagEntity.getPassenger().addViewer(nameTagEntity.getBukkitEntity().getUniqueId());
nameTagEntity.sendPassengerPacket(event.getPlayer());
}
}
}
11 changes: 7 additions & 4 deletions src/main/java/com/mattmx/nametags/NameTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.util.Vector3f;
import com.mattmx.nametags.entity.NameTagEntityManager;
import com.mattmx.nametags.entity.TestImplTrait;
import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.meta.display.AbstractDisplayMeta;
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.Color;
Expand All @@ -29,10 +31,8 @@ public void onEnable() {
saveDefaultConfig();

entityManager.setDefaultProvider((entity, meta) -> {
meta.setText(LegacyComponentSerializer
.legacyAmpersand()
.deserialize(String.format("&f%s %s &#35A7FF0ms\n&#F3FFBDSome sub text", entity.getName(), "▪"))
);
// Set to empty since we're updating automatically
meta.setText(Component.empty());
meta.setBillboardConstraints(AbstractDisplayMeta.BillboardConstraints.VERTICAL);
meta.setTranslation(new Vector3f(0f, 0.2f, 0f));
meta.setBackgroundColor(TRANSPARENT);
Expand All @@ -54,6 +54,9 @@ public void onEnable() {
.registerListener(packetListener);

Bukkit.getPluginManager().registerEvents(eventsListener, this);

// DEBUG
Bukkit.getPluginManager().registerEvents(new TestImplTrait(), this);
}

public @NotNull NameTagEntityManager getEntityManager() {
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/com/mattmx/nametags/entity/NameTagEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,25 @@
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetPassengers;
import com.mattmx.nametags.NameTags;
import com.mattmx.nametags.entity.trait.TraitHolder;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import me.tofaa.entitylib.meta.display.TextDisplayMeta;
import me.tofaa.entitylib.wrapper.WrapperEntity;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class NameTagEntity {
private final @NotNull TraitHolder traits = new TraitHolder(this);
private final @NotNull Entity bukkitEntity;
private final @NotNull WrapperEntity passenger;

public NameTagEntity(@NotNull Entity entity, @NotNull BiConsumer<Entity, TextDisplayMeta> defaults) {
public NameTagEntity(@NotNull Entity entity) {
this.bukkitEntity = entity;
this.passenger = new WrapperEntity(EntityTypes.TEXT_DISPLAY);

this.passenger.consumeEntityMeta(TextDisplayMeta.class, (meta) -> defaults.accept(entity, meta));

initialize();
}

Expand All @@ -45,6 +44,10 @@ public void initialize() {
}
}

public @NotNull TraitHolder getTraits() {
return traits;
}

public void modify(Consumer<TextDisplayMeta> consumer) {
this.passenger.consumeEntityMeta(TextDisplayMeta.class, consumer);
}
Expand Down Expand Up @@ -81,4 +84,9 @@ public PacketWrapper<?> getPassengersPacket() {

return location;
}

public void destroy() {
this.passenger.despawn();
this.getTraits().destroy();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.mattmx.nametags.entity;

import com.github.retrooper.packetevents.util.Vector3f;
import com.mattmx.nametags.event.NameTagEntityCreateEvent;
import me.tofaa.entitylib.meta.display.AbstractDisplayMeta;
import me.tofaa.entitylib.meta.display.TextDisplayMeta;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -22,7 +24,15 @@ public class NameTagEntityManager {
};

public @NotNull NameTagEntity getOrCreateNameTagEntity(@NotNull Entity entity) {
return entityMap.computeIfAbsent(entity.getUniqueId(), (k) -> new NameTagEntity(entity, defaultProvider));
return entityMap.computeIfAbsent(entity.getUniqueId(), (k) -> {
NameTagEntity newEntity = new NameTagEntity(entity);

newEntity.getPassenger().consumeEntityMeta(TextDisplayMeta.class, (meta) -> defaultProvider.accept(entity, meta));

Bukkit.getPluginManager().callEvent(new NameTagEntityCreateEvent(newEntity));

return newEntity;
});
}

public @Nullable NameTagEntity removeEntity(@NotNull Entity entity) {
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/com/mattmx/nametags/entity/TestImplTrait.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.mattmx.nametags.entity;

import com.mattmx.nametags.NameTags;
import com.mattmx.nametags.entity.trait.Trait;
import com.mattmx.nametags.event.NameTagEntityCreateEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;

public class TestImplTrait implements Listener {

@EventHandler
public void onNameTagCreate(@NotNull NameTagEntityCreateEvent event) {
event.getNameTag()
.getTraits()
.getOrAddTrait(RefreshTrait.class, RefreshTrait::new);
}

static class RefreshTrait extends Trait {
private int i = 0;
private boolean cancel = false;
private final @NotNull BukkitTask task = Bukkit.getScheduler()
.runTaskTimerAsynchronously(NameTags.getInstance(), () -> {
if (cancel) return;

getTag().modify((meta) -> {
meta.setText(getTag().getBukkitEntity()
.name()
.color(i++ % 2 == 0 ? NamedTextColor.RED : NamedTextColor.GREEN));
});

}, 0L, 20L);

@Override
public void onDestroy() {
cancel = true;
task.cancel();
}
}

}
23 changes: 23 additions & 0 deletions src/main/java/com/mattmx/nametags/entity/trait/Trait.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.mattmx.nametags.entity.trait;

import com.mattmx.nametags.entity.NameTagEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public abstract class Trait {
private @Nullable NameTagEntity nameTag;

public void setNameTag(@NotNull NameTagEntity tag) {
this.nameTag = tag;
}

public @NotNull NameTagEntity getTag() {
assert nameTag != null;
return nameTag;
}

public void onDestroy() {

}

}
55 changes: 55 additions & 0 deletions src/main/java/com/mattmx/nametags/entity/trait/TraitHolder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.mattmx.nametags.entity.trait;

import com.mattmx.nametags.entity.NameTagEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.function.Supplier;

public class TraitHolder {
private final @NotNull NameTagEntity owner;
private final @NotNull HashMap<Class<?>, Trait> map = new HashMap<>();

public TraitHolder(@NotNull NameTagEntity owner) {
this.owner = owner;
}

@SuppressWarnings("unchecked")
public <T extends Trait> @Nullable T getTrait(@NotNull Class<T> traitClazz) {
Trait trait = map.get(traitClazz);

if (trait != null) {
return (T) trait;
}
return null;
}

@SuppressWarnings("unchecked")
public <T extends Trait> @NotNull T getOrAddTrait(@NotNull Class<T> traitClazz, @NotNull Supplier<T> supplier) {
return (T) map.computeIfAbsent(traitClazz, (k) -> {
T trait = supplier.get();
trait.setNameTag(owner);
return trait;
});
}

@SuppressWarnings("unchecked")
public <T extends Trait> @Nullable T removeTrait(@NotNull Class<T> traitClazz) {
Trait trait = map.remove(traitClazz);

if (trait != null) {
trait.onDestroy();
return (T) trait;
}

return null;
}

public void destroy() {
for (Trait trait : map.values()) {
trait.onDestroy();
}
map.clear();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.mattmx.nametags.event;

import com.mattmx.nametags.entity.NameTagEntity;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

public class NameTagEntityCreateEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private final @NotNull NameTagEntity nameTag;

public NameTagEntityCreateEvent(@NotNull NameTagEntity nameTag) {
this.nameTag = nameTag;
}

public @NotNull NameTagEntity getNameTag() {
return nameTag;
}

public static HandlerList getHandlerList() {
return handlers;
}

@Override
public @NotNull HandlerList getHandlers() {
return getHandlerList();
}
}
2 changes: 1 addition & 1 deletion src/main/resources/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Should the player see their own tag?
show-self: true
show-self: false

shift:
# Should we modify the opacity of the tag's background when the player shifts?
Expand Down

0 comments on commit 98bb44c

Please sign in to comment.