Да-да, хоть Warten уже сделал некий “тутор”, я дополню. Ибо я буду делать гайд подробным.
Сначала поговорим об IDE. Это спорный вопрос. Уже многие думают, что за IDE можно брать только “Microsoft Visual Studio”, причём не редко спрашивают: “А если у меня MVS Express?”, “А если у меня MVS *Да какой нибудь*”.
За IDE можно взять обычный Notepad++. И не обязательно скачивать 11 ГБ. Но минус блокнота в том, что у него нету подсказок. Поэтому используют IDE. Из них можно использовать эти:
- MonoDevelop [Windows, Mac OS X, Linux]
- Microsoft Visual Studio (Community Edition хватит) [Windows, Mac OS X, Linux]
- CLion (Работает с C/C++, но можно найти те же плагины) (
Платно, но мы пираты…) [Windows, Mac OS X, Linux] - Notepad++ (Ну это если с интернетом всё очень плохо…) [Only Windows]
Сразу скажу – я нормально смог настроить только MVS…
Для того, чтобы начать работать с API нужно:
- tModLoader
- Microsoft-.NET-Framework-4.52/4.6 ( [1.07 Mb] (cкачиваний: 27), [1.43 Mb] (cкачиваний: 29))
- Скачайте XNA Framework ( [6.73 Mb] (cкачиваний: 60))
- Сама IDE (Всё на ваш выбор и вкус)
- Знание (хоть небольшое) C# или Java (C# очень похож синтаксисом на Java)
Сразу для ленивых жоп:
Вот эта штука называется “класс”, основа всего – class.
Вот эта штука называется “размещение класса” – namespace (Альтернатива “package” из Java).
Вот эта штука называется “комментарий”, то-есть некомпилируемые символы – // : коммент для всей строки. /* … */ : коммент для определённого куска с символами. А вот это:
/**
* …
**/
называется указательный комментарий. В C# он, к сожалению, используется как “/* … */” 🙁
Вот эта штука называется “метод” – void.
У каждого метода и переменной есть свой тип:
- public – делает * публичным, то-есть доступным в других классах/private – делает * доступным только в классе в котором он находится
- static – нужен для использования в других методах. Делает * статичным (Не обязателен)
- final – это уже сами учите, в принципе, не так уж и часто это будет нужно
- float – это уже сами учите, в принципе, не так уж и часто это будет нужно
Также после класса можно унаследовать другой класс (чтобы не делать свой велосипед). Делают это так:
public class НазваниеКласса : КлассДляНаследования
{
}
В Java это выглядело бы так:
extends … / implements I…
Кстати о методах! Если вы унаследуете другой класс, то вы можете “брать” методы из других классов, чтобы не изобретать свой велосипед (а вообще, по-другому даже с велосипедами нельзя). Для этого нужно использовать модификатор “override”. Опять же, такая же штука есть в Java. Только там это аннотация “@Override”, что немного удобнее, но ладно.
Пример:
public override void SetDefaults()
{
//Это из класса ModItem (ознакомимся позже). Как раз для этого нужно унаследовать ModItem. К сожалению, всегда можно использовать только 1 класс в качестве "родителя" в C#.
}
if – логический оператор, который проверяет значения.
Пример:
public static boolean isCode;
if(isCode)
{
print("Привет, я код.");
}
else – тоже логический оператор, который проверяет обратное значение
Пример:
public static boolean isCode;
if(isCode)
{
print("Привет, я код.");
}else
{
print("Ну я не код, так что пока детка.");
}
Или:
public static int a = 6;
if(a = 6)
{
print("Я шестёрка :(");
}else
{
print("Я не шестёрка :)");
}
Что ж, начнём моддинг.
Что делать?
А вот что:
- Скачать IDE. Гугл в помощь.
- Скачать tModLoader.
- Скачать XnaFramework (ссылки в начале статьи)
Открываем IDE (В нашем случае MVS. И ДА, МОЖНО ИСПОЛЬЗОВАТЬ ЛЮБЫЕ ВЕРСИИ)
Делаем следующее:
- Нажмите “File” (Файл)
- Нажмите “New” (Новый)
- Нажмите “Project” (Проект)
- Нажмите “Templates” (Шаблоны. По умолчанию это уже сделано)
- Нажмите “Other project types” (Другие типы проектов)
- Нажмите “Visual Studio Solutions” (Решения Visual Studio)
- Название сделайте таким: “Mod Sources” (Без кавычек) и укажите путь к “C:\Users\Ваш_Юзер\Documents\My Games\Terraria\ModLoader” и нажмите “ОК”
- Нажмите по Mod Sources (А он справа) -> New Project (Новый проект) -> Windows -> Classic Desktop (Классический рабочий стол) -> Укажите название проекта в качестве названия вашего мода (Только латыница) -> Нажмите “ОК”
- Нажмите по “References” (А он тоже справа) -> Add reference (Добавить ссылку) -> Overview (Обзор), а дальше:
- Добавьте ваш “пропатченный” Terraria.exe (то-есть, с установленным tModLoader). Чтобы это сделать, просто нажмите “Overview…” (Обзор…) (тот, что снизу)
P.S. Вот “References”:
P.S.S. Вот низ:
Дальше кликните по вашему проекту -> Нажмите “Add” (Добавить) -> Class (Класс).
Откроется окно. Там в окошке для названия впишите “название проекта.cs” (.cs это и есть сам класс).
P.S. Вот:
В классе впишите это:
using Terraria.ModLoader; //Используем библиотеки tModLoader'а.
namespace ВашПроект
{
class ВашеНазвание : Mod //Это и есть унаследование
{
public override /* Вот пример для override */ void SetModInfo(out string name, ref ModProperties properties)
{
name = "НазваниеМода"; //Пишем такое же как и в build.txt
properties.Autoload = true;
properties.AutoloadGores = true;
properties.AutoloadSounds = true;
}
}
}
Дальше создаём где-нибудь файл “build.txt”
Пишем в него следующее:
author = Автор
version = Версия
displayName = Имя для экранизации.
Хоть я и написал это кириллицей, но скажу одно: везде где только можно, нужно писать АНГЛИЙСКИМИ буквами. А в .txt файлах можно использовать и символы типа этих:
“@ ‘ ‘ * ^ : ! ) ( – _ = / +” и т. д.
Загружаем Terraria, а дальше делаем это:
- Компилируем мод
Нажимаем “Build + Reload All”
Видим во вкладке “Mods” следующее:
На “Reload Required” не обращайте внимание, это у меня ошибка есть…
Для начала нажмите по проекту -> “Add” (Добавить) -> “Folder” (Папку) и назовите её – “Items”.
Потом нажмите по созданной папке, потом -> Add (Добавить) -> Class (Класс) -> Назовите его так, как хотите назвать предмет (Без пробелов и чисел).
Внутри класса напишите это (Кстати унаследуйте ModItem):
using Terraria.ID; //Используем либы айди террарии.
using Terraria.ModLoader; //Юзаем любы tML
using Terraria; //Юзаем либы террарии
namespace НазваниеПроекта.Items
{
public class НазваниеПредмета : ModItem
{
public override void SetDefaults()
{
//Здесь параметры
}
public override void AddRecipes()
{
//Здесь крафт
}
}
}
Разберём первый метод (SetDefaults):
Главный параметр это “item”. С помощью него мы можем выбирать параметры предмета.
Пример:
item.name = “Name”;
Я буду сокращать и писать только то, что доступно после “item.”:
name = “Name”; //Имя предмета, string
maxStack = 1; //Максимальное кол-во предметов в стаке, int
value = 12345678; //Стоимость предмета у жителей. 12 – платина, 34 – золото, 56 – серебро, 78 – медь.
width = int; //Ширина текстуры
height = int; //Высота текстуры
toolTip = string; //Надпись под предметом
toolTip2 = string; //Второя строчка этой надписи
rare = int; //Рариететность
expert = bool; //true или false. То-есть показывает надпись у предмета “Expert” + радужный цвет
acessory = bool; //Можно ли одеть как аксессуар
useTime = int; //Время использования предмета. Описываем в тиках. В 1 секунде = 20 тиков.
useAnimation = int; //Время показа текстуры.
useStyle = int; //Как это анимировано: 1 – машем как обычный меч, 2 – используем как зелье, 3 – тычем им как кинжал,
4 – поднимаем руками (Предметы призыва, звезда), 5 – просто держим в руках(Книги, огнестрелы и тд)
item.shoot = int; //Чем предмет стреляет, projectileID, либо mod.ProjectileType (Из мода)
item.shootSpeed = float; //Скорость выстрела. Пример: 3F
Теперь рассмотрим второй метод:
ModRecipe recipe = new ModRecipe(mod); //Регистрируем переменную recipe, говорящая о том, что это рецепт
recipe.AddIngredient(int, int); //Первое – айди предмета, второе – кол-во. Можно написать ItemID вместо айди.
recipe.AddIngredient(null, “название_предмета”, int); //Предмет из мода. int – кол-во.
recipe.AddTile(int); //Говорим, что для рецепта нужно использовать блок… Либо айди, либо TileID.
recipe.AddTile(null, “string”); //Используем тайл из мода
recipe.SetResult(this, int); //Кол-во получаемого предмета. int – кол-во.
recipe.AddRecipe();//Конец рецепта
1:
public override bool Autoload(ref string name, ref string texture, IList
{
equips.Add(EquipType.Wings); //Делаем тип слота в котором может лежать предмет: крылья.
return true;
}
public override void UpdateAccessory(Player player)
{
player.wingTimeMax = 180; //То, сколько тиков мы сможем летать. 1 секунда = 20 тиков (Главное правило всех игр)
}
public override void VerticalWingSpeeds(ref float ascentWhenFalling, ref float ascentWhenRising,
ref float maxCanAscendMultiplier, ref float maxAscentMultiplier, ref float constantAscend) //Все измерения происходящие в этом методе будут рассчитываться на вертикальную скорость.
{
ascentWhenFalling = 0.85f; //Подъём когда падаешь (То с какой скоростью мы поднимемся вверх при падении не использовав крылья до этого)
ascentWhenRising = 0.15f; //Подъём при прыжке
maxCanAscendMultiplier = 1f;
maxAscentMultiplier = 3f;
constantAscend = 0.135f;
//Всё остальное = Google Translate.
}
public override void HorizontalWingSpeeds(ref float speed, ref float acceleration)
{
speed = 9f; //С какой скоростью мы будем лететь по горизонтали.
acceleration *= 2.5f; //Ускорение по горизонтали
}
А в setDefaults пишем это:
item.accessory = true;
А вот примеры текстурок найдите в самой террарии 😉 Это сложнее 🙂
Делаем так:
public override bool CanRightClick()
{
return true; //Можем ли мы делать правый клик на предмет??? В данном случае – дерзайте, ставьте true.
}
public override void RightClick(Player player)
{
player.QuickSpawnItem(ItemID.DirtBlock, 15); //Выпадает земля в кол-ве 15 штук.
player.QuickSpawnItem(ItemID.AnkhShield); //Выпадает 1 щит Анкха.
}
Напомню – это мешочек с дропом. Такие выпадают из боссов обычно. Хотя можно сделать крафт. После использования – сумочка исчезает.
Выглядит код так:
public class ItemDrop : GlobalNPC //Опять же классы можно называть по разному.
{
public override void NPCLoot(NPC npc)
{
if (npc.lifeMax > 5 && npc.value > 0f) //Если у NPC максимальное здоровье больше 5, то выпадает следующий предмет:
{
Item.NewItem((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height, mod.ItemType(“Название_Предмета”));
}
}
}
Пока думаю… всио.
С уважением, FanKar
“Вот эта штука называется «метод» — void.”, дальше можно не читать