#pragma once namespace game { typedef float vec_t; typedef vec_t vec2_t[2]; typedef vec_t vec3_t[3]; typedef vec_t vec4_t[4]; enum scriptInstance_t { SCRIPTINSTANCE_SERVER, SCRIPTINSTANCE_CLIENT, }; struct scr_entref_t { unsigned short entnum; unsigned short classnum; int client; }; struct BuiltinMethodDef { const char* actionString; unsigned int constId; int min_args; int max_args; void(__cdecl* actionFunc)(scr_entref_t); int type; }; struct BuiltinFunctionDef { const char* actionString; unsigned int constId; int min_args; int max_args; void(__cdecl* actionFunc)(); int type; }; enum scriptType_e { SCRIPT_NONE = 0, SCRIPT_OBJECT = 1, SCRIPT_STRING = 2, SCRIPT_ISTRING = 3, SCRIPT_VECTOR = 4, SCRIPT_FLOAT = 5, SCRIPT_INTEGER = 6, SCRIPT_CODEPOS = 7, SCRIPT_END = 8, SCRIPT_FUNCTION = 9, SCRIPT_THREAD = 13, SCRIPT_NOTIFY_THREAD = 14, SCRIPT_TIME_THREAD = 15, SCRIPT_STRUCT = 17, SCRIPT_ENTITY = 19, SCRIPT_ARRAY = 20, SCRIPT_FREE = 0x17, }; struct VariableStackBuffer { const char* pos; unsigned __int16 size; unsigned __int16 bufLen; unsigned __int16 localId; char time; char buf[1]; }; union VariableUnion { int intValue; unsigned int uintValue; float floatValue; unsigned int stringValue; const float* vectorValue; const char* codePosValue; unsigned int pointerValue; VariableStackBuffer* stackValue; unsigned int entityOffset; }; struct VariableValue { VariableUnion u; int type; }; struct function_stack_t { char* pos; VariableValue* top; unsigned int localId; unsigned int localVarCount; VariableValue* startTop; }; struct function_frame_t { function_stack_t fs; }; struct scrVmPub_t { unsigned int* localVars; VariableValue* maxstack; int function_count; function_frame_t* function_frame; VariableValue* top; bool abort_on_error; bool terminal_error; bool block_execution; unsigned int inparamcount; unsigned int outparamcount; function_frame_t function_frame_start[32]; VariableValue stack[2048]; void(__cdecl* notifyListeners[1])(unsigned int, unsigned int); }; static_assert(offsetof(scrVmPub_t, top) == 16); static_assert(offsetof(scrVmPub_t, inparamcount) == 24); struct scrVarPub_t { const char* fieldBuffer; unsigned __int16 canonicalStrCount; bool developer; bool developer_script; bool evaluate; const char* error_message; int error_index; unsigned int time; unsigned int timeArrayId; unsigned int pauseArrayId; unsigned int levelId; unsigned int gameId; unsigned int animId; unsigned int freeEntList; unsigned int tempVariable; bool bInited; unsigned __int16 savecount; unsigned int checksum; unsigned int entId; unsigned int entFieldName; void* programHunkUser; const char* programBuffer; const char* endScriptBuffer; unsigned __int16* saveIdMap; unsigned __int16* saveIdMapRev; unsigned int numScriptThreads; unsigned int numScriptValues; unsigned int numScriptObjects; const char* varUsagePos; int ext_threadcount; int totalObjectRefCount; volatile int totalVectorRefCount; }; union Variable_u { unsigned int prev; unsigned int prevSibling; }; struct Variable { unsigned int id; Variable_u u; }; union ObjectInfo_u { unsigned __int16 entnum; unsigned __int16 size; unsigned int nextEntId; unsigned int self; }; struct ObjectInfo { unsigned __int16 refCount; ObjectInfo_u u; }; union VariableValueInternal_u { unsigned int next; VariableUnion u; ObjectInfo o; }; union VariableValueInternal_w { unsigned int status; unsigned int type; unsigned int name; unsigned int classnum; unsigned int notifyName; unsigned int waitTime; unsigned int parentLocalId; }; union VariableValueInternal_v { unsigned int next; unsigned int index; }; enum fsMode_t { FS_READ = 0x0, FS_WRITE = 0x1, FS_APPEND = 0x2, FS_APPEND_SYNC = 0x3, }; enum errorParm_t { ERR_FATAL = 0x0, ERR_DROP = 0x1, ERR_SERVERDISCONNECT = 0x2, ERR_DISCONNECT = 0x3, ERR_SCRIPT = 0x4, ERR_SCRIPT_DROP = 0x5, ERR_LOCALIZATION = 0x6, }; enum conChannel_t { CON_CHANNEL_DONT_FILTER = 0x0, CON_CHANNEL_ERROR = 0x1, CON_CHANNEL_GAMENOTIFY = 0x2, CON_CHANNEL_BOLDGAME = 0x3, CON_CHANNEL_SUBTITLE = 0x4, CON_CHANNEL_OBITUARY = 0x5, CON_CHANNEL_LOGFILEONLY = 0x6, CON_CHANNEL_CONSOLEONLY = 0x7, CON_CHANNEL_GFX = 0x8, CON_CHANNEL_SOUND = 0x9, CON_CHANNEL_FILES = 0xA, CON_CHANNEL_DEVGUI = 0xB, CON_CHANNEL_PROFILE = 0xC, CON_CHANNEL_UI = 0xD, CON_CHANNEL_CLIENT = 0xE, CON_CHANNEL_SERVER = 0xF, CON_CHANNEL_SYSTEM = 0x10, CON_CHANNEL_PLAYERWEAP = 0x11, CON_CHANNEL_AI = 0x12, CON_CHANNEL_ANIM = 0x13, CON_CHANNEL_PHYS = 0x14, CON_CHANNEL_FX = 0x15, CON_CHANNEL_LEADERBOARDS = 0x16, CON_CHANNEL_LIVE = 0x17, CON_CHANNEL_PARSERSCRIPT = 0x18, CON_CHANNEL_SCRIPT = 0x19, CON_CHANNEL_SPAWNSYSTEM = 0x1A, CON_CHANNEL_COOPINFO = 0x1B, CON_CHANNEL_SERVERDEMO = 0x1C, CON_CHANNEL_DDL = 0x1D, CON_CHANNEL_NETWORK = 0x1E, CON_CHANNEL_SCHEDULER = 0x1F, CON_FIRST_DEBUG_CHANNEL = 0x1F, CON_CHANNEL_TASK = 0x20, CON_CHANNEL_SPU = 0x21, CON_BUILTIN_CHANNEL_COUNT = 0x22, }; namespace sp { struct ObjectInfo { unsigned __int16 refCount; unsigned __int16 size; }; union VariableValueInternal_u { VariableUnion u; ObjectInfo o; }; struct VariableValueInternal { unsigned int id; VariableValueInternal_u u; VariableValueInternal_w w; char __pad1[2]; unsigned __int16 nextSibling; }; static_assert(sizeof(VariableValueInternal) == 16); static_assert(offsetof(VariableValueInternal, nextSibling) == 14); static_assert(offsetof(VariableValueInternal, u) == 4); static_assert(offsetof(VariableValueInternal, w) == 8); } namespace mp { struct VariableValueInternal { Variable hash; VariableValueInternal_u u; VariableValueInternal_w w; VariableValueInternal_v v; unsigned int nextSibling; }; } union scrVarGlob_t { sp::VariableValueInternal* variableList_sp; mp::VariableValueInternal* variableList_mp; }; struct scr_classStruct_t { unsigned __int16 id; unsigned __int16 entArrayId; char charId; const char* name; }; enum gclientFlag { NOCLIP = 1 << 0, UFO = 1 << 1, }; enum entityFlag { FL_GODMODE = 1 << 0, FL_DEMI_GODMODE = 1 << 1, FL_NOTARGET = 1 << 2, FL_SUPPORTS_LINKTO = 1 << 12, }; // TODO: Finish struct gclient_s { char __pad0[0x18]; int eflags; char __pad1[0x5668]; int flags; }; struct gentity_s { int number; char __pad0[0x150]; gclient_s* client; // 340 char __pad1[0x30]; int flags; // 392 char __pad2[0x190]; }; static_assert(sizeof(gentity_s) == 0x31C); enum clientState_t { CS_FREE, CS_ZOMBIE, CS_RECONNECTING, CS_CONNECTED, CS_CLIENTLOADING, CS_ACTIVE, }; enum netsrc_t { NS_CLIENT1 = 0x0, NS_CLIENT2 = 0x1, NS_CLIENT3 = 0x2, NS_CLIENT4 = 0x3, NS_SERVER = 0x4, NS_PACKET = 0x5, NS_NULL = -1, }; enum netadrtype_t { NA_BOT = 0x0, NA_BAD = 0x1, NA_LOOPBACK = 0x2, NA_BROADCAST = 0x3, NA_IP = 0x4, }; struct netadr_t { union { unsigned char ip[4]; unsigned int inaddr; }; unsigned __int16 port; netadrtype_t type; netsrc_t localNetID; unsigned __int16 serverID; }; static_assert(sizeof(netadr_t) == 0x14); struct netProfileInfo_t { unsigned char __pad0[0x5E0]; }; struct netchan_t { int outgoingSequence; netsrc_t sock; int dropped; int incomingSequence; netadr_t remoteAddress; int qport; int fragmentSequence; int fragmentLength; unsigned char* fragmentBuffer; int fragmentBufferSize; int unsentFragments; int unsentOnLoan; int unsentFragmentStart; int unsentLength; unsigned char* unsentBuffer; int unsentBufferSize; int reliable_fragments; unsigned char fragment_send_count[128]; unsigned int fragment_ack[4]; int lowest_send_count; netProfileInfo_t prof; }; static_assert(sizeof(netchan_t) == 0x6C8); struct PredictedVehicleDef { bool fullPhysics; vec3_t origin; vec3_t angles; vec3_t tVel; vec3_t aVel; int serverTime; }; static_assert(sizeof(PredictedVehicleDef) == 0x38); struct clientHeader_t { clientState_t state; int sendAsActive; int deltaMessage; int rateDelayed; int hasAckedBaselineData; int hugeSnapshotSent; netchan_t netchan; vec3_t predictedOrigin; int predictedOriginServerTime; int migrationState; PredictedVehicleDef predictedVehicle; }; static_assert(sizeof(clientHeader_t) == 0x72C); struct client_s { clientHeader_t header; const char* dropReason; char userinfo[1024]; unsigned char __pad0[0x3F75C]; int bIsTestClient; unsigned char __pad1[0xDEF0]; }; static_assert(sizeof(client_s) == 0x4E180); struct cmd_function_t { cmd_function_t* next; const char* name; const char* autoCompleteDir; const char* autoCompleteExt; void(__cdecl* function)(); int flags; }; struct CmdArgs { int nesting; int localClientNum[8]; int controllerIndex[8]; void* itemDef[8]; int argshift[8]; int argc[8]; const char** argv[8]; char textPool[8192]; const char* argvPool[512]; int usedTextPool[8]; int totalUsedArgvPool; int totalUsedTextPool; }; enum dvarType_t { DVAR_TYPE_INVALID = 0x0, DVAR_TYPE_BOOL = 0x1, DVAR_TYPE_FLOAT = 0x2, DVAR_TYPE_FLOAT_2 = 0x3, DVAR_TYPE_FLOAT_3 = 0x4, DVAR_TYPE_FLOAT_4 = 0x5, DVAR_TYPE_INT = 0x6, DVAR_TYPE_ENUM = 0x7, DVAR_TYPE_STRING = 0x8, DVAR_TYPE_COLOR = 0x9, DVAR_TYPE_INT64 = 0xA, DVAR_TYPE_LINEAR_COLOR_RGB = 0xB, DVAR_TYPE_COLOR_XYZ = 0xC, DVAR_TYPE_COUNT = 0xD, }; union DvarValue { bool enabled; int integer; unsigned int unsignedInt; __int64 integer64; unsigned __int64 unsignedInt64; float value; vec4_t vector; const char* string; char color[4]; }; struct $A37BA207B3DDD6345C554D4661813EDD { int stringCount; const char* const* strings; }; struct $9CA192F9DB66A3CB7E01DE78A0DEA53D { int min; int max; }; struct $251C2428A496074035CACA7AAF3D55BD { float min; float max; }; struct DvarLimits_integer64 { __int64 min; __int64 max; }; union DvarLimits { $A37BA207B3DDD6345C554D4661813EDD enumeration; $9CA192F9DB66A3CB7E01DE78A0DEA53D integer; $251C2428A496074035CACA7AAF3D55BD value; $251C2428A496074035CACA7AAF3D55BD vector; DvarLimits_integer64 integer64; }; struct dvar_t { const char* name; const char* description; int hash; unsigned int flags; dvarType_t type; bool modified; bool loadedFromSaveGame; DvarValue current; DvarValue latched; DvarValue saved; DvarValue reset; DvarLimits domain; dvar_t* hashNext; }; static_assert(offsetof(dvar_t, hashNext) == 104); static_assert(offsetof(dvar_t, current) == 24); struct GSC_OBJ { char magic[8]; unsigned int source_crc; unsigned int include_offset; unsigned int animtree_offset; unsigned int cseg_offset; unsigned int stringtablefixup_offset; unsigned int exports_offset; unsigned int imports_offset; unsigned int fixup_offset; unsigned int profile_offset; unsigned int cseg_size; unsigned __int16 name; unsigned __int16 stringtablefixup_count; unsigned __int16 exports_count; unsigned __int16 imports_count; unsigned __int16 fixup_count; unsigned __int16 profile_count; char include_count; char animtree_count; char flags; }; struct GSC_EXPORT_ITEM { unsigned int checksum; unsigned int address; unsigned __int16 name; char param_count; char flags; }; // gsc-tool enum class opcode : std::uint8_t { OP_End = 0x0, OP_Return = 0x1, OP_GetUndefined = 0x2, OP_GetZero = 0x3, OP_GetByte = 0x4, OP_GetNegByte = 0x5, OP_GetUnsignedShort = 0x6, OP_GetNegUnsignedShort = 0x7, OP_GetInteger = 0x8, OP_GetFloat = 0x9, OP_GetString = 0xA, OP_GetIString = 0xB, OP_GetVector = 0xC, OP_GetLevelObject = 0xD, OP_GetAnimObject = 0xE, OP_GetSelf = 0xF, OP_GetLevel = 0x10, OP_GetGame = 0x11, OP_GetAnim = 0x12, OP_GetAnimation = 0x13, OP_GetGameRef = 0x14, OP_GetFunction = 0x15, OP_CreateLocalVariable = 0x16, OP_SafeCreateLocalVariables = 0x17, OP_RemoveLocalVariables = 0x18, OP_EvalLocalVariableCached = 0x19, OP_EvalArray = 0x1A, OP_EvalLocalArrayRefCached = 0x1B, OP_EvalArrayRef = 0x1C, OP_ClearArray = 0x1D, OP_EmptyArray = 0x1E, OP_GetSelfObject = 0x1F, OP_EvalFieldVariable = 0x20, OP_EvalFieldVariableRef = 0x21, OP_ClearFieldVariable = 0x22, OP_SafeSetVariableFieldCached = 0x23, OP_SafeSetWaittillVariableFieldCached = 0x24, OP_ClearParams = 0x25, OP_CheckClearParams = 0x26, OP_EvalLocalVariableRefCached = 0x27, OP_SetVariableField = 0x28, OP_CallBuiltin = 0x29, OP_CallBuiltinMethod = 0x2A, OP_Wait = 0x2B, OP_WaitTillFrameEnd = 0x2C, OP_PreScriptCall = 0x2D, OP_ScriptFunctionCall = 0x2E, OP_ScriptFunctionCallPointer = 0x2F, OP_ScriptMethodCall = 0x30, OP_ScriptMethodCallPointer = 0x31, OP_ScriptThreadCall = 0x32, OP_ScriptThreadCallPointer = 0x33, OP_ScriptMethodThreadCall = 0x34, OP_ScriptMethodThreadCallPointer = 0x35, OP_DecTop = 0x36, OP_CastFieldObject = 0x37, OP_CastBool = 0x38, OP_BoolNot = 0x39, OP_BoolComplement = 0x3A, OP_JumpOnFalse = 0x3B, OP_JumpOnTrue = 0x3C, OP_JumpOnFalseExpr = 0x3D, OP_JumpOnTrueExpr = 0x3E, OP_Jump = 0x3F, OP_JumpBack = 0x40, OP_Inc = 0x41, OP_Dec = 0x42, OP_Bit_Or = 0x43, OP_Bit_Xor = 0x44, OP_Bit_And = 0x45, OP_Equal = 0x46, OP_NotEqual = 0x47, OP_LessThan = 0x48, OP_GreaterThan = 0x49, OP_LessThanOrEqualTo = 0x4A, OP_GreaterThanOrEqualTo = 0x4B, OP_ShiftLeft = 0x4C, OP_ShiftRight = 0x4D, OP_Plus = 0x4E, OP_Minus = 0x4F, OP_Multiply = 0x50, OP_Divide = 0x51, OP_Modulus = 0x52, OP_SizeOf = 0x53, OP_WaitTillMatch = 0x54, OP_WaitTill = 0x55, OP_Notify = 0x56, OP_EndOn = 0x57, OP_VoidCodePos = 0x58, OP_Switch = 0x59, OP_EndSwitch = 0x5A, OP_Vector = 0x5B, OP_GetHash = 0x5C, OP_RealWait = 0x5D, OP_VectorConstant = 0x5E, OP_IsDefined = 0x5F, OP_VectorScale = 0x60, OP_AnglesToUp = 0x61, OP_AnglesToRight = 0x62, OP_AnglesToForward = 0x63, OP_AngleClamp180 = 0x64, OP_VectorToAngles = 0x65, OP_Abs = 0x66, OP_GetTime = 0x67, OP_GetDvar = 0x68, OP_GetDvarInt = 0x69, OP_GetDvarFloat = 0x6A, OP_GetDvarVector = 0x6B, OP_GetDvarColorRed = 0x6C, OP_GetDvarColorGreen = 0x6D, OP_GetDvarColorBlue = 0x6E, OP_GetDvarColorAlpha = 0x6F, OP_FirstArrayKey = 0x70, OP_NextArrayKey = 0x71, OP_ProfileStart = 0x72, OP_ProfileStop = 0x73, OP_SafeDecTop = 0x74, OP_Nop = 0x75, OP_Abort = 0x76, OP_Object = 0x77, OP_ThreadObject = 0x78, OP_EvalLocalVariable = 0x79, OP_EvalLocalVariableRef = 0x7A, OP_DevblockBegin = 0x7B, OP_DevblockEnd = 0x7C, OP_Breakpoint = 0x7D, OP_Count = 0x7E, }; enum XAssetType { ASSET_TYPE_XMODELPIECES = 0x0, ASSET_TYPE_PHYSPRESET = 0x1, ASSET_TYPE_PHYSCONSTRAINTS = 0x2, ASSET_TYPE_DESTRUCTIBLEDEF = 0x3, ASSET_TYPE_XANIMPARTS = 0x4, ASSET_TYPE_XMODEL = 0x5, ASSET_TYPE_MATERIAL = 0x6, ASSET_TYPE_TECHNIQUE_SET = 0x7, ASSET_TYPE_IMAGE = 0x8, ASSET_TYPE_SOUND = 0x9, ASSET_TYPE_SOUND_PATCH = 0xA, ASSET_TYPE_CLIPMAP = 0xB, ASSET_TYPE_CLIPMAP_PVS = 0xC, ASSET_TYPE_COMWORLD = 0xD, ASSET_TYPE_GAMEWORLD_SP = 0xE, ASSET_TYPE_GAMEWORLD_MP = 0xF, ASSET_TYPE_MAP_ENTS = 0x10, ASSET_TYPE_GFXWORLD = 0x11, ASSET_TYPE_LIGHT_DEF = 0x12, ASSET_TYPE_UI_MAP = 0x13, ASSET_TYPE_FONT = 0x14, ASSET_TYPE_FONTICON = 0x15, ASSET_TYPE_MENULIST = 0x16, ASSET_TYPE_MENU = 0x17, ASSET_TYPE_LOCALIZE_ENTRY = 0x18, ASSET_TYPE_WEAPON = 0x19, ASSET_TYPE_WEAPONDEF = 0x1A, ASSET_TYPE_WEAPON_VARIANT = 0x1B, ASSET_TYPE_WEAPON_FULL = 0x1C, ASSET_TYPE_ATTACHMENT = 0x1D, ASSET_TYPE_ATTACHMENT_UNIQUE = 0x1E, ASSET_TYPE_WEAPON_CAMO = 0x1F, ASSET_TYPE_SNDDRIVER_GLOBALS = 0x20, ASSET_TYPE_FX = 0x21, ASSET_TYPE_IMPACT_FX = 0x22, ASSET_TYPE_AITYPE = 0x23, ASSET_TYPE_MPTYPE = 0x24, ASSET_TYPE_MPBODY = 0x25, ASSET_TYPE_MPHEAD = 0x26, ASSET_TYPE_CHARACTER = 0x27, ASSET_TYPE_XMODELALIAS = 0x28, ASSET_TYPE_RAWFILE = 0x29, ASSET_TYPE_STRINGTABLE = 0x2A, ASSET_TYPE_LEADERBOARD = 0x2B, ASSET_TYPE_XGLOBALS = 0x2C, ASSET_TYPE_DDL = 0x2D, ASSET_TYPE_GLASSES = 0x2E, ASSET_TYPE_EMBLEMSET = 0x2F, ASSET_TYPE_SCRIPTPARSETREE = 0x30, ASSET_TYPE_KEYVALUEPAIRS = 0x31, ASSET_TYPE_VEHICLEDEF = 0x32, ASSET_TYPE_MEMORYBLOCK = 0x33, ASSET_TYPE_ADDON_MAP_ENTS = 0x34, ASSET_TYPE_TRACER = 0x35, ASSET_TYPE_SKINNEDVERTS = 0x36, ASSET_TYPE_QDB = 0x37, ASSET_TYPE_SLUG = 0x38, ASSET_TYPE_FOOTSTEP_TABLE = 0x39, ASSET_TYPE_FOOTSTEPFX_TABLE = 0x3A, ASSET_TYPE_ZBARRIER = 0x3B, ASSET_TYPE_COUNT = 0x3C, ASSET_TYPE_STRING = 0x3C, ASSET_TYPE_ASSETLIST = 0x3D, ASSET_TYPE_REPORT = 0x3E, ASSET_TYPE_DEPEND = 0x3F, ASSET_TYPE_FULL_COUNT = 0x40, }; struct ScriptParseTree { const char* name; int len; GSC_OBJ* obj; }; struct objFileInfo_t { GSC_OBJ* activeVersion; char __pad[0x24]; }; union XAssetHeader { ScriptParseTree* scriptParseTree; }; union sval_u { unsigned __int8 type; unsigned int stringValue; unsigned int idValue; float floatValue; int intValue; sval_u* node; unsigned int sourcePosValue; const char* codePosValue; const char* debugString; void* block; }; }