I think i actually got it to work lmaooo

This commit is contained in:
Ethan 2024-07-22 20:13:41 +08:00
parent f4341b1ee6
commit c61a564a22
7 changed files with 67 additions and 53 deletions

View file

@ -27,7 +27,9 @@ package org.geysermc.geyser.api.bedrock.camera;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.api.bedrock.gui.GuiElement;
import org.geysermc.geyser.api.connection.GeyserConnection; import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.bedrock.gui.GuiData;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
@ -150,7 +152,9 @@ public interface CameraData {
* Hides a {@link GuiElement} on the client's side. * Hides a {@link GuiElement} on the client's side.
* *
* @param element the {@link GuiElement} to hide * @param element the {@link GuiElement} to hide
* @deprecated Use {@link GuiData#hideElement(GuiElement...)} instead
*/ */
@Deprecated
void hideElement(@NonNull GuiElement... element); void hideElement(@NonNull GuiElement... element);
/** /**
@ -161,20 +165,26 @@ public interface CameraData {
* If no elements are specified, this will reset all currently hidden elements * If no elements are specified, this will reset all currently hidden elements
* *
* @param element the {@link GuiElement} to reset * @param element the {@link GuiElement} to reset
* @deprecated Use {@link GuiData#resetElement(GuiElement...)} instead
*/ */
@Deprecated
void resetElement(@NonNull GuiElement @Nullable... element); void resetElement(@NonNull GuiElement @Nullable... element);
/** /**
* Determines whether a {@link GuiElement} is currently hidden. * Determines whether a {@link GuiElement} is currently hidden.
* *
* @param element the {@link GuiElement} to check * @param element the {@link GuiElement} to check
* @deprecated Use {@link GuiData#isHudElementHidden(GuiElement)} instead
*/ */
@Deprecated
boolean isHudElementHidden(@NonNull GuiElement element); boolean isHudElementHidden(@NonNull GuiElement element);
/** /**
* Returns the currently hidden {@link GuiElement}s. * Returns the currently hidden {@link GuiElement}s.
* *
* @return an unmodifiable view of all currently hidden {@link GuiElement}s * @return an unmodifiable view of all currently hidden {@link GuiElement}s
* @deprecated Use {@link GuiData#hiddenElements()} instead
*/ */
@Deprecated
@NonNull Set<GuiElement> hiddenElements(); @NonNull Set<GuiElement> hiddenElements();
} }

View file

@ -25,36 +25,31 @@
package org.geysermc.geyser.api.bedrock.camera; package org.geysermc.geyser.api.bedrock.camera;
import org.geysermc.geyser.api.bedrock.gui.GuiData;
/** /**
* Represent GUI elements on the players HUD display. * Represent GUI elements on the players HUD display.
* These can be hidden using {@link CameraData#hideElement(GuiElement...)}, * These can be hidden using {@link GuiData#hideElement(org.geysermc.geyser.api.bedrock.gui.GuiElement...)},
* and one can reset their visibility using {@link CameraData#resetElement(GuiElement...)}. * and one can reset their visibility using {@link GuiData#resetElement(org.geysermc.geyser.api.bedrock.gui.GuiElement...)}.
* @deprecated use {@link org.geysermc.geyser.api.bedrock.gui.GuiElement}
*/ */
public class GuiElement { public class GuiElement extends org.geysermc.geyser.api.bedrock.gui.GuiElement {
public static final GuiElement PAPER_DOLL = new GuiElement(0); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement PAPER_DOLL = org.geysermc.geyser.api.bedrock.gui.GuiElement.PAPER_DOLL;
public static final GuiElement ARMOR = new GuiElement(1); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement ARMOR = org.geysermc.geyser.api.bedrock.gui.GuiElement.ARMOR;
public static final GuiElement TOOL_TIPS = new GuiElement(2); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement TOOL_TIPS = org.geysermc.geyser.api.bedrock.gui.GuiElement.TOOL_TIPS;
public static final GuiElement TOUCH_CONTROLS = new GuiElement(3); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement TOUCH_CONTROLS = org.geysermc.geyser.api.bedrock.gui.GuiElement.TOUCH_CONTROLS;
public static final GuiElement CROSSHAIR = new GuiElement(4); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement CROSSHAIR = org.geysermc.geyser.api.bedrock.gui.GuiElement.CROSSHAIR;
public static final GuiElement HOTBAR = new GuiElement(5); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement HOTBAR = org.geysermc.geyser.api.bedrock.gui.GuiElement.HOTBAR;
public static final GuiElement HEALTH = new GuiElement(6); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement HEALTH = org.geysermc.geyser.api.bedrock.gui.GuiElement.HEALTH;
public static final GuiElement PROGRESS_BAR = new GuiElement(7); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement PROGRESS_BAR = org.geysermc.geyser.api.bedrock.gui.GuiElement.PROGRESS_BAR;
public static final GuiElement FOOD_BAR = new GuiElement(8); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement FOOD_BAR = org.geysermc.geyser.api.bedrock.gui.GuiElement.FOOD_BAR;
public static final GuiElement AIR_BUBBLES_BAR = new GuiElement(9); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement AIR_BUBBLES_BAR = org.geysermc.geyser.api.bedrock.gui.GuiElement.AIR_BUBBLES_BAR;
public static final GuiElement VEHICLE_HEALTH = new GuiElement(10); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement VEHICLE_HEALTH = org.geysermc.geyser.api.bedrock.gui.GuiElement.VEHICLE_HEALTH;
public static final GuiElement EFFECTS_BAR = new GuiElement(11); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement EFFECTS_BAR = org.geysermc.geyser.api.bedrock.gui.GuiElement.EFFECTS_BAR;
public static final GuiElement ITEM_TEXT_POPUP = new GuiElement(12); public static final org.geysermc.geyser.api.bedrock.gui.GuiElement ITEM_TEXT_POPUP = org.geysermc.geyser.api.bedrock.gui.GuiElement.ITEM_TEXT_POPUP;
private GuiElement(int id) { public GuiElement(int id) {
this.id = id; super(id);
}
private final int id;
/**
* Internal use only; don't depend on these values being consistent.
*/
public int id() {
return this.id;
} }
} }

View file

@ -31,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.api.connection.Connection; import org.geysermc.api.connection.Connection;
import org.geysermc.geyser.api.bedrock.camera.CameraData; import org.geysermc.geyser.api.bedrock.camera.CameraData;
import org.geysermc.geyser.api.bedrock.camera.CameraShake; import org.geysermc.geyser.api.bedrock.camera.CameraShake;
import org.geysermc.geyser.api.bedrock.gui.GuiData;
import org.geysermc.geyser.api.command.CommandSource; import org.geysermc.geyser.api.command.CommandSource;
import org.geysermc.geyser.api.entity.EntityData; import org.geysermc.geyser.api.entity.EntityData;
import org.geysermc.geyser.api.entity.type.GeyserEntity; import org.geysermc.geyser.api.entity.type.GeyserEntity;
@ -60,6 +61,14 @@ public interface GeyserConnection extends Connection, CommandSource {
*/ */
@NonNull EntityData entities(); @NonNull EntityData entities();
/**
* Exposes the {@link GuiData} for this connection.
* It allows you to hide GUI elements, and send notification toasts.
*
* @return the GuiData for this connection.
*/
@NonNull GuiData gui();
/** /**
* @param javaId the Java entity ID to look up. * @param javaId the Java entity ID to look up.
* @return a {@link GeyserEntity} if present in this connection's entity tracker. * @return a {@link GeyserEntity} if present in this connection's entity tracker.

View file

@ -47,7 +47,7 @@ import org.geysermc.geyser.api.bedrock.camera.CameraFade;
import org.geysermc.geyser.api.bedrock.camera.CameraPerspective; import org.geysermc.geyser.api.bedrock.camera.CameraPerspective;
import org.geysermc.geyser.api.bedrock.camera.CameraPosition; import org.geysermc.geyser.api.bedrock.camera.CameraPosition;
import org.geysermc.geyser.api.bedrock.camera.CameraShake; import org.geysermc.geyser.api.bedrock.camera.CameraShake;
import org.geysermc.geyser.api.bedrock.camera.GuiElement; import org.geysermc.geyser.api.bedrock.gui.GuiElement;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
@ -302,22 +302,4 @@ public class GeyserCameraData implements CameraData {
public @NonNull Set<GuiElement> hiddenElements() { public @NonNull Set<GuiElement> hiddenElements() {
return Collections.unmodifiableSet(hiddenHudElements); return Collections.unmodifiableSet(hiddenHudElements);
} }
/**
* Deals with hiding hud elements while in spectator.
*
* @param currentlySpectator whether the player is currently in spectator mode
* @param newGameMode the new GameMode to switch to
*/
public void handleGameModeChange(boolean currentlySpectator, GameMode newGameMode) {
if (newGameMode == GameMode.SPECTATOR) {
if (!currentlySpectator) {
hideElement(SPECTATOR_HIDDEN_ELEMENTS);
}
} else {
if (currentlySpectator) {
resetElement(SPECTATOR_HIDDEN_ELEMENTS);
}
}
}
} }

View file

