Ну во 1, если тебе нужна таже зачарованная книга, но со своей текстурой - попробуй сделать свой Item, который будет наследовать ItemEnchantedBook и переопредели getIconFromDamage, чтобы была своя текстура. Если ещё нужно будет выключить свечение (типо свечение от зачарованности) у книжки - переопределишь на false метод hasEffect.
Во 2, тебе по любому нужно добавить свой энчант. Тут уже немножно костыльно, но не сложно. Сначала стоит понять, что все энчанты хранятся в массиве Enchantment.enchantmentsList, размер которого 256. Из-за других модов там уже может быть превышен размер, по этому с помощь AccessTransformes снимаешь final модификатор и в коде делаешь что-то вроде
public static final Enchantment myEnchantment;//Тут будет твой чар, инициализировать сразу не советую
//Вот этот код где-то в инициализации можно разместить
boolean found = false;
for(int i = 0; i < Enchantment.enchantmentsList.lenght; i++) {
Enchantment e = Enchantment.enchantmentsList[i];
if(e == null) {
//Нашлась не занятая ячейка.
found = true;
myEnchantment = new ....(i, вес[I]чара, тип[/I]чара); //Тут твой класс чара, наследующий Enchantment, т.к. конструктор защищённый
break;
}
}
if(!found) {
//Если не нашлось места - копируешь массив имеющийся с раширением на +1 слот и суёшь в последний слот свой чар
Enchantment[] newArray = new Enchantment[Enchantment.enchantmentsList.lenght + 1];
System.arraycopy(Enchantment.enchantmentsList, 0, newArray, 0, t.length);
myEnchantment = new ....(t.length, вес[I]чара, тип[/I]чара); //Тут твой класс чара, наследующий Enchantment, т.к. конструктор защищённый
//Если будет вопрос по типу, почему мы не положили чар в массив - то ответ: в конструкторе чара объект сам вставится по id конструктора в массив.
}
//С помощь Configuration требуешь индекс твоего чара (так многие моды делают)
//А в коде просто сразу статично инициализируешь
public static final Enchantment myEnchantment = new ....(config.getInt("enchantID"), вес[I]чара, тип[/I]чара); //Тут твой класс чара, наследующий Enchantment, т.к. конструктор защищённый;
//Было бы также не плохо перед инициализацией добавить проверки длины массива и его расширение при необходимости, как в первом способе. Также стоит учесть, что если попытаться добавить чар по уже занятому индексу в этом способе - игра крашнется и отобразит 2 чара, которые меж собой конфликтуют по ID.
//
После создания своего чара в своём классе чара переопределяешь методы, например canApply и canApplyTogether, чтобы настроить конфликтуемость чаров (как например удача и шёлк, если ванилу смотреть). Также, по дефолту твой чар будет НЕДОСТУПЕН к наложению на обычную чаренную книгу. По этому либо
Enchantment.addToBookList(твой чар);
, но в таком случае можно будет чарить обычные книги из ванилы, либо реализуешь свою механику зачара именно твоей книги с помощью ItemТвоейКниги.addEnchantment(айтемКниги, EnchantmentData/
в ней уровень чара и сам чар/);
Ну и наконец, чтобы твой чар что-то делал - просто слушаешь ивенты и при каких-либо событиях проверяешь, зачарен ли твой инструмент или что-либо ещё на этот чар через
if(EnchantmentHelper.getEnchantmentLevel(myEnchantment.effectId, твой_айтем_для_проверки) > 0) {айтем зачарен, делаем чо-то.}