Terraria

Terraria

412 ratings
Создаем свой мод для Terraria
By HEX: Muhendalf 💜🧡 and 1 collaborators
Первое полноценное русское руководство по созданию мода.
Руководство создавалось в то время когда я сам делал первый мод и разбирался с этим всем в гайдах англоязычных, иногда русских и по туториалам от самих разработчиков tModLoader поэтому любые поправки и вопросы в комментариях важны.
9
2
2
   
Award
Favorite
Favorited
Unfavorite
Основы.
Начало Начал и Первый Предмет

Заходим в террарию с заранее установленным tMod Loader`oм.
Переходим в раздел Mod Sources и там скачиваем все необходимое. Так же, там есть пара англоязычных гайдов от разработчиков tModLoader`a.



Нажимаем Create Mod aka Создать Мод.
Нас перемещает в окно, в которое нужно вписать следующее:



Переведу свои пометки со скриншота сюда и более подробно.

Mod Name (no spaces) Название мода без пробела, т.е название папки и дальнейших важных файлов в этих папках, которые должны содержать название мода, но должны быть одинаковые с папкой. Может отличаться от Mod DisplayName.

Mod Display Name Отображаемое имя в браузере модов или уже в вашей библиотеке скачанных модов. Можно использовать пробелы.

Autroh Автор - Ваш ник .

Basic Sword (no space) Пример первого тестового предмета. Меча. Так же название не должно содержать пробелов.

Сейчас мы создали скелет мода. Руководство пишется с целью показать Русскому сообществу террарии как создавать моды т.к нормальных и полных гайдов на русском я не нашел. Во время создания руководства сам учился делать мод и делал его, если возникли вопросы или есть поправки пишите в комментарии.
Первый предмет.
Мы приближаемся к первому коду!

Переходим в директорию

C:\Users\ВашеИмя\Documents\My Games\Terraria\ModLoader\Mod Sources\DivineRPG\Items

В этой директории пока находится два файла.
Название Вашего меча.cs и Название вашего меча.png
Открываем файл .cs и рассмотрим его.
Основное и то что вам больше всего будет нужно



Описание каждого нужного элемента кода для изменения я дал. Надеюсь в более подробном объяснении не требуется.

Ниже всего выше перечисленного можно найти строки кода о кравте. Разберем их.



Вот что получилось с первым мечем у меня и какой спрайт сделал я.
using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Items { public class RealmSword : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Клинок созданный из выплавленного реалмита."); } public override void SetDefaults() { item.damage = 25; item.melee = true; item.width = 40; item.height = 40; item.useTime = 20; item.useAnimation = 20; item.useStyle = 1; item.knockBack = 6; item.value = 10000; item.rare = 1; item.UseSound = SoundID.Item1; item.autoReuse = true; } public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); recipe.AddIngredient(ItemID.DirtBlock, 10); recipe.AddTile(TileID.WorkBenches); recipe.SetResult(this); recipe.AddRecipe(); } } }
Урон я понизил, цену для продажи торговцу оставил той же так как она меня устрайвает
еще изменил рарность на одну еденицу. Размер спрайта я посчитал для длинного клинка вполне нормальным и нарисовал в тех же размерах. Пока что не изменил кравт предмета так как мы не дошли до момента создания руд и их генерации в мире а мой клинок должен создаваться из накопанной руды "реалмит"



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

Как же создать еще один меч?

В папке Items создаем еще один .cs файл с названием другого меча, и по такому же принципу PNG файл.
Отвечу в заранее на вопрос: "Добавляю в Mod Sources новые вещи а они не появляются. Мод перезагружал." Откройте Mod Sources в самой террарии и нажмите Build & Reload

В след. разделах мы будем разбирать каждый вид предметов по отдельности.
Кирки, топоры, амулеты, метательное и огнестрельное оружие а так же броню и акс. И даже добавим свои биомы, блоки и руды!
Как создавать меч мы разобрались. Меняйте значения, играйтесь и экспериментируйте.
Создание инструментов
Первый инструмент в этом разделе - Кирка.
Начнем с самых легких, и давно знакомых нам шагов, создадим стартовые файлы.
переходим в директорию - C:\Users\Name\Documents\My Games\Terraria\ModLoader\Mod Sources\DivineRPG\Items
В этой директории создаем привычные нам файлы название предмета.cs и спрайт предмета в формате PNG.
Открываем .cs файл и пишем новый код:

using Microsoft.Xna.Framework; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Items { public class RealmPickaxe : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("ОПИСАНИЕ ПРЕДМЕТА"); } public override void SetDefaults() { item.damage = 7; item.melee = true; item.width = 40; item.height = 40; item.useTime = 20; item.useAnimation = 20; item.pick = 80; //МОЩНОСТЬ КИРКИ item.useStyle = 1; item.knockBack = 6; item.value = 10000; item.rare = 1; item.UseSound = SoundID.Item1; item.autoReuse = true; item.useTurn = true; } public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); recipe.AddIngredient(ItemID.Wood, 10); recipe.AddTile(TileID.WorkBenches); recipe.SetResult(this); recipe.AddRecipe(); } } }

Не забывайте менять DivineRPG на свое название мода!
Так же не забудьте сменить мое название кирки на свое!

Переходим ко второму инструменту - Топору.
По старой схеме создаем в папке Items cs и png файлы
Код, к топору таков:

using Microsoft.Xna.Framework; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Items { public class RealmAxe : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Относительно мощный реалмитовый топор."); } public override void SetDefaults() { item.damage = 10; item.melee = true; item.width = 40; item.height = 40; item.useTime = 25; item.useAnimation = 25; item.axe = 40; //Мощность Топора item.useStyle = 1; item.knockBack = 7; item.value = 10000; item.rare = 1; item.UseSound = SoundID.Item1; item.autoReuse = true; item.useTurn = true; } public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); recipe.AddIngredient(ItemID.Wood, 10); recipe.AddTile(TileID.WorkBenches); recipe.SetResult(this); recipe.AddRecipe(); } } }
Кастомое оружие
Кастомный лук
не будем повторятся, надеюсь, вы уже знаете где создавать cs файл :))
Этот код особо не отличается от других, только в этом мы подключаем две новые библиотеки а так же изменим свойства с меча на лук.

using Microsoft.Xna.Framework; using System; using System.Diagnostics; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Items { public class HaliteBow : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Ты ради этого лука завалил того монстра? Весело."); } public override void SetDefaults() { item.damage = 50; item.noMelee = true; //Становится луком item.width = 22; item.height = 44; item.useTime = 30; item.useAnimation = 30; item.useStyle = 5; item.shoot = 10; item.shootSpeed = 5; //скорость полета стрелы item.useAmmo = AmmoID.Arrow; //то чем будет стрелять в нашем случае стрелой item.knockBack = 7; item.value = 90000; item.rare = 5; item.UseSound = SoundID.Item5; item.autoReuse = true; item.useTurn = true; } public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); recipe.AddIngredient(ItemID.Wood, 10); recipe.AddTile(TileID.WorkBenches); recipe.SetResult(this); recipe.AddRecipe(); } } }

using Microsoft.Xna.Framework; using System; using System.Diagnostics; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Weapons { public class HaliteBow : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Ты ради этого лука завалил того монстра? Весело."); } public override void SetDefaults() { item.damage = 50; item.noMelee = true; //Становится луком item.width = 22; item.height = 44; item.useTime = 30; item.useAnimation = 30; item.useStyle = 5; item.shoot = 10; item.shootSpeed = 5; //скорость полета стрелы item.useAmmo = AmmoID.Arrow; //то чем будет стрелять в нашем случае стрелой item.knockBack = 7; item.value = 90000; item.rare = 5; item.UseSound = SoundID.Item5; item.autoReuse = true; item.useTurn = true; }

Cюрикен
Начнем с того что мне нужно разъяснить одну ошибку при создании патрон.
-Почему тут?
- Потому что тут мы будем работать тоже с Projectile.
Ошибка заключается в том что я не сказал в гайде что спрайт текстуры должен находиться и в папке Projectiles и в Weapons.

Приступим же к самому сюрикену.
Создаем в папках Projectile и Weapons Спрайты и .cs файлы.
Сейчас будет пояснение для тех кто делает не сюрикен а копье!



Если вы делаете копье то вам нужно сделать 2 разных спрайта вашего копья.
по диагонали нарисованный для того что бы он так отображался в ячейке быстрого доступа.
Второй для Projectile дабы он летел нормально.
Но так как у нас сюрикен особо мучений не будет.
Продолжаем!

В папке Weapons у нас уже заготовлен .cs файл
напишем код сначала в него.
p.s дабы гайды были не очень длинные я буду помещать код на специальный сайт.
Если что то произойдет со скриптом там в будущем у вас уже будет сурс.

Исходный код сюрикена:
using Microsoft.Xna.Framework; using System; using Terraria.Graphics.Effects; using Terraria.Graphics.Shaders; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Weapons { public class HaliteShuriken : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Нормальная такая игрушка, можно кинуть."); } public override void SetDefaults() { item.damage = 50; item.noMelee = true; item.thrown = true; item.width = 40; item.height = 40; item.useTime = 30; item.useAnimation = 30; item.useStyle = 1; item.shoot = mod.ProjectileType("HaliteShuriken"); item.shootSpeed = 8; item.knockBack = 7; item.value = 90000; item.rare = 5; item.UseSound = SoundID.Item5; item.autoReuse = true; item.useTurn = true; item.maxStack = 999; item.consumable = true; item.noUseGraphic = true; } } }

Так как там ничего для вас нового думаю не стоит объяснять хар-ки.

Теперь перейдем к самому сложному (для меня) к Projectile.
В папочке Projectile у нас уже заготовлен .cs файлик - Редактируем теперь его.

Исходный код Projectile для Сюрикена -
using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Projectile { public class HaliteShuriken : ModProjectile { public override void SetDefaults() { projectile.width = 40; projectile.height = 40; projectile.aiStyle = 1; projectile.friendly = true; projectile.ranged = true; projectile.penetrate = 2; projectile.timeLeft = 600; projectile.extraUpdates = 1; aiType = ProjectileID.Bullet; } public override void AI() { projectile.ai[0] += 1f; if (projectile.ai[0] >= 50f) { projectile.velocity.Y = projectile.velocity.Y + 0.15f; projectile.velocity.X = projectile.velocity.X * 0.99f; } } public override bool OnTileCollide(Vector2 oldveloctiy) { { projectile.Kill(); Main.PlaySound(2, (int)projectile.position.X, (int)projectile.position.Y, 10); } return false; } } }

Объяснения:



На этом все. Следующим будет огнестрельное оружие!



Патроны
Начнем с первого вида боеприпасов - Патроны на огнестрельное оружие
В этом разделе мы первый раз попробуем сделать и познакомимся с Projectile.
Желательно создать отдельную папочку для Projectile, сам из себя он представляет .cs файл и спрайт.


.cs файл у меня выглядит так:
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Terraria; using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Projectile { public class DamagedBullet : ModProjectile { public override void SetStaticDefaults() { ProjectileID.Sets.TrailingMode[projectile.type] = 5; ProjectileID.Sets.TrailCacheLength[projectile.type] = 0; } public override void SetDefaults() { projectile.width = 12; projectile.height = 12; projectile.aiStyle = 1; projectile.friendly = true; projectile.ranged = true; // Дальний бой true - yes false - no projectile.penetrate = 5; projectile.timeLeft = 600; projectile.light = 0.5f; //Освщение при выстреле (наверное) projectile.extraUpdates = 1; aiType = ProjectileID.Bullet; } } }

Projectile мы создали, но этого мало. Помимо этого надо эти патроны сделать предметом.
Поэтому создаем в папке Weapons или в другой удобной для вас .cs файл.

мой же .cs файл выглядит так.

using Terraria.ID; using Terraria.ModLoader; namespace DivineRPG.Weapons { public class DamagedBullet : ModItem { public override void SetStaticDefaults() { // DisplayName.SetDefault("RealmSword"); // By default, capitalization in classnames will add spaces to the display name. You can customize the display name here by uncommenting this line. Tooltip.SetDefault("Ради этих пуль ты убил монстра?."); } public override void SetDefaults() { item.damage = 20; item.ranged = true; item.width = 12; item.height = 12; item.maxStack = 999; //сколько может содержаться в стаке item.consumable = true; item.shoot = mod.ProjectileType("DamagedBullet"); //какой Projectile будет использоваться item.shootSpeed = 5f; //скорость полета пули item.knockBack = 7; //откидывание при попадании item.rare = 4; //Редкость item.ammo = ProjectileID.Bullet; } public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); recipe.AddIngredient(ItemID.Wood, 10); recipe.AddTile(TileID.WorkBenches); recipe.SetResult(this); recipe.AddRecipe(); } } }

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

Папки Projectile и Weapons должны содержать спрайт патрона! (Поправка 06.01.2020)
Создание группы ингредиентов для крафта
Начнём с того, что вообще означает "группа ингредиентов для крафта"?
Тут всё довольно просто, это группа в которой содержатся любые ингредиенты для создания чего либо.

Всё ещё не поняли? Тогда приведу пример:

Вы хотите сделать деревянный предмет, т.е. что-то что делается из древесины, любой древесины, например чтоб этот предмет делался либо из обычной древесины, либо из мрачной, либо из заснеженной, и так далее, любой древесины.

Как это сделать?
Для начала создадим саму группу в основном коде мода
Откройте папку с самим модом, ну там где ещё находятся папки Items, Properties, и так далее.
В этой папке вы должны открыть файл с названием вашего мода.cs

a.akamaihd.net/ugc/1756938568797923975/63D0201E7776EA7A2E34E9EF8B4233772785BC57/?imw=256&&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=false
(у меня мод называется Classes Expansion, у вас будет ваше название)

Открываем этот файл, и скорее всего он у вас будет выглядеть вот так

https://steamuserimages-a.akamaihd.net/ugc/1756938568797932776/0518147F6DCA886EF6D931CE8B16584D606D280A/?imw=256&&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=false

и теперь начнём с подключения библиотек, а именно:
Сверху где написано using Terraria.ModLoader; дописываем сверху ещё это:
using Terraria;
using Terraria.ID;
using ClassesExpansion.Items;
где ClassesExpansion заменяем на название вашего мода ( а именно как у вас названа папка с модом)

А теперь добавляем ещё код с назначением группы ингредиентов
Чтобы это сделать, вставьте код как показано на скриншотах

https://steamuserimages-a.akamaihd.net/ugc/1756938568797999199/3B87AE131C22E4F286CEE76BE5F8D9295424AA8D/?imw=256&&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=false

https://steamuserimages-a.akamaihd.net/ugc/1756938568798006115/5D0F6C21A5B36DD5F78B52E625637C56641F8FAF/?imw=256&&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=false

Вот сам код:
public override void AddRecipeGroups() { RecipeGroup group = new RecipeGroup(() => Lang.misc[37] + "Any wood", new int[] //Any Wood - название группы { ItemType("coolItem"), //Добавление модовых предметов ItemID.Wood, //Добавление ванильных предметов ItemID.RichMahogany, ItemID.Shadewood, ItemID.Ebonwood, ItemID.Pearlwood, ItemID.SpookyWood, ItemID.DynastyWood, ItemID.BorealWood, ItemID.PalmWood, }); RecipeGroup.RegisterGroup("AnyWood", group); //тут Any wood (в рифму) это уже обозначение группы в коде }

Если вы не хотите добавлять кастомный предмет из мода, то либо:
добавьте // перед ItemType("coolItem"),
или просто удалите (вместе с запятой после) и тогда всё норм будет работать.

Так, ну теперь мы добавили группу ингредиентов для крафта, как нам применить эту группу в крафте предмета?

Тут тоже всё просто:
Открываем предмет в который хотите добавить эту группу, листаете вниз до функции, отвечающей за рецепт крафта, и добавляете такую строчку:
recipe.AddRecipeGroup("AnyWood", 10);
где AnyWood - это обозначение группы в коде, о котором я писал.





не забудьте всё сохранить, скомпилировать мод и протестировать, должно получится вот так:


А можно сразу несколько групп сделать?
Да, можно сделать несколько групп, для этого в основном коде, в функции добавления группы ингредиентов допишите ещё группу, как показано на скриншотах





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

Ну и вот результат






Раздел написан RySynth - помощником по гайду
Полезная информация
Один пиксель в террарии равен четырем обычным пикселям (2х2)



Файлы, которые стоит подредактировать полноценному моду.



description - Помните, вопросик в браузере модов при нажатии на который открывалась информация о нем? Так вот, в этом текстовике напишите нужную информацию о своем моде и она будет там отображаться.

Это я позаимствовал с офф. канала дискорда tModLoader`a
Если перевел ошибочно - извините.

Информация, которая пригодится в будущем
Все что пригодится в будущем - Рарность предметов, айди звуков, айди предметов и многое другое

Rare | Редкость вещей[terraria.fandom.com]
тут указана вся информация о рарности предметов, какой цвет на каких предметах используется в террарии, его айди для скрипта.

Свойства предметов
Помните, мы почти в самом начале гайда создавали меч? там была строчка
item.melee она делала так что спрайт становился Оружием ближнего боя т.е мечем
ниже будут строчки как сделать предмет другим и не только :)
_________________________________________________________
item.name (Отображаемое имя)
item.height (Высота)
item.width (Ширина)
item.damage (Урон)
item.melee (Ближний)
item.noMelee (Не ближний)
item.ranged (Стрелковый)
item.consumable (Расходуемый)
item.noUseGraphic (Использует графику)
item.useAnimation (Анимация)
item.useStyle (Стиль)
item.useTime (Скорость использования)
item.knockBack (Отбрасывание)
item.useSound (Звук использования)
item.autoReuse (Авто использование)
item.shoot (Стреляет?)
item.rare (Редкость)
item.shootSpeed (Скорость использования)
item.mana (Потребление маны за использование)
item.magic (Магический)
item.toolTip (Описание)
item.toolTip2 (Описание 2)
item.useAmmo (Какие патроны использует)
item.value (Цена в медных монетах)
item.crit (Шанс крита)
item.accessory (Аксесуар?)
item.lifeRegen (Реген ХП в секунду)
________________________________________________________________
177 Comments
Asigaru_Boy 30 Sep @ 9:39am 
А чо делать если ошибка во время сборки мода zero произошла ошибка
Компиляция мода zero.dll провалилась с 16 ошибками и 0 предупреждениями.
Error: C: \Users \bozko \ OneDrive \Документы\Му
Games\ Terraria\ tModLoader\ModSources\zero\zero.cs(11,12): error CS1061:
"LocalizedText" не содержит определения "SetDefault", и не удалось найти доступный
метод расширения "SetDefault", принимающий тип "LocalizedText" в качестве первого
аргумента (возможно, пропущена директива using или ссылка на сборку).
уёбок 29 Jun @ 12:57am 
а что такое DivineRPG я чёт не догнал, к чему оно относится?
Kурoчкa 27 Jun @ 2:15pm 
Лан всё равно скрипты можно легко исправить но ответь на одно почему никто не делает посохи на призывателя а также броня и аксы?
HEX: Muhendalf 💜🧡  [author] 27 Jun @ 9:14am 
гайд был сделан почти 5 лет назад, че ты хочешь:lunar2019coolpig:
Kурoчкa 27 Jun @ 1:51am 
СПС за скрипты которые не работают
Naw1s 18 Jun @ 11:15pm 
━━━━╮ Это Мемопёс. Помогите
╰┃ ┣▇━▇ Мемопсу прокатиться
 ┃ ┃  ╰━▅╮ через гайды в стим вставляя
 ╰┳╯ ╰━━┳╯ его в другие
  ╰╮ ┳━━╯ гайды иначе он
 ▕▔▋ ╰╮╭━╮ не станет псом-мемом
╱▔╲▋╰━┻┻╮╲╱▔▔▔╲
▏  ▔▔▔▔▔▔▔  O O┃
╲╱▔╲▂▂▂▂╱▔╲▂▂▂╱
 ▏╳▕▇▇▕ ▏╳▕▇▇▕
 ╲▂╱╲▂╱ ╲▂╱╲▂╱
𝐟𝐮𝐝𝐤𝐚_ 16 Jun @ 3:06am 
для тех, кто смотрит это в 2024 году и не понимает как изменить количество получаемых объектов, все просто, достаточно в строке Recipe recipe = CreateRecipe(); в душках написать то число, сколько объектов вы хотите видеть на выходе.
К примеру: Recipe recipe = CreateRecipe(10);
polskibieluga 17 Mar @ 11:40pm 
Автор, можешь дать курсы которые проходил, если не сложно? Буду очень благодарен
Nikitos 14 Feb @ 3:02am 
это си шарп или другое
AroJan 1 Jan @ 3:11pm 
Да, кто не понял, чтобы делать ноимальные моды, нужно знать С# как я. Кому надо - могу скинуть годный видеокурс на С#.