From b348895bf0173eb3cbb860ef08e557601ac376e0 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:03:43 +0200 Subject: [PATCH 01/15] Add external event configuration options --- src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt b/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt index a3866d5..52962c8 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt @@ -11,6 +11,9 @@ data class LobbyConfig( val survivalServerName: String = "survival", val lobbyCategory: String = "lobby", val spawnPoint: LocationConfig = LocationConfig.default(), + val externalEventEnabled: Boolean = false, + val externalEventReplacesDefault: Boolean = false, + val externalEventTeleportLocation: LocationConfig = LocationConfig.default() ) { @ConfigSerializable data class LocationConfig( @@ -39,4 +42,4 @@ data class LobbyConfig( ) } } -} \ No newline at end of file +} From 400499be3b45418606f88c02e13692513db21b17 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:19:35 +0200 Subject: [PATCH 02/15] Add external event check before player teleport Add condition to check external event configuration before teleporting player. --- .../slne/surf/lobby/inventory/impl/NavigatorInventory.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index 4a87288..bfc1bca 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -67,6 +67,13 @@ object NavigatorInventory : View() { render.layoutSlot('E').withItem(eventServerItem).onClick { click -> val player = click.player + + if(lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { + + + return@onClick + } + player.teleportAsync(Locations.EVENT_TELEPORT.getLocation()).thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) @@ -313,4 +320,4 @@ private val eventServerItem } } } - } \ No newline at end of file + } From 0f988d02fa8b04c03b37c2e73e5e4f58ac839bd5 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:22:31 +0200 Subject: [PATCH 03/15] Add teleport and sound effects on event click --- .../slne/surf/lobby/inventory/impl/NavigatorInventory.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index bfc1bca..ba95999 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -69,8 +69,13 @@ object NavigatorInventory : View() { val player = click.player if(lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { - - + player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()).thenRun { + player.playSound(true) { + type(Sound.ENTITY_ENDERMAN_TELEPORT) + pitch(2.0f) + } + } + player.closeInventory() return@onClick } From f005b3f76dc120db73f757059ae0c5208473629f Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:36:13 +0200 Subject: [PATCH 04/15] Implement external event handling for NPC interactions Added external event handling for NPC interactions, allowing teleportation to a specified location if enabled. --- .../kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index 00557dd..f763cb1 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -155,6 +155,16 @@ object SurfNpcHook { withEventHandler { val player = it.player + if(lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { + player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()).thenRun { + player.playSound(true) { + type(Sound.ENTITY_ENDERMAN_TELEPORT) + pitch(2.0f) + } + } + return@withEventHandler + } + player.teleportAsync(Locations.EVENT_TELEPORT.getLocation()).thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) From bc0e221a31b8f953fd0709a3aebf54f4fd084d97 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:54:01 +0200 Subject: [PATCH 05/15] Remove surf-hologram-paper from dependencies Removed 'surf-hologram-paper' from server dependencies. --- build.gradle.kts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ae2b356..ca808ad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,6 @@ surfPaperPluginApi { serverDependencies { registerSoft("surf-npc-paper") - registerSoft("surf-hologram-paper") registerSoft("surf-parkour-paper") registerSoft("Nexo") registerSoft("surf-trophy-paper") @@ -44,4 +43,4 @@ surfPaperPluginApi { registerSoft("surf-settings-paper") registerRequired("surf-queue-paper") } -} \ No newline at end of file +} From d4baf82b8896737e390b933367eee18202080103 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:55:11 +0200 Subject: [PATCH 06/15] Update Nexo dependency version to 1.24.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index ca808ad..df5093d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { dependencies { compileOnly("dev.slne.surf.npc:surf-npc-api:+") - compileOnly("com.nexomc:nexo:1.16.1") + compileOnly("com.nexomc:nexo:1.24.0") implementation("dev.slne.surf.event:surf-event-base-api-common:+") implementation("dev.slne.surf.tab:surf-tab-api:+") compileOnly("dev.slne.surf.parkour:surf-parkour-api:+") From 2fe6e966d40ac2300d490f3afd8ffae7b1f7f043 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:04:41 +0200 Subject: [PATCH 07/15] Update NPC display names to use 'CASTSMP' --- src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index f763cb1..f49b113 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -53,7 +53,7 @@ object SurfNpcHook { private fun createSurvivalNpc() { survivalNpc = npc { displayName = { - note("Nepomuk".toSmallCaps()).decorate(TextDecoration.BOLD) + note("CASTSMP".toSmallCaps()).decorate(TextDecoration.BOLD) appendNewline() spacer("26.1.2+") } @@ -119,7 +119,7 @@ object SurfNpcHook { private fun createSpawnSurvivalNpc() { spawnSurvivalNpc = npc { displayName = { - note("Survival".toSmallCaps(), TextDecoration.BOLD) + note("CASTSMP".toSmallCaps(), TextDecoration.BOLD) } type = EntityType.MANNEQUIN uniqueName = "spawn_survival" From 75e3b704acdffcbb94a02fe9b06f52afaaa5a43e Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:16:37 +0200 Subject: [PATCH 08/15] Rename Survival Server to CASTSMP in NavigatorInventory --- .../inventory/impl/NavigatorInventory.kt | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index ba95999..0a585bf 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -123,7 +123,7 @@ object NavigatorInventory : View() { private val connectingPlayers = Caffeine.newBuilder().expireAfterWrite(5.minutes).build() -fun lobbySelectorView() = paginatedSurfView("Lobby Auswahl") { +fun lobbySelectorView() = paginatedSurfView("Lobbies") { pagination { lazySource { SurfCoreApi.getServerByCategory(lobbyConfig.lobbyCategory) @@ -257,18 +257,34 @@ private val cosmeticsItem private val survivalServerItem get() = plugin.getInvisibleItem().apply { displayName { - primary("Survival Server") + primary("CASTSMP ") + spacer("(Survival)") } buildLore { emptyLine() + line { + variableValue("Beschreibung".toSmallCaps()) + } + line { + white("Der ") + info("CastSMP") + white(" ist ein ") + } + + line { + info("friedlicher") + white(" Survival Server") + info(" ") + } + line { note("Status:".toSmallCaps()) } line { when (SurfCoreApi.getServerByName(lobbyConfig.survivalServerName)?.state) { - SurfServerState.RUNNING -> success("Der Survival Server ist erreichbar") - else -> error("Der Survival Server ist derzeit nicht erreichbar") + SurfServerState.RUNNING -> success("Der CASTSMP ist erreichbar") + else -> error("Der CASTSMP ist derzeit nicht erreichbar") } } From cfc141df47133cd64d7efe2f2e1422c09d9563db Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:26:30 +0200 Subject: [PATCH 09/15] Fix whitespace in NavigatorInventory.kt text output Adjusted whitespace in text output for better formatting. --- .../surf/lobby/inventory/impl/NavigatorInventory.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index 0a585bf..af1e5fb 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -269,13 +269,20 @@ private val survivalServerItem line { white("Der ") info("CastSMP") - white(" ist ein ") + white(" ist ein") } line { info("friedlicher") - white(" Survival Server") - info(" ") + white(" Survival Server.") + } + + line { + white("Hier kannst du entspannt") + } + line { + info("deine Träume") + white(" verwirklichen.") } line { From 8622502ccb3f947d72509fb450e37946ba2adb55 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft <143264463+TheBjoRedCraft@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:27:53 +0200 Subject: [PATCH 10/15] Update rules URL in NavigatorInventory --- .../dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index af1e5fb..c3b64a6 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -110,8 +110,8 @@ object NavigatorInventory : View() { appendInfoPrefix() info("Das Regelwerk findest du hier: ") append { - variableValue("server.castcrafter.de/rules") - clickOpensUrl("https://server.castcrafter.de/rules") + variableValue("docs.castcrafter.de/rules") + clickOpensUrl("https://docs.castcrafter.de/rules") } } } From c611bc39bf2d63d32aef38ccd20f5ceac5b5bd4d Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft Date: Tue, 23 Jun 2026 14:15:14 +0200 Subject: [PATCH 11/15] fix: fix nexo version + format item --- build.gradle.kts | 4 +- gradle.properties | 2 +- .../slne/surf/lobby/hook/npc/SurfNpcHook.kt | 22 ++++----- .../slne/surf/lobby/hook/trophy/TrophyHook.kt | 4 +- .../inventory/impl/NavigatorInventory.kt | 49 +++++++++---------- 5 files changed, 39 insertions(+), 42 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index df5093d..264d260 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,12 +6,12 @@ plugins { } repositories { - maven("https://repo.nexomc.com/releases") + maven("https://repo.nexomc.com/snapshots") } dependencies { compileOnly("dev.slne.surf.npc:surf-npc-api:+") - compileOnly("com.nexomc:nexo:1.24.0") + compileOnly("com.nexomc:nexo:1.25.0-dev.11") implementation("dev.slne.surf.event:surf-event-base-api-common:+") implementation("dev.slne.surf.tab:surf-tab-api:+") compileOnly("dev.slne.surf.parkour:surf-parkour-api:+") diff --git a/gradle.properties b/gradle.properties index f9d87bf..8453d7c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official kotlin.stdlib.default.dependency=false org.gradle.parallel=true -version=3.1.8 +version=3.1.9 diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index f49b113..b42ca82 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -2,7 +2,6 @@ package dev.slne.surf.lobby.hook.npc import com.github.shynixn.mccoroutine.folia.launch import dev.slne.surf.api.core.font.toSmallCaps -import dev.slne.surf.api.core.messages.adventure.clickOpensUrl import dev.slne.surf.api.core.messages.adventure.playSound import dev.slne.surf.api.core.messages.adventure.sendText import dev.slne.surf.core.api.common.SurfCoreApi @@ -53,7 +52,7 @@ object SurfNpcHook { private fun createSurvivalNpc() { survivalNpc = npc { displayName = { - note("CASTSMP".toSmallCaps()).decorate(TextDecoration.BOLD) + note("CastSMP".toSmallCaps()).decorate(TextDecoration.BOLD) appendNewline() spacer("26.1.2+") } @@ -119,7 +118,7 @@ object SurfNpcHook { private fun createSpawnSurvivalNpc() { spawnSurvivalNpc = npc { displayName = { - note("CASTSMP".toSmallCaps(), TextDecoration.BOLD) + note("CastSMP".toSmallCaps(), TextDecoration.BOLD) } type = EntityType.MANNEQUIN uniqueName = "spawn_survival" @@ -155,14 +154,15 @@ object SurfNpcHook { withEventHandler { val player = it.player - if(lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { - player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()).thenRun { - player.playSound(true) { - type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) - } - } - return@withEventHandler + if (lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { + player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()) + .thenRun { + player.playSound(true) { + type(Sound.ENTITY_ENDERMAN_TELEPORT) + pitch(2.0f) + } + } + return@withEventHandler } player.teleportAsync(Locations.EVENT_TELEPORT.getLocation()).thenRun { diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/trophy/TrophyHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/trophy/TrophyHook.kt index 6b1e640..1375bc6 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/trophy/TrophyHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/trophy/TrophyHook.kt @@ -1,10 +1,10 @@ package dev.slne.surf.lobby.hook.trophy -import dev.slne.surf.trophy.api.surfTrophyApi +import dev.slne.surf.trophy.api.SurfTrophyApi import org.bukkit.entity.Player object TrophyHook { fun openMenu(player: Player) { - surfTrophyApi.showTrophyMenu(player.uniqueId, player.uniqueId) + SurfTrophyApi.showTrophyMenu(player.uniqueId, player.uniqueId) } } \ No newline at end of file diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index c3b64a6..5ff523f 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -7,7 +7,6 @@ import com.github.shynixn.mccoroutine.folia.launch import com.sksamuel.aedile.core.expireAfterWrite import dev.slne.surf.api.core.font.toSmallCaps import dev.slne.surf.api.core.messages.adventure.buildText -import dev.slne.surf.api.core.messages.adventure.clickOpensUrl import dev.slne.surf.api.core.messages.adventure.playSound import dev.slne.surf.api.core.messages.adventure.sendText import dev.slne.surf.api.paper.builder.buildItem @@ -68,17 +67,18 @@ object NavigatorInventory : View() { render.layoutSlot('E').withItem(eventServerItem).onClick { click -> val player = click.player - if(lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { - player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()).thenRun { - player.playSound(true) { - type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) - } - } + if (lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { + player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()) + .thenRun { + player.playSound(true) { + type(Sound.ENTITY_ENDERMAN_TELEPORT) + pitch(2.0f) + } + } player.closeInventory() return@onClick } - + player.teleportAsync(Locations.EVENT_TELEPORT.getLocation()).thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) @@ -257,41 +257,38 @@ private val cosmeticsItem private val survivalServerItem get() = plugin.getInvisibleItem().apply { displayName { - primary("CASTSMP ") + primary("CastSMP ") spacer("(Survival)") } buildLore { emptyLine() line { - variableValue("Beschreibung".toSmallCaps()) + note("Beschreibung:".toSmallCaps()) } line { - white("Der ") - info("CastSMP") - white(" ist ein") + info("Der ") + variableValue("CastSMP") + info(" ist ein") + variableValue("friedlicher") + info(" Survival Server.") } line { - info("friedlicher") - white(" Survival Server.") + info("Hier kannst du entspannt") + variableValue("deine Träume") + info(" verwirklichen.") } - line { - white("Hier kannst du entspannt") - } - line { - info("deine Träume") - white(" verwirklichen.") - } - + emptyLine() + line { note("Status:".toSmallCaps()) } line { when (SurfCoreApi.getServerByName(lobbyConfig.survivalServerName)?.state) { - SurfServerState.RUNNING -> success("Der CASTSMP ist erreichbar") - else -> error("Der CASTSMP ist derzeit nicht erreichbar") + SurfServerState.RUNNING -> success("Der CastSMP ist erreichbar") + else -> error("Der CastSMP ist derzeit nicht erreichbar") } } From 88518ebe4d8048005227ad937a0e48974ccfe514 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft Date: Tue, 23 Jun 2026 14:23:17 +0200 Subject: [PATCH 12/15] fix: adjust sound pitch and improve default world handling in LobbyConfig --- src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt | 5 +++-- .../kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 3 ++- .../slne/surf/lobby/inventory/impl/NavigatorInventory.kt | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt b/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt index 52962c8..5c6bacd 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/config/LobbyConfig.kt @@ -1,5 +1,6 @@ package dev.slne.surf.lobby.config +import org.bukkit.Bukkit import org.bukkit.Location import org.spongepowered.configurate.objectmapping.ConfigSerializable @@ -25,7 +26,7 @@ data class LobbyConfig( val pitch: Float ) { fun toLocation(): Location { - val worldInstance = org.bukkit.Bukkit.getWorld(world) + val worldInstance = Bukkit.getWorld(world) ?: throw IllegalArgumentException("World '$world' not found") return Location(worldInstance, x, y, z, yaw, pitch) @@ -33,7 +34,7 @@ data class LobbyConfig( companion object { fun default() = LocationConfig( - world = "world", + world = Bukkit.getWorlds().first().name, x = 0.5, y = 100.0, z = 0.5, diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index b42ca82..dea6db9 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -150,6 +150,7 @@ object SurfNpcHook { skin = SurfNpcSkins.EVENT.getSkin() location = Locations.SPAWN_EVENT.getLocation() + withKickback() withEventHandler { val player = it.player @@ -159,7 +160,7 @@ object SurfNpcHook { .thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) + pitch(1.1f) } } return@withEventHandler diff --git a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt index 5ff523f..8fc6629 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/inventory/impl/NavigatorInventory.kt @@ -72,7 +72,7 @@ object NavigatorInventory : View() { .thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) + pitch(1.1f) } } player.closeInventory() @@ -258,7 +258,7 @@ private val survivalServerItem get() = plugin.getInvisibleItem().apply { displayName { primary("CastSMP ") - spacer("(Survival)") + darkSpacer("(Survival)") } buildLore { @@ -270,13 +270,13 @@ private val survivalServerItem info("Der ") variableValue("CastSMP") info(" ist ein") - variableValue("friedlicher") + variableValue(" friedlicher") info(" Survival Server.") } line { info("Hier kannst du entspannt") - variableValue("deine Träume") + variableValue(" deine Träume") info(" verwirklichen.") } From 039110b20206c2eb785f0c888d14ac1630c0a9c6 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft Date: Tue, 23 Jun 2026 14:34:30 +0200 Subject: [PATCH 13/15] fix: increase NPC scale for better visibility in SurfNpcHook --- src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index dea6db9..edc0740 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -66,6 +66,7 @@ object SurfNpcHook { withEventHandler { queueToSurvivalServer(it.player) } + scale(2.0) } } @@ -112,6 +113,7 @@ object SurfNpcHook { } rotationType = NpcRotationType.FIXED + scale(2.0) } } @@ -137,6 +139,7 @@ object SurfNpcHook { } } rotationType = NpcRotationType.FIXED + scale(2.0) } } @@ -173,6 +176,7 @@ object SurfNpcHook { } } } + scale(2.0) rotationType = NpcRotationType.FIXED } } @@ -189,6 +193,7 @@ object SurfNpcHook { location = Locations.SPAWN_SHOP.getLocation() withKickback() rotationType = NpcRotationType.FIXED + scale(2.0) } } @@ -212,6 +217,7 @@ object SurfNpcHook { } } rotationType = NpcRotationType.FIXED + scale(2.0) } } From 7bf77d8acfee4953db4be1e9c5375d1559d49bb0 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft Date: Tue, 23 Jun 2026 14:37:01 +0200 Subject: [PATCH 14/15] fix: add external event teleport handling in SurfNpcHook --- .../dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index edc0740..f699d8d 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -86,6 +86,17 @@ object SurfNpcHook { withEventHandler { val player = it.player + if (lobbyConfig.externalEventEnabled && lobbyConfig.externalEventReplacesDefault) { + player.teleportAsync(lobbyConfig.externalEventTeleportLocation.toLocation()) + .thenRun { + player.playSound(true) { + type(Sound.ENTITY_ENDERMAN_TELEPORT) + pitch(1.1f) + } + } + return@withEventHandler + } + when (eventServerBridge.state.get()) { EventServerState.OPEN -> { queueToEventServer(player) From 3292f3fde9a6af9833a08b585426bba2ad0218c1 Mon Sep 17 00:00:00 2001 From: TheBjoRedCraft Date: Tue, 23 Jun 2026 16:47:31 +0200 Subject: [PATCH 15/15] fix: reduce NPC scale and sound pitch in SurfNpcHook --- .../dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt | 16 ++++++++-------- .../dev/slne/surf/lobby/hook/npc/SurfNpcSkins.kt | 16 +++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt index f699d8d..cf85379 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcHook.kt @@ -66,7 +66,7 @@ object SurfNpcHook { withEventHandler { queueToSurvivalServer(it.player) } - scale(2.0) + scale(1.5) } } @@ -124,7 +124,7 @@ object SurfNpcHook { } rotationType = NpcRotationType.FIXED - scale(2.0) + scale(1.5) } } @@ -145,12 +145,12 @@ object SurfNpcHook { player.teleportAsync(Locations.SURVIVAL_TELEPORT.getLocation()).thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) + pitch(1.5f) } } } rotationType = NpcRotationType.FIXED - scale(2.0) + scale(1.5) } } @@ -183,11 +183,11 @@ object SurfNpcHook { player.teleportAsync(Locations.EVENT_TELEPORT.getLocation()).thenRun { player.playSound(true) { type(Sound.ENTITY_ENDERMAN_TELEPORT) - pitch(2.0f) + pitch(1.5f) } } } - scale(2.0) + scale(1.5) rotationType = NpcRotationType.FIXED } } @@ -204,7 +204,7 @@ object SurfNpcHook { location = Locations.SPAWN_SHOP.getLocation() withKickback() rotationType = NpcRotationType.FIXED - scale(2.0) + scale(1.5) } } @@ -228,7 +228,7 @@ object SurfNpcHook { } } rotationType = NpcRotationType.FIXED - scale(2.0) + scale(1.5) } } diff --git a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcSkins.kt b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcSkins.kt index 62234ba..09e8d7c 100644 --- a/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcSkins.kt +++ b/src/main/kotlin/dev/slne/surf/lobby/hook/npc/SurfNpcSkins.kt @@ -2,6 +2,7 @@ package dev.slne.surf.lobby.hook.npc import dev.slne.surf.api.core.util.objectSetOf import dev.slne.surf.npc.api.npc.skin.NpcSkin +import dev.slne.surf.npc.api.npc.skin.NpcSkinPart enum class SurfNpcSkins(val skinValue: String, val skinSignature: String) { UNKNOWN( @@ -9,18 +10,19 @@ enum class SurfNpcSkins(val skinValue: String, val skinSignature: String) { "VjpajnLZ4dIdfrXQJFFyV7Fp/IKEcQmEZIbiVR3MtFalVQ8BS5wCv8dsQeTmwZbv4zo4lL1urA4boAC9NIcP8KK+ucg19kgGrNDTs3Gmo7j57kZipDqKHJZMaHcvGx2Vur61YNL+cLQ9kwHaPwWdEdd9SDCJuXpvlBLrIxM8bqacyE1S/aATU388373xg2rNPCOxUy4YhScqeDSkBYdlYJ6xqQTwVIZZ8iwE/rqjq/X66VMRL6EtwwOqGqUBusvIiAfnGsyqMJ4rtohRsF9YHOR4cIk8K6E12ryl8uyp/HAkOYvfuk7TQuQSZpfgkH0aObjAeFPLGGGbV+P1cyezZm0I3erOQhviN9zfeaiuTHBmfP+RSb6dw+eQVKkdE2GkNinRp5EX5pltR3wREos2Muh2LXw3gGgWR3HvKnAZ1ofgAcIGk6pq9IKTpGaRZYhjIMpMXGsiRlgYqN4BmEDhTlV1XIldpatju6QnbTYyr8oJ97Z5FEVkhQ+5GsQnU9Rx+GyANhJjGVU06WiS/3H42SxbKaoPPIbBGPN3H8JTWO5Av3Y2zYLhWLhPFKF0b09FbhmkMJq0W9qE82DoByY/mhRmwTb1yrbKwXwxScEC4CSvbQBxwNjtp2WwttYs3L/x4Sxf4PgkPL0lvUF+yt+OGkHgJw4EzxV2giJaLfsXmsQ=" ), SURVIVAL( - "ewogICJ0aW1lc3RhbXAiIDogMTcxODMwMzkwNzU2NCwKICAicHJvZmlsZUlkIiA6ICJlY2Q0ZTI4NjdkMmE0MTE2OTljYzlkMjMzYmM1YmEyMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJSYXRlZEtub3QiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTVjZDIwMDg4OGI4NGZiODA0YTE0YTQyY2IzNjI0ZDc3NTRiNDM3YTU3YjBjZWNiZTA0MmFkNTQzZmQxZGUxZCIKICAgIH0KICB9Cn0=", - "FSgou42Te1dqA7iMoa8SVRNEF79y1GglInfk9a3dqkzqJ+QBT9Im8Ddy81J/TfT9CxhXqaopovMUOecmKDn+8+HzQV4PUFqxp1EeKD2uNZ9w4UC2nTgAhIQImCoqmv3oevI5eDqJooFp4U4uiz4VG0dRMNFak1HSM5Qy63ZTnVxtYRTwGqsFIo79wAjhRuHgb8S3mtYhpwmK2NerM/j/FwB0FA+WK/dvXwTlz/34nVGpRMAWpwJcbipO0THK2lE1o8Yl803XEs0EgduU7BHnXg0r0zl9ddeLJ/7eb7/KNRCBaxEBaN1fw3KgbpqYrvkBdhuDBxmBIYjnWhSwA2MENmypyf5UR3sYSmwEjR4LKmUxuDXyqJrKBRcd3jftRR8TWl91knoNi62HyXFHdFOgLaD3Bmzj0wIgPth5mNjSVWqKC9/lWa60Lmr9g/DRtjQ79YvRntnpRKn8CGNigpklm4vZs8NoLaBcNJzVHmBREdQ36uQzIZrGvpnnur4sWqQQuC3k8pVjA4XW3xhpGtqP/F0GqIOlVFymNzhsCXvQ19uXq12PkqcWwAeERJKu+S0Ud6vi5uwqGgEANmLZlbYecHY/FGOAlT89J7I8pgVetlVosW0YO5fbqwyFDzTzr+FzHkkr+bZ+u+YyGhYW9yPT/qEHaNsqUv/0Bt+KL+BFVG8=" + "ewogICJ0aW1lc3RhbXAiIDogMTc4MDUwNjUwOTkxOSwKICAicHJvZmlsZUlkIiA6ICJhNzdkNmQ2YmFjOWE0NzY3YTFhNzU1NjYxOTllYmY5MiIsCiAgInByb2ZpbGVOYW1lIiA6ICIwOEJFRDUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBlNTQ1ZGRiOTY2NTRmYWI1NTVlNDZkMWM0OGZmNmQyYmY0YzkyZDRlNzRmYWExZDVlZGViMTQxODhhYmFhYiIKICAgIH0KICB9Cn0=", + "CKoBVXu6KLkXdmPz7Bf04Gs95vGUlzl+3hQhoXXHyUlAS7rOEFGekN7aa3Q2PWaGLoyzdusI33p4Ybywa/2j81TJ0QlIo7/Nb+IVhoLG+NOqkBZs72QVGGkH/NWzlZ76Lj08OaNMNqjcbFvdPUt83HpcoW1RsQdT/xkGQf/IH0UbO5NKBoqb0rsFfc2tWvbmCzI5ciUAhNJI1C2qe5ysUkSylwLZaURI1MwrclQCCZpefpz4LbcvYyl/TB6si2UOX6i4IuiTVHPBm75Px6imzSTNbjacmSFLXQdpdKE5y8pD5WPPQgCnYTOHo92YZPju0e+uXaUWAWCOVJ4yrxOl4j+gE3/Tyi/VYEDeLc7E+oLczQ5qFG4wcuj5Yp8ftmknSr3Obkj6sJEj73p4ylDUW5BOe2CtX1mhB1ORC8C0xd4BmwJcNgraoOpnDp4LLY3qAr6cSzIglaVaE+a24IUKzvXq6kw4FCDgyoFCljDEsVYRbsmXT9ddNaAIf8MovrRdzR+/vU47c1/VxJZApksXGEm7JPX/O7tIrrND0Pwp4eIy2LvsbatWD7ckEjbGkvNC0ke+61UKoq0La6fFHl9KHVxGH6Mnq7V76yMfXniCkOrTZHCXzWwF687NcGUwtIZTkW/LCqT9LeGCwUpoYo4hExe7arE5YHp9mUpP+E3AbH0=" ), EVENT( - "ewogICJ0aW1lc3RhbXAiIDogMTY3OTU5NzMxMjA2NiwKICAicHJvZmlsZUlkIiA6ICIxNmFkYTc5YjFjMDk0MjllOWEyOGQ5MjgwZDNjNjE5ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJMYXp1bGl0ZV9adG9uZSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82YjZjYThhM2YwMTY5YzgxNDdkMGYyNjNlMTA3ZDU3YTIyMDdhZjU5NmZkMjAyNmY4OGU4MjkzMjBlNTk3NTc1IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", - "NV9vQ1TRhq39aCIY8ghXvUmghxcHkiZ2S+wjlrFDSl4yGKcnsflvjTEGkTM/cAOklqeIfHeoPtRM4r5wCEL+QVRmfKUSGdBg83uWBiX1yFB7uowEDBx8vyzZHrUuBrj3GuP/V41LCDIPStdnWmwXTEk0Rsa36EJ6EkijEVTWuE7OVIIELpZJ0oBxYR9aqja81Mt8dTLnGbX2oLOovNfpqbs+Fy3JGhFWC/cWdy1p0jrzytrxthqYGTfYP3WMOkIFOXshynurxvKGKoOYDEPfFgUeadJJKblonZZ4tbkv4eNeClTewAE8nm914GYh2Cjelw9rZuYc9rDjU5+G+s8mcafY6Hlx1IlIYOg7pgoorRTpUUU7FbeBqchh6aclf+hDlQqsXQDAWjCdvPrKfqDbv9P9S08ZrZQYdZqyF4aN67fLt/bz59PY46ZMjE3xGSSBaxCLs0cQUMEoxT73NUak6d/kbU9/kNhIkgn7cj2B4hrL4KvtgZB8EHz8Od79DqyxLhIRZTW02Mnvcf1z4CNYTtaOzs261tVFe2SrShzYJrrHW9tKWmetFLxwT9Zu+ddayzBK5x2sYTEIbhqne1PXq7/+BF49LPRSy76c42lJpYKz+YpfVGq3+lMTkxyce+hew4+dQG5oXX7W178ZaYdq7JFNM6ffTxfayjX0sbD5wXg=" + "ewogICJ0aW1lc3RhbXAiIDogMTc4MjIyMzQ2ODk4OCwKICAicHJvZmlsZUlkIiA6ICJhZmEwYmMzZTA1MjQ0MTM4YjkxMDIxY2Y3ODE2YjRkZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbGV4aXNNYWRkIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzc1NThlZjJiOWY5NjU1NTU4MTMzZmU5MDliM2Q5MzkxMWUyZDYwYWVjY2RkMDcyZmNhNTY3NmNlNjZhMTY4YTkiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==", + "ancAwwN6/cur413zm5hFp4xGY6KDcp4DVi1/VZtf76VHcOle8A5efThe1IK7DTSMqN/Uz+vQOdlmdW28iFyoaFOgmjfpu6Mnr/BqzWrXluNLhHe8CK12hMTOofH6pBSz1MckWLI9lbg6F1cdJoG6b97EuX4rjPZSjlKMVpHBVrs2hYQWsh2riKb56/HfTAgI2b9ZTaexXI14n55UFfkbCI3NqDmEOfmuVJIbDxNfsj107W+Cs+oLhxatmcwUrfqLv3R09ECfhQIzOfGgFDuN2BUX8UhPtONVJQ9Y2YpOsDY4lrJzyKM5vaIN1uHLSNb5mw97M6WRYQiwpUq0QdNvHF9jDzgfw5WbPifB3P9tuI3lhQach6uyAAN0GXIqIAsvFxOoHBMuwN3G3CX5GNZ49GEa/jDwOEZodcMN04hKqkJw5yfSzJFU0NRPWNI6HDMehNB2SLoM1SvY8roIgfylhxZeu0SHdtmKmUfEc2JnVOIo1algsa9kaJCGwBE58UW6AgewwajAhQa+rmdzsNvNg/FR6CXIEdJVJOmUubASv5BqNpHCTsfAHJ78PG8WBEAK7dBv+WWLfmawYICRRNxa5+x5+GhJHKb9Cr5qwHyU9lVk7qMu6PdHqaqNafOvKownYI1L6Fvfz7Cq0yW+++twbSr8wWjz/CFpJV78bDlFlWg=" ), RULES( - "ewogICJ0aW1lc3RhbXAiIDogMTY0OTU0MTEwOTQzNCwKICAicHJvZmlsZUlkIiA6ICJjYmFkZmRmNTRkZTM0N2UwODQ3MjUyMDIyYTFkNGRkZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNeHJuaW5nIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2E0Y2M3ZWZiNjNlZTU4YTA2ZTBlYmJlZjdiN2U5ZTg1OGZmYTE3OGNhNWM2MjcxYzg5NjllODhlMDVlY2YwMzMiCiAgICB9CiAgfQp9", - "b5ODc0ibj8ux9FjBwtqgXPYmLd3ZKsMARL2bl8CYh0xALmCqcUXfgSwbCNU3A+DWvu86VGu4P3utw2286UNy46Zgfw0Dw4n0yyOUXD9VXU+dEh9NMN98fvjcV54TySkI9xk+yfkLweEXN+rK0AlcxJwdhDqihb4ZOYmR4zVqyPcU1ol1iZium5T+YLNilAl0eUoYd7DU74bGfkRDDrsTfU/hx65kk0nhPu7PhkYueGBw2voiyyTWdiXrXpgzK3z5q1VRTaovXAJOp60l2w/9nv3QktlviL/HcZ2uLy8YYWPZMWtKxZ79SJvTgh1gxYJq7dY0JSnNc+6yURRBAquSzypRPC5JdNFLt7NEfmeZGF8excrhXVcd938AiZsVS/+e5wjUOsqCzrqcfGAJdlZsPs1eoguLJMKHwYQSnNEeFFp6wMHLtKKr6RzMiH/5o6ZFwShM6UJv2PNX/qB0wZ3nTf4mwX+nW2AHKBr3YBi40VEBrOqTnBNkc87GGl7Mw5vwcNOluFpruKlNcxeG9BcLAxrPgft5LyFYyhQC5FGThJTbHxif2tRjTpzDqjiPmPa9XNM0gSJt+9mSrdAgl74jf4okwpCBXC6D+oDlZEQAsT21coypSMWu6tUkxPqzYPdo6UJFJCsDeRUzTUufe65xiX8vUIN1/4Y7pBK0DiZLTC0=" + "ewogICJ0aW1lc3RhbXAiIDogMTYyMTkyNjMzOTIxNywKICAicHJvZmlsZUlkIiA6ICJjNjc3MGJjZWMzZjE0ODA3ODc4MTU0NWRhMGFmMDI1NCIsCiAgInByb2ZpbGVOYW1lIiA6ICJDVUNGTDE2IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2IzYjNhMzM2YTc3Y2FiOGI3NDQ2ODY4Y2VhMjkyMTkwZTc3Mjk4ZjJiNjBlODM1YjkwNTY4NjI1MDJkNjU0NjAiCiAgICB9CiAgfQp9", + "gbIH16YWg05ykuKXq1Whju1CN68gDa3C3TeCr8aNZ+hHsl6aw+sGUJC9a1brV1IzOFhXKyjxe6AcjVQM6/7wltkGCZ0HNh0BiOglWXK2pbv5xZF6v5pM3YPaDNQ37gxEDsnxw8XJkVGHFNKaFz6dNIn/sjUU0uPiwlv1772zX2EN0FcyWB+YgpKDjZ4x0xs+DytxrFQatvdrEIHnEWzq4bGGoDomN8yQccPhqB1rtDGp3TuXvzSfjwDvzzo7aVuFk6qfILW6DctAP+w6bfFE2OpgQoZrAX5/lcgjPGcMbdDi9eWHHh4BFuTJ68ZYzXyXK4j1NHRxtkCPajgdfTKmMzKhyZ5iRcASREaU7wAqErSY2ZBLx99kjfilI8qJ/wDxlnrFrYEbT0iRbLWLjThtO7X0e8+KSAe/1TKp4EdmhQ9YBd9OYTmW7tmDyRU15ukeKHUOA2njIXXDg58Rq6n2+6drb0mPJ6e69+ibu2Gg+Ou1tOxsS5XhFpnquAHCipSbqOBkyZcttR0KCxt23KENVG+66jhCjWTseXEh/yJhUhMvL18kkDQeO3OED0JRh/IG8M/lQEk1V8qT4FTTX3tATsLPbgGQtU5RlvKE4pTusN5v4ZFq+wVEXuZyNiwKgxNt4UUYsifRJ27wcwg/0YH8O7EAnJgUnGWAlurMEaFALow=" ) ; - fun getSkin() = NpcSkin(name, skinValue, skinSignature, objectSetOf()) + fun getSkin() = + NpcSkin(name, skinValue, skinSignature, objectSetOf(*NpcSkinPart.entries.toTypedArray())) } \ No newline at end of file