[1.6.4] Как блокировать событие "Focus Equal Trade", Thaumcraft

Статус
В этой теме нельзя размещать новые ответы.
675
2
Доброго времени суток.

На своем сервере я блокирую PlayerInteractEvent с некоторыми предметами в руках(лазер, палочки, ме-пушка). Все это прекрасно работает, но как я понял, некоторые набалдашники из Thaumcraft идут в обход этого события. Огненный набалдашник например не наносит урон интити, но огонь испускает.
Проблема Focus Equal Trade в том, что он(как я понял) получает координаты блока, на которые смотрит игрок и относительно них работает, т.е. отменять нечего, т.к. посох просто получает координаты, а блокируется уже некое действие, которое к событию никак не привязано.

Пытался декомпильнуть мод, чтобы внести правки непосредственно в него. Замазав ошибки, я внес изменения, компильнул, но измененный класс закинутый в оригинальный мод выдает ошибки по креатив-табу(хотя в эклипсе все работает).

Собственно вопрос: Что делать и куда копать?
 
905
5
BlockEvent же. Ищещь FakePlayer Тхаума и отменяешь.
 
2,955
12
два правила. Первое. Не изменять исходники. Второе. Не декомпилировать модов у которых нет исходников.Хороший мод, зачем что то из него запрещать. А, еще, есть такой плагин, называется BanItems. Вот его и используй что бы запрещать.
 
905
5
Дык он не запретить, а выключить хочет.
Да и я на оба правила плевал, чего уж там.
 
905
5
Ага. Только не будут в никуда тратиться ресы(а крафт в тхауме свой, не вырубается). Будет нерабочий фокус :D
 
675
2
Блокирую эвент на спавне, в остальном мире нет приватов и собственно запрещать ничего не нужно. А вырезать крафт можно с помощью API(который кстати у меня не работает), либо LokiBlockerом(запретить пикап, крафт), но это не вариант.
[merge_posts_bbcode]Добавлено: 28.03.2014 15:19:28[/merge_posts_bbcode]

Dragon2488 написал(а):
два правила. Первое. Не изменять исходники. Второе. Не декомпилировать модов у которых нет исходников.Хороший мод, зачем что то из него запрещать. А, еще, есть такой плагин, называется BanItems. Вот его и используй что бы запрещать.
Да! Не нужно изменять исходники, даешь анархию и отсутствие патчей на бакит эвенты, так ведь?)
laz2727, спасибо, но разве в форже есть BlockEvent? Я пытаюсь исправить таум модом.[/size]
 
905
5
Try4W написал(а):
laz2727, спасибо, но разве в форже есть BlockEvent? Я пытаюсь исправить таум модом.
%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202014-03-28%2016.23.45.png
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Вообще-то в IC2 API есть событие ломания блока лазером, хз насчет всех остальных, но можно покопать в их API, вдруг они что-то подобное запилили.
 
675
2
anti344 написал(а):
Вообще-то в IC2 API есть событие ломания блока лазером, хз насчет всех остальных, но можно покопать в их API, вдруг они что-то подобное запилили.
MiningLaserEvent или как-то так, но я просто поставлю бакит эвенты, да и лазер отлично блокируется PlayerInteractEvent.

По поводу таумкрафта:
Код:
    public void BreakEvent(BreakEvent event) {
        
        //if(event.getPlayer().username == "FakeThaumcraft") {
        
            if (event.isCancelable()) {
                event.setCanceled(true);
                System.out.println("IT STOPED!!!");
            }
        //}
    }
Дал даже меньше, чем PlayerInteractEvent.
Насколько я понимаю, таум использует консольные команды или что-то на подобное для установки блоков.


Часть кода набалдашника
Код:
   public ItemStack onFocusRightClick(ItemStack itemstack, World world, EntityPlayer player, MovingObjectPosition mop) {
      ItemWandCasting wand = (ItemWandCasting)itemstack.getItem();
      if(mop != null && mop.typeOfHit == EnumMovingObjectType.TILE) {
         int x = mop.blockX;
         int y = mop.blockY;
         int z = mop.blockZ;
         int bi = world.getBlockId(x, y, z);
         int md = world.getBlockMetadata(x, y, z);
         ItemStack pb;
         if(player.isSneaking()) {
            if(!world.isRemote && world.getBlockTileEntity(x, y, z) == null) {
               try {
                  if(Block.blocksList[bi] != null) {
                     pb = Utils.createStackedBlock(Block.blocksList[bi], md);
                     if(pb != null) {
                        bi = pb.itemID;
                        md = pb.getItemDamage();
                     }
                  }
               } catch (Exception var12) {
                  ;
               }

               this.storePickedBlock(itemstack, (short)bi, (short)md);
            } else {
               player.swingItem();
            }
         } else {
            pb = this.getPickedBlock(itemstack);
            if(pb != null && world.isRemote) {
               player.swingItem();
            } else if(pb != null && world.getBlockTileEntity(x, y, z) == null && world.getBlockMaterial(x, y, z) != Config.taintMaterial) {
               WorldTicker.addSwapper(world, x, y, z, world.getBlockId(x, y, z), world.getBlockMetadata(x, y, z), pb.itemID, pb.getItemDamage(), 3 + wand.getFocusPotency(itemstack), player, player.inventory.currentItem);
            }
         }
      }

      return itemstack;
   }
