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

Код на Java

Тема в разделе "Разработка плагинов для новичков", создана пользователем NotCopter, 21 сен 2023.

Метки:
?

Ваша оценка

  1. Будет медленно работать

  2. Сложно поддерживать

  3. Слишком замудрённо

  4. Слишком много кода будет

  5. Я ничего не смыслю в Java

  6. Что-то другое

Можно выбрать сразу несколько вариантов.
Результаты будут видны только после голосования.
  1. Автор темы
    NotCopter

    NotCopter Участник Пользователь

    Баллы:
    31
    Дорогие форумчане, пожалуйста оцените мой уровень говнокода по шкале от 1 до 5, и если можно, предложите шаги для развития. Вот сама задача:

    У меня в мини-игре есть некоторый набор уникальных предметов (их кол-во не будет менятся), сами по себе они представляют обычные предметы, с какими-то фишкам, которые им даёт плагин. Грубо говоря, для каждого предмета есть разное кол-во событий, и для этих событий разные варианты действий.
    Например: Золотой сет, на ПКМ с предметом в руке одевается, и меняет штаны и нагрудник на золотые, при получении урона отбрасывает по направлению удара с силой в 20% от начальной. Я решил то, что для каждого предмета будет отдельный класс, который наследуется от некоторого абстрактного класса в котором определены методы по типу onRMB, onLMB и т.д. Все классы уник. предм. хранятся в отделном Enum, который уже перехватывает события и выполняет нужные действия в зависимости от предмета.

    Вот код:
    PHP:
    public enum CustomItem implements Listener {
        
    GOLDEN_KIT(new GoldenKit()); // Далее будут прочие предметы

        
    private final AbstractItem obj;

        
    CustomItem(AbstractItem obj) {
            
    this.obj obj;
            
    getServer().getPluginManager().registerEvents(thisNotBedwars.getInstance());
        }

        @
    EventHandler private void onInteract(PlayerInteractEvent ev) {
            if (!
    obj.isHoldingItem(ev.getPlayer())) return;
            switch (
    ev.getAction()) {
                case 
    LEFT_CLICK_BLOCK:
                case 
    LEFT_CLICK_AIR:
                    
    obj.onLMB(ev.getPlayer());
                    break;

                case 
    RIGHT_CLICK_BLOCK:
                case 
    RIGHT_CLICK_AIR:
                    
    obj.onRMB(ev.getPlayer());
                    break;
            }
        }
    }
    PHP:
    abstract class AbstractItem {
        static final 
    Plugin plugin NotBedwars.getInstance();
        public final 
    String tag;

        
    AbstractItem(String tag) {
            
    this.tag tag;
        }
        static private 
    void notImplemented(Player player) {
            
    player.sendActionBar(Component.text("Не реализованно!"TextColor.color(0xFF2C36), TextDecoration.BOLD));
        }
        public 
    boolean isNotHoldingItem(Player player) {
            return 
    getItemHand(player) == null;
        }
        public @
    Nullable MainHand getItemHand(Player player) {
            
    PlayerInventory inv player.getInventory();

            if (
    isValidItem(inv.getItemInMainHand()))
                return 
    player.getMainHand();

            if (
    isValidItem(inv.getItemInOffHand()))
                return 
    player.getMainHand() == MainHand.RIGHT MainHand.LEFT MainHand.RIGHT;

            return 
    null;
        }
        public 
    boolean isValidItem(ItemStack item) {
            
    // Проверка
        
    }

        public 
    void onRMB(Player player) {}
        public 
    void onLMB(Player player) {}
    }
    PHP:
    public class GoldenKit extends AbstractItem {
        public 
    GoldenKit() { super("golden_kit"); }

        @
    Override
        
    public void onRMB(Player player) {
            
    player.sendActionBar("Вы кликнули пкм");
        }
    }
     
    Последнее редактирование: 21 сен 2023
  2. MurlikMurlik

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

    Баллы:
    96
    2 слушателя на каждый тип енума. Лучше перенести все слушатели в один и в нем вычислять тип енума по держащему в руке предмету при событии.
    Например в абстракции создать абстрактные методы onLeftClick, onRightClick, onJump, и вызывать их при событиях, а уже в реализациях определять для них поведение если нужно.


    Не зачем еще раз реализовывать Listener, когда он уже был реализован в абстракции AbstractItem
     
  3. Автор темы
    NotCopter

    NotCopter Участник Пользователь

    Баллы:
    31
    Спасибо за ответ, я обновил код
     

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