• Moose

BloodyPenguin

Member
  • Content Count

    22
  • Joined

  • Last Visited

Everything posted by BloodyPenguin

  1. @Avanya Thank you! I also made a page that will eventually list all custom tags for easy access
  2. http://steamcommunity.com/sharedfiles/filedetails/?id=881161181
  3. Mod is available in Steam workshop: http://steamcommunity.com/sharedfiles/filedetails/?id=820157360
  4. Mod is available here: http://steamcommunity.com/sharedfiles/filedetails/?id=818641631
  5. @andreharv What do you think of incorporating @Tim The Terrible's rails into MOM?
  6. @Cool_Z I'm not quite agree with you. Latest ModTools version dumps _a, _c, _i, _n, _s maps using the reverse algorithm of how they were imported in the first place. But for some reason dumping _i map leads to different intensities of grey, compared to what they are supposed to be for vanilla assets. At least I only noticed that for vanilla assets. My current guess is that maybe vanilla assets use different texture format compared to custom ones. I'll look more closely into that later.
  7. Do you get that issue for any asset you dump? Or only for vanilla ones? I have a suspicion, that textures are compressed in a different way for vanilla assets. Because when I dumped vanilla traffic lights, I got wrong illumination values but when I dumped my traffic lights from American Traffic Lights I got correct values.
  8. @andreharv I would call this beta 99% of planned features are there. Most of work is now dedicated to the steel style but concrete style is almost as it will be in release version. Have a good time and have a safe flight!
  9. AleX_BY already made 81-717/714 in both Moscow and Kyiv Metro liveries He'll publish them after MOM is published.
  10. Vehicle makers, is anyone interested in making Siemens Inspiro MOM exclusive train? maybe you, @bsquiklehausen?
  11. @j4lambert For rendered underground track - no, because its length may vary and those doors may stretch unrealistically. For elevated and ground station - it's up to asset makers to make such doors parts of their asset.
  12. Hi! You mentioned moving spawn points in asset editor. That's what my Advanced Building Editor already allows. No extra work is needed. But if you want to add a feature or two to that mod, you're welcome to join its development!
  13. @Igorp133 Of course, that track will be included in the release @j4lambert It's just a custom train by @bsquiklehausen, one among many others
  14. @wasmic As far as I remember, sunken tracks were missing as of the alpha version (I'm looking at you, @andreharv ). But current development version features them and they work with @boformer 's station seamlessly :
  15. Unfortunately I didn't though I unearthed them from the deeps of After Dark
  16. Mod is available here: Steam link
  17. I have them all (and more of the kind) installed but I need even more diversity
  18. Yeah they look awesome But I don't agree with the second part. First, there is no high density in the game (tallest buildings are like 10 floors tall). All HD buildings are really MD. And second, those L5 Brooklyn buildings should be high density unless you make even taller Manhattan HD growables like those on the picture below
  19. Just use Better Bulldozer mod. I've added Props mode to it recently specially for handling your case
  20. In mods we need to call private methods sometimes. But calling private methods with reflection makes some significant performance hit. During today's lunch I came up with this simple stupid technique for invoking private methods that uses Sebastian Schöner's RedirectionHelper. Note that the technique is slightly different for classes and for structs. using System.Reflection; using ICities; namespace TestMod { public class TestMod : IUserMod { public string Name { get { Test(); return "Test mod"; } } public string Description => "Some test mod"; public void Test() { RedirectionHelper.RedirectCalls ( typeof(SomeClassDetour).GetMethod("PublicStaticMethod", BindingFlags.Public | BindingFlags.Static), typeof(SomeClass).GetMethod("PrivateInstanceMethod", BindingFlags.NonPublic | BindingFlags.Instance) ); var classInstance = new SomeClass("private value1"); var arg1 = "method argument1"; //classInstance.PrivateInstanceMethod(arg1); //That's impossible! SomeClassDetour.PublicStaticMethod(classInstance, arg1); //Here we go! RedirectionHelper.RedirectCalls ( typeof(SomeStructDetour).GetMethod("PublicStaticMethod", BindingFlags.Public | BindingFlags.Static), typeof(SomeStruct).GetMethod("PrivateInstanceMethod", BindingFlags.NonPublic | BindingFlags.Instance) ); var structInstance = new SomeStruct("private value2"); var arg2 = "method argument2"; //structInstance.PrivateInstanceMethod(arg2); //That's impossible! SomeStructDetour.PublicStaticMethod(ref structInstance, arg2); //Here we go! } class SomeClass { private readonly string _privateField; public SomeClass(string value) { _privateField = value; } private void PrivateInstanceMethod(string arg) { UnityEngine.Debug.Log($"Class: This is a private method. Private value: {_privateField}. Arg: {arg}"); } } class SomeClassDetour { [MethodImpl(MethodImplOptions.NoInlining)] //to prevent inlining public static void PublicStaticMethod(SomeClass instance, string arg) { //This line is crucial for success! We can't detour empty or too simple methods UnityEngine.Debug.Log($"Class: This is a static method. Instance type: {instance?.GetType().ToString() ?? "Null"}. Arg: {arg}"); } } struct SomeStruct { private readonly string _privateField; public SomeStruct(string value) { _privateField = value; } private void PrivateInstanceMethod(string arg) { UnityEngine.Debug.Log($"Struct: This is a private method. Private value: {_privateField}. Arg: {arg}"); } } struct SomeStructDetour { [MethodImpl(MethodImplOptions.NoInlining)] //to prevent inlining public static void PublicStaticMethod(ref SomeStruct instance, string arg) { //This line is crucial for success! We can't detour empty or too simple methods UnityEngine.Debug.Log($"Struct: This is a static method. Instance type: {instance.GetType()}. Arg: {arg}"); } } } } That gives the following output in output_log on game loading: (Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 65) Class: This is a private method. Private value: private value1. Arg: method argument1 (Filename: C:/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 65) Struct: This is a private method. Private value: private value2. Arg: method argument2 As you see, the private instance method was called successfully. I think it won't be hard for you to figure out by yourself how to apply this technique to properties and to static methods