From 1944dc360c852db93d6be2b9c99032cf8340bacd Mon Sep 17 00:00:00 2001 From: JerryALT Date: Tue, 18 Jun 2024 15:08:08 +0300 Subject: [PATCH] [Misc]: Updated files from 'scr/Game' folder --- src/Game/Functions.cpp | 148 ++++++++------ src/Game/Functions.hpp | 19 +- src/Game/Game.cpp | 7 + src/Game/Game.hpp | 3 + src/Game/Structs.hpp | 439 ++++++++++++++++++++++++++++++++++++----- 5 files changed, 502 insertions(+), 114 deletions(-) diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index b430be4..48ae223 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -11,6 +11,7 @@ namespace Game Game::cg_s* cgs = reinterpret_cast(0x6FA590); Game::cgMedia_t* cgMedia = reinterpret_cast(0x729400); Game::cgs_t* cgsArray = reinterpret_cast(0x6FA130); + Game::centity_s* cg_entitiesArray = reinterpret_cast(0x72B6E8); Game::clientActive_t* clients = reinterpret_cast(0x85BD98); Game::clientUIActive_t* clientUIActive = reinterpret_cast(0x85BD70); Game::CinematicGlob* cinematicGlob = reinterpret_cast(0x1621600); @@ -37,8 +38,12 @@ namespace Game Game::uiInfo_s* uiInfo = reinterpret_cast(0x1290F50); Game::weaponInfo_s* cg_weaponsArray = reinterpret_cast(0x6F7C88); Game::WinMouseVars_t* s_wmv = reinterpret_cast(0x13E06F0); + Game::DxGlobals* dx = reinterpret_cast(0x1623F84); int* g_currentMenuType = reinterpret_cast(0x1E209B4); + Game::server_t* sv = reinterpret_cast(0x14B10F8); + Game::serverStatic_t* svs = reinterpret_cast(0x14C2B98); + longjmp_internal_t longjmp_internal = longjmp_internal_t(0x64285C); int* g_waitingForKey = reinterpret_cast(0x1E209C4); @@ -280,7 +285,7 @@ namespace Game if (Game::HasLoadedMod()) fontscalea = fontscalea = scrPlace->scaleVirtualToReal[1] * scale; else - fontscalea = (Dvars::console_menu_style->current.enabled) ? fontscalea = 1.5 * scale : fontscalea = scrPlace->scaleVirtualToReal[1] * scale; + fontscalea = (Dvars::console_menu_style->current.enabled) ? fontscalea = 1.5f * scale : fontscalea = scrPlace->scaleVirtualToReal[1] * scale; const auto ui_smallFont = Dvars::Functions::Dvar_FindVar("ui_smallFont"); const auto ui_extraBigFont = Dvars::Functions::Dvar_FindVar("ui_extraBigFont"); @@ -331,13 +336,13 @@ namespace Game int UI_TextWidth(const char* text, int maxChars, Font_s* font, float scale) { - float normscale = R_NormalizedTextScale(font, scale); + float normscale = static_cast(R_NormalizedTextScale(font, scale)); return (int)((float)R_TextWidth(text, maxChars, font) * normscale); } int UI_TextHeight(Font_s* font, float scale) { - float normscale = R_NormalizedTextScale(font, scale); + float normscale = static_cast(R_NormalizedTextScale(font, scale)); return (int)((float)R_TextHeight(font) * normscale); } @@ -352,7 +357,7 @@ namespace Game { case 7: v7 = *x * ScrPlace->scaleVirtualToReal[0]; - v8 = (float)(ScrPlace->realViewableMin[0] + ScrPlace->realViewableMax[0]) * 0.5; + v8 = (float)(ScrPlace->realViewableMin[0] + ScrPlace->realViewableMax[0]) * 0.5f; *x = v7 + v8; *w = *w * ScrPlace->scaleVirtualToReal[0]; break; @@ -372,7 +377,7 @@ namespace Game break; case 2: v7 = *x * ScrPlace->scaleVirtualToReal[0]; - v8 = 0.5 * ScrPlace->realViewportSize[0]; + v8 = 0.5f * ScrPlace->realViewportSize[0]; *x = v7 + v8; *w = *w * ScrPlace->scaleVirtualToReal[0]; break; @@ -390,7 +395,7 @@ namespace Game { case 7: v9 = *y * ScrPlace->scaleVirtualToReal[1]; - v10 = (float)(ScrPlace->realViewableMin[1] + ScrPlace->realViewableMax[1]) * 0.5; + v10 = (float)(ScrPlace->realViewableMin[1] + ScrPlace->realViewableMax[1]) * 0.5f; *y = v9 + v10; *h = *h * ScrPlace->scaleVirtualToReal[1]; case 6: @@ -409,7 +414,7 @@ namespace Game break; case 2: v9 = *y * ScrPlace->scaleVirtualToReal[1]; - v10 = 0.5 * ScrPlace->realViewportSize[1]; + v10 = 0.5f * ScrPlace->realViewportSize[1]; *y = v9 + v10; *h = *h * ScrPlace->scaleVirtualToReal[1]; break; @@ -430,8 +435,8 @@ namespace Game float yScale = xScale; ScrPlace_ApplyRect(ScrPlace, &ix, &iy, &xScale, &yScale, horzAlign, vertAlign); - int x = floor(ix + 0.5); - int y = floor(iy + 0.5); + float x = floor(ix + 0.5f); + float y = floor(iy + 0.5f); R_AddCmdDrawTextASM(text, maxChars, font, x, y, xScale, yScale, 0.0, color, style); } @@ -677,59 +682,24 @@ namespace Game if (name == boneNames[localBoneIndex]) break; } - *index = localBoneIndex + offset; + *index = static_cast(localBoneIndex + offset); return 1; } - /* - int DObjGetBoneIndex(Game::DObj_s* obj, unsigned int name, unsigned __int8* index) + int DObjGetBoneIndex(const DObj_s* obj/*ecx*/, unsigned int name, unsigned __int8* index) { - int j; // [esp+0h] [ebp-18h] - int ja; // [esp+0h] [ebp-18h] - unsigned int boneIndex; // [esp+4h] [ebp-14h] - int numModels; // [esp+8h] [ebp-10h] - Game::XModel* model; // [esp+Ch] [ebp-Ch] - Game::XModel* modela; // [esp+Ch] [ebp-Ch] - unsigned int localBoneIndex; // [esp+10h] [ebp-8h] - Game::XModel** models; // [esp+14h] [ebp-4h] - - localBoneIndex = *index; - if (localBoneIndex == 255) - return 0; - models = obj->models; - - numModels = obj->numModels; - if (localBoneIndex < obj->numBones) + int result; + const static uint32_t DObjGetBoneIndex_func = 0x59A090; + __asm { - for (j = 0; j < numModels; ++j) - { - model = models[j]; - if (localBoneIndex < model->numBones) - { - if (name != model->boneNames[localBoneIndex]) - break; - return 1; - } - localBoneIndex -= model->numBones; - } + push index; + push name; + mov ecx, obj; + call DObjGetBoneIndex_func; + add esp, 8; + mov result, eax; } - boneIndex = 0; - for (ja = 0; ja < numModels; ++ja) - { - modela = models[ja]; - if (XModelGetBoneIndex(modela, name, boneIndex, index)) - return 1; - boneIndex += modela->numBones; - } - *index = -1; - return 0; - } - */ - - //skill issue - int DObjGetBoneIndex(Game::DObj_s* obj, unsigned int name, unsigned __int8* index) - { - return 1; + return result; } void ChangeViewmodelDobj(int weapIndex /*eax*/, unsigned __int8 weaponModel /*cl*/, Game::XModel* newHands, Game::XModel* newGoggles, Game::XModel* newRocket, Game::XModel* newKnife, char updateClientInfo) @@ -1006,7 +976,7 @@ namespace Game float AngleNormalize360(float angle) { - return (360.0 / 65536) * ((int)(angle * (65536 / 360.0)) & 65535); + return (360.0f / 65536.0f) * ((int)(angle * (65536.0f / 360.0f)) & 65535); } float AngleNormalize180(float angle) { @@ -1054,14 +1024,14 @@ namespace Game break; case 9: v7 = secondChar + (firstChar << 8); - if (Taiwanese_ValidBig5Code(v7)) + if (Taiwanese_ValidBig5Code(static_cast(v7))) { *usedCount = 2; return v7; } break; case 10: - if (sub_55C380(firstChar, secondChar)) + if (sub_55C380(static_cast(firstChar), static_cast(secondChar))) { *usedCount = 2; return secondChar + (firstChar << 8); @@ -1069,7 +1039,7 @@ namespace Game break; case 11: v7 = secondChar + (firstChar << 8); - if (sub_55C3B0(v7)) + if (sub_55C3B0(static_cast(v7))) { *usedCount = 2; return v7; @@ -1415,4 +1385,62 @@ namespace Game add esp, 8; } } + + Game::centity_s* CG_GetEntity(int entityIndex) + { + return &Game::cg_entitiesArray[384 * entityIndex]; + } + + int CL_ControllerIndexFromClientNum() + { + return 0; + } + + float CG_CornerDebugPrint/**/(const float* color/*eax*/, const char* text/*ecx*/, const Game::ScreenPlacement* ScrPlace, float posX, float posY, float labelWidth, const char* label) + { + float result; + const uint32_t CG_CornerDebugPrint_func = 0x4113A0; + __asm + { + push label; + + sub esp, 0Ch; + + fld labelWidth; + fstp [esp + 8h]; + + fld posY; + fstp [esp + 4h]; + + fld posX; + fstp [esp]; + + push ScrPlace; + + mov eax, [color]; + mov ecx, [text]; + + call CG_CornerDebugPrint_func; + add esp, 14h; + fstp dword ptr[result]; + } + return result; + } + + Com_ClientDObjCreate_t Com_ClientDObjCreate = Com_ClientDObjCreate_t(0x535F30); + + + void AmmoColor(cg_s* cgameGlob/*edi*/, float* color/*esi*/, int weapIndex/*eax*/) + { + const uint32_t AmmoColor_func = 0x408CA0; + __asm + { + pushad; + mov edi, [cgameGlob]; + mov esi, [color]; + mov eax, weapIndex; + call AmmoColor_func; + popad; + } + } } \ No newline at end of file diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 04c7199..86564b9 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -18,6 +18,7 @@ namespace Game extern Game::cg_s* cgs; extern Game::cgMedia_t* cgMedia; extern Game::cgs_t* cgsArray; + extern Game::centity_s* cg_entitiesArray; extern Game::clientActive_t* clients; extern Game::clientUIActive_t* clientUIActive; extern Game::CinematicGlob* cinematicGlob; @@ -42,8 +43,12 @@ namespace Game extern Game::WeaponDef_s** bg_weaponDefs; extern Game::weaponInfo_s* cg_weaponsArray; extern Game::WinMouseVars_t* s_wmv; + extern Game::DxGlobals* dx; extern int* g_currentMenuType; + extern Game::server_t* sv; + extern Game::serverStatic_t* svs; + extern int* g_waitingForKey; extern bool* isDvarSystemActive; extern int* level_initializing; @@ -172,7 +177,7 @@ namespace Game unsigned int G_GetWeaponIndexForName(const char* name); - int DObjGetBoneIndex(Game::DObj_s* obj, unsigned int name, unsigned __int8* index); + int DObjGetBoneIndex(const DObj_s* obj/*ecx*/, unsigned int name, unsigned __int8* index); int XModelGetBoneIndex(Game::XModel* model, unsigned int name, unsigned int offset, unsigned __int8* index); void ChangeViewmodelDobj(int weapIndex /*eax*/, unsigned __int8 weaponModel /*cl*/, Game::XModel* newHands, Game::XModel* newGoggles, Game::XModel* newRocket, Game::XModel* newKnife, char updateClientInfo); @@ -269,4 +274,16 @@ namespace Game int CG_PlayClientSoundAlias/*eax*/(Game::snd_alias_list_t* aliasList/*eax*/, int localClientNum, float* origin); void DynEntCl_PlayEventFx(const float* origin/*edx*/, int axis/*ecx*/, const Game::FxEffectDef* def, int time); + + Game::centity_s* CG_GetEntity(int entityIndex); + + //rumble + int CL_ControllerIndexFromClientNum(); + + float CG_CornerDebugPrint/**/(const float* color/*eax*/, const char* text/*ecx*/, const Game::ScreenPlacement* ScrPlace, float posX, float posY, float labelWidth, const char* label); + + typedef Game::DObj_s* (*Com_ClientDObjCreate_t)(Game::DObjModel_s* dobjModels, std::uint16_t numModels, Game::XAnimTree_s* tree, int handle); + extern Com_ClientDObjCreate_t Com_ClientDObjCreate; + + void AmmoColor(Game::cg_s* cgameGlob/*edi*/, float* color/*esi*/, int weapIndex/*eax*/); } \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 02a80b4..16832d9 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -5,9 +5,16 @@ namespace Game Game::cgMedia_t_mod cgMediaMod = {}; Game::gui_t gui = {}; + IDirect3DDevice9* d3d9_device = nullptr; + bool HasLoadedMod() { std::string modDir = Dvars::Functions::Dvar_FindVar("fs_game")->current.string; return !modDir.empty(); } + + bool DebugModeEnabled() + { + return Components::Flags::HasFlag("debug"); + } } \ No newline at end of file diff --git a/src/Game/Game.hpp b/src/Game/Game.hpp index 76a2f38..357a212 100644 --- a/src/Game/Game.hpp +++ b/src/Game/Game.hpp @@ -28,5 +28,8 @@ namespace Game extern Game::cgMedia_t_mod cgMediaMod; extern Game::gui_t gui; + extern IDirect3DDevice9* d3d9_device; + bool HasLoadedMod(); + bool DebugModeEnabled(); } \ No newline at end of file diff --git a/src/Game/Structs.hpp b/src/Game/Structs.hpp index 4dbe033..b1f7d20 100644 --- a/src/Game/Structs.hpp +++ b/src/Game/Structs.hpp @@ -128,7 +128,6 @@ namespace Game ASSET_TYPE_ASSETLIST = 0x22, }; - //Sounds Structure typedef enum { SAT_UNKNOWN = 0x0, @@ -1964,36 +1963,40 @@ namespace Game __int16 steerYaw; float time; unsigned __int16 wheelFraction[6]; - char wheelBoneIndex[6]; - char tag_body; - char tag_turret; - char tag_barrel; + unsigned __int8 wheelBoneIndex[6]; + unsigned __int8 tag_body; + unsigned __int8 tag_turret; + unsigned __int8 tag_barrel; }; + struct FxEffect; + struct CEntFx { int triggerTime; - int effect; //FxEffect* + FxEffect* effect; + }; + + union CEntity + { + CEntActorInfo actor; + CEntTurretInfo turret; + CEntVehicleInfo vehicle; + CEntFx fx; }; struct cpose_t { unsigned __int16 lightingHandle; - char eType; - char eTypeUnion; + unsigned __int8 eType; + unsigned __int8 eTypeUnion; bool isRagdoll; int ragdollHandle; int physObjId; int cullIn; float origin[3]; float angles[3]; - union - { - CEntActorInfo actor; - CEntTurretInfo turret; - CEntVehicleInfo vehicle; - CEntFx fx; - }u9; + CEntity ent; }; struct centity_s @@ -2004,7 +2007,7 @@ namespace Game bool nextValid; bool bMuzzleFlash; bool bTrailMade; - char oldEType; + unsigned __int8 oldEType; int previousEventSequence; float lightingOrigin[3]; }; @@ -4330,6 +4333,14 @@ namespace Game XModel** models; }; + struct __declspec(align(4)) DObjModel_s + { + XModel* model; + unsigned __int16 boneName; + bool ignoreCollision; + }; + + struct weaponInfo_s { DObj_s* viewModelDObj; @@ -4406,13 +4417,10 @@ namespace Game struct snapshot_s { int snapFlags; - int ping; int serverTime; playerState_s ps; int numEntities; - int numClients; - entityState_s entities[512]; - //clientState_s clients[64]; + int entityNums[2048]; int serverCommandSequence; }; @@ -4508,31 +4516,6 @@ namespace Game Material* textDecodeCharactersGlow; }cgMedia_t; - /* - struct cg_s - { - int clientNum; - int localClientNum; - int nextState; - DemoType demoType; - CubemapShot cubemapShot; - int renderScreen; - int latestSnapshotNum; - int latestSnapshotTime; - snapshot_s* snap; - snapshot_s* nextSnap; - snapshot_s activeSnapshots[2]; - float frameInterpolation; - int frametime; - int time; - int oldTime; - int physicsTime; - int mapRestart; - //int renderingThirdPerson; - playerState_s predictedPlayerState; - }; - */ - struct playerEntity_t { float fLastWeaponPosFrac; @@ -4628,7 +4611,6 @@ namespace Game OBJST_NUMSTATES = 0x6, }; - //from cod3sp struct objectiveInfo_t { objectiveState_t state; @@ -4774,6 +4756,26 @@ namespace Game int lastPlayedTime; }; + enum InvalidCmdHintType + { + INVALID_CMD_NONE = 0x0, + INVALID_CMD_NO_AMMO_BULLETS = 0x1, + INVALID_CMD_NO_AMMO_FRAG_GRENADE = 0x2, + INVALID_CMD_NO_AMMO_SPECIAL_GRENADE = 0x3, + INVALID_CMD_STAND_BLOCKED = 0x4, + INVALID_CMD_CROUCH_BLOCKED = 0x5, + INVALID_CMD_TARGET_TOO_CLOSE = 0x6, + INVALID_CMD_LOCKON_REQUIRED = 0x7, + INVALID_CMD_NOT_ENOUGH_CLEARANCE = 0x8, + }; + + struct cg_s_shellshock_test + { + int time; + int duration; + }; + + // Reversed struct cg_s { int clientNum; @@ -4797,8 +4799,8 @@ namespace Game int physicsTime; playerState_s predictedPlayerState; centity_s predictedPlayerEntity; - char gap0[12]; playerEntity_t playerEntity; + char gap0[12]; int validPPS; int predictedErrorTime; float predictedError[3]; @@ -4828,7 +4830,7 @@ namespace Game int cursorHintFade; int cursorHintString; int lastClipFlashTime; - int invalidCmdHintType; + InvalidCmdHintType invalidCmdHintType; int invalidCmdHintTime; int lastHealthPulseTime; int lastHealthLerpDelay; @@ -4865,6 +4867,7 @@ namespace Game float kickAVel[3]; float kickAngles[3]; float gunPitch; + bool gameSaved; float gunYaw; float gunXOfs; float gunYOfs; @@ -4878,21 +4881,20 @@ namespace Game float selectedLocation[2]; float compassNorthYaw; float compassNorth[2]; - int compassMapMaterial; + Material* compassMapMaterial; float compassMapUpperLeft[2]; float compassMapWorldSize[2]; int compassFadeTime; int healthFadeTime; - char gap1[4]; int ammoFadeTime; int stanceFadeTime; int sprintFadeTime; int offhandFadeTime; - int offhandFlashTime; + char gap1[4]; objectiveInfo_t objectives[16]; targetInfo_t targets[32]; shellshock_t shellshock; - cgShockinfo_t testShock; + cg_s_shellshock_test testShock; int holdBreathTime; int holdBreathInTime; int holdBreathDelay; @@ -4910,6 +4912,7 @@ namespace Game visionSetVars_t visionSetTo[2]; visionSetVars_t visionSetCurrent[2]; visionSetLerpData_t visionSetLerpData[2]; + char gap2[12]; char visionNameNaked[64]; char visionNameNight[64]; int extraButtons; @@ -4918,8 +4921,8 @@ namespace Game int stepViewStart; float stepViewChange; float zNear; + int cinematicTime; hudElemSoundInfo_t hudElemSound[32]; - char gap2[16]; }; enum svscmd_type @@ -6382,4 +6385,334 @@ namespace Game bool cinematicFinished; char gap0[1788]; }; + + struct GfxWindowTarget + { + HWND__* hwnd; + IDirect3DSwapChain9* swapChain; + int width; + int height; + }; + + struct __declspec(align(8)) DxGlobals + { + IDirect3D9* d3d9; + IDirect3DDevice9* device; + unsigned int adapterIndex; + bool adapterNativeIsValid; + int adapterNativeWidth; + int adapterNativeHeight; + int adapterFullscreenWidth; + int adapterFullscreenHeight; + int depthStencilFormat; + unsigned int displayModeCount; + _D3DDISPLAYMODE displayModes[256]; + const char* resolutionNameTable[257]; + const char* refreshRateNameTable[257]; + char modeText[5120]; + IDirect3DQuery9* fencePool[8]; + unsigned int nextFence; + int gpuSync; + int multiSampleType; + unsigned int multiSampleQuality; + int sunSpriteSamples; + IDirect3DSurface9* singleSampleDepthStencilSurface; + bool deviceLost; + bool inScene; + int targetWindowIndex; + int windowCount; + GfxWindowTarget windows[1]; + int flushGpuQueryCount; + IDirect3DQuery9* flushGpuQuery; + unsigned __int64 gpuSyncDelay; + unsigned __int64 gpuSyncStart; + unsigned __int64 gpuSyncEnd; + bool flushGpuQueryIssued; + int linearNonMippedMinFilter; + int linearNonMippedMagFilter; + int linearMippedMinFilter; + int linearMippedMagFilter; + int anisotropicMinFilter; + int anisotropicMagFilter; + int linearMippedAnisotropy; + int anisotropyFor2x; + int anisotropyFor4x; + int mipFilterMode; + unsigned int mipBias; + IDirect3DQuery9* swapFence; + }; + + enum serverState_t + { + SS_DEAD = 0x0, + SS_LOADING = 0x1, + SS_GAME = 0x2, + }; + + struct svEntity_s + { + unsigned __int16 worldSector; + unsigned __int16 nextEntityInWorldSector; + int linkcontents; + float linkmin[2]; + float linkmax[2]; + }; + + struct snapshotEntityNumbers_t + { + int numSnapshotEntities; + int snapshotEntities[2048]; + }; + + // Fully Reversed + struct server_t + { + serverState_t state; + int timeResidual; + bool clearTimeResidual; + int pendingSnapshot; + int inFrame; + int clientMessageTimeout; + int partialFrametime; + int nextFrameTime; + cmodel_t* models[512]; + unsigned __int16 emptyConfigString; + unsigned __int16 configstrings[2815]; + svEntity_s svEntities[2176]; + int gentities; + int gentitySize; + int num_entities; + playerState_s* gameClients; + int gameClientSize; + int checksum; + int levelTime; + int skelTimeStamp; + unsigned int skelMemPos; + int previousTime; + int previousTimeIndex; + int previousTotalTimes[10]; + int previousErrorTimes[10]; + snapshotEntityNumbers_t entityNumbers; + char cmd[1024]; + char cmd2[1024]; + char cmd3[1024]; + char cmd4[1024]; + }; + + struct serverCommandsHeader_t + { + int rover; + int sequence; + int sent; + }; + + struct serverCommands_s + { + serverCommandsHeader_t header; + char buf[8192]; + int commands[256]; + }; + + struct netchan_t + { + int outgoingSequence; + }; + + struct client_t + { + int state; + serverCommands_s reliableCommands; + usercmd_s lastUsercmd; + gentity_s* gentity; + playerState_s frames[1]; + netchan_t netchan; + }; + + enum netadrtype_t + { + NA_BOT = 0x0, + NA_BAD = 0x1, + NA_LOOPBACK = 0x2, + NA_BROADCAST = 0x3, + NA_IP = 0x4, + }; + + struct netadr_t + { + netadrtype_t type; + unsigned __int8 ip[4]; + unsigned __int8 ipx[10]; + unsigned __int16 port; + }; + + // Fully Reversed + struct serverStatic_t + { + int initialized; + int snapFlagServerBit; + client_t* clients; + int numSnapshotEntities; + int nextSnapshotEntities; + netadr_t authorizeAddress; + int playerDeaths; + int playerScore; + }; + + + enum DevEventType + { + EVENT_ACTIVATE = 0x0, + EVENT_DEACTIVATE = 0x1, + EVENT_ACCEPT = 0x2, + EVENT_UPDATE = 0x3, + EVENT_DRAW = 0x4, + EVENT_SAVE = 0x5, + }; + + struct __declspec(align(4)) DevGraph + { + float(*knots)[2]; + int* knotCount; + int knotCountMax; + int selectedKnot; + void(__cdecl* eventCallback)(const DevGraph*, DevEventType, int); + void(__cdecl* textCallback)(const DevGraph*, const float, const float, char*, const int); + void* data; + bool disableEditingEndPoints; + }; + + struct RumbleInfo; + struct RumbleGraph; + + struct RumbleDevguiGraphInfo + { + RumbleInfo* rumbleInfo; + RumbleGraph* rumbleGraph; + }; + + struct RumbleGraph + { + char graphName[64]; + float knots[16][2]; + int knotCount; + DevGraph devguiGraph; + RumbleDevguiGraphInfo devguiGraphInfo; + }; + + struct RumbleInfo + { + int rumbleNameIndex; + float duration; + float range; + RumbleGraph* highRumbleGraph; + RumbleGraph* lowRumbleGraph; + int fadeWithDistance; + int broadcast; + const dvar_s* durationDvar; + const dvar_s* loopDvar; + }; + + union RumbleSource + { + int entityNum; + float pos[3]; + }; + + enum RumbleSourceType + { + RUMBLESOURCE_INVALID = 0x0, + RUMBLESOURCE_ENTITY = 0x1, + RUMBLESOURCE_POS = 0x2, + }; + + struct ActiveRumble + { + RumbleInfo* rumbleInfo; + int startTime; + bool loop; + RumbleSourceType sourceType; + unsigned char scale; + RumbleSource source; + }; + + struct RumbleGlobals + { + RumbleGraph graphs[64]; + RumbleInfo infos[32]; + ActiveRumble activeRumbles[32]; + float receiverPos[3]; + int receiverEntNum; + }; + + //struct level_locals_t + //{ + // gclient_s* clients; + // gentity_s* gentities; + // int gentitySize; + // int num_entities; + // gentity_s* firstFreeEnt; + // gentity_s* lastFreeEnt; + // sentient_s* sentients; + // int actors; + // int vehicles; + // int turrets; + // int initializing; + // int clientIsSpawning; + // int maxclients; + // int framenum; + // int time; + // int previousTime; + // int snapTime; + // int newSession; + // char gap0[4]; + // int actorCount; + // SpawnVar spawnVar; + // int reloadDelayTime; + // int absoluteReloadDelayTime; + // EntHandle droppedWeaponCue[32]; + // int changelevel; + // int bMissionSuccess; + // int bMissionFailed; + // int exitTime; + // int savepersist; + // char cinematic[64]; + // float fFogOpaqueDist; + // float fFogOpaqueDistSqrd; + // unsigned int grenadeHintCount; + // int remapCount; + // int iSearchFrame; + // loading_t loading; + // int actorPredictDepth; + // int bDrawCompassFriendlies; + // int bPlayerIgnoreRadiusDamage; + // int bPlayerIgnoreRadiusDamageLatched; + // int unknown_1; + // unsigned __int8 triggerIndex; + // int currentEntityThink; + // int currentIndex; + // bool checkAnimChange; + // int bRegisterItems; + // int framePos; + // cached_tag_mat_t cachedTagMat; + // cached_tag_mat_t cachedEntTargetTagMat; + // unsigned __int16 soundAliasFirst; + // unsigned __int16 soundAliasLast; + // trigger_info_t pendingTriggerList[256]; + // trigger_info_t currentTriggerList[256]; + // int pendingTriggerListSize; + // int currentTriggerListSize; + // unsigned __int8 entTriggerIndex[2176]; + // unsigned __int8 specialIndex[2176]; + // char gap2[2304]; // <-- need research + // unsigned __int8 cgData_actorOnCompass[32]; + // unsigned __int8 cgData_actorTeam[32]; + // unsigned __int16 modelMap[512]; + // float priorityNodeBias; + // int scriptPrintChannel; + // float compassMapUpperLeft[2]; + // float compassMapWorldSize[2]; + // float compassNorth[2]; + // float mapSunColor[3]; + // float mapSunDirection[3]; + //}; }