Всегда фронтальная сторона

Версия Minecraft
1.7.10
Как реализовать фичу, где поставленный блок (в моём случае модель) смотрит фронтальной стороной к игроку, т.е. разворачивать блок в зависимости от того, в какую сторону смотрит игрок, когда ставит блок.

И ещё вопрос: как сделать иконку блока?
 
Решение
Если у тебя 1.7.10 просто добавь эти методы, должно работать
Код:
 @SideOnly(Side.CLIENT)
 public IIcon getIcon(int side, int meta)
 {
  ForgeDirection dir = ForgeDirection.getOrientation(side);
       ForgeDirection block_dir;
       if (meta != 0)
           block_dir = ForgeDirection.getOrientation(meta);
       else
           block_dir = ForgeDirection.SOUTH;
       if (block_dir == dir) return iconFront;

 return side == 1 ? this.iconTop : (side == 0 ? this.iconDown : (side != meta ? this.blockIcon : this.iconFront));
 }
 public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase eLB, ItemStack itemStack)
 {
int l = MathHelper.floor_double((double)(eLB.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3...
DaemonDes написал(а):
Как реализовать фичу, где поставленный блок (в моём случае модель) смотрит фронтальной стороной к игроку, т.е. разворачивать блок в зависимости от того, в какую сторону смотрит игрок, когда ставит блок.

И ещё вопрос: как сделать иконку блока?

в печке посмотри как сделано
 
216
6
19
Код:
// Значения 0-3 (включительно) для каждой стороны света
int heading = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
// записывай его в TileEntity в NBT при установке и считывай для отображения


Еще можно узнать название для стороны света
Код:
String name = Direction.directions[heading];
 
Onneros написал(а):
Код:
// Значения 0-3 (включительно) для каждой стороны света
int heading = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
// записывай его в TileEntity в NBT при установке и считывай для отображения


Еще можно узнать название для стороны света
Код:
String name = Direction.directions[heading];



Что-то не понял...
 
216
6
19
В минисруфте есть 4 стороны света (и как на нашей с вами Земле):
SOUTH (0),
WEST (1),
NORTH (2),
EAST (3),

Они обозначаются цифрами и вычисляется это дело через формулу:
Код:
// entity.rotationYaw - вместо entity нужно написать того, кто блок установил
int heading = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
При установке блока ты должен в TileEntity занести значение этой формулы (в NBT в TileEntity, чтобы значение не терялось после перезахода в мир/игру) и потом, исходя из этого значения, каждый раз восстанавливать необходимый поворот блока.
 
5,022
47
784
Если у тебя 1.7.10 просто добавь эти методы, должно работать
Код:
 @SideOnly(Side.CLIENT)
 public IIcon getIcon(int side, int meta)
 {
  ForgeDirection dir = ForgeDirection.getOrientation(side);
       ForgeDirection block_dir;
       if (meta != 0)
           block_dir = ForgeDirection.getOrientation(meta);
       else
           block_dir = ForgeDirection.SOUTH;
       if (block_dir == dir) return iconFront;

 return side == 1 ? this.iconTop : (side == 0 ? this.iconDown : (side != meta ? this.blockIcon : this.iconFront));
 }
 public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase eLB, ItemStack itemStack)
 {
int l = MathHelper.floor_double((double)(eLB.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

if (l == 0)
{
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}

if (l == 1)
{
world.setBlockMetadataWithNotify(x, y, z, 5, 2);
}

if (l == 2)
{
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}

if (l == 3)
{
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}

if (itemStack.hasDisplayName())
{
((BlockDryerTileEntity)world.getTileEntity(x, y, z)).func_145951_a(itemStack.getDisplayName());
}
}
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Onneros написал(а):
В минисруфте есть 4 стороны света (и как на нашей с вами Земле):
SOUTH (0),
WEST (1),
NORTH (2),
EAST (3),

Они обозначаются цифрами и вычисляется это дело через формулу:
Код:
// entity.rotationYaw - вместо entity нужно написать того, кто блок установил
int heading = MathHelper.floor_double(entity.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
При установке блока ты должен в TileEntity занести значение этой формулы  (в NBT в TileEntity, чтобы значение не терялось после перезахода в мир/игру) и потом, исходя из этого значения, каждый раз восстанавливать необходимый поворот блока.

Та зачем лишний раз дергать нбт. Можно в метадату засандалить поворот, если ты конечно ее не используешь для другого чего-то.
 
3,005
192
592
Onneros написал(а):
В минисруфте есть 4 стороны света (и как на нашей с вами Земле)

Извините, я не с Вами.
 
Честно говоря, я практически не имею представления о NBT, MetaData и пр. Кто может расписать?


Maxik001 написал(а):
Если у тебя 1.7.10 просто добавь эти методы, должно работать
Код:
 @SideOnly(Side.CLIENT)
 public IIcon getIcon(int side, int meta)
 {
  ForgeDirection dir = ForgeDirection.getOrientation(side);
       ForgeDirection block_dir;
       if (meta != 0)
           block_dir = ForgeDirection.getOrientation(meta);
       else
           block_dir = ForgeDirection.SOUTH;
       if (block_dir == dir) return iconFront;

 return side == 1 ? this.iconTop : (side == 0 ? this.iconDown : (side != meta ? this.blockIcon : this.iconFront));
 }
 public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase eLB, ItemStack itemStack)
 {
int l = MathHelper.floor_double((double)(eLB.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

if (l == 0)
{
world.setBlockMetadataWithNotify(x, y, z, 2, 2);
}

if (l == 1)
{
world.setBlockMetadataWithNotify(x, y, z, 5, 2);
}

if (l == 2)
{
world.setBlockMetadataWithNotify(x, y, z, 3, 2);
}

if (l == 3)
{
world.setBlockMetadataWithNotify(x, y, z, 4, 2);
}

if (itemStack.hasDisplayName())
{
((BlockDryerTileEntity)world.getTileEntity(x, y, z)).func_145951_a(itemStack.getDisplayName());
}
}

Выделяет ошибкой iconFront, iconTop и пр. направления
 
5,022
47
784
Так ты их создай наверно -_-
private final Random field_149933_a = new Random();

private static boolean field_149934_M;


private boolean isActive;
private IIcon iconFront;
private IIcon iconTop;
private IIcon iconDown;

Это текстуры, которые накладываются на разные стороны блока в зависимости от поворота. Я понял, как то так работает
 
1,417
44
594
Maxik001 написал(а):
Так ты их создай наверно -_-
private final Random field_149933_a = new Random();

private static boolean field_149934_M;


private boolean isActive;
private IIcon iconFront;
private IIcon iconTop;
private IIcon iconDown;

Это текстуры, которые накладываются на разные стороны блока в зависимости от поворота. Я понял, как то так работает

У меня что-то ошибка "BlockDryerTileEntity cannot be resolved to a type"
Я так понимаю это тип блока его не устраивает, а что использовать для обычного блока? Например дерево или т.п. Ибо в сорцах майна не могу найти сам поворот к фейсу
 
Сверху