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

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

Discussion in 'Модификации клиента' started by sashabelii, Mar 9, 2014.

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

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

    Trophy Points:
    123
    Имя в Minecraft:
    sashabelii
    Доброго времени суток.

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

    CoordHardFix.java
    Code:
    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
    Code:
    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);
        }
    }
    
     
    Last edited: Mar 9, 2014
  2. Хостинг MineCraft
    <
  3. DdoosS

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

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

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

    Trophy Points:
    123
    Имя в Minecraft:
    sashabelii
    Спасибо, утешили)[DOUBLEPOST=1394569876,1394553233][/DOUBLEPOST]Ещё вопросы:
    Как можно получить координаты игрока и мир в котором он находится?
    Выходит, что весь код будет погонятся после каждого пкм-эвента? Не будет ли это вызвать какие-либо проблемы в игре?
    Code:
    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 Активный участник Пользователь

    Trophy Points:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    Лови :good: P.S. код не проверял, но думаю если есть ошибки, то поймешь как исправить.
    Code:
    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 likes this.
  6. Автор темы
    sashabelii

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

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

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

    Trophy Points:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    Да
     
    sashabelii likes this.
  8. Автор темы
    sashabelii

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

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

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

    CoordHardFix
    Code:
    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
    Code:
    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;
       
    }
    
     
    Last edited: Mar 14, 2014
    eleon likes this.
  9. DdoosS

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

    Trophy Points:
    88
    Skype:
    karatelnax
    Имя в Minecraft:
    DdoosS
    В каком проекте работаешь?
     
    eleon likes this.
  10. Автор темы
    sashabelii

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    173
    Skype:
    alexandr0116
  20. Автор темы
    sashabelii

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

    Trophy Points:
    123
    Имя в Minecraft:
    sashabelii
  21. alexandrage

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

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

Share This Page