Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Гайд Часть функционала ViaVersion (Fabric 1.21.4)

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
27 Ноя 2021
Сообщения
56
Реакции
1
Привет всем пастерам вот вам подарок на недрочабрь.


Заходим в gradle.properties
добавляем:
Код:
Expand Collapse Copy
viafabricplus_version=4.0.5-BACKPORT


затем заходим в build.gradle
добавляем в
Код:
Expand Collapse Copy
repositories {
    maven {
        name = "ViaVersion"
        url = uri("https://repo.viaversion.com/")
    }
    maven {
        name = "modrinth"
        url = uri("https://api.modrinth.com/maven")
    }
    maven {
        name = "OpenCollab Snapshots"
        url = uri("https://repo.opencollab.dev/maven-snapshots/")
    }
    maven {
        name = "Lenni0451"
        url = uri("https://maven.lenni0451.net/everything")
    }
}
Код:
Expand Collapse Copy
dependencies {
    modApi("com.viaversion:viafabricplus-api:${project.property("viafabricplus_version")}")
    modRuntimeOnly("com.viaversion:viafabricplus:${project.property("viafabricplus_version")}")
}

затем создаем класс ViaVersionManager:
ViaVersionManager:
Expand Collapse Copy
import lombok.Getter;
import net.fabricmc.loader.api.FabricLoader;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ViaVersionManager {
    private static ViaVersionManager instance;

    @Getter
    private MinecraftVersion selectedVersion;

    @Getter
    private final List<MinecraftVersion> supportedVersions = new ArrayList<>();

    @Getter
    private final MinecraftVersion nativeVersion = new MinecraftVersion("1.21.4", 769, true);

    private boolean viaFabricPlusLoaded = false;

    private ViaVersionManager() {
        checkViaFabricPlusLoaded();
        initSupportedVersions();
        selectedVersion = nativeVersion;
    }

    public static ViaVersionManager getInstance() {
        if (instance == null) {
            instance = new ViaVersionManager();
        }
        return instance;
    }

    private void checkViaFabricPlusLoaded() {
        try {
            viaFabricPlusLoaded = FabricLoader.getInstance().isModLoaded("viafabricplus");

            if (viaFabricPlusLoaded) {
                System.out.println("[FourAPI] ✓ ViaFabricPlus 4.0.5-BACKPORT detected!");
            } else {
                System.out.println("[FourAPI] ⚠ ViaFabricPlus not loaded - version switching disabled");
            }
        } catch (Exception e) {
            viaFabricPlusLoaded = false;
            System.err.println("[FourAPI] Error checking ViaFabricPlus: " + e.getMessage());
        }
    }

    private void initSupportedVersions() {
        supportedVersions.add(new MinecraftVersion("1.21.4", 769, true));
        supportedVersions.add(new MinecraftVersion("1.21.3", 768, false));
        supportedVersions.add(new MinecraftVersion("1.21.2", 768, false));
        supportedVersions.add(new MinecraftVersion("1.21.1", 767, false));
        supportedVersions.add(new MinecraftVersion("1.21", 767, false));
        supportedVersions.add(new MinecraftVersion("1.20.6", 766, false));
        supportedVersions.add(new MinecraftVersion("1.20.5", 766, false));
        supportedVersions.add(new MinecraftVersion("1.20.4", 765, false));
        supportedVersions.add(new MinecraftVersion("1.20.3", 765, false));
        supportedVersions.add(new MinecraftVersion("1.20.2", 764, false));
        supportedVersions.add(new MinecraftVersion("1.20.1", 763, false));
        supportedVersions.add(new MinecraftVersion("1.20", 763, false));
        supportedVersions.add(new MinecraftVersion("1.19.4", 762, false));
        supportedVersions.add(new MinecraftVersion("1.19.3", 761, false));
        supportedVersions.add(new MinecraftVersion("1.19.2", 760, false));
        supportedVersions.add(new MinecraftVersion("1.19.1", 760, false));
        supportedVersions.add(new MinecraftVersion("1.19", 759, false));
        supportedVersions.add(new MinecraftVersion("1.18.2", 758, false));
        supportedVersions.add(new MinecraftVersion("1.18.1", 757, false));
        supportedVersions.add(new MinecraftVersion("1.18", 757, false));
        supportedVersions.add(new MinecraftVersion("1.17.1", 756, false));
        supportedVersions.add(new MinecraftVersion("1.17", 755, false));
        supportedVersions.add(new MinecraftVersion("1.16.5", 754, false));
        supportedVersions.add(new MinecraftVersion("1.16.4", 754, false));
        supportedVersions.add(new MinecraftVersion("1.16.3", 753, false));
        supportedVersions.add(new MinecraftVersion("1.16.2", 751, false));
        supportedVersions.add(new MinecraftVersion("1.16.1", 736, false));
        supportedVersions.add(new MinecraftVersion("1.16", 735, false));
        supportedVersions.add(new MinecraftVersion("1.15.2", 578, false));
        supportedVersions.add(new MinecraftVersion("1.15.1", 575, false));
        supportedVersions.add(new MinecraftVersion("1.15", 573, false));
        supportedVersions.add(new MinecraftVersion("1.14.4", 498, false));
        supportedVersions.add(new MinecraftVersion("1.14.3", 490, false));
        supportedVersions.add(new MinecraftVersion("1.14.2", 485, false));
        supportedVersions.add(new MinecraftVersion("1.14.1", 480, false));
        supportedVersions.add(new MinecraftVersion("1.14", 477, false));
        supportedVersions.add(new MinecraftVersion("1.13.2", 404, false));
        supportedVersions.add(new MinecraftVersion("1.13.1", 401, false));
        supportedVersions.add(new MinecraftVersion("1.13", 393, false));
        supportedVersions.add(new MinecraftVersion("1.12.2", 340, false));
        supportedVersions.add(new MinecraftVersion("1.12.1", 338, false));
        supportedVersions.add(new MinecraftVersion("1.12", 335, false));
        supportedVersions.add(new MinecraftVersion("1.11.2", 316, false));
        supportedVersions.add(new MinecraftVersion("1.11.1", 316, false));
        supportedVersions.add(new MinecraftVersion("1.11", 315, false));
        supportedVersions.add(new MinecraftVersion("1.10.2", 210, false));
        supportedVersions.add(new MinecraftVersion("1.10.1", 210, false));
        supportedVersions.add(new MinecraftVersion("1.10", 210, false));
        supportedVersions.add(new MinecraftVersion("1.9.4", 110, false));
        supportedVersions.add(new MinecraftVersion("1.9.3", 110, false));
        supportedVersions.add(new MinecraftVersion("1.9.2", 109, false));
        supportedVersions.add(new MinecraftVersion("1.9.1", 108, false));
        supportedVersions.add(new MinecraftVersion("1.9", 107, false));
        supportedVersions.add(new MinecraftVersion("1.8.9", 47, false));
        supportedVersions.add(new MinecraftVersion("1.8", 47, false));
        supportedVersions.add(new MinecraftVersion("1.7.10", 5, false));
        supportedVersions.add(new MinecraftVersion("1.7.2", 4, false));
    }

    public void setVersion(MinecraftVersion version) {
        if (version == null) return;

        this.selectedVersion = version;

        if (!viaFabricPlusLoaded) {
            System.out.println("[FourAPI] Selected: " + version.getName() + " (ViaFabricPlus not loaded - UI only)");
            return;
        }

        try {
            Class<?> protocolVersionClass = Class.forName("com.viaversion.viaversion.api.protocol.version.ProtocolVersion");
            Method getProtocolMethod = protocolVersionClass.getMethod("getProtocol", int.class);
            Object targetVersion = getProtocolMethod.invoke(null, version.getProtocolId());

            Class<?> protocolTranslatorClass = Class.forName("de.florianmichael.viafabricplus.protocoltranslator.ProtocolTranslator");
            Method setTargetVersionMethod = protocolTranslatorClass.getMethod("setTargetVersion", protocolVersionClass);
            setTargetVersionMethod.invoke(null, targetVersion);

            System.out.println("[FourAPI] ✓ Switched to " + version.getName() +
                    " (Protocol: " + version.getProtocolId() + ")");
            System.out.println("[FourAPI] Changes will apply on next server connection");

        } catch (Exception e) {
            System.err.println("[FourAPI] Failed to switch version: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public String getVersionName(MinecraftVersion version) {
        if (version == null) return "Unknown";
        return version.getName();
    }

    public boolean isNativeVersion(MinecraftVersion version) {
        if (version == null) return false;
        return version.isNative();
    }

    public void resetToNative() {
        setVersion(nativeVersion);
    }

    public MinecraftVersion getActiveVersion() {
        if (!viaFabricPlusLoaded) {
            return selectedVersion;
        }

        try {
            Class<?> protocolTranslatorClass = Class.forName("de.florianmichael.viafabricplus.protocoltranslator.ProtocolTranslator");
            Method getTargetVersionMethod = protocolTranslatorClass.getMethod("getTargetVersion");
            Object current = getTargetVersionMethod.invoke(null);

            Class<?> protocolVersionClass = Class.forName("com.viaversion.viaversion.api.protocol.version.ProtocolVersion");
            Method getVersionMethod = protocolVersionClass.getMethod("getVersion");
            int protocolId = (int) getVersionMethod.invoke(current);

            for (MinecraftVersion version : supportedVersions) {
                if (version.getProtocolId() == protocolId) {
                    return version;
                }
            }
        } catch (Exception e) {
            System.err.println("[FourAPI] Error getting active version: " + e.getMessage());
        }

        return selectedVersion;
    }

    public boolean isViaActive() {
        return viaFabricPlusLoaded && !selectedVersion.equals(nativeVersion);
    }

    public String getViaStatus() {
        if (!viaFabricPlusLoaded) {
            return "ViaFabricPlus not loaded";
        }
        return "ViaFabricPlus 4.0.5-BACKPORT";
    }

    public boolean isViaVersionLoaded() {
        return viaFabricPlusLoaded;
    }

    public boolean isViaFabricPlusLoaded() {
        return viaFabricPlusLoaded;
    }

    @Deprecated
    public boolean isViaBackwardsLoaded() {
        return viaFabricPlusLoaded;
    }

    @Deprecated
    public boolean isViaRewindLoaded() {
        return viaFabricPlusLoaded;
    }

    public static class MinecraftVersion {
        @Getter
        private final String name;
        @Getter
        private final int protocolId;
        @Getter
        private final boolean isNative;

        public MinecraftVersion(String name, int protocolId, boolean isNative) {
            this.name = name;
            this.protocolId = protocolId;
            this.isNative = isNative;
        }

        public int getVersion() {
            return protocolId;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (!(obj instanceof MinecraftVersion other)) return false;
            return protocolId == other.protocolId;
        }

        @Override
        public int hashCode() {
            return protocolId;
        }

        @Override
        public String toString() {
            return name + " (" + protocolId + ")";
        }
    }
}
Можно через Mixin добавить в мультиплейер создаем Mixin
MultiplayerScreenMixin
Указываем @Mixin(MultiplayerScreen.class)

и делаем что хотим или дальше говнокодим
Код:
Expand Collapse Copy
private void handleViaVersionDropdown(int mouseX, int mouseY) {
    float x = 5;
    float y = 5;
    float width = 100;
    float headerHeight = 16;

    List<MinecraftVersion> versions = viaManager.getSupportedVersions();
    MinecraftVersion selectedVersion = viaManager.getSelectedVersion();

    if (viaDropdownHeight > 0.1f) {
        float contentY = y + headerHeight + 2;
        float fadeProgress = viaDropdownTargetHeight > 0 ? viaDropdownHeight / viaDropdownTargetHeight : 0f;

        hoveredVersionIndex = -1;
        float itemHeight = 9f;
        float scrollY = -viaDropdownScroll;

        for (int i = 0; i < versions.size(); i++) {
            MinecraftVersion version = versions.get(i);
            float itemY = contentY + 2 + scrollY + (i * itemHeight);

            if (itemY + itemHeight < contentY || itemY > contentY + viaDropdownHeight) {
                continue;
            }

            boolean hovered = mouseX >= x && mouseX <= x + width
                    && mouseY >= itemY && mouseY <= itemY + itemHeight
                    && viaDropdownExpanded;

            if (hovered) hoveredVersionIndex = i;
        }
    }
}

Всё дальше кайфуем от жизни!
 
Привет всем пастерам вот вам подарок на недрочабрь.


Заходим в gradle.properties
добавляем:
Код:
Expand Collapse Copy
viafabricplus_version=4.0.5-BACKPORT


затем заходим в build.gradle
добавляем в
Код:
Expand Collapse Copy
repositories {
    maven {
        name = "ViaVersion"
        url = uri("https://repo.viaversion.com/")
    }
    maven {
        name = "modrinth"
        url = uri("https://api.modrinth.com/maven")
    }
    maven {
        name = "OpenCollab Snapshots"
        url = uri("https://repo.opencollab.dev/maven-snapshots/")
    }
    maven {
        name = "Lenni0451"
        url = uri("https://maven.lenni0451.net/everything")
    }
}
Код:
Expand Collapse Copy
dependencies {
    modApi("com.viaversion:viafabricplus-api:${project.property("viafabricplus_version")}")
    modRuntimeOnly("com.viaversion:viafabricplus:${project.property("viafabricplus_version")}")
}

затем создаем класс ViaVersionManager:
ViaVersionManager:
Expand Collapse Copy
import lombok.Getter;
import net.fabricmc.loader.api.FabricLoader;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ViaVersionManager {
    private static ViaVersionManager instance;

    @Getter
    private MinecraftVersion selectedVersion;

    @Getter
    private final List<MinecraftVersion> supportedVersions = new ArrayList<>();

    @Getter
    private final MinecraftVersion nativeVersion = new MinecraftVersion("1.21.4", 769, true);

    private boolean viaFabricPlusLoaded = false;

    private ViaVersionManager() {
        checkViaFabricPlusLoaded();
        initSupportedVersions();
        selectedVersion = nativeVersion;
    }

    public static ViaVersionManager getInstance() {
        if (instance == null) {
            instance = new ViaVersionManager();
        }
        return instance;
    }

    private void checkViaFabricPlusLoaded() {
        try {
            viaFabricPlusLoaded = FabricLoader.getInstance().isModLoaded("viafabricplus");

            if (viaFabricPlusLoaded) {
                System.out.println("[FourAPI] ✓ ViaFabricPlus 4.0.5-BACKPORT detected!");
            } else {
                System.out.println("[FourAPI] ⚠ ViaFabricPlus not loaded - version switching disabled");
            }
        } catch (Exception e) {
            viaFabricPlusLoaded = false;
            System.err.println("[FourAPI] Error checking ViaFabricPlus: " + e.getMessage());
        }
    }

    private void initSupportedVersions() {
        supportedVersions.add(new MinecraftVersion("1.21.4", 769, true));
        supportedVersions.add(new MinecraftVersion("1.21.3", 768, false));
        supportedVersions.add(new MinecraftVersion("1.21.2", 768, false));
        supportedVersions.add(new MinecraftVersion("1.21.1", 767, false));
        supportedVersions.add(new MinecraftVersion("1.21", 767, false));
        supportedVersions.add(new MinecraftVersion("1.20.6", 766, false));
        supportedVersions.add(new MinecraftVersion("1.20.5", 766, false));
        supportedVersions.add(new MinecraftVersion("1.20.4", 765, false));
        supportedVersions.add(new MinecraftVersion("1.20.3", 765, false));
        supportedVersions.add(new MinecraftVersion("1.20.2", 764, false));
        supportedVersions.add(new MinecraftVersion("1.20.1", 763, false));
        supportedVersions.add(new MinecraftVersion("1.20", 763, false));
        supportedVersions.add(new MinecraftVersion("1.19.4", 762, false));
        supportedVersions.add(new MinecraftVersion("1.19.3", 761, false));
        supportedVersions.add(new MinecraftVersion("1.19.2", 760, false));
        supportedVersions.add(new MinecraftVersion("1.19.1", 760, false));
        supportedVersions.add(new MinecraftVersion("1.19", 759, false));
        supportedVersions.add(new MinecraftVersion("1.18.2", 758, false));
        supportedVersions.add(new MinecraftVersion("1.18.1", 757, false));
        supportedVersions.add(new MinecraftVersion("1.18", 757, false));
        supportedVersions.add(new MinecraftVersion("1.17.1", 756, false));
        supportedVersions.add(new MinecraftVersion("1.17", 755, false));
        supportedVersions.add(new MinecraftVersion("1.16.5", 754, false));
        supportedVersions.add(new MinecraftVersion("1.16.4", 754, false));
        supportedVersions.add(new MinecraftVersion("1.16.3", 753, false));
        supportedVersions.add(new MinecraftVersion("1.16.2", 751, false));
        supportedVersions.add(new MinecraftVersion("1.16.1", 736, false));
        supportedVersions.add(new MinecraftVersion("1.16", 735, false));
        supportedVersions.add(new MinecraftVersion("1.15.2", 578, false));
        supportedVersions.add(new MinecraftVersion("1.15.1", 575, false));
        supportedVersions.add(new MinecraftVersion("1.15", 573, false));
        supportedVersions.add(new MinecraftVersion("1.14.4", 498, false));
        supportedVersions.add(new MinecraftVersion("1.14.3", 490, false));
        supportedVersions.add(new MinecraftVersion("1.14.2", 485, false));
        supportedVersions.add(new MinecraftVersion("1.14.1", 480, false));
        supportedVersions.add(new MinecraftVersion("1.14", 477, false));
        supportedVersions.add(new MinecraftVersion("1.13.2", 404, false));
        supportedVersions.add(new MinecraftVersion("1.13.1", 401, false));
        supportedVersions.add(new MinecraftVersion("1.13", 393, false));
        supportedVersions.add(new MinecraftVersion("1.12.2", 340, false));
        supportedVersions.add(new MinecraftVersion("1.12.1", 338, false));
        supportedVersions.add(new MinecraftVersion("1.12", 335, false));
        supportedVersions.add(new MinecraftVersion("1.11.2", 316, false));
        supportedVersions.add(new MinecraftVersion("1.11.1", 316, false));
        supportedVersions.add(new MinecraftVersion("1.11", 315, false));
        supportedVersions.add(new MinecraftVersion("1.10.2", 210, false));
        supportedVersions.add(new MinecraftVersion("1.10.1", 210, false));
        supportedVersions.add(new MinecraftVersion("1.10", 210, false));
        supportedVersions.add(new MinecraftVersion("1.9.4", 110, false));
        supportedVersions.add(new MinecraftVersion("1.9.3", 110, false));
        supportedVersions.add(new MinecraftVersion("1.9.2", 109, false));
        supportedVersions.add(new MinecraftVersion("1.9.1", 108, false));
        supportedVersions.add(new MinecraftVersion("1.9", 107, false));
        supportedVersions.add(new MinecraftVersion("1.8.9", 47, false));
        supportedVersions.add(new MinecraftVersion("1.8", 47, false));
        supportedVersions.add(new MinecraftVersion("1.7.10", 5, false));
        supportedVersions.add(new MinecraftVersion("1.7.2", 4, false));
    }

    public void setVersion(MinecraftVersion version) {
        if (version == null) return;

        this.selectedVersion = version;

        if (!viaFabricPlusLoaded) {
            System.out.println("[FourAPI] Selected: " + version.getName() + " (ViaFabricPlus not loaded - UI only)");
            return;
        }

        try {
            Class<?> protocolVersionClass = Class.forName("com.viaversion.viaversion.api.protocol.version.ProtocolVersion");
            Method getProtocolMethod = protocolVersionClass.getMethod("getProtocol", int.class);
            Object targetVersion = getProtocolMethod.invoke(null, version.getProtocolId());

            Class<?> protocolTranslatorClass = Class.forName("de.florianmichael.viafabricplus.protocoltranslator.ProtocolTranslator");
            Method setTargetVersionMethod = protocolTranslatorClass.getMethod("setTargetVersion", protocolVersionClass);
            setTargetVersionMethod.invoke(null, targetVersion);

            System.out.println("[FourAPI] ✓ Switched to " + version.getName() +
                    " (Protocol: " + version.getProtocolId() + ")");
            System.out.println("[FourAPI] Changes will apply on next server connection");

        } catch (Exception e) {
            System.err.println("[FourAPI] Failed to switch version: " + e.getMessage());
            e.printStackTrace();
        }
    }

    public String getVersionName(MinecraftVersion version) {
        if (version == null) return "Unknown";
        return version.getName();
    }

    public boolean isNativeVersion(MinecraftVersion version) {
        if (version == null) return false;
        return version.isNative();
    }

    public void resetToNative() {
        setVersion(nativeVersion);
    }

    public MinecraftVersion getActiveVersion() {
        if (!viaFabricPlusLoaded) {
            return selectedVersion;
        }

        try {
            Class<?> protocolTranslatorClass = Class.forName("de.florianmichael.viafabricplus.protocoltranslator.ProtocolTranslator");
            Method getTargetVersionMethod = protocolTranslatorClass.getMethod("getTargetVersion");
            Object current = getTargetVersionMethod.invoke(null);

            Class<?> protocolVersionClass = Class.forName("com.viaversion.viaversion.api.protocol.version.ProtocolVersion");
            Method getVersionMethod = protocolVersionClass.getMethod("getVersion");
            int protocolId = (int) getVersionMethod.invoke(current);

            for (MinecraftVersion version : supportedVersions) {
                if (version.getProtocolId() == protocolId) {
                    return version;
                }
            }
        } catch (Exception e) {
            System.err.println("[FourAPI] Error getting active version: " + e.getMessage());
        }

        return selectedVersion;
    }

    public boolean isViaActive() {
        return viaFabricPlusLoaded && !selectedVersion.equals(nativeVersion);
    }

    public String getViaStatus() {
        if (!viaFabricPlusLoaded) {
            return "ViaFabricPlus not loaded";
        }
        return "ViaFabricPlus 4.0.5-BACKPORT";
    }

    public boolean isViaVersionLoaded() {
        return viaFabricPlusLoaded;
    }

    public boolean isViaFabricPlusLoaded() {
        return viaFabricPlusLoaded;
    }

    @Deprecated
    public boolean isViaBackwardsLoaded() {
        return viaFabricPlusLoaded;
    }

    @Deprecated
    public boolean isViaRewindLoaded() {
        return viaFabricPlusLoaded;
    }

    public static class MinecraftVersion {
        @Getter
        private final String name;
        @Getter
        private final int protocolId;
        @Getter
        private final boolean isNative;

        public MinecraftVersion(String name, int protocolId, boolean isNative) {
            this.name = name;
            this.protocolId = protocolId;
            this.isNative = isNative;
        }

        public int getVersion() {
            return protocolId;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) return true;
            if (!(obj instanceof MinecraftVersion other)) return false;
            return protocolId == other.protocolId;
        }

        @Override
        public int hashCode() {
            return protocolId;
        }

        @Override
        public String toString() {
            return name + " (" + protocolId + ")";
        }
    }
}
Можно через Mixin добавить в мультиплейер создаем Mixin
MultiplayerScreenMixin
Указываем @Mixin(MultiplayerScreen.class)

и делаем что хотим или дальше говнокодим
Код:
Expand Collapse Copy
private void handleViaVersionDropdown(int mouseX, int mouseY) {
    float x = 5;
    float y = 5;
    float width = 100;
    float headerHeight = 16;

    List<MinecraftVersion> versions = viaManager.getSupportedVersions();
    MinecraftVersion selectedVersion = viaManager.getSelectedVersion();

    if (viaDropdownHeight > 0.1f) {
        float contentY = y + headerHeight + 2;
        float fadeProgress = viaDropdownTargetHeight > 0 ? viaDropdownHeight / viaDropdownTargetHeight : 0f;

        hoveredVersionIndex = -1;
        float itemHeight = 9f;
        float scrollY = -viaDropdownScroll;

        for (int i = 0; i < versions.size(); i++) {
            MinecraftVersion version = versions.get(i);
            float itemY = contentY + 2 + scrollY + (i * itemHeight);

            if (itemY + itemHeight < contentY || itemY > contentY + viaDropdownHeight) {
                continue;
            }

            boolean hovered = mouseX >= x && mouseX <= x + width
                    && mouseY >= itemY && mouseY <= itemY + itemHeight
                    && viaDropdownExpanded;

            if (hovered) hoveredVersionIndex = i;
        }
    }
}

Всё дальше кайфуем от жизни!
..... У виа фабрика уже есть своя гуишка и зачем это делать я хз
 
Назад
Сверху Снизу