@@ -4,6 +4,11 @@ import cc.modlabs.kpaper.extensions.timer
44import dev.fruxz.stacked.text
55import net.kyori.adventure.text.Component
66import cc.modlabs.kpaper.main.PluginInstance
7+ import cc.modlabs.kpaper.util.getLogger
8+ import com.github.retrooper.packetevents.PacketEvents
9+ import com.github.retrooper.packetevents.protocol.entity.data.EntityData
10+ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes
11+ import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata
712import org.bukkit.Bukkit
813import org.bukkit.Location
914import org.bukkit.Material
@@ -17,6 +22,8 @@ import org.bukkit.inventory.ItemStack
1722import org.bukkit.inventory.MainHand
1823import org.bukkit.scheduler.BukkitTask
1924import org.bukkit.util.Vector
25+ import java.util.ArrayList
26+ import java.util.Optional
2027import java.util.UUID
2128import kotlin.math.atan2
2229
@@ -67,6 +74,9 @@ class NPCImpl(
6774 private var nearbyFollowCheckInterval = 10L // Ticks between checking for nearby players (0.5 seconds - more responsive)
6875 private var aiMonitoringTask: BukkitTask ? = null // Task to continuously monitor and re-enable AI
6976
77+ private val api = PacketEvents .getAPI()
78+ private val playerManager = api.playerManager
79+
7080 // Visibility state
7181 // null = visible to all players, non-null = only visible to players in the set
7282 private var visibleToPlayers: MutableSet <Player >? = null
@@ -1501,6 +1511,32 @@ class NPCImpl(
15011511 player.hideEntity(PluginInstance , entity)
15021512 }
15031513
1514+ override fun overrideCustomName (customName : String , viewer : Player ) {
1515+ val metadataList = ArrayList <EntityData <* >>()
1516+
1517+ val entity = this .getEntity() ? : return
1518+
1519+ val component = Component .text(customName)
1520+
1521+ metadataList.add(EntityData (2 , EntityDataTypes .OPTIONAL_ADV_COMPONENT , Optional .of(component)))
1522+
1523+ val customNamePacket = WrapperPlayServerEntityMetadata (entity.entityId, metadataList)
1524+ playerManager.sendPacket(viewer, customNamePacket)
1525+ }
1526+
1527+ override fun overrideDescription (description : String , viewer : Player ) {
1528+ val metadataList = ArrayList <EntityData <* >>()
1529+
1530+ val entity = this .getEntity() ? : return
1531+
1532+ val component = Component .text(description)
1533+
1534+ metadataList.add(EntityData (19 , EntityDataTypes .OPTIONAL_ADV_COMPONENT , Optional .of(component)))
1535+
1536+ val customNamePacket = WrapperPlayServerEntityMetadata (entity.entityId, metadataList)
1537+ playerManager.sendPacket(viewer, customNamePacket)
1538+ }
1539+
15041540 override fun getVisiblePlayers (): Set <Player >? {
15051541 return visibleToPlayers?.toSet()
15061542 }
0 commit comments