Совет на счёт телепорта

4,045
63
645
В общем, задача следующая:
Создаю телепорт в собственное измерение, однако портал на той стороне должен открываться не во всех биомах.
В связи с этим, произвожу поиск подходящего биома в радиусе 512 блоков от точки захода игрока.

Всё работает, но, если портал в мире создаётся достаточно далеко, при переходе обратно в обычный мир, появляется новый портал, так как радиус поиска уже готового портала меньше 512 блоков.
В стандартном телепорте он 128 блоков. При больших значениях игра достаточно сильно подвисает... Да и не нужны мне большие значения.

Вопрос следующий: каким образом и где лучше сохранить координаты обоих порталов, чтобы при обратном переходе игрока отправляли в нужное место?
Пока в голову приходит только тайл, где будет граниться инфа о связанном портале.

Надеюсь, кто-нибудь понял проблему )))
 
608
5
15
Записывай в дату нужного тебе мира :)
 
608
5
15
WorldSaveData
 
4,045
63
645
Слушай, а можешь вкратце пояснить, как этим пользоваться?
В частности интересуют следующие вещи:
1 - WorldSaveData принадлежит конкретному измерению или она одна на игру?
2 - Нужно ли её где-то регистрировать или просто создаёшь файлик extends WorldSavedData и работаешь с ним?
3 - Каким образом к ней обращаться, тупо через класс (MyWorldSavedData.blaBla()) или как-то через свой ворлд провайдер?
4 - Имеет ли смысл в моём случае сохранять НБТ или же можно просто прописать переменную типа: 
Код:
private final static Map<BlockPos, BlockPos> portalCoord = new HashMap<BlockPos, BlockPos>();
и она автоматом будет хранить все мои данные?

Спасибо за беспокойство )
 
1,137
5
3
>>2 - Нужно ли её где-то регистрировать или просто создаёшь файлик extends WorldSavedData и работаешь с ним?
А самому подумать?
****
4. По-любому придётся в таг писать.
1. Миру
3. Подумай, ответ: да, надо получать через мир
 
1,137
5
3
О боже... Да на форуме уже, как минимум 3 темы с GSON. А ещё есть Google. Там всё расписано. Окда?
 
4,045
63
645
Как-то так?
Код:
private static Map<BlockPos, BlockPos> portalCoord = new HashMap<BlockPos, BlockPos>();
private Gson gson = new GsonBuilder().setPrettyPrinting().create();
private String data;

@Override
public void readFromNBT(NBTTagCompound nbt) {
    if (nbt.hasKey("PortalCoords")) {
        data = nbt.getString("PortalCoords");
        portalCoord = gson.fromJson(data, HashMap.class);
    }
}

@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
    data = gson.toJson(portalCoord);
    nbt.setString("PortalCoords", data);
    return nbt;
}
 
1,137
5
3
Да, можешь сделать так, data всё равно локальная

Код:
@Override
public void readFromNBT(NBTTagCompound nbt) {
    if (nbt.hasKey("PortalCoords")) {
        portalCoord = gson.fromJson(nbt.getString("PortalCoords"), HashMap.class);
    }
}

@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
    nbt.setString("PortalCoords", gson.toJson(portalCoord));
    return nbt;
}
 
4,045
63
645
Так! Слушайте, а в какой момент НБТ запоминать надо и как?
Автоматом, я смотрю, она не запоминается...
.markDirty(); - тоже не фурычит...

Порталы связать получилось, но после перезахода все связи теряются.
[merge_posts_bbcode]Добавлено: 23.07.2016 11:33:43[/merge_posts_bbcode]

Или я, всё же, не правильно гружу саму дату мира...
 
4,045
63
645
Хм... У меня почему-то дата сохраняется не в папке с измерением, а в папке с миром О_о
Так и должно быть?
А как её пихнуть в измерение?
[merge_posts_bbcode]Добавлено: 23.07.2016 14:01:36[/merge_posts_bbcode]

Эм... Что, никак? Мне нужно измерение тоже прописывать в НБТ?

[merge_posts_bbcode]Добавлено: 23.07.2016 14:28:25[/merge_posts_bbcode]

Эх, что-то я делаю не так...
Метод в самой дате:
Код:
private static final String DATA_NAME = "PortalCoords";

public static PortalCoordData get(World world) {
    MapStorage storage = world.getPerWorldStorage();
    PortalCoordData instance = (PortalCoordData)storage.getOrLoadData(PortalCoordData.class, DATA_NAME);
    if (instance == null) {
        instance = new PortalCoordData(DATA_NAME);
        storage.setData(DATA_NAME, instance);
    }        
    return instance;
}

Затем, уже в телепорте сохраняю дату:
Код:
PortalCoordData.get(entityIn.getServer().getEntityWorld()).addCoords(pos1, pos2);
PortalCoordData.get(entityIn.getServer().getEntityWorld()).markDirty();

В итоге, при перезаходе всё теряется.
Что не так?
 
4,045
63
645
Не, не фурычит (
Немного перепаял дату, добавил идентификацию по ID измерения и запихнул всё в Tag.
Начало вылетать на строчке 46... как раз на попытке узнать нужную позицию...
Пишет: 
Код:
com.google.gson.JsonSyntaxException: duplicate key: BlockPos{x=5017, y=65, z=4973}

Что не так?

Код:
public class PortalCoordData extends WorldSavedData {

    private static final String DATA_NAME = "PortalCoords";
    private static NBTTagCompound tag = new NBTTagCompound();
    private static Map<BlockPos, BlockPos> portalCoord = new HashMap<BlockPos, BlockPos>();
    private static Gson gson = new GsonBuilder().setPrettyPrinting().create();

    public PortalCoordData(String identifier) {
        super(identifier);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        if (nbt.hasKey(DATA_NAME)) {
            tag = nbt.getCompoundTag(DATA_NAME);
        }
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
        nbt.setTag(DATA_NAME, tag);
        return nbt;
    }

    public static void addCoords(int dimId, BlockPos in, BlockPos out) {
        portalCoord.put(in, out);
        tag.setString(String.valueOf(dimId), gson.toJson(portalCoord));
    }

    public static BlockPos getCoords(int dimId, BlockPos in) {
        if (tag.hasKey(String.valueOf(dimId))) {
            portalCoord = gson.fromJson(tag.getString(String.valueOf(dimId)), HashMap.class); //Строчка 46
            if (portalCoord.containsKey(in)) return portalCoord.get(in);
            return null;
        }
        else return null;
    }

    public static void removeCoords(int dimId, BlockPos in) {
        if (tag.hasKey(String.valueOf(dimId))) {
            portalCoord = gson.fromJson(tag.getString(String.valueOf(dimId)), HashMap.class);
            if (portalCoord.containsKey(in)) portalCoord.remove(in);
        }
    }

    public static PortalCoordData get(World world) {
        MapStorage storage = world.getMapStorage();
        PortalCoordData instance = (PortalCoordData)storage.getOrLoadData(PortalCoordData.class, DATA_NAME);
        if (instance == null) {
            instance = new PortalCoordData(DATA_NAME);
            storage.setData(DATA_NAME, instance);
        }        
        return instance;
    }
}

Хееееееееелп!
 
1,137
5
3
Не смотрел код, но у тебя повторяющиеся значения. В карте их быть не может, лол
 
4,045
63
645
Ну, как бы... из лога понятно, что они повторяющиеся...
Но вот откуда они там берутся?
Я уже пробовал и перезагружаться и файлик даты удалять, всё равно. В одну сторону прохожу, во вторую вылетает...
 
Сверху