Сохранение структуры большого размера

Версия Minecraft
1.12.2
5,018
47
783
Всем привет. В общем, кто в теме, тот шарит, что в 1.12(или 1.11) была добавлена такая фича как struckture_block. Данными блоками можно выделить регион и сохранить кусок мира в нбт для последующего использования в генерациях. Разработчики поступили неверно, ограничив максимальный обьем куба 32 блоками.
Короче говоря, мне этого маленького кубика 32на32на32 не хватает для того чтобы уместить мои советские гигантские постройки. Сначала думал сделать аналогичный свой блок, но потом решил, что гораздо быстрее будет исправить это недоразумение в ванилле. Собственно, вся проблема заключается в том, что метод для хука то статичный, а в статичном нельзя вызвать суперметод readFromNBT. Ну и общем говоря, вставляя вот такой хук, я сталкиваюсь с проблемой, что тайл попросту не сохраняется.
Что я делаю не так? Как мне вызвать суперметод, без которого не хочет работать readFromNBT?
hohserg предложил мне просто взять и тело суперметода скопипастить себе в хук. Возникла проблема - джве переменных, которые там используются, приватные. Казалось бы, фигня, АТ наше все? А вот нет. После запуска АТ, когда я указал изменить ФСЕ модификаторы в классе TileEntity на публик, и билд сасесшфули, но почему то именно эти две переменных остались приватными.

P.S В ванилле эти глу.. developers the mainkraft зачем то генерят большую структуру по кускам. (лесной дом того перца например, или как там). Догадываюсь зачем, но мне плевать, я хочу целиком:)

Java:
    @Hook(returnCondition = ReturnCondition.ALWAYS)
       public static void readFromNBT(TileEntityStructure tyu,NBTTagCompound compound)
        {
     
        //    tyu.readFromNBT(compound);
         
            tyu.setName(compound.getString("name"));
        //    tyu.author = compound.getString("author");
            tyu.setMetadata(compound.getString("metadata"));
                int i = MathHelper.clamp(compound.getInteger("posX"), -64, 64);
                int j = MathHelper.clamp(compound.getInteger("posY"), -64, 64);
                int k = MathHelper.clamp(compound.getInteger("posZ"), -64, 64);
                tyu.setPosition(new BlockPos(i, j, k));
                int l = MathHelper.clamp(compound.getInteger("sizeX"), 0, 64);
                int i1 = MathHelper.clamp(compound.getInteger("sizeY"), 0, 64);
                int j1 = MathHelper.clamp(compound.getInteger("sizeZ"), 0, 64);
                tyu.setSize(new BlockPos(l, i1, j1));

                try
                {
                    tyu.setRotation(Rotation.valueOf(compound.getString("rotation")));
                }
                catch (IllegalArgumentException var11)
                {
                    tyu.setRotation(Rotation.NONE);
                }

                try
                {
                    tyu.setMirror(Mirror.valueOf(compound.getString("mirror")));
                }
                catch (IllegalArgumentException var10)
                {
                    tyu.setMirror(Mirror.NONE);
                }

                try
                {
                    tyu.setMode(TileEntityStructure.Mode.valueOf(compound.getString("mode")));
                }
                catch (IllegalArgumentException var9)
                {
                    tyu.setMode(TileEntityStructure.Mode.DATA);
                }

          //      tyu.ignoreEntities = compound.getBoolean("ignoreEntities");
                tyu.setPowered(compound.getBoolean("powered"));
                tyu.setShowAir(compound.getBoolean("showair"));
                tyu.setShowBoundingBox(compound.getBoolean("showboundingbox"));

                if (compound.hasKey("integrity"))
                {
                    tyu.setIntegrity(compound.getFloat("integrity"));
                }
                else
                {
                    tyu.setIntegrity(1.0F);
                }

                tyu.setSeed(compound.getLong("seed"));
             
             
                if (tyu.getWorld() != null)
                {
                    BlockPos blockpos = tyu.getPos();
                    IBlockState iblockstate = tyu.getWorld().getBlockState(blockpos);

                    if (iblockstate.getBlock() == Blocks.STRUCTURE_BLOCK)
                    {
                        tyu.getWorld().setBlockState(blockpos, iblockstate.withProperty(BlockStructure.MODE, tyu.getMode()), 2);
                    }
                }
        }
 
Последнее редактирование:
3,005
192
592
5,018
47
783
Без своих вычислений и всего остального.
(Просто заюзай мой вариант)
Я его и заюзал. Просто выделение блоков сделал. Вряд ли тут можно ошибится, все очевидно...

Эти вычисления ничего не решают. Они чисто для удобства - вывод в консоль координат и размеров. В сохранялке все равно берутся чистые обычные коры из всд

Только что попробовал - всд работает точно как надо(то есть без всд проблема остается)
 
3,005
192
592
В сохранялке все равно берутся чистые обычные коры из всд
Как минимум ты сохраняешь координаты в WSD клиента, а берешь в WSD сервера, ЭТО ***** НОРМАЛЬНО?!
~
Я хз короч, юзал код в onBlockActivated с проверкой на сервер.
Все работало.
 
5,018
47
783
Я это уже поправил час назад после твоего сообщения, ничего не изменилось.
Я хз короч, юзал код в onBlockActivated с проверкой на сервер.
Все работало.
Проверь, какого размера файл, который у тебя создается.
 
3,005
192
592
5,018
47
783
Итак, на данный момент: все работает, координаты сохраняются и успешно достаются в классе командерра. Значит с выделением региона у меня точно все в порядке. Значит, смотрим на функцию takeBlocksFromWorld. Она точно правильно, ибо работает в ванилле. В ней есть аргументы World worldIn, BlockPos startPos, BlockPos endPos, boolean takeEntities, @Nullable Block toIgnore, все их которых у меня проставлены. Блокпозы - новые обьекты с координатами из всд. Вроде бы все на месте... почему тогда не работает?
Есть зацепка - файл создается с вписанным мною именем + $r. Причем все файлы имеют одинаковую структуру. То есть, вместо того чтобы взять блоки по моим координатам, он берет какие то стандартные, подозреваю что 0 и 0. Почему? Если ему явно указано какие координаты нужно брать... Иллюминаты?
Какая то дичь получается... Собственно, серверно-клиентские проблемы точно улажены - координаты приходят те что надо.
Дичь!
 
3,005
192
592
А ты уверен. что x1/y1/z1 это точка нижнего левого угла, а x2/y2/z2 это точка верхнего правого угла?
Проверок же нету...
 

Icosider

Kotliner
Администратор
3,600
99
663
P.S В ванилле эти глу.. developers the mainkraft зачем то генерят большую структуру по кускам. (лесной дом того перца например, или как там). Догадываюсь зачем, но мне плевать, я хочу целиком
Потому что так быстрее, нежели сразу всю...
 
5,018
47
783
x1/y1/z1 это точка нижнего левого угла, а x2/y2/z2 это точка верхнего правого угла
Нет. А зачем мне это? Это просто две точки. Ну типо pos2 может быть и снизу слева, и снизу справа. Как я сделаю....:unsure::unsure::unsure:
Потому что так быстрее, нежели сразу всю...
Да я понимаю. Просто мне очень неудобно делать тысячи маленьких региончиков. Мне проще сохранить один огромный кусок и подождать 5 минут пока он сохранится, чем бегать и расставлять два часа эти региончики по 32. В ванилле то самый большой данж состоит из 4 таких кусков. А у меня их десятка два будет.
К примеру размеры структуры которую надо сохранить:
CHbnBEcNJoM.jpg7oU9QwwU1DY.jpg

У меня такое ощущение, что тут замешана функция которая берет блоки из мира. Больше тут нечему.
 
Последнее редактирование:
3,005
192
592
5,018
47
783
Чел ты прав, это из за минусов. Я улетел на положительные координаты, и все сохранилось. навесю модули тогда на координаты... или это неправильно?
 
5,018
47
783
И еще, эмм. Кубик вот таких размеров сохраняется. Но если его поставить это огромная площадка

Он сохраняет почему то по координатам в общем. Как бы ему дать готовый размер, а не два блокпоза... я ж его рассчитал

 
Последнее редактирование:
5,018
47
783
А почему, хм?...
нет, тут не ноль...

Тут размеры почему то зависят от координат.
 
Последнее редактирование:
5,018
47
783
Выделяю так:
Сначала первые координаты - лефт клик.

Java:
    @SubscribeEvent
    public void getPosLeft(PlayerInteractEvent.LeftClickBlock e) {
        
        //e.getWorld().setBlockState(e.getPos(), e.getWorld().getBlockState(e.getPos()));
        if(!e.getWorld().isRemote) {
            SetPos wsd = SetPos.get(e.getWorld());
            if(e.getItemStack().getItem() == Items.STICK) {

                wsd.x1 = e.getPos().getX();
                wsd.y1 = e.getPos().getY();
                wsd.z1 = e.getPos().getZ();

                System.out.println("pos1 " + wsd.x1 + " : " + wsd.y1 + " : " + wsd.z1);

            }
        }
    }
Java:
    @SubscribeEvent
    public void getPosRight(PlayerInteractEvent.RightClickBlock e) {
        if(!e.getWorld().isRemote) {
            SetPos wsd = SetPos.get(e.getWorld());

            if(e.getItemStack().getItem() == Items.STICK) {
                wsd.x2 = e.getPos().getX();
                wsd.y2 = e.getPos().getY();
                wsd.z2 = e.getPos().getZ();

                System.out.println("pos2 " + wsd.x2 + " : " + wsd.y2 + " : " + wsd.z2);
                
                System.out.println("size " + Math.abs(this.calcSize(e.getWorld())[0]) + ":" +  Math.abs(this.calcSize(e.getWorld())[1]) + ":" +   Math.abs(this.calcSize(e.getWorld())[2]) );
                
            }
        }
    }
Далее для удобства я себе еще расчитываю размеры будущей структуры и вывожу координаты.

[13:13:04] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosLeft:52]: pos1 790 : 3 : 280
[13:13:07] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosRight:71]: pos2 784 : 10 : 273
[13:13:07] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosRight:73]: size 6:7:7


Генерирую структурку через онБлокАктивейшн тестового блока. Первая координата соответственно, в блоке, а размеры структуры получаются размеров, равных этим координатам. (выделил).
С высотой все в порядке. Я не знаю почему так(
 
3,005
192
592
Выводи координаты не когда ты их Сетаешь, а когда бл*н твой код выполняет работу.
Когда ты сетаешь - у тебя всегда будут "ВАЙ ПРАВИЛЬНЫЙ КООРДИНАТ", а в коде, который выполняет работу - не правильные.
 
5,018
47
783
Покажи как генерируешь:/
Да... как обычно. Это тут не причем.
Выводи координаты не когда ты их Сетаешь, а когда бл*н твой код выполняет работу.
Именно в методе в команде я вызывал и чекал эти коорды, они правильные.
 

Icosider

Kotliner
Администратор
3,600
99
663
Да... как обычно. Это тут не причем.
Ну тогда можешь дальше сидеть думать, что не так. Мы не ванги.
Именно в методе в команде я вызывал и чекал эти коорды, они правильные.
:m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam: из 10
 
Сверху