Compare commits

..

4 Commits
4.1.1 ... 4.1.2

8 changed files with 49 additions and 28 deletions

View File

@ -16,6 +16,7 @@ using CppType = Il2CppSystem.Type;
using BF = System.Reflection.BindingFlags; using BF = System.Reflection.BindingFlags;
using UnityExplorer.Core.Config; using UnityExplorer.Core.Config;
using UnhollowerBaseLib.Attributes; using UnhollowerBaseLib.Attributes;
using UnityEngine;
namespace UnityExplorer namespace UnityExplorer
{ {
@ -25,10 +26,15 @@ namespace UnityExplorer
{ {
base.Initialize(); base.Initialize();
float start = Time.realtimeSinceStartup;
TryLoadGameModules(); TryLoadGameModules();
ExplorerCore.Log($"Loaded Unhollowed modules in {Time.realtimeSinceStartup - start} seconds");
start = Time.realtimeSinceStartup;
BuildDeobfuscationCache(); BuildDeobfuscationCache();
OnTypeLoaded += TryCacheDeobfuscatedType; OnTypeLoaded += TryCacheDeobfuscatedType;
ExplorerCore.Log($"Setup IL2CPP reflection in {Time.realtimeSinceStartup - start} seconds, " +
$"deobfuscated types count: {DeobfuscatedTypes.Count}");
} }
#region IL2CPP Extern and pointers #region IL2CPP Extern and pointers
@ -67,19 +73,11 @@ namespace UnityExplorer
private static void BuildDeobfuscationCache() private static void BuildDeobfuscationCache()
{ {
float start = UnityEngine.Time.realtimeSinceStartup;
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{ {
foreach (var type in asm.TryGetTypes()) foreach (var type in asm.TryGetTypes())
TryCacheDeobfuscatedType(type); TryCacheDeobfuscatedType(type);
} }
if (DeobfuscatedTypes.Count > 0)
{
ExplorerCore.Log($"Built deobfuscation cache in {UnityEngine.Time.realtimeSinceStartup - start} seconds, " +
$"initial count: {DeobfuscatedTypes.Count} ");
}
} }
private static void TryCacheDeobfuscatedType(Type type) private static void TryCacheDeobfuscatedType(Type type)

View File

@ -65,10 +65,14 @@ namespace UnityExplorer
private static void SetupTypeCache() private static void SetupTypeCache()
{ {
float start = Time.realtimeSinceStartup;
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
CacheTypes(asm); CacheTypes(asm);
AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded; AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
ExplorerCore.Log($"Cached AppDomain assemblies in {Time.realtimeSinceStartup - start} seconds");
} }
private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args) private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)

View File

@ -20,7 +20,7 @@ namespace UnityExplorer
public static class ExplorerCore public static class ExplorerCore
{ {
public const string NAME = "UnityExplorer"; public const string NAME = "UnityExplorer";
public const string VERSION = "4.1.1"; public const string VERSION = "4.1.2";
public const string AUTHOR = "Sinai"; public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.unityexplorer"; public const string GUID = "com.sinai.unityexplorer";

View File

@ -41,7 +41,7 @@ namespace UnityExplorer.UI.CSConsole
suggestions.Clear(); suggestions.Clear();
int caret = Math.Max(0, Math.Min(InputField.Text.Length - 1, InputField.Component.caretPosition - 1)); int caret = Math.Max(0, Math.Min(InputField.Text.Length - 1, InputField.Component.caretPosition - 1));
int start = caret; int startIdx = caret;
// If the character at the caret index is whitespace or delimiter, // If the character at the caret index is whitespace or delimiter,
// or if the next character (if it exists) is not whitespace, // or if the next character (if it exists) is not whitespace,
@ -55,17 +55,18 @@ namespace UnityExplorer.UI.CSConsole
} }
// get the current composition string (from caret back to last delimiter) // get the current composition string (from caret back to last delimiter)
while (start > 0) while (startIdx > 0)
{ {
start--; startIdx--;
char c = InputField.Text[start]; char c = InputField.Text[startIdx];
if (delimiters.Contains(c)) if (delimiters.Contains(c) || char.IsWhiteSpace(c))
{ {
start++; startIdx++;
break; break;
} }
} }
string input = InputField.Text.Substring(start, caret - start + 1); string input = InputField.Text.Substring(startIdx, caret - startIdx + 1);
// Get MCS completions // Get MCS completions

View File

