Отображение другого предмета в руке вместо настоящего

Версия Minecraft
1.12.2

will0376

Токсичная личность
2,075
55
584
Добра всем. пришла идея в голову - сделать мод, который бы визуально подменял меч в руке на другой предмет(держишь железный меч, но ты и другие видят другой предмет и т.п.)
Но не могу подступиться.
Пытался напрямую в EntityPlayer'e при помощи миксина подменять активный айтем в методе onUpdate игрока, не помогло
Как вариант - можно в тиках игрока(с проверками есс-но) отсылать на сервер нужный айтем и не мучаться.... Но я не допру, как я на других игроках буду подменять этот предмет(да и у себя тоже...)

Идеи?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ееее, хуки повсюду.

Но крч тебе нужен какой-то стейт, привязанный к игроку (каким предметом маскировать текущий, к примеру), причём просинхронизированный по сети, чтобы с любого клиента можно было получить ответ на вопрос "какой предмет сейчас установлен как маскировка у вот этого EntityPlayer".

И потом хукнуть тот несчастный рендер предмета в руке и подменять его там на маскирующий для игрока, которого рендерят.
 
7,099
324
1,510
Можно без хуков. Просто врапаем все модели предметов, которые хотим визуально заменять. Враппер должен через getOverrides отдает модель ,которая в зависимости от стейта возвращать либо квады оригинальной модели, либо фейковой
 
7,099
324
1,510
Есть, и не только игрок, для зомби тут же фичу можно сделать
1591370682328.png
 
7,099
324
1,510
А какая разница? Они все равно перегоняются в запеченные модели(за исключением случая, если ты рендеришь через TEISR)
 
7,099
324
1,510
Сделать обертку для модели - просто и эффективно, почему бы не пойти этим путем? Или рендеришь через TEISR?
 
7,099
324
1,510
CustomModel - это наша, кастомная модель.
В туторе не очень понятно было, поправил
IPerspectiveAwareModel - в 1.12 это IBakedModel
getQuads - метод, возвращающий список квадов
 

will0376

Токсичная личность
2,075
55
584
getQuads - метод, возвращающий список квадов
Так-с, окей. мне WandModel под каждый меч делать придётся? потому-что айтемов тут... много
а что за CustomItemOverrideList?
И сразу вопрос - как мне из айтема эти квады то получить?
рендер айтема полностью на json'ах завязан.

апд. вот чисто из-за того, что я ни разу не занимался этим - хотел хукаться.
 
Последнее редактирование:
7,099
324
1,510
Смотри, при инициализации для каждого итема вызывается ModelLoader#setCustomModelResourceLocation, таким образом каждому(ну или почти каждому) предмету соответствует некий ModelResourceLocation, который является ключем в мапе моделей в майне.
Допустим, ты знаешь его(для своего предмета по-любому знаешь).
Во время события ModelBakeEvent как раз таки доступна мапа ModelResourceLocation->IBakedModel, можно достать или положить в нее модель. В этом месте как раз делается обертка модели(враппер, wrapper)
Обертка - твой экземпляр IBakedModel, поэтому можно реализовать getQuads как угодно.

И сразу вопрос - как мне из айтема эти квады то получить?
Если нужно получить квады для проивзольного итема(например, хочешь по условию возвращать не оригинальные квады, а квады яблока), то примерно так:
Java:
IBakedModel appleModel =
    Minecraft.getMinecraft().getRenderItem()
                .getItemModelWithOverrides(new ItemStack(Items.APPLE), Minecraft.getMinecraft().world, null);

List<BakedQuad> appleQuads=appleModel.getQuads(null, null, 0)//первый аргумент - блокстейт, второй - сторона, для предметов null, третий - рандом
 

will0376

Токсичная личность
2,075
55
584
можно достать или положить в нее модель
ощущаю себя идиотом, ибо не работает нифига...
1591396071372.png
Java:
ModelResourceLocation modelResourceLocation = new ModelResourceLocation(DotHackItems.bladebrandier.getRegistryName().toString());
            IBakedModel existingModel = event.getModelManager().getModel(modelResourceLocation);
            IBakedModel model = new TmpModel(existingModel);
            event.getModelRegistry().putObject(new ModelResourceLocation(Items.IRON_SWORD.getRegistryName().toString()), model);
 
7,099
324
1,510
Вероятно, у модели, используемой для железного меча другой ModelResourceLocation
 

will0376

Токсичная личность
2,075
55
584
другой ModelResourceLocation
ну да. там оказалось Items.IRON_SWORD.getRegistryName(),"inventory"

Апд. Вот только это не то, что надо. каждый игрок может подсунуть свой предмет(в тот-же, к примеру, кастомный слот) и он будет показываться у всех вместо меча...
Т.е. мне на каждого игрока надо рендерить свой предмет в руке...
и всё-таки проще было бы хукнуться куда-то и под каждого игрока изменять...
 
Последнее редактирование:
7,099
324
1,510
Для начала фичу сформулируй. Почему у игрока А меч в руке должен выглядеть как другой предмет? Какой слот за это должен отвечать?
проще было бы хукнуться
Если не хочешь разбираться в теме, то хукнуться в первой подходящее место всегда проще, но это не адаптивно
 
Сверху