Skip to content

Commit 0477c64

Browse files
Merge branch 'master' into 1.21.2
2 parents 5535066 + 7a8893c commit 0477c64

File tree

9 files changed

+97
-7
lines changed

9 files changed

+97
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ Make sure to clear this after each release
55
Put changelog here:
66

77
-----------------
8-
- Block sound overwrites now actually work on servers, unlike last time.
9-
- Fixed `.local` directories not being accounted for in transfer packets received by the server.
8+
- Fixed FrozenLib's capes causing severe performance issues when switching dimensions or respawning.
9+
- Fixed `NbtFileUtils` creating a directory instead of a file.
10+
- Added the `structure_upgrade` command, only accessible in development environments.
11+
- This takes a string for the `namespace` parameter, and will grab all structure pieces under the given namespace then save them to `run/upgraded_structure,` upgraded to the latest DataVersion.

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
min_loader_version=0.16.7
1616

1717
# Mod Properties
18-
mod_version = 1.9.2
18+
mod_version = 1.9.3
1919
maven_group = net.frozenblock
2020
archives_base_name = FrozenLib
2121

src/main/java/net/frozenblock/lib/FrozenMain.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
2222
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
2323
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
24+
import net.fabricmc.loader.api.FabricLoader;
2425
import net.fabricmc.loader.api.ModContainer;
2526
import net.frozenblock.lib.cape.impl.ServerCapeData;
2627
import net.frozenblock.lib.config.api.instance.Config;
@@ -55,6 +56,7 @@
5556
import net.frozenblock.lib.worldgen.feature.api.placementmodifier.FrozenPlacementModifiers;
5657
import net.frozenblock.lib.worldgen.structure.impl.FrozenRuleBlockEntityModifiers;
5758
import net.frozenblock.lib.worldgen.structure.impl.FrozenStructureProcessorTypes;
59+
import net.frozenblock.lib.worldgen.structure.impl.StructureUpgradeCommand;
5860
import net.frozenblock.lib.worldgen.surface.impl.BiomeTagConditionSource;
5961
import net.frozenblock.lib.worldgen.surface.impl.OptimizedBiomeTagConditionSource;
6062
import net.minecraft.commands.synchronization.ArgumentTypeInfos;
@@ -116,6 +118,9 @@ public void onInitialize(String modId, ModContainer container) {
116118
ConfigCommand.register(dispatcher);
117119
TagListCommand.register(dispatcher);
118120
ScaleEntityCommand.register(dispatcher);
121+
if (FabricLoader.getInstance().isDevelopmentEnvironment()) {
122+
StructureUpgradeCommand.register(dispatcher);
123+
}
119124
});
120125