@ -231,20 +231,24 @@ namespace UnityExplorer.UI.CSConsole
previousInput = value; previousInput = value;
if (EnableSuggestions && AutoCompleteModal.CheckEnter(Completer)) if (EnableSuggestions && AutoCompleteModal.CheckEnter(Completer))
{
OnAutocompleteEnter(); OnAutocompleteEnter();
}
else if (!settingCaretCoroutine) var inStringOrComment = HighlightVisibleInput();
if (!settingCaretCoroutine)
{ {
if (EnableSuggestions) if (EnableSuggestions)
{
if (inStringOrComment)
AutoCompleteModal.Instance.ReleaseOwnership(Completer);
else
Completer.CheckAutocompletes(); Completer.CheckAutocompletes();
}
if (EnableAutoIndent) if (EnableAutoIndent)
DoAutoIndent(); DoAutoIndent();
} }
HighlightVisibleInput();
UpdateCaret(out _); UpdateCaret(out _);
} }
@ -372,7 +376,10 @@ namespace UnityExplorer.UI.CSConsole
#region Lexer Highlighting #region Lexer Highlighting
private static void HighlightVisibleInput() /// <summary>
/// Returns true if caret is inside string or comment, false otherwise
/// </summary>
private static bool HighlightVisibleInput()
{ {
int startIdx = 0; int startIdx = 0;
int endIdx = Input.Text.Length - 1; int endIdx = Input.Text.Length - 1;
@ -410,7 +417,8 @@ namespace UnityExplorer.UI.CSConsole
} }
// Highlight the visible text with the LexerBuilder // Highlight the visible text with the LexerBuilder
Panel.HighlightText.text = Lexer.BuildHighlightedString(Input.Text, startIdx, endIdx, topLine); Panel.HighlightText.text = Lexer.BuildHighlightedString(Input.Text, startIdx, endIdx, topLine, LastCaretPosition, out bool ret);
return ret;
} }
#endregion #endregion

View File

@ -14,6 +14,7 @@ namespace UnityExplorer.UI.CSConsole
public int startIndex; public int startIndex;
public int endIndex; public int endIndex;
public string htmlColorTag; public string htmlColorTag;
public bool isStringOrComment;
} }
public class LexerBuilder public class LexerBuilder
@ -82,8 +83,10 @@ namespace UnityExplorer.UI.CSConsole
/// <param name="endIdx">The last character you want to highlight</param> /// <param name="endIdx">The last character you want to highlight</param>
/// <param name="leadingLines">The amount of leading empty lines you want before the first character in the return string.</param> /// <param name="leadingLines">The amount of leading empty lines you want before the first character in the return string.</param>
/// <returns>A string which contains the amount of leading lines specified, as well as the rich-text highlighted section.</returns> /// <returns>A string which contains the amount of leading lines specified, as well as the rich-text highlighted section.</returns>
public string BuildHighlightedString(string input, int startIdx, int endIdx, int leadingLines) public string BuildHighlightedString(string input, int startIdx, int endIdx, int leadingLines, int caretIdx, out bool caretInStringOrComment)
{ {
caretInStringOrComment = false;
if (string.IsNullOrEmpty(input) || endIdx <= startIdx) if (string.IsNullOrEmpty(input) || endIdx <= startIdx)
return input; return input;
@ -105,12 +108,14 @@ namespace UnityExplorer.UI.CSConsole
// append the highlighted match // append the highlighted match
sb.Append(match.htmlColorTag); sb.Append(match.htmlColorTag);
for (int i = match.startIndex; i <= match.endIndex && i <= currentEndIdx; i++) for (int i = match.startIndex; i <= match.endIndex && i <= currentEndIdx; i++)
sb.Append(input[i]); sb.Append(input[i]);
sb.Append(SignatureHighlighter.CLOSE_COLOR); sb.Append(SignatureHighlighter.CLOSE_COLOR);
// check caretIdx to determine inStringOrComment state
if (caretIdx >= match.startIndex && caretIdx <= match.endIndex)
caretInStringOrComment = match.isStringOrComment;
// update the last unhighlighted start index // update the last unhighlighted start index
lastUnhighlighted = match.endIndex + 1; lastUnhighlighted = match.endIndex + 1;
} }
@ -150,6 +155,7 @@ namespace UnityExplorer.UI.CSConsole
startIndex = startIndex, startIndex = startIndex,
endIndex = CommittedIndex, endIndex = CommittedIndex,
htmlColorTag = lexer.ColorTag, htmlColorTag = lexer.ColorTag,
isStringOrComment = lexer is StringLexer || lexer is CommentLexer,
}; };
break; break;
} }

View File

@ -41,6 +41,10 @@ namespace UnityExplorer.UI.CSConsole.Lexers
while (!lexer.EndOfInput && char.IsLetter(lexer.PeekNext())) while (!lexer.EndOfInput && char.IsLetter(lexer.PeekNext()))
sb.Append(lexer.Current); sb.Append(lexer.Current);
// next must be whitespace or delimiter
if (!lexer.EndOfInput && !(char.IsWhiteSpace(lexer.Current) || lexer.IsDelimiter(lexer.Current)))
return false;
if (keywords.Contains(sb.ToString())) if (keywords.Contains(sb.ToString()))
{ {
if (!lexer.EndOfInput) if (!lexer.EndOfInput)

View File

@ -11,7 +11,7 @@ namespace UnityExplorer.UI.CSConsole.Lexers
protected override Color HighlightColor => new Color(0.6f, 0.6f, 0.6f); protected override Color HighlightColor => new Color(0.6f, 0.6f, 0.6f);
// all symbols are delimiters // all symbols are delimiters
public override IEnumerable<char> Delimiters => symbols; public override IEnumerable<char> Delimiters => symbols.Where(it => it != '.'); // '.' is not a delimiter, only a separator.
public static bool IsSymbol(char c) => symbols.Contains(c); public static bool IsSymbol(char c) => symbols.Contains(c);