Проложить луч ко всем блокам одного типа

svk

1,185
2
Dragon2488 написал(а):
Какой? Я тоже могу поставить свой скин на аватарку, тогда я перестану быть адекватным кодером?
Связи не улавливаю, вообще никакой.
Не знаю, я ещё ни 1 адекватного человека с аватаркой на тему майна не встречал (Скин, человечек, морда, крипер и т.п.)
 
164
1
4
Ещё вопрос: мне нужно моим предметом соединить два тайла (проложить луч от начальной позиции до конечной, нажал на таилА, нажал на таилБ, в итоге проводиться луч от тайлаА до тайлаБ). Пробовал так:
Код:
    @Override
    public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
    {
          TileEntity tile = world.getTileEntity(x, y, z);
        if (tile instanceof TileEntityNode)
        {
                     int targetX = x;
                    int targetY = y;
                    int targetZ = z;
                    if (!(targetX == x && targetY == y && targetZ == z))
                    {
                        EntityBeamFX beam = new EntityBeamFX(world, x + 0.5, y + 0.5, z + 0.5, targetX + 0.5, targetY + 0.5, targetZ + 0.5, 1.0F, 1.0F, 1.0F, 8);
                        Minecraft.getMinecraft().effectRenderer.addEffect(beam);
                    }
                }
        }
Но партикл не спавнится :C
 
1,990
18
105
Сорян, не вижу логики в твоём коде никакой, абсолютно
kiss_2kb.1446024394.png

Сам понимаешь, как часто у тебя сработает условие? Никогда.
Где ты проводишь в коде границу между первым и вторым блоком?
Мой вариант:
Добавляешь предмету NBT (самый лёгкий вариант добавить в итемстак свои свойства), в него записываешь данные о первом и последнем блоке. Спавнишь нужные частицы при изменении состояния (т.е. в onItemUse проверяешь NBT, если первый блок уже есть - заполняешь второй и спавнишь частицу, всё. Изи вин).
Рендерить луч тебе придётся в любом случае каждый тик (RenderWorldLastEvent, как-то так), а не как ты это делаешь в коде логики (что воооооооооообще неприемлимо, нарушает всю структуру и должно не работать).
Если не надо сохранять в мир, можешь не реализовывать соотв.методы.
Ещё сложнее, если ты захочешь, чтобы другие игроки так же видели луч.
ЗЫ. Можно ещё всё попробовать сделать через тайл, это В РАЗЫ оптимальнее и легче, имхо. И передача данных на другие клиенты там решается реализацией двух методов синхронизации.
[merge_posts_bbcode]Добавлено: 28.10.2015 13:34:20[/merge_posts_bbcode]

Ой, про рендер я наврал. У тебя же просто частицы спавнятся. Мой косяк. Не спал всю ночь, голова плохо варит.
Вроде подправил, задача у тебя на самом деле легко решается.
 
164
1
4
Вроде бы добавил предмету NBT через ItemStack и записал туда координаты:
Код:
    public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
    {
        TileEntity tile = world.getTileEntity(x, y, z);
        if (tile instanceof TileEntityNode)
        {
            stack.stackTagCompound = new NBTTagCompound();
            stack.stackTagCompound.setInteger("startX", x);
            stack.stackTagCompound.setInteger("startY", y);
            stack.stackTagCompound.setInteger("startZ", z);
        }
    }
Правильно?
 
1,990
18
105
Норм.
Теперь проверяй наличие тегов startX/Y/Z, если их нет - задаёшь их, как у тебя в коде, иначе задаёшь конечные координаты, достаёшь начальные и строишь луч.
 
164
1
4
Так?
Код:
                    stack.stackTagCompound = new NBTTagCompound();
                    if (stack.stackTagCompound.getTag("startX") == null && stack.stackTagCompound.getTag("startY") == null && stack.stackTagCompound.getTag("startZ") == null)
                    {
                        stack.stackTagCompound.setInteger("startX", x);
                        stack.stackTagCompound.setInteger("startY", y);
                        stack.stackTagCompound.setInteger("startZ", z);
                    }
                    else
                    {
                        stack.stackTagCompound.setInteger("endX", x);
                        stack.stackTagCompound.setInteger("endY", y);
                        stack.stackTagCompound.setInteger("endZ", z);
                    }

                    int startX = stack.stackTagCompound.getInteger("startX");
                    int startY = stack.stackTagCompound.getInteger("startY");
                    int startZ = stack.stackTagCompound.getInteger("startZ");
                    int endX = stack.stackTagCompound.getInteger("endX");
                    int endY = stack.stackTagCompound.getInteger("endY");
                    int endZ = stack.stackTagCompound.getInteger("endZ");
                    
                    EntityBeamFX beam = new EntityBeamFX(world, startX + 0.5, startY + 0.5, startZ + 0.5, endX + 0.5, endY + 0.5, endZ + 0.5, 1.0F, 1.0F, 1.0F, 8);
                    Minecraft.getMinecraft().effectRenderer.addEffect(beam);
 
1,990
18
105
Код спавна луча в else, и извлечение координат, соответственно, туда же.
А в условиях лучше используй hasTag вместо проверки на нулл.
 
164
1
4
Код:
    @Override
    public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
    {
        TileEntity tile = world.getTileEntity(x, y, z);
        if (tile instanceof TileEntityNode)
        {
            stack.stackTagCompound = new NBTTagCompound();
            if (!stack.stackTagCompound.hasKey("startX") && !stack.stackTagCompound.hasKey("startY") && !stack.stackTagCompound.hasKey("startZ"))
            {
                stack.stackTagCompound.setInteger("startX", x);
                stack.stackTagCompound.setInteger("startY", y);
                stack.stackTagCompound.setInteger("startZ", z);
                player.addChatMessage(new ChatComponentText("Start"));
            }
            else
            {
                stack.stackTagCompound.setInteger("endX", x);
                stack.stackTagCompound.setInteger("endY", y);
                stack.stackTagCompound.setInteger("endZ", z);
                player.addChatMessage(new ChatComponentText("End"));
                
                int startX = stack.stackTagCompound.getInteger("startX");
                int startY = stack.stackTagCompound.getInteger("startY");
                int startZ = stack.stackTagCompound.getInteger("startZ");
                int endX = stack.stackTagCompound.getInteger("endX");
                int endY = stack.stackTagCompound.getInteger("endY");
                int endZ = stack.stackTagCompound.getInteger("endZ");
                
                EntityBeamFX beam = new EntityBeamFX(world, startX + 0.5, startY + 0.5, startZ + 0.5, endX + 0.5, endY + 0.5, endZ + 0.5, 1.0F, 1.0F, 1.0F, 8);
                Minecraft.getMinecraft().effectRenderer.addEffect(beam);
            }
            
            return true;
        }
        
        return false;
    }
Получилось так, но партикл не спавнится и в чат всегда пишется "Start".
 
1,990
18
105
Ты издеваешься, да?
Создаёшь новый нбт каждый раз и удивляешься чойта он пустой?
Код:
            stack.stackTagCompound = new NBTTagCompound();
            if (!stack.stackTagCompound.hasKey("startX") && !stack.stackTagCompound.hasKey("startY") && !stack.stackTagCompound.hasKey("startZ"))
 
164
1
4
О бож, сорян, надо так:
Код:
            if (stack.stackTagCompound == null)
            {
                stack.stackTagCompound = new NBTTagCompound();
            }
Теперь всё работает, спасибо за помощь :)
[merge_posts_bbcode]Добавлено: 28.10.2015 16:33:37[/merge_posts_bbcode]

Такс, мне ещё нужно когда луч заспавнился скидывать стартовую позицию, иначе в итоге луч будет проводится от тайлаА, до тайлаБ, тайлаС и так далее. Это мне получается в else, после спавна луча нужно делать? Или как это лучше сделать?
 
164
1
4
Решено, после того как спавню луч:
Код:
                stack.stackTagCompound.removeTag("startX");
                stack.stackTagCompound.removeTag("startY");
                stack.stackTagCompound.removeTag("startZ");
 
Сверху