Skip to content

Commit 36baa59

Browse files
committed
✨ feat(nms): unify BlockGlowingData class for multiple NMS versions
- rename V1_21_11BlockGlowingData and V26_1BlockGlowingData to BlockGlowingData - update references to use the unified BlockGlowingData class - change BlockPlayerData to use ConcurrentHashMap for blocks - refactor NmsProvider to support multiple NMS versions
1 parent 72e23a3 commit 36baa59

30 files changed

Lines changed: 152 additions & 163 deletions

build.gradle.kts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
import dev.slne.surf.api.generator.nms.NmsVersion
12
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmExtension
23

34
plugins {
45
id("io.papermc.paperweight.userdev") version "2.0.0-beta.21" apply false
56
id("dev.slne.surf.api.generator.nms-module-generator")
67
}
78

8-
//nmsGenerator {
9-
// referenceVersion = NmsVersion.V26_1
10-
// targetVersion = NmsVersion.V1_21_11
11-
//}
9+
nmsGenerator {
10+
referenceVersion = NmsVersion.V1_21_11
11+
targetVersion = NmsVersion.V26_1
12+
}
1213

1314

1415
allprojects {

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ include(":surf-api-core:surf-api-core-server")
1919

2020
include(":surf-api-paper:surf-api-paper")
2121
include(":surf-api-paper:surf-api-paper-nms:surf-api-paper-nms-common")
22-
include(":surf-api-paper:surf-api-paper-nms:surf-api-paper-nms-v26-1")
2322
include(":surf-api-paper:surf-api-paper-nms:surf-api-paper-nms-v1-21-11")
23+
include(":surf-api-paper:surf-api-paper-nms:surf-api-paper-nms-v26-1")
2424
include(":surf-api-paper:surf-api-paper-server")
2525

2626
include(":surf-api-velocity:surf-api-velocity")

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-common/src/main/kotlin/dev/slne/surf/api/paper/nms/common/NmsProvider.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dev.slne.surf.api.paper.nms.common
22

3+
import dev.slne.surf.api.core.util.logger
34
import dev.slne.surf.api.paper.glow.SurfGlowingApi
5+
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
46
import dev.slne.surf.api.paper.nms.SurfPaperNmsBridge
57
import dev.slne.surf.api.paper.nms.bridges.*
68
import dev.slne.surf.api.paper.nms.bridges.packets.SurfPaperNmsPacketBridges
@@ -21,6 +23,7 @@ import java.util.*
2123
*
2224
* Implementations are discovered at runtime using [java.util.ServiceLoader].
2325
*/
26+
@NmsUseWithCaution
2427
interface NmsProvider {
2528
/**
2629
* The NMS version this provider supports.
@@ -90,7 +93,7 @@ interface NmsProvider {
9093
fun shutdown()
9194

9295
companion object {
93-
private val log = dev.slne.surf.api.core.util.logger()
96+
private val log = logger()
9497

9598
/**
9699
* Loads the [NmsProvider] for the currently running Minecraft version.
@@ -99,11 +102,19 @@ interface NmsProvider {
99102
*/
100103
val current: NmsProvider by lazy {
101104
val version = NmsVersion.current
102-
val providers = ServiceLoader.load(
103-
NmsProvider::class.java,
104-
NmsProvider::class.java.classLoader
105-
)
106-
.toList() // TODO: Bug: Finds only a single provider, even if multiple are present. The Provider which is declared as a dependency first is found.
105+
val loader = ServiceLoader.load(NmsProvider::class.java)
106+
val providers = mutableListOf<NmsProvider>()
107+
108+
val iterator = loader.iterator()
109+
while (iterator.hasNext()) {
110+
val instance: NmsProvider?
111+
try {
112+
instance = iterator.next()
113+
} catch (_: ServiceConfigurationError) {
114+
continue
115+
}
116+
providers.add(instance)
117+
}
107118

108119
log.atInfo().log("Looking for NmsProvider with version: %s", version)
109120
log.atInfo().log(

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/V1_21_11NmsProvider.kt

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.slne.surf.api.paper.server.nms.v1_21_11
22

33
import com.google.auto.service.AutoService
44
import dev.slne.surf.api.paper.glow.SurfGlowingApi
5+
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
56
import dev.slne.surf.api.paper.nms.SurfPaperNmsBridge
67
import dev.slne.surf.api.paper.nms.bridges.*
78
import dev.slne.surf.api.paper.nms.bridges.packets.SurfPaperNmsPacketBridges
@@ -27,15 +28,12 @@ import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.lore.V1_21_11PacketLor
2728
import dev.slne.surf.api.paper.server.nms.v1_21_11.packet.lore.V1_21_11PacketLoreRegistry
2829
import dev.slne.surf.api.paper.server.nms.v1_21_11.reflection.V1_21_11Reflection
2930
import dev.slne.surf.api.paper.server.nms.v1_21_11.region.V1_21_11TickThreadGuard
30-
import org.bukkit.plugin.java.JavaPlugin
3131

32+
@OptIn(NmsUseWithCaution::class)
3233
@AutoService(NmsProvider::class)
3334
class V1_21_11NmsProvider : NmsProvider {
3435
override val version: NmsVersion = NmsVersion.V1_21_11
3536

36-
private var glowingBridge: V1_21_11SurfPaperNmsGlowingBridgeImpl? = null
37-
private var glowingApi: V1_21_11SurfGlowingApiImpl? = null
38-
3937
override fun createNmsBridge(): SurfPaperNmsBridge = V1_21_11SurfPaperNmsBridgeImpl()
4038
override fun createCommonBridge(): SurfPaperNmsCommonBridge =
4139
V1_21_11SurfPaperNmsCommonBridgeImpl()
@@ -45,12 +43,7 @@ class V1_21_11NmsProvider : NmsProvider {
4543

4644
override fun createItemBridge(): SurfPaperNmsItemBridge = V1_21_11SurfPaperNmsItemBridgeImpl()
4745
override fun createNbtBridge(): SurfPaperNmsNbtBridge = V1_21_11SurfPaperNmsNbtBridgeImpl()
48-
override fun createGlowingBridge(): SurfPaperNmsGlowingBridge {
49-
return glowingBridge ?: V1_21_11SurfPaperNmsGlowingBridgeImpl().also {
50-
glowingBridge = it
51-
V1_21_11SurfPaperNmsGlowingBridgeImpl.INSTANCE = it
52-
}
53-
}
46+
override fun createGlowingBridge(): SurfPaperNmsGlowingBridge = V1_21_11SurfPaperNmsGlowingBridgeImpl
5447

5548
override fun createStatsBridge(): SurfPaperNmsStatsBridge =
5649
V1_21_11SurfPaperNmsStatsBridgeImpl()
@@ -87,16 +80,7 @@ class V1_21_11NmsProvider : NmsProvider {
8780
override fun createGlowingLifecycleHandler(): GlowingLifecycleHandler =
8881
V1_21_11GlowingLifecycleHandler()
8982

90-
override fun createGlowingApi(): SurfGlowingApi {
91-
// Ensure glowing bridge is initialized before the API uses it
92-
createGlowingBridge()
93-
94-
val plugin = JavaPlugin.getProvidingPlugin(V1_21_11NmsProvider::class.java) as JavaPlugin
95-
val api = V1_21_11SurfGlowingApiImpl(plugin)
96-
V1_21_11SurfGlowingApiImpl.INSTANCE = api
97-
glowingApi = api
98-
return api
99-
}
83+
override fun createGlowingApi(): SurfGlowingApi = V1_21_11SurfGlowingApiImpl
10084

10185
override fun createPacketListeners(): List<PacketListener> = listOf(
10286
V1_21_11PacketLoreListener,

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsBridgeImpl.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@ import dev.slne.surf.api.paper.nms.SurfPaperNmsBridge
99
import dev.slne.surf.api.paper.nms.listener.packets.clientbound.NmsClientboundPacket
1010
import dev.slne.surf.api.paper.nms.listener.packets.serverbound.NmsServerboundPacket
1111
import dev.slne.surf.api.paper.packet.listener.listener.PacketListenerResult
12-
import dev.slne.surf.api.paper.server.nms.v1_21_11.listener.packets.V1_21_11NmsPacketImpl
1312
import org.bukkit.entity.Player
1413
import java.util.concurrent.ConcurrentHashMap
1514
import java.util.concurrent.CopyOnWriteArraySet
1615

1716
@NmsUseWithCaution
1817
class V1_21_11SurfPaperNmsBridgeImpl : SurfPaperNmsBridge {
18+
private typealias PacketListenerMap<T> = ConcurrentHashMap<Class<*>, CopyOnWriteArraySet<T>>
19+
1920
private val log = logger()
2021

21-
private val serverboundPacketListeners =
22-
ConcurrentHashMap<Class<*>, CopyOnWriteArraySet<NmsServerboundPacketListener<*>>>()
23-
private val clientboundPacketListeners =
24-
ConcurrentHashMap<Class<*>, CopyOnWriteArraySet<NmsClientboundPacketListener<*>>>()
22+
private val serverboundPacketListeners = PacketListenerMap<NmsServerboundPacketListener<*>>()
23+
private val clientboundPacketListeners = PacketListenerMap<NmsClientboundPacketListener<*>>()
2524

2625
override fun registerServerboundPacketListener(listener: NmsServerboundPacketListener<*>) {
2726
val packetClass = listener.packetClass

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/bridges/V1_21_11SurfPaperNmsGlowingBridgeImpl.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import net.minecraft.network.syncher.SynchedEntityData.DataValue
1414
import org.bukkit.entity.Entity
1515

1616
@NmsUseWithCaution
17-
class V1_21_11SurfPaperNmsGlowingBridgeImpl : SurfPaperNmsGlowingBridge {
17+
object V1_21_11SurfPaperNmsGlowingBridgeImpl : SurfPaperNmsGlowingBridge {
1818
fun createTeam(data: V1_21_11TeamData): PacketOperation =
1919
V1_21_11PacketOperationImpl.simple {
2020
ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(data.team, true)
@@ -53,9 +53,4 @@ class V1_21_11SurfPaperNmsGlowingBridgeImpl : SurfPaperNmsGlowingBridge {
5353
val dataAccessor = V1_21_11Reflection.ENTITY_PROXY.getDataFlagsSharedId()
5454
return entity.toNms().entityData.get(dataAccessor)
5555
}
56-
57-
companion object {
58-
lateinit var INSTANCE: V1_21_11SurfPaperNmsGlowingBridgeImpl
59-
internal set
60-
}
6156
}

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/glow/V1_21_11GlowingLifecycleHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package dev.slne.surf.api.paper.server.nms.v1_21_11.glow
22

3+
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
34
import dev.slne.surf.api.paper.nms.bridges.packets.PacketOperation
45
import dev.slne.surf.api.paper.nms.common.GlowingLifecycleHandler
56
import dev.slne.surf.api.paper.util.chunkX
67
import dev.slne.surf.api.paper.util.chunkZ
78
import org.bukkit.World
89
import org.bukkit.entity.Player
910

11+
@NmsUseWithCaution
1012
class V1_21_11GlowingLifecycleHandler : GlowingLifecycleHandler {
1113
override fun removeAllGlowingOnQuit(player: Player) {
1214
V1_21_11SurfGlowingApiImpl.removeAllGlowingOnQuit(player)

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/glow/V1_21_11SurfGlowingApiImpl.kt

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import dev.slne.surf.api.paper.glow.SurfGlowingApi
77
import dev.slne.surf.api.paper.nms.NmsUseWithCaution
88
import dev.slne.surf.api.paper.nms.bridges.packets.PacketOperation
99
import dev.slne.surf.api.paper.server.nms.v1_21_11.bridges.V1_21_11SurfPaperNmsGlowingBridgeImpl
10-
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.block.V1_21_11BlockGlowingData
10+
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.block.BlockGlowingData
1111
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.block.BlockPlayerData
1212
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.entity.EntityGlowingData
1313
import dev.slne.surf.api.paper.server.nms.v1_21_11.glow.entity.EntityPlayerData
@@ -24,7 +24,11 @@ import java.util.*
2424
import java.util.concurrent.ConcurrentHashMap
2525

2626
@NmsUseWithCaution
27-
class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingApi {
27+
object V1_21_11SurfGlowingApiImpl : SurfGlowingApi {
28+
private val entityPlayerData = ConcurrentHashMap<UUID, EntityPlayerData>()
29+
private val blockPlayerData = ConcurrentHashMap<UUID, BlockPlayerData>()
30+
31+
val glowingFlag = 1 shl V1_21_11Reflection.ENTITY_PROXY.getFlagGlowing()
2832

2933
override fun makeGlowing(
3034
target: Entity,
@@ -36,7 +40,7 @@ class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingAp
3640
teamIdFor(target),
3741
viewer,
3842
color,
39-
V1_21_11SurfPaperNmsGlowingBridgeImpl.INSTANCE.getCurrentFlags(target)
43+
V1_21_11SurfPaperNmsGlowingBridgeImpl.getCurrentFlags(target)
4044
)
4145
}
4246

@@ -50,7 +54,7 @@ class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingAp
5054
val nmsColor = color?.let { PaperAdventure.asVanilla(it) }
5155
val uuid = viewer.uniqueId
5256
val playerData = entityPlayerData.computeIfAbsent(uuid) { EntityPlayerData(uuid) }
53-
val glowingData = playerData.entities.get(targetId)
57+
val glowingData = playerData.entities[targetId]
5458
val operation = PacketOperation.start()
5559

5660
if (glowingData == null) {
@@ -61,7 +65,7 @@ class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingAp
6165
nmsColor,
6266
otherFlags
6367
)
64-
playerData.entities.put(targetId, newData)
68+
playerData.entities[targetId] = newData
6569

6670
operation.add(newData.sendGlowingFlag(enabled = true, ignorePacket = true))
6771
if (nmsColor != null) {
@@ -95,9 +99,10 @@ class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingAp
9599
val blockData = playerData.blocks[blockLocation]
96100

97101
if (blockData == null) {
98-
val newData = V1_21_11BlockGlowingData(playerData, blockLocation, color)
102+
val newData = BlockGlowingData(playerData, blockLocation, color)
99103
playerData.blocks[blockLocation] = newData
100104

105+
val plugin = JavaPlugin.getProvidingPlugin(javaClass)
101106
plugin.launch(plugin.entityDispatcher(viewer)) {
102107
if (viewer.isChunkVisible(blockLocation)) {
103108
newData.spawn().execute(viewer)
@@ -148,26 +153,17 @@ class V1_21_11SurfGlowingApiImpl(private val plugin: JavaPlugin) : SurfGlowingAp
148153

149154
private fun teamIdFor(entity: Entity) = (entity as? Player)?.name ?: entity.uniqueId.toString()
150155

151-
companion object {
152-
lateinit var INSTANCE: V1_21_11SurfGlowingApiImpl
153-
internal set
154-
155-
private val entityPlayerData = ConcurrentHashMap<UUID, EntityPlayerData>()
156-
private val blockPlayerData = ConcurrentHashMap<UUID, BlockPlayerData>()
157156

158-
val glowingFlag = 1 shl V1_21_11Reflection.ENTITY_PROXY.getFlagGlowing()
157+
fun getEntityPlayerData(player: Player): EntityPlayerData? =
158+
entityPlayerData[player.uniqueId]
159159

160-
fun getEntityPlayerData(player: Player): EntityPlayerData? =
161-
entityPlayerData[player.uniqueId]
160+
fun getBlockPlayerData(player: Player): BlockPlayerData? =
161+
blockPlayerData[player.uniqueId]
162162

163-
fun getBlockPlayerData(player: Player): BlockPlayerData? =
164-
blockPlayerData[player.uniqueId]
165-
166-
fun removeAllGlowingOnQuit(player: Player) {
167-
val uuid = player.uniqueId
168-
V1_21_11TeamData.removeFromAll(uuid)
169-
entityPlayerData.remove(uuid)?.entities?.clear()
170-
blockPlayerData.remove(uuid)?.blocks?.clear()
171-
}
163+
fun removeAllGlowingOnQuit(player: Player) {
164+
val uuid = player.uniqueId
165+
V1_21_11TeamData.removeFromAll(uuid)
166+
entityPlayerData.remove(uuid)?.entities?.clear()
167+
blockPlayerData.remove(uuid)?.blocks?.clear()
172168
}
173169
}

surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/glow/block/V1_21_11BlockGlowingData.kt renamed to surf-api-paper/surf-api-paper-nms/surf-api-paper-nms-v1-21-11/src/main/kotlin/dev/slne/surf/api/paper/server/nms/v1_21_11/glow/block/BlockGlowingData.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import org.bukkit.Location
1717
import java.util.*
1818

1919
@OptIn(NmsUseWithCaution::class)
20-
class V1_21_11BlockGlowingData(
20+
class BlockGlowingData(
2121
val playerData: BlockPlayerData,
2222
val location: Location,
2323
var color: NamedTextColor,
@@ -45,16 +45,15 @@ class V1_21_11BlockGlowingData(
4545
0.0
4646
)
4747
}
48-
val invisibleOperation = V1_21_11SurfPaperNmsGlowingBridgeImpl.INSTANCE
49-
.setEntityFlags(entityId, invisibleFlag)
50-
48+
val invisibleOperation = V1_21_11SurfPaperNmsGlowingBridgeImpl.setEntityFlags(entityId, invisibleFlag)
49+
5150
return spawnOperation + invisibleOperation
5251
}
5352

5453

5554
fun updateColor() {
5655
val player = playerData.player ?: return
57-
V1_21_11SurfGlowingApiImpl.INSTANCE.makeGlowing(
56+
V1_21_11SurfGlowingApiImpl.makeGlowing(
5857
entityId,
5958
uuid.toString(),
6059
player,
@@ -65,7 +64,7 @@ class V1_21_11BlockGlowingData(
6564

6665
fun remove() {
6766
playerData.player?.let { SurfPaperNmsSpawnPackets.despawn(entityId).execute(it) }
68-
V1_21_11SurfGlowingApiImpl.INSTANCE.removeGlowing(entityId, playerData.uuid)
67+
V1_21_11SurfGlowingApiImpl.removeGlowing(entityId, playerData.uuid)
6968
}
7069

7170
private fun initialize() {
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package dev.slne.surf.api.paper.server.nms.v1_21_11.glow.block
22

3-
import dev.slne.surf.api.core.util.mutableObject2ObjectMapOf
43
import dev.slne.surf.api.paper.extensions.server
54
import org.bukkit.Location
65
import java.util.*
6+
import java.util.concurrent.ConcurrentHashMap
77

88
class BlockPlayerData(val uuid: UUID) {
9-
val blocks = mutableObject2ObjectMapOf<Location, V1_21_11BlockGlowingData>()
9+
val blocks = ConcurrentHashMap<Location, BlockGlowingData>()
1010
val player get() = server.getPlayer(uuid)
1111
}

0 commit comments

Comments
 (0)