Skip to content

Commit 273549b

Browse files
committed
validate most (all?) bridge implementations
1 parent 8983413 commit 273549b

32 files changed

+863
-182
lines changed

1.20/src/main/java/io/github/axolotlclient/bridge/mixin/MinecraftClientMixin.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ public abstract class MinecraftClientMixin implements AxoMinecraftClient {
125125

126126
@Override
127127
public void br$sendToServer(String msg) {
128-
player.networkHandler.sendChatMessage(msg);
128+
if (msg.startsWith("/")) {
129+
player.networkHandler.sendCommand(msg);
130+
} else {
131+
player.networkHandler.sendChatCommand(msg);
132+
}
129133
}
130134
}

1.20/src/main/java/io/github/axolotlclient/bridge/mixin/internal/PlatformImplInternalMixin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ public static AxoText.Mutable createTranslatable(String key, Object... args) {
180180
return Text.translatable(key, args);
181181
}
182182

183-
184183
/**
185184
* @author Flowey
186185
* @reason Implement bridge platform.

1.21.7/src/main/java/io/github/axolotlclient/bridge/mixin/MinecraftClientMixin.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@
2323
package io.github.axolotlclient.bridge.mixin;
2424

2525
import io.github.axolotlclient.bridge.AxoMinecraftClient;
26+
import io.github.axolotlclient.bridge.AxoPlayerListEntry;
27+
import io.github.axolotlclient.bridge.AxoSession;
2628
import io.github.axolotlclient.bridge.entity.AxoPlayer;
2729
import io.github.axolotlclient.bridge.key.AxoClientKeybinds;
2830
import io.github.axolotlclient.bridge.render.AxoFont;
31+
import io.github.axolotlclient.bridge.util.AxoText;
2932
import io.github.axolotlclient.bridge.world.AxoWorld;
33+
import java.util.Collection;
34+
import java.util.Optional;
3035
import net.minecraft.client.Minecraft;
3136
import net.minecraft.client.Options;
37+
import net.minecraft.client.User;
3238
import net.minecraft.client.gui.Font;
39+
import net.minecraft.client.gui.Gui;
3340
import net.minecraft.client.multiplayer.ClientLevel;
41+
import net.minecraft.client.multiplayer.ServerData;
3442
import net.minecraft.client.player.LocalPlayer;
43+
import net.minecraft.network.chat.Component;
3544
import org.jetbrains.annotations.Nullable;
3645
import org.spongepowered.asm.mixin.Final;
3746
import org.spongepowered.asm.mixin.Mixin;
@@ -53,6 +62,20 @@ public abstract class MinecraftClientMixin implements AxoMinecraftClient {
5362
@Final
5463
public Options options;
5564

65+
@Shadow
66+
public abstract boolean isSingleplayer();
67+
68+
@Shadow
69+
public abstract ServerData getCurrentServer();
70+
71+
@Shadow
72+
@Final
73+
public Gui gui;
74+
75+
@Shadow
76+
@Final
77+
private User user;
78+
5679
@Override
5780
public @Nullable AxoPlayer br$getPlayer() {
5881
return player;
@@ -74,4 +97,39 @@ public abstract class MinecraftClientMixin implements AxoMinecraftClient {
7497
public AxoClientKeybinds br$getKeybinds() {
7598
return options;
7699
}
100+
101+
@Override
102+
public boolean br$isLocalServer() {
103+
return isSingleplayer();
104+
}
105+
106+
@Override
107+
public String br$getServerAddress() {
108+
return Optional.ofNullable(getCurrentServer()).map(x -> x.ip).orElse(null);
109+
}
110+
111+
@Override
112+
public Collection<? extends AxoPlayerListEntry> br$getOnlinePlayers() {
113+
return player.connection.getOnlinePlayers();
114+
}
115+
116+
@Override
117+
public void br$sendToClient(AxoText msg) {
118+
gui.getChat().addMessage((Component) msg);
119+
}
120+
121+
@Override
122+
public void br$sendToServer(String msg) {
123+
if (msg.startsWith("/")) {
124+
player.connection.sendCommand(msg);
125+
} else {
126+
player.connection.sendChat(msg);
127+
}
128+
}
129+
130+
@Override
131+
public AxoSession br$getSession() {
132+
// TODO... -?
133+
return new AxoSession(user.getName(), user.getProfileId().toString(), user.getAccessToken());
134+
}
77135
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright © 2025 moehreag <[email protected]> & Contributors
3+
*
4+
* This file is part of AxolotlClient.
5+
*
6+
* This program is free software; you can redistribute it and/or
7+
* modify it under the terms of the GNU Lesser General Public
8+
* License as published by the Free Software Foundation; either
9+
* version 3 of the License, or (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
* Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
*
20+
* For more information, see the LICENSE file.
21+
*/
22+
23+
package io.github.axolotlclient.bridge.mixin;
24+
25+
import com.mojang.blaze3d.platform.NativeImage;
26+
import io.github.axolotlclient.bridge.PlatformDispatch;
27+
import io.github.axolotlclient.bridge.impl.AxoSpriteImpl;
28+
import io.github.axolotlclient.bridge.render.AxoSprite;
29+
import io.github.axolotlclient.util.ThreadExecuter;
30+
import java.io.IOException;
31+
import java.util.Objects;
32+
import net.minecraft.client.Minecraft;
33+
import net.minecraft.client.gui.GuiGraphics;
34+
import net.minecraft.client.gui.screens.FaviconTexture;
35+
import net.minecraft.client.multiplayer.ServerData;
36+
import net.minecraft.client.multiplayer.ServerStatusPinger;
37+
import net.minecraft.client.renderer.RenderPipelines;
38+
import org.apache.commons.lang3.mutable.MutableInt;
39+
import org.spongepowered.asm.mixin.Mixin;
40+
import org.spongepowered.asm.mixin.Overwrite;
41+
import org.spongepowered.asm.mixin.Unique;
42+
43+
@Mixin(value = PlatformDispatch.class, remap = false)
44+
public class PlatformDispatchMixin {
45+
@Unique
46+
private static final ServerStatusPinger axo$pinger = new ServerStatusPinger();
47+
48+
@Unique
49+
private static void getRealTimeServerPing(ServerData server, MutableInt currentServerPing) {
50+
ThreadExecuter.scheduleTask(() -> {
51+
try {
52+
axo$pinger.pingServer(server, () -> {
53+
}, () -> currentServerPing.setValue(server.ping));
54+
} catch (Exception ignored) {
55+
}
56+
});
57+
}
58+
59+
/**
60+
* @author Flowey
61+
* @reason Implement bridge.
62+
*/
63+
@Overwrite
64+
public static void pingHud$updatePing(MutableInt currentServerPing) {
65+
final var minecraft = Minecraft.getInstance();
66+
if (minecraft.getCurrentServer() != null) {
67+
getRealTimeServerPing(minecraft.getCurrentServer(), currentServerPing);
68+
} else if (minecraft.hasSingleplayerServer()) {
69+
currentServerPing.setValue(1);
70+
}
71+
}
72+
73+
/**
74+
* @author Flowey
75+
* @reason Implement bridge.
76+
*/
77+
@Overwrite
78+
public static AxoSprite.Dynamic ipHud$getServerIcon() throws IOException {
79+
final var minecraft = Minecraft.getInstance();
80+
final var icon = FaviconTexture.forServer(minecraft.getTextureManager(), Objects.requireNonNull(minecraft.getCurrentServer()).ip);
81+
82+
try {
83+
icon.upload(NativeImage.read(minecraft.getCurrentServer().getIconBytes()));
84+
} catch (Throwable e) {
85+
icon.close();
86+
throw e;
87+
}
88+
89+
class Impl implements AxoSprite.Dynamic, AxoSpriteImpl {
90+
@Override
91+
public void draw(Minecraft client, GuiGraphics stack, int sX, int sY, int sW, int sH) {
92+
stack.blit(RenderPipelines.GUI_TEXTURED, icon.textureLocation(), sX, sY, 0, 0, sW, sH, 16, 16, -1);
93+
}
94+
95+
@Override
96+
public void close() {
97+
icon.close();
98+
}
99+
}
100+
101+
return new Impl();
102+
}
103+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.github.axolotlclient.bridge.mixin;
2+
3+
import com.mojang.authlib.GameProfile;
4+
import io.github.axolotlclient.bridge.AxoPlayerListEntry;
5+
import java.util.UUID;
6+
import net.minecraft.client.multiplayer.PlayerInfo;
7+
import org.spongepowered.asm.mixin.Final;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Shadow;
10+
11+
@Mixin(PlayerInfo.class)
12+
public class PlayerListEntryMixin implements AxoPlayerListEntry {
13+
@Shadow
14+
@Final
15+
private GameProfile profile;
16+
17+
@Override
18+
public String br$getName() {
19+
return profile.getName();
20+
}
21+
22+
@Override
23+
public UUID br$getId() {
24+
return profile.getId();
25+
}
26+
}

1.21.7/src/main/java/io/github/axolotlclient/bridge/mixin/entity/EntityMixin.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ public abstract class EntityMixin implements AxoEntity {
5454
@Shadow
5555
public abstract UUID getUUID();
5656

57+
@Shadow
58+
private int id;
59+
60+
@Shadow
61+
private float xRot;
62+
5763
@Override
5864
public @Nullable AxoEntity br$getVehicle() {
5965
return vehicle;
@@ -89,4 +95,14 @@ public abstract class EntityMixin implements AxoEntity {
8995
public UUID br$getUuid() {
9096
return getUUID();
9197
}
98+
99+
@Override
100+
public float br$getPitch() {
101+
return xRot;
102+
}
103+
104+
@Override
105+
public int br$getNetId() {
106+
return id;
107+
}
92108
}
Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,44 @@
2222

2323
package io.github.axolotlclient.bridge.mixin.entity;
2424

25+
import com.mojang.authlib.GameProfile;
2526
import io.github.axolotlclient.bridge.entity.AxoPlayer;
27+
import io.github.axolotlclient.bridge.item.AxoItem;
2628
import io.github.axolotlclient.bridge.item.AxoPlayerInventory;
2729
import net.minecraft.world.entity.player.Inventory;
2830
import net.minecraft.world.entity.player.Player;
31+
import net.minecraft.world.item.ItemStack;
32+
import net.minecraft.world.item.Items;
33+
import org.jetbrains.annotations.Nullable;
2934
import org.spongepowered.asm.mixin.Final;
3035
import org.spongepowered.asm.mixin.Mixin;
3136
import org.spongepowered.asm.mixin.Shadow;
3237

3338
@Mixin(Player.class)
34-
public class PlayerEntityMixin implements AxoPlayer {
39+
public abstract class PlayerMixin implements AxoPlayer {
40+
@Shadow
41+
@Final
42+
private GameProfile gameProfile;
43+
3544
@Shadow
3645
@Final
3746
Inventory inventory;
3847

48+
@Shadow
49+
public abstract ItemStack getProjectile(ItemStack weaponStack);
50+
3951
@Override
4052
public AxoPlayerInventory br$getInventory() {
4153
return this.inventory;
4254
}
55+
56+
@Override
57+
public @Nullable AxoItem br$getProjectileItem() {
58+
return getProjectile(Items.BOW.getDefaultInstance()).getItem();
59+
}
60+
61+
@Override
62+
public String br$getName() {
63+
return gameProfile.getName();
64+
}
4365
}

0 commit comments

Comments
 (0)