Skip to content

Commit 4a5a1df

Browse files
committed
conflict fix attempt
1 parent ac3da24 commit 4a5a1df

2 files changed

Lines changed: 170 additions & 101 deletions

File tree

Lines changed: 83 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,29 @@
11
package net.swofty.type.skyblockgeneric.event.actions.player;
22

33
import net.kyori.adventure.key.Key;
4+
import net.swofty.commons.StringUtility;
45
import org.tinylog.Logger;
56
import net.kyori.adventure.sound.Sound;
6-
import org.tinylog.Logger;
77
import net.minestom.server.coordinate.Pos;
8-
import org.tinylog.Logger;
98
import net.minestom.server.coordinate.Vec;
10-
import org.tinylog.Logger;
119
import net.minestom.server.entity.EntityType;
12-
import org.tinylog.Logger;
1310
import net.minestom.server.entity.LivingEntity;
14-
import org.tinylog.Logger;
1511
import net.minestom.server.event.player.PlayerMoveEvent;
16-
import org.tinylog.Logger;
1712
import net.minestom.server.network.packet.server.play.ParticlePacket;
18-
import org.tinylog.Logger;
1913
import net.minestom.server.particle.Particle;
20-
import org.tinylog.Logger;
14+
import net.swofty.commons.ServerType;
15+
import net.swofty.proxyapi.ProxyInformation;
2116
import net.swofty.type.generic.event.EventNodes;
22-
import org.tinylog.Logger;
2317
import net.swofty.type.generic.event.HypixelEvent;
24-
import org.tinylog.Logger;
2518
import net.swofty.type.generic.event.HypixelEventClass;
26-
import org.tinylog.Logger;
2719
import net.swofty.type.generic.utility.MathUtility;
28-
import org.tinylog.Logger;
2920
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
30-
import org.tinylog.Logger;
3121
import net.swofty.type.skyblockgeneric.utility.LaunchPads;
32-
import org.tinylog.Logger;
3322

3423
import java.util.List;
24+
import java.util.Set;
25+
import java.util.UUID;
26+
import java.util.concurrent.ConcurrentHashMap;
3527
import java.util.concurrent.Executors;
3628
import java.util.concurrent.ScheduledExecutorService;
3729
import java.util.concurrent.ScheduledFuture;
@@ -41,6 +33,7 @@
4133
public class ActionPlayerLaunchPads implements HypixelEventClass {
4234
private static final int SEGMENTS = 30;
4335
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
36+
private static final Set<UUID> notifiedPlayers = ConcurrentHashMap.newKeySet();
4437

4538

4639
@HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = true, isAsync = true)
@@ -53,7 +46,12 @@ public void run(PlayerMoveEvent event) {
5346
} catch (ExceptionInInitializerError err) {
5447
return;
5548
}
56-
if (pad == null) return;
49+
50+
if (pad == null) {
51+
notifiedPlayers.remove(player.getUuid());
52+
return;
53+
}
54+
5755
if (player.isInLaunchpad()) return;
5856
player.setInLaunchpad(true);
5957

@@ -84,37 +82,78 @@ public void run(PlayerMoveEvent event) {
8482
player.setInLaunchpad(false);
8583
return;
8684
}
87-
player.playSound(Sound.sound(Key.key("entity.firework_rocket.launch"), Sound.Source.PLAYER, 1, 1));
88-
89-
LivingEntity armorStand = new LivingEntity(EntityType.ARMOR_STAND);
90-
armorStand.getEntityMeta().setInvisible(true);
91-
armorStand.getEntityMeta().setHasNoGravity(true);
92-
armorStand.setInstance(player.getInstance(), player.getPosition());
93-
armorStand.addPassenger(player);
94-
95-
List<Pos> curve = MathUtility.bezierCurve(player.getPosition(), pad.getDestination(), SEGMENTS);
96-
long timeToSleep = 3000 / SEGMENTS;
97-
98-
// Use ScheduledExecutorService to run the launch trajectory with delays
99-
AtomicInteger index = new AtomicInteger(0);
100-
ScheduledFuture<?>[] taskHolder = new ScheduledFuture<?>[1];
101-
taskHolder[0] = scheduler.scheduleAtFixedRate(() -> {
102-
int currentIndex = index.getAndIncrement();
103-
if (currentIndex >= curve.size()) {
104-
// Cancel the task
105-
if (taskHolder[0] != null) {
106-
taskHolder[0].cancel(false);
85+
86+
// Check server availability before starting animation
87+
ServerType targetServerType = pad.getTargetServerType();
88+
ProxyInformation proxyInfo = new ProxyInformation();
89+
proxyInfo.getServerInformation(targetServerType).thenAccept(servers -> {
90+
if (servers == null || servers.isEmpty()) {
91+
player.setInLaunchpad(false);
92+
if (!notifiedPlayers.contains(player.getUuid())) {
93+
notifiedPlayers.add(player.getUuid());
94+
player.sendMessage("§cThere are no " + StringUtility.toNormalCase(targetServerType.name()) + " servers available at the moment. Please try again later.");
10795
}
108-
// Execute the after finished callback
109-
player.sendMessage("Done");
110-
pad.getAfterFinished().accept(player);
11196
return;
11297
}
11398

114-
Pos pos = curve.get(currentIndex);
115-
Vec toGoTo = pos.asVec();
116-
Vec direction = toGoTo.sub(player.getPosition().asVec()).normalize();
117-
armorStand.setVelocity(direction.mul(50, 5, 50));
118-
}, 0, timeToSleep, TimeUnit.MILLISECONDS);
99+
notifiedPlayers.remove(player.getUuid());
100+
101+
Pos originalPosition = player.getPosition();
102+
player.playSound(Sound.sound(Key.key("entity.firework_rocket.launch"), Sound.Source.PLAYER, 1, 1));
103+
104+
LivingEntity armorStand = new LivingEntity(EntityType.ARMOR_STAND);
105+
armorStand.getEntityMeta().setInvisible(true);
106+
armorStand.getEntityMeta().setHasNoGravity(true);
107+
armorStand.setInstance(player.getInstance(), player.getPosition());
108+
armorStand.addPassenger(player);
109+
110+
List<Pos> curve = MathUtility.bezierCurve(player.getPosition(), pad.getDestination(), SEGMENTS);
111+
long timeToSleep = 3000 / SEGMENTS;
112+
113+
// Use ScheduledExecutorService to run the launch trajectory with delays
114+
AtomicInteger index = new AtomicInteger(0);
115+
ScheduledFuture<?>[] taskHolder = new ScheduledFuture<?>[1];
116+
taskHolder[0] = scheduler.scheduleAtFixedRate(() -> {
117+
int currentIndex = index.getAndIncrement();
118+
if (currentIndex >= curve.size()) {
119+
// Cancel the task
120+
if (taskHolder[0] != null) {
121+
taskHolder[0].cancel(false);
122+
}
123+
124+
player.setInLaunchpad(false);
125+
notifiedPlayers.remove(player.getUuid());
126+
127+
// Execute the after finished callback
128+
player.sendMessage("Done");
129+
pad.getAfterFinished().accept(player);
130+
131+
// Check after a delay if player is still on this server (transfer failed)
132+
scheduler.schedule(() -> {
133+
// If player is still on the same server and instance, teleport them back
134+
if (player.getInstance() != null && player.getInstance().equals(armorStand.getInstance())) {
135+
player.teleport(originalPosition);
136+
player.sendMessage("§cFailed to connect to the server. You have been teleported back.");
137+
}
138+
try {
139+
armorStand.remove();
140+
} catch (Exception e) {
141+
}
142+
}, 2, TimeUnit.SECONDS);
143+
144+
return;
145+
}
146+
147+
Pos pos = curve.get(currentIndex);
148+
Vec toGoTo = pos.asVec();
149+
Vec direction = toGoTo.sub(player.getPosition().asVec()).normalize();
150+
armorStand.setVelocity(direction.mul(50, 5, 50));
151+
}, 0, timeToSleep, TimeUnit.MILLISECONDS);
152+
}).exceptionally(ex -> {
153+
Logger.error(ex, "Error checking server availability for launch pad");
154+
player.setInLaunchpad(false);
155+
player.sendMessage("§cAn error occurred while checking server availability. Please try again later.");
156+
return null;
157+
});
119158
}
120-
}
159+
}

type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/utility/LaunchPads.java

Lines changed: 87 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@
2424

