Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Пытаюсь выловить эвент

Тема в разделе "Модификации клиента", создана пользователем sashabelii, 9 мар 2014.

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

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Доброго времени суток.

    Итак: я ловлю событие пкм и отменяю его, все работает, но т.к. я человек, помешанный на оптимальности задам вопрос знающим людям: можно ли сделать лучше?

    CoordHardFix.java
    Код:
    package net.xmod;
    
    import net.minecraftforge.event.Event;
    import net.minecraftforge.event.ForgeSubscribe;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
    
    public class CoordHardFix extends Event {
    
    @ForgeSubscribe
    public void InteractBlocker(PlayerInteractEvent block)
    {
        Action action = block.action;
        Action check = block.action.LEFT_CLICK_BLOCK;
       
    
    if(action != check) {
       
    if (block.isCancelable())
    {
        block.setCanceled(true);
        System.out.println(action);
    }
    
    }
    
    }
    }
    
    PlayerInteractEvent.java
    Код:
    package net.minecraftforge.event.entity.player;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.world.World;
    import net.minecraftforge.event.Cancelable;
    import net.minecraftforge.event.Event;
    import static net.minecraftforge.event.Event.Result;
    import static net.minecraftforge.event.Event.Result.*;
    
    @Cancelable
    public class PlayerInteractEvent extends PlayerEvent
    {
        public static enum Action
        {
            RIGHT_CLICK_AIR,
            RIGHT_CLICK_BLOCK,
            LEFT_CLICK_BLOCK
        }
      
        public final Action action;
        public final int x;
        public final int y;
        public final int z;
        public final int face;
      
        public Result useBlock = DEFAULT;
        public Result useItem = DEFAULT;
      
        public PlayerInteractEvent(EntityPlayer player, Action action, int x, int y, int z, int face)
        {
            super(player);
            this.action = action;
            this.x = x;
            this.y = y;
            this.z = z;
            this.face = face;
            if (face == -1) useBlock = DENY;
        }
      
        @Override
        public void setCanceled(boolean cancel)
        {
            super.setCanceled(cancel);
            useBlock = (cancel ? DENY : useBlock == DENY ? DEFAULT : useBlock);
            useItem = (cancel ? DENY : useItem == DENY ? DEFAULT : useItem);
        }
    }
    
     
    Последнее редактирование: 9 мар 2014
  2. Хостинг MineCraft
    <
  3. DdoosS

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

    Баллы:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    И так нормас
     
  4. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Спасибо, утешили)[DOUBLEPOST=1394569876,1394553233][/DOUBLEPOST]Ещё вопросы:
    Как можно получить координаты игрока и мир в котором он находится?
    Выходит, что весь код будет погонятся после каждого пкм-эвента? Не будет ли это вызвать какие-либо проблемы в игре?
    Код:
    package net.xmod;
    
    import net.minecraftforge.event.Event;
    import net.minecraftforge.event.ForgeSubscribe;
    import net.minecraftforge.event.entity.player.PlayerEvent;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
    
    public class CoordHardFix extends Event {
    
    @ForgeSubscribe
    public void InteractBlocker(PlayerInteractEvent block) {
     
        Action action = block.action;
        Action check = block.action.LEFT_CLICK_BLOCK;
     
        // Фикс-корды (куб)
        int fx = -395;
        int fy = 14;
        int fz = -1812;
     
        int fx1 = -385;
        int fy1 = 4;
        int fz1 = -1800;
     
        // Корды игрока
     
        int px = 1; // необходимо получить!
        int py = 1; // необходимо получить!
        int pz = 1; // необходимо получить!
     
        String playerWorld = "Main"; // необходимо получить!
        String mainworld = "Main";
     
     
        /* Снимаю корды
     
        int x = block.x;
        int y = block.y;
        int z = block.z;
     
        */
    
        // Логика
     
      if(action != check) {
        if(playerWorld.equals(mainworld)) {
            System.out.println("check world");
            if(px > -395 && px < fx1 && py > fy && py < fy1 && pz > fz && pz < fz1) {
              if (block.isCancelable()) {
                block.setCanceled(true);
                System.out.println("do");
              }
            }
        }
      }
    
    }
    }
    
     
  5. DdoosS

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

    Баллы:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    Лови :good: P.S. код не проверял, но думаю если есть ошибки, то поймешь как исправить.
    Код:
    public void InteractBlocker(PlayerInteractEvent event) {
        if (!event.entity.worldObj.isRemote) {
           if (event.entity instanceof EntityPlayerMP) {
            EntityPlayer player = (EntityPlayer) event.entity; // Игрок
            Action action = event.action;
            Action check = event.action.LEFT_CLICK_BLOCK;
    
            // Фикс-корды (куб)
            int fx = -395;
            int fy = 14;
            int fz = -1812;
    
            int fx1 = -385;
            int fy1 = 4;
            int fz1 = -1800;
    
            // Корды игрока
    
            int px = (int) player.posX; // координата по X
            int py = (int) player.posY; // координата по Y
            int pz = (int) player.posZ; // координата по Z
    
            String playerWorld = player.worldObj.getSaveHandler()
                .getWorldDirectoryName(); // Имя мира, если тебе нужно
                             // именно это
            String mainworld = "Main";
    
            // Снимаем корды
            int x = event.x;
            int y = event.y;
            int z = event.z;
    
            // Логика
    
            if (action != check) {
               if (playerWorld.equals(mainworld)) {
                System.out.println("check world");
                if (px > fx && px < fx1 && py > fy && py < fy1
                    && pz > fz && pz < fz1) {
                   if (event.isCancelable()) {
                    event.setCanceled(true);
                    System.out.println("do");
                   }
                }
               }
            }
           }
        }
        }
    
    [DOUBLEPOST=1394572571,1394570744][/DOUBLEPOST]Единствненное что, у тебя под условие подходит событие клика ПКМ по воздуху. Сомневаюсь что в таком событии есть место координатам.
     
    sashabelii нравится это.
  6. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Огромное спасибо, позже протестирую.[DOUBLEPOST=1394655766][/DOUBLEPOST]...worldObj.isRemote - проверяет "серверный"(удаленный) ли мир?
     
  7. DdoosS

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

    Баллы:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    Да
     
    sashabelii нравится это.
  8. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    А не подскажете ли ещё, как получить мета-дату(субID) блока/предмета, на основе шерсти, нашел такое:
    player.inventory.getCurrentItem().getItemDamage()
    Но ведь если я захочу проверить кирку из мода с каким-нибудь субID, то вместо него я буду получать её прочность.

    И как лучше реализовывать такие вещи: плагином или модом? Я боюсь за микро-фризы при взаимодействии с блоками.
    Код:

    CoordHardFix
    Код:
    package net.xmod;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraftforge.event.Event;
    import net.minecraftforge.event.ForgeSubscribe;
    import net.minecraftforge.event.entity.player.PlayerEvent;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent;
    import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
    
    public class CoordHardFix extends Event {
    
        @ForgeSubscribe
        public void InteractBlocker(PlayerInteractEvent event) {
           
            if (!event.entity.worldObj.isRemote) { // Серверный ли мир? "!" - не забыть
                if (event.entity instanceof EntityPlayerMP) {
                   
                    EntityPlayer player = (EntityPlayer) event.entity; // Игрок
                    int px = (int) player.posX;
                    int py = (int) player.posY;
                    int pz = (int) player.posZ;
                   
                    // Доп
                   
                    Settings settings = new Settings();
                   
                    // Взаимодействие(чек)
                    Action action = event.action;
                    Action check = event.action.LEFT_CLICK_BLOCK;
                   
                    String playerWorld = player.worldObj.getSaveHandler()
                            .getWorldDirectoryName();
                   
                    // Логика
                   
                    if(playerWorld.equals(settings.mainWorld)) {
                        if(player.inventory.getCurrentItem() != null) {
                            for(int x = 0; x < settings.blockItemsID.length; x++) {
                                if(player.inventory.getCurrentItem().itemID == settings.blockItemsID[x] && player.inventory.getCurrentItem().getItemDamage() == settings.blockItemsMetaData[x]) {
                                    if(action != check) {
                                        if(px > settings.fx && px < settings.fx1 && py > settings.fy && py < settings.fy1 && pz > settings.fz && pz < settings.fz1) {
                                            if (event.isCancelable()) {
                                                event.setCanceled(true);
                                            }
                                        }
                                    }
                                break;
                                }
                            }
                        }
                    } else if(playerWorld.equals(settings.danjWorld)) {
                        if(player.inventory.getCurrentItem() != null) {
                            for(int x = 0; x < settings.blockItemsID.length; x++) {
                                if(player.inventory.getCurrentItem().itemID == settings.blockItemsID[x]) {
                                    if(action != check) {
                                        if (event.isCancelable()) {
                                            event.setCanceled(true);
                                        }
                                    }
                                break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    Settings
    Код:
    package net.xmod;
    
    public class Settings {
    
        // Запрещенные предметы
        int[] blockItemsID = {
                1,
                1,
                1
                };
        int[] blockItemsMetaData = {
                0,
                0,
                0
                };
       
        // Названия миров
       
        String mainWorld = "Test";
        String danjWorld = "DanjWorld";
       
        // Спавн-зона
       
        int fx = 80;
        int fy = 0;
        int fz = 435;
       
        int fx1 = 91;
        int fy1 = 13;
        int fz1 = 447;
       
    }
    
     
    Последнее редактирование: 14 мар 2014
    eleon нравится это.
  9. DdoosS

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

    Баллы:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    В каком проекте работаешь?
     
    eleon нравится это.
  10. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    В своем[DOUBLEPOST=1394905876,1394825784][/DOUBLEPOST]
    А что по поводу мета-даты и
    [DOUBLEPOST=1395465532][/DOUBLEPOST]Нашел ответы на свои вопросы.
    1. player.inventory.getCurrentItem().getItemDamage() - отлично работает с предметами из модов(лазер IC, палочки Thaumcraft)
    2. Плагином
     
  11. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Изобретение велосипеда, который реализется тем же essentials anti build и парочкой пермов в нужных мирах?
     
  12. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Именно. Essentials на моем сервере не установлен(не нравится он мне), да и хочется как можно меньше зависеть от сторонних плагинов/модов.
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну ок, modifyworld . Жду отмазку номер 2. А твой типо не сторонний получается? Логика?
     
  14. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Сторонний, в смысле не свой. ModifyWorld - сторонний плагин :)
    Ну и так как я учу Java, свой мод/плагин - это опыт.
     
  15. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Если учишь жабу. Рисуй ивенты в тулзы модов. Чтоб они работали, но не ломали приват.
    Как это делают все.
     
    ПриветОтЛайки нравится это.
  16. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    У меня сервер без приватов, достаточно защитить спавн. Крутить эвенты я ещё не умею, ибо смотрел код и ничего толком не понял, много неизвестных методов.
     
  17. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Так чтож ты париься? обсидиан или мод на силовые поля.
     
  18. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Использую MFFS :)
     
  19. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
  20. Автор темы
    sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
  21. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Только там есть 1 баг с ic2 experimental. Если подключить редиоизатопный генератор то получаем поистине безлимитное электричество для полей!
     

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