/// <summary> /// This method will make the game create a new object of string. /// </summary> /// <param name="s"></param> public unsafe static GameString New(GameContext ctx, string s) { using var alloc = MemoryAllocation.Alloc(ctx.HContext, (uint)(s.Length * 2 + 2) + (uint) sizeof(nuint)); nuint addr = alloc.AllocationBase; nuint resAddr = addr + (uint)(s.Length * 2 + 2); byte[] data = Encoding.Unicode.GetBytes(s); ctx.HContext.DataAccess.WriteBytes(addr, data); ctx.HContext.DataAccess.Write <short>(addr + (uint)data.Length, 0); var asm = AssemblySnippet.FromCode(new AssemblyCode[] { AssemblySnippet.FromConstructString(ctx.HContext, addr, resAddr) }); var thread = ctx.RunOnManagedThread(asm); if (!Task.Run(() => thread.WaitToDispose()).Wait(2000)) //won't forcefully dispose because that would cause game crashing { throw new Exception("Failed to create string object"); } nuint res = ctx.HContext.DataAccess.Read <nuint>(resAddr); return(new GameString(ctx, new HackObject(ctx.HContext, ctx.HContext.Runtime.Heap.StringType, res))); }