Лучи

1,976
68
220
Вот вы видили лучи, которые поднимаются над черным морем. И я не видел, а хотите?
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
AlexSocol написал(а):
И мне хотелось бы соединить некоторые её блоки лучами.
В смысле? Типа так:

?
Хотел кругом соединить:

Но нужно пересортировать лист для правильного кругового соединения. Но я не знаю как сделать лучше.
 

timaxa007

Модератор
5,831
409
672
Я тоже хотел, но в итоге у меня получилось не красиво. Из-за недостатка знаний геометрии не вышло нормально.
Код:
@SideOnly(Side.CLIENT)
public class RenederTileEntityAltar extends TileEntitySpecialRenderer {

    private static Minecraft mc = Minecraft.getMinecraft();

    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float scale) {
        render((TileEntityAltar)tile, x, y, z, scale);
    }

    private void render(TileEntityAltar tile, double x, double y, double z, float scale) {
        Tessellator tessellator = Tessellator.instance;
        GL11.glPushMatrix();
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glDisable(GL11.GL_CULL_FACE);
        GL11.glTranslated(x, y, z);

        GL11.glPushMatrix();
        GL11.glTranslatef(0.5F, 1.5F, 0.5F);
        tessellator.startDrawingQuads();
        tessellator.setColorRGBA_F(255.0F, 0.0F, 0.0F, 0.5F);
        tessellator.addVertex(-0.25D, 0D, -0.25D);
        tessellator.addVertex(-0.25D, 0D, 0.25D);
        tessellator.addVertex(0.25D, 0D, 0.25D);
        tessellator.addVertex(0.25D, 0D, -0.25D);
        tessellator.draw();
        GL11.glPopMatrix();

        if (tile.list_use != null && tile.list_use.size() > 0)
            for (int i = 0; i < tile.list_use.size(); ++i) {
                UtilBlock.BlockPosState bps = tile.list_use.get(i);

                GL11.glBegin(GL11.GL_LINES);
                GL11.glVertex3f(0.5F, 1.25F, 0.5F);//a
                GL11.glVertex3f((float)((double)bps.getBlockPos().x - TileEntityRendererDispatcher.staticPlayerX - x) + 0.5F, 
                        (float)((double)bps.getBlockPos().y - TileEntityRendererDispatcher.staticPlayerY - y) + 1.25F, 
                        (float)((double)bps.getBlockPos().z - TileEntityRendererDispatcher.staticPlayerZ - z) + 0.5F);//b
                GL11.glEnd();
                /*
                tessellator.startDrawingQuads();
                tessellator.setColorRGBA_F(255.0F, 0.0F, 0.0F, 0.5F);
                tessellator.addVertex(-0.25D, 0D, -0.25D);
                tessellator.addVertex(-0.25D, 0D, 0.25D);
                tessellator.addVertex(0.25D, 0D, 0.25D);
                tessellator.addVertex(0.25D, 0D, -0.25D);
                tessellator.draw();
                 */
            }

        GL11.glEnable(GL11.GL_CULL_FACE);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glPopMatrix();
    }

}
Код:
public class TileEntityAltar extends TileEntity {

    public ArrayList<UtilBlock.BlockState> list_find = Lists.newArrayList();
    public ArrayList<UtilBlock.BlockPosState> list_use = Lists.newArrayList();
    private int tickReSearch = 0;
    private boolean isSearch = false;

    public TileEntityAltar() {
        list_find.add(new UtilBlock.BlockState(Blocks.beacon, 0));
        list_find.add(new UtilBlock.BlockState(Blocks.diamond_block, 0));
        list_find.add(new UtilBlock.BlockState(Blocks.emerald_block, 0));
    }

    public void updateEntity() {
        if (tickReSearch == 0) {
            searchAddBlocks(9);
        }
        ++tickReSearch;
        if (tickReSearch >= 20 * 6) {
            tickReSearch = 0;
        }
    }

    public void searchAddBlocks(int radius) {
        list_use.clear();
        for (int px = xCoord - radius; px <= xCoord + radius; ++px) {
            for (int py = yCoord - radius / 2; py <= yCoord + radius; ++py) {
                for (int pz = zCoord - radius; pz <= zCoord + radius; ++pz) {
                    for (int i = 0; i < list_find.size(); ++i) {
                        UtilBlock.BlockState bs = list_find.get(i);
                        if (bs != null &&
                                //!worldObj.isAirBlock(px, py, pz) &&
                                worldObj.getBlock(px, py, pz) == bs.getBlock() &&
                                worldObj.getBlockMetadata(px, py, pz) == bs.getMetadata()) {
                            UtilBlock.BlockPosState bps = new UtilBlock.BlockPosState(
                                    bs, new UtilBlock.BlockPos(px, py, pz)
                                    );
                            list_use.add(bps);
                        }
                    }
                }
            }
        }
    }

}
Код:
public class UtilBlock {

    public static class BlockPosState {

        private BlockState state;
        private BlockPos pos;

        public BlockPosState(BlockState state, BlockPos pos) {
            this.state = state;
            this.pos = pos;
        }

        public BlockState getBlockState() {
            return state;
        }

        public BlockPos getBlockPos() {
            return pos;
        }

    }

    public static class BlockState {

        private Block block;
        private int metadata;

        public BlockState(Block block, int metadata) {
            this.block = block;
            this.metadata = metadata;
        }

        public Block getBlock() {
            return block;
        }

        public int getMetadata() {
            return metadata;
        }

    }

    public static class BlockPos {

        public int x;
        public int y;
        public int z;

        public BlockPos(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

    }

}
Я знаю, что код можно было написать и получше.
---
Хотя, наверное был-б лучше делать лучи через партиклы. Но я к сожалению, не знаю как создавать партиклы (просто ещё не пробовал).
 
1,976
68
220
Ну, вроде бы это не так уж и трудно...
gIker4N.png
[merge_posts_bbcode]Добавлено: 22.02.2016 18:54:06[/merge_posts_bbcode]

Написал небольшое условие, которое выполняется автоматически для всех четырёх кристаллов, но каждый луч принадлежит своему (через if, но это уже другая история) :D

[merge_posts_bbcode]Добавлено: 22.02.2016 18:54:44[/merge_posts_bbcode]

А для создания текстурированного луча (типа как у маяка, с повторяемой текстурой) что нужно писать?
 

svk

1,185
2
AlexSocol написал(а):
Ну, вроде бы это не так уж и трудно...
gIker4N.png
[merge_posts_bbcode]Добавлено: 22.02.2016 18:54:06[/merge_posts_bbcode]

Написал небольшое условие, которое выполняется автоматически для всех четырёх кристаллов, но каждый луч принадлежит своему (через if, но это уже другая история) :D

[merge_posts_bbcode]Добавлено: 22.02.2016 18:54:44[/merge_posts_bbcode]

А для создания текстурированного луча (типа как у маяка, с повторяемой текстурой) что нужно писать?
Не знаю что за там в коде, но как сказал довакин - "это просто квард который поворачивается лицом к игроку по одной оси"
[merge_posts_bbcode]Добавлено: 22.02.2016 19:10:06[/merge_posts_bbcode]

Это десятьмю строчками реализовывается.
 
1,087
2
Это десятьмю строчками реализовывается.
Код:
MyMod.proxy.spawnMyParticle(x, y, z, finalX, finalY, finalZ);
Да, десятью, а хотя... Одной. Просто дело в том, что можно улегчить данный процесс, сделав партиклы через EntityFX, а дальше в прокси запихать это. Хотя, если нужна обычная линия, то конечно, можно векторами сделать.
 
1,976
68
220
FanKar написал(а):
Да сделай с помощью партиклов, и красивее будет D:
Ну дай наводку :ermm:
Партиклы я делать умею (вчера научился: могу менять цвет, размер и присваивать ванилла текстуру :D)
Думаю, рендер присобачить им будет не трудно, но вот как вращать эти партикло-лучи?
 

svk

1,185
2
AlexSocol написал(а):
FanKar написал(а):
Да сделай с помощью партиклов, и красивее будет D:
Ну дай наводку :ermm:
Партиклы я делать умею (вчера научился: могу менять цвет, размер и присваивать ванилла текстуру :D)
Думаю, рендер присобачить им будет не трудно, но вот как вращать эти партикло-лучи?
Посмотри в рендере шара гаста, он вертится по 2 осям, а тебе надо лишь 1.
 
398
4
7
На счет партиклов: их максимальное количество в 1.7.10 - 4000 штук.
 
1,087
2
Если я тебя правильно понял, то вот. Это партиклы вращающиеся вокруг оси xyz по всем направлениям.
 
398
4
7
svk написал(а):
Asd73 написал(а):
На счет партиклов: их максимальное количество в 1.7.10 - 4000 штук.
4000? Не верю.

В методе spawnParticle класса World вызывается метод spawnParticle класса RenderGlobal ... в конечном итоге вызывается this.mc.effectRenderer.addEffect(...) в классе EffectRenderer
Код:
    public void addEffect(EntityFX p_78873_1_)
    {
        int i = p_78873_1_.getFXLayer();

        if (this.fxLayers[i].size() >= 4000)
        {
            this.fxLayers[i].remove(0);
        }

        this.fxLayers[i].add(p_78873_1_);
    }
[merge_posts_bbcode]Добавлено: 22.02.2016 23:31:40[/merge_posts_bbcode]

То есть при добавлении более 4000 частиц, старые частицы удаляются.
 
1,976
68
220
Ну да, сделаю я стопиццот партиклов, а потом мод будет лагать как у Рейки Хроматик
UPD: ещё один минус партиклов в том, что их нужно постоянно спаунить заново, ибо они исчезают со временем
[merge_posts_bbcode]Добавлено: 22.02.2016 21:34:21[/merge_posts_bbcode]

Но, с другой стороны, я больше не вижу способов оставлять их рендерящимися даже если кристаллы в "заспинной пустоте" остаются

[merge_posts_bbcode]Добавлено: 22.02.2016 21:45:15[/merge_posts_bbcode]

Кто знает, как заставить блок рендериться даже в заспинной пустоте?
 

svk

1,185
2
AlexSocol написал(а):
Ну да, сделаю я стопиццот партиклов, а потом мод будет лагать как у Рейки Хроматик
UPD: ещё один минус партиклов в том, что их нужно постоянно спаунить заново, ибо они исчезают со временем
[merge_posts_bbcode]Добавлено: 22.02.2016 21:34:21[/merge_posts_bbcode]

Но, с другой стороны, я больше не вижу способов оставлять их рендерящимися даже если кристаллы в "заспинной пустоте" остаются

[merge_posts_bbcode]Добавлено: 22.02.2016 21:45:15[/merge_posts_bbcode]

Кто знает, как заставить блок рендериться даже в заспинной пустоте?
Лол, партиклам можно настроить время жизни.
И как вы собрались по другому делать, кроме как не партиклами?
 
Сверху