Помогите сундук вставляется без вещей | schematic

Статус
Закрыто для дальнейших ответов.

nutrolshok

Активный участник
Пользователь
Баллы
76
Кр4, писал я скай блок, всё было нормально... Дело дошло до нормального острова. Я его построил, скопировал, вставил - всё нормально, всё переносится. Залил в schematic, залил в плагин. Тещу - вещей в сундуке нет. Вот отрывок кода, который отвечает за вставку сундука

UPD: версия майна 1.12.2

Код:
if(id.equalsIgnoreCase("Chest")) {
                List<Tag> items = getChildTag(tags, "Items", ListTag.class).getValue();
                Block block = new Location(loc.getWorld(), x + loc.getX(), y + loc.getY(), z + loc.getZ()).getBlock();
                if (block.getState() instanceof Chest) {
                    Chest chest = (Chest) block.getState();
                    for (Tag item : items) {
                        if (!(item instanceof CompoundTag))
                            continue;
                        Map<String, Tag> itemtag = ((CompoundTag) item).getValue();
                        byte slot = getChildTag(itemtag, "Slot", ByteTag.class).getValue();
                        String name = (getChildTag(itemtag, "id", StringTag.class).getValue()).toLowerCase().replace("minecraft:", "");
                        Byte amount = getChildTag(itemtag, "Count", ByteTag.class).getValue();
                        if(MultiversionMaterials.fromString(name.toUpperCase()) != null){
                            Material material = MultiversionMaterials.fromString(name.toUpperCase()).parseMaterial();
                            if (material != null) {
                                chest.getBlockInventory().setItem(slot, new ItemStack(material, amount));
                            }
                        }
                    }
                }
            }
 
Последнее редактирование:
Тебе все говорят, что есть. Наверно, стоит загрузить последнюю версию ядра 1.12.2?
Вообще, на самом деле, ХЗ, зачем этот снапшот с учётом, что в сундуки без проблем устанавливали содержимое и в более ранних версиях, когда этого снапшота и в помине не было.
Странно, на самом деле...


Ты пишешь скайблок под разные версии NMS, потому что у тебя игроки с разных версий заходят? Если сервер на 1.14 - так и оставь только свой NMS_v1_14_R1.
Или это для работы с пакетами или плагин для паблика?
Хотел потом паблик плагин опубликовать (За мани 🙂 ). Щас уберу мультиверсию и идею выложить плагин куда-либо, кроме сервака.
 
Да я вам бесплатно подарю схематик пастер. Переделаете допишете что надо.
Тут многие мутят свои цивкрафты, скайблоки и не знают как вставлять схематики.
Код:
package Example.schem;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Container;
import org.bukkit.block.data.BlockData;
import org.*********ventory.ItemStack;
import org.bukkit.util.Vector;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import ru.minecraft.nbt.CompoundNBT;
import ru.minecraft.nbt.CompressedStreamTools;
import ru.minecraft.nbt.INBT;
import ru.minecraft.nbt.ListNBT;

public class Schem {
    public static void paste(Location start, File file)
            throws InterruptedException, FileNotFoundException, IOException, CommandSyntaxException {
        CompoundNBT schem = CompressedStreamTools.readCompressed(new FileInputStream(file));
        CompoundNBT meta = schem.getCompound("Metadata");
        Location pos = start
                .add(new Vector(meta.getInt("WEOffsetX"), meta.getInt("WEOffsetY"), meta.getInt("WEOffsetZ")));
        byte[] blockData = schem.getByteArray("BlockData");
        CompoundNBT palette = schem.getCompound("Palette");
        Map<Integer, String> paletteMap = new HashMap<Integer, String>();
        for (String set : palette.keySet()) {
            paletteMap.put(palette.getInt(set), set);
        }
        ListNBT blockEntities = schem.getList("BlockEntities", 10);
        int i = 0;
        // set block
        for (int y = 0; y < schem.getShort("Height"); ++y) {
            for (int z = 0; z < schem.getShort("Length"); ++z) {
                for (int x = 0; x < schem.getShort("Width"); ++x) {
                    BlockData data = Bukkit.createBlockData(paletteMap.get((int) blockData[i]));
                    pos.getWorld().getBlockAt(pos.getBlockX() + x, pos.getBlockY() + y, pos.getBlockZ() + z)
                            .setBlockData(data);
                    i++;
                }
            }
        }
        // set inventory
        for (INBT inbt : blockEntities) {
            CompoundNBT blockEntity = (CompoundNBT) inbt;
            int[] Pos = blockEntity.getIntArray("Pos");
            for (INBT inbt2 : blockEntity.getList("Items", 10)) {
                CompoundNBT stack = (CompoundNBT) inbt2;
                Block block = pos.getWorld().getBlockAt(pos.getBlockX() + Pos[0], pos.getBlockY() + Pos[1],
                        pos.getBlockZ() + Pos[2]);
                BlockState state = block.getState();
                ItemStack item = SchemNMS.getItemStack(stack);
                if (state instanceof Container) {
                    Container container = (Container) state;
                    container.getSnapshotInventory().setItem(stack.getInt("Slot"), item);
                    state.update();
                }
            }
        }
        // TODO spawn entity
    }
}

