Skip to content

Commit 5f7dd7d

Browse files
Merge pull request #598 from ArikSquad/feat/lobby-parkour
Lobby Parkour
2 parents f9b5998 + 90e161a commit 5f7dd7d

16 files changed

Lines changed: 572 additions & 46 deletions

File tree

type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import net.swofty.type.generic.tab.TablistModule;
2828
import net.swofty.type.bedwarslobby.tab.BedWarsPlayersOnlineModule;
2929
import net.swofty.type.lobby.LobbyTypeLoader;
30+
import net.swofty.type.lobby.events.LobbyBlockBreak;
3031
import net.swofty.type.lobby.events.LobbyItemEvents;
3132
import net.swofty.type.lobby.events.LobbyLaunchPadEvents;
3233
import net.swofty.type.lobby.events.LobbyPlayerJoinEvents;
@@ -38,6 +39,7 @@
3839
import net.swofty.type.lobby.item.impl.ProfileItem;
3940
import net.swofty.type.lobby.launchpad.LaunchPad;
4041
import net.swofty.type.lobby.launchpad.LaunchPadHandler;
42+
import net.swofty.type.lobby.parkour.LobbyParkourManager;
4143
import org.jetbrains.annotations.Nullable;
4244
import org.tinylog.Logger;
4345

@@ -88,9 +90,7 @@ public void afterInitialize(MinecraftServer server) {
8890
BedWarsLeaderboardAggregator.initialize();
8991

9092
// Schedule hologram updates every 2 seconds
91-
MinecraftServer.getSchedulerManager().buildTask(() -> {
92-
PlayerHolograms.updateExternalHolograms();
93-
}).delay(TaskSchedule.seconds(5))
93+
MinecraftServer.getSchedulerManager().buildTask(PlayerHolograms::updateExternalHolograms).delay(TaskSchedule.seconds(5))
9494
.repeat(TaskSchedule.seconds(2))
9595
.schedule();
9696
}
@@ -112,6 +112,11 @@ public Map<Integer, LobbyItem> getHotbarItems() {
112112
);
113113
}
114114

115+
@Override
116+
public LobbyParkourManager getParkourManager() {
117+
return null;
118+
}
119+
115120
@Override
116121
public List<ServiceType> getRequiredServices() {
117122
return List.of(ServiceType.ORCHESTRATOR);
@@ -150,6 +155,7 @@ public List<HypixelEventClass> getTraditionalEvents() {
150155
events.add(new LobbyItemEvents());
151156
events.add(new LobbyLaunchPadEvents());
152157
events.add(new LobbyPlayerJoinEvents());
158+
events.add(new LobbyBlockBreak());
153159
return events;
154160
}
155161

type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/events/ActionPlayerBreak.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

type.generic/src/main/java/net/swofty/type/generic/data/HypixelDataHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ DatapointAchievementData.class, new DatapointAchievementData("achievement_data")
220220

221221
QUEST_DATA("quest_data",
222222
DatapointQuestData.class, new DatapointQuestData("quest_data")),
223+
224+
PARKOUR_DATA("parkour_data", DatapointParkourData.class, new DatapointParkourData("parkour_data"))
223225
;
224226

225227
@Getter private final String key;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package net.swofty.type.generic.data.datapoints;
2+
3+
import lombok.Getter;
4+
import net.swofty.commons.protocol.JacksonSerializer;
5+
import net.swofty.type.generic.data.Datapoint;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
public class DatapointParkourData extends Datapoint<Map<DatapointParkourData.ParkourType, Long>> {
11+
private static final JacksonSerializer<Map<ParkourType, Long>> serializer = new JacksonSerializer<>((Class) Map.class);
12+
13+
public DatapointParkourData(String key) {
14+
super(key, new HashMap<>(), serializer);
15+
}
16+
17+
@Getter
18+
public enum ParkourType {
19+
PROTOTYPE_LOBBY
20+
}
21+
}

type.lobby/src/main/java/net/swofty/type/lobby/LobbyTypeLoader.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import net.swofty.type.lobby.item.LobbyItem;
55
import net.swofty.type.lobby.item.LobbyItemHandler;
66
import net.swofty.type.lobby.launchpad.LaunchPad;
7+
import net.swofty.type.lobby.parkour.LobbyParkourManager;
8+
import net.swofty.type.lobby.parkour.Parkour;
9+
import org.jetbrains.annotations.Nullable;
710

811
import java.util.List;
912
import java.util.Map;
@@ -27,4 +30,10 @@ public interface LobbyTypeLoader extends HypixelTypeLoader {
2730
* Returns Map<slot, LobbyItem> - only items in map are given to players.
2831
*/
2932
Map<Integer, LobbyItem> getHotbarItems();
33+
34+
default Parkour getParkour() {
35+
return null;
36+
}
37+
38+
@Nullable LobbyParkourManager getParkourManager();
3039
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package net.swofty.type.lobby.events;
2+
3+
import net.minestom.server.event.player.PlayerBlockBreakEvent;
4+
import net.swofty.type.generic.event.EventNodes;
5+
import net.swofty.type.generic.event.HypixelEvent;
6+
import net.swofty.type.generic.event.HypixelEventClass;
7+
8+
public class LobbyBlockBreak implements HypixelEventClass {
9+
10+
@HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false)
11+
public void onBlockBreak(PlayerBlockBreakEvent event) {
12+
event.setCancelled(true);
13+
}
14+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package net.swofty.type.lobby.events;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.kyori.adventure.sound.Sound;
5+
import net.minestom.server.coordinate.Pos;
6+
import net.minestom.server.event.player.PlayerDisconnectEvent;
7+
import net.minestom.server.event.player.PlayerMoveEvent;
8+
import net.minestom.server.event.player.PlayerSpawnEvent;
9+
import net.swofty.type.generic.HypixelConst;
10+
import net.swofty.type.generic.event.EventNodes;
11+
import net.swofty.type.generic.event.HypixelEvent;
12+
import net.swofty.type.generic.event.HypixelEventClass;
13+
import net.swofty.type.generic.user.HypixelPlayer;
14+
import net.swofty.type.generic.utility.MathUtility;
15+
import net.swofty.type.lobby.LobbyTypeLoader;
16+
import net.swofty.type.lobby.parkour.LobbyParkourManager;
17+
18+
import java.util.HashMap;
19+
import java.util.UUID;
20+
21+
public class LobbyParkourEvents implements HypixelEventClass {
22+
23+
private final HashMap<UUID, Long> lastClickedTimes = new HashMap<>();
24+
25+
@HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false)
26+
public void onPlayerJoin(PlayerSpawnEvent event) {
27+
HypixelPlayer player = (HypixelPlayer) event.getPlayer();
28+
LobbyTypeLoader loader = (LobbyTypeLoader) HypixelConst.getTypeLoader();
29+
30+
LobbyParkourManager parkourManager = loader.getParkourManager();
31+
if (parkourManager == null) return;
32+
33+
parkourManager.updateForPlayer(HypixelConst.getInstanceContainer(), player);
34+
}
35+
36+
@HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false)
37+
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
38+
HypixelPlayer player = (HypixelPlayer) event.getPlayer();
39+
lastClickedTimes.remove(player.getUuid());
40+
41+
LobbyTypeLoader loader = (LobbyTypeLoader) HypixelConst.getTypeLoader();
42+
LobbyParkourManager parkourManager = loader.getParkourManager();
43+
if (parkourManager == null) return;
44+
if (!parkourManager.getPerPlayerStartTime().containsKey(player.getUuid())) return;
45+
parkourManager.cancelParkour(player);
46+
}
47+
48+
@HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = true)
49+
public void run(PlayerMoveEvent event) {
50+
LobbyTypeLoader loader = (LobbyTypeLoader) HypixelConst.getTypeLoader();
51+
final HypixelPlayer player = (HypixelPlayer) event.getPlayer();
52+
53+
if (lastClickedTimes.containsKey(player.getUuid()) && lastClickedTimes.get(player.getUuid()) >= System.currentTimeMillis() - 5000) return;
54+
55+
LobbyParkourManager parkourManager = loader.getParkourManager();
56+
if (parkourManager == null) return;
57+
58+
Pos playerPos = event.getPlayer().getPosition();
59+
60+
if (playerPos.samePoint(parkourManager.getParkour().getCheckpoints().getFirst(), 0.5)) {
61+
player.playSound(Sound.sound(
62+
Key.key("block.metal_pressure_plate.click_on"), Sound.Source.NEUTRAL,
63+
.3f, 0.75f
64+
));
65+
66+
MathUtility.delay(() -> player.playSound(Sound.sound(
67+
Key.key("block.metal_pressure_plate.click_off"), Sound.Source.NEUTRAL,
68+
.3f, 0.65f
69+
)), 30);
70+
71+
parkourManager.startParkour(player);
72+
lastClickedTimes.put(player.getUuid(), System.currentTimeMillis());
73+
}
74+
75+
for (int i = 1; i < parkourManager.getParkour().getCheckpoints().size() - 1; i++) {
76+
if (playerPos.samePoint(parkourManager.getParkour().getCheckpoints().get(i), 0.5)) {
77+
player.playSound(Sound.sound(
78+
Key.key("block.metal_pressure_plate.click_on"), Sound.Source.NEUTRAL,
79+
.3f, 0.75f
80+
));
81+
82+
MathUtility.delay(() -> player.playSound(Sound.sound(
83+
Key.key("block.metal_pressure_plate.click_off"), Sound.Source.NEUTRAL,
84+
.3f, 0.65f
85+
)), 30);
86+
87+
parkourManager.checkpointPlayer(player, i);
88+
lastClickedTimes.put(player.getUuid(), System.currentTimeMillis());
89+
break;
90+
}
91+
}
92+
93+
if (playerPos.samePoint(parkourManager.getParkour().getCheckpoints().getLast(), 0.5)) {
94+
player.playSound(Sound.sound(
95+
Key.key("block.metal_pressure_plate.click_on"), Sound.Source.NEUTRAL,
96+
.3f, 0.75f
97+
));
98+
99+
MathUtility.delay(() -> player.playSound(Sound.sound(
100+
Key.key("block.metal_pressure_plate.click_off"), Sound.Source.NEUTRAL,
101+
.3f, 0.65f
102+
)), 30);
103+
104+
parkourManager.finishedParkour(player);
105+
lastClickedTimes.put(player.getUuid(), System.currentTimeMillis());
106+
}
107+
}
108+
109+
}

type.lobby/src/main/java/net/swofty/type/lobby/item/LobbyItemHandler.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,22 @@
99
import net.minestom.server.item.ItemStack;
1010
import net.minestom.server.item.component.CustomData;
1111
import net.minestom.server.tag.Tag;
12+
import net.swofty.type.lobby.item.impl.CancelParkour;
13+
import net.swofty.type.lobby.item.impl.LastCheckpoint;
14+
import net.swofty.type.lobby.item.impl.ResetParkour;
1215

1316
import java.util.ArrayList;
1417
import java.util.List;
1518
import java.util.Optional;
1619

1720
public class LobbyItemHandler {
18-
private final List<LobbyItem> items = new ArrayList<>();
21+
private final List<LobbyItem> items = new ArrayList<>(
22+
List.of(
23+
new LastCheckpoint(),
24+
new CancelParkour(),
25+
new ResetParkour()
26+
)
27+
);
1928

2029
public void add(LobbyItem item) {
2130
items.add(item);
@@ -70,6 +79,7 @@ public void onBlockPlace(PlayerBlockPlaceEvent event) {
7079
ItemStack itemStack = event.getPlayer().getItemInMainHand();
7180
if (isItem(item, itemStack)) {
7281
item.onBlockPlace(event);
82+
item.onItemInteract(event);
7383
}
7484
}
7585
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.swofty.type.lobby.item.impl;
2+
3+
import net.minestom.server.event.trait.CancellableEvent;
4+
import net.minestom.server.event.trait.PlayerInstanceEvent;
5+
import net.minestom.server.item.ItemStack;
6+
import net.minestom.server.item.Material;
7+
import net.swofty.type.generic.HypixelConst;
8+
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
9+
import net.swofty.type.generic.user.HypixelPlayer;
10+
import net.swofty.type.lobby.LobbyTypeLoader;
11+
import net.swofty.type.lobby.item.LobbyItem;
12+
import net.swofty.type.lobby.parkour.LobbyParkourManager;
13+
14+
public class CancelParkour extends LobbyItem {
15+
16+
public CancelParkour() {
17+
super("cancel_parkour");
18+
}
19+
20+
@Override
21+
public ItemStack getBlandItem() {
22+
return ItemStackCreator.createNamedItemStack(Material.RED_BED, "§cCancel").build();
23+
}
24+
25+
@Override
26+
public void onItemInteract(PlayerInstanceEvent event) {
27+
((CancellableEvent) event).setCancelled(true);
28+
if (HypixelConst.getTypeLoader() instanceof LobbyTypeLoader lobbyLoader) {
29+
LobbyParkourManager parkourManager = lobbyLoader.getParkourManager();
30+
if (parkourManager == null) return;
31+
parkourManager.cancelParkour((HypixelPlayer) event.getPlayer());
32+
}
33+
}
34+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package net.swofty.type.lobby.item.impl;
2+
3+
import net.minestom.server.coordinate.CoordConversion;
4+
import net.minestom.server.event.trait.CancellableEvent;
5+
import net.minestom.server.event.trait.PlayerInstanceEvent;
6+
import net.minestom.server.item.ItemStack;
7+
import net.minestom.server.item.Material;
8+
import net.swofty.type.generic.HypixelConst;
9+
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
10+
import net.swofty.type.lobby.LobbyTypeLoader;
11+
import net.swofty.type.lobby.item.LobbyItem;
12+
import net.swofty.type.lobby.parkour.LobbyParkourManager;
13+
14+
public class LastCheckpoint extends LobbyItem {
15+
16+
public LastCheckpoint() {
17+
super("last_checkpoint");
18+
}
19+
20+
@Override
21+
public ItemStack getBlandItem() {
22+
return ItemStackCreator.createNamedItemStack(Material.HEAVY_WEIGHTED_PRESSURE_PLATE, "§aTeleport to Last Checkpoint").build();
23+
}
24+
25+
@Override
26+
public void onItemInteract(PlayerInstanceEvent event) {
27+
((CancellableEvent) event).setCancelled(true);
28+
if (HypixelConst.getTypeLoader() instanceof LobbyTypeLoader lobbyLoader) {
29+
LobbyParkourManager parkourManager = lobbyLoader.getParkourManager();
30+
if (parkourManager == null) return;
31+
event.getPlayer().teleport(
32+
parkourManager.getParkour().getCheckpoints().get(parkourManager.getPerPlayerStartTime().get(event.getPlayer().getUuid()).lastCheckpointIndex()).asPos().add(0.5, 0, 0.5)
33+
);
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)