2525
@Getter
2626
public enum LaunchPads {
27-
VILLAGE_TO_FARMING(getSlimeBlocksNear(new Pos(79, 71, -185)), ServerType.SKYBLOCK_HUB,
28-
new Pos(116.5, 74, -210.5), (player) -> {
29-
player.sendTo(ServerType.SKYBLOCK_THE_FARMING_ISLANDS);
30-
}, (player) -> player.getSkills().getCurrentLevel(SkillCategories.FARMING) >= 5,
27+
VILLAGE_TO_FARMING(
28+
getSlimeBlocksNear(new Pos(79, 71, -185)),
29+
ServerType.SKYBLOCK_HUB,
30+
ServerType.SKYBLOCK_THE_FARMING_ISLANDS,
31+
new Pos(116.5, 74, -210.5),
32+
(player) -> player.sendTo(ServerType.SKYBLOCK_THE_FARMING_ISLANDS),
33+
(player) -> player.getSkills().getCurrentLevel(SkillCategories.FARMING) >= 5,
3134
"§cYou must be at least Farming Level V to join this island!",
3235
(player) -> {
3336
boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.FARMING) >= 5;
@@ -44,23 +47,31 @@ public enum LaunchPads {
4447
.text(new String[]{"§bTravel To:", "§aThe Farming Islands"})
4548
.build();
4649
}
47-
}),
48-
FARMING_TO_VILLAGE(getSlimeBlocksNear(new Pos(111, 71, -202)), ServerType.SKYBLOCK_THE_FARMING_ISLANDS,
49-
new Pos(74, 72, -180), (player) -> {
50-
player.sendTo(ServerType.SKYBLOCK_HUB);
51-
}, (player) -> true,
50+
}
51+
),
52+
53+
FARMING_TO_VILLAGE(
54+
getSlimeBlocksNear(new Pos(111, 71, -202)),
55+
ServerType.SKYBLOCK_THE_FARMING_ISLANDS,
56+
ServerType.SKYBLOCK_HUB,
57+
new Pos(74, 72, -180),
58+
(player) -> player.sendTo(ServerType.SKYBLOCK_HUB),
59+
(player) -> true,
5260
"",
53-
(player) -> {
54-
return PlayerHolograms.ExternalPlayerHologram.builder()
55-
.pos(new Pos(111.5, 71.7, -202.5))
56-
.player(player)
57-
.text(new String[]{"§bTravel To:", "§aThe Village"})
58-
.build();
59-
}),
60-
VILLAGE_TO_GOLD_MINE(getSlimeBlocksNear(new Pos(-9, 63, -231)), ServerType.SKYBLOCK_HUB, // TODO: UPDATE TO PROPER POSITIONS AND INFO
61-
new Pos(-5, 74, -268), (player) -> {
62-
player.sendTo(ServerType.SKYBLOCK_GOLD_MINE);
63-
}, (player) -> player.getSkills().getCurrentLevel(SkillCategories.MINING) >= 1,
61+
(player) -> PlayerHolograms.ExternalPlayerHologram.builder()
62+
.pos(new Pos(111.5, 71.7, -202.5))
63+
.player(player)
64+
.text(new String[]{"§bTravel To:", "§aThe Village"})
65+
.build()
66+
),
67+
68+
VILLAGE_TO_GOLD_MINE(
69+
getSlimeBlocksNear(new Pos(-9, 63, -231)),
70+
ServerType.SKYBLOCK_HUB, // TODO: UPDATE TO PROPER POSITIONS AND INFO
71+
ServerType.SKYBLOCK_GOLD_MINE,
72+
new Pos(-5, 74, -268),
73+
(player) -> player.sendTo(ServerType.SKYBLOCK_GOLD_MINE),
74+
(player) -> player.getSkills().getCurrentLevel(SkillCategories.MINING) >= 1,
6475
"§cYou must be at least Mining Level I to join this island!",
6576
(player) -> {
6677
boolean hasRequirement = player.getSkills().getCurrentLevel(SkillCategories.MINING) >= 1;
@@ -77,59 +88,78 @@ public enum LaunchPads {
7788
.text(new String[]{"§bTravel To:", "§aGold Mine"})
7889
.build();
7990
}
80-
}),
81-
GOLD_MINE_TO_VILLAGE(getSlimeBlocksNear(new Pos(-4, 74, -272)), ServerType.SKYBLOCK_GOLD_MINE,
82-
new Pos(-8, 70, -238), (player) -> {
83-
player.sendTo(ServerType.SKYBLOCK_HUB);
84-
}, (player) -> true,
91+
}
92+
),
93+
94+
GOLD_MINE_TO_VILLAGE(
95+
getSlimeBlocksNear(new Pos(-4, 74, -272)),
96+
ServerType.SKYBLOCK_GOLD_MINE,
97+
ServerType.SKYBLOCK_HUB,
98+
new Pos(-8, 70, -238),
99+
(player) -> player.sendTo(ServerType.SKYBLOCK_HUB),
100+
(player) -> true,
85101
"",
86-
(player) -> {
87-
return PlayerHolograms.ExternalPlayerHologram.builder()
88-
.pos(new Pos(-5, 73.3, -269))
89-
.player(player)
90-
.text(new String[]{"§bTravel To:", "§aThe Village"})
91-
.build();
92-
}),
93-
GOLD_MINE_TO_DEEP_CAVERNS(getSlimeBlocksNear(new Pos(-7, 67, -396)), ServerType.SKYBLOCK_GOLD_MINE,
94-
new Pos(-4, 119, -491.5), (player) -> {
95-
player.sendTo(ServerType.SKYBLOCK_DEEP_CAVERNS);
96-
}, (player) -> true,
102+
(player) -> PlayerHolograms.ExternalPlayerHologram.builder()
103+
.pos(new Pos(-5, 73.3, -269))
104+
.player(player)
105+
.text(new String[]{"§bTravel To:", "§aThe Village"})
106+
.build()
107+
),
108+
109+
GOLD_MINE_TO_DEEP_CAVERNS(
110+
getSlimeBlocksNear(new Pos(-7, 67, -396)),
111+
ServerType.SKYBLOCK_GOLD_MINE,
112+
ServerType.SKYBLOCK_DEEP_CAVERNS,
113+
new Pos(-4, 119, -491.5),
114+
(player) -> player.sendTo(ServerType.SKYBLOCK_DEEP_CAVERNS),
115+
(player) -> true,
97116
"",
98-
(player) -> {
99-
return PlayerHolograms.ExternalPlayerHologram.builder()
100-
.pos(new Pos(-7, 69, -396))
101-
.player(player)
102-
.text(new String[]{"§bTravel To:", "§aDeep Caverns"})
103-
.build();
104-
}),
105-
DEEP_CAVERNS_TO_GOLD_MINE(getSlimeBlocksNear(new Pos(3, 157, 85)), ServerType.SKYBLOCK_DEEP_CAVERNS,
106-
new Pos(2, 150, 136), (player) -> {
107-
player.sendTo(ServerType.SKYBLOCK_GOLD_MINE);
108-
}, (player) -> true,
117+
(player) -> PlayerHolograms.ExternalPlayerHologram.builder()
118+
.pos(new Pos(-7, 69, -396))
119+
.player(player)
120+
.text(new String[]{"§bTravel To:", "§aDeep Caverns"})
121+
.build()
122+
),
123+
124+
DEEP_CAVERNS_TO_GOLD_MINE(
125+
getSlimeBlocksNear(new Pos(3, 157, 85)),
126+
ServerType.SKYBLOCK_DEEP_CAVERNS,
127+
ServerType.SKYBLOCK_GOLD_MINE,
128+
new Pos(2, 150, 136),
129+
(player) -> player.sendTo(ServerType.SKYBLOCK_GOLD_MINE),
130+
(player) -> true,
109131
"",
110-
(player) -> {
111-
return PlayerHolograms.ExternalPlayerHologram.builder()
112-
.pos(new Pos(3, 159, 85))
113-
.player(player)
114-
.text(new String[]{"§bTravel To:", "§aGold Mine"})
115-
.build();
116-
});
132+
(player) -> PlayerHolograms.ExternalPlayerHologram.builder()
133+
.pos(new Pos(3, 159, 85))
134+
.player(player)
135+
.text(new String[]{"§bTravel To:", "§aGold Mine"})
136+
.build()
137+
);
117138

