Ejemplo n.º 1
0
        public static void Configure()
        {
            var settings = ThunderKitSettings.GetOrCreateSettings <ThunderKitSettings>();

            LoadGame(settings);

            if (string.IsNullOrEmpty(settings.GamePath) || string.IsNullOrEmpty(settings.GameExecutable))
            {
                return;
            }

            SetBitness(settings);
            EditorUtility.SetDirty(settings);

            if (!CheckUnityVersion(settings))
            {
                return;
            }

            var packageName = Path.GetFileNameWithoutExtension(settings.GameExecutable);

            AssertDestinations(packageName);

            GetReferences(packageName, settings);
            EditorUtility.SetDirty(settings);

            SetupPackageManifest(settings, packageName);

            AssetDatabase.Refresh();
        }
Ejemplo n.º 2
0
        private static void SetupPackageManifest(ThunderKitSettings settings, string packageName)
        {
            var name            = packageName.ToLower().Split(' ').Aggregate((a, b) => $"{a}{b}");
            var fileVersionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(settings.GamePath, settings.GameExecutable));
            var unityVersion    = new Version(fileVersionInfo.FileVersion);
            var author          = new Author
            {
                name = fileVersionInfo.CompanyName,
            };
            var packageManifest     = new PackageManagerManifest(author, name, packageName, "1.0.0", $"{unityVersion.Major}.{unityVersion.Minor}", $"Imported Assets from game {packageName}");
            var packageManifestJson = JsonUtility.ToJson(packageManifest);

            File.WriteAllText(Combine("Packages", packageName, "package.json"), packageManifestJson);
        }
Ejemplo n.º 3
0
        private static bool CheckUnityVersion(ThunderKitSettings settings)
        {
            var regs = new Regex("(\\d\\d\\d\\d\\.\\d+\\.\\d+).*");

            var unityVersion = regs.Replace(Application.unityVersion, match => match.Groups[1].Value);

            var playerVersion = FileVersionInfo.GetVersionInfo(Path.Combine(settings.GamePath, settings.GameExecutable)).ProductVersion;

            playerVersion = regs.Replace(playerVersion, match => match.Groups[1].Value);

            var versionMatch = unityVersion.Equals(playerVersion);

            Debug.Log($"Unity Editor version ({unityVersion}), Unity Player version ({playerVersion}){(versionMatch ? "" : ", aborting setup.\r\n\t Make sure you're using the same version of the Unity Editor as the Unity Player for the game.")}");
            return(versionMatch);
        }
Ejemplo n.º 4
0
        private static void LoadGame(ThunderKitSettings settings)
        {
            string currentDir      = Directory.GetCurrentDirectory();
            var    foundExecutable = !string.IsNullOrEmpty(settings.GamePath) &&
                                     Directory.GetFiles(settings.GamePath ?? currentDir, Path.GetFileName(settings.GameExecutable)).Any();

            while (!foundExecutable)
            {
                string path = EditorUtility.OpenFilePanel("Open Game Executable", currentDir, "exe");
                if (string.IsNullOrEmpty(path))
                {
                    return;
                }
                settings.GameExecutable = Path.GetFileName(path);
                settings.GamePath       = Path.GetDirectoryName(path);
                foundExecutable         = Directory.GetFiles(settings.GamePath, settings.GameExecutable).Any();
            }
            EditorUtility.SetDirty(settings);
        }
Ejemplo n.º 5
0
        private static void GetReferences(string packageName, ThunderKitSettings settings)
        {
            Debug.Log("Acquiring references");
            var blackList = AppDomain.CurrentDomain.GetAssemblies()
                            .Where(asm => !asm.IsDynamic)
                            .Select(asm => Path.GetFileName(asm.Location))
                            .ToArray();

            var managedPath        = Path.Combine(settings.GamePath, $"{Path.GetFileNameWithoutExtension(settings.GameExecutable)}_Data", "Managed");
            var pluginsPath        = Path.Combine(settings.GamePath, $"{Path.GetFileNameWithoutExtension(settings.GameExecutable)}_Data", "Plugins");
            var packagePath        = Path.Combine("Packages", packageName);
            var packagePluginsPath = Path.Combine(packagePath, "plugins");

            var managedAssemblies = Directory.EnumerateFiles(managedPath, "*.dll").ToArray();
            var plugins           = Directory.EnumerateFiles(pluginsPath, "*.dll").ToArray();

            GetReferences(packageName, packagePath, managedAssemblies, blackList);
            GetReferences(packageName, packagePluginsPath, plugins, Enumerable.Empty <string>());
        }
Ejemplo n.º 6
0
        private static void GetReferences(string packageName, ThunderKitSettings settings)
        {
            Debug.Log("Acquiring references");
            var blackList = AppDomain.CurrentDomain.GetAssemblies()
#if NET_4_6
                            .Where(asm => !asm.IsDynamic)
#else
                            .Where(asm =>
            {
                if (asm.ManifestModule is System.Reflection.Emit.ModuleBuilder mb)
                {
                    return(!mb.IsTransient());
                }

                return(true);
            })
#endif
                            .Select(asm =>
            {
                try
                {
                    return(Path.GetFileName(asm.Location));
                }
                catch
                {
                    return(string.Empty);
                }
            })
                            .ToArray();

            var managedPath        = Combine(settings.GamePath, $"{Path.GetFileNameWithoutExtension(settings.GameExecutable)}_Data", "Managed");
            var pluginsPath        = Combine(settings.GamePath, $"{Path.GetFileNameWithoutExtension(settings.GameExecutable)}_Data", "Plugins");
            var packagePath        = Path.Combine("Packages", packageName);
            var packagePluginsPath = Path.Combine(packagePath, "plugins");

            var managedAssemblies = Directory.GetFiles(managedPath, "*.dll");
            var plugins           = Directory.GetFiles(pluginsPath, "*.dll");

            GetReferences(packagePath, managedAssemblies, blackList);
            GetReferences(packagePluginsPath, plugins, Enumerable.Empty <string>());
        }
Ejemplo n.º 7
0
        public static void SetBitness(ThunderKitSettings settings)
        {
            var assembly = Path.Combine(settings.GamePath, settings.GameExecutable);

            using (var stream = File.OpenRead(assembly))
                using (var binStream = new BinaryReader(stream))
                {
                    stream.Seek(0x3C, SeekOrigin.Begin);
                    if (binStream.PeekChar() != -1)
                    {
                        var e_lfanew = binStream.ReadInt32();
                        stream.Seek(e_lfanew + 0x4, SeekOrigin.Begin);
                        var cpuType = binStream.ReadUInt16();
                        if (cpuType == 0x8664)
                        {
                            settings.Is64Bit = true;
                            return;
                        }
                    }
                }
            settings.Is64Bit = false;
        }
Ejemplo n.º 8
0
        public static void Execute()
        {
            var settings = ThunderKitSettings.GetOrCreateSettings <ThunderKitSettings>();

            var gamePath           = settings.GamePath;
            var gameName           = Path.GetFileNameWithoutExtension(settings.GameExecutable);
            var gameMonoPath       = Path.Combine(gamePath, $"MonoBleedingEdge");
            var gameDataPath       = Path.Combine(gamePath, $"{gameName}_Data");
            var gameManagedPath    = Path.Combine(gameDataPath, "Managed");
            var gameBootConfigFile = Path.Combine(gameDataPath, "boot.config");

            var editorPath            = Path.GetDirectoryName(EditorApplication.applicationPath);
            var windowsStandalonePath = Combine(editorPath, "Data", "PlaybackEngines", "windowsstandalonesupport");

            var gamePlayer = Path.Combine(gamePath, $"{gameName}.exe");

            var monoString       = settings.Is64Bit ? "win64_development_mono" : "win32_development_mono";
            var crashHandlerFile = settings.Is64Bit ? "UnityCrashHandler64.exe" : "UnityCrashHandler32.exe";
            var playerPdbFile    = settings.Is64Bit ? "UnityPlayer_Win64_development_mono_x64.pdb" : "UnityPlayer_Win32_development_mono_x86.pdb";
            var playerReleasePdb = settings.Is64Bit ? "WindowsPlayer_Release_mono_x64.pdb" : "WindowsPlayer_Release_mono_x86.pdb";

            var bitVersionPath       = Combine(windowsStandalonePath, "Variations", monoString);
            var monoBleedingEdgePath = Path.Combine(bitVersionPath, "MonoBleedingEdge");
            var dataManagedPath      = Combine(bitVersionPath, "Data", "Managed");
            var winPlayer            = Path.Combine(bitVersionPath, "WindowsPlayer.exe");


            var crashHandler = GetSwapPair(bitVersionPath, gamePath, crashHandlerFile);
            var player       = GetSwapPair(bitVersionPath, gamePath, "UnityPlayer.dll");
            var playerLib    = GetSwapPair(bitVersionPath, gamePath, "UnityPlayer.dll.lib");
            var playerPdb    = GetSwapPair(bitVersionPath, gamePath, playerPdbFile);
            var releasePdb   = GetSwapPair(bitVersionPath, gamePath, playerReleasePdb);
            var winPix       = GetSwapPair(bitVersionPath, gamePath, "WinPixEventRuntime.dll");

            var editorVersion = FileVersionInfo.GetVersionInfo(winPlayer);
            var gameVersion   = FileVersionInfo.GetVersionInfo(gamePlayer);

            if (!editorVersion.Equals(editorVersion))
            {
                Debug.LogError($"Unity Editor Version: {editorVersion} does not match {settings.GameExecutable} Unity version: {gameVersion}");
                return;
            }

            Overwrite(new SwapPair {
                newFile = winPlayer, originalFile = gamePlayer
            });
            Overwrite(crashHandler);
            Overwrite(player);
            Overwrite(playerLib);
            Overwrite(playerPdb);
            Overwrite(releasePdb);
            if (File.Exists(winPix.newFile))
            {
                Overwrite(winPix);
            }

            CopyFolder(monoBleedingEdgePath, gameMonoPath);
            CopyFolder(dataManagedPath, gameManagedPath);

            if (File.Exists(gameBootConfigFile))
            {
                bool foundConnectionDebug = false;
                using (var sr = File.OpenText(gameBootConfigFile))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        if (line.Contains(playerConnectionDebug1))
                        {
                            foundConnectionDebug = true;
                            break;
                        }
                    }
                }

                if (!foundConnectionDebug)
                {
                    File.AppendAllText(gameBootConfigFile, playerConnectionDebug1);
                }
            }
            else
            {
                File.WriteAllText(gameBootConfigFile, playerConnectionDebug1);
            }
        }
Ejemplo n.º 9
0
 public override string GetPath(PathReference output, Pipeline pipeline) => ThunderKitSettings.GetOrCreateSettings <ThunderKitSettings>().GameExecutable;