Skip to content

Multifunctional API for developing plugins and games for Minecraft servers

Notifications You must be signed in to change notification settings

MikhailSterkhov/StonlexAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

72 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

StonlexAPI


ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь


Основная информация

Π’ основном данная Π°ΠΏΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для написания ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… систСм ΠΈ ΠΈΠ³Ρ€ Π² сфСрС Minecraft.

Она нСсСт Π² сСбС мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Game API, ProtocolLib API, мноТСство ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠ², ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½ΠΎΡΡ‚ΡŒ (локализация сообщСний).


Bukkit-API

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ стало ΠΊΡƒΠ΄Π° ΠΏΡ€ΠΎΡ‰Π΅! Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ доступна Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ для ΠΌΠ΅Π»ΠΊΠΈΡ…, Ρ‚Π°ΠΊ ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Π΄Π°Π½Π½Ρ‹Ρ…, алиасов ΠΈ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄.

Для Π½Π°Ρ‡Π°Π»Π° создадим ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ BaseCommand, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π’ΠžΠ›Π¬ΠšΠž ΠΈΠ³Ρ€ΠΎΠΊ:

public class ExamplePlayerCommand
        extends BaseCommand<Player> {

    public ExamplePlayerCommand() {
        super("test", "testing");
    }

    @Override
    protected void onExecute(Player player, String[] args) {
        player.sendMessage(ChatColor.GREEN + "Π’Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ /player");
    }

}

Π Π°Π½Π΅Π΅ я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΎ создании Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ мноТСство ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ большого количСства ΠΊΠΎΠ΄Π°. Π Π΅Ρ‡ΡŒ шла ΠΎ BaseMegaCommand:

public class ExamplePlayerCommand
        extends BaseMegaCommand<Player> {

    public ExamplePlayerCommand() {
        super("megatest", "megatesting");
    }

    @Override
    protected void onUsage(Player player) {
        player.sendMessage("Бписок доступных ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄:");
        player.sendMessage(" - /megatest online");
        player.sendMessage(" - /megatest broadcast <сообщСниС>");
    }

    @CommandArgument(aliases = "players")
    protected void online(Player player, String[] args) {
        int playersCount = Bukkit.getOnlinePlayers().size();

        String onlinePlayers = Joiner.on(", ").join(Bukkit.getOnlinePlayers().stream().map(Player::getDisplayName).collect(Collectors.toSet()));

        player.sendMessage(String.format("БСйчас Π½Π° сСрвСрС (%s): %s", playersCount, onlinePlayers));
    }

    @CommandArgument
    protected void broadcast(Player player, String[] args) {

        String broadcastMessage = ChatColor.translateAlternateColorCodes('&', Joiner.on(" ").join(args));

        for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
            onlinePlayer.sendMessage("MegaTest Broadcast > " + broadcastMessage);
        }
    }

}

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ - это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π° аннотация @CommandArgument ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ Вас ΠΎΡ‚ костылСй, duplicated-ΠΊΠΎΠ΄Π°, создав для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ алиасы.

Π’Π΅ΡΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠΌΠ΅Π½Ρ‚ Π½Π°Π΄ Bukkit API происходит Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½ класс - ru.stonlex.bukkit.StonlexBukkitApi

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, рСгистрация ΠΊΠΎΠΌΠ°Π½Π΄ происходит Ρ‚ΠΎΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· этот класс:

StonlexBukkitApi.registerCommand(new ExamplePlayerCommand());

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, которая Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈ Π½Π΅ воспроизводит Π½Π° основС ru.stonlex.bukkit.configuration.BaseConfiguration:

public class TestConfiguration
        extends BaseConfiguration {

    public TestConfiguration(@NonNull Plugin plugin) {
        super(plugin, "messages.yml");
    }

    @Override
    protected void onInstall(@NonNull FileConfiguration fileConfiguration) {
        // ...
    }

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ Π΄ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² сСбС сообщСния для Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π’Π°ΡˆΠ΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°:

public class TestConfiguration
        extends BaseConfiguration {

    protected final Map<String, String> messagesCacheMap = new HashMap<>();

    public TestConfiguration(@NonNull Plugin plugin) {
        super(plugin, "messages.yml");
    }

    @Override
    protected void onInstall(@NonNull FileConfiguration fileConfiguration) {
        for (String messageKey : fileConfiguration.getConfigurationSection("Messages").getKeys(false)) {

            String messageText = ChatColor.translateAlternateColorCodes('&', fileConfiguration.getString("Messages.".concat(messageKey)));
            messagesCacheMap.put(messageKey, messageText);
        }
    }
}

Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ…ΠΎΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΈ Ρ…ΠΎΡ‚ΡŒ Π³Π΄Π΅, Π½ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊ Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΈ Π½Π΅ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ Π΅Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ Π² ΠΏΡ€ΠΈΡ†Π½ΠΈΠΏΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΉ.

@Override
public void onEnable() {
        TestConfiguration configuration = new TestConfiguration(this);
        configuration.createIfNotExists();
}

Π’ Π΄Π°Π½Π½ΠΎΠΌ кускС ΠΊΠΎΠ΄Π° ΠΌΡ‹ создали (ΠΈΠ»ΠΈ скопировали ΠΈΠ· рСсурсов ΠΏΠ»Π°Π³ΠΈΠ½Π°) ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π² Π½Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ спокойно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ!


Π“ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

НСуТСли HolographicDisplays Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ устарСл?

По сути, Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ StonlexAPI содСрТит Π² сСбС Π΄Π°ΠΆΠ΅ API для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ создания Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ анимациями, обновлСниями ΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ строк.

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

ProtocolHolographic protocolHolographic
        = StonlexBukkitApi.createSimpleHolographic(location);

ВСкстовыС строки:

protocolHolographic.addTextLine(ChatColor.AQUA + "Π­Ρ‚ΠΎΡ‚ ΠΊΠ»ΡƒΠ±Π½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΠ΄ΠΈΠ½Π³ Π±Ρ‹Π» просто Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ΅Π½!");

ΠŸΡƒΡΡ‚Ρ‹Π΅ строчки:

protocolHolographic.addEmptyLine();

ΠšΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Π΅ строки:

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Ρ… Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌ
Consumer<Player> playerConsumer = player -> { //player = ΠΈΠ³Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»

    player.sendMessage(ChatColor.GOLD + "Клик ΠΏΠΎ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΎΡˆΠ΅Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ!");
    player.sendMessage(ChatColor.GOLD + "Локация: " + LocationUtil.locationToString(protocolHolographic.getLocation()));
};

// Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строк Π² Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
protocolHolographic.addClickLine(ChatColor.YELLOW + "Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄Π°Π½Π½ΠΎΠΉ API", playerConsumer);
protocolHolographic.addClickLine(ChatColor.GREEN + "https://vk.com/itzstonlex", playerConsumer);

Π‘Ρ‚Ρ€ΠΎΡ‡ΠΊΠΈ с ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°ΠΌΠΈ:

protocolHolographic.addDropLine(new ItemStack(Material.APPLE));

И Π΄Π°ΠΆΠ΅ строчки с Π³ΠΎΠ»ΠΎΠ²Π°ΠΌΠΈ ΠΏΠΎ Π½ΠΈΠΊΡƒ ΠΈΠ»ΠΈ тСкстурС:

protocolHolographic.addSkullLine("ItzStonlex", false);
protocolHolographic.addSkullLine("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDUyOGVkNDU4MDI0MDBmNDY1YjVjNGUzYTZiN2E5ZjJiNmE1YjNkNDc4YjZmZDg0OTI1Y2M1ZDk4ODM5MWM3ZCJ9fX0=", false);

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ, Ρ‚ΠΎ Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠΌΡƒ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» спавна ΠΈ удалСния этих Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌ, взаимодСйствуя с ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌΠΈ сСрвСра:

protocolHolographic.addReceivers(receiver); //Π·Π°ΡΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
protocolHolographic.removeReceivers(receiver); // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
protocolHolographic.addViewers(receiver); // ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
protocolHolographic.removeViewers(receiver); // ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
protocolHolographic.spawn(); // Π·Π°ΡΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ для всСх ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², ΠΈ Π΄Π°ΠΆΠ΅ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π΅Ρ‰Π΅ Π½Π΅ зашСл
protocolHolographic.remove(); // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°ΠΊ для всСх, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ спавн для Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²

Holographics


ΠšΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈ:

Вакая заСзТая, Π½ΠΎ такая Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ Ρ‚Π΅ΠΌΠ°... Многим Π΄Π°ΠΆΠ΅ сСйчас слоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Π΅, ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΡ‚Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅, Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ, ΠΈΠ»ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„ΠΈΡˆΠΊΠ°ΠΌΠΈ, Π½ΠΎ GUI-интСрфСйсы

Рассмотрим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ создания самого ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ инвСнтаря ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ru.stonlex.bukkit.inventory.impl.BaseSimpleInventory:

public class ExampleSimpleGUI
        extends BaseSimpleInventory {

    public ExampleSimpleGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        // ...
    }

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΡƒ ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² Π² слоты 5 ΠΈ 6.
Π’Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ подсчСт слотов Π² Π΄Π°Π½Π½ΠΎΠΉ API начинаСтся Π½Π΅ с 0, Π° с 1

public class ExampleSimpleGUI
        extends BaseSimpleInventory {

    public ExampleSimpleGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        addItem(5, ItemUtil.newBuilder(Material.STONE)
                        .setName("Β§eΠ‘Π°ΠΊΠ»Π°ΠΆΠ°Π½")
                        .build(),

                (player1, event) -> {

                    player.sendMessage("Β§eКлик ΠΏΡ€ΠΎΡˆΠ΅Π», Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ");
                    player.closeInventory();
                });

        addItem(6, ItemUtil.newBuilder(Material.CHEST)
                        .setName("Β§aΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ")
                        .build(),

                (player1, event) -> updateInventory(player));
    }

}

Π’Π°ΠΊΠΆΠ΅ нСльзя Π½Π΅ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ своих ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий:

    public ExampleSimpleGUI() {
        super(5, "НазваниС инвСнтаря");

        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ открытия/закрытия инвСнтаря
        addHandler(BaseInventoryDisplayableHandler.class, new BaseInventoryDisplayableHandler() {

            @Override
            public void onOpen(@NonNull Player player) {
                player.sendMessage("Β§aΠ’Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π» Example-ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ");
            }

            @Override
            public void onClose(@NonNull Player player) {
                player.sendMessage("Β§cΠ’Ρ‹ Π·Π°ΠΊΡ€Ρ‹Π» Example-ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ");
            }
        });
    }
    

BaseSimpleInventory

На Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ, этим ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ.

Помимо ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅ΠΉ Π±Ρ‹Π»ΠΈ написаны ΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΡ‚Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницС!

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ страничный ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ, наслСдуя ru.stonlex.bukkit.inventory.impl.BasePaginatedInventory:

public class ExamplePaginatedGUI
        extends BasePaginatedInventory {

    public ExamplePaginatedGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        // ...
    }

}

Π—Π°Ρ‚Π΅ΠΌ выставим Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ страничных ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° (ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΎΠΊ):

public class ExamplePaginatedGUI
        extends BasePaginatedInventory {

    public ExamplePaginatedGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        setItemMarkup(new BaseInventoryBlockMarkup(inventoryRows));

        // ...
    }

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ Π² Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ страницы:

P.S: API автоматичСски рассортируСт ΠΈΡ… ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ слотам ΠΈ страницам

public class ExamplePaginatedGUI
        extends BasePaginatedInventory {

    public ExamplePaginatedGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        setItemMarkup(new BaseInventoryBlockMarkup(inventoryRows));

        addItemToMarkup(new ItemStack(Material.STONE), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.DIAMOND), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.BANNER), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.BARRIER), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.CACTUS), (player1, event) -> player.closeInventory());

        //...
    }

}

ПослС Ρ‡Π΅Π³ΠΎ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ свои Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ нСзависимо ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° всСх страницах инвСнтаря.

Π’ ΠΌΠΎΠ΅ΠΌ случаС выставлСн ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π±Π΅Π· ΠΊΠ»ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ страницу, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится ΠΈΠ³Ρ€ΠΎΠΊ:

public class ExamplePaginatedGUI
        extends BasePaginatedInventory {

    public ExamplePaginatedGUI() {
        super(5, "НазваниС инвСнтаря");
    }

    @Override
    public void drawInventory(Player player) {
        setItemMarkup(new BaseInventoryBlockMarkup(inventoryRows));

        addItemToMarkup(new ItemStack(Material.STONE), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.DIAMOND), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.BANNER), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.BARRIER), (player1, event) -> player.closeInventory());
        addItemToMarkup(new ItemStack(Material.CACTUS), (player1, event) -> player.closeInventory());

        addItem(5, ItemUtil.newBuilder(Material.SIGN)
                .setName("Β§aΠ˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ")
                .setLore("Β§7Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°: Β§e" + (currentPage + 1)).build());
    }

}

Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ с ru.stonlex.bukkit.inventory.impl.BaseSimpleInventory, страничныС ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ своих ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий:

    public ExamplePaginatedGUI() {
        super(5, "НазваниС инвСнтаря");

        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ открытия/закрытия инвСнтаря
        addHandler(BaseInventoryDisplayableHandler.class, new BaseInventoryDisplayableHandler() {

            @Override
            public void onOpen(@NonNull Player player) {
                player.sendMessage("Β§aΠ’Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π» страничный Example-ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ");
            }

            @Override
            public void onClose(@NonNull Player player) {
                player.sendMessage("Β§cΠ’Ρ‹ Π·Π°ΠΊΡ€Ρ‹Π» страничный Example-ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΡŒ");
            }
        });
    }

BasePaginatedInventory


ProtocolLib-API:

Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ProtocolLib ΠΈ Π±Π΅Π· лишнСго ΠΊΠΎΠ΄Π° являСтся Π²ΠΏΠΎΠ»Π½Π΅ сСбС юзабСльной ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Однако ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ этих Π·Π°Π΄Π°Ρ‡ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π» :)

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρƒ Π΄Π°Π½Π½ΠΎΠΉ API достаточно нСмалСнький, Π½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΈ нСбольшой, пройдСмся ΠΏΠΎ порядку:


  • FakeEntity-API:

StonlexAPI позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ своих ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… Entity с ΠΏΠΎΠ»Π½ΠΎΠΉ кастомизациСй, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ настройкой.

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ru.stonlex.bukkit.protocollib.entity.impl.FakePlayer, сСйчас Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ NPC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сообщСниС ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ получСния ΡƒΡ€ΠΎΠ½Π° ΠΏΡ€ΠΈ ΡƒΠ΄Π°Ρ€Π΅:

FakePlayer fakePlayer = new FakePlayer(playerSkin, location);

// создаСм ΠΆΠ΅Π»Ρ‚ΡƒΡŽ подсвСтку для NPC
fakePlayer.setGlowingColor(ChatColor.YELLOW);

// Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ дСйствиС ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° NPC
fakePlayer.setClickAction(player -> { // player = ΠΈΠ³Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»

    player.sendMessage(ChatColor.GOLD + "Клик ΠΏΠΎ NPC ΠΏΡ€ΠΎΡˆΠ΅Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ");
    player.sendMessage(ChatColor.GOLD + "Локация: " + LocationUtil.locationToString(fakePlayer.getLocation()));
});

// Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ дСйствиС ΠΏΡ€ΠΈ Π°Ρ‚Π°ΠΊΠ΅ NPC
fakePlayer.setAttackAction(player -> {
    fakePlayer.playAnimation(FakeEntityAnimation.TAKE_DAMAGE, player);
});

fakePlayer.look(receiver); //ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°
        
fakePlayer.setBurning(true); // ΠΏΠΎΠ΄ΠΆΠ΅Ρ‡ΡŒ
fakePlayer.setInvisible(false); // ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ

Π‘ΠΏΠ°Π²Π½ этих Entity Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π³ΠΎΠ»ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…:

fakePlayer.addReceivers(receiver); //Π·Π°ΡΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
fakePlayer.removeReceivers(receiver); // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
fakePlayer.addViewers(receiver); // ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
fakePlayer.removeViewers(receiver); // ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°
fakePlayer.spawn(); // Π·Π°ΡΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ для всСх ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², ΠΈ Π΄Π°ΠΆΠ΅ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π΅Ρ‰Π΅ Π½Π΅ зашСл
fakePlayer.remove(); // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Entity ΠΊΠ°ΠΊ для всСх, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ спавн для Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²

FakeEntity


  • FakeTeams-API:

StonlexAPI Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ Team'Ρ‹ с ΠΏΠΎΠ»Π½ΠΎΠΉ кастомизациСй ΠΈ настройкой.

Рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ ΠΏΡ€ΠΈ Π·Π°Ρ…ΠΎΠ΄Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π² TabList ΠΈ Π½Π°Π΄ Π³ΠΎΠ»ΠΎΠ²ΠΎΠΉ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прСфикс ΠΈ суффикс:

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
    Player player = event.getPlayer();

    ProtocolTeam protocolTeam = ProtocolTeam.get("Team_" + player.getName());
    
    protocolTeam.setPrefix("§e§lPREFIX §f");
    protocolTeam.setSuffix(" Β§6Β§lSUFFIX");
    
    // ...
}

ПослС создания Team'Ρ‹, Π² Π½Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ. ДСлаСтся это Ρ‡Π΅Ρ€Π΅Π· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

protocolTeam.addPlayerEntry(player);

ПослС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ProtocolTeam ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ:

ProtocolTeam protocolTeam = ProtocolTeam.findEntry(player);

Π’Π°ΠΊ ΠΊΠ°ΠΊ ProtocolTeam являСтся ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΌ классом, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, просто Ρ‚Π°ΠΊ ΠΎΠ½ Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Π½ (ΠšΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Team). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ двумя способами:

Бпособ 1: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ProtocolTeam Π² список Π°Π²Ρ‚ΠΎ-отрисовки всСм ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ ΠΎΠ½Π»Π°ΠΉΠ½, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зашСдшим:

protocolTeam.addAutoReceived();

Бпособ 2: ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π² список Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ProtocolTeam:

protocolTeam.addReceiver(player);

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Бпособу 2: ПослС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ProtocolTeam ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ:

ProtocolTeam protocolTeam = ProtocolTeam.findReceiver(player);

ProtocolTeam


  • Protocol Packets-API:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² происходит Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ ru.stonlex.bukkit.protocollib.packet.ProtocolPacketFactory

Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° воспроизвСдСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ "ΠΌΠ°Ρ…Π°" Ρ€ΡƒΠΊΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠΊΠ°

WrapperPlayServerAnimation animationPacket 
                = ProtocolPacketFactory.createAnimationPacket(player.getEntityId(), FakeEntityAnimation.SWING_MAIN_HAND.ordinal());

ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ:

animationPacket.sendPacket(player);

Π’Π°ΠΊ ΠΈ всСм ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎ сСйчас находятся Π½Π° сСрвСрС:

animationPacket.broadcastPacket();

Scoreboards:

Бтатистику ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², сСрвСра, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ всС ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Scoreboard, Π° StonlexAPI ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈΡ… написаниС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π² ΠΏΠ°Ρ€Ρƒ строчСк ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ скорборды, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Ρ‚Π΅Π³Π°ΠΌΠΈ, ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π°Ρ€Π°ΠΌΠΈ, созданными Ρ‡Π΅Ρ€Π΅Π· Scoreboard.

БСйчас Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Scoreboard:

Scoreboards

Для Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Builder, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для Scoreboard:

BaseScoreboardBuilder scoreboardBuilder = StonlexBukkitApi.newScoreboardBuilder();

Установим ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ½ΡƒΡŽ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π°ΡˆΠ΅ΠΌΡƒ Scoreboard`Ρƒ:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Scoreboard? - Π­Ρ‚ΠΎ катСгория, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ опрСдСляСтся, ΠΊΠΎΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ этот интСрфСйс.

  • PROTOTYPE - Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° Scoreboard выставляСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Если ΠΏΠΎΠ·ΠΆΠ΅ для ΠΈΠ³Ρ€ΠΎΠΊΠ° Π±Ρ‹Π» выставлСн Π½ΠΎΠ²Ρ‹ΠΉ Scoreboard, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ для Π½Π΅Π³ΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒΡΡ, прСдоставив мСсто для Π½ΠΎΠ²ΠΎΠ³ΠΎ.
  • PUBLIC - Scoreboard автоматичСски выставляСтся для всСх Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈ для Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΡˆΠ΅Π΄ΡˆΠΈΡ…. Если ΠΏΠΎΠ·ΠΆΠ΅ для ΠΈΠ³Ρ€ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ выставлСн Scoreboard Ρ‚ΠΈΠΏΠ° PROTOTYPE, Ρ‚ΠΎ PUBLIC Π½Π° врСмя скроСтся Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° PROTOTYPE Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ для ΠΈΠ³Ρ€ΠΎΠΊΠ°. Но Ссли Π΅Ρ‰Π΅ ΠΏΠΎΠ·ΠΆΠ΅ для ΠΈΠ³Ρ€ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ выставлСн Scoreboard Ρ‚ΠΈΠΏΠ° PUBLIC, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Scoreboard с Ρ‚ΠΈΠΏΠΎΠΌ PUBLIC Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈ ΠΎΡ‡ΠΈΡ‰Π΅Π½ для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠ°.
scoreboardBuilder.scoreboardScope(BaseScoreboardScope.PROTOTYPE);

Π—Π°Ρ‚Π΅ΠΌ, создадим ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Scoreboard - Flick Animation:

ScoreboardDisplayFlickAnimation displayFlickAnimation = new ScoreboardDisplayFlickAnimation();

// ΠŸΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ добавляСм Ρ†Π²Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ
displayFlickAnimation.addColor(ChatColor.RED);
displayFlickAnimation.addColor(ChatColor.GOLD);
displayFlickAnimation.addColor(ChatColor.YELLOW);
displayFlickAnimation.addColor(ChatColor.WHITE);

// УстанавливаСм тСкст для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ
displayFlickAnimation.addTextToAnimation("Β§lSTONLEX API");

ПослС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эту Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Scoreboard:

scoreboardBuilder.scoreboardDisplay(displayFlickAnimation);

Π”Π°Π»Π΅Π΅, выставляСм индСксы Π»ΠΈΠ½ΠΈΠΉ ΠΈ тСкст ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…:

scoreboardBuilder.scoreboardLine(6, ChatColor.GRAY + DateUtil.formatPattern(DateUtil.DEFAULT_DATE_PATTERN));
scoreboardBuilder.scoreboardLine(5, "");
scoreboardBuilder.scoreboardLine(4, "Ник: §c...");
scoreboardBuilder.scoreboardLine(3, "ΠŸΡ€Ρ‹ΠΆΠΊΠΎΠ²: Β§c...");
scoreboardBuilder.scoreboardLine(2, "");
scoreboardBuilder.scoreboardLine(1, "Β§ehttps://vk.com/itzstonlex");

Π’ΠΎΡ‚ ΠΈ всС, основныС настройки для Scoreboard выставлСны!

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ скорборда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 5 Ρ‚ΠΈΠΊΠΎΠ², ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ тСкст ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… строчСк:

scoreboardBuilder.scoreboardUpdater((baseScoreboard, player1) -> {
    
    baseScoreboard.updateScoreboardLine(4, player1, "Ник: §7" + player1.getName());
    baseScoreboard.updateScoreboardLine(3, player1, "ΠŸΡ€Ρ‹ΠΆΠΊΠΎΠ²: Β§a" + NumberUtil.spaced(player1.getStatistic(Statistic.JUMP)));

}, 20);

Π’Π°ΠΊ ΠΊΠ°ΠΊ наш Scoreboard ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° PROTOTYPE, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

ДСлаСтся это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

scoreboardBuilder.build().setScoreboardToPlayer(player);

Scoreboard создан, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ настроСн ΠΈ установлСн ΠΈΠ³Ρ€ΠΎΠΊΡƒ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅?


Vault-API:

Π”Π°Π½Π½ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ управляСт класс VaultServiceManager

Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Vault ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°ΠΌ, Ρ‚Π°ΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ API-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

double balance = StonlexBukkitApi.VAULT_API.getBalance("ItzStonlex");
String prefix = StonlexBukkitApi.VAULT_API.getPrefix("ItzStonlex");
VaultService<Economy> service = StonlexBukkitApi.VAULT_REGISTRY.getRegisteredService(Economy.class);
Economy economy = service.getCurrentService(Bukkit.getServer());

if (economy != null) {
    // ...
}

Для рСгистрации своих Vault ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ API-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

VaultService<Economy> economyService = StonlexBukkitApi.VAULT_REGISTRY.getRegisteredService(Economy.class);
economyService.register(this, new MyEconomyImpl());

ΠΈΠ»ΠΈ...

economyService.register(this, ServicePriority.Highest, new MyEconomyImpl());

About

Multifunctional API for developing plugins and games for Minecraft servers

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages