public bool UpdateFrame(Rectangle screenSize) { ScreenSize = screenSize; IsValidGame = false; AllPlayers.Clear(); if (!RPM.IsValid(gameContext.m_ClientPlayerManager)) { return(false); } playerManager = RPM.Read <Frostbite.ClientPlayerManager>(gameContext.m_ClientPlayerManager); if (!RPM.IsValid(gameRenderer.m_RenderView)) { return(false); } gameRenderview = RPM.Read <Frostbite.RenderView>(gameRenderer.m_RenderView); ViewProjection = gameRenderview.m_ViewProjection; if (!RPM.IsValid(playerManager.m_LocalPlayer)) { return(false); } LocalPlayer = new Player(playerManager.m_LocalPlayer); if (LocalPlayer.IsValidPlayer) { if (!RPM.IsValid(playerManager.m_PlayerList)) { return(false); } for (ulong i = 0; i < maxPlayers; i++) { Player player = new Player(RPM.Read <ulong>(playerManager.m_PlayerList + (i * sizeof(ulong)))); if ((player.IsValidPlayer) && (player.Name != LocalPlayer.Name)) { if ((player.TeamId != LocalPlayer.TeamId) && (player.TeamId != 0)) { player.ScreenPosition = (Vector2)WorldToScreen(player.Position); player.Distance = Vector3.Subtract(LocalPlayer.Position, player.Position).Length(); AllPlayers.Add(player); } } } } IsValidGame = true; return(true); }
public GameManager(Process process, Rectangle screenSize) { SigScanSharp SigScan = new SigScanSharp(RPM.GetHandle()); var t = process.MainModule; SigScan.SelectModule(process.MainModule); SigScan.AddPattern("GameRenderer", "48 8B 0D ? ? ? ? 48 85 C9 74 0B 48 8B 01 BA ? ? ? ? FF 50 68"); SigScan.AddPattern("GameContext", "48 89 15 ? ? ? ? 48 89 CB"); SigScan.AddPattern("FirstTypeInfo", "48 8B 05 ? ? ? ? 48 89 41 08 48 89 0D ? ? ? ?"); var result = SigScan.FindPatterns(out long lTime); pGameContext = SigScan.FindOffset(result["GameContext"]); pGameRenderer = SigScan.FindOffset(result["GameRenderer"]); pFirstTypeInfo = SigScan.FindOffset(result["FirstTypeInfo"]); Console.WriteLine("GameRenderer : 0x{0}", pGameRenderer.ToString("X")); Console.WriteLine("GameContext : 0x{0}", pGameContext.ToString("X")); Console.WriteLine("FirstTypeInfo : 0x{0}", pFirstTypeInfo.ToString("X")); if (!RPM.IsValid(pGameContext)) { IsValidGame = false; return; } if (!RPM.IsValid(pGameRenderer)) { IsValidGame = false; return; } if (!RPM.IsValid(pFirstTypeInfo)) { IsValidGame = false; return; } pGameContext = RPM.Read <ulong>(pGameContext); pGameRenderer = RPM.Read <ulong>(pGameRenderer); gameContext = RPM.Read <Frostbite.ClientGameContext>(pGameContext); gameRenderer = RPM.Read <Frostbite.GameRenderer>(pGameRenderer); pPlayerManager = gameContext.m_ClientPlayerManager; pGameRenderView = gameRenderer.m_RenderView; if (!RPM.IsValid(gameContext.m_ClientPlayerManager)) { IsValidGame = false; return; } playerManager = RPM.Read <Frostbite.ClientPlayerManager>(gameContext.m_ClientPlayerManager); AllPlayers = new List <Player>(); ScreenSize = screenSize; }
public Overlay(Process gameProcess) { process = gameProcess; // check the game window exists then create the overlay while (true) { handle = NativeMethods.FindWindow(null, "STAR WARS Battlefront II"); if (handle != IntPtr.Zero) { break; } } // check if game running. timed at 2-5ms per call so runs in own thread gameCheckThread = new Thread(new ParameterizedThreadStart(GameCheck)); gameCheckThread.Start(); // Starting the ESP before the game leaves invalid process info so we'll wait a second to let the game check thread fix that if (process.MainWindowHandle == IntPtr.Zero) { Thread.Sleep(1000); } // set up the remote process memory class RPM.OpenProcess(process.Id); // setup the overlay var rendererOptions = new Direct2DRendererOptions() { AntiAliasing = OPTIONS_AA, Hwnd = IntPtr.Zero, MeasureFps = OPTIONS_ShowFPS, VSync = OPTIONS_VSync }; OverlayManager manager = new OverlayManager(handle, rendererOptions); overlay = manager.Window; d2d = manager.Graphics; clearBrush = d2d.CreateBrush(0xF5, 0xF5, 0xF5, 0); // our transparent colour // start the update thread updateThread = new Thread(new ParameterizedThreadStart(Update)); updateThread.Start(); }
public Player(ulong playerPointer) { ulong EntityComponents; IsValidPlayer = false; InVehicle = false; if (!RPM.IsValid(playerPointer)) { return; } CPlayer = RPM.Read <Frostbite.ClientPlayer>(playerPointer); if (CPlayer.x003C != 511) { return; } if (!RPM.IsValid(CPlayer.m_ControlledControllable)) { return; } CSoldier = RPM.Read <Frostbite.WSClientSoldierEntity>(CPlayer.m_ControlledControllable); Name = RPM.ReadString(CPlayer.m_Name, 32); TeamId = CPlayer.m_TeamId; if (RPM.IsValid(CPlayer.m_AttachedControllable)) { CVehicle = RPM.Read <Frostbite.WSClientVehicleEntity>(CPlayer.m_AttachedControllable); InVehicle = true; } Frostbite.HealthComponent CHealthComponent; if (!InVehicle) { Pose = (Frostbite.PoseType)CSoldier.m_Pose; IsVisible = !(CSoldier.m_IsOccluded == 1); IsSprinting = (CSoldier.m_IsSprinting == 1); Pitch = CSoldier.m_PitchRads; Yaw = CSoldier.m_YawRads; HeadoffsetY = CSoldier.m_HeadboneOffsetY; Velocity = (Vector3)CSoldier.m_Velocity; if (!RPM.IsValid(CSoldier.m_HealthComponent)) { return; } CHealthComponent = RPM.Read <Frostbite.HealthComponent>(CSoldier.m_HealthComponent); TransformAABB.AABB.Min = new Vector4(-0.350000f, 0.000000f, -0.350000f, 0); TransformAABB.AABB.Max = new Vector4(0.350000f, (CSoldier.m_HeadboneOffsetY + 0.3f), 0.350000f, 0); EntityComponents = CSoldier.m_EntityComponents; } else { if (!RPM.IsValid(CVehicle.m_HealthComponent)) { return; } CHealthComponent = RPM.Read <Frostbite.HealthComponent>(CVehicle.m_HealthComponent); Velocity = (Vector3)CVehicle.m_Velocity; TransformAABB.AABB.Min = CVehicle.m_MinAABB; TransformAABB.AABB.Max = CVehicle.m_MaxAABB; EntityComponents = CVehicle.m_EntityComponents; } Health = CHealthComponent.m_Health; MaxHealth = CHealthComponent.m_MaxHealth; if (IsDead) { return; } { // huangfengye's function for transformation matrix from any entity byte ECX; byte EAX; ulong pTrans; ECX = RPM.Read <byte>(EntityComponents + 0x09); EAX = RPM.Read <byte>(EntityComponents + 0x0A); pTrans = (ulong)((ECX + EAX * 2) * 0x20); var temp = EntityComponents + pTrans + 0x10; TransformAABB.Matrix = RPM.Read <Matrix>(EntityComponents + pTrans + 0x10); } Position = TransformAABB.Matrix.TranslationVector; IsValidPlayer = true; }
private void Update(object sender) { // set up our colours for drawing var blackBrush = d2d.CreateBrush(0, 0, 0, 255); var redBrush = d2d.CreateBrush(153, 0, 0, 128); var yellowBrush = d2d.CreateBrush(153, 153, 0, 128); var orangeBrush = d2d.CreateBrush(255, 200, 0, 255); var darkOrangeBrush = d2d.CreateBrush(255, 100, 0, 255); var greenBrush = d2d.CreateBrush(0, 255, 0, 255); var blueBrush = d2d.CreateBrush(0, 0, 255, 255); var whiteBrush = d2d.CreateBrush(250, 250, 250, 128); var vehicleBrush = d2d.CreateBrush(243, 243, 255, 128); var heroVisBrush = d2d.CreateBrush(240, 0, 255, 255); var heroBrush = d2d.CreateBrush(120, 0, 120, 255); // and our font var font = d2d.CreateFont("Tahoma", 9); Direct2DBrush brush; Console.WriteLine("Initialising..."); // initialise the GameManager class that handles the player data gameManager = new GameManager(process, new Rectangle(0, 0, overlay.Width, overlay.Height)); Console.WriteLine("Ready."); // main loop while (IsGameRunning) { if (gameManager.UpdateFrame(new Rectangle(0, 0, overlay.Width, overlay.Height))) { d2d.BeginScene(); d2d.ClearScene(clearBrush); if (OPTIONS_ShowFPS) { d2d.DrawTextWithBackground($"FPS: {d2d.FPS}", 20, 20, font, greenBrush, blackBrush); } foreach (Player player in gameManager.AllPlayers) { if (!player.IsDead) { if (player.IsVisible) { if (player.MaxHealth < 400) { brush = yellowBrush; } else { brush = heroVisBrush; } } else { if (player.MaxHealth < 400) { brush = redBrush; } else { brush = heroBrush; } } if (!player.InVehicle) { /*if (!player.IsVisible)*/ DrawAABB(player.TransformAABB, brush); } else { brush = vehicleBrush; DrawAABB(player.TransformAABB, brush); } var name = player.Name; var dist = $"{(int)player.Distance}m"; Vector3 textPos = new Vector3(player.Position.X, player.Position.Y, player.Position.Z); if (gameManager.WorldToScreen(textPos, out textPos)) { var textPosX = textPos.X - ((name.Length * font.FontSize) / 4); d2d.DrawText(name, textPosX - 1, textPos.Y - 1, font, blackBrush); d2d.DrawText(name, textPosX, textPos.Y, font, whiteBrush); textPosX = textPos.X - ((dist.Length * font.FontSize) / 4); var textPosY = textPos.Y + font.FontSize; d2d.DrawText(dist, textPosX - 1, textPosY - 1, font, blackBrush); d2d.DrawText(dist, textPosX, textPosY, font, whiteBrush); } } } d2d.EndScene(); } } // clean up if the game has closed RPM.CloseProcess(); Environment.Exit(0); }