snk

Как создать различные модификации ?

36 posts in this topic

Понимаю что можно изменить модельки объектов, загрузив свои и т.д...

А как создают такие модификации как например "разблокировка 25 зон..

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

В игре только модельки менять и карты создавать можно. А функции и логику как писать ?

0

Share this post


Link to post
Share on other sites

@Omich,C# )))мм.. разобраться можно :))) спасибо ! 

0

Share this post


Link to post
Share on other sites

Немного потыкался в API, имеющиеся опенсорсные моды и реддит.

 

В общем, на сколько я понял:

  • каждый мод должен лежать в своей подпапке в %AppData%\Local\Colossal Order\Cities_Skylines\Addons\Mods;
  • мод может состоять из файлов исходного кода в подпапке Source, тогда игра сама его откомпилирует (главный файл должен быть одноимённым с папкой и содержать одноимённый главный класс), либо из откомпилированной dll (также одноимённой с папкой);
  • в случае компиляции самой игрой можно использовать библиотеки ICities и UnityEngine из игры, в случае же самостоятельной сборки dll возможности гораздо шире;
  • мод должен содержать одноимённый класс, наследующий IUserMod и может переопределять классы или интерфейсы из библиотеки ICities игры, в них то можно повесить свою логику на различные события игры.

На основе пары примеров я набросал вот такой код для теста (работает только как dll из-за использования библиотеки ColossalFramework):

using ColossalFramework.Plugins;
using ColossalFramework.UI;
using ICities;
using UnityEngine;

namespace TestMod
{
    public class TestMod : IUserMod
    {
        public string Name { get { return "Test mod"; } }
        public string Description { get { return "Test mod"; } }
    }

    public class LoadingExtension : LoadingExtensionBase
    {
        public override void OnLevelLoaded(LoadMode mode)
        {
            var uiView = UIView.GetAView();
            var button = (UIButton)uiView.AddUIComponent(typeof(UIButton));

            button.text = "Test";

            button.width = 100;
            button.height = 30;

            button.normalBgSprite = "ButtonMenu";
            button.disabledBgSprite = "ButtonMenuDisabled";
            button.hoveredBgSprite = "ButtonMenuHovered";
            button.focusedBgSprite = "ButtonMenuFocused";
            button.pressedBgSprite = "ButtonMenuPressed";

            button.textColor = new Color32(255, 255, 255, 255);
            button.disabledTextColor = new Color32(7, 7, 7, 255);
            button.hoveredTextColor = new Color32(7, 132, 255, 255);
            button.focusedTextColor = new Color32(255, 255, 255, 255);
            button.pressedTextColor = new Color32(30, 30, 44, 255);

            button.playAudioEvents = true;
            button.transformPosition = new Vector3(-1.5f, 0.9f);

            button.eventClick += delegate { DebugOutputPanel.AddMessage(PluginManager.MessageType.Warning, "Button clicked!"); };
        }
    }
}

Скомпилированная dll.

При запуске игры оно создаёт в левом верхнем углу экрана кнопку в стиле стандартных кнопок меню, а при её нажатие выводит сообщение в консоль отладки (F7 в игре).

 

LTbRnAs.jpg

Так то, вроде, всё работает. И, похоже, тут нам разработчики дали гораздо большие возможности моддинга, чем в том же Train Fever.

3

Share this post


Link to post
Share on other sites

И, похоже, тут нам разработчики дали гораздо большие возможности моддинга, чем в том же Train Fever.

Ну, вот это уж точно. :D У меня до API, увы, мозгов не хватает, но в плане импорта моделей здесь действительно всё очень просто. Ждём только возможности добавления транспорта.

0

Share this post


Link to post
Share on other sites

@Alex, транспорта, дорог, по которым он ездит и станций, на которых он останавливается. :)

1

Share this post


Link to post
Share on other sites

Если хватает мозгов изучить C#, то и c API разобраться хватит.
@Omich,там есть возможность химичить с логикой поведения траффика? 

0

Share this post


Link to post
Share on other sites

@Bochkarev, пока не знаю, буду копать. По крайней мере, можно получить подробную информацию о каждой машине в игре: её тип, состояние, а главное - путь, по которому она следует. А в пути, вроде, можно и вносить изменения.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

@Alex, а вот с этим всё достаточно просто, поскольку разработчики удосужились создать отвечающий за это интерфейс ILevelUpExtension и соответствующий класс LevelUpExtensionBase.

Он содержит четыре метода:

ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel);
CommercialLevelUp OnCalculateCommercialLevelUp(CommercialLevelUp levelUp, int averageWealth, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel);
IndustrialLevelUp OnCalculateIndustrialLevelUp(IndustrialLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel);
OfficeLevelUp OnCalculateOfficeLevelUp(OfficeLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel);

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

Через параметры передаётся:

  • текущий уровень здания (currentLevel);
  • уровень, к которому оно стремится (поле targetLevel структур *LevelUp);
  • идентификатор здания, по которому можно получить дополнительную информацию о нём через менеджеры;
  • некоторые условия окружающей среды, вроде цены земли;
  • service - судя по всему, условие, из-за которого был вызван метод.

Возвращает метод структуру аналогичную *LevelUp, в которой может изменить уровень, к которому здание стремится.

 

Можно, к примеру, переопределить метод OnCalculateResidentialLevelUp так:

public override ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel)
{
  levelUp.targetLevel = Level.Level1;
  return levelUp;
}

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

 

А вот так можно ограничить рост зданий 3 уровнем:

public override ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel)
{
  if (levelUp.targetLevel > Level.Level3)
    levelUp.targetLevel = Level.Level3;

  return levelUp;
}

Полный скрипт, запрещающий жилым зданиям левелиться выше 3 уровня (у них всего 5 уровней) и другим зданиям выше 2 (у них, вроде, всего 3): http://pastebin.com/b2p49eJG.

Поскольку, кроме ICities там ничего не используется, должно заработать, если просто скопировать код в файл %AppData%\Local\Colossal Order\Cities_Skylines\Addons\Mods\LevelingLimit\Source\LevelingLimit.cs

 

Думаю, можно попробовать переделать это в виде районной политики или т.п., только тут уже придётся привлекать ColossalFramework и делать dll.

3

Share this post


Link to post
Share on other sites

Оп-па, такс такс.

 

А возможна при помощи API реализация функции "историческое здание" как в SC4? Выбираешь здание, тыкаешь там на кнопочку и оно не растёт.

 

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

 

В идеале-то вообще хорошо бы заиметь возможность размещать жилые здания вручную...

2

Share this post


Link to post
Share on other sites

@Alex, так как в метод передаётся идентификатор здания, можно просто хранить идентификаторы "замороженных" зданий и проверять, не входит ли идентификатор здания в их число.

Самое сложное тут - сделать кнопку :D

0

Share this post


Link to post
Share on other sites

Ага, звучит обнадёживающе. :D 

 

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

0

Share this post


Link to post
Share on other sites

@Alex, в общем я пока не нашёл, как:

  • Получить идентификатор выделенного здания;
  • Получить объект этой самой панели, чтобы добавить в неё кнопку. Просто пришпандорить кнопку на экране не представляет проблемы, но выглядеть это будет не очень. Upd. Способ найден.

У меня есть ряд предположений, как это можно сделать, но тестирование этого происходит крайне медленно, так как:

  • Если я запущу одновременно VS и игру, ноут впадает в полный транс, так что игру я перезапускаю;
  • Каждый перезапуск CS занимает минут 15. Пляски с бубном сократили время загрузки игры до 3-5 минут, что вполне приемлемо.

Такие дела.

0

Share this post


Link to post
Share on other sites

10 лет разработки и 4 миллиарда долларов, чтобы узнать, по какому домику кликнул игрок

 

Подвижки есть, кликнутый дом я научился получать рейкастингом. Но пока остаются некоторые не решённые проблемы, например: нельзя просто кликнуть по другому дому - окно информации надо обязательно закрыть и открыть снова, чтобы кнопки в нём обновились.

 

Если кому интересно и не отпугивают подобные косяки, могу скинуть текущую версию. И да, принимаю идеи для модов.

1

Share this post


Link to post
Share on other sites

Ухты! Закинь, постестим :)

 

Так-с, а есть возможность расширить поле зонального здания при создании его в редакторе?

0

Share this post


Link to post
Share on other sites

@Alex, https://yadi.sk/d/P6YidqSQfNWkQ, в окне зональных зданий появляется кнопка рядом с уровнем, позволяющая запретить левелинг. Основная проблема сейчас: если не закрывая окно кликнуть по другому зданию, кнопки остаются связаны с предыдущим зданием. А ещё я пока толком не тестировал, будет ли оно правильно сохраняться/загружаться и не похерит ли сейв, так что к имеющимся городам это не стоит сразу применять. Ну или бекапы наше всё.

На счёт расширения полей под зональные здания пока ничего не знаю, но боюсь, что подобное захардкожено.

0

Share this post


Link to post
Share on other sites

А можно вытянуть кисточки для изменения рельефа из редактора в саму игру?

И можно ли изменить инкремент высоты при строительстве мостов? Там вроде с CiM2 осталось 8 метров, можно его раза в два-четыре уменьшить?

0

Share this post


Link to post
Share on other sites

@Hitzu, насчёт кистей изменения рельефа, думаю, возможно. На счёт мостов хз. Завтра гляну, можно ли с этим что-то сделать.

0

Share this post


Link to post
Share on other sites

@Omich, хахаха щас я буду застраивать всё панельками! :D

 

С сейвами дело такое: оно-то работает, но если поиграв в городе загрузить сейв, или начать новую игру, выйдя в главное меню, кнопки для отключения роста не будет. Нужно выйти на рабочий стол и зайти в игру снова, чтобы появилась. 

 

 

upd: а возможно сделать выбор уровня здания вручную? Захотелось, например, илитную панельку - бахнул 5лвл на участок, и хай растёт

0

Share this post


Link to post
Share on other sites
а возможно сделать выбор уровня здания вручную? Захотелось, например, илитную панельку - бахнул 5лвл на участок, и хай растёт

Возможно.

 

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

1

Share this post


Link to post
Share on other sites

Возможно.

Вот было б неплохо такое тоже сделать. В том моде, что есть, можно ограничить рост, но строиться будет всё равно с 1лвл.

0

Share this post


Link to post
Share on other sites

Кстати, ещё одно: возможно ли сделать инструмент зонирования, при разметке которым будут строиться только моддерские здания?

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.