1.5.2 Добавление брони (items)

74
0
Решил переделать свои моды, которые делал в CustomStuff 2, так как планирую изменить систему бронирования при помощи своей богатой фантазии)
Кто-нибудь может подсказать, как лучше добавить броню модом, с учетом того, что она не будет крафтиться (выпадание из мобов, награда за квесты, покупка), то есть просто предмет, который можно экипировать, при экипировке дает свойства (броня, доп здоровье, доп урон, и в дальнейшем такие характеристики, как защита от воды, земли,воздуха и т.д.)
Сейчас при добавлении брони требуется материал брони, а так как у меня вечно все через одно место, я даже по гайду не могу сделать этот материал (требует создать класс, создаю - добавляю конструктор и все, дальше не знаю что и куда, в гайде вообще файл не создается).
Вот та строка:
ItemArmor armorHelmet1 = new ArmorHelmet(3200, CastleMain.armorMaterial1, 0, 0); 


Кто может предложить что-нибудь для решения проблемы?
Мод пишется для своего сервера, где не будет использоваться броня из других модов, но будет добавляться таким модом, как CustomNPC.
 
Материал для 1.5.х выглядит приблизительно так:
Код:
public static EnumArmorMaterial armorMaterial1 = EnumHelper.addArmorMaterial("armorMaterial1", 20 , new int[] {10, 25, 10, 5}, 10);
Наверное нужно ещё "(ItemArmor)":
Код:
ItemArmor armorHelmet1 = (ItemArmor) new ArmorHelmet(3200, CastleMain.armorMaterial1, 0, 0);
 
Да, делал так, подчеркивает EnumHelper, создаю класс, и метод (ошибка требует)
В нем стандартно:


Код:
package mods.samael.castlecraft;
import net.minecraft.item.EnumArmorMaterial;

public class EnumHelper {
 public static EnumArmorMaterial addArmorMaterial(String string, int i, int[] js, int j) {
 // TODO Auto-generated method stub
 return null;
 }
}

В итоге краш, что нужно в этом файле менять?
Код:
java.lang.NullPointerException
    at net.minecraft.item.ItemArmor.<init>(ItemArmor.java:50)
    at mods.samael.castlecraft.ArmorHelmet.<init>(ArmorHelmet.java:19)
    at mods.samael.castlecraft.CastleMain.load(CastleMain.java:173)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at cpw.mods.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:494)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventHandler.handleEvent(EventHandler.java:74)
    at com.google.common.eventbus.SynchronizedEventHandler.handleEvent(SynchronizedEventHandler.java:45)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:314)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:296)
    at com.google.common.eventbus.EventBus.post(EventBus.java:267)
    at cpw.mods.fml.common.LoadController.propogateStateMessage(LoadController.java:165)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventHandler.handleEvent(EventHandler.java:74)
    at com.google.common.eventbus.SynchronizedEventHandler.handleEvent(SynchronizedEventHandler.java:45)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:314)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:296)
    at com.google.common.eventbus.EventBus.post(EventBus.java:267)
    at cpw.mods.fml.common.LoadController.distributeStateMessage(LoadController.java:98)
    at cpw.mods.fml.common.Loader.initializeMods(Loader.java:696)
    at cpw.mods.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:213)
    at net.minecraft.client.Minecraft.startGame(Minecraft.java:447)
    at net.minecraft.client.MinecraftAppletImpl.startGame(MinecraftAppletImpl.java:44)
    at net.minecraft.client.Minecraft.run(Minecraft.java:732)
    at java.lang.Thread.run(Unknown Source)
 
Не нужно создавать "EnumHelper", он есть. Его нужно импортировать:
Код:
import net.minecraftforge.common.EnumHelper;
 
Спасибо, исправил, работает, завтра продолжу делать. Если что, напишу в эту тему.
 
Разобрался с добавлением брони, теперь думаю добавить параметры для брони, а именно:
Дополнительное максимальное здоровье
Сопротивление стихиям:
Сопротивление металлу
Сопротивление воздуху
Сопротивление свету
Сопротивление земле
Сопротивление воде

Так же добавить урон от стихий для оружия
Урон металлом
Урон воздухом
Урон светом
Урон землей
Урон водой

По этой формуле будет рассчитываться получаемый урон ЧистыйУрон=Броня-ВходящийУрон+ЗащитаСтихии-УронСтихии;
Сейчас расчет урона происходит в iSpecialArmor, потратив 3 часа и разобравшись более менее в том, как происходит поглощение урона я реализовал ЧистыйУрон=Броня-ВходящийУрон и прочность брони снижается теперь на 1, если Броня<=Урону, теперь царапание брони вреда ей не причинит)

Как можно добавить эти характеристики к броне, оружию и включить их в класс iSpecialArmor?
 
Насчет сопротивления и типов урона смотри в поушенах на огнерезист.
 
Я думал как-то при расчете получаемого урона вызывать информацию о характеристике наносящего урон, в цикле перебирать все типы урона, затем получать информацию о защите от уронов персонажа и дополнять урон их разницей.
Вот именно как можно будет получить эти характеристики я не знаю.
 
Я вот тоже думаю, но не знаю, как лучше реализовать, ведь мод делается для сервера, не нужно ли будет дописывать передачу пакетов?
 
А чё там делать-то? Изи...

Легче просто-напросто заменить ванильное оружие и броню.
 
Ну для кого-то изи, а я голову грею весь день...
То есть как заменить?
 
Сам хз :D
А в 1.5.2 можно исходы менять? Тогда можно просто заменить значение переменных.
 
Да, я этим и занимаюсь, но я даже примерно не представляю, как можно добавить защиту от стихий и урон.
Сейчас исходники покопал, вообще ничего не понятно, поиском по swordDiamond нашел только рецепт крафта, продажу у жителей и вот собственно его объявление

Код:
public static Item swordDiamond = (new ItemSword(20, EnumToolMaterial.EMERALD)).setUnlocalizedName("swordDiamond");
 
Samael, ты хоть пробовал пользоваться эвентом LivingHurtEvent?
 
Делаешь свой меч, даёшь ему переменную или НБТ (Если изменять надо).
Ставишь 
Код:
public static Item swordDiamond = твой меч


Воуля!

Как вариант, можно наносить урон через свой метод, который будет выполнять все действия и наносить чистый урон игроку.

Вот мой костыль:
Код:
    public static int getDamageBulletPlayer(int damage, int typeDamage, ArmorBase[] armor, EntityPlayer player)
    {
        if(armor != null)
        {
            float blockedDamage = 0;
            for(ArmorBase s : armor)
            {
                if(s != null)
                {
                    blockedDamage += s.blockedDamage[typeDamage-1];
                }
            }

            float isDamage = damage*(1-(blockedDamage/100));
            int damageReturn = (int) isDamage;

            for(int i = 0; i < 3; i++)
            {
                ItemStack armor2 = player.getCurrentArmor(i);
                if(armor2 != null)
                {
                    armor2.damageItem((int) (isDamage - damageReturn)*10, player);
                }
            }

            return damageReturn;
        }
        else
        {
            return damage;
        }
    }

Мне уже лень исправлять, по-этому я сделал карту, какое число какому типу урона отвечает.
Но лучше спрессовать все данные в DataDamage, и сделать Enum что-бы не путаться.
 
Мне любыми методами можно делать, хоть ивентами, хоть заменой стандартного, главное, чтобы работало)
 
Назад
Сверху