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

Версия 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);
                    }
                }
        }
 
Последнее редактирование:
5,018
47
783
Омг ну вот

Java:
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {

        if(!world.isRemote) {
            WorldServer worldServer = (WorldServer)world;
            MinecraftServer minecraftServer = world.getMinecraftServer();
            TemplateManager templateManager = worldServer.getStructureTemplateManager();
            Template template = templateManager.get(minecraftServer, new ResourceLocation(SovietCore.MODID + ":fg"));
            PlacementSettings settings = new PlacementSettings();
            template.addBlocksToWorld(world, pos, settings);
            return true;
        }

        return false;
    }
Со всеми нбт работает, кроме моих. Явно причина не в этом гене.


:m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam::m_faceplam: из 10

Значит я не понял. Что имелось ввиду?
 
5,018
47
783
Ап, еще не все... я рано алмазик поставил(
Я просто не понимаю, откуда беруться эти странные координаты, если я конкретно указываю свои...
 
Последнее редактирование:
5,018
47
783
зацепка номер два
69 и 71 строка - это то, что выдает функция template.getSize(); до и после takesBlockFromWorld
То есть координаты второй позиции сохраняются как размеры структуры
Вопрос - с хера ли?

Java:
[00:00:29] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosLeft:52]: pos1 22 : 0 : 19
[00:00:35] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosRight:71]: pos2 14 : 8 : 27
[00:00:35] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Event.GetPosEvent:getPosRight:73]: size 8:8:8
[00:00:40] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Command.CommandSave:execute:69]: BlockPos{x=15, y=9, z=15}
[00:00:40] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Command.CommandSave:execute:71]: BlockPos{x=14, y=8, z=27}
[00:00:40] [Server thread/INFO] [STDOUT]: [ru.lg.SovietMod.Command.CommandSave:execute:79]: Save? true
 
1,038
57
229
bbcdc714a6.jpg

ну ты же умный...
Отдых тоже нужен мозгам.
Да и без кода - телепаты в отпуске..
 
Последнее редактирование:
5,018
47
783
Про это я вчера уже сам нашел, зачем ты мне это показываешь снова?

Я весь код, который учавствует, скинул в эту тему уже по два раза. Правда все равно не понимаю, почему он сохраняет не мой регион, а от бедрока до поверхности)
 
3,005
192
592
Я хз, код писал минут за 10, и он вроде работает.
P.S. Там с верху, между импортами и названием класса..
Java:
package my.own.code;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.Mirror;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.WorldServer;
import net.minecraft.world.gen.structure.template.PlacementSettings;
import net.minecraft.world.gen.structure.template.Template;
import net.minecraft.world.gen.structure.template.TemplateManager;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

/*
 * Author: MyOwnCode
 * <b>YOU CAN NOT</b>
 * <b>Copy entire classes, methods or features or claim you made them.</b>
 */
@Mod.EventBusSubscriber(modid = "myowncode")
public class MyOwnCodeEvents {

    private static BlockPos pos1, pos2;

    @SubscribeEvent
    public static void onRClick(PlayerInteractEvent.RightClickBlock e) {
        if (!e.getWorld().isRemote) {
            ItemStack hand = e.getItemStack();
            if (!hand.isEmpty()) {
                if (hand.getItem() == Items.APPLE) {
                    pos1 = e.getPos();
                    System.out.println("Write... " + pos1.toString());
                } else if (hand.getItem() == Items.GOLDEN_APPLE) {
                    pos2 = e.getPos();
                    System.out.println("Write... " + pos2.toString());
                } else if (hand.getItem() == Item.getItemFromBlock(Blocks.BEDROCK)) {
                    if (pos1 != null && pos2 != null) {
                        int
                            x1 = getMin(pos1.getX(), pos2.getX()),
                            y1 = getMin(pos1.getY(), pos2.getY()),
                            z1 = getMin(pos1.getZ(), pos2.getZ()),
                            x2 = getMax(pos1.getX(), pos2.getX()),
                            y2 = getMax(pos1.getY(), pos2.getY()),
                            z2 = getMax(pos1.getZ(), pos2.getZ());

                        WorldServer worldserver = (WorldServer) e.getWorld();
                        MinecraftServer minecraftserver = e.getWorld().getMinecraftServer();
                        TemplateManager templatemanager = worldserver.getStructureTemplateManager();
                        Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation("haHAA"));
                        template.takeBlocksFromWorld(e.getWorld(), new BlockPos(x1, y1, z1), new BlockPos(x2 - x1 + 1, y2 - y1 + 1, z2 - z1 + 1), true, Blocks.STRUCTURE_VOID);
                        template.setAuthor("FuckUMaxik");
                        boolean b = templatemanager.writeTemplate(minecraftserver, new ResourceLocation("haHAA"));
                        System.out.println(">>> min " + new BlockPos(x1, y1, z1).toString()); // new object = best object.
                        System.out.println(">>> max " + new BlockPos(x2, y2, z2).toString());
                        System.out.println(">>> size " + template.getSize().toString());
                        System.out.println(">>> result " + b);
                        pos1 = pos2 = null;
                    }
                } else if (hand.getItem() == Items.REDSTONE) {
                    WorldServer worldserver = (WorldServer) e.getWorld();
                    MinecraftServer minecraftserver = e.getWorld().getMinecraftServer();
                    TemplateManager templatemanager = worldserver.getStructureTemplateManager();
                    Template template = templatemanager.get(minecraftserver, new ResourceLocation("haHAA"));
                    PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE).setRotation(Rotation.NONE).setIgnoreEntities(true).setChunk(null).setReplacedBlock(null).setIgnoreStructureBlock(false);
                    template.addBlocksToWorldChunk(e.getWorld(), e.getPos(), placementsettings);
                }
            }
        }
    }

    private static int getMin(int a, int b) {
        return Math.min(a, b);
    }

    private static int getMax(int a, int b) {
        return Math.max(a, b);
    }
}
 
5,018
47
783
С виду тоже самое, только без всд...

Да, работает. Я напишу, что это твой код, спасибо, Артем. Хотя он от моего по сути ничем не отличается, хм... Наверное я криворукий или что... честно сказать,я до сих пор не вижу, в чем моя ошибка была ранее и почему твой код - работает, а мой точно фактически точно такой же - нет...
 
Сверху