Итак, есть функция spawn:
public <T extends Entity> T spawn(@NotNull Location location, @NotNull Class<T> clazz, @Nullable Consumer<T> function) throws IllegalArgumentException;
Она создает сущность в мире Minecraft, в предоставленном вами месте Class, который вы предоставляете, и позволяет вам предоставить потребителя перед сущностью на самом деле появился в мире.
Я хотел бы взять уже существующую сущность и установить потребителя равным этому. Я пытаюсь сделать это с помощью:
private <T extends Entity> T cloneEntity(T entity, Location location) {
return (T) location.getWorld().spawn(location, entity.getClass(), clone -> clone = clone.getClass().cast(entity));
}
Компилятору не нравятся мои приведения здесь, и я действительно не уверен, как я могу благополучно в конечном итоге установить потребитель = в существующую сущность. Это в надежде попытаться «клонировать» существующую сущность.
Я добился определенного успеха, выполнив операцию таким образом
@SuppressWarnings({ "unchecked", "rawtypes" })
private <T extends Entity> Entity cloneEntity(T entity, Location location) {
Class clazz = entity.getClass();
return (T) location.getWorld().spawn(location, clazz, clone -> clone = (Entity) entity);
}
Однако потребитель, клон, устанавливается просто универсальный c объект, суперкласс, а не подкласс, поэтому данные теряются или происходит сбой приведения во время выполнения с определенными подклассами.
Как выполнить приведение на законных основаниях?