private void MainLoop() { var settings = new TeardownSettings(_teardownBaseAddress); var input = new TeardownInput(Reader.Default.Read <ulong>(_teardownBaseAddress + 0x3E8E10, out _)); var game = new TeardownGame(_teardownBaseAddress + 0x003E2528); var lastMousePositionX = input.MouseWindowPositionX; var lastMousePositionY = input.MouseWindowPositionY; var cameraRotationX = 0.0f; var cameraRotationY = 0.0f; var lastFrameTime = 0.0f; var stopwatch = Stopwatch.StartNew(); while (true) { var deltaTime = stopwatch.ElapsedMilliseconds / 1000.0f; if (deltaTime < TickRate) { continue; } stopwatch.Restart(); if (Processes.Default.OpenedProcess.HasExited) { break; } if (game.State != TeardownGameState.Level) { continue; } if (Math.Abs(game.ActualTime - lastFrameTime) < 0.001f) // game is likely paused / window isn't focused (prevent input from hack from leaking out of game) { continue; } lastFrameTime = game.ActualTime; if (game.SimulationTime < 60.0f) // skip to end of level so that the last location of the camera path is always attempting to be reached { game.SimulationTime = 60.0f; } var shouldUseFastCameraSpeed = _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT); var cameraMovementSpeed = shouldUseFastCameraSpeed ? FastCameraSpeed : NormalCameraSpeed; var currentMousePositionX = input.MouseWindowPositionX; var currentMousePositionY = input.MouseWindowPositionY; var cameraSensitivity = game.InputSensitivity * 0.001f * (float)Math.PI; var location = game.Scene.Locations.Length >= 2 ? game.Scene.Locations[game.Scene.Locations.Length - 2] : null; if (location != null) { // camera rotation if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.RBUTTON)) { cameraRotationX += (currentMousePositionY - lastMousePositionY) * cameraSensitivity * deltaTime; cameraRotationY -= (currentMousePositionX - lastMousePositionX) * cameraSensitivity * deltaTime; } location.Frame = Quaternion.CreateFromAxisAngle(location.Left, cameraRotationX) * Quaternion.CreateFromAxisAngle(location.Up, cameraRotationY); // camera position var requestedCameraMovementAmount = new Vector3(); if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_S)) { requestedCameraMovementAmount += location.Back; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_W)) { requestedCameraMovementAmount += location.Front; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_A)) { requestedCameraMovementAmount += location.Left; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_D)) { requestedCameraMovementAmount += location.Right; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_Q)) { requestedCameraMovementAmount += location.Down; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_E)) { requestedCameraMovementAmount += location.Up; } // apply camera movement var cameraMovementAmount = requestedCameraMovementAmount.Normalized() * cameraMovementSpeed * deltaTime; location.PositionX += cameraMovementAmount.X; location.PositionY += cameraMovementAmount.Y; location.PositionZ += cameraMovementAmount.Z; } // autoclicker if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.CAPITAL)) { Console.Beep(700, 200); } if (_inputSimulator.InputDeviceState.IsTogglingKeyInEffect(VirtualKeyCode.CAPITAL) && _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.LBUTTON)) { _inputSimulator.Mouse.LeftButtonDown(); } // restart level if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.CONTROL) && _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_R)) { game.NextState = TeardownGameState.Level; Console.Beep(900, 200); } // toggle fog if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_0)) { game.IsFogEnabled = !game.IsFogEnabled; Console.Beep(700, 200); } // settings if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.UP)) { settings.FireSize += FireSizeChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.DOWN)) { if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT)) { settings.FireSize = 0.4f; Console.Beep(400, 200); } else { settings.FireSize -= FireSizeChangeAmount * deltaTime; } } settings.FireSize = Math.Max(settings.FireSize, 0.0f); // delete all fires if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.DELETE)) { game.Scene.FireSystem.TotalFires = 0; Console.Beep(600, 200); } // flashlight color if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT)) { if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_1)) { game.Scene.FlashLight.Red -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_2)) { game.Scene.FlashLight.Red += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_3)) { game.Scene.FlashLight.Green -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_4)) { game.Scene.FlashLight.Green += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_5)) { game.Scene.FlashLight.Blue -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_6)) { game.Scene.FlashLight.Blue += LightColorChangeAmount * deltaTime; } } else // change projectile type { if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_1)) { settings.ProjectileType = TeardownProjectileType.RegularBullet; Console.Beep(420, 200); } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_2)) { settings.ProjectileType = TeardownProjectileType.SmallBullet; Console.Beep(440, 200); } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_3)) { settings.ProjectileType = TeardownProjectileType.LargeBullet; Console.Beep(460, 200); } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_4)) { settings.ProjectileType = TeardownProjectileType.Rocket; Console.Beep(480, 200); } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_5)) { settings.ProjectileType = TeardownProjectileType.Bomb; Console.Beep(500, 200); } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_6)) { settings.ProjectileType = TeardownProjectileType.Force; Console.Beep(520, 200); } } lastMousePositionX = currentMousePositionX; lastMousePositionY = currentMousePositionY; } }
private void HackLoop() { var settings = new TeardownSettings(_teardownBaseAddress); var input = new TeardownInput(Reader.Default.Read <ulong>(_teardownBaseAddress + 0x3E8E10, out _)); var scene = new TeardownScene(Reader.Default.Read <ulong>(Reader.Default.Read <ulong>(_teardownBaseAddress + 0x3E8B60, out _), out _)); var camera = new TeardownCamera(_teardownBaseAddress + 0x003E2528); float localX = 0; float localZ = 0; int mouseX = 0; camera.RotationY = 0; var stopwatch = Stopwatch.StartNew(); while (true) { var deltaTime = stopwatch.ElapsedMilliseconds / 1000.0f; if (deltaTime < TickRate) { continue; } stopwatch.Restart(); var shouldUseFastCameraSpeed = _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT); var cameraMovementSpeed = shouldUseFastCameraSpeed ? FastCameraSpeed : NormalCameraSpeed; // camera position if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_W)) { // localZ += cameraMovementSpeed * deltaTime; localZ += (float)Math.Cos(camera.RotationY) * cameraMovementSpeed * deltaTime; localX += (float)Math.Sin(camera.RotationY) * cameraMovementSpeed * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_S)) { // localZ -= cameraMovementSpeed * deltaTime; localZ -= (float)Math.Cos(camera.RotationY) * cameraMovementSpeed * deltaTime; localX -= (float)Math.Sin(camera.RotationY) * cameraMovementSpeed * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_A)) { // localX += cameraMovementSpeed * deltaTime; localZ -= (float)Math.Sin(camera.RotationY) * cameraMovementSpeed * deltaTime; localX += (float)Math.Cos(camera.RotationY) * cameraMovementSpeed * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_D)) { localZ += (float)Math.Sin(camera.RotationY) * cameraMovementSpeed * deltaTime; localX -= (float)Math.Cos(camera.RotationY) * cameraMovementSpeed * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_Q)) { camera.PositionY += cameraMovementSpeed * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_E)) { camera.PositionY -= cameraMovementSpeed * deltaTime; } // camera rotation if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.RBUTTON) && mouseX != input.MouseWindowPositionX) { input.LastPositionX += ((mouseX - input.MouseWindowPositionX) * TurnSpeed * deltaTime); } camera.RotationY = Lerp(camera.RotationY, input.LastPositionX, 0.6f); /* * if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_Z)) * { * camera.RotationY += TurnSpeed * deltaTime; * } * else if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_X)) * { * camera.RotationY -= TurnSpeed * deltaTime; * } */ camera.PositionX = localX * (float)Math.Cos(camera.RotationY) - localZ * (float)Math.Sin(camera.RotationY); camera.PositionZ = localX * (float)Math.Sin(camera.RotationY) + localZ * (float)Math.Cos(camera.RotationY); // settings if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.UP)) { settings.FireSize += FireSizeChangeAmount * deltaTime; } else if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.DOWN)) { settings.FireSize -= FireSizeChangeAmount * deltaTime; } // light color if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_1)) { scene.FlashLight.Red -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_2)) { scene.FlashLight.Red += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_3)) { scene.FlashLight.Green -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_4)) { scene.FlashLight.Green += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_5)) { scene.FlashLight.Blue -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_6)) { scene.FlashLight.Blue += LightColorChangeAmount * deltaTime; } // change projectile type if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_7)) { Console.Beep(500, 200); // HACK: utilize the beep to notify the player that the type changed, and to delay the keystrokes, preventing the types from cycling quickly -- replace this with a keypress/key-up check instead settings.BulletType = (TeardownProjectileType)(((byte)settings.BulletType + 1) % Enum.GetValues(typeof(TeardownProjectileType)).Length); } mouseX = input.MouseLastScreenPositionX; } }
private void MainLoop() { var settings = new TeardownSettings(_teardownBaseAddress); var input = new TeardownInput(Reader.Default.Read <ulong>(_teardownBaseAddress + 0x3E8E10, out _)); var game = new TeardownGame(_teardownBaseAddress + 0x003E2528); var lastMousePositionX = input.MouseWindowPositionX; var lastMousePositionY = input.MouseWindowPositionY; var cameraRotationX = 0.0f; var cameraRotationY = 0.0f; bool?needsConsoleRedraw = null; var projectileToggleFlag = false; var currentBulletType = TeardownProjectileType.RegularBullet; var currentAutoClickerState = false; var stopwatch = Stopwatch.StartNew(); while (true) { var deltaTime = stopwatch.ElapsedMilliseconds / 1000.0f; if (deltaTime < TickRate) { continue; } stopwatch.Restart(); if (Processes.Default.OpenedProcess.HasExited) { break; } if (game.State != TeardownGameState.Level) { continue; } if (game.SimulationTime < 60.0f) // skip to end of level so that the last location of the camera path is always attempting to be reached { game.SimulationTime = 60.0f; } var shouldUseFastCameraSpeed = _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT); var cameraMovementSpeed = shouldUseFastCameraSpeed ? FastCameraSpeed : NormalCameraSpeed; var currentMousePositionX = input.MouseWindowPositionX; var currentMousePositionY = input.MouseWindowPositionY; var location = game.Scene.Locations.Length >= 2 ? game.Scene.Locations[game.Scene.Locations.Length - 2] : null; if (location != null) { // camera rotation if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.RBUTTON)) { cameraRotationX += (currentMousePositionY - lastMousePositionY) * TurnSpeed * deltaTime; cameraRotationY -= (currentMousePositionX - lastMousePositionX) * TurnSpeed * deltaTime; } location.RotationX = cameraRotationX; location.RotationY = cameraRotationY; // camera position var requestedCameraMovementAmount = new Vector3(); if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_S)) { requestedCameraMovementAmount += location.Back; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_W)) { requestedCameraMovementAmount += location.Front; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_A)) { requestedCameraMovementAmount += location.Left; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_D)) { requestedCameraMovementAmount += location.Right; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_Q)) { requestedCameraMovementAmount += location.Down; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_E)) { requestedCameraMovementAmount += location.Up; } // apply camera movement var cameraMovementAmount = requestedCameraMovementAmount.Normalized() * cameraMovementSpeed * deltaTime; location.PositionX += cameraMovementAmount.X; location.PositionY += cameraMovementAmount.Y; location.PositionZ += cameraMovementAmount.Z; } // autoclicker if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.CAPITAL)) { currentAutoClickerState = _inputSimulator.InputDeviceState.IsTogglingKeyInEffect(VirtualKeyCode.CAPITAL); needsConsoleRedraw = true; } if (_inputSimulator.InputDeviceState.IsTogglingKeyInEffect(VirtualKeyCode.CAPITAL) && _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.LBUTTON)) { _inputSimulator.Mouse.LeftButtonDown(); } // restart level if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.CONTROL) && _inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_R)) { game.NextState = TeardownGameState.Level; Console.Beep(900, 200); } // settings if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.UP)) { settings.FireSize += FireSizeChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.DOWN)) { if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.SHIFT)) { settings.FireSize = 0.4f; Console.Beep(400, 200); } else { settings.FireSize -= FireSizeChangeAmount * deltaTime; } } settings.FireSize = Math.Max(settings.FireSize, 0.0f); // flashlight color if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_1)) { game.Scene.FlashLight.Red -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_2)) { game.Scene.FlashLight.Red += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_3)) { game.Scene.FlashLight.Green -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_4)) { game.Scene.FlashLight.Green += LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_5)) { game.Scene.FlashLight.Blue -= LightColorChangeAmount * deltaTime; } if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_6)) { game.Scene.FlashLight.Blue += LightColorChangeAmount * deltaTime; } // change projectile type if (_inputSimulator.InputDeviceState.IsKeyDown(VirtualKeyCode.VK_7)) { if (!projectileToggleFlag) { currentBulletType = (TeardownProjectileType)(((byte)settings.BulletType + 1) % Enum.GetValues(typeof(TeardownProjectileType)).Length); settings.BulletType = currentBulletType; needsConsoleRedraw = true; } projectileToggleFlag = true; } if (_inputSimulator.InputDeviceState.IsKeyUp(VirtualKeyCode.VK_7)) { projectileToggleFlag = false; } lastMousePositionX = currentMousePositionX; lastMousePositionY = currentMousePositionY; // Update Console States if (needsConsoleRedraw ?? true) { Console.Clear(); DisplayInstructions(); Console.WriteLine($"\nCurrent bullet type: {(int)currentBulletType}-{currentBulletType}"); Console.WriteLine($"Autoclicker: {(currentAutoClickerState ? "On" : "Off")}"); needsConsoleRedraw = false; } } }