118139
private static final List<LaunchPads> launchPads = new ArrayList<>();
119140

120141
private final List<Pos> slimeBlocks;
121142
private final ServerType serverType;
143+
private final ServerType targetServerType;
122144
private final Pos destination;
123145
private final Consumer<SkyBlockPlayer> afterFinished;
124146
private final Function<SkyBlockPlayer, Boolean> shouldAllow;
125147
private final String rejectionMessage;
126148
private final Function<SkyBlockPlayer, PlayerHolograms.ExternalPlayerHologram> hologramDisplay;
127149

128-
LaunchPads(List<Pos> slimeBlocks, ServerType serverType, Pos destination,
129-
Consumer<@NonNull SkyBlockPlayer> afterFinished, Function<SkyBlockPlayer, Boolean> shouldAllow, String rejectionMessage,
130-
Function<@NonNull SkyBlockPlayer, PlayerHolograms.ExternalPlayerHologram> hologramDisplay) {
150+
LaunchPads(
151+
List<Pos> slimeBlocks,
152+
ServerType serverType,
153+
ServerType targetServerType,
154+
Pos destination,
155+
Consumer<@NonNull SkyBlockPlayer> afterFinished,
156+
Function<SkyBlockPlayer, Boolean> shouldAllow,
157+
String rejectionMessage,
158+
Function<@NonNull SkyBlockPlayer, PlayerHolograms.ExternalPlayerHologram> hologramDisplay
159+
) {
131160
this.slimeBlocks = slimeBlocks;
132161
this.serverType = serverType;
162+
this.targetServerType = targetServerType;
133163
this.destination = destination;
134164
this.afterFinished = afterFinished;
135165
this.shouldAllow = shouldAllow;

0 commit comments

Comments
 (0)