add status bossbar
This commit is contained in:
parent
e15a7d9666
commit
eb21ecfddc
6 changed files with 90 additions and 7 deletions
|
@ -1,4 +1,5 @@
|
||||||
{
|
{
|
||||||
"pixelshare.downloading": "Downloading image...",
|
"pixelchat.uploading": "Uploading",
|
||||||
"pixelshare.failed": "Download failed."
|
"pixelchat.upload_failed": "Upload failed",
|
||||||
|
"pixelchat.upload_completed": "Upload completed"
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
},
|
},
|
||||||
"client": [
|
"client": [
|
||||||
|
"BossBarHudMixin",
|
||||||
"MessageHandlerMixin"
|
"MessageHandlerMixin"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ package eu.e99.pixelchat.fabric;
|
||||||
import eu.e99.pixelchat.fabric.image.ImageUploader;
|
import eu.e99.pixelchat.fabric.image.ImageUploader;
|
||||||
import net.fabricmc.api.ClientModInitializer;
|
import net.fabricmc.api.ClientModInitializer;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.gui.hud.BossBarHud;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
14
mod-fabric/src/eu/e99/pixelchat/fabric/duck/BossBars.java
Normal file
14
mod-fabric/src/eu/e99/pixelchat/fabric/duck/BossBars.java
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package eu.e99.pixelchat.fabric.duck;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.hud.ClientBossBar;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public interface BossBars {
|
||||||
|
|
||||||
|
void add(UUID uuid, ClientBossBar bar);
|
||||||
|
|
||||||
|
void remove(UUID uuid);
|
||||||
|
|
||||||
|
ClientBossBar get(UUID uuid);
|
||||||
|
}
|
|
@ -1,15 +1,18 @@
|
||||||
package eu.e99.pixelchat.fabric.image;
|
package eu.e99.pixelchat.fabric.image;
|
||||||
|
|
||||||
import eu.e99.pixelchat.fabric.PixelChat;
|
import eu.e99.pixelchat.fabric.PixelChat;
|
||||||
|
import eu.e99.pixelchat.fabric.duck.BossBars;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.gui.hud.ClientBossBar;
|
||||||
|
import net.minecraft.entity.boss.BossBar;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
import java.net.http.HttpResponse;
|
import java.net.http.HttpResponse;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class ImageUploader {
|
public class ImageUploader {
|
||||||
|
|
||||||
|
@ -28,8 +31,22 @@ public class ImageUploader {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void innerUploadImage(Path path) {
|
private void innerUploadImage(Path path) {
|
||||||
|
BossBars bossBars = (BossBars) minecraft.inGameHud.getBossBarHud();
|
||||||
|
ClientBossBar bossBar = new ClientBossBar(
|
||||||
|
UUID.randomUUID(),
|
||||||
|
Text.translatable("pixelchat.uploading"),
|
||||||
|
0f,
|
||||||
|
BossBar.Color.BLUE,
|
||||||
|
BossBar.Style.PROGRESS,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PixelChat.LOGGER.info("Uploading {}", path);
|
this.minecraft.send(() -> bossBars.add(bossBar.getUuid(), bossBar));
|
||||||
|
|
||||||
|
// TODO: Report some sort of progress?
|
||||||
HttpRequest req = HttpRequest.newBuilder()
|
HttpRequest req = HttpRequest.newBuilder()
|
||||||
.POST(HttpRequest.BodyPublishers.ofFile(path))
|
.POST(HttpRequest.BodyPublishers.ofFile(path))
|
||||||
.uri(this.endpoint)
|
.uri(this.endpoint)
|
||||||
|
@ -45,18 +62,34 @@ public class ImageUploader {
|
||||||
|
|
||||||
String downloadUrl = res.body();
|
String downloadUrl = res.body();
|
||||||
|
|
||||||
PixelChat.LOGGER.info("Uploaded to {}", downloadUrl);
|
|
||||||
this.minecraft.send(() -> {
|
this.minecraft.send(() -> {
|
||||||
// TODO: Are we actually playing?
|
// TODO: Are we actually playing?
|
||||||
if (this.minecraft.player == null) {
|
if (this.minecraft.player == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bossBar.setName(Text.translatable("pixelchat.upload_completed"));
|
||||||
|
bossBar.setPercent(1.0f);
|
||||||
|
bossBar.setColor(BossBar.Color.GREEN);
|
||||||
|
|
||||||
this.minecraft.inGameHud.getChatHud().addToMessageHistory(downloadUrl);
|
this.minecraft.inGameHud.getChatHud().addToMessageHistory(downloadUrl);
|
||||||
this.minecraft.player.networkHandler.sendChatMessage(downloadUrl);
|
this.minecraft.player.networkHandler.sendChatMessage(downloadUrl);
|
||||||
});
|
});
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
PixelChat.LOGGER.error("Failed to upload", e);
|
PixelChat.LOGGER.error("Upload failed", e);
|
||||||
|
|
||||||
|
this.minecraft.send(() -> {
|
||||||
|
bossBar.setName(Text.translatable("pixelchat.upload_failed"));
|
||||||
|
bossBar.setPercent(1.0f);
|
||||||
|
bossBar.setColor(BossBar.Color.RED);
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
Thread.sleep(5000);
|
||||||
|
} catch (InterruptedException ignored) {
|
||||||
|
}
|
||||||
|
|
||||||
|
this.minecraft.send(() -> bossBars.remove(bossBar.getUuid()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
package eu.e99.pixelchat.fabric.mixin;
|
||||||
|
|
||||||
|
import eu.e99.pixelchat.fabric.duck.BossBars;
|
||||||
|
import net.minecraft.client.gui.hud.BossBarHud;
|
||||||
|
import net.minecraft.client.gui.hud.ClientBossBar;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Mixin(BossBarHud.class)
|
||||||
|
public class BossBarHudMixin implements BossBars {
|
||||||
|
|
||||||
|
@Shadow @Final
|
||||||
|
Map<UUID, ClientBossBar> bossBars;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(UUID uuid, ClientBossBar bar) {
|
||||||
|
this.bossBars.put(uuid, bar);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(UUID uuid) {
|
||||||
|
this.bossBars.remove(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClientBossBar get(UUID uuid) {
|
||||||
|
return this.bossBars.get(uuid);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue