Как создать террарию в visual studio
Всем привет, с вами Makkei, и я научу вас создавать моды для такой замечательной игры, как Террария!
Рекомендую использовать Notepad++
1) Скелет мода.
Скелет мода, где и как его получить?
Со скелетом пожалуй всё, нажимаете Generate Mod Skeleton, Profit! Ваш мод скачивается, позже вы кидаете его по пути : C:\Users\Ваш пользователь\Documents\My Games\Terraria\ModLoader\Mod Sources
Из архива кидаете туда файл, должно получиться так:
В папке Документы\My Games\Terraria\ModLoader\Mod Sources и там в папке с вашим модом есть некое кол-во файлов, которые мы и будем разбирать, в папке Items лежат предметы мода, остальные файлы я создам позже, файл: Имя Мода:cs - файл конфигурации и регистрации вашего мода. А файл build.txt служит для указания видимого названия мода, его версии и автора.
Внутри папки Items лежит ваш первый предмет: ExampleItem. Любой предмет требует 2 файла: 1)Файл кода предмета: пример: ExampleItem.cs 2)Файл-спрайт*, должен называться как и предмет. пример: ExampleItem.jpg
* Спрайт здесь и далее означает рисунок или картинку.
Файлы настройки
Коротко о файлах настройки:
Главный файл: Имя мода.cs
На этом с файлами и скелетом всё! Приступаем к созданию вещи!
2)Ваш первый предмет.
Рассмотрим код вашего начального предмета:
Вот мы и рассмотрели ваш первый предмет в папке Items , помните: 1)Предмет и Спрайт должны называться одинаково. 2) В коде предмета есть строчка: public class ExampleItem : ModItem , так вот, в этой строчке слово ExampleItem является ссылкой на файл и спрайт!
Подведём итог: у вас есть файл который называется ExampleItem, в котором в строчке public class ExampleItem : ModItem слово ExampleItem указывает на файл, в которой эта строчка находится, и слово в строчке и имя спрайта и имя файла-кода должно быть одинаковым.
3)Есть нашальника или как сделать верстак.
Код
Для начала, поговорим о том, что нам понадобится новая папка, Tiles, создаём ей в папке с нашим модом. После заходим в нее и там надо создать 2 файла: Спрайт и название вашего верстака, БЕЗ ПРОБЕЛОВ, с расширением файла-кода .сs Это размещаемый объект и его спрайт.
Далее в папке Items создаём папку Placeable, в ней будут лежать размещаемые предметы в виде картинки в инвентаре, следовательно там также будет файл-код и спрайт.
Файл-код ПРЕДМЕТА, а не объекта
Спрайт
Теперь о объекте.
Объект это файл-код и спрайт, которые можно установить в мир. Они находятся в папке Placeble
Вот код ОБЪЕКТА:
Учтите, что розовыми линиями обозначаются границы блока, они не видны. Это и есть Frame.
Вывод: Мы научились создавать верстак, и его тайл
4) NPC
Файл кода.
С НПС будет чуть сложнее, поскольку требуется анимация но приступим!
Для начала создаём в папке нашего мода новую папку: NPCs . В ней будут все нипы и жители. Там два файла: 1)Спрайт с анимацией, ExampleNPC.jpg 2)Файл-код ExampleNPC.cs
A теперь, КОД, этот НИП будет в виде зомби:
Как видно из картинки его анимация состоит из 3-х частей, и по поваду спавна строчка: return spawnInfo.spawnTileY < Main.rockLayer && !Main.dayTime ? 0.5f : 0f; означает что, его спавн выше каменного слоя и НЕ днём, с шансом 0.5 и бонусом 0
Торговец.
А теперь речь зайдёт о торговцах. Они приходят при достижение определённых условий.
Note for MVS 2015: Also creates an invisible .vs folder inside which will show on the build tab, I could ask @bluemagic123 to remove it from the build list but for now simply ignore it.
Instead, you can now list the full .vs in your buildIgnore property inside build.txt like so: buildIgnore = .vs\*
- @blushiemagic (original author of tML)
- Terraria team for these awesome header seperators
- Microsoft for the creation of MVS
Attachments
naphid
Terrarian
Jofairden
Duke Fishron
oh my lovely paint skills
Rhenomaster
Terrarian
The type or namespace name 'Items' does not exist in the namespace 'MyMod' (are you missing an assembly reference?)
How can i fix this Error?
Edit: I already created a folder named Items inside of the Project
Jofairden
Duke Fishron
The type or namespace name 'Items' does not exist in the namespace 'MyMod' (are you missing an assembly reference?)
How can i fix this Error?
Edit: I already created a folder named Items inside of the Project
naphid
Terrarian
oh my lovely paint skills
Jofairden
Duke Fishron
Rhenomaster
Terrarian
Jofairden
Duke Fishron
Can you show me the code you're using? If you have your .cs in an 'Items' folder you use a different namespace.
For example my main .cs file has this namespace: namespace MySuperCoolMod
then my items .cs will use this namespace: namespace MySuperCoolMod.Items
Also make sure you're using the right namespaces at the top of your file, this is what I have in my items .cs files:
Rhenomaster
Terrarian
Jofairden
Duke Fishron
using System;
using Microsoft.Xna.Framework;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
using ExampleMod.Items;
namespace ExampleMod public class ExampleMod : Mod
public override void SetModInfo(out string name, ref string version, ref string author)
name = "Example Mod";
version = "v0.1";
author = "bluemagic123";
>
public override void Load()
SetGlobalItem(new ExampleModItem());
AddItem("Example Sword", new ExampleSword(), "ExampleMod/Items/ExampleSword");
>
public override void AddRecipes()
ModRecipe recipe = new ModRecipe(this);
recipe.AddIngredient(ItemID.DirtBlock);
recipe.SetResult(ItemID.DirtBlock, 999);
recipe.AddRecipe();
recipe = new ModRecipe(this);
recipe.AddIngredient(ItemID.DirtBlock);
recipe.SetResult(ItemID.LifeCrystal, 15);
recipe.AddRecipe();
recipe = new ModRecipe(this);
recipe.AddIngredient(ItemID.DirtBlock);
recipe.SetResult(ItemID.ManaCrystal, 9);
recipe.AddRecipe();
recipe = new ModRecipe(this);
recipe.AddIngredient(ItemID.DirtBlock);
recipe.SetResult(null, "Example Sword");
recipe.AddRecipe();
>
>>
Есть некоторые вещи которые вы должны знать, прежде чем начать моддинг:
Как создать ваш мод (Далее – проект) в MVS
Пользоваться MVS лучше с установленным англ. языком! После установки и запуска у вас откроется начальная страница, закройте ее. Потом сделайте все как в списке.
- Нажмите File -> New -> Project (Templates -> Other project types -> Visual Studio Solutions) назовите его “Mod Sources” (Без кавычек)
- Установите расположение: documents\My Games\Terraria\ModLoader
- Нажмите OK
- Нажмите Add -> New Project -> Windows -> Classic Desktop -> Empty Project
- Впишите название мода (На англ языке, без спец. символов и пробелов)
- Нажмите OK
- Правым кликом по новому проекту (Справа) -> Add -> Class (назовите его так же, как назвали мод)
- Потом напишите код как здесь: (MODNAME – это название вашего мода)
using Terraria.ModLoader; namespace MODNAME < public class MODNAME : Mod < public override void SetModInfo(out string name, ref ModProperties properties) < name = "MODNAME"; properties.Autoload = true; >> > - Теперь создайте простой .txt фаил. Впишите туда эти строки:
author = Это ваш ник, имя, да что угодно, пишите что хотите;
version = версия, любые цифры;
displayName = это название мода которое будет показано в меню, здесь уже можно писать пробелы, спец символы, но нельзя кириллицу! (Русские буквы)
Примерно так: author = NAME version = 0 displayName = MOD NAME - Получившийся build.txt скиньте в ваш проект (Просто перетащите)
- Потом правым кликом на ваш проект -> references -> Add reference (Добавьте библиотеки (.dll) которые скачали, и модифицированный Terraria.exe (С установленным модлоадером, тобишь))
- Вот и все, теперь вы можете запустить террарию и собрать мод во вкладке mod sources, что-бы проверить все ли правильно вы сделали. Если нет то repeat.
- Документация (Англ)
- Пост tModLoader’a на оф. форуме. (Тоже англ. Просьба от автора, не бегите туда спрашивать что либо на русском языке, в большинстве случаев вас там просто проигнорируют)
- ID предметов, тайлов и тд
Создание файлов вашего проекта
Создание предмета:
Совет: Название предмета и текстуры должны быть одинаковыми.
Совет: Вот эта штука “//” называется комментарий, программа игнорирует все что после него написано. И да, сюда можно писать кириллицу.
Сначала создайте папку Items. Просто нажмите правым кликом на ваш проект -> Add -> Create folder. Вообще у папки может быть любое имя, но лучше не будем отходить от канона.
Теперь создайте фаил вашего предмета: правый клик по папке -> Add -> Class. (Shift + Alt + C)
В вашем файле появятся бесполезные директивы using, удалите их. Вместо них добавьте другие, более нужные нам:
using Terraria; //собсно террария
using Terraria.ID; //ID предметов, частиц, нпс и тд
using Terraria.ModLoader; //то с помощью чего мы делаем мод
Далее мы видим имя класса (Вашего предмета, не забудьте переименовать ItemName), добавьте ” : ModItem” после него
class ItemName : ModItem //Мы говорим программе что эта штука – предмет
Потом добавьте SetDefaults
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
>>
Вот и все! Теперь вы можете редактировать свойства предмета.
Вот перечень свойств. (Здесь не всё.)
//int = 1, float = 0.01f, double = 1.00, bool = true или false,
item.name = “Item name”; //имя предмета, которое будет показано в игре.
item.maxStack = 99; //макс. количество, int
item.value = 01020304; //где 01Plat 02Gold 03Silver 04Copper, то есть 1 платина, 2 золота, 3 серебра и 4 копейки, int.
item.consumable = true; //предмет исчезает после использования, bool
item.healLife = 20; //лечит хп, int
item.healMana = 20; //восстанавливает ману, int
item.damage = 20; //урон, int
item.melee = true; //тип урона, вместо него можно написать item.magic, item.ranged, item.summon, item.thrown. bool
item.crit = 20; //шанс крита, int
item.knockBack = 2; //то как далеко летит моб после удара, int
item.mana = 20; // сколько использует маны, int
item.width = 40; // ширина предмета, int
item.height = 40; // высота предмета, int
item.toolTip = “”; // любой текст
item.toolTip2 = “”; // текст
item.rare = 2; //раритетность, int
item.expert = false; // радужный цвет как у экспертных предметов и надпись expert, bool
item.accessory = true; //одевается как акссесуар, bool
item.defense = 20; //сколько дает защиты, int
item.lifeRegen = 5; //регенерация, int
item.manaIncrease = 20; //добавляет макс. маны, int
item.axe = 5;// предмет работает как топор, int * 5
item.hammer = 25; // как молот, int
item.pick = 25; //как кирка, int
item.shoot = ; //чем предмет стреляет, int ID
item.shootSpeed = 10f; //скорость, float
Добавление рецепта:
Для начала нам нужно добавить AddRecipes
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
public override void AddRecipes()
//рецепт пишем сюда
>
>>
Потом добавляем остальное:
ModRecipe recipe = new ModRecipe(mod); //мы говорим что это рецепт
recipe.AddIngredient(ItemID.DirtBlock, 2); //мы добавляем в рецепт блок земли. Можно написать ID
recipe.AddIngredient(ItemID.DirtWall, 8); //стена земли
recipe.AddTile(TileID.WorkBenches); //для крафта нужен верстак
recipe.SetResult(this, 99); //В итоге получаем 99 предметов
recipe.AddRecipe();// конец рецепта
Делаем из предмета аксессуар
Добавляем UpdateAccessory()
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
public override void UpdateAccessory(Player player)
//свойства аксессуара
>
public override void AddRecipes()
//рецепт пишем сюда
>
>>
Свойства аксессуара:
// += добавляет, -= вычитает, *= умножает, /= делит
player.meleeDamage += 10f; //melee урон, float
player.thrownDamage += 10f;//thrown урон, float
player.rangedDamage += 10f;//ranged урон, float
player.magicDamage += 10f; //magic урон, float
player.minionDamage += 10f;//minion урон, float
player.statDefense += 100; // защита, int
player.moveSpeed += 100; // скорость, int
player.maxMinions += 10; // макс. миньены, int
player.lifeRegen += 10; //реген хп, int
player.manaRegen += 10; //реген маны, int
player.waterWalk = true; //ходьба по воде, bool
player.noFallDmg = true; //урон от высоты, bool
player.jumpBoost = true; //выше прыжок, bool
player.lavaImmune = true;//иммун к лаве, bool
player.lifeForce = true; // +20% хп?, bool
player.lifeMagnet = true; // притягивает сердца
player.lifeSteal = 5; //лайфстил, int
player.jumpSpeedBoost = 10; // скорость прыжка, int
player.manaCost -= 10; //цена маны, int
player.nightVision = true; //ночное зрение, bool
player.magicCrit += 10; //int
player.rangedCrit += 10;//int
player.meleeCrit += 10; //int
player.thrownCrit += 10;//int
player. //миньоны не наносят криты
player.dash = 1; //рывок, int
player.dashDelay = 10; //время между рывками, int
player.AddBuff(BuffID.Shine, 5, false); //добавляет бафф, int ID, int TIC, bool
Есть некоторые вещи которые вы должны знать, прежде чем начать моддинг:
Как создать ваш мод (Далее – проект) в MVS
Пользоваться MVS лучше с установленным англ. языком! После установки и запуска у вас откроется начальная страница, закройте ее. Потом сделайте все как в списке.
- Нажмите File -> New -> Project (Templates -> Other project types -> Visual Studio Solutions) назовите его “Mod Sources” (Без кавычек)
- Установите расположение: documents\My Games\Terraria\ModLoader
- Нажмите OK
- Нажмите Add -> New Project -> Windows -> Classic Desktop -> Empty Project
- Впишите название мода (На англ языке, без спец. символов и пробелов)
- Нажмите OK
- Правым кликом по новому проекту (Справа) -> Add -> Class (назовите его так же, как назвали мод)
- Потом напишите код как здесь: (MODNAME – это название вашего мода)
using Terraria.ModLoader; namespace MODNAME < public class MODNAME : Mod < public override void SetModInfo(out string name, ref ModProperties properties) < name = "MODNAME"; properties.Autoload = true; properties.AutoloadGores = true; properties.AutoloadSounds = true; >> > - Теперь создайте простой .txt фаил. Впишите туда эти строки:
author = Это ваш ник, имя, да что угодно, пишите что хотите;
version = версия, любые цифры;
displayName = это название мода которое будет показано в меню, здесь уже можно писать пробелы, спец символы, но нельзя кириллицу! (Русские буквы)
Примерно так: author = NAME version = 0 displayName = MOD NAME - Получившийся build.txt скиньте в ваш проект (Просто перетащите)
- Потом правым кликом на ваш проект -> references -> Add reference (Добавьте библиотеки (.dll) которые скачали, и модифицированный Terraria.exe (С установленным модлоадером, тобишь))
- Вот и все, теперь вы можете запустить террарию и собрать мод во вкладке mod sources, что-бы проверить все ли правильно вы сделали. Если нет то repeat.
- Документация (Англ)
- Пост tModLoader’a на оф. форуме. (Тоже англ. Просьба от автора, не бегите туда спрашивать что либо на русском языке, в большинстве случаев вас там просто проигнорируют)
- ID предметов, тайлов и тд
Создание файлов вашего проекта
Создание предмета:
Совет: Название предмета и текстуры должны быть одинаковыми.
Совет: Вот эта штука “//” называется комментарий, программа игнорирует все что после него написано. И да, сюда можно писать кириллицу.
Сначала создайте папку Items. Просто нажмите правым кликом на ваш проект -> Add -> Create folder. Вообще у папки может быть любое имя, но лучше не будем отходить от канона.
Теперь создайте фаил вашего предмета: правый клик по папке -> Add -> Class. (Shift + Alt + C)
В вашем файле появятся бесполезные директивы using, удалите их. Вместо них добавьте другие, более нужные нам:
using Terraria; //собсно террария
using Terraria.ID; //ID предметов, частиц, нпс и тд
using Terraria.ModLoader; //то с помощью чего мы делаем мод
Далее мы видим имя класса (Вашего предмета, не забудьте переименовать ItemName), добавьте ” : ModItem” после него
class ItemName : ModItem //Мы говорим программе что эта штука – предмет
Потом добавьте SetDefaults
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
>>
Вот и все! Теперь вы можете редактировать свойства предмета.
Вот перечень свойств. (Здесь не всё.)
//int = 1, float = 0.01f, double = 1.00, bool = true или false.
item.name = “Item name”; //имя предмета, которое будет показано в игре.
item.maxStack = 99; //макс. количество, int
item.value = 01020304; //где 01Plat 02Gold 03Silver 04Copper, то есть 1 платина, 2 золота, 3 серебра и 4 копейки, int.
item.consumable = true; //предмет исчезает после использования, bool
item.healLife = 20; //лечит хп, int
item.healMana = 20; //восстанавливает ману, int
item.damage = 20; //урон, int
item.melee = true; //тип урона, вместо него можно написать item.magic, item.ranged, item.summon, item.thrown. bool
item.crit = 20; //шанс крита, int
item.knockBack = 2; //то как далеко летит моб после удара, int
item.mana = 20; // сколько использует маны, int
item.width = 40; // ширина предмета, int
item.height = 40; // высота предмета, int
item.toolTip = “”; // любой текст
item.toolTip2 = “”; // текст
item.rare = 2; //раритетность, int
item.expert = false; // радужный цвет как у экспертных предметов и надпись expert, bool
item.accessory = true; //одевается как акссесуар, bool
item.defense = 20; //сколько дает защиты, int
item.lifeRegen = 5; //регенерация, int
item.manaIncrease = 20; //добавляет макс. маны, int
item.axe = 5;// предмет работает как топор, int / 5
item.hammer = 25; // как молот, int
item.pick = 25; //как кирка, int
item.shoot = ; //чем предмет стреляет, int ID
item.shootSpeed = 10f; //скорость, float
Добавление рецепта:
Для начала нам нужно добавить AddRecipes
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
public override void AddRecipes()
//рецепт пишем сюда
>
>>
Потом добавляем остальное:
ModRecipe recipe = new ModRecipe(mod); //мы говорим что это рецепт
recipe.AddIngredient(ItemID.DirtBlock, 2); //мы добавляем в рецепт блок земли. Можно написать ID
recipe.AddIngredient(ItemID.DirtWall, 8); //стена земли
recipe.AddTile(TileID.WorkBenches); //для крафта нужен верстак
recipe.SetResult(this, 99); //В итоге получаем 99 предметов
recipe.AddRecipe();// конец рецепта
Делаем из предмета аксессуар
Добавляем UpdateAccessory()
public override void SetDefaults() //свойства предмета
//пишем свойства сюда
>
public override void UpdateAccessory(Player player)
//свойства аксессуара
>
public override void AddRecipes()
//рецепт пишем сюда
>
>>
Свойства аксессуара:
// += добавляет, -= вычитает, *= умножает, /= делит
player.meleeDamage += 10f; //melee урон, float
player.thrownDamage += 10f;//thrown урон, float
player.rangedDamage += 10f;//ranged урон, float
player.magicDamage += 10f; //magic урон, float
player.minionDamage += 10f;//minion урон, float
player.statDefense += 100; // защита, int
player.moveSpeed += 100; // скорость, int
player.maxMinions += 10; // макс. миньены, int
player.lifeRegen += 10; //реген хп, int
player.manaRegen += 10; //реген маны, int
player.waterWalk = true; //ходьба по воде, bool
player.noFallDmg = true; //урон от высоты, bool
player.jumpBoost = true; //выше прыжок, bool
player.lavaImmune = true;//иммун к лаве, bool
player.lifeForce = true; // +20% хп?, bool
player.lifeMagnet = true; // притягивает сердца
player.lifeSteal = 5; //лайфстил, int
player.jumpSpeedBoost = 10; // скорость прыжка, int
player.manaCost -= 10; //цена маны, int
player.nightVision = true; //ночное зрение, bool
player.magicCrit += 10; //int
player.rangedCrit += 10;//int
player.meleeCrit += 10; //int
player.thrownCrit += 10;//int
player. //миньоны не наносят криты
player.dash = 1; //рывок, int
player.dashDelay = 10; //время между рывками, int
player.AddBuff(BuffID.Shine, 5, false); //добавляет бафф, int ID, int tic, bool
Надеюсь, все хотя бы раз играли в такую замечательную игрушку, как Terraria, ведь сегодня речь пойдет о ней и о том, как не стоит писать игры с точки зрения безопасности. Если интересно — добро пожаловать под хабракат!
Начнем, пожалуй, с того, что такое Terraria и как она появилась.
Феноменальный успех неизменно пребывающей в разработке «песочницы» Minecraft, уже принесшей Маркусу Персону миллионы, не мог остаться незамеченным. Так и случилось, вскоре появляется на свет Terraria. Занимается разработкой один единственный человек, Эндрю Спинкс, главный дизайнер и по совместительству не менее главный программист.
При взгляде на здешние «восьмибитные» пейзажи услужливое подсознание сразу спешит навесить ярлык «Minecraft в 2D». А что? В рюкзаке — кирка и топор, вокруг — случайно сгенерированные просторы. Цель — копать, строить, убивать, добывать.
Больше вы можете узнать, почитав специальные статьи об этой игре. Ну а хабр требует технической информации.
Как оно работает?
Купив игру, поиграв в нее около двух недель со своими друзьями — она мне немножко наскучила, я решил более детально изучить её структуру. Как особенности структуры — можно использовать в своих целях.
Открываем Terraria.exe, ищем точку входа Main (Program):
Видим забавные строки:
Т.е. если обычный пользователь возьмет файлы игры из папки стима и даст их другу, у которого этого стима нет — игра выдаст ошибку и откажется запускаться.
Для того, чтобы обойти эту «безопасность», достаточно подменить steam_api.dll (откуда импортируются функции) или же можно пересобрать приложение, закоментировав соответствующие строчки. Ведь сам Steam никак не влияет на игру, кроме того, что добавляет туда свой Layout. Но мы пойдем более интересным способом и попробуем даже влиять на саму игру.
Вспомним, что игра написана с использованием — XNA, а значит, у нее должен быть главный класс игры, который наследуется от Microsoft.XNA.Framework.Game, далеко идти не пришлось, это класс Main.
Любая игра, написанная на XNA, имеет в себе, так называемые «компоненты», которые можно туда добавить. Компоненты могут быть как обычными (логика), так и графическими (Drawable).
А теперь давайте подумаем, что можно сделать?
Главный класс у нас Main и он имеет модификатор public (public class Main: Game )!
Чем это грозит? Мы можем создать новое приложение, которые будет импортировать наш Terraria.exe в качестве библиотеки и запустит её, а дальше — можно добавить свой компонент игры, и этот компонент будет иметь почти полный доступ к игре.
Пройдясь еще по всяким классам, увидим, что основная идея этих классов — это индийская версия синглтона статический доступ, который, кстати, тоже public.
Стоило бы придать главному классу модификатор доступа отличный от public, как все бы у нас провалилось.
Потом, я еще раз взглянул на класс Main, у него отсутствовал модификатор sealed, что так же доставило и упростило мне жизнь. Идея стала куда проще: просто унаследоваться от нашего Main.
Создаем новое консольное приложение, подключаем в качестве библиотек Microsoft.Xna.Framework.*, Terraria.exe.
Теперь создадим класс, который будет наследоваться от Main:
Теперь идем в точку входа и заставим запустится наш игровой класс:
Ну и нарисуем что-нибудь, добавим в наш переопределенный Draw:
Результат:
Работает, а значит, мы можем рисовать какие-то данные, например, где находится сундук с пиратскими сокровищами, ведь весь доступ к логике у нас есть.
Ну и напоследок сделаем что-нибудь эффектное, какой-нибудь хак.
У игрока террарии есть одно интересное свойство: ghost, которое превращает игрока в каспера приведение и позволяет проходить сквозь стены и летать по миру (наверняка, фишка для девелопера). Так сделаем же так, чтобы при нажатии и удержании Left Shift — игрок становился злым и коварным.
Идем в метод Update:
Запускаем игру и становимся приведением по клику на шифт:
Как вы понимаете, рисованием текста и другим преферансом — дело тут не ограничивается, на игру можно влиять почти полностью, отдельно надо сказать про кривость синхронизации мультиплеера — все эти изменения им не пресекаются и дают играть на серверах с этими хаками.
Отдельно хочется сказать про класс Player, где есть функция Save/Load, которая позволяет сохранять и загружать игроков соответственно, принимает и отдает она сам класс игрока Player. Т.е. мы можем изменить игрока чуть менее, чем полностью, сохранить его и использовать в игре. Или же, например, сохранить всех игроков на сервере в файлы, а потом закинуть их в папку Players и играть ими.
Всегда используйте модификаторы доступа как надо, а классы, которые конечны — sealed (запрещает наследование). Для таблетки от паранойи верности можно еще и обфусцировать код.
Так же, если реализуете мультиплеер — сделайте достойную синхронизацию и так, чтобы вся логика проверялась на сервере, а в случае резкого несоответствия — отключать игрока. К примеру, как игрок может моментально переместиться из одной точки карты в другую за время, которое меньше секунды? Увы, сервер террарии считает это нормальным.
Эта статья писалась исключительно в ознакомительных целях: как на примере простых модификаторов — можно написать нехилый хак.
Читайте также: