diff --git a/1.12/src/main/resources/assets/setspawnmod/icon.png b/1.12/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.12/src/main/resources/assets/setspawnmod/icon.png and b/1.12/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.12/src/main/resources/fabric.mod.json b/1.12/src/main/resources/fabric.mod.json index b1541e7..7aba05d 100644 --- a/1.12/src/main/resources/fabric.mod.json +++ b/1.12/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.13.x/build.gradle b/1.13.2/build.gradle similarity index 100% rename from 1.13.x/build.gradle rename to 1.13.2/build.gradle diff --git a/1.13.x/gradle.properties b/1.13.2/gradle.properties similarity index 62% rename from 1.13.x/gradle.properties rename to 1.13.2/gradle.properties index 6634fd3..9a1880a 100644 --- a/1.13.x/gradle.properties +++ b/1.13.2/gradle.properties @@ -1,2 +1,2 @@ minecraft_version=1.13.2 -yarn_build=565 +yarn_build=571 diff --git a/1.13.x/src/main/java/net/set/spawn/mod/mixin/MinecraftClientMixin.java b/1.13.2/src/main/java/net/set/spawn/mod/mixin/MinecraftClientMixin.java similarity index 100% rename from 1.13.x/src/main/java/net/set/spawn/mod/mixin/MinecraftClientMixin.java rename to 1.13.2/src/main/java/net/set/spawn/mod/mixin/MinecraftClientMixin.java diff --git a/1.13.x/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java b/1.13.2/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java similarity index 100% rename from 1.13.x/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java rename to 1.13.2/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java diff --git a/1.13.x/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java b/1.13.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java similarity index 63% rename from 1.13.x/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java rename to 1.13.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java index f110c70..a0cf65e 100644 --- a/1.13.x/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java +++ b/1.13.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java @@ -1,5 +1,6 @@ package net.set.spawn.mod.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapoperation.*; import com.llamalad7.mixinextras.sugar.*; import com.llamalad7.mixinextras.sugar.ref.*; @@ -13,7 +14,7 @@ import net.set.spawn.mod.interfaces.MinecraftServerExtended; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @@ -33,7 +34,16 @@ public abstract class ServerPlayerEntityMixin { public abstract ServerWorld getServerWorld(); @WrapOperation(method = "method_21281", at = @At(value = "INVOKE", target = "Ljava/util/Random;nextInt(I)I")) - private int setSpawn(Random random, int bounds, Operation original, @Local(ordinal = 0) BlockPos worldSpawn, @Local(ordinal = 0) int spawnRadius, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("newRandomValue") LocalRef newRandomValue) { + private int setSpawn( + Random random, + int bounds, + Operation original, + @Local(ordinal = 0) BlockPos worldSpawn, + @Local(ordinal = 0) int spawnRadius, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("newRandomValue") LocalRef newRandomValue + ) { int originalResult = original.call(random, bounds); if (((MinecraftServerExtended) this.server).setspawnmod$shouldModifySpawn()) { @@ -52,7 +62,7 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo int xLocal = x - worldSpawn.getX() + spawnRadius; int result = xLocal + (z - worldSpawn.getZ() + spawnRadius) * spawnDiameter; - if (xLocal >=0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { + if (xLocal >= 0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { // we save the original result in case the set spawn is invalid, see fallbackOnInvalidSpawn originalRandomResult.set(originalResult); newRandomValue.set(result); @@ -64,8 +74,36 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo return originalResult; } + @ModifyExpressionValue( + method = "method_21281", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/dimension/Dimension;method_17190(IIZ)Lnet/minecraft/util/math/BlockPos;" + ) + ) + private BlockPos captureIfHasGrassBlock( + BlockPos blockPos, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { + if (originalRandomResult.get() != null) { + // whether or not the spawn is obstructed, it has a grass block above sea level and is valid as an obstructed spawn if all other spawns are obstructed or invalid + validIncludingObstructed.set(blockPos != null); + } + return blockPos; + } + @ModifyVariable(method = "method_21281", at = @At(value = "LOAD", ordinal = 0), ordinal = 5) - private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordinal = 4) LocalIntRef o, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("newRandomValue") LocalRef newRandomValue) { + private int fallbackOnInvalidSpawn( + int p, + @Local(ordinal = 2) int k, + @Local(ordinal = 3) int n, + @Local(ordinal = 4) LocalIntRef o, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("newRandomValue") LocalRef newRandomValue, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { // checks if the for loop is on its second iteration (p == 1), meaning the setspawn given spawn was invalid // and restores the original result of Random#nextInt if (p == 1 && originalRandomResult.get() != null) { @@ -77,8 +115,8 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi } // if we made it to the end of the loop after an obstructed spawn and didn't find another non-obstructed spawn // redo the last iteration of the loop with the choice obstructed spawn - if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null) { - o.set(newRandomValue.get()); + if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null && validIncludingObstructed.get()) { + o.set(newRandomValue.get() - n * (p - 1)); newRandomValue.set(null); p = k - 1; this.setSpawnError = null; @@ -86,7 +124,14 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi return p; } - @Inject(method = "method_21281", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", ordinal = 1)) + @Inject( + method = "method_21281", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/player/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", + ordinal = 1 + ) + ) private void failOnNonRandomSpawns(CallbackInfo ci, @Share("seed") LocalRef seed) { if (seed.get() != null) { this.setSpawnError = "Failed to apply SetSpawn configuration because the spawn was not random. Not overriding player spawnpoint."; diff --git a/1.13.2/src/main/resources/assets/setspawnmod/icon.png b/1.13.2/src/main/resources/assets/setspawnmod/icon.png new file mode 100644 index 0000000..620f878 Binary files /dev/null and b/1.13.2/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.13.x/src/main/resources/fabric.mod.json b/1.13.2/src/main/resources/fabric.mod.json similarity index 71% rename from 1.13.x/src/main/resources/fabric.mod.json rename to 1.13.2/src/main/resources/fabric.mod.json index c770d20..4412f12 100644 --- a/1.13.x/src/main/resources/fabric.mod.json +++ b/1.13.2/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.13.x/src/main/resources/setspawnmod.mixins.json b/1.13.2/src/main/resources/setspawnmod.mixins.json similarity index 100% rename from 1.13.x/src/main/resources/setspawnmod.mixins.json rename to 1.13.2/src/main/resources/setspawnmod.mixins.json diff --git a/1.13.x/src/main/resources/assets/setspawnmod/icon.png b/1.13.x/src/main/resources/assets/setspawnmod/icon.png deleted file mode 100644 index cc21c11..0000000 Binary files a/1.13.x/src/main/resources/assets/setspawnmod/icon.png and /dev/null differ diff --git a/1.14-1.18.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java b/1.14-1.18.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java index 9dda76b..e19a0db 100644 --- a/1.14-1.18.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java +++ b/1.14-1.18.2/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java @@ -1,5 +1,6 @@ package net.set.spawn.mod.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapoperation.*; import com.llamalad7.mixinextras.sugar.*; import com.llamalad7.mixinextras.sugar.ref.*; @@ -7,7 +8,6 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.*; -import net.minecraft.util.Formatting; import net.minecraft.util.math.*; import net.set.spawn.mod.*; import net.set.spawn.mod.interfaces.MinecraftServerExtended; @@ -33,7 +33,16 @@ public abstract class ServerPlayerEntityMixin { public abstract ServerWorld getServerWorld(); @WrapOperation(method = "moveToSpawn", at = @At(value = "INVOKE", target = "Ljava/util/Random;nextInt(I)I")) - private int setSpawn(Random random, int bounds, Operation original, @Local(ordinal = 0) BlockPos worldSpawn, @Local(ordinal = 0) int spawnRadius, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("newRandomValue") LocalRef newRandomValue) { + private int setSpawn( + Random random, + int bounds, + Operation original, + @Local(ordinal = 0) BlockPos worldSpawn, + @Local(ordinal = 0) int spawnRadius, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("newRandomValue") LocalRef newRandomValue + ) { int originalResult = original.call(random, bounds); if (((MinecraftServerExtended) this.server).setspawnmod$shouldModifySpawn()) { @@ -51,7 +60,7 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo int xLocal = x - worldSpawn.getX() + spawnRadius; int result = xLocal + (z - worldSpawn.getZ() + spawnRadius) * spawnDiameter; - if (xLocal >=0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { + if (xLocal >= 0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { // we save the original result in case the set spawn is invalid, see fallbackOnInvalidSpawn originalRandomResult.set(originalResult); newRandomValue.set(result); @@ -63,8 +72,52 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo return originalResult; } + @Dynamic + @ModifyExpressionValue( + method = "moveToSpawn", + at = { + @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/SpawnLocating;findOverworldSpawn(Lnet/minecraft/server/world/ServerWorld;IIZ)Lnet/minecraft/util/math/BlockPos;" + ), + // 1.18+ findOverworldSpawn, no boolean + @At( + value = "INVOKE", + target = "Lnet/minecraft/class_5322;method_29194(Lnet/minecraft/class_3218;II)Lnet/minecraft/class_2338;" + ), + @At( + value = "INVOKE", + // Dimension#getTopSpawningBlockPosition + target = "Lnet/minecraft/class_2869;method_12444(IIZ)Lnet/minecraft/class_2338;", + remap = false + ) + }, + require = 1, + allow = 1 + ) + private BlockPos captureIfHasGrassBlock( + BlockPos blockPos, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { + if (originalRandomResult.get() != null) { + // whether or not the spawn is obstructed, it has a grass block above sea level and is valid as an obstructed spawn if all other spawns are obstructed or invalid + validIncludingObstructed.set(blockPos != null); + } + return blockPos; + } + @ModifyVariable(method = "moveToSpawn", at = @At(value = "LOAD", ordinal = 0), ordinal = 5) - private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordinal = 4) LocalIntRef o, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("newRandomValue") LocalRef newRandomValue) { + private int fallbackOnInvalidSpawn( + int p, + @Local(ordinal = 2) int k, + @Local(ordinal = 3) int n, + @Local(ordinal = 4) LocalIntRef o, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("newRandomValue") LocalRef newRandomValue, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { // checks if the for loop is on its second iteration (p == 1), meaning the setspawn given spawn was invalid // and restores the original result of Random#nextInt if (p == 1 && originalRandomResult.get() != null) { @@ -76,8 +129,8 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi } // if we made it to the end of the loop after an obstructed spawn and didn't find another non-obstructed spawn // redo the last iteration of the loop with the choice obstructed spawn - if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null) { - o.set(newRandomValue.get()); + if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null && validIncludingObstructed.get()) { + o.set(newRandomValue.get() - n * (p - 1)); newRandomValue.set(null); p = k - 1; this.setSpawnError = null; @@ -85,7 +138,14 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi return p; } - @Inject(method = "moveToSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", ordinal = 1)) + @Inject( + method = "moveToSpawn", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", + ordinal = 1 + ) + ) private void failOnNonRandomSpawns(CallbackInfo ci, @Share("seed") LocalRef seed) { if (seed.get() != null) { this.setSpawnError = "Failed to apply SetSpawn configuration because the spawn was not random. Not overriding player spawnpoint."; @@ -109,7 +169,8 @@ private void sendErrorMessage(CallbackInfo ci) { @Inject(method = "method_14235(Lnet/minecraft/class_1703;)V", at = @At("TAIL"), require = 0, remap = false) private void sendErrorMessage2(CallbackInfo ci) { if (this.setSpawnError != null) { - this.sendMessage(new LiteralText(this.setSpawnError + " This run is not verifiable.").formatted(Formatting.RED), false); + // sorry the code is bad. it is the only way. + this.sendMessage(new LiteralText("§c" + this.setSpawnError + " This run is not verifiable."), false); this.setSpawnError = null; } } diff --git a/1.14-1.18.2/src/main/resources/assets/setspawnmod/icon.png b/1.14-1.18.2/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.14-1.18.2/src/main/resources/assets/setspawnmod/icon.png and b/1.14-1.18.2/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.14-1.18.2/src/main/resources/fabric.mod.json b/1.14-1.18.2/src/main/resources/fabric.mod.json index 3de2524..84932c5 100644 --- a/1.14-1.18.2/src/main/resources/fabric.mod.json +++ b/1.14-1.18.2/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.19-1.21.6/src/main/resources/assets/setspawnmod/icon.png b/1.19-1.21.6/src/main/resources/assets/setspawnmod/icon.png deleted file mode 100644 index cc21c11..0000000 Binary files a/1.19-1.21.6/src/main/resources/assets/setspawnmod/icon.png and /dev/null differ diff --git a/1.19-1.21.6/build.gradle b/1.19-1.21.7/build.gradle similarity index 100% rename from 1.19-1.21.6/build.gradle rename to 1.19-1.21.7/build.gradle diff --git a/1.19-1.21.6/gradle.properties b/1.19-1.21.7/gradle.properties similarity index 100% rename from 1.19-1.21.6/gradle.properties rename to 1.19-1.21.7/gradle.properties diff --git a/1.19-1.21.6/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java b/1.19-1.21.7/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java similarity index 100% rename from 1.19-1.21.6/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java rename to 1.19-1.21.7/src/main/java/net/set/spawn/mod/mixin/MinecraftServerMixin.java diff --git a/1.19-1.21.6/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java b/1.19-1.21.7/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java similarity index 54% rename from 1.19-1.21.6/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java rename to 1.19-1.21.7/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java index 374100d..5dde68a 100644 --- a/1.19-1.21.6/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java +++ b/1.19-1.21.7/src/main/java/net/set/spawn/mod/mixin/ServerPlayerEntityMixin.java @@ -1,5 +1,6 @@ package net.set.spawn.mod.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapoperation.*; import com.llamalad7.mixinextras.sugar.*; import com.llamalad7.mixinextras.sugar.ref.*; @@ -32,8 +33,27 @@ public abstract class ServerPlayerEntityMixin { public abstract ServerWorld getWorld(); @Dynamic - @WrapOperation(method = {"moveToSpawn", "method_14245(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2338;"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/random/Random;nextInt(I)I")) - private int setSpawn(Random random, int bounds, Operation original, @Local(ordinal = 0) BlockPos worldSpawn, @Local(ordinal = 0) int spawnRadius, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("isRandomSpawn") LocalBooleanRef isRandomSpawn, @Share("newRandomValue") LocalRef newRandomValue) { + @WrapOperation( + method = { + "moveToSpawn", + "method_14245(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2338;" + }, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/util/math/random/Random;nextInt(I)I" + ) + ) + private int setSpawn( + Random random, + int bounds, + Operation original, + @Local(ordinal = 0) BlockPos worldSpawn, + @Local(ordinal = 0) int spawnRadius, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("isRandomSpawn") LocalBooleanRef isRandomSpawn, + @Share("newRandomValue") LocalRef newRandomValue + ) { // fallback for 1.21 with no else statement in the skylight check isRandomSpawn.set(true); int originalResult = original.call(random, bounds); @@ -54,7 +74,7 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo int xLocal = x - worldSpawn.getX() + spawnRadius; int result = xLocal + (z - worldSpawn.getZ() + spawnRadius) * spawnDiameter; - if (xLocal >=0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { + if (xLocal >= 0 && xLocal < spawnDiameter && result >= 0 && result < bounds) { // we save the original result in case the set spawn is invalid, see fallbackOnInvalidSpawn originalRandomResult.set(originalResult); newRandomValue.set(result); @@ -67,8 +87,50 @@ private int setSpawn(Random random, int bounds, Operation original, @Lo } @Dynamic - @ModifyVariable(method = {"moveToSpawn", "method_14245(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2338;"}, at = @At(value = "LOAD", ordinal = 0), ordinal = 5) - private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordinal = 4) LocalIntRef o, @Share("seed") LocalRef seed, @Share("originalRandomResult") LocalRef originalRandomResult, @Share("newRandomValue") LocalRef newRandomValue) { + @ModifyExpressionValue( + method = { + "moveToSpawn", + "method_14245(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2338;" + }, at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/SpawnLocating;findOverworldSpawn(Lnet/minecraft/server/world/ServerWorld;II)Lnet/minecraft/util/math/BlockPos;" + ) + ) + private BlockPos captureIfHasGrassBlock( + BlockPos blockPos, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { + if (originalRandomResult.get() != null) { + // whether or not the spawn is obstructed, it has a grass block above sea level and is valid as an obstructed spawn if all other spawns are obstructed or invalid + validIncludingObstructed.set(blockPos != null); + } + return blockPos; + } + + + @Dynamic + @ModifyVariable( + method = { + "moveToSpawn", + "method_14245(Lnet/minecraft/class_3218;Lnet/minecraft/class_2338;)Lnet/minecraft/class_2338;" + }, + at = @At( + value = "LOAD", + ordinal = 0 + ), + ordinal = 5 + ) + private int fallbackOnInvalidSpawn( + int p, + @Local(ordinal = 2) int k, + @Local(ordinal = 3) int n, + @Local(ordinal = 4) LocalIntRef o, + @Share("seed") LocalRef seed, + @Share("originalRandomResult") LocalRef originalRandomResult, + @Share("newRandomValue") LocalRef newRandomValue, + @Share("validIncludingObstructed") LocalBooleanRef validIncludingObstructed + ) { // checks if the for loop is on its second iteration (p == 1), meaning the setspawn given spawn was invalid // and restores the original result of Random#nextInt if (p == 1 && originalRandomResult.get() != null) { @@ -80,8 +142,8 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi } // if we made it to the end of the loop after an obstructed spawn and didn't find another non-obstructed spawn // redo the last iteration of the loop with the choice obstructed spawn - if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null) { - o.set(newRandomValue.get()); + if (p == k && originalRandomResult.get() == null && newRandomValue.get() != null && validIncludingObstructed.get()) { + o.set(newRandomValue.get() - n * (p - 1)); newRandomValue.set(null); p = k - 1; this.setSpawnError = null; @@ -90,7 +152,15 @@ private int fallbackOnInvalidSpawn(int p, @Local(ordinal = 2) int k, @Local(ordi } @Group(min = 1, max = 1) - @Inject(method = "moveToSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", ordinal = 1), require = 0) + @Inject( + method = "moveToSpawn", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/ServerPlayerEntity;refreshPositionAndAngles(Lnet/minecraft/util/math/BlockPos;FF)V", + ordinal = 1 + ), + require = 0 + ) private void failOnNonRandomSpawns(CallbackInfo ci, @Share("seed") LocalRef seed) { if (seed.get() != null) { this.setSpawnError = "Failed to apply SetSpawn configuration because the spawn was not random. Not overriding player spawnpoint."; @@ -102,10 +172,20 @@ private void failOnNonRandomSpawns(CallbackInfo ci, @Share("seed") LocalRef cir, @Share("seed") LocalRef seed, @Share("isRandomSpawn") LocalBooleanRef isRandomSpawn) { if (!isRandomSpawn.get() && seed.get() != null) { diff --git a/1.19-1.21.7/src/main/resources/assets/setspawnmod/icon.png b/1.19-1.21.7/src/main/resources/assets/setspawnmod/icon.png new file mode 100644 index 0000000..620f878 Binary files /dev/null and b/1.19-1.21.7/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.19-1.21.6/src/main/resources/fabric.mod.json b/1.19-1.21.7/src/main/resources/fabric.mod.json similarity index 71% rename from 1.19-1.21.6/src/main/resources/fabric.mod.json rename to 1.19-1.21.7/src/main/resources/fabric.mod.json index a404fbd..124360d 100644 --- a/1.19-1.21.6/src/main/resources/fabric.mod.json +++ b/1.19-1.21.7/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.19-1.21.6/src/main/resources/setspawnmod.mixins.json b/1.19-1.21.7/src/main/resources/setspawnmod.mixins.json similarity index 100% rename from 1.19-1.21.6/src/main/resources/setspawnmod.mixins.json rename to 1.19-1.21.7/src/main/resources/setspawnmod.mixins.json diff --git a/1.3-1.5.2/src/main/resources/assets/setspawnmod/icon.png b/1.3-1.5.2/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.3-1.5.2/src/main/resources/assets/setspawnmod/icon.png and b/1.3-1.5.2/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.3-1.5.2/src/main/resources/fabric.mod.json b/1.3-1.5.2/src/main/resources/fabric.mod.json index ed3c013..2695576 100644 --- a/1.3-1.5.2/src/main/resources/fabric.mod.json +++ b/1.3-1.5.2/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.6.x/src/main/resources/assets/setspawnmod/icon.png b/1.6.x/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.6.x/src/main/resources/assets/setspawnmod/icon.png and b/1.6.x/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.6.x/src/main/resources/fabric.mod.json b/1.6.x/src/main/resources/fabric.mod.json index 73aba73..c3ea9ed 100644 --- a/1.6.x/src/main/resources/fabric.mod.json +++ b/1.6.x/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.7.x/src/main/resources/assets/setspawnmod/icon.png b/1.7.x/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.7.x/src/main/resources/assets/setspawnmod/icon.png and b/1.7.x/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.7.x/src/main/resources/fabric.mod.json b/1.7.x/src/main/resources/fabric.mod.json index 1040e29..8738a27 100644 --- a/1.7.x/src/main/resources/fabric.mod.json +++ b/1.7.x/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/1.8-1.12.2/src/main/resources/assets/setspawnmod/icon.png b/1.8-1.12.2/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/1.8-1.12.2/src/main/resources/assets/setspawnmod/icon.png and b/1.8-1.12.2/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/1.8-1.12.2/src/main/resources/fabric.mod.json b/1.8-1.12.2/src/main/resources/fabric.mod.json index e0fcf16..6d003eb 100644 --- a/1.8-1.12.2/src/main/resources/fabric.mod.json +++ b/1.8-1.12.2/src/main/resources/fabric.mod.json @@ -19,6 +19,11 @@ "tildejustin", "contaria" ], + "contact": { + "homepage": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/set-spawn/issues" + }, "license": "LGPL-3.0-only", "icon": "assets/setspawnmod/icon.png", "environment": "*", diff --git a/gradle.properties b/gradle.properties index 1c509cb..0381a13 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true org.gradle.caching = true -mod_version = 4.2.0 +mod_version = 4.2.1 archives_name = setspawnmod base_archives_name = setspawnmod-common maven_group = me.bdamja diff --git a/settings.gradle b/settings.gradle index 3567d71..f548604 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,6 +14,6 @@ include "1.6.x" include "1.7.x" include "1.12" include "1.8-1.12.2" -include "1.13.x" +include "1.13.2" include "1.14-1.18.2" -include "1.19-1.21.6" +include "1.19-1.21.7" diff --git a/src/main/resources/assets/setspawnmod/icon.png b/src/main/resources/assets/setspawnmod/icon.png index cc21c11..620f878 100644 Binary files a/src/main/resources/assets/setspawnmod/icon.png and b/src/main/resources/assets/setspawnmod/icon.png differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ea1b112..561dae6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "setspawnmod-common", "version": "${version}", "name": "Set Spawn Common", - "description": "Library code for the Set Spawn mod.", + "description": "Library code for the Set Spawn mod", "authors": [ { "name": "bdamja", @@ -30,5 +30,13 @@ "depends": { "fabricloader": ">=0.15.0", "minecraft": "*" + }, + "custom": { + "modmenu": { + "badges": [ + "library" + ], + "parent": "setspawnmod" + } } }