Вроде бы тут вообще нет фэйк-плеера. У таума он всего 1, для големов.

И вот эта штука вроде как забирает у игрока предметы:
Код:
   public boolean onEntitySwing(EntityLivingBase player, ItemStack stack) {
      if(!player.worldObj.isRemote && player instanceof EntityPlayer) {
         ItemStack pb = this.getPickedBlock(stack);
         MovingObjectPosition mop = this.getMovingObjectPositionFromPlayer(player.worldObj, (EntityPlayer)player, true);
         if(mop != null && mop.typeOfHit == EnumMovingObjectType.TILE) {
            int x = mop.blockX;
            int y = mop.blockY;
            int z = mop.blockZ;
            if(pb != null && player.worldObj.getBlockTileEntity(x, y, z) == null && player.worldObj.getBlockMaterial(x, y, z) != Config.taintMaterial) {
               WorldTicker.addSwapper(player.worldObj, x, y, z, player.worldObj.getBlockId(x, y, z), player.worldObj.getBlockMetadata(x, y, z), pb.itemID, pb.getItemDamage(), 0, (EntityPlayer)player, ((EntityPlayer)player).inventory.currentItem);
            }
         }
      }

      return super.onEntitySwing(player, stack);
   }


Ещё идеи? :)
 
675
2
swapper приводит к такому методу:
Код:
   public static void addSwapper(World world, int x, int y, int z, int bs, int ms, int bt, int mt, int life, EntityPlayer player, int wand) {
      int dim = world.provider.dimensionId;
      if(Block.blocksList[bs] != null && Block.blocksList[bs].getBlockHardness(world, x, y, z) >= 0.0F && (bs != bt || ms != mt)) {
         LinkedBlockingQueue queue = (LinkedBlockingQueue)swapList.get(Integer.valueOf(dim));
         if(queue == null) {
            swapList.put(Integer.valueOf(dim), new LinkedBlockingQueue());
            queue = (LinkedBlockingQueue)swapList.get(Integer.valueOf(dim));
         }

         queue.offer(new WorldTicker.VirtualSwapper(x, y, z, bs, ms, bt, mt, life, player, wand));
         world.playSoundAtEntity(player, "thaumcraft:wand", 0.25F, 1.0F);
         swapList.put(Integer.valueOf(dim), queue);
      }
   }
Т.е. он вставляет в некую очередь данные о блоке, посохе, игроке... а позже и о измерении.
Значит, после следующего update что-то выполнит действие на основе этих данных?
Вот только что сделает это? Пойду копать дальше
[merge_posts_bbcode]Добавлено: 28.03.2014 19:25:57[/merge_posts_bbcode]

Ага, нарыл.
Код:
   private void swapTicks(WorldServer world) {
      int dim = world.provider.dimensionId;
      LinkedBlockingQueue queue = (LinkedBlockingQueue)swapList.get(Integer.valueOf(dim));
      if(queue != null) {
         boolean didSomething = false;

         while(!didSomething) {
            WorldTicker.VirtualSwapper vs = (WorldTicker.VirtualSwapper)queue.poll();
            if(vs != null) {
               int bi = world.getBlockId(vs.x, vs.y, vs.z);
               int md = world.getBlockMetadata(vs.x, vs.y, vs.z);
               ItemWandCasting wand = null;
               IWandFocus focus = null;
               if(vs.player.inventory.getStackInSlot(vs.wand) != null && vs.player.inventory.getStackInSlot(vs.wand).getItem() instanceof ItemWandCasting) {
                  wand = (ItemWandCasting)vs.player.inventory.getStackInSlot(vs.wand).getItem();
                  focus = wand.getFocus(vs.player.inventory.getStackInSlot(vs.wand));
               }

               if((bi != vs.bTarget || md != vs.mTarget) && wand != null && focus != null && wand.consumeAllVis(vs.player.inventory.getStackInSlot(vs.wand), vs.player, focus.getVisCost(), false)) {
                  int slot = InventoryHelper.isPlayerCarrying(vs.player, new ItemStack(vs.bTarget, 1, vs.mTarget));
                  if(vs.bSource == bi && vs.mSource == md && slot >= 0) {
                     didSomething = true;
                     int fortune = wand.getFocusTreasure(vs.player.inventory.getStackInSlot(vs.wand));
                     vs.player.inventory.decrStackSize(slot, 1);
                     ArrayList ret = Block.blocksList[bi].getBlockDropped(world, vs.x, vs.y, vs.z, md, fortune);
                     if(ret.size() > 0) {
                        Iterator xx = ret.iterator();

                        while(xx.hasNext()) {
                           ItemStack yy = (ItemStack)xx.next();
                           if(!vs.player.inventory.addItemStackToInventory(yy)) {
                              world.spawnEntityInWorld(new EntityItem(world, (double)vs.x + 0.5D, (double)vs.y + 0.5D, (double)vs.z + 0.5D, yy));
                           }
                        }
                     }

                     wand.consumeAllVis(vs.player.inventory.getStackInSlot(vs.wand), vs.player, focus.getVisCost(), true);
                     world.setBlock(vs.x, vs.y, vs.z, vs.bTarget, vs.mTarget, 3);
                     Block.blocksList[vs.bTarget].onBlockPlacedBy(world, vs.x, vs.y, vs.z, vs.player, new ItemStack(vs.bTarget, 1, vs.mTarget));
                     PacketHandler.sendBlockSparkleFXPacket(vs.x, vs.y, vs.z, (byte)3, vs.player);
                     world.playAuxSFX(2001, vs.x, vs.y, vs.z, vs.bSource + (vs.mSource << 12));
                     if(vs.lifespan > 0) {
                        for(int var16 = -1; var16 <= 1; ++var16) {
                           for(int var17 = -1; var17 <= 1; ++var17) {
                              for(int zz = -1; zz <= 1; ++zz) {
                                 if((var16 != 0 || var17 != 0 || zz != 0) && world.getBlockId(vs.x + var16, vs.y + var17, vs.z + zz) == vs.bSource && world.getBlockMetadata(vs.x + var16, vs.y + var17, vs.z + zz) == vs.mSource && Utils.isBlockExposed(world, vs.x + var16, vs.y + var17, vs.z + zz)) {
                                    queue.offer(new WorldTicker.VirtualSwapper(vs.x + var16, vs.y + var17, vs.z + zz, vs.bSource, vs.mSource, vs.bTarget, vs.mTarget, vs.lifespan - 1, vs.player, vs.wand));
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            } else {
               didSomething = true;
            }
         }

         swapList.put(Integer.valueOf(dim), queue);
      }

   }

И то что мне нужно, судя по всему тут:
Код:
world.setBlock(vs.x, vs.y, vs.z, vs.bTarget, vs.mTarget, 3);

Но это ведь что-то вроде серверной команды. Как её отловить и отменить?
 
675
2
Evgeniy написал(а):
Ребята, LokiBlocker для кого написан был ?)
Читай всю тему. Я не хочу полностью запрещать предмет, я хочу заблочить его работу в зоне спавна.
Там есть такая опция, но лично у меня она не работала, поэтому я и решил написать свой фикс, теперь это дело принципа :)
Частью этого принципа является избавится от плагина LokiBlocker.
 
905
5
Лал. Иди Самому жалуйся, хупочему он использует внутренние функции и даже не стреляет своим/ванильным эвентом.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Вот кто это придумал, а?
Код:
 if (event.isCancelable()) {

Зачеееем?
Что, так чтоли не видно, есть там аннотация @Cancelable ? А метод сей проверяет именно на её наличие, и если её не будет, то и отменить нельзя будет полюбому, так что смысла в этой проверке нет, ибо динамически появляться и исчезать она не может.
[merge_posts_bbcode]Добавлено: 28.03.2014 15:33:12[/merge_posts_bbcode]

Ибо нету евента на setBlock, кстати, мне насколько его не хватало в своё время, что неплохо бы предложить Форджу его добавить.
 
675
2
anti344 написал(а):
Вот кто это придумал, а?
Код:
 if (event.isCancelable()) {

Зачеееем?
Что, так чтоли не видно, есть там аннотация @Cancelable ? А метод сей проверяет именно на её наличие, и если её не будет, то и отменить нельзя будет полюбому, так что смысла в этой проверке нет, ибо динамически появляться и исчезать она не может.
[merge_posts_bbcode]Добавлено: 28.03.2014 15:33:12[/merge_posts_bbcode]

Ибо нету евента на setBlock, кстати, мне насколько его не хватало в своё время, что неплохо бы предложить Форджу его добавить.
Не знаю, кто это придумал, но условие тут явно неспроста стоит.

Если и предложить, то я не думаю что выпустят ещё один билд под 1.6.4, а так да, можно. В любом случае пойду сегодня писать в гитхаб Азанору.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Условие там стоит именно спроста, от переизбытка идиотизма.Если событие можно отменить, значит можно, и для проверки этого не нужен метод. Если нельзя - то и нельзя, как я уже сказал, ну не могут они менять аннотации во время работы. То бишь вместо метода просто зайди и посмотри - если есть там @Cancelable, то отменяй спокойно, если нету - то нельзя отменить и отменять смысла нет.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху