Skip to content

Commit a93e553

Browse files
feat: updated to 1.21.2/3
1 parent 1bbd12d commit a93e553

19 files changed

Lines changed: 147 additions & 283 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## 89.0.0
2+
3+
### Changed
4+
5+
- Updated to 1.21.2/1.21.3
6+
- The `/tk clear` command now supports custom input filters as well as optionally being able to remove bedrock from the world
7+
- This technically replaces existing functionality where a tag or blockstate would be read from the input but due to poor auto-complete, this is basically an unknown feature so we've changed it to one that's much more clear
8+
- The new syntax is `/tk clear <size> [filter] [removeBedrock]`
9+
110
## 87.0.1
211

312
### Changed
@@ -22,7 +31,6 @@
2231

2332
- Updated to 1.21
2433

25-
2634
## 85.0.0
2735

2836
### Changed

‎build.gradle‎

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import groovy.json.JsonSlurper
2+
13
plugins {
24
id "architectury-plugin" version "3.4-SNAPSHOT"
3-
id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false
4-
id "me.modmuss50.mod-publish-plugin" version "0.4.5"
5+
id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false
6+
id "me.modmuss50.mod-publish-plugin" version "0.7.1"
57
}
68

79
architectury {
@@ -88,12 +90,14 @@ publishMods {
8890
accessToken = providers.environmentVariable("CURSE_TOKEN")
8991
projectId = "${curseforge_id}"
9092
minecraftVersions.add("${minecraft_version}")
93+
minecraftVersions.add("1.21.2")
9194
}
9295

9396
def modrinthOptions = modrinthOptions {
9497
accessToken = providers.environmentVariable("MODRINTH_TOKEN")
9598
projectId = "${modrinth_id}"
9699
minecraftVersions.add("${minecraft_version}")
100+
minecraftVersions.add("1.21.2")
97101
}
98102

99103
curseforge("curseforgeFabric") {
@@ -146,3 +150,46 @@ publishMods {
146150
}
147151
}
148152
}
153+
154+
tasks.register("updateModVersion") {
155+
doLast {
156+
def gradleFile = file("gradle.properties")
157+
def text = gradleFile.text
158+
159+
def minecraftVersion = getModPrefixVersion()
160+
def modVersion = text.find("mod_version=(.*)")
161+
162+
if (modVersion == null) {
163+
throw new IllegalStateException("Could not find mod_version in gradle.properties")
164+
}
165+
166+
modVersion = modVersion.split("=")[1]
167+
def remainingVersion = modVersion.tokenize(".").drop(1).join(".")
168+
def newVersion = "${minecraftVersion}.${remainingVersion}"
169+
170+
text = text.replace("mod_version=${modVersion}", "mod_version=${newVersion}")
171+
gradleFile.text = text
172+
173+
println "Updated mod version to ${newVersion} from ${modVersion}"
174+
}
175+
}
176+
177+
def getModPrefixVersion() {
178+
def url = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json"
179+
def json = new JsonSlurper().parseText(url.toURL().text)
180+
181+
def versions = json.versions
182+
versions = versions.reverse() // We want the oldest version first
183+
versions = versions.findAll { it.type == "release" } // We only want releases
184+
185+
def incrementalVersion = 0
186+
for (version in versions) {
187+
if (version.id == minecraft_version) {
188+
break
189+
}
190+
191+
incrementalVersion++
192+
}
193+
194+
return incrementalVersion
195+
}

‎common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public static void register(CommandDispatcher<CommandSourceStack> dispatcher, Co
4141
.then(SlayerCommand.register())
4242
.then(EnchantCommand.register(context))
4343
.then(BlockDistributionCommand.register())
44-
.then(ClearCommand.register())
44+
.then(ClearCommand.register(context))
4545
.then(KillEntitiesCommand.register(context))
4646
.then(HealCommand.register())
4747
.then(RepairItemCommand.register())

‎common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ private static int giveItem(ServerPlayer player) {
3838

3939
var enchants = itemstack.get(DataComponents.ENCHANTMENTS);
4040
var mutableEnchants = new ItemEnchantments.Mutable(enchants);
41-
Registry<Enchantment> enchantmentRegistry = player.server.registryAccess().registryOrThrow(Registries.ENCHANTMENT);
42-
enchantments.forEach(e -> mutableEnchants.set(enchantmentRegistry.getHolderOrThrow(e), Short.MAX_VALUE));
41+
Registry<Enchantment> enchantmentRegistry = player.server.registryAccess().lookupOrThrow(Registries.ENCHANTMENT);
42+
enchantments.forEach(e -> mutableEnchants.set(enchantmentRegistry.get(e).orElseThrow(), Short.MAX_VALUE));
4343
itemstack.set(DataComponents.ENCHANTMENTS, mutableEnchants.toImmutable());
4444

4545
boolean added = player.getInventory().add(itemstack.copy());
Lines changed: 68 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
package com.sunekaer.toolkit.commands.level;
22

3+
import com.mojang.brigadier.arguments.BoolArgumentType;
34
import com.mojang.brigadier.arguments.IntegerArgumentType;
45
import com.mojang.brigadier.arguments.StringArgumentType;
56
import com.mojang.brigadier.builder.ArgumentBuilder;
67
import com.mojang.brigadier.exceptions.CommandSyntaxException;
78
import com.sunekaer.toolkit.ToolkitPlatform;
89
import com.sunekaer.toolkit.jobs.ServerTickJobRunner;
910
import com.sunekaer.toolkit.utils.ChunkRangeIterator;
11+
import net.minecraft.commands.CommandBuildContext;
1012
import net.minecraft.commands.CommandSourceStack;
1113
import net.minecraft.commands.Commands;
1214
import net.minecraft.commands.SharedSuggestionProvider;
15+
import net.minecraft.commands.arguments.blocks.BlockPredicateArgument;
1316
import net.minecraft.core.BlockPos;
14-
import net.minecraft.core.Registry;
1517
import net.minecraft.core.registries.BuiltInRegistries;
16-
import net.minecraft.core.registries.Registries;
1718
import net.minecraft.network.chat.Component;
18-
import net.minecraft.resources.ResourceLocation;
1919
import net.minecraft.server.level.ServerLevel;
20-
import net.minecraft.tags.TagKey;
2120
import net.minecraft.world.level.ChunkPos;
2221
import net.minecraft.world.level.block.Block;
2322
import net.minecraft.world.level.block.Blocks;
2423
import net.minecraft.world.level.block.state.BlockState;
24+
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
2525

2626
import java.util.*;
2727
import java.util.concurrent.ExecutorService;
@@ -33,43 +33,73 @@ public class ClearCommand {
3333
private static final AtomicBoolean COMPLETED = new AtomicBoolean(true);
3434
public static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();
3535

36-
public static ArgumentBuilder<CommandSourceStack, ?> register() {
36+
public static ArgumentBuilder<CommandSourceStack, ?> register(CommandBuildContext commandBuildContext) {
3737
return (Commands.literal("clear")
3838
.requires(cs -> cs.hasPermission(2))
39-
.executes(context -> remove(context.getSource(), 1, RemovalPredicate.NAMES[0]))
40-
.then(Commands.argument("range", IntegerArgumentType.integer()).executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), RemovalPredicate.NAMES[0]))
41-
.then(Commands.argument("filter", StringArgumentType.string()).suggests((commandContext, suggestionsBuilder) -> SharedSuggestionProvider.suggest(RemovalPredicate.NAMES, suggestionsBuilder)).executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), StringArgumentType.getString(ctx, "filter"))))));
39+
.executes(context -> remove(context.getSource(), 1, RemovalPredicate.NAMES[0], false))
40+
.then(Commands.argument("range", IntegerArgumentType.integer())
41+
.executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), RemovalPredicate.NAMES[0], false))
42+
.then(Commands.argument("filter", StringArgumentType.string())
43+
.suggests((commandContext, suggestionsBuilder) -> SharedSuggestionProvider.suggest(RemovalPredicate.NAMES, suggestionsBuilder))
44+
.executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), StringArgumentType.getString(ctx, "filter"), false))
45+
.then(Commands.argument("removes_bedrock", BoolArgumentType.bool())
46+
.executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), StringArgumentType.getString(ctx, "filter"), BoolArgumentType.getBool(ctx, "removes_bedrock")))
47+
)
48+
)
49+
.then(Commands.literal("custom_filter")
50+
.then(Commands.argument("block", BlockPredicateArgument.blockPredicate(commandBuildContext))
51+
.executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), BlockPredicateArgument.getBlockPredicate(ctx, "block")))
52+
)
53+
)
54+
)
55+
);
4256
}
4357

44-
private static int remove(CommandSourceStack source, int size, String filter) throws CommandSyntaxException {
58+
private static int remove(CommandSourceStack source, int size, String filter, boolean removesBedrock) throws CommandSyntaxException {
59+
_remove(new RemoveContext(
60+
source,
61+
size,
62+
RemovalPredicate.getFromName(filter).orElse(RemovalPredicate.JUST_ORES).stateCheck,
63+
removesBedrock
64+
));
65+
66+
return 1;
67+
}
68+
69+
private static int remove(CommandSourceStack source, int size, Predicate<BlockInWorld> blockCheck) throws CommandSyntaxException {
70+
_remove(new RemoveContext(
71+
source,
72+
size,
73+
blockCheck,
74+
false
75+
));
76+
77+
return 1;
78+
}
79+
80+
private static void _remove(RemoveContext context) throws CommandSyntaxException {
81+
var source = context.commandStack;
82+
4583
// Block running
4684
if (!COMPLETED.get()) {
4785
source.sendFailure(Component.literal("Already running, give it a second."));
48-
return 1;
86+
return;
4987
}
5088

5189
COMPLETED.set(false);
5290
var player = source.getPlayerOrException();
5391

5492
// Resolve the predicate check, we're lazy, so we'll get the enum regardless but if the filter looks like a
5593
// tag then lets try a tag instead
56-
var removalCheck = RemovalPredicate.getFromName(filter).orElse(RemovalPredicate.JUST_ORES);
57-
Predicate<BlockState> customCheck = null;
58-
if (filter.startsWith("#")) {
59-
customCheck = state -> state.is(TagKey.create(Registries.BLOCK, ResourceLocation.withDefaultNamespace(filter.replace("#", ""))));
60-
} else if(filter.contains(":")) {
61-
customCheck = state -> BuiltInRegistries.BLOCK.getKey(state.getBlock()).toString().equalsIgnoreCase(filter);
62-
}
94+
var removalCheck = context.filter;
6395

6496
ServerLevel level = source.getLevel();
6597
source.sendSuccess(() -> Component.translatable("commands.toolkit.remove.lagwarring"), true);
6698

6799
// We're removing 1 to make it so 1 = 0, 2 - 1, etc, this means we'll have correct radius 0 = 1x1, 1 = 3x3, 2 = 5x5
68-
var range = size - 1;
100+
var range = context.size - 1;
69101
var chunkPos = player.chunkPosition();
70102

71-
// Compute the max height for the wall and queue the chunk removal
72-
Predicate<BlockState> finalCustomCheck = customCheck;
73103
COMPLETED.set(false);
74104

75105
for (int x = chunkPos.x - range; x <= chunkPos.x + range; x++) {
@@ -79,7 +109,7 @@ private static int remove(CommandSourceStack source, int size, String filter) th
79109
final boolean shouldComplete = x == chunkPos.x + range && z == chunkPos.z + range;
80110

81111
ServerTickJobRunner.get().add(() -> {
82-
removeChunk(level, currentChunkPos, finalCustomCheck != null ? finalCustomCheck : removalCheck.stateCheck);
112+
removeChunk(level, currentChunkPos, removalCheck, context.removesBedrock);
83113

84114
// If this is the last chunk, then we're done
85115
if (shouldComplete) {
@@ -88,8 +118,6 @@ private static int remove(CommandSourceStack source, int size, String filter) th
88118
});
89119
}
90120
}
91-
92-
return 1;
93121
}
94122

95123
/**
@@ -99,29 +127,29 @@ private static int remove(CommandSourceStack source, int size, String filter) th
99127
* @param chunkPos the chunk to remove
100128
* @param blockCheck the predicate that defines what blocks are removed
101129
*/
102-
private static void removeChunk(ServerLevel level, ChunkPos chunkPos, Predicate<BlockState> blockCheck) {
130+
private static void removeChunk(ServerLevel level, ChunkPos chunkPos, Predicate<BlockInWorld> blockCheck, boolean removeBedrock) {
103131
BlockState airState = Blocks.AIR.defaultBlockState();
104132

105133
ChunkRangeIterator iterator = new ChunkRangeIterator(level, chunkPos, 1, true);
106134
List<BlockPos> updatedBlocks = new ArrayList<>();
107135

108-
int maxHeight = level.dimension() == ServerLevel.NETHER ? 127 : level.getMaxBuildHeight();
109-
136+
int maxHeight = level.dimension() == ServerLevel.NETHER ? 127 : level.getMaxY();
110137
while (iterator.hasNext()) {
111138
BlockPos pos = iterator.next();
112139
final BlockState state = level.getBlockState(pos);
113140

114141
// Don't remove bedrock and skip air, it's a waste of computation
115-
if (state.isAir() || state.getBlock() == Blocks.BEDROCK) {
116-
if (!state.isAir() && pos.getY() > level.getMinBuildHeight() && pos.getY() < maxHeight) {
142+
if (state.isAir() || (!removeBedrock && state.getBlock() == Blocks.BEDROCK)) {
143+
if (!state.isAir() && pos.getY() > level.getMinY() && pos.getY() < maxHeight) {
117144
level.setBlock(pos, airState, Block.UPDATE_CLIENTS);
118145
updatedBlocks.add(pos);
119146
}
120147

121148
continue;
122149
}
123150

124-
if (blockCheck.test(state)) {
151+
var blockInWorld = new BlockInWorld(level, pos, true);
152+
if (!blockCheck.test(blockInWorld)) {
125153
continue;
126154
}
127155

@@ -135,20 +163,27 @@ private static void removeChunk(ServerLevel level, ChunkPos chunkPos, Predicate<
135163
}
136164

137165
private enum RemovalPredicate {
138-
JUST_ORES(state -> state.is(ToolkitPlatform.getOresTag())),
139-
ORES_AND_MODDED(state -> state.is(ToolkitPlatform.getOresTag()) && BuiltInRegistries.BLOCK.getKey(state.getBlock()).getNamespace().equals("minecraft"));
166+
JUST_ORES(state -> !state.getState().is(ToolkitPlatform.getOresTag())),
167+
ORES_AND_MODDED(state -> !state.getState().is(ToolkitPlatform.getOresTag()) || !BuiltInRegistries.BLOCK.getKey(state.getState().getBlock()).getNamespace().equals("minecraft"));
140168

141169
public static final List<RemovalPredicate> VALUES = Arrays.asList(values());
142170
public static final String[] NAMES = VALUES.stream().map(e -> e.toString().toLowerCase()).toArray(String[]::new);
143171

144-
final Predicate<BlockState> stateCheck;
145-
RemovalPredicate(Predicate<BlockState> stateCheck) {
172+
final Predicate<BlockInWorld> stateCheck;
173+
RemovalPredicate(Predicate<BlockInWorld> stateCheck) {
146174
this.stateCheck = stateCheck;
147175
}
148176

149177
public static Optional<RemovalPredicate> getFromName(String name) {
150178
return VALUES.stream().filter(e -> e.toString().toLowerCase().equals(name)).findFirst();
151179
}
152180
}
181+
182+
private record RemoveContext(
183+
CommandSourceStack commandStack,
184+
int size,
185+
Predicate<BlockInWorld> filter,
186+
boolean removesBedrock
187+
) {}
153188
}
154189

‎common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ private static int kill(KillType type, CommandSourceStack source) throws Command
9898

9999
if (type == KillType.me || type == KillType.players) {
100100
for (Player player : level.getPlayers(e -> type.checker.test(e, e))) {
101-
player.kill();
101+
player.kill(source.getLevel());
102102
entitiesKilled++;
103103
}
104104
} else {

‎common/src/main/java/com/sunekaer/toolkit/commands/level/MineAreaCommand.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ private static int mine(CommandSourceStack source, int size, String filter) thro
5353
try {
5454
ItemStack breaker = new ItemStack(Items.NETHERITE_PICKAXE);
5555

56-
Registry<Enchantment> enchantmentRegistry = source.getLevel().registryAccess().registryOrThrow(Registries.ENCHANTMENT);
56+
Registry<Enchantment> enchantmentRegistry = source.getLevel().registryAccess().lookupOrThrow(Registries.ENCHANTMENT);
5757
// breaker.enchant(Enchantments.BLOCK_FORTUNE, 3);
58-
breaker.enchant(enchantmentRegistry.getHolderOrThrow(Enchantments.SILK_TOUCH), 1);
58+
breaker.enchant(enchantmentRegistry.get(Enchantments.SILK_TOUCH).orElseThrow(), 1);
5959

6060
MinecraftServer server = source.getServer();
6161
ServerLevel level = source.getLevel();

‎common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.minecraft.server.level.ServerLevel;
1212
import net.minecraft.server.level.ServerPlayer;
1313
import net.minecraft.world.entity.Entity;
14+
import net.minecraft.world.entity.Relative;
1415
import net.minecraft.world.level.block.Blocks;
1516
import net.minecraft.world.level.block.state.BlockState;
1617
import net.minecraft.world.level.levelgen.Heightmap;
@@ -45,7 +46,7 @@ private static int teleport(CommandSourceStack source, MinecraftServer server, C
4546

4647
if (entity instanceof ServerPlayer serverPlayer) {
4748
playerXp = serverPlayer.experienceLevel;
48-
serverPlayer.teleportTo(level, pos.getX(), pos.getY(), pos.getZ(), entity.getYRot(), entity.getXRot());
49+
serverPlayer.teleportTo(level, pos.getX(), pos.getY(), pos.getZ(), Relative.ALL, entity.getYRot(), entity.getXRot(), true);
4950
serverPlayer.setExperienceLevels(playerXp);
5051
} else {
5152
entity.teleportTo(pos.getX(), pos.getY(), pos.getZ());

‎common/src/main/java/com/sunekaer/toolkit/utils/ChunkRangeIterator.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ public ChunkRangeIterator(Level level, ChunkPos startPos, int size, boolean reve
4242
this.currentX = minX;
4343
this.currentZ = minZ;
4444
this.reverseY = reverseY;
45-
this.currentY = reverseY ? level.getMaxBuildHeight() : level.getMinBuildHeight();
45+
this.currentY = reverseY ? level.getMaxY() : level.getMinY();
4646
}
4747

4848
@Override
4949
public boolean hasNext() {
50-
return (this.reverseY ? currentY > level.getMinBuildHeight() : currentY < level.getMaxBuildHeight())
50+
return (this.reverseY ? currentY >= level.getMinY() : currentY <= level.getMaxY())
5151
&& currentZ < maxZ
5252
&& currentX < maxX;
5353
}
@@ -70,6 +70,6 @@ public BlockPos next() {
7070
}
7171
}
7272

73-
return pos;
73+
return pos;
7474
}
7575
}

‎fabric/build.gradle‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ processResources {
4545

4646
filesMatching("fabric.mod.json") {
4747
expand "version": project.version,
48-
"mcversion": rootProject.minecraft_version,
48+
"mcversion": rootProject.lowest_minecraft_version,
4949
"archversion": rootProject.architectury_version
5050
}
5151
}
@@ -88,4 +88,4 @@ publishing {
8888
from components.java
8989
}
9090
}
91-
}
91+
}

0 commit comments

Comments
 (0)