[1.6.4] МетаДата блок

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

Есть блок портала с метадатой:
Код:
public class Portals extends MetaDataBlock {

    public Portals(int id, String unlocalizedName, String[] subNames, Material material, StepSound step, float hardness) {
        super(id, unlocalizedName, subNames, material, step, hardness);
        setHardness(-1.0F);
        setResistance(6000000.0F);
    }
    
    @Override
    public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) {
        float f = 0.0625F;
        this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F);
    }
    @Override
    public boolean isOpaqueCube() {
        return false;
    }
    
    @Override
    public boolean renderAsNormalBlock() {
        return false;
    }
    
    @Override
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
        if ((entity.ridingEntity == null) && (entity.riddenByEntity == null) && ((entity instanceof EntityPlayerMP))) {
            EntityPlayerMP player = (EntityPlayerMP)entity;
            switch(world.getBlockMetadata((int)player.posX, (int)player.posY, (int)player.posZ)) {
            case 0: if(world.provider.dimensionId != 0) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new CustomTeleporter(player.mcServer.worldServerForDimension(0))); } break;
            case 1: if(world.provider.dimensionId != DimsList.MineDimID) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, DimsList.MineDimID, new CustomTeleporter(player.mcServer.worldServerForDimension(DimsList.MineDimID))); } break;
            case 2: if(world.provider.dimensionId != DimsList.DungeonDimID) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, DimsList.DungeonDimID, new CustomTeleporter(player.mcServer.worldServerForDimension(DimsList.DungeonDimID))); } break;
            }
        }
    }
    
}

Код:
public class MetaDataBlock extends MainBlock {
    
    private Icon[] icons;
    
    private String[] subNames;

    public MetaDataBlock(int id, String unlocalizedName, String[] subNames, Material material, StepSound step, float hardness) {
        super(id, unlocalizedName, MetaDataPortalsBlock.class, material, step, hardness);
        icons = new Icon[subNames.length];
        this.subNames = subNames;
    }
    
    @Override
    public int damageDropped(int par1) {
            return par1;
    }
    
    @SideOnly(Side.CLIENT)
    public void registerIcons(IconRegister reg) {
            for(int i = 0; i < subNames.length; i++) {
                icons[i] = reg.registerIcon(ModInfo.MOD_ID + ":" + getUnlocalizedName().substring(13) + "_" + subNames[i]);
            }
    }
    
    @SideOnly(Side.CLIENT)
    public Icon getIcon(int id, int meta) {
           return icons[meta];
    }
    
    @SideOnly(Side.CLIENT)
    public void getSubBlocks(int id, CreativeTabs par2CreativeTabs, List par3List) {
        for (int i = 0; i < subNames.length; i++) {
            par3List.add(new ItemStack(id, 1, i));
        }
    }
    
    public String[] getSubNames() {
        return subNames;
    }

}
 
675
2
Меня не устраивает, что для кажого мета-блока нужно создавать свой MetaItemBlock. Мб есть возможность получать блок, который вызывает ItemBlock и брать необходимую инфу оттуда?

Сейчас оно выглядит так:
Код:
public class MetaDataPortalsBlock extends ItemBlock {
    
    String[] subNames = {"toMain", "toMineDim", "toDungeonDim"};
    
    public MetaDataPortalsBlock(int id) {
          super(id);
          setHasSubtypes(true);
          
    }
   
    @Override
    public String getUnlocalizedName(ItemStack itemstack) {
          return getUnlocalizedName() + "." + subNames[itemstack.getItemDamage()].toLowerCase();
    }
   
    @Override
    public int getMetadata(int par1) {
          return par1;
    }
    
}


Дальше... Плохо работает способ получения мета-даты и последующая отправка игрока в нужное измерение:
Код:
    @Override
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) {
        if ((entity.ridingEntity == null) && (entity.riddenByEntity == null) && ((entity instanceof EntityPlayerMP))) {
            EntityPlayerMP player = (EntityPlayerMP)entity;
            switch(world.getBlockMetadata((int)player.posX, (int)player.posY, (int)player.posZ)) {
            case 0: if(world.provider.dimensionId != 0) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new CustomTeleporter(player.mcServer.worldServerForDimension(0))); } break;
            case 1: if(world.provider.dimensionId != DimsList.MineDimID) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, DimsList.MineDimID, new CustomTeleporter(player.mcServer.worldServerForDimension(DimsList.MineDimID))); } break;
            case 2: if(world.provider.dimensionId != DimsList.DungeonDimID) { player.mcServer.getConfigurationManager().transferPlayerToDimension(player, DimsList.DungeonDimID, new CustomTeleporter(player.mcServer.worldServerForDimension(DimsList.DungeonDimID))); } break;
            }
        }
    }

Игрока выпихивает из блока, и телепортирует лишь через раз. Где я ошибся?
[merge_posts_bbcode]Добавлено: 01.06.2014 15:48:22[/merge_posts_bbcode]

Ограничение по символам никак не фиксируется форумом и "лишняя" часть попросту обрезается, не весело это.
 
905
5
Конечно можно. Через массивы. Создавай двумерные массивы, в x - мета, в y - слот инфы.
Ну, у тебя блок твердый, что ты хотел.
 
675
2
laz2727 написал(а):
Конечно можно. Через массивы. Создавай двумерные массивы, в x - мета, в y - слот инфы.
Я не правильно выразился. Я не хочу создавать под каждый мета-блок свой ItemBlock, сведя все к одном файлу. Т.е. куча Meta-блоков - 1 ItemMetaBlock.

Сейчас проблема в том, что я вынужден для каждого мета-блока создавать отдельный ItemMeta и писать в него массив доп. названий:
Код:
String[] subNames = {"123", "321", "231"};
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Можешь в блоке писать массив названий, а потом в ItemBlock-е у тебя есть блок, ты его просто кастишь к своему общему типу(BlockWithMeta) от которого наследуешь все блоки с метод и переписываешь(или если знаешь, что такое abstract) методы, возвращающие массив строк, а в ItemBlock-е достаешь этим меодом строки.
Проверено, давным-давно правда, но проверено.
 
675
2
anti344 написал(а):
Можешь в блоке писать массив названий, а потом в ItemBlock-е у тебя есть блок, ты его просто кастишь к своему общему типу(BlockWithMeta) от которого наследуешь все блоки с метод и переписываешь(или если знаешь, что такое abstract) методы, возвращающие массив строк, а в ItemBlock-е достаешь этим меодом строки.
Проверено, давным-давно правда, но проверено.
Пытался сделать так, но проблема в том, что я не смог найти способ, как бы получить в ItemBlock'е блок, единственное, что нашел - геттер id'шника. Думал, через BlockList достать блок, но потом пришло понимание, что когда ItemBlock вызывается, блок ещё не зарегистрирован.
 
905
5
Странно у тебя вызывается. В GameRegistry так и написно же -
// block registration has to happen first
 
675
2
laz2727 написал(а):
Странно у тебя вызывается. В GameRegistry так и написно же -
// block registration has to happen first
Что вызывается?
Ну дык ItemBlock передает для регистрации.
MainBlock:
Код:
public MainBlock(...Class<? extends ItemBlock> itemClass...) {
...
GameRegistry.registerBlock(this, itemClass, unlocalizedName);
...
 
905
5
Ну, у меня регистрация в одну большую кучу скидана.
Я про то, что в BlockList обязательно должен быть блок уже.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Эмм.. У тебя в ItemBlock-е есть поле Block, называется помоему чёрти-как(не переведено), его кастишь к своему блоку и вуаля.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ага, 1.6.4.
А как-же Block.blockList[blockID]?
Тебе же дают blockID, чувааак.
 
675
2
anti344 написал(а):
Ага, 1.6.4.
А как-же Block.blockList[blockID]?
Тебе же дают blockID, чувааак.
Ну я же писал выше:
Try4W написал(а):
единственное, что нашел - геттер id'шника. Думал, через BlockList достать блок, но потом пришло понимание, что когда ItemBlock вызывается, блок ещё не зарегистрирован.
[merge_posts_bbcode]Добавлено: 02.06.2014 19:30:49[/merge_posts_bbcode]

Ага, я вызывал геттер во время регистрации блока, прям в конструкторе MetaDataItemBlock'а.
Теперь как-то так:
Код:
public class MetaDataItemBlock extends ItemBlock {
    
    public MetaDataItemBlock(int id) {
          super(id);
          setHasSubtypes(true);
    }
   
    @Override
    public String getUnlocalizedName(ItemStack itemstack) {
         MetaDataBlock mDb = (MetaDataBlock) Block.blocksList[getBlockID()];
          return getUnlocalizedName() + "." + mDb.getSubNames()[itemstack.getItemDamage()].toLowerCase();
    }
   
    @Override
    public int getMetadata(int meta) {
          return meta;
    }
    
}

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