Skip to content

Commit

Permalink
🔥 Working example.
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt-MX committed Sep 11, 2024
1 parent 07a0e23 commit 2e07f7a
Show file tree
Hide file tree
Showing 13 changed files with 390 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
run/

### IntelliJ IDEA ###
.idea/modules.xml
Expand Down
124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 8 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import java.io.BufferedReader
import java.io.InputStreamReader

plugins {
id("java")
alias(libs.plugins.runPaper)
alias(libs.plugins.paperweight) apply true
alias(libs.plugins.kotlinJvm) apply true
alias(libs.plugins.shadow) apply true

`maven-publish`
Expand All @@ -23,13 +23,16 @@ repositories {
maven("https://repo.dmulloy2.net/repository/public/")
maven("https://jitpack.io")
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
maven("https://repo.codemc.io/repository/maven-releases/")
maven("https://maven.evokegames.gg/snapshots")
}

dependencies {
paperweight.paperDevBundle(libs.versions.paperApi.get())

compileOnly(libs.ktgui)
compileOnly(libs.placeholder.api)
compileOnly(libs.packet.events)
implementation(libs.entity.lib)
}

tasks {
Expand Down Expand Up @@ -82,9 +85,9 @@ java {
withSourcesJar()
}

kotlin {
jvmToolchain(17)
}
//kotlin {
// jvmToolchain(21)
//}

sourceSets["main"].resources.srcDir("src/resources/")

Expand Down
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ kotlin.code.style=official

# Project configuration
group_name = com.mattmx
id = template
id = nametags
version = 1.0

plugin_name = Template
plugin_main_class_name = TemplatePlugin
plugin_name = NameTags
plugin_main_class_name = NameTags
plugin_author = MattMX

include_commit_hash = true
5 changes: 5 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,18 @@ placeholderapi = "2.11.6"
ktgui = "2.4.2-alpha"
runPaper = "2.2.4"

packetEvents = "2.4.0"
entityLib = "2.4.9-SNAPSHOT"

[libraries]

kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
paper-api = { module = "io.papermc.paper:paper-api", version.ref = "paperApi" }
placeholder-api = { module = "me.clip:placeholderapi", version.ref = "placeholderapi" }
ktgui = { module = "com.mattmx:ktgui", version.ref = "ktgui" }
packet-events = { module = "com.github.retrooper:packetevents-spigot", version.ref = "packetEvents" }
entity-lib = { module = "me.tofaa.entitylib:spigot", version.ref = "entityLib" }

[plugins]

Expand Down
Binary file added run/plugins/packetevents-spigot-2.4.0 (3).jar
Binary file not shown.
45 changes: 45 additions & 0 deletions src/main/java/com/mattmx/nametags/EventsListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.jetbrains.annotations.NotNull;

public class EventsListener implements Listener {

@EventHandler
public void onPlayerJoin(@NotNull PlayerJoinEvent event) {
NameTagEntity nameTagEntity = NameTags.getInstance()
.getEntityManager()
.getOrCreateNameTagEntity(event.getPlayer());
}

@EventHandler
public void onPlayerQuit(@NotNull PlayerQuitEvent event) {
NameTagEntity entity = NameTags.getInstance()
.getEntityManager()
.removeEntity(event.getPlayer());

if (entity == null) return;

entity.getPassenger().despawn();
}

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

if (nameTagEntity == null) return;

Location newLocation = SpigotConversionUtil.fromBukkitLocation(event.getPlayer().getLocation());

nameTagEntity.getPassenger().setLocation(newLocation);
}
}
51 changes: 51 additions & 0 deletions src/main/java/com/mattmx/nametags/NameTags.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.mattmx.nametags;

import com.github.retrooper.packetevents.PacketEvents;
import com.mattmx.nametags.entity.NameTagEntityManager;
import me.tofaa.entitylib.APIConfig;
import me.tofaa.entitylib.EntityLib;
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class NameTags extends JavaPlugin {
private static @Nullable NameTags instance;

private NameTagEntityManager entityManager;
private final EventsListener eventsListener = new EventsListener();
private final OutgoingPacketListener packetListener = new OutgoingPacketListener(this);

@Override
public void onEnable() {
instance = this;
entityManager = new NameTagEntityManager();

SpigotEntityLibPlatform platform = new SpigotEntityLibPlatform(this);
APIConfig settings = new APIConfig(PacketEvents.getAPI())
.debugMode()
.tickTickables()
.trackPlatformEntities()
.usePlatformLogger();

EntityLib.init(platform, settings);

PacketEvents.getAPI()
.getEventManager()
.registerListener(packetListener);

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

public @NotNull NameTagEntityManager getEntityManager() {
return this.entityManager;
}

public static @NotNull NameTags getInstance() {
if (instance == null)
throw new RuntimeException("NameTags plugin has not initialized yet! Did you forget to depend?");

return instance;
}
}
53 changes: 53 additions & 0 deletions src/main/java/com/mattmx/nametags/OutgoingPacketListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.mattmx.nametags;

import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
import com.mattmx.nametags.entity.NameTagEntity;
import org.jetbrains.annotations.NotNull;

public class OutgoingPacketListener extends PacketListenerAbstract {

private NameTags plugin;

public OutgoingPacketListener(NameTags plugin) {
this.plugin = plugin;
}

@Override
public void onPacketSend(@NotNull PacketSendEvent event) {
switch (event.getPacketType()) {
case PacketType.Play.Server.SPAWN_ENTITY -> {
WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity(event);

if (packet.getUUID().isEmpty()) return;

NameTagEntity nameTagEntity = plugin.getEntityManager().getNameTagEntityByUUID(packet.getUUID().get());

if (nameTagEntity == null) return;

// Add passenger and send to player (Delayed so this packet sends first)
event.getTasksAfterSend().add(() -> {
nameTagEntity.getPassenger().removeViewer(event.getUser());
nameTagEntity.getPassenger().addViewer(event.getUser());
event.getUser().sendPacket(nameTagEntity.getPassengersPacket());
});
}
case PacketType.Play.Server.DESTROY_ENTITIES -> {
WrapperPlayServerDestroyEntities packet = new WrapperPlayServerDestroyEntities(event);

for (int entityId : packet.getEntityIds()) {
NameTagEntity nameTagEntity = plugin.getEntityManager().getNameTagEntityById(entityId);

if (nameTagEntity == null) continue;

nameTagEntity.getPassenger().removeViewer(event.getUser());
}
}
default -> {
}
}
}
}
Loading

0 comments on commit 2e07f7a

Please sign in to comment.