#[Сокровищница]

Менеджер пакетов для Godot

Но не плагин, а вшитый прям в движок

42
Читалка

Стоит оговориться, что речь не просто про Godot как таковой. Потому как я сделал форк Redot'а (форка Godot'а) и там уже в исходниках движка внёс исправления.

Мне показалось странным, что такой базовой вещи, как менеджер пакетов нет в движке из коробки, поэтому я вооружился буквами и пошёл насыпать их в код. В качестве первого этапа разработки подключил АПИ NuGet'а, дальше в будущем планирую добавить добавление пакетов из гита и в последствии, думаю, это будет логично, планирую поднять собственный репозиторий, чтобы хранить там свои какие-то переиспользуемые пакеты или пакеты, предназначенные только для движка.

Вообще, если вы используете для работы не встроенный редактор скриптов, а VS, то стандартного нюгет пакета вполне хватит на первое время, но так как я сморю чуть дальше и чуть глубже, я пошёл по пути собственного инструмента. Дополнительно: я пишу на шарпе, а Годот по умолчанию работает с GDScript и шарп у него подключается отдельно. Я сбилдил свою версию так, чтоб она по умолчанию работала с шарпом.

И так, что же у нас тут по менеджеру пакетов?

В папочке modules/mono/editor/GodotTools/GodotTools/ создаём новую папку нашего инструмента, я назвал её NuGet на текущем этапе. При доработках думаю, переименую уже во что-то более универсальное.

Внутри папки создаётся три файла: NuGetManagerWindow.cs

Класс описывающий окно, наследует и имплементрирует ConfirmationDialog, ISerializationListener. Описать обязательно несколько методов:

public override void _Ready()
        {
            Title = "NuGet Package Manager";
            Size = new Vector2I(800, 600);
            Exclusive = true;

            _apiClient = new NuGetApiClient();

            BuildUI();
            RefreshInstalledPackages();
        }

BuildUI и RefreshInstalledPackages соответственно это не обязательные прям с точки зрения Годота методы, просто я в них вынес нужную мне логику.

Второй класс NuGetPackageInfo - это буквально описание каждого пакета. То есть просто DTO для пакетов с основной информации:

/// <summary>
    /// Represents a NuGet package from search results.
    /// </summary>
    public class NuGetPackageInfo
    {
        [JsonPropertyName("id")]
        public string Id { get; set; } = string.Empty;

        [JsonPropertyName("version")]
        public string Version { get; set; } = string.Empty;

        [JsonPropertyName("description")]
        public string Description { get; set; } = string.Empty;

        [JsonPropertyName("authors")]
        [JsonConverter(typeof(StringOrArrayConverter))]
        public List<string> Authors { get; set; } = new();

        [JsonPropertyName("projectUrl")]
        public string ProjectUrl { get; set; } = string.Empty;

        [JsonPropertyName("iconUrl")]
        public string IconUrl { get; set; } = string.Empty;

        [JsonPropertyName("totalDownloads")]
        public long TotalDownloads { get; set; }

        [JsonPropertyName("versions")]
        public List<NuGetVersionInfo> Versions { get; set; } = new();

        public string AuthorsString => string.Join(", ", Authors);
    }

Ну и NuGetApiClient – логично, что дёргает запросы в сторону нюгета, для получения информации о пакетах.

После того, как мы всё что нужно описали, надо отредактировать GodotSharpEditor.cs и добавить туда ссылку на наше окно, добавить пункт меню и его обработчик для открытия нашего окна

_menuPopup.AddItem("NuGet Packages...".TTR(), (int)MenuOptions.NuGetPackages);
private enum MenuOptions
{
    CreateSln,
    NuGetPackages,
}
private void OpenNuGetManager()
        {
            if (!File.Exists(GodotSharpDirs.ProjectCsProjPath))
            {
                ShowErrorDialog("No C# project found. Create a C# solution first.".TTR());
                return;
            }

            if (_nugetWindow == null)
            {
                _nugetWindow = new NuGetManagerWindow();
                _nugetWindow.SetUnparentWhenInvisible(true);
            }

            EditorInterface.Singleton.PopupDialogCentered(_nugetWindow);
        }

На выходе получаем удобный способ управления внешними пакетами

Если есть упоротые, которые пойти по пути внесения правок в исходники движка, могу поделиться решением и скинуть архив с файликами.

Украшенная рогатка

39

Что?

Да не такая! Вот же она:

Ceratophrys ornata
Ceratophrys ornata

Это лягушка, обитающая в Южной Америке. Из-за огромного рта её также называют Пакманом. Собственно, основное название также отражает внешний вид. Лягушка вся покрыта разноцветными полосами и пятнами, а над глазами у неё есть небольшие выросты, напоминающие рога.

Рогатка очень крупная, размеры достигают 16 см. Прокормиться такому внушительному созданию трудно, так что лягушка обладает исключительной прожорливостью. Она буквально пытается поглотить всё, что видит, вплоть до грызунов, небольших птиц, ящериц и других лягушек. Даже если от этого задохнётся.

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

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

Рукодельничаю #30: Нерегулярная жабья рубрика

37

И вновь всем мяу ква! Думали, раз жабий челлендж завершён, то жаб больше не будет? Как бы не так! Теперь это станет нерегулярной жабьей рубрикой. Ура? Ура!

На самом деле удивляюсь, почему начала не с него – он же буквально первое, что приходит в голову при слове «лягушка». Да и вышивается очень легко: всего 4 цвета ниток, весь бэкстич счётный.

Думаю, никого не удивлю, если скажу, что он тоже стал магнитиком и отправился на мой системный блок к остальным жабкам. Раньше у меня на столе была капибармия (привет @capybarystic), а теперь – жабармия.

Это среда, мои чуваки!

Звуки лис

40

Пока прекрасная @capybarystic показывала нам синичку вспомнилась история про звуки лисы. Поискала в инете наиболее похожие. Осторожно, лиса орет))

►
LISA_-_ZVUK_LISY_ohota_rybalka_(Zvyki.com).mp3
►
Zvuk_lisy_na_mobilnyj_-_AAAA_AAAAAAAAAAAAAAA_(Zvyki.com).mp3
►
Zvuki_lisy_-_Zvuki_izdavaemye_lisoj_(Zvyki.com).mp3

Ну и сама история. Мы иногда ездим в гости к родственникам супруга, это подножье горы Качканар, дом в полувымершей деревне, за забором начинается тайга практически. Нереально красивое место, с кучей животных и птиц.

Зима, вечер, стою на крыльце с мужем, небо в звездах, мороз, тишина полнейшая, красота. И за забором в лесу слышим жуткий крик. Я решила, что кого-то насилуют или убивают, то ли девушку, то ли подростка. Вспоминаем все местные байки и легенды, истории про росомах, которые плачут как дети. Лайка в вольере захлебывается лаем. Крики все ближе.

Зимней фотки не нашла, только летняя. Вот за баней и начинается уже дикий лес.
Зимней фотки не нашла, только летняя. Вот за баней и начинается уже дикий лес.

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

А мы несколько дней искали в интернете кто-то орет в тайге ночью зимой, а потом охотник рассказал: это молодой лисовин зовёт так подругу себе) в общем лисы говорят не только фыр-фыр и тяв-тяв)

Ну и просто красивых фото немножко из тех мест:

Перевал. Дороги идут вдоль нитки труб Помара-Ужгород.
Перевал. Дороги идут вдоль нитки труб Помара-Ужгород.
Гора Качканар
Гора Качканар
Холмик на льду - бобровая хатка, есть у нас развлечение по осени, когда болота подмерзнут, а глубокого снега нет - искать куда переехали бобры за лето) там живет несколько семей, и есть целый город бобриный
Холмик на льду - бобровая хатка, есть у нас развлечение по осени, когда болота подмерзнут, а глубокого снега нет - искать куда переехали бобры за лето) там живет несколько семей, и есть целый город бобриный
Вид с горы Качканар
Вид с горы Качканар
Перевал
Перевал
Выше и ниже по реке живут бобры как раз
Выше и ниже по реке живут бобры как раз

Лисолента

Дайждест за... Какое-то время )))

46

Дорогие граждане Лиспублики! Главный редактор ушел в запой сильно загружен работой, но доблестные корреспонденты продолжают работу и собирают для вас самые актуальные, интересные и невероятные новости:

Главный редактор спивается в подъезде, поэтому, выпуск немного задержался, искренне сосём прощения!


Знаковое событие произошло в субботу!

Гражданам Лиспублики вручили паспорта! Поздравляем!


Хм…


«Страшно, очень страшно! Мы не знаем, что это такое! Если б мы знали что это такое... Мы не знаем, что это такое!»


ВНИМАНИЕ! Объявление!


Лютик вернулся!


А на mArt полетели и автопортреты! @etoshtrudel


Средовская дегустация откладывается на неопределённый срок

…или не откладывается? На дегустационном столе “Sheiße und Stollen” сегодня:

- Лягушка в сырном соусе


- Котёнок…тоже в сырном соусе! (сыра же много не бывает)

- Соус из отборных котят Пиночетовского откорма


Что за шум, а драки нет?

@Kerhan предложил исправить это недоразумение и показал своё секретное оружие


Выбери своего дермодемона супергероя


Врача! У нас ожог сандали! (возможно криминал)


А Картошечке лучше не переходите дорогу! У неё лапы золотые…и паяльник)


Лучшие рецепты для метеоризма!

Читаем и пробуем!

…а также советы про пищевые привычки


Уроки лиспубликанского языка


@Thefoxinmyheart про семейные традиции


@etoshtrudel выяснила, что мы в матрице ибо


А теперь ловите порцию пернатой милоты! @capybarystic и @Thefoxinmyheart позаботились о том, чтобы изолента вам точно пригодилась))


Рубрика нсфв!

Или нет?

И вообще, отберите у главреда компьютер, иначе напишет еще больше гадостей! )))

@Aid314, спасай!

.

.

.

Редакция напоминает, что если вы стали свидетелем уникального поста, невероятно смешного комментария или странного события на сайте - немедленно вызывайте наших корреспондентов @vervolph, @Kukabara, @CircusBirdEli, @Pepels, @kimpokom.

Если вы хотите присоединиться к авторам дайджеста, тегайте редакцию @Лисолента!

За пределами Земли: новые кадры миссии Artemis II

41

Миссия Artemis II вернулась на Землю ещё несколько дней назад, но её фотоархивы остаются настоящей сокровищницей - NASA продолжает публиковать всё новые снимки, сделанные во время облёта Луны.

На этих кадрах запечатлены: наша планета, «выглядывающая» из-за лунного диска, часть космического корабля Orion, солнечное затмение, а также несколько детальных снимков усеянной кратерами обратной стороны Луны.