snk

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

36 сообщений в этой теме

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

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

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если будете разбираться - сделайте пожалуйста заодно перевод статьи про API в нашу Вики 
http://wiki.citiesskylines.ru/index.php?title=API_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B4%D0%B8%D0%BD%D0%B3%D0%B0

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Немного потыкался в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

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

2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Такие дела.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

 

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

0

Поделиться сообщением


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

Возможно.

 

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возможно.

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу