Неломаемые блоки

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

Нужно в определенной территории поменять прочность всех блоков на бедроковую. Это возможно? Если да, то какой класс смотреть? И прожует ли этой кубач, если территория состоит из 100 000 блоков?
 
905
5
...зато можно отменять BlockBreak event.
 
675
2
laz2727 написал(а):
...зато можно отменять BlockBreak event.
На сколько мне известно, это бакит-эвент.
Да и не все моды его используют.(Мне нужно защитить статичную территорию от разрушения)
 
675
2
Majestic написал(а):
В фордже тоже есть.
Действительно, нашел.

Но проблемы это не решило, ибо тот же лазер игнорирует всякие события.

Задам вопрос иначе:
Как можно защитить определенную территорию, например, от карьера? При том не лазя в моды.
 
675
2
Dragon2488 написал(а):
Вообще Есть определенные события, тот же LaserEvent в IC2
Далеко не во всех модах.
Мне нужно нечто универсальное. Т.е. ПКМ в определенной территории я запретил давно. Осталось разобратся с разрушением блоков(включая механизмы из модов) и можно избавлятся от WorldGuard.
Мб всунуть куда-нибудь в главный класс(Block, например): if(координаты) { неломабельный }? Но т.к. блок не может забрать свои координаты...
Через событие вроде бы работает. Нормальный способ?
Код:
    public void cathBlock(BlockEvent event) {
        if(координаты) {
            event.block.setBlockUnbreakable();
        }
    }
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А можно делать как Thaumcraft
 
2,955
12
Я лично знаю как он это делает. Он заменяет блок на свой, которому присвает текстуру предыдущего блока .
 
675
2
В тауме как-то так:
Код:
   public ItemStack onFocusRightClick(ItemStack itemstack, World world, EntityPlayer player, MovingObjectPosition mop) {
      ItemWandCasting wand = (ItemWandCasting)itemstack.getItem();
      player.swingItem();
      if(!world.isRemote && mop != null && mop.typeOfHit == EnumMovingObjectType.TILE) {
         String key = mop.blockX + ":" + mop.blockY + ":" + mop.blockZ + ":" + world.provider.dimensionId;
         if(delay.containsKey(key) && ((Long)delay.get(key)).longValue() > System.currentTimeMillis()) {
            return itemstack;
         }

         delay.put(key, Long.valueOf(System.currentTimeMillis() + 500L));
         TileEntity tt = world.getBlockTileEntity(mop.blockX, mop.blockY, mop.blockZ);
         if(tt == null && wand.consumeAllVis(itemstack, player, this.getVisCost(), true)) {
            int tw2 = world.getBlockId(mop.blockX, mop.blockY, mop.blockZ);
            int md = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ);
            int ll = Block.blocksList[tw2].getLightValue(world, mop.blockX, mop.blockY, mop.blockZ);
            world.setBlock(mop.blockX, mop.blockY, mop.blockZ, ConfigBlocks.blockWarded.blockID, md, 3);
            TileEntity tile = world.getBlockTileEntity(mop.blockX, mop.blockY, mop.blockZ);
            if(tile != null && tile instanceof TileWarded) {
               TileWarded tw1 = (TileWarded)tile;
               tw1.blockId = tw2;
               tw1.blockMd = md;
               tw1.light = ll;
               tw1.owner = player.username;
               world.markBlockForUpdate(mop.blockX, mop.blockY, mop.blockZ);
            }

            world.playSoundEffect((double)mop.blockX + 0.5D, (double)mop.blockY + 0.5D, (double)mop.blockZ + 0.5D, "thaumcraft:zap", 0.25F, 1.0F);
            PacketHandler.sendBlockSparkleFXPacket(mop.blockX, mop.blockY, mop.blockZ, (byte)1, player);
         } else if(tt != null && tt instanceof TileWarded) {
            TileWarded tw = (TileWarded)tt;
            if(tw.owner.equals(player.username)) {
               world.setBlock(mop.blockX, mop.blockY, mop.blockZ, tw.blockId, tw.blockMd, 3);
               world.markBlockForUpdate(mop.blockX, mop.blockY, mop.blockZ);
               world.playSoundEffect((double)mop.blockX + 0.5D, (double)mop.blockY + 0.5D, (double)mop.blockZ + 0.5D, "thaumcraft:zap", 0.25F, 1.0F);
               PacketHandler.sendBlockSparkleFXPacket(mop.blockX, mop.blockY, mop.blockZ, (byte)1, player);
            }
         }
      }

      return itemstack;
   }

Выходит, что:
Код:
    public void cathBlock(BlockEvent event) {
        if(координаты) {
            event.block.setBlockUnbreakable();
        }
    }

Плохая идея?
 
1,990
18
105
Ты по всему миру сделаешь блоки неломаемыми. НУ БЛИН.
В сетке мира хранятся не объекты класса Block, там только ID + Metadata.
Как вы не запомните.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
И даже в том куске кода видно, что он ставит свой блок с тайлом(как раз таки объекты которого есть в сетке мира), хранящим id, мету и рендерящим его.
 
675
2
Oldestkon написал(а):
Ты по всему миру сделаешь блоки неломаемыми. НУ БЛИН.
В сетке мира хранятся не объекты класса Block, там только ID + Metadata.
Как вы не запомните.
Теперь запомню. До сегодняшнего дня я вообще не знал, что есть блок в игре.

Мне кажется, что не очень практично будет, пилить 100 000 тайтл-интити? Про них я кстати тоже почти ничего не знаю, разве что обновляются чаще и на этом все :)
 
2,955
12
Делай свой блок, у него свой рендер, и заменяй предыдущие блоки им.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Как я собственно только-что упомянул. -.-
 
675
2
Предвкушаю свою попоболь и разочарование, ибо некоторые блоки рассчитаны на взаимодействие.
Сделаю иначе. Качну сырцы MCPC+ и впилю в методы setBlock/dropBlockAsItem свои проверки.

Можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху