Investycoon Core SDK
Модульный SDK для создания пользовательских плагинов в экосистеме Investycoon.
nuget install InvestycoonCore -Source "GitLab"Обзор
InvestycoonCore позволяет настраивать типы компаний, предметы и их характеристики, а также технологии. Пакет требует .NET 10 без дополнительных зависимостей NuGet.
- Пользовательские типы компаний
- Пользовательские предметы и характеристики
- Расширяемые технологии
Установка
Для начала создайте .NET-решение и подключите InvestycoonCore через NuGet:
nuget install InvestycoonCore -Source "GitLab"
Или скачайте файл .nupkg из официального реестра.
Минимальный пример класса Plugin:
public class CustomPlugin : Plugin
{
public override string Code => "custom-plugin";
public override string Version => "1.0";
public override string Name => "Custom Plugin";
public override string Explanation => "This is a custom plugin";
public override ResourceManager MainResourceManager => new CustomResourceManager();
}
Класс предоставляет свойства Code, Version, Name, Explanation и MainResourceManager для настройки.
Справочник по членам
Абстрактный класс Plugin предоставляет следующие члены. Code, Name, Version, Explanation и MainResourceManager обязательны. Остальные — опциональны и возвращают false или пустой список по умолчанию.
| Член | Тип | Описание |
|---|---|---|
Code |
string |
Уникальный идентификатор плагина, используется внутри системы. |
Name |
string |
Имя, отображаемое в интерфейсе администратора. |
Version |
string |
Версия плагина, отображаемая в InvestycoonSky. |
Explanation |
string |
Описание, отображаемое администраторам. |
MainResourceManager |
ResourceManager |
Менеджер ресурсов для локализации меток. |
ItemIgnoreVanilla |
bool |
Если true, стандартные предметы игры удаляются. По умолчанию: false. |
CompanyTypeIgnoreVanilla |
bool |
Если true, стандартные типы компаний удаляются. По умолчанию: false. |
Items() |
List<Item> |
Возвращает список предметов, предоставляемых плагином. |
CompanyTypes() |
List<CompanyType> |
Возвращает список типов компаний. |
ItemSpecificationTypes() |
List<ItemSpecificationType> |
Возвращает список типов характеристик (качество и т.д.). |
Полный пример плагина:
public sealed class MyPlugin : Plugin
{
public override string Code => "my-plugin";
public override string Version => "1.0";
public override string Name => "My Plugin";
public override string Explanation => "Plugin description.";
public override ResourceManager MainResourceManager
=> Resources.Resources.ResourceManager;
public override bool ItemIgnoreVanilla => true;
public override bool CompanyTypeIgnoreVanilla => true;
public override List<Item> Items() =>
[
new ItemResource(1, "lithium", 20_00).SetMass(25f).SetItemGroup("resource"),
new Item(2, "battery", 2, 10_00).SetMass(0.1f).SetItemGroup("refined"),
];
public override List<CompanyType> CompanyTypes() =>
[
new(1, "tech-company",
nameof(Resources.Resources.TechCompany_Label),
nameof(Resources.Resources.TechCompany_Label))
];
public override List<ItemSpecificationType> ItemSpecificationTypes() =>
[
new(1, "quality", ItemSpecificationTypeEnum.Quality, [10])
];
}
Типы предметов
Выберите тип, соответствующий природе вашего предмета:
Item
Базовый продукт: компонент, производственный товар. Принимает уровень (1–5), влияющий на редкость и прогрессию в игре.
new Item(id: 1, name: "battery", tier: 2, defaultPrice: 10_00)
.SetMass(0.1f)
.SetVolume(0.0001f)
.SetItemGroup("refined");ItemResource
Природный добываемый ресурс. Автоматически устанавливает tier=1, IsDivisible=true и IsStackable=true. Опциональные методы SetRarity() и SetWorldGeneration() настраивают редкость и генерацию карты.
new ItemResource(id: 1, name: "lithium", price: 20_00)
.SetMass(25f)
.SetRarity(ItemRarity.GetByName("ordinary")!);ItemFuel
Потребляемый источник энергии. Установите мощность с помощью SetEnergy().
new ItemFuel(id: 1, code: "atomic-battery", price: 300_00)
.SetEnergy(1_000)
.SetMass(1f);ItemNonPhysical
Цифровой или нематериальный предмет (программное обеспечение, данные). Не имеет массы или объёма.
new ItemNonPhysical(id: 1, code: "program", price: 0);MachineTransformer
Производственная машина с рецептами входа/выхода. Добавляйте рецепты с помощью AddRecipe().
new MachineTransformer(id: 1, code: "factory", price: 10_000_00)
.SetNbInput(2)
.SetNbOutput(1)
.SetDelayBuild(TimeSpan.FromHours(1))
.SetMaxWorkers(3)
.AddRecipe(new MachineRecipeFuel(
"my-recipe", "company-type-code",
inputCapacity: 64, outputCapacity: 12,
inputs: [new RecipeProduct("lithium", 2)],
outputs: [new RecipeProduct("battery", 10)]
));Локализация
Метки в игре (названия предметов, типы компаний, рецепты) переводятся через файлы .resx. Создайте Resources/Resources.resx (English по умолчанию) и Resources/Resources.fr.resx (French).
Настройте ваш .csproj для генерации статического класса-аксессора:
<ItemGroup>
<EmbeddedResource Update="Resources\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
Затем используйте ResourceManager в вашем плагине:
public override ResourceManager MainResourceManager => Resources.Resources.ResourceManager;
Развёртывание плагина в InvestycoonSky
После компиляции плагина администратор сервера выполняет импорт и активацию из InvestycoonSky. Вам не нужно управлять какой-либо инфраструктурой.
1. Соберите ваш плагин в конфигурации Release и отправьте файл .dll администратору сервера:
dotnet publish -c Release
2. Администратор импортирует .dll через InvestycoonSky и может включать или отключать плагин в любое время без перезапуска сервера.
Плагин появляется в InvestycoonSky с его именем, кодом и версией сразу после импорта. Активация и деактивация полностью управляются из интерфейса администратора.
Иллюстрации
Каждый предмет и тип компании может быть связан с изображением PNG, встроенным непосредственно в сборку плагина.
Разместите изображения в следующих папках внутри вашего проекта плагина:
Resources/
└── Images/
├── Items/
│ ├── lithium.png
│ └── battery.png
└── CompanyTypes/
└── tech-company.png
Объявите их как встроенные ресурсы в вашем .csproj:
<ItemGroup>
<EmbeddedResource Include="Resources\Images\**\*" />
</ItemGroup>
Имя файла должно точно совпадать со свойством Name предмета или типа компании (с учётом регистра). При запуске AssertValidItem() выбрасывает ResourceCompilingException, если изображение отсутствует.
Лицензия
Распространяется под лицензией LGPL v3+.
Авторы
Разработано Аланом Бретелем.