pitch display

This commit is contained in:
iceBear67 committed 2024-07-16 15:49:11 +08:00
1 parent 6c6fc0ca50
commit 06db791ed2
1 file changed
+32 -4
@@ -8,9 +8,14 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ElytraItem; import net.minecraft.item.ElytraItem;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.s2c.play.SubtitleS2CPacket;
import net.minecraft.network.packet.s2c.play.TitleFadeS2CPacket;
import net.minecraft.network.packet.s2c.play.TitleS2CPacket;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Colors; import net.minecraft.util.Colors;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -62,32 +67,55 @@ public class ElytraSpeedMeterModule extends ServerModule {
private void onFlying(PlayerEntity player, long f, boolean b) { private void onFlying(PlayerEntity player, long f, boolean b) {
if (f < THRESHLD_OF_ELYTRA_FLY * 20) { if (f < THRESHLD_OF_ELYTRA_FLY * 20) {
if (f > THRESHLD_OF_ELYTRA_FLY * 15) { if (f > THRESHLD_OF_ELYTRA_FLY * 15) {
player.sendMessage(KEEP_FLYING,true); player.sendMessage(KEEP_FLYING, true);
} }
return; return;
} }
if (b) { if (b) {
if (!lastMeasuredSpeed.containsKey(player)) {
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(0, 20, 0));
}
var text = Text.literal(""); var text = Text.literal("");
text.append(generateYMeter(f, player)); text.append(generateYMeter(f, player));
text.append(generateSpeedMeter(f, player)); text.append(generateSpeedMeter(f, player));
text.append(generateDurabilityMeter(f, player)); text.append(generateDurabilityMeter(f, player));
player.sendMessage(text, true); player.sendMessage(text, true);
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleS2CPacket(Text.empty()));
((ServerPlayerEntity) player).networkHandler.sendPacket(buildPitchMeter(player));
} else { } else {
clean((ServerPlayerEntity) player); clean((ServerPlayerEntity) player);
((ServerPlayerEntity) player).networkHandler.sendPacket(new TitleFadeS2CPacket(10, 20, 10));
if (f > THRESHLD_OF_ELYTRA_FLY * 20) { if (f > THRESHLD_OF_ELYTRA_FLY * 20) {
player.sendMessage(Text.literal("!! LANDED !!").withColor(Colors.GREEN), true); player.sendMessage(Text.literal("!! LANDED !!").withColor(Colors.GREEN), true);
}else{ ((ServerPlayerEntity) player).networkHandler.sendPacket(new SubtitleS2CPacket(Text.empty()));
player.sendMessage(Text.empty(),true); } else {
player.sendMessage(Text.empty(), true);
} }
} }
} }
private Packet<?> buildPitchMeter(PlayerEntity player) {
var pitch = player.getPitch();
MutableText text;
var display = (Math.ceil(Math.abs(pitch) * 100) / 100);
if (pitch < 0) { // 朝上
text = Text.literal("🡹 " + display + "°");
} else {
text = Text.literal("🡻 " + display + "°");
}
if (pitch > 75) {
text.withColor(Colors.LIGHT_RED);
}
return new SubtitleS2CPacket(text);
}
private Text generateDurabilityMeter(long f, PlayerEntity player) { private Text generateDurabilityMeter(long f, PlayerEntity player) {
var stack = player.getInventory().getArmorStack(PlayerInventory.ARMOR_SLOTS[2]); var stack = player.getInventory().getArmorStack(PlayerInventory.ARMOR_SLOTS[2]);
if (stack.isDamageable() && stack.isDamaged()) { if (stack.isDamageable() && stack.isDamaged()) {
var remaining = stack.getMaxDamage() - stack.getDamage(); var remaining = stack.getMaxDamage() - stack.getDamage();
var percent = (int) Math.ceil(((double) remaining / stack.getMaxDamage()) * 100); var percent = (int) Math.ceil(((double) remaining / stack.getMaxDamage()) * 100);
return ELYTRA_DURABILITY[Math.max(percent-1,0)]; return ELYTRA_DURABILITY[Math.max(percent - 1, 0)];
} }
return Text.literal(" ELYTRA: INFINITY").withColor(Colors.BLUE); return Text.literal(" ELYTRA: INFINITY").withColor(Colors.BLUE);
} }