Помогите Неправильная работа world#dropItem

  • Автор темы Автор темы reZero
  • Дата начала Дата начала

reZero

Активный участник
Пользователь
Баллы
76
Очередная проблема с моей рулеткой на армор стендах...

В общем, я делаю круг спавном арморстендов и помещаю на них в качестве пассажира дропнутые предметы (world#dropItem)

Я заметил, что иногда один или два предмета не появляются. То есть, сам невидимый армор стенд на месте, а вот дропнутого предмета на нем нет. Это происходит абсолютно рандомно. Что с этим можно поделать?

upload_2022-2-24_14-44-19.png
Код:
 /**
     * Spawn armor stand and item entity as passenger on them
     */
    public void spawn() {
        // Item entity settings
        Item item = location.getWorld().dropItem(location, rewardItem.getItemStack());
        item.setTicksLived(Integer.MAX_VALUE);
        item.setCanMobPickup(false);
        item.setGravity(false);
        item.setInvulnerable(true);
        item.setPickupDelay(Integer.MAX_VALUE);
        item.setCustomNameVisible(true);
        item.setCustomName(item.getItemStack().getItemMeta().getDisplayName());

        // Armor stand settings
        armorStand = location.getWorld().spawn(location, ArmorStand.class, as -> {
            as.setVisible(false);
            as.setAI(false);
            as.setCollidable(false);
            as.setGravity(false);
            as.setSmall(true);
            as.setMarker(true);
            as.setInvulnerable(true);
            as.getPassengers().clear();
            as.addPassenger(item);
        });
    }

paper 1.12.2
 
подскажите куда копать, плез
 
После перезахода появляется?
Получи пассажира такого стенда - там нулл? Если нет, то можешь проверить локацию
 
Используй API HolographicDisplays и будет тебе счастье
 
Используй API HolographicDisplays и будет тебе счастье
Зачем?
Мне нужно буквально пару строчек для спавна стенда и посадки на него предметов.
К чему тянуть либой целой плагин, если намного удобнее воспользоваться средствами обыкновенного бакита?
 
Тогда другой вопрос, ты используешь на сервере HolographicDisplays? Если да, то нет проблемы использовать его API в котором уже всё реализовано
 
Тогда другой вопрос, ты используешь на сервере HolographicDisplays? Если да, то нет проблемы использовать его API в котором уже всё реализовано
Да какая разница, использую я его или нет?
Зачем делать свой плагин зависимым от другого плагина, когда без этого можно легко и просто обойтись?
Тянуть за собой лишние зависимости это bad practice
 
Да какая разница, использую я его или нет?
Зачем делать свой плагин зависимым от другого плагина, когда без этого можно легко и просто обойтись?
Тянуть за собой лишние зависимости это bad practice
Нет ничего плохого юзать зависимости, если все равно плагин используется такой. Это высокоуровневое программирование.
 
Я не понимаю, зачем тут спавнить ArmorStand ?
 
Нет ничего плохого юзать зависимости, если все равно плагин используется такой. Это высокоуровневое программирование.
А где я написал, что зависимости использовать - плохо? Я написал по факту, что для мелких задач не обязательно использовать библиотеки. Зачем мне тянуть всякие голограмо-апишки для обычного спавна стенда с предметом на нем, когда с этим прекрасно справятся несколько строчек обычного бакит апи?
 
Я не понимаю, зачем тут спавнить ArmorStand ?
Чтобы "надевать" на них предметы и крутить сами армор стенды. Знаю, что можно обойтись без них и просто спавнить дропнутые айтемы, затем управлять ими через velocity, но в данном случае я захотел воспользоваться стендами
 
Чтобы "надевать" на них предметы и крутить сами армор стенды. Знаю, что можно обойтись без них и просто спавнить дропнутые айтемы, затем управлять ими через velocity, но в данном случае я захотел воспользоваться стендами
А тогда каким образом ты двигаешь арморстенды ?
 
Добавил в код спавна стенда небольшой "дебаг" - вывод пассажира и его локации, вместе с локацией стенда, как мне подсказал @Dymeth
Код:
 /**
     * Spawn armor stand and item entity as passenger on them
     */
    public void spawn() {
        // Item entity settings
        Item item = location.getWorld().dropItem(location, rewardItem.getItemStack());
        item.setTicksLived(Integer.MAX_VALUE);
        item.setCanMobPickup(false);
        item.setGravity(false);
        item.setInvulnerable(true);
        item.setPickupDelay(Integer.MAX_VALUE);
        item.setCustomNameVisible(true);
        item.setCustomName(item.getItemStack().getItemMeta().getDisplayName());

        // Armor stand settings
        armorStand = location.getWorld().spawn(location, ArmorStand.class, as -> {
            as.setVisible(false);
            as.setAI(false);
            as.setCollidable(false);
            as.setGravity(false);
            as.setSmall(true);
            as.setMarker(true);
            as.setInvulnerable(true);
            as.getPassengers().clear();
            as.addPassenger(item);
        });

        System.out.println("passenger: " + armorStand.getPassengers().get(0).getCustomName());
        System.out.println("passenger loc: " + armorStand.getPassengers().get(0).getLocation());
        System.out.println("stand loc: " + location);
    }
Получил следующий результат
Код:
[01:45:50 INFO]: —--— 0 —--—
[01:45:50 INFO]: passenger: DELUXE
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10123.499999956288,y=160.0,z=-10094.5,pitch=0.0,yaw=348.6585}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10123.499999956288,y=160.0,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 1 —--—
[01:45:50 INFO]: passenger: MUSIC BOY
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10122.54894349623,y=159.3090170329201,z=-10094.5,pitch=0.0,yaw=73.25704}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10122.54894349623,y=159.3090170329201,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 2 —--—
[01:45:50 INFO]: passenger: ENCHANTER
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10122.912214936094,y=158.19098286875405,z=-10094.5,pitch=0.0,yaw=33.507187}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10122.912214936094,y=158.19098286875405,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 3 —--—
[01:45:50 INFO]: passenger: HELPER
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10124.0877850832,y=158.19098288277257,z=-10094.5,pitch=0.0,yaw=350.30814}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10124.0877850832,y=158.19098288277257,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 4 —--—
[01:45:50 INFO]: passenger: MULTI
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10124.451056570077,y=159.30901682885303,z=-10094.5,pitch=0.0,yaw=184.28891}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10124.451056570077,y=159.30901682885303,z=-10094.5,pitch=0.0,yaw=0.0}
[01:46:04 INFO]: [Server] rezero выиграл DELUXE!

p.s. пропал предмет MUSIC BOY

Если перезайти на сервер когда шмотка пропадает, она вновь появляется

Отсюда можно сделать вывод, что баг визуальный? Тогда, как это можно пофиксить без перезахода?
 
Последнее редактирование:
В чём траблы двигать предметы обычным телепортом ? :/
Как по мне лишняя морока с армор стендами.
Проблема сейчас кроется не в этом. Я рад, что ты бы сделал по-другому, но к теме вопроса это не имеет никакого отношения
 
Проблема сейчас кроется не в этом. Я рад, что ты бы сделал по-другому, но к теме вопроса это не имеет никакого отношения
Как раз таки имеет отношение, зачем создавать лишнее энтити для каждого предмета ? Я тебе предлагаю альтернативный вариант, ты уходишь от ответа.
 
Добавил в код спавна стенда небольшой "дебаг" - вывод пассажира и его локации, вместе с локацией стенда, как мне подсказал @Dymeth
Код:
 /**
     * Spawn armor stand and item entity as passenger on them
     */
    public void spawn() {
        // Item entity settings
        Item item = location.getWorld().dropItem(location, rewardItem.getItemStack());
        item.setTicksLived(Integer.MAX_VALUE);
        item.setCanMobPickup(false);
        item.setGravity(false);
        item.setInvulnerable(true);
        item.setPickupDelay(Integer.MAX_VALUE);
        item.setCustomNameVisible(true);
        item.setCustomName(item.getItemStack().getItemMeta().getDisplayName());

        // Armor stand settings
        armorStand = location.getWorld().spawn(location, ArmorStand.class, as -> {
            as.setVisible(false);
            as.setAI(false);
            as.setCollidable(false);
            as.setGravity(false);
            as.setSmall(true);
            as.setMarker(true);
            as.setInvulnerable(true);
            as.getPassengers().clear();
            as.addPassenger(item);
        });

        System.out.println("passenger: " + armorStand.getPassengers().get(0).getCustomName());
        System.out.println("passenger loc: " + armorStand.getPassengers().get(0).getLocation());
        System.out.println("stand loc: " + location);
    }
Получил следующий результат
Код:
[01:45:50 INFO]: —--— 0 —--—
[01:45:50 INFO]: passenger: DELUXE
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10123.499999956288,y=160.0,z=-10094.5,pitch=0.0,yaw=348.6585}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10123.499999956288,y=160.0,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 1 —--—
[01:45:50 INFO]: passenger: MUSIC BOY
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10122.54894349623,y=159.3090170329201,z=-10094.5,pitch=0.0,yaw=73.25704}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10122.54894349623,y=159.3090170329201,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 2 —--—
[01:45:50 INFO]: passenger: ENCHANTER
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10122.912214936094,y=158.19098286875405,z=-10094.5,pitch=0.0,yaw=33.507187}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10122.912214936094,y=158.19098286875405,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 3 —--—
[01:45:50 INFO]: passenger: HELPER
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10124.0877850832,y=158.19098288277257,z=-10094.5,pitch=0.0,yaw=350.30814}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10124.0877850832,y=158.19098288277257,z=-10094.5,pitch=0.0,yaw=0.0}
[01:45:50 INFO]: —--— 4 —--—
[01:45:50 INFO]: passenger: MULTI
[01:45:50 INFO]: passenger loc: Location{world=CraftWorld{name=world},x=10124.451056570077,y=159.30901682885303,z=-10094.5,pitch=0.0,yaw=184.28891}
[01:45:50 INFO]: stand loc: Location{world=CraftWorld{name=world},x=10124.451056570077,y=159.30901682885303,z=-10094.5,pitch=0.0,yaw=0.0}
[01:46:04 INFO]: [Server] rezero выиграл DELUXE!

p.s. пропал предмет MUSIC BOY

Если перезайти на сервер когда шмотка пропадает, она вновь появляется

Отсюда можно сделать вывод, что баг визуальный? Тогда, как это можно пофиксить без перезахода?
Ядро последнее? Клиент ванильный, актуальный? Есть ли ошибки на клиенте?

На самом деле, гадать можно долго.
Например, удалить использование
item.setTicksLived(Integer.MAX_VALUE)

Или же задавать характеристики предмета в consumer'е при его создании (хотя не уверен, что consumer поддерживается в dropItem).

Ещё можно создавать дропнутый предмет внутри consumer'а спауна стенда.

Ну и, в конце концов, могут помочь обходные пути, предложенные другими участниками темы. Так, например, если избавиться от стендов - система станет технически проще, а значит и шанс возникновения ошибки ниже
 
Как раз таки имеет отношение, зачем создавать лишнее энтити для каждого предмета ? Я тебе предлагаю альтернативный вариант, ты уходишь от ответа.
Мне с телепортацией стенда работать проще
Когда отключаешь гравитацию у дропнутого предмета, он улетает вверх и на него не работают телепорты. Знаю, что скорее всего нужно играться с его велосити, но я в этом не шарю

Да и проблема не уйдет от этого. Прикол в том, что визуально пропадает сам предмет, а не армор стенд. Здесь уже по сути неважно - будет армор стенд или нет, дропнутый айтем все равно будет визуально пропадать, поэтому мне нужен способ как-то обновлять его для игрока
 
Назад
Верх