Skip to content

Commit 4b73da6

Browse files
Merge branch 'Swofty-Developments:master' into master
2 parents b6244d3 + 8925b4d commit 4b73da6

18 files changed

Lines changed: 526 additions & 65 deletions

File tree

commons/src/main/java/net/swofty/commons/proxy/FromProxyChannels.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Getter;
44
import net.swofty.commons.proxy.requirements.from.*;
5+
import net.swofty.commons.proxy.requirements.from.BroadcastStaffChatRequirements;
56
import org.jetbrains.annotations.Nullable;
67
import org.json.JSONObject;
78

@@ -14,7 +15,8 @@ public enum FromProxyChannels {
1415
REFRESH_COOP_DATA_ON_SERVER("refresh-coop-data", new RefreshCoopDataOnServerRequirements()),
1516
RUN_EVENT_ON_SERVER("run-event", new RunEventRequirements()),
1617
PING_SERVER("ping-server", new PingServerRequirements()),
17-
GIVE_PLAYERS_ORIGIN_TYPE("give-players-origin-type", new GivePlayersOriginTypeRequirements())
18+
GIVE_PLAYERS_ORIGIN_TYPE("give-players-origin-type", new GivePlayersOriginTypeRequirements()),
19+
BROADCAST_STAFF_CHAT("broadcast-staff-chat", new BroadcastStaffChatRequirements())
1820
;
1921

2022
private final String channelName;

commons/src/main/java/net/swofty/commons/proxy/ToProxyChannels.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.Getter;
44
import net.swofty.commons.proxy.requirements.to.*;
5+
import net.swofty.commons.proxy.requirements.to.StaffChatRequirements;
56
import org.jetbrains.annotations.Nullable;
67
import org.json.JSONObject;
78

@@ -15,6 +16,7 @@ public enum ToProxyChannels {
1516
REQUEST_SERVERS("servers", new ServersRequirement()),
1617
REGISTER_TEST_FLOW("register-test-flow", new RegisterTestFlowRequirements()),
1718
TEST_FLOW_SERVER_READY("test-flow-server-ready", new TestFlowServerReadyRequirements()),
19+
STAFF_CHAT("staff-chat", new StaffChatRequirements()),
1820
;
1921

2022
@Getter
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.swofty.commons.proxy.requirements.from;
2+
3+
import net.swofty.commons.proxy.ProxyChannelRequirements;
4+
5+
import java.util.List;
6+
7+
public class BroadcastStaffChatRequirements extends ProxyChannelRequirements {
8+
@Override
9+
public List<RequiredKey> getRequiredKeysForProxy() {
10+
return List.of(
11+
new RequiredKey("type") // "message", "join", or "leave"
12+
);
13+
}
14+
15+
@Override
16+
public List<RequiredKey> getRequiredKeysForServer() {
17+
return List.of();
18+
}
19+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.swofty.commons.proxy.requirements.to;
2+
3+
import net.swofty.commons.proxy.ProxyChannelRequirements;
4+
5+
import java.util.List;
6+
7+
public class StaffChatRequirements extends ProxyChannelRequirements {
8+
@Override
9+
public List<RequiredKey> getRequiredKeysForProxy() {
10+
return List.of();
11+
}
12+
13+
@Override
14+
public List<RequiredKey> getRequiredKeysForServer() {
15+
return List.of(
16+
new RequiredKey("type"), // "message", "join", or "leave"
17+
new RequiredKey("formatted_message") // Pre-formatted message (for "message" type) or empty (for join/leave)
18+
);
19+
}
20+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
achievements:
2+
- id: "murdermystery.countermeasures"
3+
name: "Countermeasures"
4+
description: "Get Hero wins in Classic or Double Up!"
5+
type: TIERED
6+
trigger: "murdermystery.hero_wins"
7+
tiers:
8+
- tier: 1
9+
goal: 10
10+
points: 5
11+
- tier: 2
12+
goal: 50
13+
points: 10
14+
- tier: 3
15+
goal: 100
16+
points: 15
17+
- tier: 4
18+
goal: 250
19+
points: 20
20+
- tier: 5
21+
goal: 500
22+
points: 25
23+
24+
- id: "murdermystery.hitman"
25+
name: "Hitman"
26+
description: "Kill players in Assassins"
27+
type: TIERED
28+
trigger: "murdermystery.assassin_kills"
29+
tiers:
30+
- tier: 1
31+
goal: 25
32+
points: 5
33+
- tier: 2
34+
goal: 100
35+
points: 10
36+
- tier: 3
37+
goal: 250
38+
points: 15
39+
- tier: 4
40+
goal: 500
41+
points: 20
42+
- tier: 5
43+
goal: 1000
44+
points: 25
45+
46+
- id: "murdermystery.hoarder"
47+
name: "Hoarder"
48+
description: "Gather a total of Gold"
49+
type: TIERED
50+
trigger: "murdermystery.total_gold"
51+
tiers:
52+
- tier: 1
53+
goal: 100
54+
points: 5
55+
- tier: 2
56+
goal: 250
57+
points: 10
58+
- tier: 3
59+
goal: 500
60+
points: 15
61+
- tier: 4
62+
goal: 1000
63+
points: 20
64+
- tier: 5
65+
goal: 2000
66+
points: 25
67+
68+
- id: "murdermystery.peace_is_mine"
69+
name: "Peace is Mine"
70+
description: "Win games as Innocent or Detective without dying"
71+
type: TIERED
72+
trigger: "murdermystery.survivor_wins"
73+
tiers:
74+
- tier: 1
75+
goal: 1
76+
points: 5
77+
- tier: 2
78+
goal: 10
79+
points: 10
80+
- tier: 3
81+
goal: 25
82+
points: 15
83+
- tier: 4
84+
goal: 40
85+
points: 20
86+
- tier: 5
87+
goal: 60
88+
points: 25
89+
90+
- id: "murdermystery.stabber"
91+
name: "Stabber"
92+
description: "Kill survivors as Murderer"
93+
type: TIERED
94+
trigger: "murdermystery.murderer_total_kills"
95+
tiers:
96+
- tier: 1
97+
goal: 5
98+
points: 5
99+
- tier: 2
100+
goal: 20
101+
points: 10
102+
- tier: 3
103+
goal: 50
104+
points: 15
105+
- tier: 4
106+
goal: 100
107+
points: 20
108+
- tier: 5
109+
goal: 150
110+
points: 25
111+
112+
- id: "murdermystery.youre_all_mine"
113+
name: "You're All Mine"
114+
description: "Win games as Murderer"
115+
type: TIERED
116+
trigger: "murdermystery.murderer_wins"
117+
tiers:
118+
- tier: 1
119+
goal: 1
120+
points: 5
121+
- tier: 2
122+
goal: 5
123+
points: 10
124+
- tier: 3
125+
goal: 10
126+
points: 15
127+
- tier: 4
128+
goal: 20
129+
points: 20
130+
- tier: 5
131+
goal: 35
132+
points: 25

type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/hologram/BedWarsLeaderboardHologram.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public String[] getHologramLines(HypixelPlayer player, PlayerLeaderboardState st
6464
int maxNameWidth = 0;
6565
if (alignment == BedwarsTextAlignment.BLOCK && !entries.isEmpty()) {
6666
for (LeaderboardService.LeaderboardEntry entry : entries) {
67-
String name = new BedwarsNameFormatter(entry.playerUuid()).getDisplayName();
67+
String name = HypixelPlayer.getDisplayName(entry.playerUuid());
6868
maxNameWidth = Math.max(maxNameWidth, getMinecraftStringWidth(name));
6969
}
7070
}
@@ -74,7 +74,7 @@ public String[] getHologramLines(HypixelPlayer player, PlayerLeaderboardState st
7474
} else {
7575
int displayRank = 1;
7676
for (LeaderboardService.LeaderboardEntry entry : entries) {
77-
String playerName = new BedwarsNameFormatter(entry.playerUuid()).getDisplayName();
77+
String playerName = HypixelPlayer.getDisplayName(entry.playerUuid());
7878
String formattedScore = formatScore(entry.scoreAsLong());
7979

8080
String paddedName = playerName;
Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,48 @@
11
package net.swofty.type.generic.chat;
22

3-
import net.swofty.type.generic.HypixelGenericLoader;
4-
import net.swofty.type.generic.command.commands.ChatCommand;
3+
import net.swofty.commons.proxy.ToProxyChannels;
4+
import net.swofty.proxyapi.redis.ServerOutboundMessage;
55
import net.swofty.type.generic.user.HypixelPlayer;
6-
7-
import java.util.List;
8-
import java.util.UUID;
9-
import java.util.stream.Collectors;
6+
import org.json.JSONObject;
107

118
public final class StaffChat {
129
private StaffChat() {}
1310

11+
/**
12+
* Sends a staff chat message from a player.
13+
* The message is routed through the proxy to all servers.
14+
*
15+
* @param sender The player sending the message
16+
* @param message The message content
17+
*/
1418
public static void sendMessage(HypixelPlayer sender, String message) {
1519
String formatted = "§b[STAFF] " + sender.getRank().getPrefix() + sender.getUsername() + "§f: " + message;
16-
broadcast(formatted, sender.getUuid());
20+
broadcastViaProxy(formatted);
1721
}
1822

23+
/**
24+
* Sends a staff notification (system message).
25+
* The message is routed through the proxy to all servers.
26+
*
27+
* @param message The notification message
28+
*/
1929
public static void sendNotification(String message) {
2030
String formatted = "§b[STAFF] §7" + message;
21-
broadcast(formatted, null);
31+
broadcastViaProxy(formatted);
2232
}
2333

24-
private static void broadcast(String message, UUID senderUuid) {
25-
List<HypixelPlayer> viewers = HypixelGenericLoader.getLoadedPlayers().stream()
26-
.filter(player -> player.getRank().isStaff())
27-
.filter(player -> ChatCommand.isStaffViewEnabled(player.getUuid()) || (senderUuid != null && player.getUuid().equals(senderUuid)))
28-
.collect(Collectors.toList());
29-
30-
for (HypixelPlayer viewer : viewers) {
31-
viewer.sendMessage(message);
32-
}
34+
private static void broadcastViaProxy(String formattedMessage) {
35+
JSONObject message = new JSONObject()
36+
.put("type", "message")
37+
.put("formatted_message", formattedMessage);
38+
39+
ServerOutboundMessage.sendMessageToProxy(
40+
ToProxyChannels.STAFF_CHAT,
41+
message,
42+
response -> {
43+
// Fire-and-forget, no response handling needed
44+
}
45+
);
3346
}
3447
}
3548

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.swofty.type.generic.command.commands;
2+
3+
import net.minestom.server.command.builder.arguments.ArgumentStringArray;
4+
import net.swofty.type.generic.chat.StaffChat;
5+
import net.swofty.type.generic.command.CommandParameters;
6+
import net.swofty.type.generic.command.HypixelCommand;
7+
import net.swofty.type.generic.user.HypixelPlayer;
8+
import net.swofty.type.generic.user.categories.Rank;
9+
10+
@CommandParameters(aliases = "sc staffchat",
11+
description = "Sends a message to staff chat",
12+
usage = "/sc <message>",
13+
permission = Rank.STAFF,
14+
allowsConsole = false)
15+
public class StaffChatCommand extends HypixelCommand {
16+
@Override
17+
public void registerUsage(MinestomCommand command) {
18+
ArgumentStringArray messageArgument = new ArgumentStringArray("message");
19+
20+
command.addSyntax((sender, context) -> {
21+
if (!permissionCheck(sender)) return;
22+
23+
HypixelPlayer player = (HypixelPlayer) sender;
24+
String[] messageArray = context.get(messageArgument);
25+
String message = String.join(" ", messageArray);
26+
27+
if (message.isEmpty()) {
28+
player.sendMessage("§cUsage: /sc <message>");
29+
return;
30+
}
31+
32+
StaffChat.sendMessage(player, message);
33+
}, messageArgument);
34+
}
35+
}

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.minestom.server.scoreboard.Team;
1010
import net.minestom.server.scoreboard.TeamBuilder;
1111
import net.swofty.commons.StringUtility;
12+
import net.swofty.type.generic.HypixelConst;
1213
import net.swofty.type.generic.data.datapoints.*;
1314
import net.swofty.type.generic.data.mongodb.ProfilesDatabase;
1415
import net.swofty.type.generic.data.mongodb.UserDatabase;
@@ -109,8 +110,10 @@ public void runOnSave(HypixelPlayer player) {
109110
for (Data data : Data.values()) {
110111
if (data.onQuit != null) {
111112
Datapoint<?> produced = data.onQuit.apply(player);
112-
Datapoint<?> target = get(data);
113-
target.setFrom(produced); // no onChange during save
113+
if (produced != null) {
114+
Datapoint<?> target = get(data);
115+
target.setFrom(produced); // no onChange during save
116+
}
114117
}
115118
}
116119
}
@@ -202,9 +205,28 @@ public enum Data {
202205
TOGGLES("toggles", DatapointToggles.class, new DatapointToggles("toggles")),
203206

204207
GAMEMODE("gamemode", DatapointGamemode.class, new DatapointGamemode("gamemode", GameMode.SURVIVAL),
205-
(player, datapoint) -> player.setGameMode((GameMode) datapoint.getValue()),
206-
(player, datapoint) -> player.setGameMode((GameMode) datapoint.getValue()),
207-
(player) -> new DatapointGamemode("gamemode", player.getGameMode())),
208+
(player, datapoint) -> {
209+
if (HypixelConst.getTypeLoader().getType().isSkyBlock()) {
210+
player.setGameMode((GameMode) datapoint.getValue());
211+
}
212+
},
213+
(player, datapoint) -> {
214+
if (HypixelConst.getTypeLoader().getType().isSkyBlock()) {
215+
// Reset to SURVIVAL if coming from non-SkyBlock server
216+
HypixelPlayer hypixelPlayer = (HypixelPlayer) player;
217+
if (hypixelPlayer.getOriginServer() == null || !hypixelPlayer.getOriginServer().isSkyBlock()) {
218+
player.setGameMode(GameMode.SURVIVAL);
219+
} else {
220+
player.setGameMode((GameMode) datapoint.getValue());
221+
}
222+
}
223+
},
224+
(player) -> {
225+
if (HypixelConst.getTypeLoader().getType().isSkyBlock()) {
226+
return new DatapointGamemode("gamemode", player.getGameMode());
227+
}
228+
return null; // Don't update gamemode for non-SkyBlock servers
229+
}),
208230

209231
SKIN_SIGNATURE("skin_signature",
210232
DatapointString.class, new DatapointString("skin_signature", "null"),

0 commit comments

Comments
 (0)