1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Плагин на атрибуты из Forge

Тема в разделе "Запросы на разработку плагинов", создана пользователем lampasador, 15 июл 2023.

  1. Автор темы
    lampasador

    lampasador Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lampasador
    Столкнулся с проблемой, когда делал арену, которую в идеале хотелось бы перенести на постоянный сервер, и желательно чтобы на неё могли заходить хоть с ванили, хоть с фабрика. Но чтобы сохранялись и работали атрибуты из форджа:
    Сам фордж добавляет 6 новых атрибутов без которых сложно разнообразить пвп в майнкрафте, самый главный это Entity reach, который отвечает за то на каком расстоянии ты можешь ударить сущность.
    Проблема заключается в том что когда человек заходит не с форджа, то его клиент попросту игнорирует все эти атрибуты и работает без них( например у предмета Entity reach -50% но бьет он без уменьшения расстояния и вообще не видит этого параметра у предмета, и тогда выходит нечестная игра.

    Я хотел узнать возможно ли вообще создать такой плагин который создает такие атрибуты? или есть ли уже подобные? чтобы они работали и отображались у всех. лазил по интернету и ничего не нашел.

    Очень желательно, чтобы плагин работал на версии 1.19.4 или если это вообще возможно на 1.20.1 Плагин должен добавлять Атрибуты и возможность их изменять через команду (/attribute)

    Атрибуты block_reach - Расстояние, с которого игрок может взаимодействовать с блоками (базовое значение 4.5)

    entity_reach - Расстояние, с которого игрок может взаимодействовать с ентити (базовое значение 4.5)

    step_height_addition - дополнение к высоте, на которую может подняться игрок без использования прыжка (уперевшись в блок) (базовое значение 0)

    swim_speed - скорость плаванья (Базовое значение 1)

    entity_gravity - не знаю как описать этот атрибут. он отвечает за скорость падения сущности (базовое значение 0.08)
    [​IMG][​IMG]
     

    Вложения:

    Последнее редактирование: 16 июл 2023
  2. just_lofe

    just_lofe Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    just_l0fe
    Невозможно, только через костыли которые дай бог будут работать при 20 ТПС.
     
  3. Автор темы
    lampasador

    lampasador Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lampasador
    Получается это всё таки возможно? даже если через костыли то это намного лучше чем смирится с тем что пвп невозможно без форджа улучшить, к сожалению я в написании плагинов и чего либо ещё слаб, и это стало серьезной проблемой, которую хочется решить.
     
  4. just_lofe

    just_lofe Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    just_l0fe
    За такое врятли в целом кто-то возьмется.
     
  5. Автор темы
    lampasador

    lampasador Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lampasador
    Жаль, я бы очень хотел чтобы такое вообще появилось, да и деньги бы я за такое заплатил, только я не знаю у кого можно просить и где.
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В коммерческом разделе. Найти разработчика или создать тему самостоятельно.
     
  7. Автор темы
    lampasador

    lampasador Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lampasador
  8. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    HIDDEN
    Код:
    package com.example.attributeplugin;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.attribute.Attribute;
    import org.bukkit.attribute.AttributeModifier;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.*********ventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class AttributePlugin extends JavaPlugin implements CommandExecutor {
    
        @Override
        public void onEnable() {
            getLogger().info("AttributePlugin has been enabled!");
            getCommand("attribute").setExecutor(this);
        }
    
        @Override
        public void onDisable() {
            getLogger().info("AttributePlugin has been disabled!");
        }
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("attribute")) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage("This command can only be used by players.");
                    return true;
                }
    
                Player player = (Player) sender;
    
                if (args.length < 3) {
                    player.sendMessage("Usage: /attribute <item_slot> <attribute_name> <value>");
                    return true;
                }
    
                int itemSlot;
                try {
                    itemSlot = Integer.parseInt(args[0]);
                } catch (NumberFormatException e) {
                    player.sendMessage("Invalid item slot. Please provide a valid number.");
                    return true;
                }
    
                String attributeName = args[1].toLowerCase();
                double value;
    
                try {
                    value = Double.parseDouble(args[2]);
                } catch (NumberFormatException e) {
                    player.sendMessage("Invalid value. Please provide a valid number.");
                    return true;
                }
    
                ItemStack item = player.getInventory().getItem(itemSlot);
    
                if (item == null || item.getType() == Material.AIR) {
                    player.sendMessage("No item found in the specified slot.");
                    return true;
                }
    
                applyAttribute(player, item, attributeName, value);
                player.sendMessage("Attribute " + attributeName + " set to " + value + " for the item in slot " + itemSlot);
    
                return true;
            }
            return false;
        }
    
        private void applyAttribute(Player player, ItemStack item, String attributeName, double value) {
            AttributeModifier modifier = new AttributeModifier("custom_" + attributeName, value, AttributeModifier.Operation.ADD_NUMBER);
    
            switch (attributeName) {
                case "block_reach":
                    item.getAttributeModifiers(Attribute.GENERIC_MOVEMENT_SPEED).clear();
                    item.addAttributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, modifier);
                    break;
                case "entity_reach":
                    item.getAttributeModifiers(Attribute.GENERIC_FOLLOW_RANGE).clear();
                    item.addAttributeModifier(Attribute.GENERIC_FOLLOW_RANGE, modifier);
                    break;
                case "step_height_addition":
                    item.getAttributeModifiers(Attribute.GENERIC_MAX_HEALTH).clear();
                    item.addAttributeModifier(Attribute.GENERIC_MAX_HEALTH, modifier);
                    break;
                case "swim_speed":
                    item.getAttributeModifiers(Attribute.GENERIC_SWIM_SPEED).clear();
                    item.addAttributeModifier(Attribute.GENERIC_SWIM_SPEED, modifier);
                    break;
                case "entity_gravity":
                    item.getAttributeModifiers(Attribute.GENERIC_KNOCKBACK_RESISTANCE).clear();
                    item.addAttributeModifier(Attribute.GENERIC_KNOCKBACK_RESISTANCE, modifier);
                    break;
                default:
                    player.sendMessage("Invalid attribute name. Available attributes: block_reach, entity_reach, step_height_addition, swim_speed, entity_gravity");
                    break;
            }
        }
    }
    Если бы вы читали документацию то знали бы, что эти атрибуты есть в api ведра. Привожу примерную базовую реализацию.
     

Поделиться этой страницей