Сага об удочке

Версия Minecraft
1.7.10
215
1
20
Уже не первый раз попытался создать кастомные удочки (железную, алмазную и так далее), которые бы отличались от ванильной лишь количеством прочности и текстурами. На этот раз зашел дальше, чем до сих пор, но опять наткнулся на камень.

Удочку я создал через расширение класса (extends ItemFishingRod). Создать EntityFishHook при забрасывании удочки нетрудно, но сама энтити живет, основываясь на конкретном итеме - Items.fishing_rod, поэтому я клонировал и EntityFishHook, подменив внутри метода update() Items.fishing_rod на свой итем. После этого удочка смогла забрасываться и стало возможным поймать на нее что-нибудь. Однако, саму энтити видно не было. Гуглёж привёл меня к тому, что я клонировал рендер RenderFish и привязал его к своей клонированной энтити. Это тоже не помогло. После некоторых поисков я добавил свою энтити в EntityRegistry - и энтити, наконец, появилось.
Код:
   // FISH HOOK
 int idFishHook = EntityRegistry.instance().findGlobalUniqueEntityId();
 EntityRegistry.registerGlobalEntityID(Entity_FishHook.class, "RHFishHook", idFishHook);
    EntityRegistry.registerModEntity(Entity_FishHook.class, "RHFishHook", idFishHook, Main.instance, 64, 1, true);

Теперь оно выглядело, как поплавок, падающий в воду. Корректно забрасывалось, корректно вытягивалось назад. Однако и тут остались проблемы, о которых ниже.
1. Поплавок есть, но нет лески. Вообще.
2. Поплавок как будто зависает над водой, а не ложится на нее, как оригинальный. При этом через какое-то время (15-20 секунд) он все-таки ложится, куда надо.
3. При падении в воду оригинала слышен всплеск воды и видны партиклы пузырей на воде. У клона нет ни того, ни другого.
4. При забрасывании удочки текстура самой удочки должна меняться с fishingrod_uncast на fishingrod_cast. Однако, этого не происходит. И я выяснил, почему. В EntityPlayer есть метод getItemIcon, а в нем такой фрагмент:
Код:
if (p_70620_1_.getItem() == Items.fishing_rod && this.fishEntity != null)
        {
            iicon = Items.fishing_rod.func_94597_g();
        }

, который и является условием для подмены текстуры.

Это окончательно подкосило во мне желание реализовывать эту идею. И теперь я хочу сделать другое - у стандартной удочки заменить количество прочности.

Я нашел в Сети такой код:
Код:
Field[] fieldList = ToolMaterial.class.getDeclaredFields(); 
 for (int i = 0; i < fieldList.length; i++) {
 System.out.println("[" + i + "] " + fieldList[ i ]);
 }
 FMLCommonHandler.instance().exitJava(0, true);

С помощью него можно определить приватные значения в классе, а потом вот подобным способом:
Код:
ReflectionHelper.setPrivateValue(ToolMaterial.class, ToolMaterial.STONE, 14, 9);
изменить их.

Теперь вопрос в том, можно ли и как именно использовать этот метод для замены прочности ванильной удочки, если известно, что её прочность задается прямо внутри класса одной строчкой:
Код:
this.setMaxDamage(64);

Как мне поступить?
 
Решение
Что мешает сделать так из любого места твоего кода, например, в postInit?
Код:
Items.fishing_rod.setMaxDamage(9999999);


Можно рефлексией, но это совсем не нужно. Это в очень много раз дольше.
Код:
ReflectionHelper.setPrivateValue(ItemFishingRod.class, Items.fishing_rod, 9999999, "maxDamage");
Что мешает сделать так из любого места твоего кода, например, в postInit?
Код:
Items.fishing_rod.setMaxDamage(9999999);


Можно рефлексией, но это совсем не нужно. Это в очень много раз дольше.
Код:
ReflectionHelper.setPrivateValue(ItemFishingRod.class, Items.fishing_rod, 9999999, "maxDamage");
 
Назад
Сверху