From 154f3c44f333260d50bd8900be52725c4a0771c5 Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Thu, 25 Dec 2025 12:54:16 +0100 Subject: [PATCH 1/4] feat: crimson isle --- .../java/net/swofty/commons/CustomWorlds.java | 1 + .../java/net/swofty/commons/ServerType.java | 1 + settings.gradle.kts | 3 +- type.crimsonisle/build.gradle.kts | 27 +++++ .../crimsonisle/TypeCrimsonIsleLoader.java | 106 ++++++++++++++++++ .../crimsonisle/events/ActionPlayerJoin.java | 26 +++++ .../tab/CrimsonIsleServerModule.java | 25 +++++ .../skyblockgeneric/utility/LaunchPads.java | 53 ++++++++- .../type/spidersden/TypeSpidersDenLoader.java | 1 + .../gamemanager/BalanceConfigurations.java | 3 + 10 files changed, 239 insertions(+), 7 deletions(-) create mode 100644 type.crimsonisle/build.gradle.kts create mode 100644 type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java create mode 100644 type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/events/ActionPlayerJoin.java create mode 100644 type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/tab/CrimsonIsleServerModule.java diff --git a/commons/src/main/java/net/swofty/commons/CustomWorlds.java b/commons/src/main/java/net/swofty/commons/CustomWorlds.java index 8efdeae25..33df47bd4 100644 --- a/commons/src/main/java/net/swofty/commons/CustomWorlds.java +++ b/commons/src/main/java/net/swofty/commons/CustomWorlds.java @@ -5,6 +5,7 @@ public enum CustomWorlds { SKYBLOCK_HUB("hypixel_skyblock_hub"), SKYBLOCK_SPIDERS_DEN("hypixel_skyblock_spiders_den"), SKYBLOCK_THE_END("hypixel_skyblock_the_end"), + SKYBLOCK_CRIMSON_ISLE("hypixel_skyblock_crimson_isle"), SKYBLOCK_GOLD_MINE("hypixel_skyblock_gold_mine"), SKYBLOCK_DEEP_CAVERNS("hypixel_skyblock_deep_caverns"), SKYBLOCK_DWARVEN_MINES("hypixel_skyblock_dwarven_mines"), diff --git a/commons/src/main/java/net/swofty/commons/ServerType.java b/commons/src/main/java/net/swofty/commons/ServerType.java index 3bde5890d..6c4b65be0 100644 --- a/commons/src/main/java/net/swofty/commons/ServerType.java +++ b/commons/src/main/java/net/swofty/commons/ServerType.java @@ -8,6 +8,7 @@ public enum ServerType { SKYBLOCK_HUB(true), SKYBLOCK_SPIDERS_DEN(true), SKYBLOCK_THE_END(true), + SKYBLOCK_CRIMSON_ISLE(true), SKYBLOCK_DUNGEON_HUB(true), SKYBLOCK_THE_FARMING_ISLANDS(true), SKYBLOCK_GOLD_MINE(true), diff --git a/settings.gradle.kts b/settings.gradle.kts index 5ec6f3e14..be08a56e9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,4 +36,5 @@ include(":service.datamutex") include(":service.party") include(":service.orchestrator") include(":service.darkauction") -include(":anticheat") \ No newline at end of file +include(":anticheat") +include("type.crimsonisle") \ No newline at end of file diff --git a/type.crimsonisle/build.gradle.kts b/type.crimsonisle/build.gradle.kts new file mode 100644 index 000000000..ebbf60364 --- /dev/null +++ b/type.crimsonisle/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") + implementation("org.joml:joml:1.10.8") +} \ No newline at end of file diff --git a/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java new file mode 100644 index 000000000..272e68144 --- /dev/null +++ b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java @@ -0,0 +1,106 @@ +package net.swofty.type.crimsonisle; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.crimsonisle.tab.CrimsonIsleServerModule; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeCrimsonIsleLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_CRIMSON_ISLE; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeCrimsonIsleLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(-360.5, 80, -430.5, -180, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new CrimsonIsleServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.crimsonisle.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.crimsonisle.npcs", + HypixelNPC.class + ).toList()); + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_CRIMSON_ISLE; + } +} diff --git a/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/events/ActionPlayerJoin.java b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/events/ActionPlayerJoin.java new file mode 100644 index 000000000..2f950e709 --- /dev/null +++ b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.crimsonisle.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/tab/CrimsonIsleServerModule.java b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/tab/CrimsonIsleServerModule.java new file mode 100644 index 000000000..b002ab2ce --- /dev/null +++ b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/tab/CrimsonIsleServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.crimsonisle.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class CrimsonIsleServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7Crimson Isle", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java index 42fc408e5..1d2a5513d 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java @@ -77,13 +77,13 @@ public enum LaunchPads { boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.COMBAT) >= 1; if (!hasRequirement) { return PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-162.5, 75, -161.5)) + .pos(new Pos(-162.5, 73.5, -161.5)) .player(player) .text(new String[]{"§bTravel to:", "§aSpider's Den", "§cRequires Combat Level 1"}) .build(); } else { return PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-162.5, 75, -161.5)) + .pos(new Pos(-162.5, 73.5, -161.5)) .player(player) .text(new String[]{"§bTravel to:", "§aSpider's Den"}) .build(); @@ -100,7 +100,7 @@ public enum LaunchPads { (player) -> true, "", (player) -> PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-197.5, 83, -228.5)) + .pos(new Pos(-197.5, 84, -228.5)) .player(player) .text(new String[]{"§bTravel to:", "§aHub Island"}) .build() @@ -118,13 +118,13 @@ public enum LaunchPads { boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.COMBAT) >= 12; if (!hasRequirement) { return PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-383, 120, -261)) + .pos(new Pos(-383, 119.5, -261)) .player(player) .text(new String[]{"§bTravel to:", "§aThe End", "§cRequires Combat Level 12"}) .build(); } else { return PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-383, 120, -261)) + .pos(new Pos(-383, 119.5, -261)) .player(player) .text(new String[]{"§bTravel to:", "§aThe End"}) .build(); @@ -141,7 +141,48 @@ public enum LaunchPads { (player) -> true, "", (player) -> PlayerHolograms.ExternalPlayerHologram.builder() - .pos(new Pos(-495, 102, -275)) + .pos(new Pos(-495, 101.7, -275)) + .player(player) + .text(new String[]{"§bTravel to:", "§aSpider's Den"}) + .build() + ), + + SPIDERS_DEN_TO_CRIMSON_ISLE( + getSlimeBlocksNear(new Pos(-356, 87, -352)), + ServerType.SKYBLOCK_SPIDERS_DEN, + ServerType.SKYBLOCK_CRIMSON_ISLE, + new Pos(-361, 80, -425), + (player) -> player.sendTo(ServerType.SKYBLOCK_CRIMSON_ISLE), + (player) -> player.getSkills().getCurrentLevel(SkillCategories.COMBAT) >= 22, + "§cYou must be at least Combat Level XXII to join this island!", + (player) -> { + boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.COMBAT) >= 22; + if (!hasRequirement) { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-356, 87, -353)) + .player(player) + .text(new String[]{"§bTravel to:", "§aCrimson Isle", "§cRequires Combat Level 22"}) + .build(); + } else { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-356, 87, -353)) + .player(player) + .text(new String[]{"§bTravel to:", "§aCrimson Isle"}) + .build(); + } + } + ), + + CRIMSON_ISLE_TO_SPIDERS_DEN( + getSlimeBlocksNear(new Pos(-360, 80, -420)), + ServerType.SKYBLOCK_CRIMSON_ISLE, + ServerType.SKYBLOCK_SPIDERS_DEN, + new Pos(-355, 87, -347), + (player) -> player.sendTo(ServerType.SKYBLOCK_SPIDERS_DEN), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-360.5, 80, -420)) .player(player) .text(new String[]{"§bTravel to:", "§aSpider's Den"}) .build() diff --git a/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java b/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java index 191fea8ff..6da9e59f9 100644 --- a/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java +++ b/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java @@ -44,6 +44,7 @@ public LoaderValues getLoaderValues() { return new LoaderValues( (type) -> switch (type) { case SKYBLOCK_THE_END -> new Pos(-378, 118.5, -261, -90, 0); + case SKYBLOCK_CRIMSON_ISLE -> new Pos(-355, 87, -347, -20, 0); default -> new Pos(-202.5, 83, -233.5, 135, 0); }, // Spawn position true // Announce death messages diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java index 6bf3a9a59..1481768ce 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java @@ -32,6 +32,9 @@ public class BalanceConfigurations { Map.entry(ServerType.SKYBLOCK_THE_END, List.of( new LowestPlayerCount() )), + Map.entry(ServerType.SKYBLOCK_CRIMSON_ISLE, List.of( + new LowestPlayerCount() + )), Map.entry(ServerType.BEDWARS_LOBBY, List.of( new LowestPlayerCount() )), From 4b51d474a999206809a896d9b7d3f8590c39b298 Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Thu, 25 Dec 2025 14:10:56 +0100 Subject: [PATCH 2/4] feat: the park --- .../java/net/swofty/commons/CustomWorlds.java | 1 + .../java/net/swofty/commons/ServerType.java | 1 + loader/build.gradle.kts | 2 + settings.gradle.kts | 3 +- .../player/ActionPlayerLaunchPads.java | 27 +-- .../skyblockgeneric/utility/LaunchPads.java | 164 +++++++++++++++++- type.thepark/build.gradle.kts | 27 +++ .../type/thepark/TypeTheParkLoader.java | 106 +++++++++++ .../type/thepark/events/ActionPlayerJoin.java | 26 +++ .../type/thepark/tab/TheParkServerModule.java | 25 +++ .../gamemanager/BalanceConfigurations.java | 25 +-- 11 files changed, 382 insertions(+), 25 deletions(-) create mode 100644 type.thepark/build.gradle.kts create mode 100644 type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java create mode 100644 type.thepark/src/main/java/net/swofty/type/thepark/events/ActionPlayerJoin.java create mode 100644 type.thepark/src/main/java/net/swofty/type/thepark/tab/TheParkServerModule.java diff --git a/commons/src/main/java/net/swofty/commons/CustomWorlds.java b/commons/src/main/java/net/swofty/commons/CustomWorlds.java index 33df47bd4..67c8c6086 100644 --- a/commons/src/main/java/net/swofty/commons/CustomWorlds.java +++ b/commons/src/main/java/net/swofty/commons/CustomWorlds.java @@ -9,6 +9,7 @@ public enum CustomWorlds { SKYBLOCK_GOLD_MINE("hypixel_skyblock_gold_mine"), SKYBLOCK_DEEP_CAVERNS("hypixel_skyblock_deep_caverns"), SKYBLOCK_DWARVEN_MINES("hypixel_skyblock_dwarven_mines"), + SKYBLOCK_THE_PARK("hypixel_skyblock_the_park"), SKYBLOCK_DUNGEON_HUB("hypixel_skyblock_dungeon_hub"), PROTOTYPE_LOBBY("hypixel_prototype_lobby"), BEDWARS_LOBBY("hypixel_bedwars_lobby"), diff --git a/commons/src/main/java/net/swofty/commons/ServerType.java b/commons/src/main/java/net/swofty/commons/ServerType.java index 6c4b65be0..dd4791f07 100644 --- a/commons/src/main/java/net/swofty/commons/ServerType.java +++ b/commons/src/main/java/net/swofty/commons/ServerType.java @@ -14,6 +14,7 @@ public enum ServerType { SKYBLOCK_GOLD_MINE(true), SKYBLOCK_DEEP_CAVERNS(true), SKYBLOCK_DWARVEN_MINES(true), + SKYBLOCK_THE_PARK(true), PROTOTYPE_LOBBY(false), BEDWARS_LOBBY(false), BEDWARS_GAME(false), diff --git a/loader/build.gradle.kts b/loader/build.gradle.kts index f0177567e..058f75694 100644 --- a/loader/build.gradle.kts +++ b/loader/build.gradle.kts @@ -29,9 +29,11 @@ dependencies { implementation(project(":type.thefarmingislands")) implementation(project(":type.spidersden")) implementation(project(":type.theend")) + implementation(project(":type.crimsonisle")) implementation(project(":type.goldmine")) implementation(project(":type.deepcaverns")) implementation(project(":type.dwarvenmines")) + implementation(project(":type.thepark")) implementation(project(":type.dungeonhub")) implementation(project(":type.skyblockgeneric")) implementation(project(":type.prototypelobby")) diff --git a/settings.gradle.kts b/settings.gradle.kts index be08a56e9..563ae4c75 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,4 +37,5 @@ include(":service.party") include(":service.orchestrator") include(":service.darkauction") include(":anticheat") -include("type.crimsonisle") \ No newline at end of file +include("type.crimsonisle") +include("type.thepark") \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/player/ActionPlayerLaunchPads.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/player/ActionPlayerLaunchPads.java index 79dd12409..787dd7568 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/player/ActionPlayerLaunchPads.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/player/ActionPlayerLaunchPads.java @@ -121,21 +121,24 @@ public void run(PlayerMoveEvent event) { notifiedPlayers.remove(player.getUuid()); // Execute the after finished callback - player.sendMessage("Done"); pad.getAfterFinished().accept(player); // Check after a delay if player is still on this server (transfer failed) - scheduler.schedule(() -> { - // If player is still on the same server and instance, teleport them back - if (player.getInstance() != null && player.getInstance().equals(armorStand.getInstance())) { - player.teleport(originalPosition); - player.sendMessage("§cFailed to connect to the server. You have been teleported back."); - } - try { - armorStand.remove(); - } catch (Exception e) { - } - }, 2, TimeUnit.SECONDS); + if (pad.getServerType() != pad.getTargetServerType()) { + scheduler.schedule(() -> { + // If player is still on the same server and instance, teleport them back + if (player.getInstance() != null && player.getInstance().equals(armorStand.getInstance())) { + player.teleport(originalPosition); + player.sendMessage("§cFailed to connect to the server. You have been teleported back."); + } + try { + armorStand.remove(); + } catch (Exception e) { + } + }, 2, TimeUnit.SECONDS); + } else { + armorStand.remove(); + } return; } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java index 1d2a5513d..08f1e2bbe 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java @@ -257,7 +257,169 @@ public enum LaunchPads { .player(player) .text(new String[]{"§bTravel to:", "§aGold Mine"}) .build() - ); + ), + + FOREST_TO_BIRCH_PARK( + getSlimeBlocksNear(new Pos(-224.5, 73, -15.5)), + ServerType.SKYBLOCK_HUB, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-265.5, 79, -17.5), + (player) -> player.sendTo(ServerType.SKYBLOCK_THE_PARK), + (player) -> player.getSkills().getCurrentLevel(SkillCategories.FORAGING) >= 1, + "§cYou must be at least Foraging Level I to join this island!", + (player) -> { + boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.FORAGING) >= 1; + if (!hasRequirement) { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-224.5, 73.5, -15.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aThe Park", "§cRequires Foraging Level 1"}) + .build(); + } else { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-224.5, 73.5, -15.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aThe Park"}) + .build(); + } + } + ), + + BIRCH_PARK_TO_FOREST( + getSlimeBlocksNear(new Pos(-261.5, 79, -17.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_HUB, + new Pos(-221.5, 73, -15.5), + (player) -> player.sendTo(ServerType.SKYBLOCK_HUB), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-261.5, 79.5, -17.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aHub Island"}) + .build() + ), + + BIRCH_PARK_TO_SPRUCE_WOODS( + getSlimeBlocksNear(new Pos(-314.5, 81, -9.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-348.5, 90, -4.5), + (player) -> player.teleport(new Pos(-348.5, 90, -4.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-314.5, 81.5, -9.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aSpruce Woods"}) + .build() + ), + + SPRUCE_WOODS_TO_BIRCH_PARK( + getSlimeBlocksNear(new Pos(-343.5, 90, -4.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-306.5, 81, -5.5), + (player) -> player.teleport(new Pos(-306.5, 81, -5.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-343.5, 90.5, -4.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aBirch Park"}) + .build() + ), + + SPRUCE_WOODS_TO_DARK_THICKET( + getSlimeBlocksNear(new Pos(-364.5, 90, -18.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-380.5, 98, -38.5), + (player) -> player.teleport(new Pos(-380.5, 98, -38.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-364.5, 90.5, -18.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aDark Thicket"}) + .build() + ), + + DARK_THICKET_TO_SPRUCE_WOODS( + getSlimeBlocksNear(new Pos(-376.5, 97, -32.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-361.5, 90, -13.5), + (player) -> player.teleport(new Pos(-361.5, 90, -13.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-376.5, 97.5, -32.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aSpruce Woods"}) + .build() + ), + + DARK_THICKET_TO_SAVANNA_WOODLAND( + getSlimeBlocksNear(new Pos(-400.5, 98, -33.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-418.5, 110, -12.5), + (player) -> player.teleport(new Pos(-418.5, 110, -12.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-400.5, 98.5, -33.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aSavanna Woodland"}) + .build() + ), + + SAVANNA_WOODLAND_TO_DARK_THICKET( + getSlimeBlocksNear(new Pos(-415.5, 109, -16.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-397.5, 98, -37.5), + (player) -> player.teleport(new Pos(-397.5, 98, -37.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-415.5, 109.5, -16.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aDark Thicket"}) + .build() + ), + + SAVANNA_WOODLAND_TO_JUNGLE_ISLAND( + getSlimeBlocksNear(new Pos(-439.5, 111, -17.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-462.5, 121, -32.5), + (player) -> player.teleport(new Pos(-462.5, 121, -32.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-439.5, 111.5, -17.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aJungle Island"}) + .build() + ), + + JUNGLE_ISLAND_TO_SAVANNA_WOODLAND( + getSlimeBlocksNear(new Pos(-461.5, 121, -28.5)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-434.5, 110, -13.5), + (player) -> player.teleport(new Pos(-434.5, 110, -13.5)), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-461.5, 121.5, -28.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aSavanna Woodland"}) + .build() + ), + ; private static final List launchPads = new ArrayList<>(); diff --git a/type.thepark/build.gradle.kts b/type.thepark/build.gradle.kts new file mode 100644 index 000000000..ebbf60364 --- /dev/null +++ b/type.thepark/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") + implementation("org.joml:joml:1.10.8") +} \ No newline at end of file diff --git a/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java new file mode 100644 index 000000000..83d9e1c9a --- /dev/null +++ b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java @@ -0,0 +1,106 @@ +package net.swofty.type.thepark; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import net.swofty.type.thepark.tab.TheParkServerModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeTheParkLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_THE_PARK; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeTheParkLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(-265.5, 79, -17.5, 90, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new TheParkServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.thepark.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.thepark.npcs", + HypixelNPC.class + ).toList()); + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_THE_PARK; + } +} diff --git a/type.thepark/src/main/java/net/swofty/type/thepark/events/ActionPlayerJoin.java b/type.thepark/src/main/java/net/swofty/type/thepark/events/ActionPlayerJoin.java new file mode 100644 index 000000000..32737e368 --- /dev/null +++ b/type.thepark/src/main/java/net/swofty/type/thepark/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.thepark.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.thepark/src/main/java/net/swofty/type/thepark/tab/TheParkServerModule.java b/type.thepark/src/main/java/net/swofty/type/thepark/tab/TheParkServerModule.java new file mode 100644 index 000000000..60dca2e30 --- /dev/null +++ b/type.thepark/src/main/java/net/swofty/type/thepark/tab/TheParkServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.thepark.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class TheParkServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7The Park", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java index 1481768ce..8bba955ce 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java @@ -14,10 +14,11 @@ public class BalanceConfigurations { public static HashMap> configurations = new HashMap<>(Map.ofEntries( - Map.entry(ServerType.SKYBLOCK_HUB, List.of( + Map.entry(ServerType.SKYBLOCK_ISLAND, List.of( + new IslandCheck(), new LowestPlayerCount() )), - Map.entry(ServerType.PROTOTYPE_LOBBY, List.of( + Map.entry(ServerType.SKYBLOCK_HUB, List.of( new LowestPlayerCount() )), Map.entry(ServerType.SKYBLOCK_DUNGEON_HUB, List.of( @@ -35,26 +36,28 @@ public class BalanceConfigurations { Map.entry(ServerType.SKYBLOCK_CRIMSON_ISLE, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.BEDWARS_LOBBY, List.of( + Map.entry(ServerType.SKYBLOCK_GOLD_MINE, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.BEDWARS_GAME, List.of( - new ReadyGames() + Map.entry(ServerType.SKYBLOCK_DEEP_CAVERNS, List.of( + new LowestPlayerCount() )), - Map.entry(ServerType.BEDWARS_CONFIGURATOR, List.of( + Map.entry(ServerType.SKYBLOCK_DWARVEN_MINES, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.SKYBLOCK_GOLD_MINE, List.of( + Map.entry(ServerType.SKYBLOCK_THE_PARK, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.SKYBLOCK_DEEP_CAVERNS, List.of( + Map.entry(ServerType.PROTOTYPE_LOBBY, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.SKYBLOCK_DWARVEN_MINES, List.of( + Map.entry(ServerType.BEDWARS_LOBBY, List.of( new LowestPlayerCount() )), - Map.entry(ServerType.SKYBLOCK_ISLAND, List.of( - new IslandCheck(), + Map.entry(ServerType.BEDWARS_GAME, List.of( + new ReadyGames() + )), + Map.entry(ServerType.BEDWARS_CONFIGURATOR, List.of( new LowestPlayerCount() )) )); From cd8abf118565157b16e04aca4d2d7937870ce60d Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Thu, 25 Dec 2025 14:41:51 +0100 Subject: [PATCH 3/4] feat: galatea --- .../java/net/swofty/commons/CustomWorlds.java | 1 + .../java/net/swofty/commons/ServerType.java | 1 + loader/build.gradle.kts | 1 + settings.gradle.kts | 3 +- type.galatea/build.gradle.kts | 27 +++++ .../type/galatea/TypeGalateaLoader.java | 106 ++++++++++++++++++ .../type/galatea/events/ActionPlayerJoin.java | 26 +++++ .../type/galatea/tab/GalateaServerModule.java | 25 +++++ .../user/fairysouls/FairySoulZone.java | 1 + .../skyblockgeneric/utility/LaunchPads.java | 41 +++++++ .../type/thepark/TypeTheParkLoader.java | 1 + .../gamemanager/BalanceConfigurations.java | 3 + 12 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 type.galatea/build.gradle.kts create mode 100644 type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java create mode 100644 type.galatea/src/main/java/net/swofty/type/galatea/events/ActionPlayerJoin.java create mode 100644 type.galatea/src/main/java/net/swofty/type/galatea/tab/GalateaServerModule.java diff --git a/commons/src/main/java/net/swofty/commons/CustomWorlds.java b/commons/src/main/java/net/swofty/commons/CustomWorlds.java index 67c8c6086..767b66861 100644 --- a/commons/src/main/java/net/swofty/commons/CustomWorlds.java +++ b/commons/src/main/java/net/swofty/commons/CustomWorlds.java @@ -10,6 +10,7 @@ public enum CustomWorlds { SKYBLOCK_DEEP_CAVERNS("hypixel_skyblock_deep_caverns"), SKYBLOCK_DWARVEN_MINES("hypixel_skyblock_dwarven_mines"), SKYBLOCK_THE_PARK("hypixel_skyblock_the_park"), + SKYBLOCK_GALATEA("hypixel_skyblock_galatea"), SKYBLOCK_DUNGEON_HUB("hypixel_skyblock_dungeon_hub"), PROTOTYPE_LOBBY("hypixel_prototype_lobby"), BEDWARS_LOBBY("hypixel_bedwars_lobby"), diff --git a/commons/src/main/java/net/swofty/commons/ServerType.java b/commons/src/main/java/net/swofty/commons/ServerType.java index dd4791f07..7b99def4c 100644 --- a/commons/src/main/java/net/swofty/commons/ServerType.java +++ b/commons/src/main/java/net/swofty/commons/ServerType.java @@ -15,6 +15,7 @@ public enum ServerType { SKYBLOCK_DEEP_CAVERNS(true), SKYBLOCK_DWARVEN_MINES(true), SKYBLOCK_THE_PARK(true), + SKYBLOCK_GALATEA(true), PROTOTYPE_LOBBY(false), BEDWARS_LOBBY(false), BEDWARS_GAME(false), diff --git a/loader/build.gradle.kts b/loader/build.gradle.kts index 058f75694..3a5582f29 100644 --- a/loader/build.gradle.kts +++ b/loader/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { implementation(project(":type.deepcaverns")) implementation(project(":type.dwarvenmines")) implementation(project(":type.thepark")) + implementation(project(":type.galatea")) implementation(project(":type.dungeonhub")) implementation(project(":type.skyblockgeneric")) implementation(project(":type.prototypelobby")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 563ae4c75..66023e21e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -38,4 +38,5 @@ include(":service.orchestrator") include(":service.darkauction") include(":anticheat") include("type.crimsonisle") -include("type.thepark") \ No newline at end of file +include("type.thepark") +include("type.galatea") \ No newline at end of file diff --git a/type.galatea/build.gradle.kts b/type.galatea/build.gradle.kts new file mode 100644 index 000000000..ebbf60364 --- /dev/null +++ b/type.galatea/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") + implementation("org.joml:joml:1.10.8") +} \ No newline at end of file diff --git a/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java b/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java new file mode 100644 index 000000000..934470259 --- /dev/null +++ b/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java @@ -0,0 +1,106 @@ +package net.swofty.type.galatea; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.galatea.tab.GalateaServerModule; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeGalateaLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_GALATEA; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeGalateaLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(-542.5, 108, -26.5, 45, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new GalateaServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.galatea.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.galatea.npcs", + HypixelNPC.class + ).toList()); + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_GALATEA; + } +} diff --git a/type.galatea/src/main/java/net/swofty/type/galatea/events/ActionPlayerJoin.java b/type.galatea/src/main/java/net/swofty/type/galatea/events/ActionPlayerJoin.java new file mode 100644 index 000000000..322539e91 --- /dev/null +++ b/type.galatea/src/main/java/net/swofty/type/galatea/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.galatea.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.galatea/src/main/java/net/swofty/type/galatea/tab/GalateaServerModule.java b/type.galatea/src/main/java/net/swofty/type/galatea/tab/GalateaServerModule.java new file mode 100644 index 000000000..1cf88e36d --- /dev/null +++ b/type.galatea/src/main/java/net/swofty/type/galatea/tab/GalateaServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.galatea.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class GalateaServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7Galatea", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/fairysouls/FairySoulZone.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/fairysouls/FairySoulZone.java index e88e63b5c..f1e6b3745 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/fairysouls/FairySoulZone.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/fairysouls/FairySoulZone.java @@ -8,6 +8,7 @@ public enum FairySoulZone { DWARVEN_MINES, THE_FARMING_ISLANDS, THE_PARK, + GALATEA, SPIDERS_DEN, THE_END, CRIMSON_ISLE, diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java index 08f1e2bbe..c19fba477 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java @@ -419,6 +419,47 @@ public enum LaunchPads { .text(new String[]{"§bTravel to:", "§aSavanna Woodland"}) .build() ), + + JUNGLE_ISLAND_TO_GALATEA( + getSlimeBlocksNear(new Pos(-488.5, 116, -40)), + ServerType.SKYBLOCK_THE_PARK, + ServerType.SKYBLOCK_GALATEA, + new Pos(-542.5, 108, -26.5), + (player) -> player.sendTo(ServerType.SKYBLOCK_GALATEA), + (player) -> player.getSkills().getCurrentLevel(SkillCategories.FORAGING) >= 12, + "§cYou must be at least Foraging Level XII to join this island!", + (player) -> { + boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.FORAGING) >= 12; + if (!hasRequirement) { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-489.5, 116.5, -40)) + .player(player) + .text(new String[]{"§bTravel to:", "§aGalatea", "§cRequires Foraging Level 12"}) + .build(); + } else { + return PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-489.5, 116.5, -40)) + .player(player) + .text(new String[]{"§bTravel to:", "§aGalatea"}) + .build(); + } + } + ), + + GALATEA_TO_JUNGLE_ISLAND( + getSlimeBlocksNear(new Pos(-538.5, 108, -29)), + ServerType.SKYBLOCK_GALATEA, + ServerType.SKYBLOCK_THE_PARK, + new Pos(-483.5, 117, -41.5), + (player) -> player.sendTo(ServerType.SKYBLOCK_THE_PARK), + (player) -> true, + "", + (player) -> PlayerHolograms.ExternalPlayerHologram.builder() + .pos(new Pos(-538.5, 108.5, -28.5)) + .player(player) + .text(new String[]{"§bTravel to:", "§aThe Park"}) + .build() + ), ; private static final List launchPads = new ArrayList<>(); diff --git a/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java index 83d9e1c9a..2bb505443 100644 --- a/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java +++ b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java @@ -43,6 +43,7 @@ public void afterInitialize(MinecraftServer server) { public LoaderValues getLoaderValues() { return new LoaderValues( (type) -> switch (type) { + case SKYBLOCK_GALATEA -> new Pos(-483.5, 117, -41.5, -120, 0); default -> new Pos(-265.5, 79, -17.5, 90, 0); }, // Spawn position true // Announce death messages diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java index 8bba955ce..ff96f9482 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java @@ -48,6 +48,9 @@ public class BalanceConfigurations { Map.entry(ServerType.SKYBLOCK_THE_PARK, List.of( new LowestPlayerCount() )), + Map.entry(ServerType.SKYBLOCK_GALATEA, List.of( + new LowestPlayerCount() + )), Map.entry(ServerType.PROTOTYPE_LOBBY, List.of( new LowestPlayerCount() )), From e97dd8508fc7a43b8589851b61c1eedccd745fed Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Thu, 25 Dec 2025 15:02:29 +0100 Subject: [PATCH 4/4] feat: backwater bayou --- .../java/net/swofty/commons/CustomWorlds.java | 1 + .../java/net/swofty/commons/ServerType.java | 1 + loader/build.gradle.kts | 1 + settings.gradle.kts | 9 +- type.backwaterbayou/build.gradle.kts | 27 +++++ .../TypeBackwaterBayouLoader.java | 106 ++++++++++++++++++ .../events/ActionPlayerJoin.java | 26 +++++ .../tab/BackwaterBayouServerModule.java | 25 +++++ .../gamemanager/BalanceConfigurations.java | 3 + 9 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 type.backwaterbayou/build.gradle.kts create mode 100644 type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java create mode 100644 type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/events/ActionPlayerJoin.java create mode 100644 type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/tab/BackwaterBayouServerModule.java diff --git a/commons/src/main/java/net/swofty/commons/CustomWorlds.java b/commons/src/main/java/net/swofty/commons/CustomWorlds.java index 767b66861..4570f32b7 100644 --- a/commons/src/main/java/net/swofty/commons/CustomWorlds.java +++ b/commons/src/main/java/net/swofty/commons/CustomWorlds.java @@ -11,6 +11,7 @@ public enum CustomWorlds { SKYBLOCK_DWARVEN_MINES("hypixel_skyblock_dwarven_mines"), SKYBLOCK_THE_PARK("hypixel_skyblock_the_park"), SKYBLOCK_GALATEA("hypixel_skyblock_galatea"), + SKYBLOCK_BACKWATER_BAYOU("hypixel_skyblock_backwater_bayou"), SKYBLOCK_DUNGEON_HUB("hypixel_skyblock_dungeon_hub"), PROTOTYPE_LOBBY("hypixel_prototype_lobby"), BEDWARS_LOBBY("hypixel_bedwars_lobby"), diff --git a/commons/src/main/java/net/swofty/commons/ServerType.java b/commons/src/main/java/net/swofty/commons/ServerType.java index 7b99def4c..8ce903925 100644 --- a/commons/src/main/java/net/swofty/commons/ServerType.java +++ b/commons/src/main/java/net/swofty/commons/ServerType.java @@ -16,6 +16,7 @@ public enum ServerType { SKYBLOCK_DWARVEN_MINES(true), SKYBLOCK_THE_PARK(true), SKYBLOCK_GALATEA(true), + SKYBLOCK_BACKWATER_BAYOU(true), PROTOTYPE_LOBBY(false), BEDWARS_LOBBY(false), BEDWARS_GAME(false), diff --git a/loader/build.gradle.kts b/loader/build.gradle.kts index 3a5582f29..e00edd477 100644 --- a/loader/build.gradle.kts +++ b/loader/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { implementation(project(":type.dwarvenmines")) implementation(project(":type.thepark")) implementation(project(":type.galatea")) + implementation(project(":type.backwaterbayou")) implementation(project(":type.dungeonhub")) implementation(project(":type.skyblockgeneric")) implementation(project(":type.prototypelobby")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 66023e21e..8b6f466b2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,9 +18,13 @@ include(":type.prototypelobby") include(":type.thefarmingislands") include("type.spidersden") include("type.theend") +include("type.crimsonisle") include(":type.goldmine") include(":type.deepcaverns") include(":type.dwarvenmines") +include("type.thepark") +include("type.galatea") +include("type.backwaterbayou") include(":type.island") include(":type.hub") include(":type.dungeonhub") @@ -36,7 +40,4 @@ include(":service.datamutex") include(":service.party") include(":service.orchestrator") include(":service.darkauction") -include(":anticheat") -include("type.crimsonisle") -include("type.thepark") -include("type.galatea") \ No newline at end of file +include(":anticheat") \ No newline at end of file diff --git a/type.backwaterbayou/build.gradle.kts b/type.backwaterbayou/build.gradle.kts new file mode 100644 index 000000000..ebbf60364 --- /dev/null +++ b/type.backwaterbayou/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") + implementation("org.joml:joml:1.10.8") +} \ No newline at end of file diff --git a/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java new file mode 100644 index 000000000..d4905f1ff --- /dev/null +++ b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java @@ -0,0 +1,106 @@ +package net.swofty.type.backwaterbayou; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.backwaterbayou.tab.BackwaterBayouServerModule; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeBackwaterBayouLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_BACKWATER_BAYOU; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeBackwaterBayouLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(-12.5, 74, -10.5, -55, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new BackwaterBayouServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.backwaterbayou.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.backwaterbayou.npcs", + HypixelNPC.class + ).toList()); + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_BACKWATER_BAYOU; + } +} diff --git a/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/events/ActionPlayerJoin.java b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/events/ActionPlayerJoin.java new file mode 100644 index 000000000..173ba7c29 --- /dev/null +++ b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.backwaterbayou.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/tab/BackwaterBayouServerModule.java b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/tab/BackwaterBayouServerModule.java new file mode 100644 index 000000000..25d17fc46 --- /dev/null +++ b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/tab/BackwaterBayouServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.backwaterbayou.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class BackwaterBayouServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7Backwater Bayou", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java index ff96f9482..0c46d6998 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/BalanceConfigurations.java @@ -51,6 +51,9 @@ public class BalanceConfigurations { Map.entry(ServerType.SKYBLOCK_GALATEA, List.of( new LowestPlayerCount() )), + Map.entry(ServerType.SKYBLOCK_BACKWATER_BAYOU, List.of( + new LowestPlayerCount() + )), Map.entry(ServerType.PROTOTYPE_LOBBY, List.of( new LowestPlayerCount() )),