Код:
package Example.schem;

import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.*********ventory.ItemStack;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.server.v1_14_R1.MojangsonParser;
import ru.minecraft.nbt.CompoundNBT;

public class SchemNMS {
    public static ItemStack getItemStack(CompoundNBT stack) {
        try {
            return CraftItemStack
                    .asBukkitCopy(net.minecraft.server.v1_14_R1.ItemStack.a(MojangsonParser.parse(stack.toString())));
        } catch (CommandSyntaxException e) {
            e.printStackTrace();
            return new ItemStack(Material.AIR);
        }
    }
}
jnbt
 
Последнее редактирование:
Да я вам бесплатно подарю схематик пастер. Переделаете допишете что надо.
Тут многие мутят свои цивкрафты, скайблоки и не знают как вставлять схематики.
Код:
package Example.schem;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Container;
import org.bukkit.block.data.BlockData;
import org.*********ventory.ItemStack;
import org.bukkit.util.Vector;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import ru.minecraft.nbt.CompoundNBT;
import ru.minecraft.nbt.CompressedStreamTools;
import ru.minecraft.nbt.INBT;
import ru.minecraft.nbt.ListNBT;

public class Schem {
    public static void paste(Location start, File file)
            throws InterruptedException, FileNotFoundException, IOException, CommandSyntaxException {
        CompoundNBT schem = CompressedStreamTools.readCompressed(new FileInputStream(file));
        CompoundNBT meta = schem.getCompound("Metadata");
        Location pos = start
                .add(new Vector(meta.getInt("WEOffsetX"), meta.getInt("WEOffsetY"), meta.getInt("WEOffsetZ")));
        byte[] blockData = schem.getByteArray("BlockData");
        CompoundNBT palette = schem.getCompound("Palette");
        Map<Integer, String> paletteMap = new HashMap<Integer, String>();
        for (String set : palette.keySet()) {
            paletteMap.put(palette.getInt(set), set);
        }
        ListNBT blockEntities = schem.getList("BlockEntities", 10);
        int i = 0;
        // set block
        for (int y = 0; y < schem.getShort("Height"); ++y) {
            for (int z = 0; z < schem.getShort("Length"); ++z) {
                for (int x = 0; x < schem.getShort("Width"); ++x) {
                    BlockData data = Bukkit.createBlockData(paletteMap.get((int) blockData[i]));
                    pos.getWorld().getBlockAt(pos.getBlockX() + x, pos.getBlockY() + y, pos.getBlockZ() + z)
                            .setBlockData(data);
                    i++;
                }
            }
        }
        // set inventory
        for (INBT inbt : blockEntities) {
            CompoundNBT blockEntity = (CompoundNBT) inbt;
            int[] Pos = blockEntity.getIntArray("Pos");
            for (INBT inbt2 : blockEntity.getList("Items", 10)) {
                CompoundNBT stack = (CompoundNBT) inbt2;
                Block block = pos.getWorld().getBlockAt(pos.getBlockX() + Pos[0], pos.getBlockY() + Pos[1],
                        pos.getBlockZ() + Pos[2]);
                BlockState state = block.getState();
                ItemStack item = SchemNMS.getItemStack(stack);
                if (state instanceof Container) {
                    Container container = (Container) state;
                    container.getSnapshotInventory().setItem(stack.getInt("Slot"), item);
                    state.update();
                }
            }
        }
        // TODO spawn entity
    }
}

Код:
package Example.schem;

import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.*********ventory.ItemStack;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.server.v1_14_R1.MojangsonParser;
import ru.minecraft.nbt.CompoundNBT;

public class SchemNMS {
    public static ItemStack getItemStack(CompoundNBT stack) {
        try {
            return CraftItemStack
                    .asBukkitCopy(net.minecraft.server.v1_14_R1.ItemStack.a(MojangsonParser.parse(stack.toString())));
        } catch (CommandSyntaxException e) {
            e.printStackTrace();
            return new ItemStack(Material.AIR);
        }
    }
}
jnbt
Лол, вставляется всё нормально, кроме сундука. Вставил твой код. В твоём коде много ошибок.
 
Лол, вставляется всё нормально, кроме сундука. Вставил твой код. В твоём коде много ошибок.
@nutrolshok
Ты точно использовал такую же версию?
nms штука динамическая и часто меняется от версии к версии.
Как и сам формат чанка поменялся с 1.13.
И там пониже еще jnbt либа, она тоже нужна, это чтоб бы меньше кода из nms дергать.
 
@nutrolshok
Ты точно использовал такую же версию?
nms штука динамическая и часто меняется от версии к версии.
Как и сам формат чанка поменялся с 1.13.
И там пониже еще jnbt либа, она тоже нужна, это чтоб бы меньше кода из nms дергать.
Я использую версию 1.12.2. jnbt имеется.
 
Лол, вставляется всё нормально, кроме сундука. Вставил твой код. В твоём коде много ошибок.
org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
Как и сам формат чанка поменялся с 1.13.
Я использую версию 1.12.2. jnbt имеется.
А зачем тогда жаловаться?
 
Тема закрыта. Оказалось, что ошибка в схематике. Спасибо всем за ответы.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх