[1.6.4] Свой эффект от зелья

216
6
19
Свой эффект от зелья​


Почему решил сделать этот тутор? Долго в инете искал и подумал что новичкам в моддинге пригодится...
Приступим:

Для начала нужно залезть в главный файл мода и зарегистрировать наш новоиспеченный эффект(stoppingPotion), а так же заранее регистрируем эвент:
Код:
@Mod (modid = "test", name = "Test", version = "0.1")
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public class Main {
    @Instance("test")
    public static Main instance;
    
    public static Potion stoppingPotion;
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
       MinecraftForge.EVENT_BUS.register(new EventHooks()); //Регистрация эвента
        
       stoppingPotion = new StoppingPotion(32 //ID МИНИМАЛЬНОЕ: 32//, false, 0, true).setIconIndex(0, 0).setPotionName("potion.stoppingPotion");                                         
       LanguageRegistry.instance().addStringLocalization("potion.stoppingPotion", "Stopping Effect");
    }
}
        

После чего создаем файл для этого эффекта, в моем случае - StoppingPotion.java и прописываем туда совсем небольшой код:
Код:
public class StoppingPotion extends Potion {
    
    public StoppingPotion(int par1, boolean par2, int par3) {
        super(par1, par2, par3);
    }

    public Potion setIconIndex(int par1, int par2) {
        super.setIconIndex(par1, par2);
        return this;
    }
    
    public boolean isBadEffect() //Этот метод предназначен для
    {                            //выбора - Плохой или хороший этот эффект.
        return true;             //В моем случае - плохой
    }                            //Этот метод можно опустить, если он вам не нужен.
}

А теперь, чтобы указать, что должно происходить при наложении этого эффека (На моба или игрока), нужно зайти в наш, недавно зарегистрированный эвент и написать:
Код:
public class EventHooks {

    @ForgeSubscribe 
    public void onEntityUpdate(LivingUpdateEvent event) {
        if (event.entityLiving.isPotionActive(Main.StoppingPotion)) { //Проверка - Активен ли наш эффект?
                        //Тут  можно написать все что угодно, что будет происходить, когда эффект активен.
            event.entityLiving.setSneaking(true);
                        event.entityLiving.worldObj.spawnParticle("crit", x, y-0.7, z, 0.0d, 0.0d, 0.0d);
        }
        }
}

Так же чтобы зелье регистрировалось, пропишите этот код в главный файл:
(Эта часть кода дает возможность добавлять свои эффекты, без нее у тебя свободных ID для поушенов не будет.)
Код:
    @EventHandler
    public void preinit(FMLPreInitializationEvent event)
    {
        Potion[] potionTypes = null;

        for (Field f : Potion.class.getDeclaredFields()) {
            f.setAccessible(true);
            try {
                if (f.getName().equals("potionTypes") || f.getName().equals("field_76425_a")) {
                    Field modfield = Field.class.getDeclaredField("modifiers");
                    modfield.setAccessible(true);
                    modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL);

                    potionTypes = (Potion[])f.get(null);
                    final Potion[] newPotionTypes = new Potion[256];
                    System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length);
                    f.set(null, newPotionTypes);
                }
            }
            catch (Exception e) {
                System.err.println("Severe error, please report this to the mod author:");
                System.err.println(e);
            }
        }
    }
Все достаточно просто и понятно. Thx for watching!
 
Это можно сделать очень хитрожопо. В методе, который возвращает индекс иконки, биндить свою текстуру инвентаря (смотрите GuiEffectRenderer), а после уже возвращать индекс. Так же делает Biomes-O-Plenty.
[merge_posts_bbcode]Добавлено: 18.05.2015 01:39:05[/merge_posts_bbcode]

Так же очень не люблю par[индекс параметра]. Советую переименовать, очень советую. К комментариям не придираюсь, Но хоть чуть-чуть пояснить про последнее стоит.
 
А мне-ты ты это зачем объясняешь? Пиши в комментарии к коду. Рефлексия это.
 
Рефлекшон - это круто, чё
 
Еще скажи,что для маленького приложения асм лучше рефлексии. Нигде не видел такой штуки,как асм,в других приложениях. Даже крупных
 
Асм - большой хак, рефлесия - маленький хак, зато работает в рантайме. В маленьком приложении не уместно ни то, ни то: если есть доступ ко всему нужному коду, то ни рефлексия, ни модификация классов при запуске не нужны.
 
Назад
Сверху