From 406f685de2a8882893244dd32812930c4f433303 Mon Sep 17 00:00:00 2001 From: ugozapad Date: Sat, 7 Mar 2026 17:57:26 +0300 Subject: [PATCH] Final --- data/scripts/weapons/weapon_base.lua | 3 -- data/scripts/weapons/weapon_ump.lua | 5 +- src/engine/core.cpp | 80 ++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/data/scripts/weapons/weapon_base.lua b/data/scripts/weapons/weapon_base.lua index 15bc625..5f06f88 100644 --- a/data/scripts/weapons/weapon_base.lua +++ b/data/scripts/weapons/weapon_base.lua @@ -1,8 +1,5 @@ ----------------------------------------------------------- -- weapon_base.lua, Базовый скрипт оружия --- Автор: Кирилл --- Изменяли: --- Дата: 05.03.2026 ----------------------------------------------------------- -- индификаторы состояний FSM diff --git a/data/scripts/weapons/weapon_ump.lua b/data/scripts/weapons/weapon_ump.lua index 3f73031..1334c09 100644 --- a/data/scripts/weapons/weapon_ump.lua +++ b/data/scripts/weapons/weapon_ump.lua @@ -1,8 +1,5 @@ ----------------------------------------------------------- --- weapon_base.lua, Базоавый скрипт оружия --- Автор: Кирилл --- Изменяли: --- Дата: 06.03.2026 +-- weapon_ump.lua, Weapon UMP ----------------------------------------------------------- weapon_ump = inherit_table(weapon_base) diff --git a/src/engine/core.cpp b/src/engine/core.cpp index 6f4a0b4..4b37b39 100644 --- a/src/engine/core.cpp +++ b/src/engine/core.cpp @@ -9,6 +9,81 @@ #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include +#include +#include +#include +#pragma comment(lib, "DbgHelp.lib") + +LONG WINAPI UnhandleExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo) +{ + SYSTEMTIME time; + GetLocalTime(&time); + + char executableName[256]; + GetModuleFileNameA(NULL, executableName, 256); + + char minidumpPath[256]; + sprintf(minidumpPath, "%s_%i-%i-%i_%i-%i-%i-%i.dmp", + executableName, time.wYear, time.wMonth, time.wDay, + time.wHour, time.wMinute, time.wSecond, time.wMilliseconds); + + HANDLE minidumpFile = CreateFileA(minidumpPath, GENERIC_WRITE, + 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + if (minidumpFile != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION minidumpInfo; + minidumpInfo.ThreadId = GetCurrentThreadId(); + minidumpInfo.ExceptionPointers = ExceptionInfo; + minidumpInfo.ClientPointers = FALSE; + + DWORD minidumpType = + MiniDumpNormal | + MiniDumpFilterMemory | + MiniDumpScanMemory | + MiniDumpWithDataSegs | + MiniDumpWithIndirectlyReferencedMemory; + + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), minidumpFile, + (MINIDUMP_TYPE)minidumpType, &minidumpInfo, 0, 0); + + CloseHandle(minidumpFile); + } + + return EXCEPTION_CONTINUE_SEARCH; +} + +void CDebugManager__Initialize() +{ + if (!IsDebuggerPresent()) + SetUnhandledExceptionFilter(UnhandleExceptionFilter); + + char szExecutableDirectory[MAX_PATH]; + int iLen = GetModuleFileNameA(GetModuleHandleA(NULL), szExecutableDirectory, MAX_PATH); + + // Search for last path character + int iExePos = iLen - 4; + int iDirectoryPos = 0; + for (int i = iExePos; i > 0; i--) + { + if (szExecutableDirectory[i] == '\\') + { + iDirectoryPos = i; + break; + } + } + + // Trim string + szExecutableDirectory[iDirectoryPos] = '\0'; + + BOOL bResult = SymInitialize(GetCurrentProcess(), szExecutableDirectory, FALSE); + OutputDebugStringA(bResult ? "SymInitialize ok\n" : "SymInitialize failed\n"); +} + +void CDebugManager__Shutdown() +{ + SymCleanup(GetCurrentProcess()); +} #endif void error_backend(const char* txt) @@ -39,6 +114,7 @@ void Core::Init(int argc, char* argv[]) #ifdef WIN32 //initializeConsole(); + CDebugManager__Initialize(); #endif Logger::Open(); @@ -50,6 +126,10 @@ void Core::Shutdown() // shutdown timer //getSystemTimer()->shutdown(); + +#ifdef WIN32 + CDebugManager__Shutdown(); +#endif } void Core::Frame()