Advertisement
maordeur

RailTrackSpeedIncreaser

Jun 8th, 2015
429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.45 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using ICities;
  4. using UnityEngine;
  5. using ColossalFramework.UI;
  6.  
  7. namespace RailTrackSpeedIncreaser
  8. {
  9.     public class Mod : LoadingExtensionBase, IUserMod
  10.     {
  11.         private static readonly string _version = "2.2.1";
  12.         private static readonly string _prefix = "RTSI: ";
  13.         private static readonly string _format = "{0} track max speed: {1} km/h";
  14.  
  15.         private Dictionary<ItemClass.SubService, float> _subServiceSpeedMap = new Dictionary<ItemClass.SubService, float>()
  16.         {
  17.             { ItemClass.SubService.PublicTransportMetro, 11.25f },
  18.             { ItemClass.SubService.PublicTransportTrain, 11.25f }
  19.         };
  20.         private Dictionary<NetInfo, float> _prefabSpeedMap = new Dictionary<NetInfo, float>();
  21.         private bool _ingame = false;
  22.  
  23.         #region IUserMod
  24.         public string Name
  25.         {
  26.             get { return "Rail Track Speed Increaser " + _version; }
  27.         }
  28.  
  29.         public string Description
  30.         {
  31.             get { return "Increases the speed of metro and train tracks."; }
  32.         }
  33.         #endregion
  34.  
  35.         #region OnSettingsUI
  36.         private UISlider AddSlider(UIHelperBase parent, string text, ItemClass.SubService subService, string playerPerf)
  37.         {
  38.             var defaultValue = PlayerPrefs.GetFloat(playerPerf, _subServiceSpeedMap[subService]);
  39.             _subServiceSpeedMap[subService] = defaultValue;
  40.             defaultValue *= 40f;
  41.             var uIPanel = ((parent as UIHelper).self as UIComponent).AttachUIComponent(UITemplateManager.GetAsGameObject("OptionsSliderTemplate")) as UIPanel;
  42.             var uILabel = uIPanel.Find<UILabel>("Label");
  43.             uILabel.text = string.Format(_format, text, defaultValue);
  44.             uILabel.autoSize = true;
  45.             uILabel.wordWrap = false;
  46.             var uISlider = uIPanel.Find<UISlider>("Slider");
  47.             uISlider.minValue = 10;
  48.             uISlider.maxValue = 450;
  49.             uISlider.stepSize = 10;
  50.             uISlider.value = defaultValue;
  51.             uISlider.eventValueChanged += (sender, value) =>
  52.             {
  53.                 uILabel.text = string.Format(_format, text, value);
  54.                 value /= 40;
  55.                 PlayerPrefs.SetFloat(playerPerf, value);
  56.                 _subServiceSpeedMap[subService] = value;
  57.                 if (_ingame)
  58.                     UpdateSpeeds(subService);
  59.             };
  60.             return uISlider;
  61.         }
  62.  
  63.         public void OnSettingsUI(UIHelperBase helper)
  64.         {
  65.             var group = helper.AddGroup("Settings");
  66.             var metro = AddSlider(group, "Metro", ItemClass.SubService.PublicTransportMetro, "RTSI_METRO");
  67.             var train = AddSlider(group, "Train", ItemClass.SubService.PublicTransportTrain, "RTSI_TRAIN");
  68.         }
  69.         #endregion
  70.  
  71.         #region LoadingExtensionBase
  72.         public override void OnLevelLoaded(LoadMode mode)
  73.         {
  74.             if (mode != LoadMode.LoadGame && mode != LoadMode.NewGame)
  75.                 return;
  76.  
  77.             UpdateSpeeds();
  78.  
  79.             _ingame = true;
  80.         }
  81.  
  82.         public override void OnLevelUnloading()
  83.         {
  84.             _ingame = false;
  85.             if (_prefabSpeedMap.Count > 0)
  86.             {
  87.                 foreach (var item in _prefabSpeedMap)
  88.                 {
  89.                     try
  90.                     {
  91.                         Debug.Log(_prefix + "Reverting speed of " + item.Key.name + " to " + item.Value);
  92.                         item.Key.m_averageVehicleLaneSpeed = item.Value;
  93.  
  94.                         for (int i = 0; i < item.Key.m_lanes.Length; i++)
  95.                         {
  96.                             var lane = item.Key.m_lanes[i];
  97.                             if (lane != null && lane.m_laneType == NetInfo.LaneType.Vehicle)
  98.                             {
  99.                                 lane.m_speedLimit = item.Value;
  100.                             }
  101.                         }
  102.                     }
  103.                     catch (Exception e)
  104.                     {
  105.                         Debug.LogWarning(_prefix + "Could not revert rail track speed. " + e.Message + Environment.NewLine + e.StackTrace);
  106.                     }
  107.                 }
  108.                 _prefabSpeedMap.Clear();
  109.             }
  110.         }
  111.         #endregion
  112.  
  113.         private void UpdateSpeeds(ItemClass.SubService subService = ItemClass.SubService.None)
  114.         {
  115.             var count = PrefabCollection<NetInfo>.PrefabCount();
  116.             for (int i = 0; i < count; i++)
  117.             {
  118.                 try
  119.                 {
  120.                     var prefab = PrefabCollection<NetInfo>.GetPrefab((uint)i);
  121.                     if (prefab == null)
  122.                         continue;
  123.  
  124.                     var prefabSubService = prefab.GetSubService();
  125.                     var flag = false;
  126.  
  127.                     if (subService == ItemClass.SubService.None)
  128.                         flag = prefab.name.Contains("Track") && (prefabSubService == ItemClass.SubService.PublicTransportMetro || prefabSubService == ItemClass.SubService.PublicTransportTrain);
  129.                     else
  130.                         flag = prefab.name.Contains("Track") && prefabSubService == subService;
  131.  
  132.                     if (flag)
  133.                     {
  134.                         if (prefab.m_lanes == null)
  135.                             continue;
  136.  
  137.                         var maxSpeed = _subServiceSpeedMap[prefabSubService];
  138.                         if (!_ingame)
  139.                         {
  140.                             _prefabSpeedMap.Add(prefab, prefab.m_averageVehicleLaneSpeed);
  141.                             Debug.Log(_prefix + "Increasing speed of " + prefab.name + " to " + maxSpeed);
  142.                         }
  143.  
  144.                         for (int j = 0; j < prefab.m_lanes.Length; j++)
  145.                         {
  146.                             var lane = prefab.m_lanes[j];
  147.                             if (lane != null && lane.m_laneType == NetInfo.LaneType.Vehicle)
  148.                             {
  149.                                 lane.m_speedLimit = maxSpeed;
  150.                             }
  151.                         }
  152.                         prefab.m_averageVehicleLaneSpeed = maxSpeed;
  153.                     }
  154.                 }
  155.                 catch (Exception e)
  156.                 {
  157.                     Debug.LogWarning(_prefix + "Could not increase rail track speed. " + e.Message + Environment.NewLine + e.StackTrace);
  158.                 }
  159.             }
  160.         }
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement