"""Auto-generated stub file for GTA V ScriptHookVDotNet"""

from typing import Any, List, Dict, Optional, Iterable, ClassVar, Tuple, Callable, TypeVar, overload, Union
from enum import Enum

from GTA import (
    Blip,
    Camera,
    Checkpoint,
    Entity,
    EulerRotationOrder,
    Game,
    Model,
    Ped,
    PedHash,
    Player,
    Prop,
    Vehicle,
    VehicleHash,
    Weapon,
    WeaponHash,
    World
)

class Matrix:
    Zero: ClassVar[Matrix]
    Identity: ClassVar[Matrix]
    Item: float
    IsIdentity: bool
    HasInverse: bool
    M11: float
    M12: float
    M13: float
    M14: float
    M21: float
    M22: float
    M23: float
    M24: float
    M31: float
    M32: float
    M33: float
    M34: float
    M41: float
    M42: float
    M43: float
    M44: float
    def __init__(self, values: List[float]) -> None: ...
    def GetOrigin(self) -> Vector3: ...
    def SetOrigin(self, newOrigin: Vector3) -> None: ...
    @overload
    def GetScaleVector(self) -> Vector3: ...
    @overload
    def GetScaleVector(self, tolerance: float) -> Vector3: ...
    def GetScaleVector(self, *args: Any, **kwargs: Any) -> Any: ...
    def Determinant(self) -> float: ...
    def Invert(self) -> None: ...
    def Inverse(self) -> Matrix: ...
    def FastInvert(self) -> None: ...
    def FastInverse(self) -> Matrix: ...
    def TransformPoint(self, point: Vector3) -> Vector3: ...
    def InverseTransformPoint(self, point: Vector3) -> Vector3: ...
    def TransformVector(self, vector: Vector3) -> Vector3: ...
    def InverseTransformVector(self, vector: Vector3) -> Vector3: ...
    def TransformDirection(self, direction: Vector3) -> Vector3: ...
    def InverseTransformDirection(self, direction: Vector3) -> Vector3: ...
    @staticmethod
    def Add(left: Matrix, right: Matrix) -> Matrix: ...
    @staticmethod
    def Subtract(left: Matrix, right: Matrix) -> Matrix: ...
    @overload
    @staticmethod
    def Multiply(left: Matrix, right: Matrix) -> Matrix: ...
    @overload
    @staticmethod
    def Multiply(left: Matrix, right: float) -> Matrix: ...
    @staticmethod
    def Multiply(*args: Any, **kwargs: Any) -> Any: ...
    @overload
    @staticmethod
    def Divide(left: Matrix, right: Matrix) -> Matrix: ...
    @overload
    @staticmethod
    def Divide(left: Matrix, right: float) -> Matrix: ...
    @staticmethod
    def Divide(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def Negate(matrix: Matrix) -> Matrix: ...
    @staticmethod
    def Lerp(start: Matrix, end: Matrix, amount: float) -> Matrix: ...
    @staticmethod
    def RotationX(angle: float) -> Matrix: ...
    @staticmethod
    def RotationY(angle: float) -> Matrix: ...
    @staticmethod
    def RotationZ(angle: float) -> Matrix: ...
    @staticmethod
    def RotationAxis(axis: Vector3, angle: float) -> Matrix: ...
    @staticmethod
    def RotationQuaternion(rotation: Quaternion) -> Matrix: ...
    @staticmethod
    def RotationYawPitchRoll(yaw: float, pitch: float, roll: float) -> Matrix: ...
    @overload
    @staticmethod
    def Scaling(x: float, y: float, z: float) -> Matrix: ...
    @overload
    @staticmethod
    def Scaling(scale: Vector3) -> Matrix: ...
    @staticmethod
    def Scaling(*args: Any, **kwargs: Any) -> Any: ...
    @overload
    @staticmethod
    def Translation(x: float, y: float, z: float) -> Matrix: ...
    @overload
    @staticmethod
    def Translation(amount: Vector3) -> Matrix: ...
    @staticmethod
    def Translation(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def Transpose(matrix: Matrix) -> Matrix: ...
    @overload
    def ApplyScale(self, scale: float) -> Matrix: ...
    @overload
    def ApplyScale(self, scale: Vector3) -> Matrix: ...
    def ApplyScale(self, *args: Any, **kwargs: Any) -> Any: ...
    @overload
    def GetMatrixWithoutScale(self) -> Matrix: ...
    @overload
    def GetMatrixWithoutScale(self, tolerance: float) -> Matrix: ...
    def GetMatrixWithoutScale(self, *args: Any, **kwargs: Any) -> Any: ...
    def RemoveTranslation(self) -> Matrix: ...
    @overload
    def RemoveScaling(self) -> None: ...
    @overload
    def RemoveScaling(self, tolerance: float) -> None: ...
    def RemoveScaling(self, *args: Any, **kwargs: Any) -> Any: ...
    def ToArray(self) -> List[float]: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...
    @overload
    def Equals(self, obj: object) -> bool: ...
    @overload
    def Equals(self, other: Matrix) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...

class Plane:
    Normalized: Plane
    Normal: Vector3
    D: float
    @overload
    def __init__(self, normal: Vector3, d: float) -> None: ...
    @overload
    def __init__(self, normal: Vector3, point: Vector3) -> None: ...
    @overload
    def __init__(self, a: Vector3, b: Vector3, c: Vector3) -> None: ...
    def __init__(self, *args: Any, **kwargs: Any) -> None: ...
    def DistanceTo(self, point: Vector3) -> float: ...
    @staticmethod
    def Intersect3(a: Plane, b: Plane, c: Plane, dest: Vector3) -> bool: ...
    def IntersectsRay(self, from_: Vector3, dir: Vector3, dest: Vector3) -> bool: ...
    def ProjectPoint(self, point: Vector3) -> Vector3: ...
    def Normalize(self) -> None: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    @overload
    def Equals(self, value: Plane) -> bool: ...
    @overload
    def Equals(self, value: object) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...

class Quaternion:
    Zero: ClassVar[Quaternion]
    One: ClassVar[Quaternion]
    Identity: ClassVar[Quaternion]
    Axis: Vector3
    Angle: float
    X: float
    Y: float
    Z: float
    W: float
    @overload
    def __init__(self, x: float, y: float, z: float, w: float) -> None: ...
    @overload
    def __init__(self, axis: Vector3, angle: float) -> None: ...
    def __init__(self, *args: Any, **kwargs: Any) -> None: ...
    def Length(self) -> float: ...
    def LengthSquared(self) -> float: ...
    def Normalize(self) -> None: ...
    def Conjugate(self) -> None: ...
    def Invert(self) -> None: ...
    @staticmethod
    def Negate(quaternion: Quaternion) -> Quaternion: ...
    @staticmethod
    def Add(left: Quaternion, right: Quaternion) -> Quaternion: ...
    @staticmethod
    def Subtract(left: Quaternion, right: Quaternion) -> Quaternion: ...
    @overload
    @staticmethod
    def Multiply(left: Quaternion, right: Quaternion) -> Quaternion: ...
    @overload
    @staticmethod
    def Multiply(quaternion: Quaternion, scale: float) -> Quaternion: ...
    @staticmethod
    def Multiply(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def Divide(left: Quaternion, right: Quaternion) -> Quaternion: ...
    @staticmethod
    def Dot(left: Quaternion, right: Quaternion) -> float: ...
    @staticmethod
    def Lerp(start: Quaternion, end: Quaternion, amount: float) -> Quaternion: ...
    @staticmethod
    def Slerp(start: Quaternion, end: Quaternion, amount: float) -> Quaternion: ...
    @staticmethod
    def SlerpUnclamped(a: Quaternion, b: Quaternion, t: float) -> Quaternion: ...
    @overload
    @staticmethod
    def LookRotation(forward: Vector3) -> Quaternion: ...
    @overload
    @staticmethod
    def LookRotation(forward: Vector3, up: Vector3) -> Quaternion: ...
    @staticmethod
    def LookRotation(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def FromToRotation(fromDirection: Vector3, toDirection: Vector3) -> Quaternion: ...
    @staticmethod
    def RotateTowards(from_: Quaternion, to: Quaternion, maxDegreesDelta: float) -> Quaternion: ...
    @staticmethod
    def AngleBetween(a: Quaternion, b: Quaternion) -> float: ...
    @overload
    @staticmethod
    def Euler(zaxis: float, xaxis: float, yaxis: float) -> Quaternion: ...
    @overload
    @staticmethod
    def Euler(z: float, x: float, y: float, rotationOrder: EulerRotationOrder) -> Quaternion: ...
    @overload
    @staticmethod
    def Euler(euler: Vector3) -> Quaternion: ...
    @overload
    @staticmethod
    def Euler(euler: Vector3, rotationOrder: EulerRotationOrder) -> Quaternion: ...
    @staticmethod
    def Euler(*args: Any, **kwargs: Any) -> Any: ...
    def ToEuler(self, rotationOrder: EulerRotationOrder = ...) -> Vector3: ...
    @staticmethod
    def RotationAxis(axis: Vector3, angle: float) -> Quaternion: ...
    @staticmethod
    def RotationMatrix(matrix: Matrix) -> Quaternion: ...
    @staticmethod
    def RotationYawPitchRoll(yaw: float, pitch: float, roll: float) -> Quaternion: ...
    @staticmethod
    def DirectionVectors(rightVector: Vector3, forwardVector: Vector3, upVector: Vector3) -> Quaternion: ...
    @staticmethod
    def GetDirectionVectors(quaternion: Quaternion, rightVector: Vector3, forwardVector: Vector3, upVector: Vector3) -> None: ...
    @overload
    def RotateTransform(self, point: Vector3) -> Vector3: ...
    @overload
    def RotateTransform(self, point: Vector3, center: Vector3) -> Vector3: ...
    def RotateTransform(self, *args: Any, **kwargs: Any) -> Any: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...
    @overload
    def Equals(self, obj: object) -> bool: ...
    @overload
    def Equals(self, other: Quaternion) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...

class Vector2:
    Normalized: Vector2
    Zero: ClassVar[Vector2]
    One: ClassVar[Vector2]
    UnitX: ClassVar[Vector2]
    UnitY: ClassVar[Vector2]
    Up: ClassVar[Vector2]
    Down: ClassVar[Vector2]
    Right: ClassVar[Vector2]
    Left: ClassVar[Vector2]
    Item: float
    X: float
    Y: float
    def __init__(self, x: float, y: float) -> None: ...
    def Length(self) -> float: ...
    def LengthSquared(self) -> float: ...
    def Normalize(self) -> None: ...
    def DistanceTo(self, position: Vector2) -> float: ...
    def DistanceToSquared(self, position: Vector2) -> float: ...
    @staticmethod
    def Distance(position1: Vector2, position2: Vector2) -> float: ...
    @staticmethod
    def DistanceSquared(position1: Vector2, position2: Vector2) -> float: ...
    @staticmethod
    def Angle(from_: Vector2, to: Vector2) -> float: ...
    @staticmethod
    def SignedAngle(from_: Vector2, to: Vector2) -> float: ...
    def ToHeading(self) -> float: ...
    @staticmethod
    def RandomXY() -> Vector2: ...
    @staticmethod
    def Add(left: Vector2, right: Vector2) -> Vector2: ...
    @staticmethod
    def Subtract(left: Vector2, right: Vector2) -> Vector2: ...
    @overload
    @staticmethod
    def Multiply(value: Vector2, scale: float) -> Vector2: ...
    @overload
    @staticmethod
    def Multiply(left: Vector2, right: Vector2) -> Vector2: ...
    @staticmethod
    def Multiply(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def Divide(value: Vector2, scale: float) -> Vector2: ...
    @staticmethod
    def Negate(value: Vector2) -> Vector2: ...
    @staticmethod
    def Clamp(value: Vector2, min: Vector2, max: Vector2) -> Vector2: ...
    @staticmethod
    def Lerp(start: Vector2, end: Vector2, amount: float) -> Vector2: ...
    @staticmethod
    def Dot(left: Vector2, right: Vector2) -> float: ...
    @staticmethod
    def Reflect(vector: Vector2, normal: Vector2) -> Vector2: ...
    @staticmethod
    def Minimize(left: Vector2, right: Vector2) -> Vector2: ...
    @staticmethod
    def Maximize(left: Vector2, right: Vector2) -> Vector2: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...
    @overload
    def Equals(self, obj: object) -> bool: ...
    @overload
    def Equals(self, other: Vector2) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...

class Vector3:
    Normalized: Vector3
    Zero: ClassVar[Vector3]
    One: ClassVar[Vector3]
    UnitX: ClassVar[Vector3]
    UnitY: ClassVar[Vector3]
    UnitZ: ClassVar[Vector3]
    WorldUp: ClassVar[Vector3]
    WorldDown: ClassVar[Vector3]
    WorldNorth: ClassVar[Vector3]
    WorldSouth: ClassVar[Vector3]
    WorldEast: ClassVar[Vector3]
    WorldWest: ClassVar[Vector3]
    RelativeRight: ClassVar[Vector3]
    RelativeLeft: ClassVar[Vector3]
    RelativeFront: ClassVar[Vector3]
    RelativeBack: ClassVar[Vector3]
    RelativeTop: ClassVar[Vector3]
    RelativeBottom: ClassVar[Vector3]
    Item: float
    X: float
    Y: float
    Z: float
    def __init__(self, x: float, y: float, z: float) -> None: ...
    def Length(self) -> float: ...
    def LengthSquared(self) -> float: ...
    def Normalize(self) -> None: ...
    def DistanceTo(self, position: Vector3) -> float: ...
    def DistanceToSquared(self, position: Vector3) -> float: ...
    def DistanceTo2D(self, position: Vector3) -> float: ...
    def DistanceToSquared2D(self, position: Vector3) -> float: ...
    @staticmethod
    def Distance(position1: Vector3, position2: Vector3) -> float: ...
    @staticmethod
    def DistanceSquared(position1: Vector3, position2: Vector3) -> float: ...
    @staticmethod
    def Distance2D(position1: Vector3, position2: Vector3) -> float: ...
    @staticmethod
    def DistanceSquared2D(position1: Vector3, position2: Vector3) -> float: ...
    @staticmethod
    def Angle(from_: Vector3, to: Vector3) -> float: ...
    @staticmethod
    def SignedAngle(from_: Vector3, to: Vector3, planeNormal: Vector3) -> float: ...
    def ToHeading(self) -> float: ...
    def Around(self, distance: float) -> Vector3: ...
    def Round(self, decimalPlaces: int = 2) -> Vector3: ...
    @staticmethod
    def RandomXY() -> Vector3: ...
    @staticmethod
    def RandomXYZ() -> Vector3: ...
    @staticmethod
    def Add(left: Vector3, right: Vector3) -> Vector3: ...
    @staticmethod
    def Subtract(left: Vector3, right: Vector3) -> Vector3: ...
    @overload
    @staticmethod
    def Multiply(value: Vector3, scale: float) -> Vector3: ...
    @overload
    @staticmethod
    def Multiply(left: Vector3, right: Vector3) -> Vector3: ...
    @staticmethod
    def Multiply(*args: Any, **kwargs: Any) -> Any: ...
    @staticmethod
    def Divide(value: Vector3, scale: float) -> Vector3: ...
    @staticmethod
    def Negate(value: Vector3) -> Vector3: ...
    @staticmethod
    def Clamp(value: Vector3, min: Vector3, max: Vector3) -> Vector3: ...
    @staticmethod
    def Lerp(start: Vector3, end: Vector3, amount: float) -> Vector3: ...
    @staticmethod
    def Dot(left: Vector3, right: Vector3) -> float: ...
    @staticmethod
    def Cross(left: Vector3, right: Vector3) -> Vector3: ...
    @staticmethod
    def Project(vector: Vector3, onNormal: Vector3) -> Vector3: ...
    @staticmethod
    def ProjectOnPlane(vector: Vector3, planeNormal: Vector3) -> Vector3: ...
    @staticmethod
    def Reflect(vector: Vector3, normal: Vector3) -> Vector3: ...
    @staticmethod
    def Minimize(left: Vector3, right: Vector3) -> Vector3: ...
    @staticmethod
    def Maximize(left: Vector3, right: Vector3) -> Vector3: ...
    def ToArray(self) -> List[float]: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...
    @overload
    def Equals(self, obj: object) -> bool: ...
    @overload
    def Equals(self, other: Vector3) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...

class Vector4:
    Normalized: Vector4
    Zero: ClassVar[Vector4]
    One: ClassVar[Vector4]
    Item: float
    X: float
    Y: float
    Z: float
    W: float
    def __init__(self, x: float, y: float, z: float, w: float) -> None: ...
    def Length(self) -> float: ...
    def LengthSquared(self) -> float: ...
    def Normalize(self) -> None: ...
    @staticmethod
    def Clamp(value: Vector4, min: Vector4, max: Vector4) -> Vector4: ...
    @staticmethod
    def Lerp(start: Vector4, end: Vector4, amount: float) -> Vector4: ...
    @staticmethod
    def Dot(left: Vector4, right: Vector4) -> float: ...
    @staticmethod
    def Min(left: Vector4, right: Vector4) -> Vector4: ...
    @staticmethod
    def Max(left: Vector4, right: Vector4) -> Vector4: ...
    @overload
    def ToString(self) -> str: ...
    @overload
    def ToString(self, format: str) -> str: ...
    @overload
    def ToString(self, format: str, provider: Any) -> str: ...
    def ToString(self, *args: Any, **kwargs: Any) -> Any: ...
    @overload
    def Equals(self, other: Vector4) -> bool: ...
    @overload
    def Equals(self, obj: object) -> bool: ...
    def Equals(self, *args: Any, **kwargs: Any) -> Any: ...
    def GetHashCode(self) -> int: ...
