Разработка аддона для Thaumcraft

1,087
2
Говорю сразу, всё это для 1.7.10!!!
Кхмкхм, начнём. Первое, что мы должны сделать это настроить нашу среду. Я не буду говорить как это делается, потому что это давно не нова и различные люди уже писали как настроить среду для работы с моддингом для Minecraft.
А вот и последовательность:
1. Скачайте нужные файлы! Их можно найти тут.
IV7gqSA.png

2. Зайдите в Eclipse/IntelliJ IDEA. В "Minecraft --> src/main/java" распакуйте всё содержимое архива (Если высказался не так, извините подправьте. Просто вариант тимохи не работает), а теперь зайдите в папку с вашим модом, далее "eclipse", потом "mods". Туда впихиваем deobf версию мода.
9okA1IO.png

NDLvfks.png

3. Создайте Main/Core/**Core/**Main класс для вашего мода.

Всё. Дальше будут спойлеры (О да, те самые лагучие спойлеры на этом сайте :D).

Вкладка делается так:
Код:
package пакетик;

import java.util.HashMap;

import net.minecraft.util.ResourceLocation;
import thaumcraft.api.research.ResearchCategories;

public class * //Вместо "*" пишите название своего класса (Лучше при создании его не изменять). Не имеет "extends". Это класс самой вкладки.
{
  public static final String LM = "LM"; //Не обязательно.

  public static HashMap<String, Object> recipeList = new HashMap();
  public static final ResourceLocation[] backgrounds = new ResourceLocation[]{new ResourceLocation("") /* Местоположение фона для вкладки */, new ResourceLocation("") /* Местоположение фона для вкладки */};

  public static void setupResearchPages() {
      ResearchCategories.registerCategory((String)"LIGHTMAGIC" /* ID вашей вкладки. Обязательно писать большими буквами!!! */, (ResourceLocation)new ResourceLocation("") /* Местоположение иконки вкладки */, (ResourceLocation)backgrounds[0]);
  }
  
}

Код:
//Здесь я объясняю подробнее. Это всё надо в ваш главный класс в "postInit" ([color=#ff3333]Только postInit, ни init, ни preInit, никуда, только в postInit[/color])
      /* Тут ваш класс */./* Тут ваш(и) методы */();
Получаем это :) :
ra43iLB.png
Вот классы:
Код:
 * ConfigBlocks
 * ConfigAspects
 * ConfigResearch
 * ConfigItems
 * ConfigEntities
 * ConfigAspects
Сейчас я объясню что такое ResearchItem и как его использовать.
Код:
    /**
     * Небольшой String отвечающий за "ключ" вашего изучения. Очень уникально. Вместо него пишите String (Текст в двойных ковычках).
     */
    public final String key;
    
    /**
     * Небольшой String отвечающий за то в какой категории (ResearchCategory) будет находиться ваше изучение. Вместо него пишите название вашей/чужой вкладки в двойных кавычках естественно (Можно использовать String)
     */
    public final String category;

    /**
     * Аспектовые пометки. То что вы укажете после них нужно будет потом "изучать" на столике (Normal Mode), требуется указывать кол-во аспектов ведь некоторые пользуются Easy Mode. Пример: new AspectList().add(Aspect.AIR, 4 /* 4 - это кол-во нужных аспектов при Easy Mode, в Normal Mode будет только 1 аспект */)
     */
    public final AspectList tags;
    
    /**
     * Этот String использовать не обязательно ибо он назначает "родителей" (Изучения которые нужно изучить, чтобы только потом можно было изучить другое). Изначально он null - у изучения нету "родителей". Пример ванила Thaumcraft: 'FOCUSFIRE' - .setParents(new String[] { "BASICTHAUMATURGY" }). Мой пример: .setParents(new String[] { "INFUSION", "MM.RINGOFMAGIC" /* Можно использовать несколько "родителей */ })
     */
    public String[] parents = null;
    
    /**
     * Похож на setParents, но линии соединения с изучением в таумономиконе невидима. Естественно изначально он null
     */
    public String[] parentsHidden = null;
    /**
     * Любое изучение привязанное на то которое имеет параметр setSiblings будут автоматически "открываться" если то изучение тоже "открыто". Пример ванила Thaumcraft: setSiblings(new String[] { "JARLABEL" })
     */
    public String[] siblings = null;
    
    /**
     * Горизонтальная позиция иконки изучения. Если "-int", то оно идёт вверх, если "int", то оно идёт вниз.
     */
    public final int displayColumn;

    /**
     * Вертикальная позиция иконки изучения. Если "-int", то оно идёт налево, если "int", то оно идёт направо.
     */
    public final int displayRow;
    
    /**
     * Иконка используемая для этого изучения. [color=#ff3333]ItemStack[/color]. 
     */
    public final ItemStack icon_item;
    
    /**
     *  Иконка используемая для этого изучения. [color=#ff3333]ResourceLocation[/color]. Сразу объясняю - это нужно только для того, чтобы использовать не предмет/блок в качестве иконки, а картинку. Как пример это нужно для зачарований. 
     */
    public final ResourceLocation icon_resource;
    
    /**
     * Насколько большая будет "сетка" в процессе изучения на столике. Минимум 1, максимум 3.
     */
    private int complexity;

    /**
     * Специальное изучение имеющее "шипастые" края. Используются для важных изучений. Но можно использовать и для красоты.
     */
    private boolean isSpecial;
    
    /**
     * Изучение которое можно купить за аспекты (Как в Easy Mode) в Normal Mode.
     */
    private boolean isSecondary;
    
   /**
     * Это показывает, что изучение будет иметь круглые края. Используется для "пассивных" изучений, но можно и просто так. Для 
     */
    private boolean isRound;
    
    /**
     * Делает иконку изучения "квадратной".
     */
    private boolean isStub;
    
    /**
     * Concealed изучения не отображаются в таумономиконе пока не будет изучено его родительское изучение.
     */
    private boolean isConcealed;
    
    /**
     * Спрятанные изучения можно изучить только изучая что-либо таумометром (Ну тут рандом конечно ;)) или фрагментами знаний. 
     */
    private boolean isHidden;
    
    /**
     * Потерянные знания -  это почти спрятанные, только их нельзя изучить с помощью фрагментов знаний, только изучая что-либо таумометром.  
     */
    private boolean isLost;
Сразу говорю писал это не я, а hohserg :)
Для начала создадим класс реакции на действие.
Код:
package;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.wands.IWandTriggerManager;
import thaumcraft.common.items.wands.ItemWandCasting;
import thaumcraft.common.lib.research.ResearchManager;

public class OnWandReaction
 implements IWandTriggerManager//реализуем этот интерфейс
{
 public boolean performTrigger(World world, ItemStack wand, EntityPlayer player, int x, int y, int z, int side, int event)
 {
   if (!world.isRemote && event == 1 && side == 1) {//если игрок кликнул палочкой по блоку, его сторона == 1, индекс события == 1, то можно что-то сделать
          return true
   }
   return false;
 }
}
Далее: нужно зарегистрировать эту реакцию:
Код:
//Главный класс мода, postInit
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event)
{
wandRaction=new OnWandReaction()
WandTriggerRegistry.registerWandBlockTrigger(wandRaction,1/*индекс события*/,YourMod.yourBlock/*наш блок*/,0/*метадата*/)}
 
1,239
2
24
Я за перенос.И дополни еще чем то интересным,тоже хочу интегрировать с таумом
 
586
1
2
Ждём с нетерпением :lol:.
P.S.не бросай проект)))
 
Код:
 @Instance 
 public static Main instance = new Main();

Не надо так. Так надо:
Код:
@Instance(Main.MODID)
public static Main instance;
 
7,099
324
1,510
А зачем делать отдельный класс для вкладки? Там же одним вызовом создается...
 
1,087
2
hohserg написал(а):
А зачем делать отдельный класс для вкладки? Там же одним вызовом создается...
А зачем делать вообще отдельные классы для чего либо? 1. Так удобней. 2. Я вообще не знаю о чём ты ибо то, что ты говоришь это ну вообще не сделать. Хочешь посмотри на чужой код (Не на мой) и убедишься, что делать нужно так.
 
Это не класс вкладки. Это просто вынесенная за пределы главного класса регистрация вкладки.
 
7,099
324
1,510
LeonidM/Dasperal написал(а):
Это не класс вкладки. Это просто вынесенная за пределы главного класса регистрация вкладки.
Вот именно! Зачем это делать? Ни один аддон для таума, исходный код которых я смотрел, не используют такой подход.
 
1,087
2
hohserg написал(а):
LeonidM/Dasperal написал(а):
Это не класс вкладки. Это просто вынесенная за пределы главного класса регистрация вкладки.
Вот именно! Зачем это делать? Ни один аддон для таума, исходный код которых я смотрел, не используют такой подход.
Я же наоборот у многих аддонов видел, что делать надо так. Не знаешь не говори. Это не только регистрация вкладки, но и регистрация изучений в этой вкладке, предметов для излучений в этой вкладке. Теперь ты понял?
P.S. Регистрация вкладок в аддоне это не просто "GameRegistry".
 
7,099
324
1,510
Так раз так и выглядит:
ResearchCategories.registerCategory("",new ResourceLocation(""),new ResourceLocation(""))
var rlist=ResearchCategories.getResearchList("")
rlist.maxDisplayColumn=21
rlist.maxDisplayRow=21
rlist.minDisplayColumn=21
rlist.minDisplayRow=21

Исследования в один массив влезают)
 
1,087
2
hohserg написал(а):
Так раз так и выглядит:
ResearchCategories.registerCategory("",new ResourceLocation(""),new ResourceLocation(""))
var rlist=ResearchCategories.getResearchList("")
rlist.maxDisplayColumn=21
rlist.maxDisplayRow=21
rlist.minDisplayColumn=21
rlist.minDisplayRow=21

Исследования в один массив влезают)
Ох лол где ты это взял? Даже в супер пупер Withcing Gadgets такого нету (А там автор такого намудрил....).
 
7,099
324
1,510
Пардон, это Scala, но на Java не сильно отличается. Открой ForbiddenMagic или TT, я их изучал в основном.
 
1,087
2
hohserg написал(а):
Пардон, это Scala, но на Java не сильно отличается. Открой ForbiddenMagic или TT, я их изучал в основном.
1. Мне они не нрав. 2. Я изучаюсь по Thaumic Bases, Tainted Magic, Witching Gadgets.
 
7,099
324
1,510
А они мне не нравятся:p
 
7,099
324
1,510
FanKar написал(а):
hohserg написал(а):
А они мне не нравятся:p
По-моему это всё уже превращается во флудильню. Перестань. У каждого разные вкусы.
Прости, я чего-то на пустом месте балаган открыл: я тоже исследования в отдельном классе храню, а регистрацию в прокси)
 
Сверху