- 215
- 1
- 20
Уже не первый раз попытался создать кастомные удочки (железную, алмазную и так далее), которые бы отличались от ванильной лишь количеством прочности и текстурами. На этот раз зашел дальше, чем до сих пор, но опять наткнулся на камень.
Удочку я создал через расширение класса (extends ItemFishingRod). Создать EntityFishHook при забрасывании удочки нетрудно, но сама энтити живет, основываясь на конкретном итеме - Items.fishing_rod, поэтому я клонировал и EntityFishHook, подменив внутри метода update() Items.fishing_rod на свой итем. После этого удочка смогла забрасываться и стало возможным поймать на нее что-нибудь. Однако, саму энтити видно не было. Гуглёж привёл меня к тому, что я клонировал рендер RenderFish и привязал его к своей клонированной энтити. Это тоже не помогло. После некоторых поисков я добавил свою энтити в EntityRegistry - и энтити, наконец, появилось.
Теперь оно выглядело, как поплавок, падающий в воду. Корректно забрасывалось, корректно вытягивалось назад. Однако и тут остались проблемы, о которых ниже.
1. Поплавок есть, но нет лески. Вообще.
2. Поплавок как будто зависает над водой, а не ложится на нее, как оригинальный. При этом через какое-то время (15-20 секунд) он все-таки ложится, куда надо.
3. При падении в воду оригинала слышен всплеск воды и видны партиклы пузырей на воде. У клона нет ни того, ни другого.
4. При забрасывании удочки текстура самой удочки должна меняться с fishingrod_uncast на fishingrod_cast. Однако, этого не происходит. И я выяснил, почему. В EntityPlayer есть метод getItemIcon, а в нем такой фрагмент:
, который и является условием для подмены текстуры.
Это окончательно подкосило во мне желание реализовывать эту идею. И теперь я хочу сделать другое - у стандартной удочки заменить количество прочности.
Я нашел в Сети такой код:
С помощью него можно определить приватные значения в классе, а потом вот подобным способом:
изменить их.
Теперь вопрос в том, можно ли и как именно использовать этот метод для замены прочности ванильной удочки, если известно, что её прочность задается прямо внутри класса одной строчкой:
Как мне поступить?
Удочку я создал через расширение класса (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);
Как мне поступить?