Kaynağa Gözat

Created plugin framework

Bepis 7 yıl önce
ebeveyn
işleme
c010b40f93

+ 2 - 2
BepInEx.Patcher/Program.cs

@@ -40,8 +40,8 @@ namespace BepInEx.Patcher
 
 
 
-            IPatchPlugin exitScene = new ExitScenePlugin();
-            exitScene.Patch(assembly);
+            //IPatchPlugin exitScene = new ExitScenePlugin();
+            //exitScene.Patch(assembly);
 
             //IPatchPlugin slider = new SliderPlugin();
             //slider.Patch(assembly);

+ 32 - 3
BepInEx/BepInComponent.cs

@@ -1,14 +1,19 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Text;
+using System.Text.RegularExpressions;
+using TMPro;
 using UnityEngine;
+using UnityEngine.SceneManagement;
 
 namespace BepInEx
 {
     //Adapted from https://github.com/Eusth/IPA/blob/0df8b1ecb87fdfc9e169365cb4a8fd5a909a2ad6/IllusionInjector/PluginComponent.cs
     public class BepInComponent : MonoBehaviour
     {
+        IEnumerable<IUnityPlugin> Plugins;
         private bool quitting = false;
 
         public static BepInComponent Create()
@@ -19,26 +24,50 @@ namespace BepInEx
         void Awake()
         {
             DontDestroyOnLoad(gameObject);
+
+            Plugins = Chainloader.Plugins;
         }
 
         void Start()
         {
             Console.WriteLine("Component ready");
+
+            foreach (IUnityPlugin plugin in Plugins)
+                plugin.OnStart();
+        }
+
+        void OnEnable()
+        {
+            SceneManager.sceneLoaded += LevelFinishedLoading;
+        }
+
+        void OnDisable()
+        {
+            SceneManager.sceneLoaded -= LevelFinishedLoading;
         }
 
         void Update()
         {
-            //Console.WriteLine("Update");
+            foreach (IUnityPlugin plugin in Plugins)
+                plugin.OnUpdate();
         }
 
         void LateUpdate()
         {
-            
+            foreach (IUnityPlugin plugin in Plugins)
+                plugin.OnLateUpdate();
         }
 
         void FixedUpdate()
         {
-            
+            foreach (IUnityPlugin plugin in Plugins)
+                plugin.OnFixedUpdate();
+        }
+
+        void LevelFinishedLoading(Scene scene, LoadSceneMode mode)
+        {
+            foreach (IUnityPlugin plugin in Plugins)
+                plugin.OnLevelFinishedLoading(scene, mode);
         }
 
         void OnDestroy()

+ 9 - 0
BepInEx/BepInEx.csproj

@@ -47,6 +47,10 @@
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
+    <Reference Include="TextMeshPro-1.0.55.56.0b12, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>M:\koikatu\KoikatuTrial_Data\Managed\TextMeshPro-1.0.55.56.0b12.dll</HintPath>
+    </Reference>
     <Reference Include="UnityEngine-original, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>M:\koikatu\KoikatuTrial_Data\Managed\UnityEngine-original.dll</HintPath>
@@ -66,7 +70,12 @@
     <Compile Include="ConsoleUtil\Extensions.cs" />
     <Compile Include="ConsoleUtil\SafeConsole.cs" />
     <Compile Include="Chainloader.cs" />
+    <Compile Include="Internal\DumpScenePlugin.cs" />
+    <Compile Include="Internal\TranslationPlugin.cs" />
+    <Compile Include="Internal\UnlockedInputPlugin.cs" />
+    <Compile Include="IUnityPlugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Utility.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />

+ 14 - 1
BepInEx/Chainloader.cs

@@ -1,4 +1,5 @@
-using ChaCustom;
+using BepInEx.Internal;
+using ChaCustom;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,6 +10,7 @@ namespace BepInEx
     public class Chainloader
     {
         static bool loaded = false;
+        public static IEnumerable<IUnityPlugin> Plugins;
 
         public static void Initialize()
         {
@@ -17,6 +19,17 @@ namespace BepInEx
 
             UnityInjector.ConsoleUtil.ConsoleWindow.Attach();
             Console.WriteLine("Chainloader started");
+
+            List<IUnityPlugin> plugins = new List<IUnityPlugin>();
+            plugins.Add(new DumpScenePlugin());
+            plugins.Add(new TranslationPlugin());
+            plugins.Add(new UnlockedInputPlugin());
+
+            Plugins = plugins;
+
+            UnityInjector.ConsoleUtil.ConsoleWindow.Attach();
+            Console.WriteLine($"{plugins.Count} plugins loaded");
+
             
             BepInComponent.Create();
 

+ 22 - 0
BepInEx/IUnityPlugin.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine.SceneManagement;
+
+namespace BepInEx
+{
+    public interface IUnityPlugin
+    {
+        void OnStart();
+
+        void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode);
+
+
+        void OnUpdate();
+
+        void OnLateUpdate();
+
+        void OnFixedUpdate();
+    }
+}

+ 102 - 0
BepInEx/Internal/DumpScenePlugin.cs

@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using TMPro;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace BepInEx.Internal
+{
+    class DumpScenePlugin : IUnityPlugin
+    {
+        public void OnStart()
+        {
+
+        }
+
+        public void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
+        {
+
+        }
+
+        public void OnFixedUpdate()
+        {
+
+        }
+
+        public void OnLateUpdate()
+        {
+
+        }
+
+        public void OnUpdate()
+        {
+            if (UnityEngine.Event.current.Equals(Event.KeyboardEvent("f8")))
+            {
+                //DumpScene();
+            }
+        }
+
+        static List<string> lines;
+
+        public static void DumpScene()
+        {
+            lines = new List<string>();
+
+            string filename = @"M:\unity-scene.txt";
+
+            Debug.Log("Dumping scene to " + filename + " ...");
+            using (StreamWriter writer = new StreamWriter(filename, false))
+            {
+                foreach (GameObject gameObject in GameObject.FindObjectsOfType<GameObject>())
+                {
+                    if (gameObject.activeInHierarchy)
+                        DumpGameObject(gameObject, writer, "");
+
+                }
+
+                foreach (string line in lines)
+                {
+                    writer.WriteLine(line);
+                }
+            }
+            Debug.Log("Scene dumped to " + filename);
+        }
+
+        private static void DumpGameObject(GameObject gameObject, StreamWriter writer, string indent)
+        {
+            //writer.WriteLine("{0}+{1}+{2}", indent, gameObject.name, gameObject.GetType().FullName);
+
+            foreach (Component component in gameObject.GetComponents<Component>())
+            {
+                DumpComponent(component, writer, indent + "  ");
+            }
+
+            foreach (Transform child in gameObject.transform)
+            {
+                DumpGameObject(child.gameObject, writer, indent + "  ");
+            }
+        }
+
+        private static void DumpComponent(Component component, StreamWriter writer, string indent)
+        {
+            //writer.WriteLine("{0}{1}", indent, (component == null ? "(null)" : component.GetType().FullName));
+            if (component is TextMeshProUGUI)
+            {
+                string text = ((TextMeshProUGUI)component).text;
+
+                if (!text.IsNullOrWhiteSpace()
+                    && !text.Contains("Reset")
+                    && !Regex.Replace(text, @"[\d-]", string.Empty).IsNullOrWhiteSpace())
+                {
+                    if (!lines.Contains(text))
+                        lines.Add(text);
+                }
+            }
+
+        }
+    }
+}

+ 64 - 0
BepInEx/Internal/TranslationPlugin.cs

@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using TMPro;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace BepInEx.Internal
+{
+    public class TranslationPlugin : IUnityPlugin
+    {
+        Dictionary<string, string> translations = new Dictionary<string, string>();
+
+        public TranslationPlugin()
+        {
+            string[] japanese = File.ReadAllLines(Utility.CombinePaths(Utility.ExecutingDirectory, "translation", "japanese.txt"));
+            string[] translation = File.ReadAllLines(Utility.CombinePaths(Utility.ExecutingDirectory, "translation", "translated.txt"));
+
+            for (int i = 0; i < japanese.Length; i++)
+                translations[japanese[i]] = translation[i];
+        }
+
+        public void OnStart()
+        {
+
+        }
+
+        public void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
+        {
+            Translate();
+        }
+
+        public void OnFixedUpdate()
+        {
+            
+        }
+
+        public void OnLateUpdate()
+        {
+            
+        }
+
+        public void OnUpdate()
+        {
+            if (UnityEngine.Event.current.Equals(Event.KeyboardEvent("f9")))
+            {
+                Translate();
+            }
+        }
+
+        void Translate()
+        {
+            foreach (TextMeshProUGUI gameObject in GameObject.FindObjectsOfType<TextMeshProUGUI>())
+            {
+                //gameObject.text = "Harsh is shit";
+
+                if (translations.ContainsKey(gameObject.text))
+                    gameObject.text = translations[gameObject.text];
+            }
+        }
+    }
+}

+ 40 - 0
BepInEx/Internal/UnlockedInputPlugin.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+namespace BepInEx.Internal
+{
+    class UnlockedInputPlugin : IUnityPlugin
+    {
+        public void OnStart()
+        {
+
+        }
+
+        public void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
+        {
+            foreach (UnityEngine.UI.InputField gameObject in GameObject.FindObjectsOfType<UnityEngine.UI.InputField>())
+            {
+                gameObject.characterLimit = 99;
+            }
+        }
+
+        public void OnFixedUpdate()
+        {
+
+        }
+
+        public void OnLateUpdate()
+        {
+
+        }
+
+        public void OnUpdate()
+        {
+
+        }
+    }
+}

+ 17 - 0
BepInEx/Utility.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+
+namespace BepInEx
+{
+    public static class Utility
+    {
+        public static string ExecutingDirectory => Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase).Replace(@"file:\", "");
+
+        //shamelessly stolen from Rei
+        public static string CombinePaths(params string[] parts) => parts.Aggregate(Path.Combine);
+    }
+}