[1.6.4] Физическая модель блока. Блок с нестандартным коллайдером

Статус
В этой теме нельзя размещать новые ответы.
771
5
Код:
<..............................................................>
TileEntity tile = (TileEntityMincer)world.getBlockTileEntity(x, y, z);
if(tile == null){
    return;
}
int metadata = tile.getBlockMetadata();
<..............................................................>
-_____-
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
addCollisionBoxesToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity, TileEntityMincer entityMincer)


Мне кажется, что метода с такими параметрами не существует.
И да, wrd.getBlockMetadata(x, y, z)
 
905
5
Конечно. Никто не будет давать с координатами и миром еще и ТЕ.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
С коордами и миром как раз таки дают, но вот TE там ни к селу ни к городу.
 
anti344 написал(а):
С коордами и миром как раз таки дают, но вот TE там ни к селу ни к городу.
Ну не знаю. У меня все спокойно пашет. Ведь в каждом классе свои методы, и их можно делать как угодно. Тем более, что ТЕ там только для int metadata = entityMincer;
 
1,990
18
105
Тебе уже раз 20 сказали, что это просто напросто нехорошо. Добавлять метод, который ты используешь только один раз для себя - бред. Особенно бред, когда ты всё нужное можешь получить сразу.
Это больше на быдлокодинг смахивает.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Да блин я имел ввиду, что я не вижу, где вызывается этот твой метод с TE - это раз, а два - доставать тайл, чтобы из него доставать мету - идиотизм. А если бы у тебя был блок без тайла?
 
Ой, да ну вас. На мой взгляд, главное, что робит, а каким раком программист замутил это - проблема программера. Разве нет?
 
При таком отношении твой код вскоре будет серьезно сказываться на производительности, да и вообще на работоспособности.
 
1,990
18
105
Есть определенная грань. Надо сохранять баланс. Если у тебя нет времени и у тебя большой, действительно большой проект, который, возможно ты делаешь не один - вот там можно экономить на коде, даже нужно. И архитектура там особую роль играть не будет в успехе продукта, помимо кода есть ещё тонна важных аспектов.
В данном же конкретном случае, большую часть успеха играет код, и задумка, конечно. А с таким отношением к программированию я могу только посочувствовать. Обычно делают не так, чтобы хоть как-то работало, ведь эстетическое удовольствие появляется именно тогда, когда ты доводишь свой код до совершенства (в твоем понимании) и он при этом не теряет работоспособности (что нередко бывает). Надо уметь находить баланс между этими двумя крайностями. Сейчас он склоняется в сторону кода.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Код:
package net.anti344.tm.client.render.connected

import net.anti344.tm.client.render.connected.texture.{RotatedIcon, ConnectedIcon}
import net.anti344.tm.util.mixin.block.ConnectedTextures
import net.anti344.tm.util.mixin.TessellationHelper
import net.anti344.tm.util.Position
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.common.util.ForgeDirection._
import net.minecraft.client.renderer.RenderBlocks
import net.minecraft.world.IBlockAccess
import net.minecraft.block.Block

object ConnectedBlockRender extends ISimpleBlockRenderingHandler with TessellationHelper{

  override def shouldRender3DInInventory(modelId: Int): Boolean = true

  override def getRenderId: Int = -1

  val xyzToForgeMap: Array[Int] = Array(5, 4, 1, 0, 3, 2)

  var x: Double = 0.0
  var y: Double = 0.0
  var z: Double = 0.0

  override def renderInventoryBlock(block: Block, meta: Int, modelId: Int, ctx: RenderBlocks) = {
    val item: RotatedIcon = block.asInstanceOf[ConnectedTextures].getConnectedIcon(meta).item
    tess.setBrightness(983055)
    tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
    x = -0.5
    y = -0.5
    z = -0.5
    withoutItemLighting(quad((0 until 6).foreach(drawQuad(_, item))))
  }

  val sides: Array[Array[ForgeDirection]] =
    Array(Array(UP, SOUTH, DOWN, NORTH),
          Array(NORTH, EAST, SOUTH, WEST),
          Array(UP, EAST, DOWN, WEST))