121126
ServerWorldEvents.LOAD.register((server, level) -> {

src/main/java/net/frozenblock/lib/cape/api/CapeUtil.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ public static void registerCapeWithWhitelist(ResourceLocation id, Component cape
9191
}
9292

9393
public static void registerCapesFromURL(String urlString) {
94+
if (CAPE_REPOS.contains(urlString))
95+
return;
96+
9497
try {
9598
URL url = URI.create(urlString).toURL();
9699
URLConnection request = url.openConnection();

src/main/java/net/frozenblock/lib/cape/impl/ServerCapeData.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@
3636
public class ServerCapeData {
3737
private static final Map<UUID, Cape> CAPES_IN_SERVER = new HashMap<>();
3838

39-
public static void sendAllCapesToPlayer(ServerPlayer recipent) {
40-
CAPES_IN_SERVER.forEach((uuid, cape) -> ServerPlayNetworking.send(recipent, CapeCustomizePacket.createPacket(uuid, cape)));
41-
CapeUtil.getCapeRepos().forEach(repoURL -> ServerPlayNetworking.send(recipent, new LoadCapeRepoPacket(repoURL)));
39+
public static void sendAllCapesToPlayer(ServerPlayer recipient) {
40+
CAPES_IN_SERVER.forEach((uuid, cape) -> ServerPlayNetworking.send(recipient, CapeCustomizePacket.createPacket(uuid, cape)));
41+
}
42+
43+
public static void sendCapeReposToPlayer(ServerPlayer recipient) {
44+
CapeUtil.getCapeRepos().forEach(repoURL -> ServerPlayNetworking.send(recipient, new LoadCapeRepoPacket(repoURL)));
4245
}
4346

4447
public static void init() {

src/main/java/net/frozenblock/lib/file/nbt/NbtFileUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static void saveToFile(CompoundTag compoundTag, @NotNull File file, Strin
4444
}
4545

4646
public static void saveToFile(CompoundTag compoundTag, @NotNull File file) {
47-
file.mkdirs();
47+
file.getParentFile().mkdirs();
4848
try {
4949
NbtIo.writeCompressed(compoundTag, file.toPath());
5050
} catch (IOException iOException) {

src/main/java/net/frozenblock/lib/networking/FrozenNetworking.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public static void registerNetworking() {
8787

8888
PlayerJoinEvents.ON_JOIN_SERVER.register((server, player) -> {
8989
ConfigSyncPacket.sendS2C(player);
90+
ServerCapeData.sendCapeReposToPlayer(player);
9091
});
9192

9293
ResourceLoaderEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, error) -> {
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package net.frozenblock.lib.worldgen.structure.impl;
2+
3+
import com.mojang.brigadier.CommandDispatcher;
4+
import com.mojang.brigadier.arguments.BoolArgumentType;
5+
import com.mojang.brigadier.arguments.StringArgumentType;
6+
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
7+
import net.frozenblock.lib.file.nbt.NbtFileUtils;
8+
import net.minecraft.SharedConstants;
9+
import net.minecraft.commands.CommandSourceStack;
10+
import net.minecraft.commands.Commands;
11+
import net.minecraft.nbt.CompoundTag;
12+
import net.minecraft.network.chat.Component;
13+
import net.minecraft.resources.ResourceLocation;
14+
import net.minecraft.server.packs.resources.ResourceManager;
15+
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
16+
import org.jetbrains.annotations.NotNull;
17+
import java.nio.file.Path;
18+
import java.util.Map;
19+
import java.util.Set;
20+
21+
public class StructureUpgradeCommand {
22+
private StructureUpgradeCommand() {}
23+
24+
public static void register(@NotNull CommandDispatcher<CommandSourceStack> dispatcher) {
25+
dispatcher.register(Commands.literal("structure_upgrade")
26+
.then(Commands.argument("namespace", StringArgumentType.string())
27+
.executes(context -> upgradeAndExportPieces(context.getSource(), StringArgumentType.getString(context, "namespace"), false))
28+
.then(Commands.argument("log", BoolArgumentType.bool())
29+
.executes(context -> upgradeAndExportPieces(context.getSource(), StringArgumentType.getString(context, "namespace"), BoolArgumentType.getBool(context, "log")))
30+
)
31+
)
32+
);
33+
}
34+
35+
private static int upgradeAndExportPieces(@NotNull CommandSourceStack source, String namespace, boolean log) {
36+
ResourceManager resourceManager = source.getServer().getResourceManager();
37+
38+
Set<ResourceLocation> foundPieces = resourceManager.listResources(
39+
"structure",
40+
resourceLocation -> resourceLocation.getPath().endsWith(".nbt") && resourceLocation.getNamespace().equals(namespace)
41+
).keySet();
42+
43+
if (log) {
44+
foundPieces.forEach(resourceLocation -> System.out.println("Found piece: " + resourceLocation.toString()));
45+
}
46+
47+
StructureTemplateManager structureTemplateManager = source.getLevel().getStructureManager();
48+
Map<ResourceLocation, CompoundTag> savedTemplates = new Object2ObjectLinkedOpenHashMap<>();
49+
50+
foundPieces.forEach((resourceLocation) -> {
51+
savedTemplates.put(resourceLocation, structureTemplateManager.getOrCreate(resourceLocation).save(new CompoundTag()));
52+
});
53+
54+
Path outputPath = source.getServer().getServerDirectory()
55+
.resolve("upgraded_structure/data_version_" + SharedConstants.getCurrentVersion().getDataVersion().getVersion());
56+
57+
savedTemplates.forEach((resourceLocation, compoundTag) -> {
58+
NbtFileUtils.saveToFile(
59+
compoundTag,
60+
outputPath.resolve(resourceLocation.getNamespace()).toFile(),
61+
resourceLocation.getPath().replace(".nbt", "")
62+
);
63+
});
64+
65+
int templateCount = savedTemplates.size();
66+
if (templateCount > 0) {
67+
source.sendSuccess(() -> Component.translatable("commands.structure_upgrade.success", templateCount, namespace), true);
68+
} else {
69+
source.sendSuccess(() -> Component.translatable("commands.structure_upgrade.failure", namespace), true);
70+
}
71+
return 1;
72+
}
73+
}

src/main/resources/assets/frozenlib/lang/en_us.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@
8181
"commands.frozenlib.taglist.footer": "Listed %s tags in %s.",
8282
"commands.frozenlib.taglist.tag.invalid": "Invalid tag: %s",
8383

84+
"commands.structure_upgrade.success": "Upgraded and saved %s structure pieces for %s.",
85+
"commands.structure_upgrade.failure": "No structure pieces found for %s.",
86+
8487
"commands.warden_spawn_tracker.clear.success.multiple": "Cleared warden spawn warnings from %s players",
8588
"commands.warden_spawn_tracker.clear.success.single": "Cleared warden spawn warnings from %s",
8689
"commands.warden_spawn_tracker.set.success.multiple": "Set warden spawn warning %s to %s players",

0 commit comments

Comments
 (0)