Skip to content

Commit 8caa7b6

Browse files
committed
feat: added /ftbteams nbtedit command
Direct viewing and editing of team NBT, use with caution...
1 parent 40da555 commit 8caa7b6

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

common/src/main/java/dev/ftb/mods/ftbteams/FTBTeams.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@
88
import dev.architectury.event.events.common.PlayerEvent;
99
import dev.architectury.utils.Env;
1010
import dev.architectury.utils.EnvExecutor;
11+
import dev.ftb.mods.ftblibrary.nbtedit.NBTEditResponseHandlers;
1112
import dev.ftb.mods.ftbteams.api.FTBTeamsAPI;
13+
import dev.ftb.mods.ftbteams.api.Team;
1214
import dev.ftb.mods.ftbteams.api.event.TeamCollectPropertiesEvent;
1315
import dev.ftb.mods.ftbteams.api.event.TeamEvent;
1416
import dev.ftb.mods.ftbteams.api.event.TeamManagerEvent;
1517
import dev.ftb.mods.ftbteams.api.property.TeamProperties;
1618
import dev.ftb.mods.ftbteams.client.FTBTeamsClient;
19+
import dev.ftb.mods.ftbteams.data.AbstractTeam;
1720
import dev.ftb.mods.ftbteams.data.FTBTeamsCommands;
1821
import dev.ftb.mods.ftbteams.data.TeamManagerImpl;
22+
import dev.ftb.mods.ftbteams.data.TeamType;
1923
import dev.ftb.mods.ftbteams.net.FTBTeamsNet;
2024
import net.minecraft.commands.CommandBuildContext;
2125
import net.minecraft.commands.CommandSourceStack;
2226
import net.minecraft.commands.Commands;
27+
import net.minecraft.nbt.CompoundTag;
2328
import net.minecraft.network.chat.Component;
2429
import net.minecraft.server.MinecraftServer;
2530
import net.minecraft.server.level.ServerLevel;
@@ -35,6 +40,7 @@ public FTBTeams() {
3540
FTBTeamsAPI._init(FTBTeamsAPIImpl.INSTANCE);
3641

3742
LifecycleEvent.SERVER_BEFORE_START.register(this::serverAboutToStart);
43+
LifecycleEvent.SERVER_STARTED.register(this::serverStarted);
3844
CommandRegistrationEvent.EVENT.register(this::registerCommands);
3945
LifecycleEvent.SERVER_STOPPED.register(this::serverStopped);
4046
LifecycleEvent.SERVER_LEVEL_SAVE.register(this::worldSaved);
@@ -48,6 +54,17 @@ public FTBTeams() {
4854
FTBTeamsNet.register();
4955
}
5056

57+
private void serverStarted(MinecraftServer server) {
58+
NBTEditResponseHandlers.INSTANCE.registerHandler("ftbteams:team", (serverPlayer, info, data) -> {
59+
TeamManagerImpl.INSTANCE.getTeamByID(info.getUUID("id")).ifPresent(team -> {
60+
if (team instanceof AbstractTeam abstractTeam) {
61+
abstractTeam.deserializeNBT(data, server.registryAccess());
62+
abstractTeam.markDirty();
63+
}
64+
});
65+
});
66+
}
67+
5168
private void serverAboutToStart(MinecraftServer server) {
5269
TeamManagerImpl.INSTANCE = new TeamManagerImpl(server);
5370
TeamManagerEvent.CREATED.invoker().accept(new TeamManagerEvent(TeamManagerImpl.INSTANCE));

common/src/main/java/dev/ftb/mods/ftbteams/data/FTBTeamsCommands.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import com.mojang.brigadier.context.CommandContext;
99
import com.mojang.brigadier.exceptions.CommandSyntaxException;
1010
import dev.architectury.platform.Platform;
11+
import dev.ftb.mods.ftblibrary.FTBLibraryCommands;
12+
import dev.ftb.mods.ftblibrary.net.EditNBTPacket;
13+
import dev.ftb.mods.ftblibrary.util.NetworkHelper;
1114
import dev.ftb.mods.ftbteams.FTBTeamsAPIImpl;
1215
import dev.ftb.mods.ftbteams.api.FTBTeamsAPI;
1316
import dev.ftb.mods.ftbteams.api.Team;
@@ -17,9 +20,11 @@
1720
import dev.ftb.mods.ftbteams.api.event.TeamInfoEvent;
1821
import dev.ftb.mods.ftbteams.api.property.TeamPropertyArgument;
1922
import net.minecraft.ChatFormatting;
23+
import net.minecraft.Util;
2024
import net.minecraft.commands.CommandSourceStack;
2125
import net.minecraft.commands.Commands;
2226
import net.minecraft.commands.arguments.GameProfileArgument;
27+
import net.minecraft.nbt.CompoundTag;
2328
import net.minecraft.network.chat.Component;
2429
import net.minecraft.server.level.ServerPlayer;
2530

@@ -196,6 +201,13 @@ public void register(CommandDispatcher<CommandSourceStack> dispatcher) {
196201
.executes(FTBTeamsCommands::forceRemovePlayers))
197202
)
198203
)
204+
.then(Commands.literal("nbtedit")
205+
.requires(requiresOPorSP())
206+
.executes(this::editPlayerTeamNBT)
207+
.then(createTeamArg()
208+
.executes(FTBTeamsCommands::editTeamNBT)
209+
)
210+
)
199211
);
200212

201213
if (Platform.isDevelopmentEnvironment()) {
@@ -359,4 +371,33 @@ private int addFakePlayer(Collection<GameProfile> profiles) {
359371

360372
return Command.SINGLE_SUCCESS;
361373
}
374+
375+
private int editPlayerTeamNBT(CommandContext<CommandSourceStack> ctx) throws CommandSyntaxException {
376+
return doTeamEdit(ctx, ctx.getSource().getPlayerOrException(), getTeam(ctx));
377+
}
378+
379+
private static int editTeamNBT(CommandContext<CommandSourceStack> ctx) throws CommandSyntaxException {
380+
return doTeamEdit(ctx, ctx.getSource().getPlayerOrException(), TeamArgument.get(ctx, "team"));
381+
}
382+
383+
private static int doTeamEdit(CommandContext<CommandSourceStack> ctx, ServerPlayer editor, Team team) {
384+
if (team instanceof AbstractTeam abstractTeam) {
385+
CompoundTag info = Util.make(new CompoundTag(), t -> {
386+
t.putString("title", Component.Serializer.toJson(abstractTeam.getColoredName(), editor.registryAccess()));
387+
t.putString("type", "ftbteams:team");
388+
t.putUUID("id", team.getTeamId());
389+
t.putString("team_type", abstractTeam.getType().getSerializedName());
390+
t.put("text", FTBLibraryCommands.InfoBuilder.create(ctx)
391+
.add("Team Type", Component.translatable(team.getTypeTranslationKey()))
392+
.add("Owner", Component.literal(team.getOwner().toString()))
393+
.add("Members", Component.literal(String.valueOf(team.getMembers().size())))
394+
.build()
395+
);
396+
});
397+
CompoundTag tag = abstractTeam.serializeNBT(ctx.getSource().getServer().registryAccess());
398+
NetworkHelper.sendTo(editor, new EditNBTPacket(info, tag));
399+
return Command.SINGLE_SUCCESS;
400+
}
401+
return 0;
402+
}
362403
}

0 commit comments

Comments
 (0)