Skip to content

API для других модов

Другие Fabric-моды могут открывать WebGUI-оверлеи для игроков программно — без команд. Стабильная точка входа — класс WebviewApi в пакете land.webgui.api.

Подключение зависимости

Добавьте WebGUI как зависимость в build.gradle:

groovy
repositories {
    maven { url "https://modrinth.maven.pm/maven" } // или другой репозиторий
}

dependencies {
    modImplementation "land.webgui:webgui:<version>"
}

Объявите мягкую зависимость в fabric.mod.json, чтобы ваш мод загружался после WebGUI:

json
{
  "depends": {
    "webgui": ">=1.0.0"
  }
}

Используйте "suggests" вместо "depends", если WebGUI необязателен для вашего мода.

API-класс

java
package land.webgui.api;

public final class WebviewApi {

    /** Открывает полноэкранный GUI для игрока. */
    public static void openGui(ServerPlayerEntity player, String url) { ... }

    /** Открывает прозрачный HUD-оверлей для игрока. */
    public static void openHud(ServerPlayerEntity player, String url) { ... }

    /**
     * Отправляет игроку URL главного меню.
     * Игрок открывает его в любой момент нажатием клавиши главного меню (по умолчанию F6).
     */
    public static void sendMainMenuUrl(ServerPlayerEntity player, String url) { ... }

    /**
     * Привязывает сущность к WebGUI URL.
     * При нажатии ПКМ по сущности GUI откроется автоматически.
     * urlTemplate поддерживает плейсхолдеры: {entity_id}, {entity_uuid},
     * {entity_type}, {player_name}, {player_uuid}.
     */
    public static void bindEntity(UUID entityUuid, String urlTemplate, boolean cancelInteraction) { ... }

    /** Удаляет WebGUI-привязку для указанного UUID сущности. */
    public static void unbindEntity(UUID entityUuid) { ... }

    /** Возвращает привязку сущности по UUID, если она существует. */
    public static Optional<EntityBinding> getEntityBinding(UUID entityUuid) { ... }

    /** Максимальная длина URL, принимаемого модом (16 384 символа). */
    public static int maxUrlLength() { ... }

    /** Версия S2C-протокола этой сборки мода. */
    public static int protocolVersion() { ... }
}

Все методы должны вызываться из серверного потока.

GUI vs HUD

GUI (openGui)HUD (openHud)
ОтображениеПолноэкранный, заменяет вид игрыПрозрачный оверлей поверх игры
Закрывается по EscДаНет (переключается клавишей интерактивного режима)
ПрименениеМагазины, меню, формыПостоянные панели, миникарты, статусные бары

Открытие полноэкранного GUI

java
import land.webgui.api.WebviewApi;

// Показать игроку экран магазина
WebviewApi.openGui(player, "https://your-site.example.com/shop");

Игрок закрывает экран нажатием Esc. Если в server.json включён enableTokens, токен добавляется к URL автоматически.

Открытие HUD-оверлея

java
// Показать постоянный оверлей (миникарта, статусная панель)
WebviewApi.openHud(player, "https://ваш-hud.example.com");

Мод автоматически добавляет подписанный токен к URL, если в server.json включён enableTokens. Ваш бэкенд получает токен как ?webgui_token=<значение> и может проверить личность игрока.

Установка URL главного меню

java
WebviewApi.sendMainMenuUrl(player, "https://ваш-menu.example.com");

Заменяет URL, отправленный сервером при входе. Для сброса меню передайте пустую строку:

java
WebviewApi.sendMainMenuUrl(player, "");

Практические примеры

Открытие GUI из кастомной команды

java
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
    dispatcher.register(CommandManager.literal("shop")
        .executes(ctx -> {
            ServerPlayerEntity player = ctx.getSource().getPlayerOrThrow();
            WebviewApi.openGui(player, "https://your-site.example.com/shop?player=" + player.getUuidAsString());
            return 1;
        }));
});

Открытие HUD при входе игрока

java
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
    ServerPlayerEntity player = handler.player;
    WebviewApi.openHud(player, "https://ваш-hud.example.com");
});

Переключение с HUD на GUI по взаимодействию

java
// При нажатии ПКМ на кастомный блок (серверный поток)
WebviewApi.openGui(player, "https://your-site.example.com/terminal?block=" + blockPos);

Программная привязка сущностей к GUI

java
// Привязать конкретную сущность по UUID — cancelInteraction=true скрывает экран торговли
UUID npcUuid = ...; // напр. entity.getUuid()
WebviewApi.bindEntity(npcUuid, "https://example.com/shop?npc={entity_id}", true);

// Удалить привязку позже
WebviewApi.unbindEntity(npcUuid);

Привязки автоматически сохраняются в config/webgui/entity_bindings.json.

URL-плейсхолдеры

ПлейсхолдерЗначение
{entity_id}UUID сущности
{entity_uuid}UUID сущности (псевдоним)
{entity_type}Тип с неймспейсом, напр. minecraft:villager
{player_name}Отображаемое имя взаимодействующего игрока
{player_uuid}UUID взаимодействующего игрока

Проверка наличия WebGUI

Если WebGUI — необязательная зависимость, защитите вызовы проверкой присутствия мода:

java
private static final boolean WEBGUI_PRESENT = FabricLoader.getInstance()
        .isModLoaded("webgui");

public static void tryOpenHud(ServerPlayerEntity player, String url) {
    if (WEBGUI_PRESENT) {
        WebviewApi.openHud(player, url);
    }
}

Ограничения URL

ОграничениеЗначение
Максимальная длина URL16 384 символа
Query-параметр токенаДобавляется автоматически при enableTokens = true
Null / пустой URLМод использует страницу по умолчанию