@ -71,8 +71,18 @@ public class GeyserGuiData implements GuiData {
private final Set<GuiElement> hiddenHudElements = new HashSet<>(); private final Set<GuiElement> hiddenHudElements = new HashSet<>();
@Override @Override
public void hideElement(@NotNull @NonNull GuiElement... element) { public void hideElement(@NonNull GuiElement... elements) {
Objects.requireNonNull(elements);
SetHudPacket packet = new SetHudPacket();
packet.setVisibility(HudVisibility.HIDE);
Set<HudElement> elementSet = packet.getElements();
for (GuiElement element : elements) {
this.hiddenHudElements.add(element);
elementSet.add(HUD_ELEMENT_VALUES[element.id()]);
}
session.sendUpstreamPacket(packet);
} }
@Override @Override

View file

@ -71,6 +71,7 @@ import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.bedrock.camera.CameraData; import org.geysermc.geyser.api.bedrock.camera.CameraData;
import org.geysermc.geyser.api.bedrock.camera.CameraShake; import org.geysermc.geyser.api.bedrock.camera.CameraShake;
import org.geysermc.geyser.api.bedrock.gui.GuiData;
import org.geysermc.geyser.api.connection.GeyserConnection; import org.geysermc.geyser.api.connection.GeyserConnection;
import org.geysermc.geyser.api.entity.EntityData; import org.geysermc.geyser.api.entity.EntityData;
import org.geysermc.geyser.api.entity.type.GeyserEntity; import org.geysermc.geyser.api.entity.type.GeyserEntity;
@ -94,6 +95,7 @@ import org.geysermc.geyser.erosion.AbstractGeyserboundPacketHandler;
import org.geysermc.geyser.erosion.GeyserboundHandshakePacketHandler; import org.geysermc.geyser.erosion.GeyserboundHandshakePacketHandler;
import org.geysermc.geyser.impl.camera.CameraDefinitions; import org.geysermc.geyser.impl.camera.CameraDefinitions;
import org.geysermc.geyser.impl.camera.GeyserCameraData; import org.geysermc.geyser.impl.camera.GeyserCameraData;
import org.geysermc.geyser.impl.gui.GeyserGuiData;
import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.inventory.Inventory;
import org.geysermc.geyser.inventory.PlayerInventory; import org.geysermc.geyser.inventory.PlayerInventory;
import org.geysermc.geyser.inventory.recipe.GeyserRecipe; import org.geysermc.geyser.inventory.recipe.GeyserRecipe;
@ -559,6 +561,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
private final GeyserEntityData entityData; private final GeyserEntityData entityData;
private final GeyserGuiData guiData;
private MinecraftProtocol protocol; private MinecraftProtocol protocol;
public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) { public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
@ -582,8 +587,10 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
this.structureBlockCache = new StructureBlockCache(); this.structureBlockCache = new StructureBlockCache();
this.tagCache = new TagCache(); this.tagCache = new TagCache();
this.worldCache = new WorldCache(this); this.worldCache = new WorldCache(this);
this.cameraData = new GeyserCameraData(this); this.cameraData = new GeyserCameraData(this);
this.entityData = new GeyserEntityData(this); this.entityData = new GeyserEntityData(this);
this.guiData = new GeyserGuiData(this);
this.worldBorder = new WorldBorder(this); this.worldBorder = new WorldBorder(this);
@ -1310,7 +1317,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
public void setGameMode(GameMode newGamemode) { public void setGameMode(GameMode newGamemode) {
boolean currentlySpectator = this.gameMode == GameMode.SPECTATOR; boolean currentlySpectator = this.gameMode == GameMode.SPECTATOR;
this.gameMode = newGamemode; this.gameMode = newGamemode;
this.cameraData.handleGameModeChange(currentlySpectator, newGamemode); this.guiData.handleGameModeChange(currentlySpectator, newGamemode);
} }
/** /**
@ -2023,6 +2030,11 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
return this.entityData; return this.entityData;
} }
@Override
public @NonNull GuiData gui() {
return this.guiData;
}
@Override @Override
public void shakeCamera(float intensity, float duration, @NonNull CameraShake type) { public void shakeCamera(float intensity, float duration, @NonNull CameraShake type) {
this.cameraData.shakeCamera(intensity, duration, type); this.cameraData.shakeCamera(intensity, duration, type);

View file

@ -84,11 +84,7 @@ public class JavaUpdateAdvancementsTranslator extends PacketTranslator<Clientbou
String frameType = advancement.getDisplayData().getAdvancementType().toString().toLowerCase(Locale.ROOT); String frameType = advancement.getDisplayData().getAdvancementType().toString().toLowerCase(Locale.ROOT);
String frameTitle = advancement.getDisplayColor() + MinecraftLocale.getLocaleString("advancements.toast." + frameType, session.locale()); String frameTitle = advancement.getDisplayColor() + MinecraftLocale.getLocaleString("advancements.toast." + frameType, session.locale());
String advancementName = MessageTranslator.convertMessage(advancement.getDisplayData().getTitle(), session.locale()); String advancementName = MessageTranslator.convertMessage(advancement.getDisplayData().getTitle(), session.locale());
session.gui().sendToast(frameTitle, advancementName);
ToastRequestPacket toastRequestPacket = new ToastRequestPacket();
toastRequestPacket.setTitle(frameTitle);
toastRequestPacket.setContent(advancementName);
session.sendUpstreamPacket(toastRequestPacket);
} }
} }
} }