Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1.20.4 #325

Merged
merged 2 commits into from
Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ jobs:
- uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest-1.20.2"
automatic_release_tag: "latest-1.20.4"
prerelease: false
title: "1.20.2 Build"
title: "1.20.4 Build"
files: |
./build/libs/*.jar

2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

modImplementation("meteordevelopment:meteor-client:${project.meteor_version}-SNAPSHOT")
modImplementation "baritone:fabric:${project.minecraft_version}-SNAPSHOT"
modImplementation "meteordevelopment:baritone:${project.minecraft_version}-SNAPSHOT"

// seed .locate and ore sim
extraLibs('com.seedfinding:mc_math:ffd2edcfcc0d18147549c88cc7d8ec6cf21b5b91') { transitive = false }
Expand Down
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
org.gradle.jvmargs=-Xmx2G

# Fabric Properties
minecraft_version=1.20.2
yarn_version=1.20.2+build.4
loader_version=0.14.24
minecraft_version=1.20.4
yarn_version=1.20.4+build.3
loader_version=0.15.2
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what the "correct" loader version to use is, I went with the same version meteor-client is using https://github.com/MeteorDevelopment/meteor-client/blob/master/gradle.properties#L6


# Mod Properties
mod_version = 0.3
maven_group = anticope.rejects
archives_base_name = meteor-rejects-addon

meteor_version=0.5.5
meteor_version=0.5.6
4 changes: 2 additions & 2 deletions src/main/java/anticope/rejects/commands/GiveCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
tag.putBoolean("Interpret", true);
tag.putBoolean("NoGravity", true);
tag.putBoolean("CustomNameVisible", true);
tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message)));
tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message)));
tag.put("Pos", NbtList);
stack.setSubNbt("EntityTag", tag);
GiveUtils.giveItem(stack);
Expand All @@ -88,7 +88,7 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
String message = ctx.getArgument("message", String.class).replace("&", "\247");
ItemStack stack = new ItemStack(Items.BAT_SPAWN_EGG);
NbtCompound tag = new NbtCompound();
tag.putString("CustomName", Text.Serializer.toJson(Text.literal(message)));
tag.putString("CustomName", Text.Serialization.toJsonString(Text.literal(message)));
tag.putBoolean("NoAI", true);
tag.putBoolean("Silent", true);
tag.putBoolean("PersistenceRequired", true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import meteordevelopment.meteorclient.commands.Command;
import net.minecraft.client.gui.screen.ConnectScreen;
import net.minecraft.client.gui.screen.multiplayer.ConnectScreen;
import net.minecraft.client.gui.screen.TitleScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.network.ServerAddress;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/anticope/rejects/gui/screens/StatsScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ private void updateData() {
liv.getActiveStatusEffects().forEach((effect, instance) -> {
String status = lang.get(effect.getTranslationKey());
if (instance.getAmplifier() != 0) {
status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1)));
status += (String.format(" %d (%s)", instance.getAmplifier()+1, StatusEffectUtil.getDurationText(instance, 1, 20)));
} else {
status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1)));
status += (String.format(" (%s)", StatusEffectUtil.getDurationText(instance, 1, 20)));
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably safe to assume 20 unless we want this to scale on tick warped servers for whatever reason

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think its safer to use TickRate.INSTANCE.getTickRate(), some servers may run with <20 tps.

}
effectList.add(theme.label(status)).expandX();
});
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/anticope/rejects/modules/AutoFarm.java
Original file line number Diff line number Diff line change
Expand Up @@ -270,19 +270,20 @@ private boolean isMature(BlockState state, Block block) {

private boolean bonemealFilter(Block block) {
return block instanceof CropBlock ||
block instanceof CocoaBlock ||
block instanceof StemBlock ||
block instanceof MushroomPlantBlock ||
block instanceof SweetBerryBushBlock ||
block instanceof AzaleaBlock ||
block instanceof SaplingBlock;
block instanceof SaplingBlock ||
block == Blocks.COCOA ||
block == Blocks.SWEET_BERRY_BUSH;
}

private boolean harvestFilter(Block block) {
return block instanceof CropBlock ||
block instanceof GourdBlock ||
block instanceof NetherWartBlock ||
block instanceof SweetBerryBushBlock;
block == Blocks.PUMPKIN ||
block == Blocks.MELON ||
block == Blocks.NETHER_WART ||
block == Blocks.SWEET_BERRY_BUSH;
}

private boolean plantFilter(Item item) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/anticope/rejects/modules/CoordLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ private void onPacketReceive(PacketEvent.Receive event) {
Vec3d playerPosition = entity.getPos();

if (playerPosition.distanceTo(packetPosition) >= minDistance.get()) {
info(formatMessage("Player '" + entity.getEntityName() + "' has teleported to ", packetPosition));
info(formatMessage("Player '" + entity.getNameForScoreboard() + "' has teleported to ", packetPosition));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/main/java/anticope/rejects/modules/NewChunks.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import net.minecraft.util.math.Box;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.chunk.WorldChunk;

import java.util.Collections;
Expand Down Expand Up @@ -112,7 +113,7 @@ private void onRender(Render3DEvent event) {
synchronized (newChunks) {
for (ChunkPos c : newChunks) {
if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) {
render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event);
render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), newChunksSideColor.get(), newChunksLineColor.get(), shapeMode.get(), event);
}
}
}
Expand All @@ -122,7 +123,7 @@ private void onRender(Render3DEvent event) {
synchronized (oldChunks) {
for (ChunkPos c : oldChunks) {
if (mc.getCameraEntity().getBlockPos().isWithinDistance(c.getStartPos(), 1024)) {
render(new Box(c.getStartPos(), c.getStartPos().add(16, renderHeight.get(), 16)), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event);
render(new Box(Vec3d.of(c.getStartPos()), Vec3d.of(c.getStartPos().add(16, renderHeight.get(), 16))), oldChunksSideColor.get(), oldChunksLineColor.get(), shapeMode.get(), event);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/anticope/rejects/modules/TreeAura.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ private void doBonemeal(BlockPos sapling) {

private boolean canPlant(BlockPos pos) {
Block b = mc.world.getBlockState(pos).getBlock();
if (b.equals(Blocks.GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) {
if (b.equals(Blocks.SHORT_GRASS) || b.equals(Blocks.GRASS_BLOCK) || b.equals(Blocks.DIRT) || b.equals(Blocks.COARSE_DIRT)) {
final AtomicBoolean plant = new AtomicBoolean(true);
IntStream.rangeClosed(1, 5).forEach(i -> {
// Check above
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@
import com.google.gson.*;
import com.mojang.authlib.Environment;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.SignatureState;
import com.mojang.authlib.exceptions.AuthenticationException;
import com.mojang.authlib.minecraft.InsecurePublicKeyException;
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import com.mojang.authlib.minecraft.MinecraftProfileTextures;
import com.mojang.authlib.properties.Property;
import com.mojang.authlib.yggdrasil.TextureUrlChecker;
import com.mojang.authlib.yggdrasil.ServicesKeyInfo;
import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo;
import com.mojang.authlib.yggdrasil.response.MinecraftTexturesPayload;
import com.mojang.util.UUIDTypeAdapter;
import meteordevelopment.meteorclient.utils.network.Http;
Expand All @@ -31,7 +36,7 @@
import static meteordevelopment.meteorclient.MeteorClient.mc;

public class CustomYggdrasilLogin {
public static Environment localYggdrasilApi = new Environment("/api", "/sessionserver", "/minecraftservices", "Custom-Yggdrasil");
public static Environment localYggdrasilApi = new Environment("/sessionserver", "/minecraftservices", "Custom-Yggdrasil");

public static Session login(String name, String password, String server) throws AuthenticationException {
try {
Expand Down Expand Up @@ -61,7 +66,7 @@ public static Session login(String name, String password, String server) throws

public static class LocalYggdrasilMinecraftSessionService extends YggdrasilMinecraftSessionService {
private static final Logger LOGGER = LogManager.getLogger();
private final PublicKey publicKey;
private final ServicesKeyInfo publicKey;
private final Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create();

public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService service, String serverUrl) {
Expand All @@ -71,50 +76,53 @@ public LocalYggdrasilMinecraftSessionService(YggdrasilAuthenticationService serv
this.publicKey = getPublicKey(json.get("signaturePublickey").getAsString());
}

private static PublicKey getPublicKey(String key) {
private static ServicesKeyInfo getPublicKey(String key) {
key = key.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
try {
byte[] byteKey = Base64.getDecoder().decode(key.replace("\n", ""));
X509EncodedKeySpec spec = new X509EncodedKeySpec(byteKey);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePublic(spec);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
return YggdrasilServicesKeyInfo.parse(byteKey);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return null;
}

@Override
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has changed pretty significantly, but as far as I could tell, the old code was a copy-paste of the base class implementation with the TextureUrlChecker.isAllowedTextureDomain() check removed, and checking the signature against publicKey instead of servicesKeySet from the base class. I made the same changes when overriding the 1.20.4 method, but haven't tested it.

public Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> getTextures(final GameProfile profile, final boolean requireSecure) {
final Property textureProperty = Iterables.getFirst(profile.getProperties().get("textures"), null);

if (textureProperty == null)
return new HashMap<>();

if (requireSecure) {
if (!textureProperty.hasSignature()) {
LOGGER.error("Signature is missing from textures payload");
throw new InsecurePublicKeyException("Signature is missing from textures payload");
}
if (!textureProperty.isSignatureValid(publicKey)) {
LOGGER.error("Textures payload has been tampered with (signature invalid)");
throw new InsecurePublicKeyException("Textures payload has been tampered with (signature invalid)");
}
private SignatureState getPropertySignatureState(final Property property) {
if (!property.hasSignature()) {
return SignatureState.UNSIGNED;
}
if (!publicKey.validateProperty(property)) {
return SignatureState.INVALID;
}
return SignatureState.SIGNED;
}

@Override
public MinecraftProfileTextures unpackTextures(final Property packedTextures) {
final String value = packedTextures.value();
final SignatureState signatureState = getPropertySignatureState(packedTextures);

final MinecraftTexturesPayload result;
try {
final String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(textureProperty.value()), StandardCharsets.UTF_8);
final String json = new String(Base64.getDecoder().decode(value), StandardCharsets.UTF_8);
result = gson.fromJson(json, MinecraftTexturesPayload.class);
} catch (final JsonParseException e) {
} catch (final JsonParseException | IllegalArgumentException e) {
LOGGER.error("Could not decode textures payload", e);
return new HashMap<>();
return MinecraftProfileTextures.EMPTY;
}

if (result == null || result.textures() == null || result.textures().isEmpty()) {
return MinecraftProfileTextures.EMPTY;
}

if (result == null || result.textures() == null)
return new HashMap<>();
final Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> textures = result.textures();

return result.textures();
return new MinecraftProfileTextures(
textures.get(MinecraftProfileTexture.Type.SKIN),
textures.get(MinecraftProfileTexture.Type.CAPE),
textures.get(MinecraftProfileTexture.Type.ELYTRA),
signatureState
);
}
}

Expand Down
Loading