#ifndef JUMBOT_JUMBOT_H
#define JUMBOT_JUMBOT_H

#define _USE_MATH_DEFINES

#include <Windows.h>
#include <math.h>
#include <string.h>
#include "detours.h"
#include "etpro.h"

#define CMD_JUMBOT_ON    "+jumbot"
#define CMD_JUMBOT_OFF   "-jumbot"
#define CMD_AUTOJUMP_ON  "+autojump"
#define CMD_AUTOJUMP_OFF "-autojump"

#define CG_ADDCOMMAND 18
#define CG_GETCURRENTCMDNUMBER 82
#define CG_GETUSERCMD 83

#define ENTITYNUM_NONE 1023

#define ADDR_COM_ARGV 0x41FA30
#define ADDR_MOUSE_X  0x13EEA8C
#define ADDR_KEY_UP   0x0835AD8

#define OFFSET_VELOCITY           8 * 4
#define OFFSET_GROUND_ENTITY_NUM 20 * 4
#define OFFSET_VIEW              45 * 4

#define MOUSE_SAFE_PAD 0.3
#define MIN_SPEED      320

char* (*Cmd_Argv)(int arg);

typedef struct usercmd_s {
	int _pad[5];
	signed char forwardmove, rightmove;
	char __pad[3];
} usercmd_t;

struct vector2 {
	float x;
	float y;
};

struct vector3 {
	float x;
	float y;
	float z;
};

struct jumbot {
	void   *cgame;
	void  (*cg_dllEntry)(int (*)(int, ...));
	int   (*cg_vmMain)(int, ...);
	int   (*syscall)(int, ...);
	void  (*ETPro_AC)(void*, void*, void*, int, void*, char*);
	void* (*ETPro_AC2)(DWORD);
	HINSTANCE (__stdcall *LoadLibraryA)(LPCSTR);
	FARPROC   (__stdcall *GetProcAddress)(HMODULE, LPCSTR);
	BOOL  ETPro;
	BOOL  enabled;
	BOOL  autojump;
	struct vector3* velocity;
	struct vector2* view;
	int   *groundEntityNum;
	float *mouseX;
	struct mod* mod;
} jumbot;

enum {
	CG_INIT,
	CG_SHUTDOWN,
	CG_CONSOLE_COMMAND,
	CG_DRAW_ACTIVE_FRAME
};

struct mod {
	char*        name;
	unsigned int offset;
};

struct mod mods[] = {
	{"etpro",  0x37B1340},
	{"tjmod",  0x358C2C0},
	{"etjump", 0x1EF58B8},
};

#endif