Welp, that bug was really silly.
This commit is contained in:
parent
ed63b02d6f
commit
db4150b651
@ -408,6 +408,43 @@ class UploadThread: public IThread
|
||||
|
||||
} uploadThread;
|
||||
|
||||
class VFuncEmptyClass {};
|
||||
|
||||
const char *GetCmdLine()
|
||||
{
|
||||
static int getCmdLineOffset = 0;
|
||||
if (getCmdLineOffset == 0) {
|
||||
if (!gameconfig || !gameconfig->GetOffset("GetCmdLine", &getCmdLineOffset)) {
|
||||
return "";
|
||||
}
|
||||
if (getCmdLineOffset == 0) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
void *cmdline = gamehelpers->GetValveCommandLine();
|
||||
void **vtable = *(void ***)cmdline;
|
||||
void *vfunc = vtable[getCmdLineOffset];
|
||||
|
||||
union {
|
||||
const char *(VFuncEmptyClass::*mfpnew)();
|
||||
#ifndef WIN32
|
||||
struct {
|
||||
void *addr;
|
||||
intptr_t adjustor;
|
||||
} s;
|
||||
} u;
|
||||
u.s.addr = vfunc;
|
||||
u.s.adjustor = 0;
|
||||
#else
|
||||
void *addr;
|
||||
} u;
|
||||
u.addr = vfunc;
|
||||
#endif
|
||||
|
||||
return (const char *)(reinterpret_cast<VFuncEmptyClass*>(cmdline)->*u.mfpnew)();
|
||||
}
|
||||
|
||||
bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
||||
{
|
||||
sharesys->AddDependency(myself, "webternet.ext", true, true);
|
||||
@ -483,6 +520,49 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late)
|
||||
delete i;
|
||||
#endif
|
||||
|
||||
strncpy(crashGamePath, g_pSM->GetGamePath(), sizeof(crashGamePath) - 1);
|
||||
strncpy(crashCommandLine, GetCmdLine(), sizeof(crashCommandLine) - 1);
|
||||
strncpy(crashSourceModPath, g_pSM->GetSourceModPath(), sizeof(crashSourceModPath) - 1);
|
||||
strncpy(crashGameDirectory, g_pSM->GetGameFolderName(), sizeof(crashGameDirectory) - 1);
|
||||
strncpy(crashExtensionVersion, SMEXT_CONF_VERSION, sizeof(crashExtensionVersion) - 1);
|
||||
|
||||
char steamInfPath[512];
|
||||
g_pSM->BuildPath(Path_Game, steamInfPath, sizeof(steamInfPath), "steam.inf");
|
||||
|
||||
FILE *f = fopen(steamInfPath, "rb");
|
||||
if (!f) {
|
||||
return;
|
||||
}
|
||||
|
||||
char steamInfTemp[256] = {0};
|
||||
fread(steamInfTemp, sizeof(char), sizeof(steamInfTemp) - 1, f);
|
||||
|
||||
fclose(f);
|
||||
|
||||
unsigned source = 0;
|
||||
strcpy(steamInf, "\nSteam_");
|
||||
unsigned target = 7; // strlen("\nSteam_");
|
||||
while (true) {
|
||||
if (steamInfTemp[source] == '\0') {
|
||||
source++;
|
||||
break;
|
||||
}
|
||||
if (steamInfTemp[source] == '\r') {
|
||||
source++;
|
||||
continue;
|
||||
}
|
||||
if (steamInfTemp[source] == '\n') {
|
||||
source++;
|
||||
if (steamInfTemp[source] == '\0') {
|
||||
break;
|
||||
}
|
||||
strcpy(&steamInf[target], "\nSteam_");
|
||||
target += 7;
|
||||
continue;
|
||||
}
|
||||
steamInf[target++] = steamInfTemp[source++];
|
||||
}
|
||||
|
||||
if (late) {
|
||||
this->OnCoreMapStart(NULL, 0, 0);
|
||||
}
|
||||
@ -505,88 +585,7 @@ void Accelerator::SDK_OnUnload()
|
||||
delete handler;
|
||||
}
|
||||
|
||||
class VFuncEmptyClass {};
|
||||
|
||||
const char *GetCmdLine()
|
||||
{
|
||||
static int getCmdLineOffset = 0;
|
||||
if (getCmdLineOffset == 0) {
|
||||
if (!gameconfig || !gameconfig->GetOffset("GetCmdLine", &getCmdLineOffset)) {
|
||||
return "";
|
||||
}
|
||||
if (getCmdLineOffset == 0) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
void *cmdline = gamehelpers->GetValveCommandLine();
|
||||
void **vtable = *(void ***)cmdline;
|
||||
void *vfunc = vtable[getCmdLineOffset];
|
||||
|
||||
union {
|
||||
const char *(VFuncEmptyClass::*mfpnew)();
|
||||
#ifndef WIN32
|
||||
struct {
|
||||
void *addr;
|
||||
intptr_t adjustor;
|
||||
} s;
|
||||
} u;
|
||||
u.s.addr = vfunc;
|
||||
u.s.adjustor = 0;
|
||||
#else
|
||||
void *addr;
|
||||
} u;
|
||||
u.addr = vfunc;
|
||||
#endif
|
||||
|
||||
return (const char *)(reinterpret_cast<VFuncEmptyClass*>(cmdline)->*u.mfpnew)();
|
||||
}
|
||||
|
||||
void Accelerator::OnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax)
|
||||
{
|
||||
strncpy(crashMap, gamehelpers->GetCurrentMap(), sizeof(crashMap) - 1);
|
||||
strncpy(crashGamePath, g_pSM->GetGamePath(), sizeof(crashGamePath) - 1);
|
||||
strncpy(crashCommandLine, GetCmdLine(), sizeof(crashCommandLine) - 1);
|
||||
strncpy(crashSourceModPath, g_pSM->GetSourceModPath(), sizeof(crashSourceModPath) - 1);
|
||||
strncpy(crashGameDirectory, g_pSM->GetGameFolderName(), sizeof(crashGameDirectory) - 1);
|
||||
strncpy(crashExtensionVersion, SMEXT_CONF_VERSION, sizeof(crashExtensionVersion) - 1);
|
||||
|
||||
char steamInfPath[512];
|
||||
g_pSM->BuildPath(Path_Game, steamInfPath, sizeof(steamInfPath), "steam.inf");
|
||||
|
||||
FILE *f = fopen(steamInfPath, "rb");
|
||||
if (!f) {
|
||||
return;
|
||||
}
|
||||
|
||||
char steamInfTemp[256] = {0};
|
||||
fread(steamInfTemp, sizeof(char), sizeof(steamInfTemp) - 1, f);
|
||||
|
||||
fclose(f);
|
||||
|
||||
// This is horrible, but I'm busy and this is
|
||||
// the first thing I thought of that would work.
|
||||
unsigned source = 0;
|
||||
strcpy(steamInf, "\nSteam_");
|
||||
unsigned target = strlen(steamInf);
|
||||
while (true) {
|
||||
if (steamInfTemp[source] == '\0') {
|
||||
source++;
|
||||
break;
|
||||
}
|
||||
if (steamInfTemp[source] == '\r') {
|
||||
source++;
|
||||
continue;
|
||||
}
|
||||
if (steamInfTemp[source] == '\n') {
|
||||
source++;
|
||||
if (steamInfTemp[source] == '\0') {
|
||||
break;
|
||||
}
|
||||
strcat(steamInf, "\nSteam_");
|
||||
target = strlen(steamInf);
|
||||
continue;
|
||||
}
|
||||
steamInf[target++] = steamInfTemp[source++];
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user