  override def renderWorldBlock(iba: IBlockAccess, x: Int, y: Int, z: Int, block: Block, modelId: Int, ctx: RenderBlocks): Boolean = {
    this.x = x
    this.y = y
    this.z = z
    if(ctx.hasOverrideBlockTexture){
      val face: RotatedIcon = new RotatedIcon(ctx.overrideBlockTexture)
      for(i <- 0 until 6)
        drawQuad(i, face)
    }else{
      val b: ConnectedTextures = block.asInstanceOf[ConnectedTextures]
      val pos: Position = new Position(x, y, z)
      val texture: ConnectedIcon = b.getConnectedIcon(iba, x, y, z)
      val corners: Boolean = !b.removeCorners
      tess.setBrightness(b.getMixedBrightnessForBlock(iba, x, y, z))
      tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
      for(i <- 0 until 6)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          drawQuad(i, texture.background)
      for(i <- 0 until 6) for(j <- 0 until 4)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))) && !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j))))
          drawQuad(i, texture.side.rotate(j))
      for(i <- 0 until 6) for(j <- 0 until 4){
        val next: Boolean = !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)))
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          if(!b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            if(next)
              drawQuad(i, texture.corner_in.rotate(j))
            else
              drawQuad(i, texture.corner_vert.rotate(j))
          else if(next)
            drawQuad(i, texture.corner_hor.rotate(j))
          else if(corners || !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)).shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            drawQuad(i, texture.corner_out.rotate(j))
      }
    }
    true
  }

  private val quads: Array[((Int, Int, Int), (Int, Int, Int), (Int, Int, Int), (Int, Int, Int), RotatedIcon => RotatedIcon)] =
    Array(((1, 0, 1), (1, 0, 0), (1, 1, 0), (1, 1, 1), i => i),
      ((0, 0, 1), (0, 1, 1), (0, 1, 0), (0, 0, 0), i => i.invert().rotate(3)),
      ((0, 1, 1), (1, 1, 1), (1, 1, 0), (0, 1, 0), i => i.invert()),
      ((1, 0, 1), (0, 0, 1), (0, 0, 0), (1, 0, 0), i => i),
      ((1, 0, 1), (1, 1, 1), (0, 1, 1), (0, 0, 1), i => i.invert().rotate(3)),
      ((1, 0, 0), (0, 0, 0), (0, 1, 0), (1, 1, 0), i => i))

  def drawQuad(side: Int, icon: RotatedIcon) = {
    val quad = quads(side)
    val _icon: RotatedIcon = quad._5(icon)
    vertexUV(x + quad._1._1, y + quad._1._2, z + quad._1._3, _icon.getUV_1.getU, _icon.getUV_1.getV)
    vertexUV(x + quad._2._1, y + quad._2._2, z + quad._2._3, _icon.getUV_2.getU, _icon.getUV_2.getV)
    vertexUV(x + quad._3._1, y + quad._3._2, z + quad._3._3, _icon.getUV_3.getU, _icon.getUV_3.getV)
    vertexUV(x + quad._4._1, y + quad._4._2, z + quad._4._3, _icon.getUV_4.getU, _icon.getUV_4.getV)
  }
}
 
anti344 написал(а):
Код:
package net.anti344.tm.client.render.connected

import net.anti344.tm.client.render.connected.texture.{RotatedIcon, ConnectedIcon}
import net.anti344.tm.util.mixin.block.ConnectedTextures
import net.anti344.tm.util.mixin.TessellationHelper
import net.anti344.tm.util.Position
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.common.util.ForgeDirection._
import net.minecraft.client.renderer.RenderBlocks
import net.minecraft.world.IBlockAccess
import net.minecraft.block.Block

object ConnectedBlockRender extends ISimpleBlockRenderingHandler with TessellationHelper{

  override def shouldRender3DInInventory(modelId: Int): Boolean = true

  override def getRenderId: Int = -1

  val xyzToForgeMap: Array[Int] = Array(5, 4, 1, 0, 3, 2)

  var x: Double = 0.0
  var y: Double = 0.0
  var z: Double = 0.0

  override def renderInventoryBlock(block: Block, meta: Int, modelId: Int, ctx: RenderBlocks) = {
    val item: RotatedIcon = block.asInstanceOf[ConnectedTextures].getConnectedIcon(meta).item
    tess.setBrightness(983055)
    tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
    x = -0.5
    y = -0.5
    z = -0.5
    withoutItemLighting(quad((0 until 6).foreach(drawQuad(_, item))))
  }

  val sides: Array[Array[ForgeDirection]] =
    Array(Array(UP, SOUTH, DOWN, NORTH),
          Array(NORTH, EAST, SOUTH, WEST),
          Array(UP, EAST, DOWN, WEST))

  override def renderWorldBlock(iba: IBlockAccess, x: Int, y: Int, z: Int, block: Block, modelId: Int, ctx: RenderBlocks): Boolean = {
    this.x = x
    this.y = y
    this.z = z
    if(ctx.hasOverrideBlockTexture){
      val face: RotatedIcon = new RotatedIcon(ctx.overrideBlockTexture)
      for(i <- 0 until 6)
        drawQuad(i, face)
    }else{
      val b: ConnectedTextures = block.asInstanceOf[ConnectedTextures]
      val pos: Position = new Position(x, y, z)
      val texture: ConnectedIcon = b.getConnectedIcon(iba, x, y, z)
      val corners: Boolean = !b.removeCorners
      tess.setBrightness(b.getMixedBrightnessForBlock(iba, x, y, z))
      tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
      for(i <- 0 until 6)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          drawQuad(i, texture.background)
      for(i <- 0 until 6) for(j <- 0 until 4)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))) && !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j))))
          drawQuad(i, texture.side.rotate(j))
      for(i <- 0 until 6) for(j <- 0 until 4){
        val next: Boolean = !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)))
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          if(!b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            if(next)
              drawQuad(i, texture.corner_in.rotate(j))
            else
              drawQuad(i, texture.corner_vert.rotate(j))
          else if(next)
            drawQuad(i, texture.corner_hor.rotate(j))
          else if(corners || !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)).shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            drawQuad(i, texture.corner_out.rotate(j))
      }
    }
    true
  }

  private val quads: Array[((Int, Int, Int), (Int, Int, Int), (Int, Int, Int), (Int, Int, Int), RotatedIcon => RotatedIcon)] =
    Array(((1, 0, 1), (1, 0, 0), (1, 1, 0), (1, 1, 1), i => i),
      ((0, 0, 1), (0, 1, 1), (0, 1, 0), (0, 0, 0), i => i.invert().rotate(3)),
      ((0, 1, 1), (1, 1, 1), (1, 1, 0), (0, 1, 0), i => i.invert()),
      ((1, 0, 1), (0, 0, 1), (0, 0, 0), (1, 0, 0), i => i),
      ((1, 0, 1), (1, 1, 1), (0, 1, 1), (0, 0, 1), i => i.invert().rotate(3)),
      ((1, 0, 0), (0, 0, 0), (0, 1, 0), (1, 1, 0), i => i))

  def drawQuad(side: Int, icon: RotatedIcon) = {
    val quad = quads(side)
    val _icon: RotatedIcon = quad._5(icon)
    vertexUV(x + quad._1._1, y + quad._1._2, z + quad._1._3, _icon.getUV_1.getU, _icon.getUV_1.getV)
    vertexUV(x + quad._2._1, y + quad._2._2, z + quad._2._3, _icon.getUV_2.getU, _icon.getUV_2.getV)
    vertexUV(x + quad._3._1, y + quad._3._2, z + quad._3._3, _icon.getUV_3.getU, _icon.getUV_3.getV)
    vertexUV(x + quad._4._1, y + quad._4._2, z + quad._4._3, _icon.getUV_4.getU, _icon.getUV_4.getV)
  }
}
 Ужас. Это 1.7? Или что? Я даже 50% конструктора не понял, хотя понимаю, что вижу рендер забора... А насчет совершенства - у каждого свой вкус. Может, так лучше, не спорю, но все же я имею право делать так, как мне на данный момент понятней. Может, когда снова войду в атмосферу работы(а то ща опять лень, да и сайт стоит) тогда сделаю как вы хотите. Может быть так лучше, но я о таком способе даже не слышал, и сделал как я знал.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Где ты там увидел конструктор, мне вот что интересно. А прикол в том, что просто так такое не напишешь(ну если ты не супермозг). Сначала я сделал первый вариант(ровно в 12 раз больше этого), потом сократил его в очень короткое черти-что, зато работающее черти-что.
 
Вот. Видишь? Черте-что. У меня та же ситуация. Да и, доводить... до "совершенства" я буду когда буду заканчивать мод. А сейчас тут только этот недоблок. На котор гуи не пашет...
 
905
5
Я переведу это на Джаву за 7 дней
А я вообще пытаюсь оптимизировать, пока пишу. Вредная привычка, надо избавляться.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху