test ci format check

This commit is contained in:
GeckoEidechse 2023-09-17 01:45:16 +02:00
parent b7823492e8
commit 5cbe9f7317
75 changed files with 2338 additions and 2338 deletions

View file

@ -28,8 +28,8 @@ EventOverrideData::EventOverrideData()
// Empty stereo 48000 WAVE file
unsigned char EMPTY_WAVE[45] = {0x52, 0x49, 0x46, 0x46, 0x25, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74,
0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x88, 0x58,
0x01, 0x00, 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00};
0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xAC, 0x00, 0x00, 0x88, 0x58,
0x01, 0x00, 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x74, 0x00, 0x00, 0x00, 0x00};
EventOverrideData::EventOverrideData(const std::string& data, const fs::path& path)
{
@ -45,9 +45,9 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
if (!fs::exists(samplesFolder))
{
spdlog::error(
"Failed reading audio override file {}: samples folder doesn't exist; should be named the same as the definition file without "
"JSON extension.",
path.string());
"Failed reading audio override file {}: samples folder doesn't exist; should be named the same as the definition file without "
"JSON extension.",
path.string());
return;
}
@ -58,10 +58,10 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
if (dataJson.HasParseError())
{
spdlog::error(
"Failed reading audio override file {}: encountered parse error \"{}\" at offset {}",
path.string(),
GetParseError_En(dataJson.GetParseError()),
dataJson.GetErrorOffset());
"Failed reading audio override file {}: encountered parse error \"{}\" at offset {}",
path.string(),
GetParseError_En(dataJson.GetParseError()),
dataJson.GetErrorOffset());
return;
}
@ -87,7 +87,7 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
if (!eventId.IsString())
{
spdlog::error(
"Failed reading audio override file {}: EventId array has a value of invalid type, all must be strings", path.string());
"Failed reading audio override file {}: EventId array has a value of invalid type, all must be strings", path.string());
return;
}
@ -103,8 +103,8 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
else
{
spdlog::error(
"Failed reading audio override file {}: EventId property is of invalid type (must be a string or an array of strings)",
path.string());
"Failed reading audio override file {}: EventId property is of invalid type (must be a string or an array of strings)",
path.string());
return;
}
@ -118,8 +118,8 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
if (!eventId.IsString())
{
spdlog::error(
"Failed reading audio override file {}: EventIdRegex array has a value of invalid type, all must be strings",
path.string());
"Failed reading audio override file {}: EventIdRegex array has a value of invalid type, all must be strings",
path.string());
return;
}
@ -154,8 +154,8 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
else
{
spdlog::error(
"Failed reading audio override file {}: EventIdRegex property is of invalid type (must be a string or an array of strings)",
path.string());
"Failed reading audio override file {}: EventIdRegex property is of invalid type (must be a string or an array of strings)",
path.string());
return;
}
}
@ -181,8 +181,8 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
else
{
spdlog::error(
"Failed reading audio override file {}: AudioSelectionStrategy string must be either \"sequential\" or \"random\"",
path.string());
"Failed reading audio override file {}: AudioSelectionStrategy string must be either \"sequential\" or \"random\"",
path.string());
return;
}
}
@ -217,25 +217,25 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
// thread off the file read
// should we spawn one thread per read? or should there be a cap to the number of reads at once?
std::thread readThread(
[pathString, fileSize, data]
{
std::shared_lock lock(g_CustomAudioManager.m_loadingMutex);
std::ifstream wavStream(pathString, std::ios::binary);
[pathString, fileSize, data]
{
std::shared_lock lock(g_CustomAudioManager.m_loadingMutex);
std::ifstream wavStream(pathString, std::ios::binary);
// would be weird if this got hit, since it would've worked previously
if (wavStream.fail())
{
spdlog::error("Failed async read of audio sample {}", pathString);
return;
}
// would be weird if this got hit, since it would've worked previously
if (wavStream.fail())
{
spdlog::error("Failed async read of audio sample {}", pathString);
return;
}
// read from after the header first to preserve the empty header, then read the header last
wavStream.seekg(0, std::ios::beg);
wavStream.read(reinterpret_cast<char*>(data), fileSize);
wavStream.close();
// read from after the header first to preserve the empty header, then read the header last
wavStream.seekg(0, std::ios::beg);
wavStream.read(reinterpret_cast<char*>(data), fileSize);
wavStream.close();
spdlog::info("Finished async read of audio sample {}", pathString);
});
spdlog::info("Finished async read of audio sample {}", pathString);
});
readThread.detach();
}
@ -244,13 +244,13 @@ EventOverrideData::EventOverrideData(const std::string& data, const fs::path& pa
/*
if (dataJson.HasMember("EnableOnLoopedSounds"))
{
if (!dataJson["EnableOnLoopedSounds"].IsBool())
{
spdlog::error("Failed reading audio override file {}: EnableOnLoopedSounds property is of invalid type (must be a bool)",
if (!dataJson["EnableOnLoopedSounds"].IsBool())
{
spdlog::error("Failed reading audio override file {}: EnableOnLoopedSounds property is of invalid type (must be a bool)",
path.string()); return;
}
}
EnableOnLoopedSounds = dataJson["EnableOnLoopedSounds"].GetBool();
EnableOnLoopedSounds = dataJson["EnableOnLoopedSounds"].GetBool();
}
*/
@ -367,7 +367,7 @@ bool ShouldPlayAudioEvent(const char* eventName, const std::shared_ptr<EventOver
// forward declare
bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal(
uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType);
uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType);
// DO NOT TOUCH THIS FUNCTION
// The actual logic of it in a separate function (forcefully not inlined) to preserve the r12 register, which holds the event pointer.
@ -388,7 +388,7 @@ bool, __fastcall, (void* sample, void* audioBuffer, unsigned int audioBufferLeng
// DO NOT INLINE THIS FUNCTION
// See comment below.
bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal(
uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType)
uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType)
{
char* eventName = (char*)parentEvent + 0x110;

View file

@ -29,7 +29,7 @@ void ConCommand_log(const CCommand& args)
ON_DLL_LOAD_CLIENT_RELIESON("engine.dll", ClientChatCommand, ConCommand, (CModule module))
{
ClientSayText =
module.Offset(0x54780).RCast<void(__fastcall*)(void* a1, const char* message, uint64_t isIngameChat, bool isTeamChat)>();
module.Offset(0x54780).RCast<void(__fastcall*)(void* a1, const char* message, uint64_t isIngameChat, bool isTeamChat)>();
RegisterConCommand("say", ConCommand_say, "Enters a message in public chat", FCVAR_CLIENTDLL);
RegisterConCommand("say_team", ConCommand_say_team, "Enters a message in team chat", FCVAR_CLIENTDLL);
RegisterConCommand("log", ConCommand_log, "Log a message to the local chat window", FCVAR_CLIENTDLL);

View file

@ -22,7 +22,7 @@ void, __fastcall, (void* a1))
{
// if player has agreed to send token and we aren't already authing, try to auth
if (Cvar_ns_has_agreed_to_send_token->GetInt() == AGREED_TO_SEND_TOKEN &&
!g_pMasterServerManager->m_bOriginAuthWithMasterServerInProgress)
!g_pMasterServerManager->m_bOriginAuthWithMasterServerInProgress)
g_pMasterServerManager->AuthenticateOriginWithMasterServer(R2::g_pLocalPlayerUserID, R2::g_pLocalPlayerOriginToken);
// invalidate key so auth will fail
@ -56,8 +56,8 @@ ON_DLL_LOAD_CLIENT_RELIESON("engine.dll", ClientAuthHooks, ConVar, (CModule modu
// this cvar will save to cfg once initially agreed with
Cvar_ns_has_agreed_to_send_token = new ConVar(
"ns_has_agreed_to_send_token",
"0",
FCVAR_ARCHIVE_PLAYERPROFILE,
"whether the user has agreed to send their origin token to the northstar masterserver");
"ns_has_agreed_to_send_token",
"0",
FCVAR_ARCHIVE_PLAYERPROFILE,
"whether the user has agreed to send their origin token to the northstar masterserver");
}

View file

@ -98,24 +98,24 @@ void, __fastcall, (OverlayBase_t * pOverlay))
if (pCurrBox->a > 0)
{
RenderBox(
pCurrBox->origin,
pCurrBox->angles,
pCurrBox->mins,
pCurrBox->maxs,
Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, pCurrBox->a),
false,
false);
pCurrBox->origin,
pCurrBox->angles,
pCurrBox->mins,
pCurrBox->maxs,
Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, pCurrBox->a),
false,
false);
}
if (pCurrBox->a < 255)
{
RenderWireframeBox(
pCurrBox->origin,
pCurrBox->angles,
pCurrBox->mins,
pCurrBox->maxs,
Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, 255),
false,
false);
pCurrBox->origin,
pCurrBox->angles,
pCurrBox->mins,
pCurrBox->maxs,
Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, 255),
false,
false);
}
}
break;

View file

@ -62,9 +62,9 @@ char*, __fastcall, ())
if (!CheckLangAudioExists((char*)forcedLanguage))
{
spdlog::info(
"User tried to force the language (-language) to \"{}\", but audio for this language doesn't exist and the game is bound "
"to error, falling back to next option...",
forcedLanguage);
"User tried to force the language (-language) to \"{}\", but audio for this language doesn't exist and the game is bound "
"to error, falling back to next option...",
forcedLanguage);
}
else
{
@ -80,9 +80,9 @@ char*, __fastcall, ())
if (!CheckLangAudioExists(lang))
{
if (strcmp(lang, "russian") !=
0) // don't log for "russian" since it's the default and that means Origin detection just didn't change it most likely
0) // don't log for "russian" since it's the default and that means Origin detection just didn't change it most likely
spdlog::info(
"Origin detected language \"{}\", but we do not have audio for it installed, falling back to the next option", lang);
"Origin detected language \"{}\", but we do not have audio for it installed, falling back to the next option", lang);
}
else
{
@ -92,14 +92,14 @@ char*, __fastcall, ())
}
Tier0_DetectDefaultLanguageType(); // force the global in tier0 to be populated with language inferred from user's system rather than
// defaulting to Russian
// defaulting to Russian
canOriginDictateLang = false; // Origin has no say anymore, we will fallback to user's system setup language
auto lang = GetGameLanguage();
spdlog::info("Detected system language: {}", lang);
if (!CheckLangAudioExists(lang))
{
spdlog::warn("Caution, audio for this language does NOT exist. You might want to override your game language with -language "
"command line option.");
"command line option.");
auto lang = GetAnyInstalledAudioLanguage();
spdlog::warn("Falling back to the first installed audio language: {}", lang.c_str());
strncpy(ingameLang1, lang.c_str(), 256);

View file

@ -26,10 +26,10 @@ ON_DLL_LOAD_CLIENT_RELIESON("client.dll", LatencyFlex, ConVar, (CModule module))
if (pLfxModule = LoadLibraryA("latencyflex_layer.dll"))
m_winelfx_WaitAndBeginFrame =
reinterpret_cast<void (*)()>(reinterpret_cast<void*>(GetProcAddress(pLfxModule, "lfx_WaitAndBeginFrame")));
reinterpret_cast<void (*)()>(reinterpret_cast<void*>(GetProcAddress(pLfxModule, "lfx_WaitAndBeginFrame")));
else if (pLfxModule = LoadLibraryA("latencyflex_wine.dll"))
m_winelfx_WaitAndBeginFrame =
reinterpret_cast<void (*)()>(reinterpret_cast<void*>(GetProcAddress(pLfxModule, "winelfx_WaitAndBeginFrame")));
reinterpret_cast<void (*)()>(reinterpret_cast<void*>(GetProcAddress(pLfxModule, "winelfx_WaitAndBeginFrame")));
else
{
spdlog::info("Unable to load LatencyFleX library, LatencyFleX disabled.");

View file

@ -73,31 +73,31 @@ typedef void(__fastcall* ConvertANSIToUnicodeType)(LPCSTR ansi, int ansiCharLeng
ConvertANSIToUnicodeType ConvertANSIToUnicode;
LocalChatWriter::SwatchColor swatchColors[4] = {
LocalChatWriter::MainTextColor,
LocalChatWriter::SameTeamNameColor,
LocalChatWriter::EnemyTeamNameColor,
LocalChatWriter::NetworkNameColor,
LocalChatWriter::MainTextColor,
LocalChatWriter::SameTeamNameColor,
LocalChatWriter::EnemyTeamNameColor,
LocalChatWriter::NetworkNameColor,
};
Color darkColors[8] = {
Color {0, 0, 0, 255},
Color {205, 49, 49, 255},
Color {13, 188, 121, 255},
Color {229, 229, 16, 255},
Color {36, 114, 200, 255},
Color {188, 63, 188, 255},
Color {17, 168, 205, 255},
Color {229, 229, 229, 255}};
Color {0, 0, 0, 255},
Color {205, 49, 49, 255},
Color {13, 188, 121, 255},
Color {229, 229, 16, 255},
Color {36, 114, 200, 255},
Color {188, 63, 188, 255},
Color {17, 168, 205, 255},
Color {229, 229, 229, 255}};
Color lightColors[8] = {
Color {102, 102, 102, 255},
Color {241, 76, 76, 255},
Color {35, 209, 139, 255},
Color {245, 245, 67, 255},
Color {59, 142, 234, 255},
Color {214, 112, 214, 255},
Color {41, 184, 219, 255},
Color {255, 255, 255, 255}};
Color {102, 102, 102, 255},
Color {241, 76, 76, 255},
Color {35, 209, 139, 255},
Color {245, 245, 67, 255},
Color {59, 142, 234, 255},
Color {214, 112, 214, 255},
Color {41, 184, 219, 255},
Color {255, 255, 255, 255}};
class AnsiEscapeParser
{

View file

@ -123,7 +123,7 @@ char* ConCommandBase::CopyString(const char* szFrom) const
}
typedef void (*ConCommandConstructorType)(
ConCommand* newCommand, const char* name, FnCommandCallback_t callback, const char* helpString, int flags, void* parent);
ConCommand* newCommand, const char* name, FnCommandCallback_t callback, const char* helpString, int flags, void* parent);
ConCommandConstructorType ConCommandConstructor;
void RegisterConCommand(const char* name, FnCommandCallback_t callback, const char* helpString, int flags)
@ -136,7 +136,7 @@ void RegisterConCommand(const char* name, FnCommandCallback_t callback, const ch
}
void RegisterConCommand(
const char* name, FnCommandCallback_t callback, const char* helpString, int flags, FnCommandCompletionCallback completionCallback)
const char* name, FnCommandCallback_t callback, const char* helpString, int flags, FnCommandCompletionCallback completionCallback)
{
spdlog::info("Registering ConCommand {}", name);

View file

@ -84,7 +84,7 @@ typedef void (*FnCommandCallback_t)(const CCommand& command);
// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings
//-----------------------------------------------------------------------------
typedef int (*__fastcall FnCommandCompletionCallback)(
const char* partial, char commands[COMMAND_COMPLETION_MAXITEMS][COMMAND_COMPLETION_ITEM_LENGTH]);
const char* partial, char commands[COMMAND_COMPLETION_MAXITEMS][COMMAND_COMPLETION_ITEM_LENGTH]);
// From r5reloaded
class ConCommandBase
@ -137,4 +137,4 @@ class ConCommand : public ConCommandBase
void RegisterConCommand(const char* name, void (*callback)(const CCommand&), const char* helpString, int flags);
void RegisterConCommand(
const char* name, void (*callback)(const CCommand&), const char* helpString, int flags, FnCommandCompletionCallback completionCallback);
const char* name, void (*callback)(const CCommand&), const char* helpString, int flags, FnCommandCompletionCallback completionCallback);

View file

@ -8,16 +8,16 @@
#include <float.h>
typedef void (*ConVarRegisterType)(
ConVar* pConVar,
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
void* pCallback);
ConVar* pConVar,
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
void* pCallback);
ConVarRegisterType conVarRegister;
typedef void (*ConVarMallocType)(void* pConVarMaloc, int a2, int a3);
@ -64,15 +64,15 @@ ConVar::ConVar(const char* pszName, const char* pszDefaultValue, int nFlags, con
// Purpose: constructor
//-----------------------------------------------------------------------------
ConVar::ConVar(
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
FnChangeCallback_t pCallback)
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
FnChangeCallback_t pCallback)
{
spdlog::info("Registering Convar {}", pszName);
@ -423,7 +423,7 @@ bool ConVar::SetColorFromString(const char* pszValue)
}
if (nRGBA[0] >= 0 && nRGBA[0] <= 255 && nRGBA[1] >= 0 && nRGBA[1] <= 255 && nRGBA[2] >= 0 && nRGBA[2] <= 255 && nRGBA[3] >= 0 &&
nRGBA[3] <= 255)
nRGBA[3] <= 255)
{
// printf("*** WOW! Found a color!! ***\n");

View file

@ -20,7 +20,7 @@
// ConVar only
#define FCVAR_PROTECTED \
(1 << 5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as
// value.
// value.
#define FCVAR_SPONLY (1 << 6) // This cvar cannot be changed by clients connected to a multiplayer server.
#define FCVAR_ARCHIVE (1 << 7) // set to cause it to be saved to vars.rc
#define FCVAR_NOTIFY (1 << 8) // notifies players when changed
@ -29,8 +29,8 @@
#define FCVAR_PRINTABLEONLY (1 << 10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
#define FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS \
(1 << 10) // When on concommands this allows remote clients to execute this cmd on the server.
// We are changing the default behavior of concommands to disallow execution by remote clients without
// this flag due to the number existing concommands that can lag or crash the server when clients abuse them.
// We are changing the default behavior of concommands to disallow execution by remote clients without
// this flag due to the number existing concommands that can lag or crash the server when clients abuse them.
#define FCVAR_UNLOGGED (1 << 11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
#define FCVAR_NEVER_AS_STRING (1 << 12) // never try to print that cvar
@ -55,7 +55,7 @@
#define FCVAR_SERVER_CAN_EXECUTE \
(1 << 28) // the server is allowed to execute this command on clients via
// ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd.
// ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd.
#define FCVAR_SERVER_CANNOT_QUERY \
(1 << 29) // If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue).
@ -64,7 +64,7 @@
// FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS in all places this flag was previously used
#define FCVAR_CLIENTCMD_CAN_EXECUTE \
(1 << 30) // IVEngineClient::ClientCmd is allowed to execute this command.
// Note: IVEngineClient::ClientCmd_Unrestricted can run any client command.
// Note: IVEngineClient::ClientCmd_Unrestricted can run any client command.
#define FCVAR_ACCESSIBLE_FROM_THREADS (1 << 25) // used as a debugging tool necessary to check material system thread convars
@ -75,40 +75,40 @@
// flag => string stuff
const std::multimap<int, const char*> g_PrintCommandFlags = {
{FCVAR_UNREGISTERED, "UNREGISTERED"},
{FCVAR_DEVELOPMENTONLY, "DEVELOPMENTONLY"},
{FCVAR_GAMEDLL, "GAMEDLL"},
{FCVAR_CLIENTDLL, "CLIENTDLL"},
{FCVAR_HIDDEN, "HIDDEN"},
{FCVAR_PROTECTED, "PROTECTED"},
{FCVAR_SPONLY, "SPONLY"},
{FCVAR_ARCHIVE, "ARCHIVE"},
{FCVAR_NOTIFY, "NOTIFY"},
{FCVAR_USERINFO, "USERINFO"},
{FCVAR_UNREGISTERED, "UNREGISTERED"},
{FCVAR_DEVELOPMENTONLY, "DEVELOPMENTONLY"},
{FCVAR_GAMEDLL, "GAMEDLL"},
{FCVAR_CLIENTDLL, "CLIENTDLL"},
{FCVAR_HIDDEN, "HIDDEN"},
{FCVAR_PROTECTED, "PROTECTED"},
{FCVAR_SPONLY, "SPONLY"},
{FCVAR_ARCHIVE, "ARCHIVE"},
{FCVAR_NOTIFY, "NOTIFY"},
{FCVAR_USERINFO, "USERINFO"},
// TODO: PRINTABLEONLY and GAMEDLL_FOR_REMOTE_CLIENTS are both 1<<10, one is for vars and one is for commands
// this fucking sucks i think
{FCVAR_PRINTABLEONLY, "PRINTABLEONLY"},
{FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS, "GAMEDLL_FOR_REMOTE_CLIENTS"},
// TODO: PRINTABLEONLY and GAMEDLL_FOR_REMOTE_CLIENTS are both 1<<10, one is for vars and one is for commands
// this fucking sucks i think
{FCVAR_PRINTABLEONLY, "PRINTABLEONLY"},
{FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS, "GAMEDLL_FOR_REMOTE_CLIENTS"},
{FCVAR_UNLOGGED, "UNLOGGED"},
{FCVAR_NEVER_AS_STRING, "NEVER_AS_STRING"},
{FCVAR_REPLICATED, "REPLICATED"},
{FCVAR_CHEAT, "CHEAT"},
{FCVAR_SS, "SS"},
{FCVAR_DEMO, "DEMO"},
{FCVAR_DONTRECORD, "DONTRECORD"},
{FCVAR_SS_ADDED, "SS_ADDED"},
{FCVAR_RELEASE, "RELEASE"},
{FCVAR_RELOAD_MATERIALS, "RELOAD_MATERIALS"},
{FCVAR_RELOAD_TEXTURES, "RELOAD_TEXTURES"},
{FCVAR_NOT_CONNECTED, "NOT_CONNECTED"},
{FCVAR_MATERIAL_SYSTEM_THREAD, "MATERIAL_SYSTEM_THREAD"},
{FCVAR_ARCHIVE_PLAYERPROFILE, "ARCHIVE_PLAYERPROFILE"},
{FCVAR_SERVER_CAN_EXECUTE, "SERVER_CAN_EXECUTE"},
{FCVAR_SERVER_CANNOT_QUERY, "SERVER_CANNOT_QUERY"},
{FCVAR_CLIENTCMD_CAN_EXECUTE, "UNKNOWN"},
{FCVAR_ACCESSIBLE_FROM_THREADS, "ACCESSIBLE_FROM_THREADS"}};
{FCVAR_UNLOGGED, "UNLOGGED"},
{FCVAR_NEVER_AS_STRING, "NEVER_AS_STRING"},
{FCVAR_REPLICATED, "REPLICATED"},
{FCVAR_CHEAT, "CHEAT"},
{FCVAR_SS, "SS"},
{FCVAR_DEMO, "DEMO"},
{FCVAR_DONTRECORD, "DONTRECORD"},
{FCVAR_SS_ADDED, "SS_ADDED"},
{FCVAR_RELEASE, "RELEASE"},
{FCVAR_RELOAD_MATERIALS, "RELOAD_MATERIALS"},
{FCVAR_RELOAD_TEXTURES, "RELOAD_TEXTURES"},
{FCVAR_NOT_CONNECTED, "NOT_CONNECTED"},
{FCVAR_MATERIAL_SYSTEM_THREAD, "MATERIAL_SYSTEM_THREAD"},
{FCVAR_ARCHIVE_PLAYERPROFILE, "ARCHIVE_PLAYERPROFILE"},
{FCVAR_SERVER_CAN_EXECUTE, "SERVER_CAN_EXECUTE"},
{FCVAR_SERVER_CANNOT_QUERY, "SERVER_CANNOT_QUERY"},
{FCVAR_CLIENTCMD_CAN_EXECUTE, "UNKNOWN"},
{FCVAR_ACCESSIBLE_FROM_THREADS, "ACCESSIBLE_FROM_THREADS"}};
//-----------------------------------------------------------------------------
// Forward declarations
@ -128,15 +128,15 @@ class ConVar
ConVar(void) {};
ConVar(const char* pszName, const char* pszDefaultValue, int nFlags, const char* pszHelpString);
ConVar(
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
FnChangeCallback_t pCallback);
const char* pszName,
const char* pszDefaultValue,
int nFlags,
const char* pszHelpString,
bool bMin,
float fMin,
bool bMax,
float fMax,
FnChangeCallback_t pCallback);
~ConVar(void);
const char* GetBaseName(void) const;

View file

@ -74,7 +74,7 @@ void SetNewModSearchPaths(Mod* mod)
if ((fs::absolute(mod->m_ModDirectory) / MOD_OVERRIDE_DIR).string().compare(sCurrentModPath))
{
AddSearchPath(
&*(*g_pFilesystem), (fs::absolute(mod->m_ModDirectory) / MOD_OVERRIDE_DIR).string().c_str(), "GAME", PATH_ADD_TO_HEAD);
&*(*g_pFilesystem), (fs::absolute(mod->m_ModDirectory) / MOD_OVERRIDE_DIR).string().c_str(), "GAME", PATH_ADD_TO_HEAD);
sCurrentModPath = (fs::absolute(mod->m_ModDirectory) / MOD_OVERRIDE_DIR).string();
}
}

View file

@ -52,7 +52,7 @@ class IFileSystem
int (*Read)(IFileSystem::VTable2** fileSystem, void* pOutput, int size, FileHandle_t file);
void* unknown[1];
FileHandle_t (*Open)(
IFileSystem::VTable2** fileSystem, const char* pFileName, const char* pOptions, const char* pathID, int64_t unknown);
IFileSystem::VTable2** fileSystem, const char* pFileName, const char* pOptions, const char* pathID, int64_t unknown);
void (*Close)(IFileSystem* fileSystem, FileHandle_t file);
long long (*Seek)(IFileSystem::VTable2** fileSystem, FileHandle_t file, long long offset, long long whence);
void* unknown2[5];

View file

@ -165,7 +165,7 @@ void LoadCustomMapPaks(char** pakName, bool* bNeedToFreePakName)
bHasOriginalPak = true;
*bNeedToFreePakName =
true; // we can't free this memory until we're done with the pak, so let whatever's calling this deal with it
true; // we can't free this memory until we're done with the pak, so let whatever's calling this deal with it
}
else
g_pPakLoadManager->LoadPakAsync((modPakPath / pak.m_sPakName).string().c_str(), ePakLoadSource::MAP);
@ -210,7 +210,7 @@ int, __fastcall, (char* pPath, void* unknownSingleton, int flags, void* pCallbac
// sp_<map> rpaks contain tutorial ghost data
// sucks to have to load the entire rpak for that but sp was never meant to be done on dedi
if (IsDedicatedServer() && (Tier0::CommandLine()->CheckParm("-nopakdedi") ||
strncmp(&originalPath[0], "common", 6) && strncmp(&originalPath[0], "sp_", 3)))
strncmp(&originalPath[0], "common", 6) && strncmp(&originalPath[0], "sp_", 3)))
{
if (bNeedToFreePakName)
delete[] pPath;

View file

@ -13,7 +13,7 @@ AUTOHOOK_INIT()
// called from the ON_DLL_LOAD macros
__dllLoadCallback::__dllLoadCallback(
eDllLoadCallbackSide side, const std::string dllName, DllLoadCallbackFuncType callback, std::string uniqueStr, std::string reliesOn)
eDllLoadCallbackSide side, const std::string dllName, DllLoadCallbackFuncType callback, std::string uniqueStr, std::string reliesOn)
{
// parse reliesOn array from string
std::vector<std::string> reliesOnArray;
@ -78,7 +78,7 @@ void __fileAutohook::DispatchForModule(const char* pModuleName)
for (__autohook* hook : hooks)
if ((hook->iAddressResolutionMode == __autohook::OFFSET_STRING && !strncmp(pModuleName, hook->pAddrString, iModuleNameLen)) ||
(hook->iAddressResolutionMode == __autohook::PROCADDRESS && !strcmp(pModuleName, hook->pModuleName)))
(hook->iAddressResolutionMode == __autohook::PROCADDRESS && !strcmp(pModuleName, hook->pModuleName)))
hook->Dispatch();
}
@ -184,7 +184,7 @@ void AddDllLoadCallback(std::string dll, DllLoadCallbackFuncType callback, std::
}
void AddDllLoadCallbackForDedicatedServer(
std::string dll, DllLoadCallbackFuncType callback, std::string tag, std::vector<std::string> reliesOn)
std::string dll, DllLoadCallbackFuncType callback, std::string tag, std::vector<std::string> reliesOn)
{
if (!IsDedicatedServer())
return;
@ -254,13 +254,13 @@ AUTOHOOK_ABSOLUTEADDR(_GetCommandLineA, (LPVOID)GetCommandLineA, LPSTR, WINAPI,
// both either space after or ending with
if (!isDedi && argBuffer.str().find("-northstar") != std::string::npos)
MessageBoxA(
NULL,
"The \"-northstar\" command line option is NOT supposed to go into ns_startup_args.txt file!\n\nThis option is "
"supposed to go into Origin/Steam game launch options, and then you are supposed to launch the original "
"Titanfall2.exe "
"rather than NorthstarLauncher.exe to make use of it.",
"Northstar Warning",
MB_ICONWARNING);
NULL,
"The \"-northstar\" command line option is NOT supposed to go into ns_startup_args.txt file!\n\nThis option is "
"supposed to go into Origin/Steam game launch options, and then you are supposed to launch the original "
"Titanfall2.exe "
"rather than NorthstarLauncher.exe to make use of it.",
"Northstar Warning",
MB_ICONWARNING);
args.append(argBuffer.str());
}

View file

@ -9,9 +9,9 @@ void InstallInitialHooks();
typedef void (*DllLoadCallbackFuncType)(CModule moduleAddress);
void AddDllLoadCallback(std::string dll, DllLoadCallbackFuncType callback, std::string tag = "", std::vector<std::string> reliesOn = {});
void AddDllLoadCallbackForDedicatedServer(
std::string dll, DllLoadCallbackFuncType callback, std::string tag = "", std::vector<std::string> reliesOn = {});
std::string dll, DllLoadCallbackFuncType callback, std::string tag = "", std::vector<std::string> reliesOn = {});
void AddDllLoadCallbackForClient(
std::string dll, DllLoadCallbackFuncType callback, std::string tag = "", std::vector<std::string> reliesOn = {});
std::string dll, DllLoadCallbackFuncType callback, std::string tag = "", std::vector<std::string> reliesOn = {});
void CallAllPendingDLLLoadCallbacks();
@ -28,11 +28,11 @@ class __dllLoadCallback
public:
__dllLoadCallback() = delete;
__dllLoadCallback(
eDllLoadCallbackSide side,
const std::string dllName,
DllLoadCallbackFuncType callback,
std::string uniqueStr,
std::string reliesOn);
eDllLoadCallbackSide side,
const std::string dllName,
DllLoadCallbackFuncType callback,
std::string uniqueStr,
std::string reliesOn);
};
#define __CONCAT3(x, y, z) x##y##z
@ -47,7 +47,7 @@ class __dllLoadCallback
namespace \
{ \
__dllLoadCallback CONCAT2(__dllLoadCallbackInstance, __LINE__)( \
side, dllName, CONCAT2(__dllLoadCallback, uniquestr), __STR(uniquestr), reliesOn); \
side, dllName, CONCAT2(__dllLoadCallback, uniquestr), __STR(uniquestr), reliesOn); \
} \
void CONCAT2(__dllLoadCallback, uniquestr) args
@ -115,7 +115,7 @@ class __autohook
__autohook() = delete;
__autohook(__fileAutohook* autohook, const char* funcName, LPVOID absoluteAddress, LPVOID* orig, LPVOID func)
: pHookFunc(func), ppOrigFunc(orig), iAbsoluteAddress(absoluteAddress)
: pHookFunc(func), ppOrigFunc(orig), iAbsoluteAddress(absoluteAddress)
{
iAddressResolutionMode = ABSOLUTE_ADDR;
@ -127,7 +127,7 @@ class __autohook
}
__autohook(__fileAutohook* autohook, const char* funcName, const char* addrString, LPVOID* orig, LPVOID func)
: pHookFunc(func), ppOrigFunc(orig)
: pHookFunc(func), ppOrigFunc(orig)
{
iAddressResolutionMode = OFFSET_STRING;
@ -143,7 +143,7 @@ class __autohook
}
__autohook(__fileAutohook* autohook, const char* funcName, const char* moduleName, const char* procName, LPVOID* orig, LPVOID func)
: pHookFunc(func), ppOrigFunc(orig)
: pHookFunc(func), ppOrigFunc(orig)
{
iAddressResolutionMode = PROCADDRESS;
@ -221,7 +221,7 @@ class __autohook
{ \
type(*callingConvention name) args; \
__autohook CONCAT2(__autohook, __LINE__)( \
&__FILEAUTOHOOK, __STR(name), __STR(addrString), (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
&__FILEAUTOHOOK, __STR(name), __STR(addrString), (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
} \
type callingConvention CONCAT2(__autohookfunc, name) args
@ -232,7 +232,7 @@ class __autohook
{ \
type(*callingConvention name) args; \
__autohook \
CONCAT2(__autohook, __LINE__)(&__FILEAUTOHOOK, __STR(name), addr, (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
CONCAT2(__autohook, __LINE__)(&__FILEAUTOHOOK, __STR(name), addr, (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
} \
type callingConvention CONCAT2(__autohookfunc, name) args
@ -243,7 +243,7 @@ class __autohook
{ \
type(*callingConvention name) args; \
__autohook CONCAT2(__autohook, __LINE__)( \
&__FILEAUTOHOOK, __STR(name), __STR(moduleName), __STR(procName), (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
&__FILEAUTOHOOK, __STR(name), __STR(moduleName), __STR(procName), (LPVOID*)&name, (LPVOID)CONCAT2(__autohookfunc, name)); \
} \
type callingConvention CONCAT2(__autohookfunc, name) \
args

View file

@ -7,9 +7,9 @@
INLINE int GetBitForBitnum(int bitNum)
{
static int bitsForBitnum[] = {
(1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), (1 << 8), (1 << 9), (1 << 10),
(1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), (1 << 16), (1 << 17), (1 << 18), (1 << 19), (1 << 20), (1 << 21),
(1 << 22), (1 << 23), (1 << 24), (1 << 25), (1 << 26), (1 << 27), (1 << 28), (1 << 29), (1 << 30), (1 << 31),
(1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), (1 << 8), (1 << 9), (1 << 10),
(1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), (1 << 16), (1 << 17), (1 << 18), (1 << 19), (1 << 20), (1 << 21),
(1 << 22), (1 << 23), (1 << 24), (1 << 25), (1 << 26), (1 << 27), (1 << 28), (1 << 29), (1 << 30), (1 << 31),
};
return bitsForBitnum[(bitNum) & (BITS_PER_INT - 1)];
@ -45,39 +45,39 @@ static INLINE u32 LoadLittleDWord(u32* base, size_t dwordIndex)
#include <algorithm>
static inline const u32 s_nMaskTable[33] = {
0,
(1 << 1) - 1,
(1 << 2) - 1,
(1 << 3) - 1,
(1 << 4) - 1,
(1 << 5) - 1,
(1 << 6) - 1,
(1 << 7) - 1,
(1 << 8) - 1,
(1 << 9) - 1,
(1 << 10) - 1,
(1 << 11) - 1,
(1 << 12) - 1,
(1 << 13) - 1,
(1 << 14) - 1,
(1 << 15) - 1,
(1 << 16) - 1,
(1 << 17) - 1,
(1 << 18) - 1,
(1 << 19) - 1,
(1 << 20) - 1,
(1 << 21) - 1,
(1 << 22) - 1,
(1 << 23) - 1,
(1 << 24) - 1,
(1 << 25) - 1,
(1 << 26) - 1,
(1 << 27) - 1,
(1 << 28) - 1,
(1 << 29) - 1,
(1 << 30) - 1,
0x7fffffff,
0xffffffff,
0,
(1 << 1) - 1,
(1 << 2) - 1,
(1 << 3) - 1,
(1 << 4) - 1,
(1 << 5) - 1,
(1 << 6) - 1,
(1 << 7) - 1,
(1 << 8) - 1,
(1 << 9) - 1,
(1 << 10) - 1,
(1 << 11) - 1,
(1 << 12) - 1,
(1 << 13) - 1,
(1 << 14) - 1,
(1 << 15) - 1,
(1 << 16) - 1,
(1 << 17) - 1,
(1 << 18) - 1,
(1 << 19) - 1,
(1 << 20) - 1,
(1 << 21) - 1,
(1 << 22) - 1,
(1 << 23) - 1,
(1 << 24) - 1,
(1 << 25) - 1,
(1 << 26) - 1,
(1 << 27) - 1,
(1 << 28) - 1,
(1 << 29) - 1,
(1 << 30) - 1,
0x7fffffff,
0xffffffff,
};
enum EBitCoordType
@ -273,158 +273,158 @@ class BFRead : public BitBufferBase
}
/*INLINE float ReadBitCoord() {
i32 intval = 0, fractval = 0, signbit = 0;
float value = 0.0;
i32 intval = 0, fractval = 0, signbit = 0;
float value = 0.0;
// Read the required integer and fraction flags
intval = ReadOneBit();
fractval = ReadOneBit();
// Read the required integer and fraction flags
intval = ReadOneBit();
fractval = ReadOneBit();
// If we got either parse them, otherwise it's a zero.
if (intval || fractval) {
// Read the sign bit
signbit = ReadOneBit();
// If we got either parse them, otherwise it's a zero.
if (intval || fractval) {
// Read the sign bit
signbit = ReadOneBit();
// If there's an integer, read it in
if (intval) {
// Adjust the integers from [0..MAX_COORD_VALUE-1] to [1..MAX_COORD_VALUE]
intval = ReadUBitLong(COORD_INTEGER_BITS) + 1;
}
// If there's an integer, read it in
if (intval) {
// Adjust the integers from [0..MAX_COORD_VALUE-1] to [1..MAX_COORD_VALUE]
intval = ReadUBitLong(COORD_INTEGER_BITS) + 1;
}
// If there's a fraction, read it in
if (fractval) {
fractval = ReadUBitLong(COORD_FRACTIONAL_BITS);
}
// If there's a fraction, read it in
if (fractval) {
fractval = ReadUBitLong(COORD_FRACTIONAL_BITS);
}
// Calculate the correct floating point value
value = intval + ((float)fractval * COORD_RESOLUTION);
// Calculate the correct floating point value
value = intval + ((float)fractval * COORD_RESOLUTION);
// Fixup the sign if negative.
if (signbit)
value = -value;
}
// Fixup the sign if negative.
if (signbit)
value = -value;
}
return value;
return value;
}
INLINE float ReadBitCoordMP() {
i32 intval = 0, fractval = 0, signbit = 0;
float value = 0.0;
i32 intval = 0, fractval = 0, signbit = 0;
float value = 0.0;
bool inBounds = ReadOneBit() ? true : false;
bool inBounds = ReadOneBit() ? true : false;
// Read the required integer and fraction flags
intval = ReadOneBit();
// Read the required integer and fraction flags
intval = ReadOneBit();
// If we got either parse them, otherwise it's a zero.
if (intval) {
// Read the sign bit
signbit = ReadOneBit();
// If we got either parse them, otherwise it's a zero.
if (intval) {
// Read the sign bit
signbit = ReadOneBit();
// If there's an integer, read it in
// Adjust the integers from [0..MAX_COORD_VALUE-1] to [1..MAX_COORD_VALUE]
if (inBounds)
value = ReadUBitLong(COORD_INTEGER_BITS_MP) + 1;
else
value = ReadUBitLong(COORD_INTEGER_BITS) + 1;
}
// If there's an integer, read it in
// Adjust the integers from [0..MAX_COORD_VALUE-1] to [1..MAX_COORD_VALUE]
if (inBounds)
value = ReadUBitLong(COORD_INTEGER_BITS_MP) + 1;
else
value = ReadUBitLong(COORD_INTEGER_BITS) + 1;
}
// Fixup the sign if negative.
if (signbit)
value = -value;
// Fixup the sign if negative.
if (signbit)
value = -value;
return value;
return value;
}
INLINE float ReadBitCellCoord(int bits, EBitCoordType coordType) {
bool bIntegral = (coordType == kCW_Integral);
bool bLowPrecision = (coordType == kCW_LowPrecision);
bool bIntegral = (coordType == kCW_Integral);
bool bLowPrecision = (coordType == kCW_LowPrecision);
int intval = 0, fractval = 0;
float value = 0.0;
int intval = 0, fractval = 0;
float value = 0.0;
if (bIntegral)
value = ReadUBitLong(bits);
else {
intval = ReadUBitLong(bits);
if (bIntegral)
value = ReadUBitLong(bits);
else {
intval = ReadUBitLong(bits);
// If there's a fraction, read it in
fractval = ReadUBitLong(bLowPrecision ? COORD_FRACTIONAL_BITS_MP_LOWPRECISION : COORD_FRACTIONAL_BITS);
// If there's a fraction, read it in
fractval = ReadUBitLong(bLowPrecision ? COORD_FRACTIONAL_BITS_MP_LOWPRECISION : COORD_FRACTIONAL_BITS);
// Calculate the correct floating point value
value = intval + ((float)fractval * (bLowPrecision ? COORD_RESOLUTION_LOWPRECISION : COORD_RESOLUTION));
}
// Calculate the correct floating point value
value = intval + ((float)fractval * (bLowPrecision ? COORD_RESOLUTION_LOWPRECISION : COORD_RESOLUTION));
}
return value;
return value;
}
INLINE float ReadBitNormal() {
// Read the sign bit
i32 signbit = ReadOneBit();
// Read the sign bit
i32 signbit = ReadOneBit();
// Read the fractional part
u32 fractval = ReadUBitLong(NORMAL_FRACTIONAL_BITS);
// Read the fractional part
u32 fractval = ReadUBitLong(NORMAL_FRACTIONAL_BITS);
// Calculate the correct floating point value
float value = (float)fractval * NORMAL_RESOLUTION;
// Calculate the correct floating point value
float value = (float)fractval * NORMAL_RESOLUTION;
// Fixup the sign if negative.
if (signbit)
value = -value;
// Fixup the sign if negative.
if (signbit)
value = -value;
return value;
return value;
}
INLINE void ReadBitVec3Coord(Vector& fa) {
i32 xflag, yflag, zflag;
i32 xflag, yflag, zflag;
// This vector must be initialized! Otherwise, If any of the flags aren't set,
// the corresponding component will not be read and will be stack garbage.
fa.Init(0, 0, 0);
// This vector must be initialized! Otherwise, If any of the flags aren't set,
// the corresponding component will not be read and will be stack garbage.
fa.Init(0, 0, 0);
xflag = ReadOneBit();
yflag = ReadOneBit();
zflag = ReadOneBit();
xflag = ReadOneBit();
yflag = ReadOneBit();
zflag = ReadOneBit();
if (xflag)
fa[0] = ReadBitCoord();
if (yflag)
fa[1] = ReadBitCoord();
if (zflag)
fa[2] = ReadBitCoord();
if (xflag)
fa[0] = ReadBitCoord();
if (yflag)
fa[1] = ReadBitCoord();
if (zflag)
fa[2] = ReadBitCoord();
}
INLINE void ReadBitVec3Normal(Vector& fa) {
i32 xflag = ReadOneBit();
i32 yflag = ReadOneBit();
i32 xflag = ReadOneBit();
i32 yflag = ReadOneBit();
if (xflag)
fa[0] = ReadBitNormal();
else
fa[0] = 0.0f;
if (xflag)
fa[0] = ReadBitNormal();
else
fa[0] = 0.0f;
if (yflag)
fa[1] = ReadBitNormal();
else
fa[1] = 0.0f;
if (yflag)
fa[1] = ReadBitNormal();
else
fa[1] = 0.0f;
// The first two imply the third (but not its sign)
i32 znegative = ReadOneBit();
// The first two imply the third (but not its sign)
i32 znegative = ReadOneBit();
float fafafbfb = fa[0] * fa[0] + fa[1] * fa[1];
if (fafafbfb < 1.0f)
fa[2] = sqrt(1.0f - fafafbfb);
else
fa[2] = 0.0f;
float fafafbfb = fa[0] * fa[0] + fa[1] * fa[1];
if (fafafbfb < 1.0f)
fa[2] = sqrt(1.0f - fafafbfb);
else
fa[2] = 0.0f;
if (znegative)
fa[2] = -fa[2];
if (znegative)
fa[2] = -fa[2];
}
INLINE void ReadBitAngles(QAngle& fa) {
Vector tmp;
ReadBitVec3Coord(tmp);
fa.Init(tmp.x, tmp.y, tmp.z);
Vector tmp;
ReadBitVec3Coord(tmp);
fa.Init(tmp.x, tmp.y, tmp.z);
}*/
INLINE float ReadBitAngle(int numBits)
@ -970,72 +970,72 @@ class BFWrite : public BitBufferBase
}
/*INLINE void WriteBitCoord(const float f) {
i32 signbit = (f <= -COORD_RESOLUTION);
i32 intval = (i32)abs(f);
i32 fractval = abs((i32)(f * COORD_DENOMINATOR)) & (COORD_DENOMINATOR - 1);
i32 signbit = (f <= -COORD_RESOLUTION);
i32 intval = (i32)abs(f);
i32 fractval = abs((i32)(f * COORD_DENOMINATOR)) & (COORD_DENOMINATOR - 1);
// Send the bit flags that indicate whether we have an integer part and/or a fraction part.
WriteOneBit(intval);
WriteOneBit(fractval);
// Send the bit flags that indicate whether we have an integer part and/or a fraction part.
WriteOneBit(intval);
WriteOneBit(fractval);
if (intval || fractval) {
// Send the sign bit
WriteOneBit(signbit);
if (intval || fractval) {
// Send the sign bit
WriteOneBit(signbit);
// Send the integer if we have one.
if (intval) {
// Adjust the integers from [1..MAX_COORD_VALUE] to [0..MAX_COORD_VALUE-1]
intval--;
WriteUBitLong((u32)intval, COORD_INTEGER_BITS);
}
// Send the integer if we have one.
if (intval) {
// Adjust the integers from [1..MAX_COORD_VALUE] to [0..MAX_COORD_VALUE-1]
intval--;
WriteUBitLong((u32)intval, COORD_INTEGER_BITS);
}
// Send the fraction if we have one
if (fractval) {
WriteUBitLong((u32)fractval, COORD_FRACTIONAL_BITS);
}
}
// Send the fraction if we have one
if (fractval) {
WriteUBitLong((u32)fractval, COORD_FRACTIONAL_BITS);
}
}
}
INLINE void WriteBitCoordMP(const float f) {
i32 signbit = (f <= -COORD_RESOLUTION);
i32 intval = (i32)abs(f);
i32 fractval = (abs((i32)(f * COORD_DENOMINATOR)) & (COORD_DENOMINATOR - 1));
i32 signbit = (f <= -COORD_RESOLUTION);
i32 intval = (i32)abs(f);
i32 fractval = (abs((i32)(f * COORD_DENOMINATOR)) & (COORD_DENOMINATOR - 1));
bool bInBounds = intval < (1 << COORD_INTEGER_BITS_MP);
bool bInBounds = intval < (1 << COORD_INTEGER_BITS_MP);
WriteOneBit(bInBounds);
WriteOneBit(bInBounds);
// Send the sign bit
WriteOneBit(intval);
// Send the sign bit
WriteOneBit(intval);
if (intval) {
WriteOneBit(signbit);
if (intval) {
WriteOneBit(signbit);
// Send the integer if we have one.
// Adjust the integers from [1..MAX_COORD_VALUE] to [0..MAX_COORD_VALUE-1]
intval--;
// Send the integer if we have one.
// Adjust the integers from [1..MAX_COORD_VALUE] to [0..MAX_COORD_VALUE-1]
intval--;
if (bInBounds)
WriteUBitLong((u32)intval, COORD_INTEGER_BITS_MP);
else
WriteUBitLong((u32)intval, COORD_INTEGER_BITS);
}
if (bInBounds)
WriteUBitLong((u32)intval, COORD_INTEGER_BITS_MP);
else
WriteUBitLong((u32)intval, COORD_INTEGER_BITS);
}
}
INLINE void WriteBitCellCoord(const float f, int bits, EBitCoordType coordType) {
bool bIntegral = (coordType == kCW_Integral);
bool bLowPrecision = (coordType == kCW_LowPrecision);
bool bIntegral = (coordType == kCW_Integral);
bool bLowPrecision = (coordType == kCW_LowPrecision);
i32 intval = (i32)abs(f);
i32 fractval = bLowPrecision ? (abs((i32)(f * COORD_DENOMINATOR_LOWPRECISION)) & (COORD_DENOMINATOR_LOWPRECISION - 1)) :
i32 intval = (i32)abs(f);
i32 fractval = bLowPrecision ? (abs((i32)(f * COORD_DENOMINATOR_LOWPRECISION)) & (COORD_DENOMINATOR_LOWPRECISION - 1)) :
(abs((i32)(f * COORD_DENOMINATOR)) & (COORD_DENOMINATOR - 1));
if (bIntegral)
WriteUBitLong((u32)intval, bits);
else {
WriteUBitLong((u32)intval, bits);
WriteUBitLong((u32)fractval, bLowPrecision ? COORD_FRACTIONAL_BITS_MP_LOWPRECISION : COORD_FRACTIONAL_BITS);
}
if (bIntegral)
WriteUBitLong((u32)intval, bits);
else {
WriteUBitLong((u32)intval, bits);
WriteUBitLong((u32)fractval, bLowPrecision ? COORD_FRACTIONAL_BITS_MP_LOWPRECISION : COORD_FRACTIONAL_BITS);
}
}*/
INLINE void SeekToBit(int bit)
@ -1048,58 +1048,58 @@ class BFWrite : public BitBufferBase
}
/*INLINE void WriteBitVec3Coord(const Vector& fa) {
i32 xflag, yflag, zflag;
i32 xflag, yflag, zflag;
xflag = (fa[0] >= COORD_RESOLUTION) || (fa[0] <= -COORD_RESOLUTION);
yflag = (fa[1] >= COORD_RESOLUTION) || (fa[1] <= -COORD_RESOLUTION);
zflag = (fa[2] >= COORD_RESOLUTION) || (fa[2] <= -COORD_RESOLUTION);
xflag = (fa[0] >= COORD_RESOLUTION) || (fa[0] <= -COORD_RESOLUTION);
yflag = (fa[1] >= COORD_RESOLUTION) || (fa[1] <= -COORD_RESOLUTION);
zflag = (fa[2] >= COORD_RESOLUTION) || (fa[2] <= -COORD_RESOLUTION);
WriteOneBit(xflag);
WriteOneBit(yflag);
WriteOneBit(zflag);
WriteOneBit(xflag);
WriteOneBit(yflag);
WriteOneBit(zflag);
if (xflag)
WriteBitCoord(fa[0]);
if (yflag)
WriteBitCoord(fa[1]);
if (zflag)
WriteBitCoord(fa[2]);
if (xflag)
WriteBitCoord(fa[0]);
if (yflag)
WriteBitCoord(fa[1]);
if (zflag)
WriteBitCoord(fa[2]);
}
INLINE void WriteBitNormal(float f) {
i32 signbit = (f <= -NORMAL_RESOLUTION);
i32 signbit = (f <= -NORMAL_RESOLUTION);
// NOTE: Since +/-1 are valid values for a normal, I'm going to encode that as all ones
u32 fractval = abs((i32)(f * NORMAL_DENOMINATOR));
// NOTE: Since +/-1 are valid values for a normal, I'm going to encode that as all ones
u32 fractval = abs((i32)(f * NORMAL_DENOMINATOR));
// clamp..
if (fractval > NORMAL_DENOMINATOR)
fractval = NORMAL_DENOMINATOR;
// clamp..
if (fractval > NORMAL_DENOMINATOR)
fractval = NORMAL_DENOMINATOR;
// Send the sign bit
WriteOneBit(signbit);
// Send the sign bit
WriteOneBit(signbit);
// Send the fractional component
WriteUBitLong(fractval, NORMAL_FRACTIONAL_BITS);
// Send the fractional component
WriteUBitLong(fractval, NORMAL_FRACTIONAL_BITS);
}
INLINE void WriteBitVec3Normal(const Vector& fa) {
i32 xflag, yflag;
i32 xflag, yflag;
xflag = (fa[0] >= NORMAL_RESOLUTION) || (fa[0] <= -NORMAL_RESOLUTION);
yflag = (fa[1] >= NORMAL_RESOLUTION) || (fa[1] <= -NORMAL_RESOLUTION);
xflag = (fa[0] >= NORMAL_RESOLUTION) || (fa[0] <= -NORMAL_RESOLUTION);
yflag = (fa[1] >= NORMAL_RESOLUTION) || (fa[1] <= -NORMAL_RESOLUTION);
WriteOneBit(xflag);
WriteOneBit(yflag);
WriteOneBit(xflag);
WriteOneBit(yflag);
if (xflag)
WriteBitNormal(fa[0]);
if (yflag)
WriteBitNormal(fa[1]);
if (xflag)
WriteBitNormal(fa[0]);
if (yflag)
WriteBitNormal(fa[1]);
// Write z sign bit
i32 signbit = (fa[2] <= -NORMAL_RESOLUTION);
WriteOneBit(signbit);
// Write z sign bit
i32 signbit = (fa[2] <= -NORMAL_RESOLUTION);
WriteOneBit(signbit);
}*/
INLINE void WriteBitAngle(float angle, int numBits)
@ -1126,9 +1126,9 @@ class BFWrite : public BitBufferBase
}
/*INLINE void WriteBitAngles(const QAngle& fa) {
// FIXME:
Vector tmp(fa.x, fa.y, fa.z);
WriteBitVec3Coord(tmp);
// FIXME:
Vector tmp(fa.x, fa.y, fa.z);
WriteBitVec3Coord(tmp);
}*/
private:

View file

@ -16,7 +16,7 @@ extern "C" void* _malloc_base(size_t n)
/*extern "C" void* malloc(size_t n)
{
return _malloc_base(n);
return _malloc_base(n);
}*/
extern "C" void _free_base(void* p)

View file

@ -1,7 +1,7 @@
#pragma once
#include "rapidjson/document.h"
//#include "include/rapidjson/allocators.h"
// #include "include/rapidjson/allocators.h"
extern "C" void* _malloc_base(size_t size);
extern "C" void* _calloc_base(size_t const count, size_t const size);

View file

@ -199,9 +199,9 @@ CModule::CModule(const HMODULE pModule)
const IMAGE_SECTION_HEADER& hCurrentSection = hSection[i]; // Get current section.
ModuleSections_t moduleSection = ModuleSections_t(
std::string(reinterpret_cast<const char*>(hCurrentSection.Name)),
static_cast<uintptr_t>(m_pModuleBase + hCurrentSection.VirtualAddress),
hCurrentSection.SizeOfRawData);
std::string(reinterpret_cast<const char*>(hCurrentSection.Name)),
static_cast<uintptr_t>(m_pModuleBase + hCurrentSection.VirtualAddress),
hCurrentSection.SizeOfRawData);
if (!strcmp((const char*)hCurrentSection.Name, ".text"))
m_ExecutableCode = moduleSection;

View file

@ -52,7 +52,7 @@ class CModule : public CMemoryAddress
{
ModuleSections_t(void) = default;
ModuleSections_t(const std::string& svSectionName, uintptr_t pSectionBase, size_t nSectionSize)
: m_svSectionName(svSectionName), m_pSectionBase(pSectionBase), m_nSectionSize(nSectionSize)
: m_svSectionName(svSectionName), m_pSectionBase(pSectionBase), m_nSectionSize(nSectionSize)
{
}

View file

@ -18,8 +18,8 @@
/*
OFFSET_STRUCT(Name)
{
STRUCT_SIZE(0x100) // Total in-memory struct size
FIELD(0x0, int field) // offset, signature
STRUCT_SIZE(0x100) // Total in-memory struct size
FIELD(0x0, int field) // offset, signature
}
*/

View file

@ -19,7 +19,7 @@ void TryCreateGlobalMemAlloc()
{
// init memalloc stuff
CreateGlobalMemAlloc =
reinterpret_cast<CreateGlobalMemAllocType>(GetProcAddress(GetModuleHandleA("tier0.dll"), "CreateGlobalMemAlloc"));
reinterpret_cast<CreateGlobalMemAllocType>(GetProcAddress(GetModuleHandleA("tier0.dll"), "CreateGlobalMemAlloc"));
Tier0::g_pMemAllocSingleton = CreateGlobalMemAlloc(); // if it already exists, this returns the preexisting IMemAlloc instance
}

View file

@ -65,7 +65,7 @@ void RunServer(CDedicatedExports* dedicated)
g_pEngine->Frame();
std::this_thread::sleep_for(
std::chrono::duration<double, std::ratio<1>>(g_pGlobals->m_flTickInterval - fmin(Tier0::Plat_FloatTime() - frameStart, 0.25)));
std::chrono::duration<double, std::ratio<1>>(g_pGlobals->m_flTickInterval - fmin(Tier0::Plat_FloatTime() - frameStart, 0.25)));
}
}
@ -75,13 +75,13 @@ class DedicatedConsoleServerPresence : public ServerPresenceReporter
void ReportPresence(const ServerPresence* pServerPresence) override
{
SetConsoleTitleA(fmt::format(
"{} - {} {}/{} players ({})",
pServerPresence->m_sServerName,
pServerPresence->m_MapName,
pServerPresence->m_iPlayerCount,
pServerPresence->m_iMaxPlayers,
pServerPresence->m_PlaylistName)
.c_str());
"{} - {} {}/{} players ({})",
pServerPresence->m_sServerName,
pServerPresence->m_MapName,
pServerPresence->m_iPlayerCount,
pServerPresence->m_iMaxPlayers,
pServerPresence->m_PlaylistName)
.c_str());
}
};
@ -292,7 +292,7 @@ ON_DLL_LOAD_DEDI("server.dll", DedicatedServerGameDLL, (CModule module))
{
module.Offset(0x6BA350).Patch("C3"); // dont load skins.rson from rpak if we don't have rpaks, as loading it will cause a crash
module.Offset(0x6BA300).Patch(
"B8 C8 00 00 00 C3"); // return 200 as the number of skins from server.dll + 6BA300, this is the normal value read from
// skins.rson and should be updated when we need it more modular
"B8 C8 00 00 00 C3"); // return 200 as the number of skins from server.dll + 6BA300, this is the normal value read from
// skins.rson and should be updated when we need it more modular
}
}

View file

@ -27,7 +27,7 @@ HRESULT, __stdcall, (
DriverType = 5; // D3D_DRIVER_TYPE_WARP
return D3D11CreateDevice(
pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext);
pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext);
}
ON_DLL_LOAD_DEDI("materialsystem_dx11.dll", DedicatedServerMaterialSystem, (CModule module))

View file

@ -35,15 +35,15 @@ void ServerStartingOrChangingMap()
memset(commandBuf, 0, sizeof(commandBuf));
CCommand tempCommand = *(CCommand*)&commandBuf;
if (sLastMode.length() &&
CCommand__Tokenize(
tempCommand, fmt::format("exec server/cleanup_gamemode_{}", sLastMode).c_str(), R2::cmd_source_t::kCommandSrcCode))
CCommand__Tokenize(
tempCommand, fmt::format("exec server/cleanup_gamemode_{}", sLastMode).c_str(), R2::cmd_source_t::kCommandSrcCode))
_Cmd_Exec_f(tempCommand, false, false);
memset(commandBuf, 0, sizeof(commandBuf));
if (CCommand__Tokenize(
tempCommand,
fmt::format("exec server/setup_gamemode_{}", sLastMode = Cvar_mp_gamemode->GetString()).c_str(),
R2::cmd_source_t::kCommandSrcCode))
tempCommand,
fmt::format("exec server/setup_gamemode_{}", sLastMode = Cvar_mp_gamemode->GetString()).c_str(),
R2::cmd_source_t::kCommandSrcCode))
{
_Cmd_Exec_f(tempCommand, false, false);
}
@ -151,7 +151,7 @@ void, __fastcall, (CHostState* self))
memset(commandBuf, 0, sizeof(commandBuf));
CCommand tempCommand = *(CCommand*)&commandBuf;
if (CCommand__Tokenize(
tempCommand, fmt::format("exec server/cleanup_gamemode_{}", sLastMode).c_str(), R2::cmd_source_t::kCommandSrcCode))
tempCommand, fmt::format("exec server/cleanup_gamemode_{}", sLastMode).c_str(), R2::cmd_source_t::kCommandSrcCode))
{
_Cmd_Exec_f(tempCommand, false, false);
Cbuf_Execute();

View file

@ -37,7 +37,7 @@ namespace R2
bool m_bLetToolsOverrideLoadGameEnts; // During a load game, this tells Foundry to override ents that are selected in Hammer.
bool m_bSplitScreenConnect;
bool m_bGameHasShutDownAndFlushedMemory; // This is false once we load a map into memory, and set to true once the map is unloaded
// and all memory flushed
// and all memory flushed
bool m_bWorkshopMapDownloadPending;
};

View file

@ -19,7 +19,7 @@ namespace R2
server_state_t* g_pServerState;
char* g_pModName =
nullptr; // we cant set this up here atm since we dont have an offset to it in engine, instead we store it in IsRespawnMod
nullptr; // we cant set this up here atm since we dont have an offset to it in engine, instead we store it in IsRespawnMod
CGlobalVars* g_pGlobals;
} // namespace R2

View file

@ -13,16 +13,16 @@ std::shared_ptr<ExceptionLog> storedException {};
#define RUNTIME_EXCEPTION 3765269347
// clang format did this :/
std::map<int, std::string> ExceptionNames = {
{EXCEPTION_ACCESS_VIOLATION, "Access Violation"}, {EXCEPTION_IN_PAGE_ERROR, "Access Violation"},
{EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "Array bounds exceeded"}, {EXCEPTION_DATATYPE_MISALIGNMENT, "Datatype misalignment"},
{EXCEPTION_FLT_DENORMAL_OPERAND, "Denormal operand"}, {EXCEPTION_FLT_DIVIDE_BY_ZERO, "Divide by zero (float)"},
{EXCEPTION_FLT_INEXACT_RESULT, "Inexact float result"}, {EXCEPTION_FLT_INVALID_OPERATION, "Invalid operation"},
{EXCEPTION_FLT_OVERFLOW, "Numeric overflow (float)"}, {EXCEPTION_FLT_STACK_CHECK, "Stack check"},
{EXCEPTION_FLT_UNDERFLOW, "Numeric underflow (float)"}, {EXCEPTION_ILLEGAL_INSTRUCTION, "Illegal instruction"},
{EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero (int)"}, {EXCEPTION_INT_OVERFLOW, "Numeric overfloat (int)"},
{EXCEPTION_INVALID_DISPOSITION, "Invalid disposition"}, {EXCEPTION_NONCONTINUABLE_EXCEPTION, "Non-continuable exception"},
{EXCEPTION_PRIV_INSTRUCTION, "Priviledged instruction"}, {EXCEPTION_STACK_OVERFLOW, "Stack overflow"},
{RUNTIME_EXCEPTION, "Uncaught runtime exception:"},
{EXCEPTION_ACCESS_VIOLATION, "Access Violation"}, {EXCEPTION_IN_PAGE_ERROR, "Access Violation"},
{EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "Array bounds exceeded"}, {EXCEPTION_DATATYPE_MISALIGNMENT, "Datatype misalignment"},
{EXCEPTION_FLT_DENORMAL_OPERAND, "Denormal operand"}, {EXCEPTION_FLT_DIVIDE_BY_ZERO, "Divide by zero (float)"},
{EXCEPTION_FLT_INEXACT_RESULT, "Inexact float result"}, {EXCEPTION_FLT_INVALID_OPERATION, "Invalid operation"},
{EXCEPTION_FLT_OVERFLOW, "Numeric overflow (float)"}, {EXCEPTION_FLT_STACK_CHECK, "Stack check"},
{EXCEPTION_FLT_UNDERFLOW, "Numeric underflow (float)"}, {EXCEPTION_ILLEGAL_INSTRUCTION, "Illegal instruction"},
{EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero (int)"}, {EXCEPTION_INT_OVERFLOW, "Numeric overfloat (int)"},
{EXCEPTION_INVALID_DISPOSITION, "Invalid disposition"}, {EXCEPTION_NONCONTINUABLE_EXCEPTION, "Non-continuable exception"},
{EXCEPTION_PRIV_INSTRUCTION, "Priviledged instruction"}, {EXCEPTION_STACK_OVERFLOW, "Stack overflow"},
{RUNTIME_EXCEPTION, "Uncaught runtime exception:"},
};
void PrintExceptionLog(ExceptionLog& exc)
@ -67,10 +67,10 @@ void PrintExceptionLog(ExceptionLog& exc)
if (!IsDedicatedServer())
MessageBoxA(
0,
"Northstar has crashed! Crash info can be found in R2Northstar/logs",
"Northstar has crashed!",
MB_ICONERROR | MB_OK | MB_SYSTEMMODAL);
0,
"Northstar has crashed! Crash info can be found in R2Northstar/logs",
"Northstar has crashed!",
MB_ICONERROR | MB_OK | MB_SYSTEMMODAL);
NS::log::FlushLoggers();
}
@ -111,16 +111,16 @@ template <> struct fmt::formatter<M128A> : fmt::formatter<string_view>
int v3 = obj.High & INT_MAX;
int v4 = obj.High >> 32;
return fmt::format_to(
ctx.out(),
"[ {:G}, {:G}, {:G}, {:G}], [ 0x{:x}, 0x{:x}, 0x{:x}, 0x{:x} ]",
*reinterpret_cast<float*>(&v1),
*reinterpret_cast<float*>(&v2),
*reinterpret_cast<float*>(&v3),
*reinterpret_cast<float*>(&v4),
v1,
v2,
v3,
v4);
ctx.out(),
"[ {:G}, {:G}, {:G}, {:G}], [ 0x{:x}, 0x{:x}, 0x{:x}, 0x{:x} ]",
*reinterpret_cast<float*>(&v1),
*reinterpret_cast<float*>(&v2),
*reinterpret_cast<float*>(&v3),
*reinterpret_cast<float*>(&v4),
v1,
v2,
v3,
v4);
}
};
@ -153,7 +153,7 @@ void GenerateTrace(ExceptionLog& exc, bool skipErrorHandlingFrames = true, int n
if (!haveSkippedErrorHandlingFrames)
{
if (!strncmp(backtraceModuleFullName, crashedModuleFullName, MAX_PATH) &&
!strncmp(backtraceModuleName, crashedModuleName, MAX_PATH))
!strncmp(backtraceModuleName, crashedModuleName, MAX_PATH))
{
haveSkippedErrorHandlingFrames = true;
}
@ -248,13 +248,13 @@ void CreateMiniDump(EXCEPTION_POINTERS* exceptionInfo)
dumpExceptionInfo.ClientPointers = false;
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hMinidumpFile,
MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory),
&dumpExceptionInfo,
nullptr,
nullptr);
GetCurrentProcess(),
GetCurrentProcessId(),
hMinidumpFile,
MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory),
&dumpExceptionInfo,
nullptr,
nullptr);
CloseHandle(hMinidumpFile);
}
else
@ -344,7 +344,7 @@ void RuntimeExceptionHandler()
else
{
spdlog::error(
"std::current_exception() returned nullptr while being handled by RuntimeExceptionHandler. This should never happen!");
"std::current_exception() returned nullptr while being handled by RuntimeExceptionHandler. This should never happen!");
std::abort();
}
}

View file

@ -63,7 +63,7 @@ void CreateLogFiles()
{
spdlog::error("Failed creating log file!");
MessageBoxA(
0, "Failed creating log file! Make sure the profile directory is writable.", "Northstar Warning", MB_ICONWARNING | MB_OK);
0, "Failed creating log file! Make sure the profile directory is writable.", "Northstar Warning", MB_ICONWARNING | MB_OK);
}
}
}

View file

@ -119,13 +119,13 @@ class ExternalConsoleSink : public CustomSink
{
private:
std::map<spdlog::level::level_enum, std::string> m_LogColours = {
{spdlog::level::trace, NS::Colors::TRACE.ToANSIColor()},
{spdlog::level::debug, NS::Colors::DEBUG.ToANSIColor()},
{spdlog::level::info, NS::Colors::INFO.ToANSIColor()},
{spdlog::level::warn, NS::Colors::WARN.ToANSIColor()},
{spdlog::level::err, NS::Colors::ERR.ToANSIColor()},
{spdlog::level::critical, NS::Colors::CRIT.ToANSIColor()},
{spdlog::level::off, NS::Colors::OFF.ToANSIColor()}};
{spdlog::level::trace, NS::Colors::TRACE.ToANSIColor()},
{spdlog::level::debug, NS::Colors::DEBUG.ToANSIColor()},
{spdlog::level::info, NS::Colors::INFO.ToANSIColor()},
{spdlog::level::warn, NS::Colors::WARN.ToANSIColor()},
{spdlog::level::err, NS::Colors::ERR.ToANSIColor()},
{spdlog::level::critical, NS::Colors::CRIT.ToANSIColor()},
{spdlog::level::off, NS::Colors::OFF.ToANSIColor()}};
std::string default_color = "\033[39;49m";

View file

@ -47,26 +47,26 @@ enum class SpewType_t
};
const std::unordered_map<SpewType_t, const char*> PrintSpewTypes = {
{SpewType_t::SPEW_MESSAGE, "SPEW_MESSAGE"},
{SpewType_t::SPEW_WARNING, "SPEW_WARNING"},
{SpewType_t::SPEW_ASSERT, "SPEW_ASSERT"},
{SpewType_t::SPEW_ERROR, "SPEW_ERROR"},
{SpewType_t::SPEW_LOG, "SPEW_LOG"}};
{SpewType_t::SPEW_MESSAGE, "SPEW_MESSAGE"},
{SpewType_t::SPEW_WARNING, "SPEW_WARNING"},
{SpewType_t::SPEW_ASSERT, "SPEW_ASSERT"},
{SpewType_t::SPEW_ERROR, "SPEW_ERROR"},
{SpewType_t::SPEW_LOG, "SPEW_LOG"}};
// these are used to define the base text colour for these things
const std::unordered_map<SpewType_t, spdlog::level::level_enum> PrintSpewLevels = {
{SpewType_t::SPEW_MESSAGE, spdlog::level::level_enum::info},
{SpewType_t::SPEW_WARNING, spdlog::level::level_enum::warn},
{SpewType_t::SPEW_ASSERT, spdlog::level::level_enum::err},
{SpewType_t::SPEW_ERROR, spdlog::level::level_enum::err},
{SpewType_t::SPEW_LOG, spdlog::level::level_enum::info}};
{SpewType_t::SPEW_MESSAGE, spdlog::level::level_enum::info},
{SpewType_t::SPEW_WARNING, spdlog::level::level_enum::warn},
{SpewType_t::SPEW_ASSERT, spdlog::level::level_enum::err},
{SpewType_t::SPEW_ERROR, spdlog::level::level_enum::err},
{SpewType_t::SPEW_LOG, spdlog::level::level_enum::info}};
const std::unordered_map<SpewType_t, const char> PrintSpewTypes_Short = {
{SpewType_t::SPEW_MESSAGE, 'M'},
{SpewType_t::SPEW_WARNING, 'W'},
{SpewType_t::SPEW_ASSERT, 'A'},
{SpewType_t::SPEW_ERROR, 'E'},
{SpewType_t::SPEW_LOG, 'L'}};
{SpewType_t::SPEW_MESSAGE, 'M'},
{SpewType_t::SPEW_WARNING, 'W'},
{SpewType_t::SPEW_ASSERT, 'A'},
{SpewType_t::SPEW_ERROR, 'E'},
{SpewType_t::SPEW_LOG, 'L'}};
ICenterPrint* pInternalCenterPrint = NULL;

View file

@ -68,13 +68,13 @@ class SourceConsoleSink : public CustomSink
{
private:
std::map<spdlog::level::level_enum, SourceColor> m_LogColours = {
{spdlog::level::trace, NS::Colors::TRACE.ToSourceColor()},
{spdlog::level::debug, NS::Colors::DEBUG.ToSourceColor()},
{spdlog::level::info, NS::Colors::INFO.ToSourceColor()},
{spdlog::level::warn, NS::Colors::WARN.ToSourceColor()},
{spdlog::level::err, NS::Colors::ERR.ToSourceColor()},
{spdlog::level::critical, NS::Colors::CRIT.ToSourceColor()},
{spdlog::level::off, NS::Colors::OFF.ToSourceColor()}};
{spdlog::level::trace, NS::Colors::TRACE.ToSourceColor()},
{spdlog::level::debug, NS::Colors::DEBUG.ToSourceColor()},
{spdlog::level::info, NS::Colors::INFO.ToSourceColor()},
{spdlog::level::warn, NS::Colors::WARN.ToSourceColor()},
{spdlog::level::err, NS::Colors::ERR.ToSourceColor()},
{spdlog::level::critical, NS::Colors::CRIT.ToSourceColor()},
{spdlog::level::off, NS::Colors::OFF.ToSourceColor()}};
protected:
void custom_sink_it_(const custom_log_msg& msg);

File diff suppressed because it is too large Load diff

View file

@ -39,15 +39,15 @@ class RemoteServerInfo
public:
RemoteServerInfo(
const char* newId,
const char* newName,
const char* newDescription,
const char* newMap,
const char* newPlaylist,
const char* newRegion,
int newPlayerCount,
int newMaxPlayers,
bool newRequiresPassword);
const char* newId,
const char* newName,
const char* newDescription,
const char* newMap,
const char* newPlaylist,
const char* newRegion,
int newPlayerCount,
int newMaxPlayers,
bool newRequiresPassword);
};
struct RemoteServerConnectionInfo

View file

@ -61,7 +61,7 @@ void ModManager::BuildPdef()
inEnum = false;
else
enumAdds[currentEnum].push_back(currentLine); // only need to push_back current line, if there's syntax errors then game
// pdef parser will handle them
// pdef parser will handle them
}
else if (!currentLine.compare(start, 9, "$ENUM_ADD"))
{

View file

@ -32,7 +32,7 @@ void ModManager::BuildScriptsRson()
When: "CONTEXT"
Scripts:
[
_coolscript.gnut
_coolscript.gnut
]*/
scriptsRson += "When: \"";

View file

@ -35,10 +35,10 @@ Mod::Mod(fs::path modDir, char* jsonBuf)
if (modJson.HasParseError())
{
spdlog::error(
"Failed reading mod file {}: encountered parse error \"{}\" at offset {}",
(modDir / "mod.json").string(),
GetParseError_En(modJson.GetParseError()),
modJson.GetErrorOffset());
"Failed reading mod file {}: encountered parse error \"{}\" at offset {}",
(modDir / "mod.json").string(),
GetParseError_En(modJson.GetParseError()),
modJson.GetErrorOffset());
return;
}
@ -312,7 +312,7 @@ void Mod::ParseScripts(rapidjson_document& json)
callback.DestroyCallback = scriptObj["ServerCallback"]["Destroy"].GetString();
else
spdlog::warn(
"'Destroy' ServerCallback for script '{}' is not a string, skipping...", scriptObj["Path"].GetString());
"'Destroy' ServerCallback for script '{}' is not a string, skipping...", scriptObj["Path"].GetString());
}
script.Callbacks.push_back(callback);
@ -352,7 +352,7 @@ void Mod::ParseScripts(rapidjson_document& json)
callback.DestroyCallback = scriptObj["ClientCallback"]["Destroy"].GetString();
else
spdlog::warn(
"'Destroy' ClientCallback for script '{}' is not a string, skipping...", scriptObj["Path"].GetString());
"'Destroy' ClientCallback for script '{}' is not a string, skipping...", scriptObj["Path"].GetString());
}
script.Callbacks.push_back(callback);
@ -459,17 +459,17 @@ void Mod::ParseDependencies(rapidjson_document& json)
}
if (DependencyConstants.find(v->name.GetString()) != DependencyConstants.end() &&
v->value.GetString() != DependencyConstants[v->name.GetString()])
v->value.GetString() != DependencyConstants[v->name.GetString()])
{
// this is fatal because otherwise the mod will probably try to use functions that dont exist,
// which will cause errors further down the line that are harder to debug
spdlog::error(
"'{}' attempted to register a dependency constant '{}' for '{}' that already exists for '{}'. "
"Change the constant name.",
Name,
v->name.GetString(),
v->value.GetString(),
DependencyConstants[v->name.GetString()]);
"'{}' attempted to register a dependency constant '{}' for '{}' that already exists for '{}'. "
"Change the constant name.",
Name,
v->name.GetString(),
v->value.GetString(),
DependencyConstants[v->name.GetString()]);
return;
}
@ -500,7 +500,7 @@ ModManager::ModManager()
// note: use backslashes for these, since we use lexically_normal for file paths which uses them
m_hScriptsRsonHash = STR_HASH("scripts\\vscripts\\scripts.rson");
m_hPdefHash = STR_HASH(
"cfg\\server\\persistent_player_data_version_231.pdef" // this can have multiple versions, but we use 231 so that's what we hash
"cfg\\server\\persistent_player_data_version_231.pdef" // this can have multiple versions, but we use 231 so that's what we hash
);
m_hKBActHash = STR_HASH("scripts\\kb_act.lst");
@ -552,9 +552,9 @@ auto ModConCommandCallback(const CCommand& command)
for (auto& mod : g_pModManager->m_LoadedMods)
{
auto res = std::find_if(
mod.ConCommands.begin(),
mod.ConCommands.end(),
[&commandString](const ModConCommand* other) { return other->Name == commandString; });
mod.ConCommands.begin(),
mod.ConCommands.end(),
[&commandString](const ModConCommand* other) { return other->Name == commandString; });
if (res != mod.ConCommands.end())
{
found = *res;
@ -604,7 +604,7 @@ void ModManager::LoadMods()
enabledModsStream.close();
m_EnabledModsCfg.Parse<rapidjson::ParseFlag::kParseCommentsFlag | rapidjson::ParseFlag::kParseTrailingCommasFlag>(
enabledModsStringStream.str().c_str());
enabledModsStringStream.str().c_str());
m_bHasEnabledModsCfg = m_EnabledModsCfg.IsObject();
}
@ -656,7 +656,7 @@ void ModManager::LoadMods()
if (jsonStream.fail())
{
spdlog::warn(
"Mod file at '{}' does not exist or could not be read, is it installed correctly?", (modDir / "mod.json").string());
"Mod file at '{}' does not exist or could not be read, is it installed correctly?", (modDir / "mod.json").string());
continue;
}
@ -672,12 +672,12 @@ void ModManager::LoadMods()
if (m_DependencyConstants.find(pair.first) != m_DependencyConstants.end() && m_DependencyConstants[pair.first] != pair.second)
{
spdlog::error(
"'{}' attempted to register a dependency constant '{}' for '{}' that already exists for '{}'. "
"Change the constant name.",
mod.Name,
pair.first,
pair.second,
m_DependencyConstants[pair.first]);
"'{}' attempted to register a dependency constant '{}' for '{}' that already exists for '{}'. "
"Change the constant name.",
mod.Name,
pair.first,
pair.second,
m_DependencyConstants[pair.first]);
mod.m_bWasReadSuccessfully = false;
break;
}
@ -753,7 +753,7 @@ void ModManager::LoadMods()
vpkJsonStream.close();
dVpkJson.Parse<rapidjson::ParseFlag::kParseCommentsFlag | rapidjson::ParseFlag::kParseTrailingCommasFlag>(
vpkJsonStringStream.str().c_str());
vpkJsonStringStream.str().c_str());
bUseVPKJson = !dVpkJson.HasParseError() && dVpkJson.IsObject();
}
@ -763,8 +763,8 @@ void ModManager::LoadMods()
// a bunch of checks to make sure we're only adding dir vpks and their paths are good
// note: the game will literally only load vpks with the english prefix
if (fs::is_regular_file(file) && file.path().extension() == ".vpk" &&
file.path().string().find("english") != std::string::npos &&
file.path().string().find(".bsp.pak000_dir") != std::string::npos)
file.path().string().find("english") != std::string::npos &&
file.path().string().find(".bsp.pak000_dir") != std::string::npos)
{
std::string formattedPath = file.path().filename().string();
@ -773,7 +773,7 @@ void ModManager::LoadMods()
ModVPKEntry& modVpk = mod.Vpks.emplace_back();
modVpk.m_bAutoLoad = !bUseVPKJson || (dVpkJson.HasMember("Preload") && dVpkJson["Preload"].IsObject() &&
dVpkJson["Preload"].HasMember(vpkName) && dVpkJson["Preload"][vpkName].IsTrue());
dVpkJson["Preload"].HasMember(vpkName) && dVpkJson["Preload"][vpkName].IsTrue());
modVpk.m_sVpkPath = (file.path().parent_path() / vpkName).string();
if (m_bHasLoadedMods && modVpk.m_bAutoLoad)
@ -799,7 +799,7 @@ void ModManager::LoadMods()
rpakJsonStream.close();
dRpakJson.Parse<rapidjson::ParseFlag::kParseCommentsFlag | rapidjson::ParseFlag::kParseTrailingCommasFlag>(
rpakJsonStringStream.str().c_str());
rpakJsonStringStream.str().c_str());
bUseRpakJson = !dRpakJson.HasParseError() && dRpakJson.IsObject();
}
@ -808,8 +808,8 @@ void ModManager::LoadMods()
if (bUseRpakJson && dRpakJson.HasMember("Aliases") && dRpakJson["Aliases"].IsObject())
{
for (rapidjson::Value::ConstMemberIterator iterator = dRpakJson["Aliases"].MemberBegin();
iterator != dRpakJson["Aliases"].MemberEnd();
iterator++)
iterator != dRpakJson["Aliases"].MemberEnd();
iterator++)
{
if (!iterator->name.IsString() || !iterator->value.IsString())
continue;
@ -827,12 +827,12 @@ void ModManager::LoadMods()
ModRpakEntry& modPak = mod.Rpaks.emplace_back();
modPak.m_bAutoLoad =
!bUseRpakJson || (dRpakJson.HasMember("Preload") && dRpakJson["Preload"].IsObject() &&
dRpakJson["Preload"].HasMember(pakName) && dRpakJson["Preload"][pakName].IsTrue());
!bUseRpakJson || (dRpakJson.HasMember("Preload") && dRpakJson["Preload"].IsObject() &&
dRpakJson["Preload"].HasMember(pakName) && dRpakJson["Preload"][pakName].IsTrue());
// postload things
if (!bUseRpakJson ||
(dRpakJson.HasMember("Postload") && dRpakJson["Postload"].IsObject() && dRpakJson["Postload"].HasMember(pakName)))
(dRpakJson.HasMember("Postload") && dRpakJson["Postload"].IsObject() && dRpakJson["Postload"].HasMember(pakName)))
modPak.m_sLoadAfterPak = dRpakJson["Postload"][pakName].GetString();
modPak.m_sPakName = pakName;
@ -892,7 +892,7 @@ void ModManager::LoadMods()
if (fs::is_regular_file(file))
{
std::string kvStr =
g_pModManager->NormaliseModFilePath(file.path().lexically_relative(mod.m_ModDirectory / "keyvalues"));
g_pModManager->NormaliseModFilePath(file.path().lexically_relative(mod.m_ModDirectory / "keyvalues"));
mod.KeyValues.emplace(STR_HASH(kvStr), kvStr);
}
}
@ -951,7 +951,7 @@ void ModManager::LoadMods()
for (fs::directory_entry file : fs::recursive_directory_iterator(m_LoadedMods[i].m_ModDirectory / MOD_OVERRIDE_DIR))
{
std::string path =
g_pModManager->NormaliseModFilePath(file.path().lexically_relative(m_LoadedMods[i].m_ModDirectory / MOD_OVERRIDE_DIR));
g_pModManager->NormaliseModFilePath(file.path().lexically_relative(m_LoadedMods[i].m_ModDirectory / MOD_OVERRIDE_DIR));
if (file.is_regular_file() && m_ModFiles.find(path) == m_ModFiles.end())
{
ModOverrideFile modFile;

View file

@ -118,7 +118,7 @@ class Mod
std::vector<ModRpakEntry> Rpaks;
std::unordered_map<std::string, std::string>
RpakAliases; // paks we alias to other rpaks, e.g. to load sp_crashsite paks on the map mp_crashsite
RpakAliases; // paks we alias to other rpaks, e.g. to load sp_crashsite paks on the map mp_crashsite
std::vector<size_t> StarpakPaths; // starpaks that this mod contains
// there seems to be no nice way to get the rpak that is causing the load of a starpak?
// hashed with STR_HASH

View file

@ -72,47 +72,47 @@ template <ScriptContext context> void SaveFileManager::SaveFileAsync(fs::path fi
{
auto mutex = std::ref(fileMutex);
std::thread writeThread(
[mutex, file, contents]()
{
try
{
mutex.get().lock();
[mutex, file, contents]()
{
try
{
mutex.get().lock();
fs::path dir = file.parent_path();
// this actually allows mods to go over the limit, but not by much
// the limit is to prevent mods from taking gigabytes of space,
// we don't need to be particularly strict.
if (GetSizeOfFolderContentsMinusFile(dir, file.filename().string()) + contents.length() > MAX_FOLDER_SIZE)
{
// tbh, you're either trying to fill the hard drive or use so much data, you SHOULD be congratulated.
spdlog::error(fmt::format("Mod spamming save requests? Folder limit bypassed despite previous checks. Not saving."));
mutex.get().unlock();
return;
}
fs::path dir = file.parent_path();
// this actually allows mods to go over the limit, but not by much
// the limit is to prevent mods from taking gigabytes of space,
// we don't need to be particularly strict.
if (GetSizeOfFolderContentsMinusFile(dir, file.filename().string()) + contents.length() > MAX_FOLDER_SIZE)
{
// tbh, you're either trying to fill the hard drive or use so much data, you SHOULD be congratulated.
spdlog::error(fmt::format("Mod spamming save requests? Folder limit bypassed despite previous checks. Not saving."));
mutex.get().unlock();
return;
}
std::ofstream fileStr(file);
if (fileStr.fail())
{
mutex.get().unlock();
return;
}
std::ofstream fileStr(file);
if (fileStr.fail())
{
mutex.get().unlock();
return;
}
fileStr.write(contents.c_str(), contents.length());
fileStr.close();
fileStr.write(contents.c_str(), contents.length());
fileStr.close();
mutex.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("SAVE FAILED!");
mutex.get().unlock();
spdlog::error(ex.what());
}
});
mutex.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("SAVE FAILED!");
mutex.get().unlock();
spdlog::error(ex.what());
}
});
writeThread.detach();
}
@ -123,42 +123,42 @@ template <ScriptContext context> int SaveFileManager::LoadFileAsync(fs::path fil
int handle = ++m_iLastRequestHandle;
auto mutex = std::ref(fileMutex);
std::thread readThread(
[mutex, file, handle]()
{
try
{
mutex.get().lock();
[mutex, file, handle]()
{
try
{
mutex.get().lock();
std::ifstream fileStr(file);
if (fileStr.fail())
{
spdlog::error("A file was supposed to be loaded but we can't access it?!");
std::ifstream fileStr(file);
if (fileStr.fail())
{
spdlog::error("A file was supposed to be loaded but we can't access it?!");
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, false, "");
mutex.get().unlock();
return;
}
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, false, "");
mutex.get().unlock();
return;
}
std::stringstream stringStream;
stringStream << fileStr.rdbuf();
std::stringstream stringStream;
stringStream << fileStr.rdbuf();
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, true, stringStream.str());
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, true, stringStream.str());
fileStr.close();
mutex.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("LOAD FAILED!");
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, false, "");
mutex.get().unlock();
spdlog::error(ex.what());
}
});
fileStr.close();
mutex.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("LOAD FAILED!");
g_pSquirrel<context>->AsyncCall("NSHandleLoadResult", handle, false, "");
mutex.get().unlock();
spdlog::error(ex.what());
}
});
readThread.detach();
return handle;
@ -170,27 +170,27 @@ template <ScriptContext context> void SaveFileManager::DeleteFileAsync(fs::path
// P.S. I don't like how we have to async delete calls but we do.
auto m = std::ref(fileMutex);
std::thread deleteThread(
[m, file]()
{
try
{
m.get().lock();
[m, file]()
{
try
{
m.get().lock();
fs::remove(file);
fs::remove(file);
m.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("DELETE FAILED!");
m.get().unlock();
spdlog::error(ex.what());
}
});
m.get().unlock();
// side-note: this causes a leak?
// when a file is added to the map, it's never removed.
// no idea how to fix this - because we have no way to check if there are other threads waiting to use this file(?)
// tried to use m.try_lock(), but it's unreliable, it seems.
}
catch (std::exception ex)
{
spdlog::error("DELETE FAILED!");
m.get().unlock();
spdlog::error(ex.what());
}
});
deleteThread.detach();
}
@ -215,13 +215,13 @@ bool IsPathSafe(const std::string param, fs::path dir)
auto itr = std::search(normChild.begin(), normChild.end(), normRoot.begin(), normRoot.end());
// we return if the file is safe (inside the directory) and uses only ASCII chars in the path.
return itr == normChild.begin() && std::none_of(
param.begin(),
param.end(),
[](char c)
{
unsigned char unsignedC = static_cast<unsigned char>(c);
return unsignedC > 127 || unsignedC < 0;
});
param.begin(),
param.end(),
[](char c)
{
unsigned char unsignedC = static_cast<unsigned char>(c);
return unsignedC > 127 || unsignedC < 0;
});
}
catch (fs::filesystem_error err)
{
@ -244,13 +244,13 @@ ADD_SQFUNC("void", NSSaveFile, "string file, string data", "", ScriptContext::SE
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -258,7 +258,7 @@ ADD_SQFUNC("void", NSSaveFile, "string file, string data", "", ScriptContext::SE
if (ContainsInvalidChars(content))
{
g_pSquirrel<context>->raiseerror(
sqvm, fmt::format("File contents may not contain NUL/\\0 characters! Make sure your strings are valid!", mod->Name).c_str());
sqvm, fmt::format("File contents may not contain NUL/\\0 characters! Make sure your strings are valid!", mod->Name).c_str());
return SQRESULT_ERROR;
}
@ -269,12 +269,12 @@ ADD_SQFUNC("void", NSSaveFile, "string file, string data", "", ScriptContext::SE
if (GetSizeOfFolderContentsMinusFile(dir, fileName) + content.length() > MAX_FOLDER_SIZE)
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"The mod {} has reached the maximum folder size.\n\nAsk the mod developer to optimize their data usage,"
"or increase the maximum folder size using the -maxfoldersize launch parameter.",
mod->Name)
.c_str());
sqvm,
fmt::format(
"The mod {} has reached the maximum folder size.\n\nAsk the mod developer to optimize their data usage,"
"or increase the maximum folder size using the -maxfoldersize launch parameter.",
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -298,13 +298,13 @@ ADD_SQFUNC("void", NSSaveJSONFile, "string file, table data", "", ScriptContext:
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -314,7 +314,7 @@ ADD_SQFUNC("void", NSSaveJSONFile, "string file, table data", "", ScriptContext:
if (ContainsInvalidChars(content))
{
g_pSquirrel<context>->raiseerror(
sqvm, fmt::format("File contents may not contain NUL/\\0 characters! Make sure your strings are valid!", mod->Name).c_str());
sqvm, fmt::format("File contents may not contain NUL/\\0 characters! Make sure your strings are valid!", mod->Name).c_str());
return SQRESULT_ERROR;
}
@ -325,12 +325,12 @@ ADD_SQFUNC("void", NSSaveJSONFile, "string file, table data", "", ScriptContext:
if (GetSizeOfFolderContentsMinusFile(dir, fileName) + content.length() > MAX_FOLDER_SIZE)
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"The mod {} has reached the maximum folder size.\n\nAsk the mod developer to optimize their data usage,"
"or increase the maximum folder size using the -maxfoldersize launch parameter.",
mod->Name)
.c_str());
sqvm,
fmt::format(
"The mod {} has reached the maximum folder size.\n\nAsk the mod developer to optimize their data usage,"
"or increase the maximum folder size using the -maxfoldersize launch parameter.",
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -354,13 +354,13 @@ ADD_SQFUNC("int", NS_InternalLoadFile, "string file", "", ScriptContext::SERVER
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -379,13 +379,13 @@ ADD_SQFUNC("bool", NSDoesFileExist, "string file", "", ScriptContext::SERVER | S
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -403,13 +403,13 @@ ADD_SQFUNC("int", NSGetFileSize, "string file", "", ScriptContext::SERVER | Scri
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
try
@ -437,13 +437,13 @@ ADD_SQFUNC("void", NSDeleteFile, "string file", "", ScriptContext::SERVER | Scri
if (!IsPathSafe(fileName, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
fileName,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
@ -464,13 +464,13 @@ ADD_SQFUNC("array<string>", NS_InternalGetAllFiles, "string path", "", ScriptCon
if (!IsPathSafe(pathStr, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
pathStr,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
pathStr,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
try
@ -502,13 +502,13 @@ ADD_SQFUNC("bool", NSIsFolder, "string path", "", ScriptContext::CLIENT | Script
if (!IsPathSafe(pathStr, dir))
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
pathStr,
mod->Name)
.c_str());
sqvm,
fmt::format(
"File name invalid ({})! Make sure it does not contain any non-ASCII character, and results in a path inside your mod's "
"save folder.",
pathStr,
mod->Name)
.c_str());
return SQRESULT_ERROR;
}
try

View file

@ -129,7 +129,7 @@ std::optional<Plugin> PluginManager::LoadPlugin(fs::path path, PluginInitFuncs*
if (strcmp(manifestJSON["api_version"].GetString(), std::to_string(ABI_VERSION).c_str()))
{
NS::log::PLUGINSYS->error(
"'{}' has an incompatible API version number '{}' in its manifest. Current ABI version is '{}'", pathstring, ABI_VERSION);
"'{}' has an incompatible API version number '{}' in its manifest. Current ABI version is '{}'", pathstring, ABI_VERSION);
return std::nullopt;
}
// Passed all checks, going to actually load it now

View file

@ -33,7 +33,7 @@ void, __fastcall, (void* self, const char* message, int inboxId, bool isTeam, bo
NS::Utils::RemoveAsciiControlSequences(const_cast<char*>(message), true);
SQRESULT result = g_pSquirrel<ScriptContext::CLIENT>->Call(
"CHudChat_ProcessMessageStartThread", static_cast<int>(senderId) - 1, payload, isTeam, isDead, type);
"CHudChat_ProcessMessageStartThread", static_cast<int>(senderId) - 1, payload, isTeam, isDead, type);
if (result == SQRESULT_ERROR)
for (CHudChat* hud = *CHudChat::allHuds; hud != NULL; hud = hud->next)
CHudChat__AddGameLine(hud, message, inboxId, isTeam, isDead);

View file

@ -11,10 +11,10 @@ ADD_SQFUNC("vector ornull", NSGetCursorPosition, "", "", ScriptContext::UI)
return SQRESULT_NULL;
g_pSquirrel<context>->pushvector(
sqvm,
{p.x > 0 ? p.x > rcClient.right ? rcClient.right : (float)p.x : 0,
p.y > 0 ? p.y > rcClient.bottom ? rcClient.bottom : (float)p.y : 0,
0});
sqvm,
{p.x > 0 ? p.x > rcClient.right ? rcClient.right : (float)p.x : 0,
p.y > 0 ? p.y > rcClient.bottom ? rcClient.bottom : (float)p.y : 0,
0});
return SQRESULT_NOTNULL;
}
g_pSquirrel<context>->raiseerror(sqvm, "Failed retrieving cursor position of game window");

View file

@ -135,7 +135,7 @@ ADD_SQFUNC("bool", NSIsModRequiredOnClient, "string modName", "", ScriptContext:
}
ADD_SQFUNC(
"array<string>", NSGetModConvarsByModName, "string modName", "", ScriptContext::SERVER | ScriptContext::CLIENT | ScriptContext::UI)
"array<string>", NSGetModConvarsByModName, "string modName", "", ScriptContext::SERVER | ScriptContext::CLIENT | ScriptContext::UI)
{
const SQChar* modName = g_pSquirrel<context>->getstring(sqvm, 1);
g_pSquirrel<context>->newarray(sqvm, 0);

View file

@ -52,12 +52,12 @@ ADD_SQFUNC("void", NSTryAuthWithServer, "int serverIndex, string password = ''",
if (serverIndex >= g_pMasterServerManager->m_vRemoteServers.size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"Tried to auth with server index {} when only {} servers are available",
serverIndex,
g_pMasterServerManager->m_vRemoteServers.size())
.c_str());
sqvm,
fmt::format(
"Tried to auth with server index {} when only {} servers are available",
serverIndex,
g_pMasterServerManager->m_vRemoteServers.size())
.c_str());
return SQRESULT_ERROR;
}
@ -68,10 +68,10 @@ ADD_SQFUNC("void", NSTryAuthWithServer, "int serverIndex, string password = ''",
// do auth
g_pMasterServerManager->AuthenticateWithServer(
R2::g_pLocalPlayerUserID,
g_pMasterServerManager->m_sOwnClientAuthToken,
g_pMasterServerManager->m_vRemoteServers[serverIndex],
(char*)password);
R2::g_pLocalPlayerUserID,
g_pMasterServerManager->m_sOwnClientAuthToken,
g_pMasterServerManager->m_vRemoteServers[serverIndex],
(char*)password);
return SQRESULT_NULL;
}
@ -93,7 +93,7 @@ ADD_SQFUNC("void", NSConnectToAuthedServer, "", "", ScriptContext::UI)
if (!g_pMasterServerManager->m_bHasPendingConnectionInfo)
{
g_pSquirrel<context>->raiseerror(
sqvm, fmt::format("Tried to connect to authed server before any pending connection info was available").c_str());
sqvm, fmt::format("Tried to connect to authed server before any pending connection info was available").c_str());
return SQRESULT_ERROR;
}
@ -103,16 +103,16 @@ ADD_SQFUNC("void", NSConnectToAuthedServer, "", "", ScriptContext::UI)
// i'm honestly not entirely sure how silentconnect works regarding ports and encryption so using connect for now
R2::g_pCVar->FindVar("serverfilter")->SetValue(info.authToken);
R2::Cbuf_AddText(
R2::Cbuf_GetCurrentPlayer(),
fmt::format(
"connect {}.{}.{}.{}:{}",
info.ip.S_un.S_un_b.s_b1,
info.ip.S_un.S_un_b.s_b2,
info.ip.S_un.S_un_b.s_b3,
info.ip.S_un.S_un_b.s_b4,
info.port)
.c_str(),
R2::cmd_source_t::kCommandSrcCode);
R2::Cbuf_GetCurrentPlayer(),
fmt::format(
"connect {}.{}.{}.{}:{}",
info.ip.S_un.S_un_b.s_b1,
info.ip.S_un.S_un_b.s_b2,
info.ip.S_un.S_un_b.s_b3,
info.ip.S_un.S_un_b.s_b4,
info.port)
.c_str(),
R2::cmd_source_t::kCommandSrcCode);
g_pMasterServerManager->m_bHasPendingConnectionInfo = false;
return SQRESULT_NULL;

View file

@ -11,8 +11,8 @@ void ConCommand_ns_script_servertoclientstringcommand(const CCommand& arg)
ON_DLL_LOAD_CLIENT_RELIESON("client.dll", ScriptServerToClientStringCommand, ClientSquirrel, (CModule module))
{
RegisterConCommand(
"ns_script_servertoclientstringcommand",
ConCommand_ns_script_servertoclientstringcommand,
"",
FCVAR_CLIENTDLL | FCVAR_SERVER_CAN_EXECUTE);
"ns_script_servertoclientstringcommand",
ConCommand_ns_script_servertoclientstringcommand,
"",
FCVAR_CLIENTDLL | FCVAR_SERVER_CAN_EXECUTE);
}

View file

@ -328,10 +328,10 @@ REPLACE_SQFUNC(GetDataTableString, (ScriptContext::UI | ScriptContext::CLIENT |
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -355,10 +355,10 @@ REPLACE_SQFUNC(GetDataTableAsset, (ScriptContext::UI | ScriptContext::CLIENT | S
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -382,10 +382,10 @@ REPLACE_SQFUNC(GetDataTableInt, (ScriptContext::UI | ScriptContext::CLIENT | Scr
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -409,10 +409,10 @@ REPLACE_SQFUNC(GetDataTableFloat, (ScriptContext::UI | ScriptContext::CLIENT | S
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -436,10 +436,10 @@ REPLACE_SQFUNC(GetDataTableBool, (ScriptContext::UI | ScriptContext::CLIENT | Sc
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -463,10 +463,10 @@ REPLACE_SQFUNC(GetDataTableVector, (ScriptContext::UI | ScriptContext::CLIENT |
if (nRow >= csv->dataPointers.size() || nCol >= csv->dataPointers[nRow].size())
{
g_pSquirrel<context>->raiseerror(
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
sqvm,
fmt::format(
"row {} and col {} are outside of range row {} and col {}", nRow, nCol, csv->dataPointers.size(), csv->columns.size())
.c_str());
return SQRESULT_ERROR;
}
@ -819,67 +819,67 @@ void ConCommand_dump_datatables(const CCommand& args)
{
// likely not a comprehensive list, might be missing a couple?
static const std::vector<const char*> VANILLA_DATATABLE_PATHS = {
"datatable/burn_meter_rewards.rpak",
"datatable/burn_meter_store.rpak",
"datatable/calling_cards.rpak",
"datatable/callsign_icons.rpak",
"datatable/camo_skins.rpak",
"datatable/default_pilot_loadouts.rpak",
"datatable/default_titan_loadouts.rpak",
"datatable/faction_leaders.rpak",
"datatable/fd_awards.rpak",
"datatable/features_mp.rpak",
"datatable/non_loadout_weapons.rpak",
"datatable/pilot_abilities.rpak",
"datatable/pilot_executions.rpak",
"datatable/pilot_passives.rpak",
"datatable/pilot_properties.rpak",
"datatable/pilot_weapons.rpak",
"datatable/pilot_weapon_features.rpak",
"datatable/pilot_weapon_mods.rpak",
"datatable/pilot_weapon_mods_common.rpak",
"datatable/playlist_items.rpak",
"datatable/titans_mp.rpak",
"datatable/titan_abilities.rpak",
"datatable/titan_executions.rpak",
"datatable/titan_fd_upgrades.rpak",
"datatable/titan_nose_art.rpak",
"datatable/titan_passives.rpak",
"datatable/titan_primary_mods.rpak",
"datatable/titan_primary_mods_common.rpak",
"datatable/titan_primary_weapons.rpak",
"datatable/titan_properties.rpak",
"datatable/titan_skins.rpak",
"datatable/titan_voices.rpak",
"datatable/unlocks_faction_level.rpak",
"datatable/unlocks_fd_titan_level.rpak",
"datatable/unlocks_player_level.rpak",
"datatable/unlocks_random.rpak",
"datatable/unlocks_titan_level.rpak",
"datatable/unlocks_weapon_level_pilot.rpak",
"datatable/weapon_skins.rpak",
"datatable/xp_per_faction_level.rpak",
"datatable/xp_per_fd_titan_level.rpak",
"datatable/xp_per_player_level.rpak",
"datatable/xp_per_titan_level.rpak",
"datatable/xp_per_weapon_level.rpak",
"datatable/faction_leaders_dropship_anims.rpak",
"datatable/score_events.rpak",
"datatable/startpoints.rpak",
"datatable/sp_levels.rpak",
"datatable/community_entries.rpak",
"datatable/spotlight_images.rpak",
"datatable/death_hints_mp.rpak",
"datatable/flightpath_assets.rpak",
"datatable/earn_meter_mp.rpak",
"datatable/battle_chatter_voices.rpak",
"datatable/battle_chatter.rpak",
"datatable/titan_os_conversations.rpak",
"datatable/faction_dialogue.rpak",
"datatable/grunt_chatter_mp.rpak",
"datatable/spectre_chatter_mp.rpak",
"datatable/pain_death_sounds.rpak",
"datatable/caller_ids_mp.rpak"};
"datatable/burn_meter_rewards.rpak",
"datatable/burn_meter_store.rpak",
"datatable/calling_cards.rpak",
"datatable/callsign_icons.rpak",
"datatable/camo_skins.rpak",
"datatable/default_pilot_loadouts.rpak",
"datatable/default_titan_loadouts.rpak",
"datatable/faction_leaders.rpak",
"datatable/fd_awards.rpak",
"datatable/features_mp.rpak",
"datatable/non_loadout_weapons.rpak",
"datatable/pilot_abilities.rpak",
"datatable/pilot_executions.rpak",
"datatable/pilot_passives.rpak",
"datatable/pilot_properties.rpak",
"datatable/pilot_weapons.rpak",
"datatable/pilot_weapon_features.rpak",
"datatable/pilot_weapon_mods.rpak",
"datatable/pilot_weapon_mods_common.rpak",
"datatable/playlist_items.rpak",
"datatable/titans_mp.rpak",
"datatable/titan_abilities.rpak",
"datatable/titan_executions.rpak",
"datatable/titan_fd_upgrades.rpak",
"datatable/titan_nose_art.rpak",
"datatable/titan_passives.rpak",
"datatable/titan_primary_mods.rpak",
"datatable/titan_primary_mods_common.rpak",
"datatable/titan_primary_weapons.rpak",
"datatable/titan_properties.rpak",
"datatable/titan_skins.rpak",
"datatable/titan_voices.rpak",
"datatable/unlocks_faction_level.rpak",
"datatable/unlocks_fd_titan_level.rpak",
"datatable/unlocks_player_level.rpak",
"datatable/unlocks_random.rpak",
"datatable/unlocks_titan_level.rpak",
"datatable/unlocks_weapon_level_pilot.rpak",
"datatable/weapon_skins.rpak",
"datatable/xp_per_faction_level.rpak",
"datatable/xp_per_fd_titan_level.rpak",
"datatable/xp_per_player_level.rpak",
"datatable/xp_per_titan_level.rpak",
"datatable/xp_per_weapon_level.rpak",
"datatable/faction_leaders_dropship_anims.rpak",
"datatable/score_events.rpak",
"datatable/startpoints.rpak",
"datatable/sp_levels.rpak",
"datatable/community_entries.rpak",
"datatable/spotlight_images.rpak",
"datatable/death_hints_mp.rpak",
"datatable/flightpath_assets.rpak",
"datatable/earn_meter_mp.rpak",
"datatable/battle_chatter_voices.rpak",
"datatable/battle_chatter.rpak",
"datatable/titan_os_conversations.rpak",
"datatable/faction_dialogue.rpak",
"datatable/grunt_chatter_mp.rpak",
"datatable/spectre_chatter_mp.rpak",
"datatable/pain_death_sounds.rpak",
"datatable/caller_ids_mp.rpak"};
for (const char* datatable : VANILLA_DATATABLE_PATHS)
DumpDatatable(datatable);
@ -899,10 +899,10 @@ ON_DLL_LOAD_RELIESON("client.dll", ClientScriptDatatables, ClientSquirrel, (CMod
ON_DLL_LOAD_RELIESON("engine.dll", SharedScriptDataTables, ConVar, (CModule module))
{
Cvar_ns_prefer_datatable_from_disk = new ConVar(
"ns_prefer_datatable_from_disk",
IsDedicatedServer() && Tier0::CommandLine()->CheckParm("-nopakdedi") ? "1" : "0",
FCVAR_NONE,
"whether to prefer loading datatables from disk, rather than rpak");
"ns_prefer_datatable_from_disk",
IsDedicatedServer() && Tier0::CommandLine()->CheckParm("-nopakdedi") ? "1" : "0",
FCVAR_NONE,
"whether to prefer loading datatables from disk, rather than rpak");
RegisterConCommand("dump_datatables", ConCommand_dump_datatables, "dumps all datatables from a hardcoded list", FCVAR_NONE);
RegisterConCommand("dump_datatable", ConCommand_dump_datatable, "dump a datatable", FCVAR_NONE);

View file

@ -220,7 +220,7 @@ template <ScriptContext context> int HttpRequestHandler::MakeHttpRequest(const H
if (IsHttpDisabled())
{
spdlog::warn("NS_InternalMakeHttpRequest called while the game is running with -disablehttprequests."
" Please check if requests are allowed using NSIsHttpEnabled() first.");
" Please check if requests are allowed using NSIsHttpEnabled() first.");
return -1;
}
@ -230,219 +230,219 @@ template <ScriptContext context> int HttpRequestHandler::MakeHttpRequest(const H
int handle = ++m_iLastRequestHandle;
std::thread requestThread(
[this, handle, requestParameters, bAllowLocalHttp]()
{
std::string hostname, resolvedAddress, resolvedPort;
[this, handle, requestParameters, bAllowLocalHttp]()
{
std::string hostname, resolvedAddress, resolvedPort;
if (!bAllowLocalHttp)
{
if (!IsHttpDestinationHostAllowed(requestParameters.baseUrl, hostname, resolvedAddress, resolvedPort))
{
spdlog::warn(
"HttpRequestHandler::MakeHttpRequest attempted to make a request to a private network. This is only allowed when "
"running the game with -allowlocalhttp.");
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest",
handle,
(int)0,
"Cannot make HTTP requests to private network hosts without -allowlocalhttp. Check your console for more "
"information.");
return;
}
}
if (!bAllowLocalHttp)
{
if (!IsHttpDestinationHostAllowed(requestParameters.baseUrl, hostname, resolvedAddress, resolvedPort))
{
spdlog::warn(
"HttpRequestHandler::MakeHttpRequest attempted to make a request to a private network. This is only allowed when "
"running the game with -allowlocalhttp.");
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest",
handle,
(int)0,
"Cannot make HTTP requests to private network hosts without -allowlocalhttp. Check your console for more "
"information.");
return;
}
}
CURL* curl = curl_easy_init();
if (!curl)
{
spdlog::error("HttpRequestHandler::MakeHttpRequest failed to init libcurl for request.");
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest", handle, static_cast<int>(CURLE_FAILED_INIT), curl_easy_strerror(CURLE_FAILED_INIT));
return;
}
CURL* curl = curl_easy_init();
if (!curl)
{
spdlog::error("HttpRequestHandler::MakeHttpRequest failed to init libcurl for request.");
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest", handle, static_cast<int>(CURLE_FAILED_INIT), curl_easy_strerror(CURLE_FAILED_INIT));
return;
}
// HEAD has no body.
if (requestParameters.method == HttpRequestMethod::HRM_HEAD)
{
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
}
// HEAD has no body.
if (requestParameters.method == HttpRequestMethod::HRM_HEAD)
{
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
}
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, HttpRequestMethod::ToString(requestParameters.method).c_str());
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, HttpRequestMethod::ToString(requestParameters.method).c_str());
// Only resolve to IPv4 if we don't allow private network requests.
curl_slist* host = nullptr;
if (!bAllowLocalHttp)
{
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
host = curl_slist_append(host, fmt::format("{}:{}:{}", hostname, resolvedPort, resolvedAddress).c_str());
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
}
// Only resolve to IPv4 if we don't allow private network requests.
curl_slist* host = nullptr;
if (!bAllowLocalHttp)
{
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
host = curl_slist_append(host, fmt::format("{}:{}:{}", hostname, resolvedPort, resolvedAddress).c_str());
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
}
// Ensure we only allow HTTP or HTTPS.
curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
// Ensure we only allow HTTP or HTTPS.
curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
// Allow redirects
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L);
// Allow redirects
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L);
// Check if the url already contains a query.
// If so, we'll know to append with & instead of start with ?
std::string queryUrl = requestParameters.baseUrl;
bool bUrlContainsQuery = false;
// Check if the url already contains a query.
// If so, we'll know to append with & instead of start with ?
std::string queryUrl = requestParameters.baseUrl;
bool bUrlContainsQuery = false;
// If this fails, just ignore the parsing and trust what the user wants to query.
// Probably will fail but handling it here would be annoying.
CURLU* curlUrl = curl_url();
if (curlUrl)
{
if (curl_url_set(curlUrl, CURLUPART_URL, queryUrl.c_str(), CURLU_DEFAULT_SCHEME) == CURLUE_OK)
{
char* currentQuery;
if (curl_url_get(curlUrl, CURLUPART_QUERY, &currentQuery, 0) == CURLUE_OK)
{
if (currentQuery && std::strlen(currentQuery) != 0)
{
bUrlContainsQuery = true;
}
}
// If this fails, just ignore the parsing and trust what the user wants to query.
// Probably will fail but handling it here would be annoying.
CURLU* curlUrl = curl_url();
if (curlUrl)
{
if (curl_url_set(curlUrl, CURLUPART_URL, queryUrl.c_str(), CURLU_DEFAULT_SCHEME) == CURLUE_OK)
{
char* currentQuery;
if (curl_url_get(curlUrl, CURLUPART_QUERY, &currentQuery, 0) == CURLUE_OK)
{
if (currentQuery && std::strlen(currentQuery) != 0)
{
bUrlContainsQuery = true;
}
}
curl_free(currentQuery);
}
curl_free(currentQuery);
}
curl_url_cleanup(curlUrl);
}
curl_url_cleanup(curlUrl);
}
// GET requests, or POST-like requests with an empty body, can have query parameters.
// Append them to the base url.
if (HttpRequestMethod::CanHaveQueryParameters(requestParameters.method) &&
!HttpRequestMethod::UsesCurlPostOptions(requestParameters.method) ||
requestParameters.body.empty())
{
bool isFirstValue = true;
for (const auto& kv : requestParameters.queryParameters)
{
char* key = curl_easy_escape(curl, kv.first.c_str(), kv.first.length());
// GET requests, or POST-like requests with an empty body, can have query parameters.
// Append them to the base url.
if (HttpRequestMethod::CanHaveQueryParameters(requestParameters.method) &&
!HttpRequestMethod::UsesCurlPostOptions(requestParameters.method) ||
requestParameters.body.empty())
{
bool isFirstValue = true;
for (const auto& kv : requestParameters.queryParameters)
{
char* key = curl_easy_escape(curl, kv.first.c_str(), kv.first.length());
for (const std::string& queryValue : kv.second)
{
char* value = curl_easy_escape(curl, queryValue.c_str(), queryValue.length());
for (const std::string& queryValue : kv.second)
{
char* value = curl_easy_escape(curl, queryValue.c_str(), queryValue.length());
if (isFirstValue && !bUrlContainsQuery)
{
queryUrl.append(fmt::format("?{}={}", key, value));
isFirstValue = false;
}
else
{
queryUrl.append(fmt::format("&{}={}", key, value));
}
if (isFirstValue && !bUrlContainsQuery)
{
queryUrl.append(fmt::format("?{}={}", key, value));
isFirstValue = false;
}
else
{
queryUrl.append(fmt::format("&{}={}", key, value));
}
curl_free(value);
}
curl_free(value);
}
curl_free(key);
}
}
curl_free(key);
}
}
// If this method uses POST-like curl options, set those and set the body.
// The body won't be sent if it's empty anyway, meaning the query parameters above, if any, would be.
if (HttpRequestMethod::UsesCurlPostOptions(requestParameters.method))
{
// Grab the body and set it as a POST field
curl_easy_setopt(curl, CURLOPT_POST, 1L);
// If this method uses POST-like curl options, set those and set the body.
// The body won't be sent if it's empty anyway, meaning the query parameters above, if any, would be.
if (HttpRequestMethod::UsesCurlPostOptions(requestParameters.method))
{
// Grab the body and set it as a POST field
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestParameters.body.length());
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, requestParameters.body.c_str());
}
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestParameters.body.length());
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, requestParameters.body.c_str());
}
// Set the full URL for this http request.
curl_easy_setopt(curl, CURLOPT_URL, queryUrl.c_str());
// Set the full URL for this http request.
curl_easy_setopt(curl, CURLOPT_URL, queryUrl.c_str());
std::string bodyBuffer;
std::string headerBuffer;
std::string bodyBuffer;
std::string headerBuffer;
// Set up buffers to write the response headers and body.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpCurlWriteToStringBufferCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &bodyBuffer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, HttpCurlWriteToStringBufferCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headerBuffer);
// Set up buffers to write the response headers and body.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpCurlWriteToStringBufferCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &bodyBuffer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, HttpCurlWriteToStringBufferCallback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headerBuffer);
// Add all the headers for the request.
curl_slist* headers = nullptr;
// Add all the headers for the request.
curl_slist* headers = nullptr;
// Content-Type header for POST-like requests.
if (HttpRequestMethod::UsesCurlPostOptions(requestParameters.method) && !requestParameters.body.empty())
{
headers = curl_slist_append(headers, fmt::format("Content-Type: {}", requestParameters.contentType).c_str());
}
// Content-Type header for POST-like requests.
if (HttpRequestMethod::UsesCurlPostOptions(requestParameters.method) && !requestParameters.body.empty())
{
headers = curl_slist_append(headers, fmt::format("Content-Type: {}", requestParameters.contentType).c_str());
}
for (const auto& kv : requestParameters.headers)
{
for (const std::string& headerValue : kv.second)
{
headers = curl_slist_append(headers, fmt::format("{}: {}", kv.first, headerValue).c_str());
}
}
for (const auto& kv : requestParameters.headers)
{
for (const std::string& headerValue : kv.second)
{
headers = curl_slist_append(headers, fmt::format("{}: {}", kv.first, headerValue).c_str());
}
}
if (headers != nullptr)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
if (headers != nullptr)
{
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
// Disable SSL checks if requested by the user.
if (DisableHttpSsl())
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 0L);
}
// Disable SSL checks if requested by the user.
if (DisableHttpSsl())
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 0L);
}
// Enforce the Northstar user agent, unless an override was specified.
if (requestParameters.userAgent.empty())
{
curl_easy_setopt(curl, CURLOPT_USERAGENT, &NSUserAgent);
}
else
{
curl_easy_setopt(curl, CURLOPT_USERAGENT, requestParameters.userAgent.c_str());
}
// Enforce the Northstar user agent, unless an override was specified.
if (requestParameters.userAgent.empty())
{
curl_easy_setopt(curl, CURLOPT_USERAGENT, &NSUserAgent);
}
else
{
curl_easy_setopt(curl, CURLOPT_USERAGENT, requestParameters.userAgent.c_str());
}
// Set the timeout for this request. Max 60 seconds so mods can't just spin up native threads all the time.
curl_easy_setopt(curl, CURLOPT_TIMEOUT, std::clamp<long>(requestParameters.timeout, 1, 60));
// Set the timeout for this request. Max 60 seconds so mods can't just spin up native threads all the time.
curl_easy_setopt(curl, CURLOPT_TIMEOUT, std::clamp<long>(requestParameters.timeout, 1, 60));
CURLcode result = curl_easy_perform(curl);
if (IsRunning())
{
if (result == CURLE_OK)
{
// While the curl request is OK, it could return a non success code.
// Squirrel side will handle firing the correct callback.
long httpCode = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
g_pSquirrel<context>->AsyncCall(
"NSHandleSuccessfulHttpRequest", handle, static_cast<int>(httpCode), bodyBuffer, headerBuffer);
}
else
{
// Pass CURL result code & error.
spdlog::error(
"curl_easy_perform() failed with code {}, error: {}", static_cast<int>(result), curl_easy_strerror(result));
CURLcode result = curl_easy_perform(curl);
if (IsRunning())
{
if (result == CURLE_OK)
{
// While the curl request is OK, it could return a non success code.
// Squirrel side will handle firing the correct callback.
long httpCode = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
g_pSquirrel<context>->AsyncCall(
"NSHandleSuccessfulHttpRequest", handle, static_cast<int>(httpCode), bodyBuffer, headerBuffer);
}
else
{
// Pass CURL result code & error.
spdlog::error(
"curl_easy_perform() failed with code {}, error: {}", static_cast<int>(result), curl_easy_strerror(result));
// If it's an SSL issue, tell the user they may disable SSL checks using -disablehttpssl.
if (result == CURLE_PEER_FAILED_VERIFICATION || result == CURLE_SSL_CERTPROBLEM ||
result == CURLE_SSL_INVALIDCERTSTATUS)
{
spdlog::error("You can try disabling SSL verifications for this issue using the -disablehttpssl launch argument. "
"Keep in mind this is potentially dangerous!");
}
// If it's an SSL issue, tell the user they may disable SSL checks using -disablehttpssl.
if (result == CURLE_PEER_FAILED_VERIFICATION || result == CURLE_SSL_CERTPROBLEM ||
result == CURLE_SSL_INVALIDCERTSTATUS)
{
spdlog::error("You can try disabling SSL verifications for this issue using the -disablehttpssl launch argument. "
"Keep in mind this is potentially dangerous!");
}
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest", handle, static_cast<int>(result), curl_easy_strerror(result));
}
}
g_pSquirrel<context>->AsyncCall(
"NSHandleFailedHttpRequest", handle, static_cast<int>(result), curl_easy_strerror(result));
}
}
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
curl_slist_free_all(host);
});
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
curl_slist_free_all(host);
});
requestThread.detach();
return handle;
@ -462,7 +462,7 @@ template <ScriptContext context> SQRESULT SQ_InternalMakeHttpRequest(HSquirrelVM
if (IsHttpDisabled())
{
spdlog::warn("NS_InternalMakeHttpRequest called while the game is running with -disablehttprequests."
" Please check if requests are allowed using NSIsHttpEnabled() first.");
" Please check if requests are allowed using NSIsHttpEnabled() first.");
g_pSquirrel<context>->pushinteger(sqvm, -1);
return SQRESULT_NOTNULL;
}
@ -543,28 +543,28 @@ template <ScriptContext context> SQRESULT SQ_IsLocalHttpAllowed(HSquirrelVM* sqv
template <ScriptContext context> void HttpRequestHandler::RegisterSQFuncs()
{
g_pSquirrel<context>->AddFuncRegistration(
"int",
"NS_InternalMakeHttpRequest",
"int method, string baseUrl, table<string, array<string> > headers, table<string, array<string> > queryParams, string contentType, "
"string body, "
"int timeout, string userAgent",
"[Internal use only] Passes the HttpRequest struct fields to be reconstructed in native and used for an http request",
SQ_InternalMakeHttpRequest<context>);
"int",
"NS_InternalMakeHttpRequest",
"int method, string baseUrl, table<string, array<string> > headers, table<string, array<string> > queryParams, string contentType, "
"string body, "
"int timeout, string userAgent",
"[Internal use only] Passes the HttpRequest struct fields to be reconstructed in native and used for an http request",
SQ_InternalMakeHttpRequest<context>);
g_pSquirrel<context>->AddFuncRegistration(
"bool",
"NSIsHttpEnabled",
"",
"Whether or not HTTP requests are enabled. You can opt-out by starting the game with -disablehttprequests.",
SQ_IsHttpEnabled<context>);
"bool",
"NSIsHttpEnabled",
"",
"Whether or not HTTP requests are enabled. You can opt-out by starting the game with -disablehttprequests.",
SQ_IsHttpEnabled<context>);
g_pSquirrel<context>->AddFuncRegistration(
"bool",
"NSIsLocalHttpAllowed",
"",
"Whether or not HTTP requests can be made to a private network address. You can enable this by starting the game with "
"-allowlocalhttp.",
SQ_IsLocalHttpAllowed<context>);
"bool",
"NSIsLocalHttpAllowed",
"",
"Whether or not HTTP requests can be made to a private network address. You can enable this by starting the game with "
"-allowlocalhttp.",
SQ_IsLocalHttpAllowed<context>);
}
ON_DLL_LOAD_RELIESON("client.dll", HttpRequestHandler_ClientInit, ClientSquirrel, (CModule module))

View file

@ -58,13 +58,13 @@ DecodeJsonTable(HSquirrelVM* sqvm, rapidjson::GenericValue<rapidjson::UTF8<char>
case rapidjson::kObjectType:
g_pSquirrel<context>->pushstring(sqvm, itr->name.GetString(), -1);
DecodeJsonTable<context>(
sqvm, (rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>*)&itr->value);
sqvm, (rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>*)&itr->value);
g_pSquirrel<context>->newslot(sqvm, -3, false);
break;
case rapidjson::kArrayType:
g_pSquirrel<context>->pushstring(sqvm, itr->name.GetString(), -1);
DecodeJsonArray<context>(
sqvm, (rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>*)&itr->value);
sqvm, (rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>*)&itr->value);
g_pSquirrel<context>->newslot(sqvm, -3, false);
break;
case rapidjson::kStringType:
@ -97,9 +97,9 @@ DecodeJsonTable(HSquirrelVM* sqvm, rapidjson::GenericValue<rapidjson::UTF8<char>
}
template <ScriptContext context> void EncodeJSONTable(
SQTable* table,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator)
SQTable* table,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator)
{
for (int i = 0; i < table->_numOfNodes; i++)
{
@ -113,7 +113,7 @@ template <ScriptContext context> void EncodeJSONTable(
{
case OT_STRING:
obj->AddMember(
rapidjson::StringRef(node->key._VAL.asString->_val), rapidjson::StringRef(node->val._VAL.asString->_val), allocator);
rapidjson::StringRef(node->key._VAL.asString->_val), rapidjson::StringRef(node->val._VAL.asString->_val), allocator);
break;
case OT_INTEGER:
obj->AddMember(rapidjson::StringRef(node->key._VAL.asString->_val), node->val._VAL.asInteger, allocator);
@ -148,9 +148,9 @@ template <ScriptContext context> void EncodeJSONTable(
}
template <ScriptContext context> void EncodeJSONArray(
SQArray* arr,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator)
SQArray* arr,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator)
{
for (int i = 0; i < arr->_usedSlots; i++)
{
@ -191,11 +191,11 @@ template <ScriptContext context> void EncodeJSONArray(
}
ADD_SQFUNC(
"table",
DecodeJSON,
"string json, bool fatalParseErrors = false",
"converts a json string to a squirrel table",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"table",
DecodeJSON,
"string json, bool fatalParseErrors = false",
"converts a json string to a squirrel table",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
const char* pJson = g_pSquirrel<context>->getstring(sqvm, 1);
const bool bFatalParseErrors = g_pSquirrel<context>->getbool(sqvm, 2);
@ -207,9 +207,9 @@ ADD_SQFUNC(
g_pSquirrel<context>->newtable(sqvm);
std::string sErrorString = fmt::format(
"Failed parsing json file: encountered parse error \"{}\" at offset {}",
GetParseError_En(doc.GetParseError()),
doc.GetErrorOffset());
"Failed parsing json file: encountered parse error \"{}\" at offset {}",
GetParseError_En(doc.GetParseError()),
doc.GetErrorOffset());
if (bFatalParseErrors)
{
@ -226,11 +226,11 @@ ADD_SQFUNC(
}
ADD_SQFUNC(
"string",
EncodeJSON,
"table data",
"converts a squirrel table to a json string",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"string",
EncodeJSON,
"table data",
"converts a squirrel table to a json string",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
rapidjson_document doc;
doc.SetObject();

View file

@ -5,9 +5,9 @@
#include "rapidjson/stringbuffer.h"
template <ScriptContext context> void EncodeJSONTable(
SQTable* table,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator);
SQTable* table,
rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj,
rapidjson::MemoryPoolAllocator<SourceAllocator>& allocator);
template <ScriptContext context> void
DecodeJsonTable(HSquirrelVM* sqvm, rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<SourceAllocator>>* obj);

View file

@ -4,11 +4,11 @@
// asset function StringToAsset( string assetName )
ADD_SQFUNC(
"asset",
StringToAsset,
"string assetName",
"converts a given string to an asset",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"asset",
StringToAsset,
"string assetName",
"converts a given string to an asset",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
g_pSquirrel<context>->pushasset(sqvm, g_pSquirrel<context>->getstring(sqvm, 1), -1);
return SQRESULT_NOTNULL;
@ -16,7 +16,7 @@ ADD_SQFUNC(
// string function NSGetLocalPlayerUID()
ADD_SQFUNC(
"string", NSGetLocalPlayerUID, "", "Returns the local player's uid.", ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"string", NSGetLocalPlayerUID, "", "Returns the local player's uid.", ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
if (R2::g_pLocalPlayerUserID)
{

View file

@ -59,11 +59,11 @@ ADD_SQFUNC("bool", NSIsDedicated, "", "", ScriptContext::SERVER)
}
ADD_SQFUNC(
"bool",
NSDisconnectPlayer,
"entity player, string reason",
"Disconnects the player from the server with the given reason",
ScriptContext::SERVER)
"bool",
NSDisconnectPlayer,
"entity player, string reason",
"Disconnects the player from the server with the given reason",
ScriptContext::SERVER)
{
const R2::CBasePlayer* pPlayer = g_pSquirrel<context>->template getentity<R2::CBasePlayer>(sqvm, 1);
const char* reason = g_pSquirrel<context>->getstring(sqvm, 2);

View file

@ -192,7 +192,7 @@ void ServerAuthenticationManager::WritePersistentData(R2::CBaseClient* pPlayer)
if (pPlayer->m_iPersistenceReady == R2::ePersistenceReady::READY_REMOTE)
{
g_pMasterServerManager->WritePlayerPersistentData(
pPlayer->m_UID, (const char*)pPlayer->m_PersistenceBuffer, m_PlayerAuthenticationData[pPlayer].pdataSize);
pPlayer->m_UID, (const char*)pPlayer->m_PersistenceBuffer, m_PlayerAuthenticationData[pPlayer].pdataSize);
}
else if (Cvar_ns_auth_allow_insecure_write->GetBool())
{
@ -350,17 +350,17 @@ ON_DLL_LOAD_RELIESON("engine.dll", ServerAuthentication, (ConCommand, ConVar), (
g_pServerAuthentication = new ServerAuthenticationManager;
g_pServerAuthentication->Cvar_ns_erase_auth_info =
new ConVar("ns_erase_auth_info", "1", FCVAR_GAMEDLL, "Whether auth info should be erased from this server on disconnect or crash");
new ConVar("ns_erase_auth_info", "1", FCVAR_GAMEDLL, "Whether auth info should be erased from this server on disconnect or crash");
g_pServerAuthentication->Cvar_ns_auth_allow_insecure =
new ConVar("ns_auth_allow_insecure", "0", FCVAR_GAMEDLL, "Whether this server will allow unauthenicated players to connect");
new ConVar("ns_auth_allow_insecure", "0", FCVAR_GAMEDLL, "Whether this server will allow unauthenicated players to connect");
g_pServerAuthentication->Cvar_ns_auth_allow_insecure_write = new ConVar(
"ns_auth_allow_insecure_write",
"0",
FCVAR_GAMEDLL,
"Whether the pdata of unauthenticated clients will be written to disk when changed");
"ns_auth_allow_insecure_write",
"0",
FCVAR_GAMEDLL,
"Whether the pdata of unauthenticated clients will be written to disk when changed");
RegisterConCommand(
"ns_resetpersistence", ConCommand_ns_resetpersistence, "resets your pdata when you next enter the lobby", FCVAR_NONE);
"ns_resetpersistence", ConCommand_ns_resetpersistence, "resets your pdata when you next enter the lobby", FCVAR_NONE);
// patch to disable kicking based on incorrect serverfilter in connectclient, since we repurpose it for use as an auth token
module.Offset(0x114655).Patch("EB");

View file

@ -226,7 +226,7 @@ void DumpAINInfo(CAI_Network* aiNetwork)
memcpy(diskNode.unk3, aiNetwork->nodes[i]->unk3, sizeof(diskNode.unk3));
diskNode.unk4 = aiNetwork->nodes[i]->unk6;
diskNode.unk5 =
-1; // aiNetwork->nodes[i]->unk8; // this field is wrong, however, it's always -1 in vanilla navmeshes anyway, so no biggie
-1; // aiNetwork->nodes[i]->unk8; // this field is wrong, however, it's always -1 in vanilla navmeshes anyway, so no biggie
memcpy(diskNode.unk6, aiNetwork->nodes[i]->unk10, sizeof(diskNode.unk6));
spdlog::info("writing node {} from {} to {:x}", aiNetwork->nodes[i]->index, (void*)aiNetwork->nodes[i], writeStream.tellp());
@ -386,7 +386,7 @@ ON_DLL_LOAD("server.dll", BuildAINFile, (CModule module))
AUTOHOOK_DISPATCH()
Cvar_ns_ai_dumpAINfileFromLoad = new ConVar(
"ns_ai_dumpAINfileFromLoad", "0", FCVAR_NONE, "For debugging: whether we should dump ain data for ains loaded from disk");
"ns_ai_dumpAINfileFromLoad", "0", FCVAR_NONE, "For debugging: whether we should dump ain data for ains loaded from disk");
pUnkStruct0Count = module.Offset(0x1063BF8).RCast<int*>();
pppUnkNodeStruct0s = module.Offset(0x1063BE0).RCast<UnkNodeStruct0***>();

View file

@ -20,7 +20,7 @@ class CRecipientFilter
CServerGameDLL* g_pServerGameDLL;
void(__fastcall* CServerGameDLL__OnReceivedSayTextMessage)(
CServerGameDLL* self, unsigned int senderPlayerId, const char* text, int channelId);
CServerGameDLL* self, unsigned int senderPlayerId, const char* text, int channelId);
void(__fastcall* CRecipientFilter__Construct)(CRecipientFilter* self);
void(__fastcall* CRecipientFilter__Destruct)(CRecipientFilter* self);
@ -56,7 +56,7 @@ void, __fastcall, (CServerGameDLL* self, unsigned int senderPlayerId, const char
return;
SQRESULT result = g_pSquirrel<ScriptContext::SERVER>->Call(
"CServerGameDLL_ProcessMessageStartThread", static_cast<int>(senderPlayerId) - 1, text, isTeam);
"CServerGameDLL_ProcessMessageStartThread", static_cast<int>(senderPlayerId) - 1, text, isTeam);
if (result == SQRESULT_ERROR)
_CServerGameDLL__OnReceivedSayTextMessage(self, senderPlayerId, text, isTeam);
@ -66,11 +66,11 @@ void ChatSendMessage(unsigned int playerIndex, const char* text, bool isTeam)
{
bShouldCallSayTextHook = true;
CServerGameDLL__OnReceivedSayTextMessage(
g_pServerGameDLL,
// Ensure the first bit isn't set, since this indicates a custom message
(playerIndex + 1) & CUSTOM_MESSAGE_INDEX_MASK,
text,
isTeam);
g_pServerGameDLL,
// Ensure the first bit isn't set, since this indicates a custom message
(playerIndex + 1) & CUSTOM_MESSAGE_INDEX_MASK,
text,
isTeam);
}
void ChatBroadcastMessage(int fromPlayerIndex, int toPlayerIndex, const char* text, bool isTeam, bool isDead, CustomMessageType messageType)
@ -125,11 +125,11 @@ ADD_SQFUNC("void", NSSendMessage, "int playerIndex, string text, bool isTeam", "
}
ADD_SQFUNC(
"void",
NSBroadcastMessage,
"int fromPlayerIndex, int toPlayerIndex, string text, bool isTeam, bool isDead, int messageType",
"",
ScriptContext::SERVER)
"void",
NSBroadcastMessage,
"int fromPlayerIndex, int toPlayerIndex, string text, bool isTeam, bool isDead, int messageType",
"",
ScriptContext::SERVER)
{
int fromPlayerIndex = g_pSquirrel<ScriptContext::SERVER>->getinteger(sqvm, 1);
int toPlayerIndex = g_pSquirrel<ScriptContext::SERVER>->getinteger(sqvm, 2);
@ -159,7 +159,7 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerChatHooks, ServerSquirrel, (CModule mod
AUTOHOOK_DISPATCH_MODULE(server.dll)
CServerGameDLL__OnReceivedSayTextMessage =
module.Offset(0x1595C0).RCast<void(__fastcall*)(CServerGameDLL*, unsigned int, const char*, int)>();
module.Offset(0x1595C0).RCast<void(__fastcall*)(CServerGameDLL*, unsigned int, const char*, int)>();
CRecipientFilter__Construct = module.Offset(0x1E9440).RCast<void(__fastcall*)(CRecipientFilter*)>();
CRecipientFilter__Destruct = module.Offset(0x1E9700).RCast<void(__fastcall*)(CRecipientFilter*)>();
CRecipientFilter__AddAllPlayers = module.Offset(0x1E9940).RCast<void(__fastcall*)(CRecipientFilter*)>();

View file

@ -21,4 +21,4 @@ void ChatSendMessage(unsigned int playerIndex, const char* text, bool isteam);
// isDead: display a [DEAD] badge
// messageType: send a specific message type
void ChatBroadcastMessage(
int fromPlayerIndex, int toPlayerIndex, const char* text, bool isTeam, bool isDead, CustomMessageType messageType);
int fromPlayerIndex, int toPlayerIndex, const char* text, bool isTeam, bool isDead, CustomMessageType messageType);

View file

@ -101,10 +101,10 @@ static void ProcessAtlasConnectionlessPacketSigreq1(R2::netpacket_t* packet, boo
{
if (dbg)
spdlog::warn(
"ignoring Atlas connectionless packet (size={} type={}): invalid (data={}): no masterserver token yet",
packet->size,
pType,
pData);
"ignoring Atlas connectionless packet (size={} type={}): invalid (data={}): no masterserver token yet",
packet->size,
pType,
pData);
return;
}
@ -114,16 +114,16 @@ static void ProcessAtlasConnectionlessPacketSigreq1(R2::netpacket_t* packet, boo
{
if (dbg)
spdlog::warn(
"ignoring Atlas connectionless packet (size={} type={}): invalid: invalid signature (key={})",
packet->size,
pType,
std::string(g_pMasterServerManager->m_sOwnServerAuthToken));
"ignoring Atlas connectionless packet (size={} type={}): invalid: invalid signature (key={})",
packet->size,
pType,
std::string(g_pMasterServerManager->m_sOwnServerAuthToken));
return;
}
spdlog::warn(
"processing Atlas connectionless packet (size={} type={}) with invalid signature due to net_debug_atlas_packet_insecure",
packet->size,
pType);
"processing Atlas connectionless packet (size={} type={}) with invalid signature due to net_debug_atlas_packet_insecure",
packet->size,
pType);
}
if (dbg)
@ -197,22 +197,22 @@ ON_DLL_LOAD_RELIESON("engine.dll", ServerNetHooks, ConVar, (CModule module))
throw std::runtime_error("failed to initialize bcrypt");
if (!VerifyHMACSHA256(
"test",
"\x88\xcd\x21\x08\xb5\x34\x7d\x97\x3c\xf3\x9c\xdf\x90\x53\xd7\xdd\x42\x70\x48\x76\xd8\xc9\xa9\xbd\x8e\x2d\x16\x82\x59\xd3\xdd"
"\xf7",
"test"))
"test",
"\x88\xcd\x21\x08\xb5\x34\x7d\x97\x3c\xf3\x9c\xdf\x90\x53\xd7\xdd\x42\x70\x48\x76\xd8\xc9\xa9\xbd\x8e\x2d\x16\x82\x59\xd3\xdd"
"\xf7",
"test"))
throw std::runtime_error("bcrypt HMAC-SHA256 is broken");
Cvar_net_debug_atlas_packet = new ConVar(
"net_debug_atlas_packet",
"0",
FCVAR_NONE,
"Whether to log detailed debugging information for Atlas connectionless packets (warning: this allows unlimited amounts of "
"arbitrary data to be logged)");
"net_debug_atlas_packet",
"0",
FCVAR_NONE,
"Whether to log detailed debugging information for Atlas connectionless packets (warning: this allows unlimited amounts of "
"arbitrary data to be logged)");
Cvar_net_debug_atlas_packet_insecure = new ConVar(
"net_debug_atlas_packet_insecure",
"0",
FCVAR_NONE,
"Whether to disable signature verification for Atlas connectionless packets (DANGEROUS: this allows anyone to impersonate Atlas)");
"net_debug_atlas_packet_insecure",
"0",
FCVAR_NONE,
"Whether to disable signature verification for Atlas connectionless packets (DANGEROUS: this allows anyone to impersonate Atlas)");
}

View file

@ -201,10 +201,10 @@ void ServerPresenceManager::SetPlaylist(const char* pPlaylistName)
{
// update playlist
strncpy_s(
m_ServerPresence.m_PlaylistName,
sizeof(m_ServerPresence.m_PlaylistName),
pPlaylistName,
sizeof(m_ServerPresence.m_PlaylistName) - 1);
m_ServerPresence.m_PlaylistName,
sizeof(m_ServerPresence.m_PlaylistName),
pPlaylistName,
sizeof(m_ServerPresence.m_PlaylistName) - 1);
// update maxplayers
const char* pMaxPlayers = R2::GetCurrentPlaylistVar("max_players", true);

View file

@ -15,16 +15,16 @@ ConVar* Cvar_sv_cheats;
#define BLOCKED_INFO(s) \
( \
[=]() -> bool \
{ \
if (Cvar_ns_exploitfixes_log->GetBool()) \
{ \
std::stringstream stream; \
stream << "ExploitFixes.cpp: " << BLOCK_PREFIX << s; \
spdlog::error(stream.str()); \
} \
return false; \
}())
[=]() -> bool \
{ \
if (Cvar_ns_exploitfixes_log->GetBool()) \
{ \
std::stringstream stream; \
stream << "ExploitFixes.cpp: " << BLOCK_PREFIX << s; \
spdlog::error(stream.str()); \
} \
return false; \
}())
// block bad netmessages
// Servers can literally request a screenshot from any client, yeah no
@ -82,7 +82,7 @@ bool, __fastcall, (void* pMsg)) // 48 8B D1 48 8B 49 18 48 8B 01 48 FF 60 10
bool bIsServerFrame = Tier0::ThreadInServerFrameThread();
std::string BLOCK_PREFIX =
std::string {"NET_SetConVar ("} + (bIsServerFrame ? "server" : "client") + "): Blocked dangerous/invalid msg: ";
std::string {"NET_SetConVar ("} + (bIsServerFrame ? "server" : "client") + "): Blocked dangerous/invalid msg: ";
if (bIsServerFrame)
{
@ -118,14 +118,14 @@ bool, __fastcall, (void* pMsg)) // 48 8B D1 48 8B 49 18 48 8B 01 48 FF 60 10
if (pVar)
{
memcpy(
entry->name,
pVar->m_ConCommandBase.m_pszName,
strlen(pVar->m_ConCommandBase.m_pszName) + 1); // Force name to match case
entry->name,
pVar->m_ConCommandBase.m_pszName,
strlen(pVar->m_ConCommandBase.m_pszName) + 1); // Force name to match case
int iFlags = bIsServerFrame ? FCVAR_USERINFO : FCVAR_REPLICATED;
if (!pVar->IsFlagSet(iFlags))
return BLOCKED_INFO(
"Invalid flags (" << std::hex << "0x" << pVar->m_ConCommandBase.m_nFlags << "), var is " << entry->name);
"Invalid flags (" << std::hex << "0x" << pVar->m_ConCommandBase.m_nFlags << "), var is " << entry->name);
}
}
else
@ -214,7 +214,7 @@ void, __fastcall, (void* buf, void* pCmd_move, void* pCmd_from)) // 4C 89 44 24
auto fromCmd = (SV_CUserCmd*)pCmd_from;
std::string BLOCK_PREFIX =
"ReadUsercmd (command_number delta: " + std::to_string(cmd->command_number - fromCmd->command_number) + "): ";
"ReadUsercmd (command_number delta: " + std::to_string(cmd->command_number - fromCmd->command_number) + "): ";
// fix invalid player angles
cmd->worldViewAngles.MakeValid();
@ -231,8 +231,8 @@ void, __fastcall, (void* buf, void* pCmd_move, void* pCmd_from)) // 4C 89 44 24
if (cmd->frameTime <= 0 || cmd->tick_count == 0 || cmd->command_time <= 0)
{
BLOCKED_INFO(
"Bogus cmd timing (tick_count: " << cmd->tick_count << ", frameTime: " << cmd->frameTime
<< ", commandTime : " << cmd->command_time << ")");
"Bogus cmd timing (tick_count: " << cmd->tick_count << ", frameTime: " << cmd->frameTime
<< ", commandTime : " << cmd->command_time << ")");
goto INVALID_CMD; // No simulation of bogus-timed cmds
}
@ -305,14 +305,14 @@ bool, __fastcall, (R2::CBaseClient* self, uint32_t unknown, const char* pCommand
if (!Cvar_sv_cheats->GetBool())
{
constexpr const char* blockedCommands[] = {
"emit", // Sound-playing exploit (likely for Portal 2 coop devs testing splitscreen sound or something)
"emit", // Sound-playing exploit (likely for Portal 2 coop devs testing splitscreen sound or something)
// These both execute a command for every single entity for some reason, nice one valve
"pre_go_to_hub",
"pre_go_to_calibration",
// These both execute a command for every single entity for some reason, nice one valve
"pre_go_to_hub",
"pre_go_to_calibration",
"end_movie", // Calls "__MovieFinished" script function, not sure exactly what this does but it certainly isn't needed
"load_recent_checkpoint" // This is the instant-respawn exploit, literally just calls RespawnPlayer()
"end_movie", // Calls "__MovieFinished" script function, not sure exactly what this does but it certainly isn't needed
"load_recent_checkpoint" // This is the instant-respawn exploit, literally just calls RespawnPlayer()
};
int iCmdLength = strlen(tempCommand.Arg(0));
@ -348,7 +348,7 @@ void, __fastcall, (void* self))
CBaseClient__SendServerInfo(self);
if (!bWasWritingStringTableSuccessful)
R2::CBaseClient__Disconnect(
self, 1, "Overflowed CNetworkStringTableContainer::WriteBaselines, try restarting your client and reconnecting");
self, 1, "Overflowed CNetworkStringTableContainer::WriteBaselines, try restarting your client and reconnecting");
}
// return null when GetEntByIndex is passed an index >= 0x4000
@ -427,9 +427,9 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerExploitFixes, ConVar, (CModule module))
// Dumb ANTITAMPER patches (they negatively impact performance and security)
constexpr const char* ANTITAMPER_EXPORTS[] = {
"ANTITAMPER_SPOTCHECK_CODEMARKER",
"ANTITAMPER_TESTVALUE_CODEMARKER",
"ANTITAMPER_TRIGGER_CODEMARKER",
"ANTITAMPER_SPOTCHECK_CODEMARKER",
"ANTITAMPER_TESTVALUE_CODEMARKER",
"ANTITAMPER_TRIGGER_CODEMARKER",
};
// Prevent these from actually doing anything
@ -445,9 +445,9 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerExploitFixes, ConVar, (CModule module))
}
Cvar_ns_exploitfixes_log =
new ConVar("ns_exploitfixes_log", "1", FCVAR_GAMEDLL, "Whether to log whenever ExploitFixes.cpp blocks/corrects something");
new ConVar("ns_exploitfixes_log", "1", FCVAR_GAMEDLL, "Whether to log whenever ExploitFixes.cpp blocks/corrects something");
Cvar_ns_should_log_all_clientcommands =
new ConVar("ns_should_log_all_clientcommands", "0", FCVAR_NONE, "Whether to log all clientcommands");
new ConVar("ns_should_log_all_clientcommands", "0", FCVAR_NONE, "Whether to log all clientcommands");
Cvar_sv_cheats = R2::g_pCVar->FindVar("sv_cheats");
}

View file

@ -179,11 +179,11 @@ bool, __fastcall, (INT64* a1, DWORD* a2, char* strData)) // 48 89 5C 24 ? 48 89
// only call if we're parsing utf8 data from the network (i.e. communities), otherwise we get perf issues
void* pReturnAddress =
#ifdef _MSC_VER
_ReturnAddress()
_ReturnAddress()
#else
__builtin_return_address(0)
__builtin_return_address(0)
#endif
;
;
if (pReturnAddress == targetRetAddr && !CheckUTF8Valid(a1, a2, strData))
return false;

View file

@ -29,7 +29,7 @@ void ServerLimitsManager::RunFrame(double flCurrentTime, float flFrameTime)
if (pLimitData->flFrameUserCmdBudget < R2::g_pGlobals->m_flTickInterval * Cvar_sv_antispeedhack_maxtickbudget->GetFloat())
{
pLimitData->flFrameUserCmdBudget += g_pServerLimits->Cvar_sv_antispeedhack_budgetincreasemultiplier->GetFloat() *
fmax(flFrameTime, R2::g_pGlobals->m_flFrameTime * CEngineServer__GetTimescale());
fmax(flFrameTime, R2::g_pGlobals->m_flFrameTime * CEngineServer__GetTimescale());
}
}
}
@ -40,7 +40,7 @@ void ServerLimitsManager::AddPlayer(R2::CBaseClient* player)
{
PlayerLimitData limitData;
limitData.flFrameUserCmdBudget =
R2::g_pGlobals->m_flTickInterval * CEngineServer__GetTimescale() * Cvar_sv_antispeedhack_maxtickbudget->GetFloat();
R2::g_pGlobals->m_flTickInterval * CEngineServer__GetTimescale() * Cvar_sv_antispeedhack_maxtickbudget->GetFloat();
m_PlayerLimitData.insert(std::make_pair(player, limitData));
}
@ -116,7 +116,7 @@ char, __fastcall, (void* self, void* buf))
// reset every second
if (startTime - g_pServerLimits->m_PlayerLimitData[sender].lastNetChanProcessingLimitStart >= 1.0 ||
g_pServerLimits->m_PlayerLimitData[sender].lastNetChanProcessingLimitStart == -1.0)
g_pServerLimits->m_PlayerLimitData[sender].lastNetChanProcessingLimitStart == -1.0)
{
g_pServerLimits->m_PlayerLimitData[sender].lastNetChanProcessingLimitStart = startTime;
g_pServerLimits->m_PlayerLimitData[sender].netChanProcessingLimitTime = 0.0;
@ -124,13 +124,13 @@ char, __fastcall, (void* self, void* buf))
g_pServerLimits->m_PlayerLimitData[sender].netChanProcessingLimitTime += (Tier0::Plat_FloatTime() * 1000) - (startTime * 1000);
if (g_pServerLimits->m_PlayerLimitData[sender].netChanProcessingLimitTime >=
g_pServerLimits->Cvar_net_chan_limit_msec_per_sec->GetInt())
g_pServerLimits->Cvar_net_chan_limit_msec_per_sec->GetInt())
{
spdlog::warn(
"Client {} hit netchan processing limit with {}ms of processing time this second (max is {})",
(char*)sender + 0x16,
g_pServerLimits->m_PlayerLimitData[sender].netChanProcessingLimitTime,
g_pServerLimits->Cvar_net_chan_limit_msec_per_sec->GetInt());
"Client {} hit netchan processing limit with {}ms of processing time this second (max is {})",
(char*)sender + 0x16,
g_pServerLimits->m_PlayerLimitData[sender].netChanProcessingLimitTime,
g_pServerLimits->Cvar_net_chan_limit_msec_per_sec->GetInt());
// never kick local player
if (g_pServerLimits->Cvar_net_chan_limit_mode->GetInt() != NETCHANLIMIT_WARN && strcmp(R2::g_pLocalPlayerUserID, sender->m_UID))
@ -150,7 +150,7 @@ bool ServerLimitsManager::CheckConnectionlessPacketLimits(R2::netpacket_t* packe
// don't ratelimit datablock packets as long as datablock is enabled
if (packet->adr.type == R2::NA_IP &&
(!(packet->data[4] == 'N' && Cvar_net_data_block_enabled->GetBool()) || !Cvar_net_data_block_enabled->GetBool()))
(!(packet->data[4] == 'N' && Cvar_net_data_block_enabled->GetBool()) || !Cvar_net_data_block_enabled->GetBool()))
{
// bad lookup: optimise later tm
UnconnectedPlayerLimitData* sendData = nullptr;
@ -183,9 +183,9 @@ bool ServerLimitsManager::CheckConnectionlessPacketLimits(R2::netpacket_t* packe
if (sendData->packetCount >= g_pServerLimits->Cvar_sv_querylimit_per_sec->GetInt())
{
spdlog::warn(
"Client went over connectionless ratelimit of {} per sec with packet of type {}",
g_pServerLimits->Cvar_sv_querylimit_per_sec->GetInt(),
packet->data[4]);
"Client went over connectionless ratelimit of {} per sec with packet of type {}",
g_pServerLimits->Cvar_sv_querylimit_per_sec->GetInt(),
packet->data[4]);
// timeout for a minute
sendData->timeoutEnd = Tier0::Plat_FloatTime() + 60.0;
@ -199,8 +199,8 @@ bool ServerLimitsManager::CheckConnectionlessPacketLimits(R2::netpacket_t* packe
// this is weird and i'm not sure if it's correct, so not using for now
/*AUTOHOOK(CBasePlayer__PhysicsSimulate, server.dll + 0x5A6E50, bool, __fastcall, (void* self, int a2, char a3))
{
spdlog::info("CBasePlayer::PhysicsSimulate");
return CBasePlayer__PhysicsSimulate(self, a2, a3);
spdlog::info("CBasePlayer::PhysicsSimulate");
return CBasePlayer__PhysicsSimulate(self, a2, a3);
}*/
struct alignas(4) SV_CUserCmd
@ -263,31 +263,31 @@ ON_DLL_LOAD_RELIESON("engine.dll", ServerLimits, ConVar, (CModule module))
g_pServerLimits = new ServerLimitsManager;
g_pServerLimits->CVar_sv_quota_stringcmdspersecond = new ConVar(
"sv_quota_stringcmdspersecond",
"60",
FCVAR_GAMEDLL,
"How many string commands per second clients are allowed to submit, 0 to disallow all string commands, -1 to disable");
"sv_quota_stringcmdspersecond",
"60",
FCVAR_GAMEDLL,
"How many string commands per second clients are allowed to submit, 0 to disallow all string commands, -1 to disable");
g_pServerLimits->Cvar_net_chan_limit_mode =
new ConVar("net_chan_limit_mode", "0", FCVAR_GAMEDLL, "The mode for netchan processing limits: 0 = warn, 1 = kick");
new ConVar("net_chan_limit_mode", "0", FCVAR_GAMEDLL, "The mode for netchan processing limits: 0 = warn, 1 = kick");
g_pServerLimits->Cvar_net_chan_limit_msec_per_sec = new ConVar(
"net_chan_limit_msec_per_sec",
"100",
FCVAR_GAMEDLL,
"Netchannel processing is limited to so many milliseconds, abort connection if exceeding budget");
"net_chan_limit_msec_per_sec",
"100",
FCVAR_GAMEDLL,
"Netchannel processing is limited to so many milliseconds, abort connection if exceeding budget");
g_pServerLimits->Cvar_sv_querylimit_per_sec = new ConVar("sv_querylimit_per_sec", "15", FCVAR_GAMEDLL, "");
g_pServerLimits->Cvar_sv_max_chat_messages_per_sec = new ConVar("sv_max_chat_messages_per_sec", "5", FCVAR_GAMEDLL, "");
g_pServerLimits->Cvar_sv_antispeedhack_enable =
new ConVar("sv_antispeedhack_enable", "0", FCVAR_NONE, "whether to enable antispeedhack protections");
new ConVar("sv_antispeedhack_enable", "0", FCVAR_NONE, "whether to enable antispeedhack protections");
g_pServerLimits->Cvar_sv_antispeedhack_maxtickbudget = new ConVar(
"sv_antispeedhack_maxtickbudget",
"64",
FCVAR_GAMEDLL,
"Maximum number of client-issued usercmd ticks that can be replayed in packet loss conditions");
"sv_antispeedhack_maxtickbudget",
"64",
FCVAR_GAMEDLL,
"Maximum number of client-issued usercmd ticks that can be replayed in packet loss conditions");
g_pServerLimits->Cvar_sv_antispeedhack_budgetincreasemultiplier = new ConVar(
"sv_antispeedhack_budgetincreasemultiplier",
"1",
FCVAR_GAMEDLL,
"Increase usercmd processing budget by tickinterval * value per tick");
"sv_antispeedhack_budgetincreasemultiplier",
"1",
FCVAR_GAMEDLL,
"Increase usercmd processing budget by tickinterval * value per tick");
CEngineServer__GetTimescale = module.Offset(0x240840).RCast<float (*)()>();
}

View file

@ -25,7 +25,7 @@ struct CKeyValuesSystem
const char* (*GetStringForSymbol)(CKeyValuesSystem* self, HKeySymbol symbol);
char pad1[8 * 5];
HKeySymbol (*GetSymbolForStringCaseSensitive)(
CKeyValuesSystem* self, HKeySymbol& hCaseInsensitiveSymbol, const char* name, bool bCreate);
CKeyValuesSystem* self, HKeySymbol& hCaseInsensitiveSymbol, const char* name, bool bCreate);
};
const __VTable* m_pVtable;
@ -95,7 +95,7 @@ KeyValues::KeyValues(const char* pszSetName, const char* pszFirstKey, int iFirst
// *pszSecondValue -
//-----------------------------------------------------------------------------
KeyValues::KeyValues(
const char* pszSetName, const char* pszFirstKey, const char* pszFirstValue, const char* pszSecondKey, const char* pszSecondValue)
const char* pszSetName, const char* pszFirstKey, const char* pszFirstValue, const char* pszSecondKey, const char* pszSecondValue)
{
Init();
SetName(pszSetName);
@ -585,7 +585,7 @@ KeyValues* KeyValues::GetNextKey() const
const char* KeyValues::GetName(void) const
{
return KeyValuesSystem()->m_pVtable->GetStringForSymbol(
KeyValuesSystem(), MAKE_3_BYTES_FROM_1_AND_2(m_iKeyNameCaseSensitive1, m_iKeyNameCaseSensitive2));
KeyValuesSystem(), MAKE_3_BYTES_FROM_1_AND_2(m_iKeyNameCaseSensitive1, m_iKeyNameCaseSensitive2));
}
//-----------------------------------------------------------------------------
@ -974,7 +974,7 @@ void KeyValues::SetName(const char* pszSetName)
{
HKeySymbol hCaseSensitiveKeyName = INVALID_KEY_SYMBOL, hCaseInsensitiveKeyName = INVALID_KEY_SYMBOL;
hCaseSensitiveKeyName =
KeyValuesSystem()->m_pVtable->GetSymbolForStringCaseSensitive(KeyValuesSystem(), hCaseInsensitiveKeyName, pszSetName, false);
KeyValuesSystem()->m_pVtable->GetSymbolForStringCaseSensitive(KeyValuesSystem(), hCaseInsensitiveKeyName, pszSetName, false);
m_iKeyName = hCaseInsensitiveKeyName;
SPLIT_3_BYTES_INTO_1_AND_2(m_iKeyNameCaseSensitive1, m_iKeyNameCaseSensitive2, hCaseSensitiveKeyName);

View file

@ -58,7 +58,7 @@ class KeyValues
KeyValues(const char* pszSetName, const char* pszFirstKey, const wchar_t* pwszFirstValue);
KeyValues(const char* pszSetName, const char* pszFirstKey, int iFirstValue);
KeyValues(
const char* pszSetName, const char* pszFirstKey, const char* pszFirstValue, const char* pszSecondKey, const char* pszSecondValue);
const char* pszSetName, const char* pszFirstKey, const char* pszFirstValue, const char* pszSecondKey, const char* pszSecondValue);
KeyValues(const char* pszSetName, const char* pszFirstKey, int iFirstValue, const char* pszSecondKey, int iSecondValue);
~KeyValues(void);

View file

@ -114,10 +114,10 @@ ON_DLL_LOAD("engine.dll", MaxPlayersOverride_Engine, (CModule module))
// patch max players in userinfo stringtable creation
/*{
int maxPlayersPowerOf2 = 1;
while (maxPlayersPowerOf2 < NEW_MAX_PLAYERS)
maxPlayersPowerOf2 <<= 1;
ChangeOffset<unsigned char>((char*)baseAddress + 0x114B79 + 3, maxPlayersPowerOf2); // original: 32
int maxPlayersPowerOf2 = 1;
while (maxPlayersPowerOf2 < NEW_MAX_PLAYERS)
maxPlayersPowerOf2 <<= 1;
ChangeOffset<unsigned char>((char*)baseAddress + 0x114B79 + 3, maxPlayersPowerOf2); // original: 32
}*/
// this is not supposed to work at all but it does on 64 players (how)
// proper fix below
@ -184,9 +184,9 @@ void,, (bool a1, float a2))
v3 = *(unsigned char*)(g_pGlobals + 73);
if (*(DWORD*)(qword_1814D9648 + 92) &&
((*(unsigned __int8(__fastcall**)(__int64))(*(__int64*)g_pEngineServer + 32))(g_pEngineServer) ||
!*(DWORD*)(qword_1814DA408 + 92)) &&
v3)
((*(unsigned __int8(__fastcall**)(__int64))(*(__int64*)g_pEngineServer + 32))(g_pEngineServer) ||
!*(DWORD*)(qword_1814DA408 + 92)) &&
v3)
{
globals = g_pGlobals;
v5 = 1;
@ -482,11 +482,11 @@ ON_DLL_LOAD("client.dll", MaxPlayersOverride_Client, (CModule module))
// C_PlayerResource::C_PlayerResource - change m_szName address
ChangeOffset<unsigned int>(
module.Offset(0x1640D0 + 3), C_PlayerResource_OriginalSize + PlayerResource_Name_Start); // appended to the end of the class
module.Offset(0x1640D0 + 3), C_PlayerResource_OriginalSize + PlayerResource_Name_Start); // appended to the end of the class
// C_PlayerResource::C_PlayerResource - change m_szName address
ChangeOffset<unsigned int>(
module.Offset(0x1640D0 + 3), C_PlayerResource_OriginalSize + PlayerResource_Name_Start); // appended to the end of the class
module.Offset(0x1640D0 + 3), C_PlayerResource_OriginalSize + PlayerResource_Name_Start); // appended to the end of the class
// C_PlayerResource::C_PlayerResource - increase memset length to clean newly allocated data
ChangeOffset<unsigned int>(module.Offset(0x1640D0 + 3), 2244 + C_PlayerResource_AddedSize);

View file

@ -113,30 +113,30 @@ void ConCommand_cvar_reset(const CCommand& arg)
void AddMiscConCommands()
{
RegisterConCommand(
"force_newgame",
ConCommand_force_newgame,
"forces a map load through directly setting g_pHostState->m_iNextState to HS_NEW_GAME",
FCVAR_NONE);
"force_newgame",
ConCommand_force_newgame,
"forces a map load through directly setting g_pHostState->m_iNextState to HS_NEW_GAME",
FCVAR_NONE);
RegisterConCommand(
"ns_start_reauth_and_leave_to_lobby",
ConCommand_ns_start_reauth_and_leave_to_lobby,
"called by the server, used to reauth and return the player to lobby when leaving a game",
FCVAR_SERVER_CAN_EXECUTE);
"ns_start_reauth_and_leave_to_lobby",
ConCommand_ns_start_reauth_and_leave_to_lobby,
"called by the server, used to reauth and return the player to lobby when leaving a game",
FCVAR_SERVER_CAN_EXECUTE);
// this is a concommand because we make a deferred call to it from another thread
RegisterConCommand("ns_end_reauth_and_leave_to_lobby", ConCommand_ns_end_reauth_and_leave_to_lobby, "", FCVAR_NONE);
RegisterConCommand(
"cvar_setdefaultvalue",
ConCommand_cvar_setdefaultvalue,
"overwrites the default value of a cvar, for use with script and cvar_reset",
FCVAR_NONE);
"cvar_setdefaultvalue",
ConCommand_cvar_setdefaultvalue,
"overwrites the default value of a cvar, for use with script and cvar_reset",
FCVAR_NONE);
RegisterConCommand(
"cvar_setvalueanddefaultvalue",
ConCommand_cvar_setvalueanddefaultvalue,
"overwrites the current value and default value of a cvar, for use with script and cvar_reset",
FCVAR_NONE);
"cvar_setvalueanddefaultvalue",
ConCommand_cvar_setvalueanddefaultvalue,
"overwrites the current value and default value of a cvar, for use with script and cvar_reset",
FCVAR_NONE);
RegisterConCommand("cvar_reset", ConCommand_cvar_reset, "resets a cvar's value to its default value", FCVAR_NONE);
}
@ -184,185 +184,185 @@ void FixupCvarFlags()
// array of cvars and the flags we want to add to them
const std::vector<std::tuple<const char*, uint32_t>> CVAR_FIXUP_ADD_FLAGS = {
// system commands (i.e. necessary for proper functionality)
// servers need to be able to disconnect
{"disconnect", FCVAR_SERVER_CAN_EXECUTE},
// system commands (i.e. necessary for proper functionality)
// servers need to be able to disconnect
{"disconnect", FCVAR_SERVER_CAN_EXECUTE},
// cheat commands
{"give", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"give_server", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"givecurrentammo", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"takecurrentammo", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
// cheat commands
{"give", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"give_server", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"givecurrentammo", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"takecurrentammo", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"switchclass", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"set", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"_setClassVarServer", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"switchclass", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"set", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"_setClassVarServer", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_create", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_throw", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_setname", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_teleport", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_remove", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_remove_all", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_fire", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_create", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_throw", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_setname", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_teleport", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_remove", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_remove_all", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"ent_fire", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_create", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_recreate", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_kill", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_create", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_recreate", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"particle_kill", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"test_setteam", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"melee_lunge_ent", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"test_setteam", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"melee_lunge_ent", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
// fcvars that should be cheats
{"net_ignoreAllSnapshots", FCVAR_CHEAT},
{"highlight_draw", FCVAR_CHEAT},
// these should potentially be replicated rather than cheat, like sv_footsteps is
// however they're defined on client, so can't make replicated atm sadly
{"cl_footstep_event_max_dist", FCVAR_CHEAT},
{"cl_footstep_event_max_dist_titan", FCVAR_CHEAT},
// fcvars that should be cheats
{"net_ignoreAllSnapshots", FCVAR_CHEAT},
{"highlight_draw", FCVAR_CHEAT},
// these should potentially be replicated rather than cheat, like sv_footsteps is
// however they're defined on client, so can't make replicated atm sadly
{"cl_footstep_event_max_dist", FCVAR_CHEAT},
{"cl_footstep_event_max_dist_titan", FCVAR_CHEAT},
};
// array of cvars and the flags we want to remove from them
const std::vector<std::tuple<const char*, uint32_t>> CVAR_FIXUP_REMOVE_FLAGS = {
// unsure how this command works, not even sure it's used on retail servers, deffo shouldn't be used on northstar
{"migrateme", FCVAR_SERVER_CAN_EXECUTE | FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"recheck", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS}, // we don't need this on northstar servers, it's for communities
// unsure how this command works, not even sure it's used on retail servers, deffo shouldn't be used on northstar
{"migrateme", FCVAR_SERVER_CAN_EXECUTE | FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"recheck", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS}, // we don't need this on northstar servers, it's for communities
// unsure how these work exactly (rpt system likely somewhat stripped?), removing anyway since they won't be used
{"rpt_client_enable", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"rpt_password", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
// unsure how these work exactly (rpt system likely somewhat stripped?), removing anyway since they won't be used
{"rpt_client_enable", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
{"rpt_password", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
// these are devonly by default but should be modifyable
// NOTE: not all of these may actually do anything or work properly in practice
// network settings
{"cl_updaterate_mp", FCVAR_DEVELOPMENTONLY},
{"cl_updaterate_sp", FCVAR_DEVELOPMENTONLY},
{"clock_bias_sp", FCVAR_DEVELOPMENTONLY},
{"clock_bias_mp", FCVAR_DEVELOPMENTONLY},
{"cl_interpolate", FCVAR_DEVELOPMENTONLY}, // super duper ultra fucks anims if changed
{"cl_interpolateSoAllAnimsLoop", FCVAR_DEVELOPMENTONLY},
{"cl_cmdrate", FCVAR_DEVELOPMENTONLY},
{"cl_cmdbackup", FCVAR_DEVELOPMENTONLY},
{"rate", FCVAR_DEVELOPMENTONLY},
{"net_minroutable", FCVAR_DEVELOPMENTONLY},
{"net_maxroutable", FCVAR_DEVELOPMENTONLY},
{"net_lerpFields", FCVAR_DEVELOPMENTONLY},
{"net_ignoreAllSnapshots", FCVAR_DEVELOPMENTONLY},
{"net_chokeloop", FCVAR_DEVELOPMENTONLY},
{"sv_unlag", FCVAR_DEVELOPMENTONLY},
{"sv_maxunlag", FCVAR_DEVELOPMENTONLY},
{"sv_lagpushticks", FCVAR_DEVELOPMENTONLY},
{"sv_instancebaselines", FCVAR_DEVELOPMENTONLY},
{"sv_voiceEcho", FCVAR_DEVELOPMENTONLY},
{"net_compresspackets", FCVAR_DEVELOPMENTONLY},
{"net_compresspackets_minsize", FCVAR_DEVELOPMENTONLY},
{"net_verifyEncryption", FCVAR_DEVELOPMENTONLY}, // unsure if functional in retail
// these are devonly by default but should be modifyable
// NOTE: not all of these may actually do anything or work properly in practice
// network settings
{"cl_updaterate_mp", FCVAR_DEVELOPMENTONLY},
{"cl_updaterate_sp", FCVAR_DEVELOPMENTONLY},
{"clock_bias_sp", FCVAR_DEVELOPMENTONLY},
{"clock_bias_mp", FCVAR_DEVELOPMENTONLY},
{"cl_interpolate", FCVAR_DEVELOPMENTONLY}, // super duper ultra fucks anims if changed
{"cl_interpolateSoAllAnimsLoop", FCVAR_DEVELOPMENTONLY},
{"cl_cmdrate", FCVAR_DEVELOPMENTONLY},
{"cl_cmdbackup", FCVAR_DEVELOPMENTONLY},
{"rate", FCVAR_DEVELOPMENTONLY},
{"net_minroutable", FCVAR_DEVELOPMENTONLY},
{"net_maxroutable", FCVAR_DEVELOPMENTONLY},
{"net_lerpFields", FCVAR_DEVELOPMENTONLY},
{"net_ignoreAllSnapshots", FCVAR_DEVELOPMENTONLY},
{"net_chokeloop", FCVAR_DEVELOPMENTONLY},
{"sv_unlag", FCVAR_DEVELOPMENTONLY},
{"sv_maxunlag", FCVAR_DEVELOPMENTONLY},
{"sv_lagpushticks", FCVAR_DEVELOPMENTONLY},
{"sv_instancebaselines", FCVAR_DEVELOPMENTONLY},
{"sv_voiceEcho", FCVAR_DEVELOPMENTONLY},
{"net_compresspackets", FCVAR_DEVELOPMENTONLY},
{"net_compresspackets_minsize", FCVAR_DEVELOPMENTONLY},
{"net_verifyEncryption", FCVAR_DEVELOPMENTONLY}, // unsure if functional in retail
// gameplay settings
{"vel_samples", FCVAR_DEVELOPMENTONLY},
{"vel_sampleFrequency", FCVAR_DEVELOPMENTONLY},
{"sv_friction", FCVAR_DEVELOPMENTONLY},
{"sv_stopspeed", FCVAR_DEVELOPMENTONLY},
{"sv_airaccelerate", FCVAR_DEVELOPMENTONLY},
{"sv_forceGrapplesToFail", FCVAR_DEVELOPMENTONLY},
{"sv_maxvelocity", FCVAR_DEVELOPMENTONLY},
{"sv_footsteps", FCVAR_DEVELOPMENTONLY},
// these 2 are flagged as CHEAT above, could be made REPLICATED later potentially
{"cl_footstep_event_max_dist", FCVAR_DEVELOPMENTONLY},
{"cl_footstep_event_max_dist_titan", FCVAR_DEVELOPMENTONLY},
{"sv_balanceTeams", FCVAR_DEVELOPMENTONLY},
{"rodeo_enable", FCVAR_DEVELOPMENTONLY},
{"sv_forceRodeoToFail", FCVAR_DEVELOPMENTONLY},
{"player_find_rodeo_target_per_cmd", FCVAR_DEVELOPMENTONLY}, // todo test before merge
{"hud_takesshots", FCVAR_DEVELOPMENTONLY}, // very likely does not work but would be cool if it did
// gameplay settings
{"vel_samples", FCVAR_DEVELOPMENTONLY},
{"vel_sampleFrequency", FCVAR_DEVELOPMENTONLY},
{"sv_friction", FCVAR_DEVELOPMENTONLY},
{"sv_stopspeed", FCVAR_DEVELOPMENTONLY},
{"sv_airaccelerate", FCVAR_DEVELOPMENTONLY},
{"sv_forceGrapplesToFail", FCVAR_DEVELOPMENTONLY},
{"sv_maxvelocity", FCVAR_DEVELOPMENTONLY},
{"sv_footsteps", FCVAR_DEVELOPMENTONLY},
// these 2 are flagged as CHEAT above, could be made REPLICATED later potentially
{"cl_footstep_event_max_dist", FCVAR_DEVELOPMENTONLY},
{"cl_footstep_event_max_dist_titan", FCVAR_DEVELOPMENTONLY},
{"sv_balanceTeams", FCVAR_DEVELOPMENTONLY},
{"rodeo_enable", FCVAR_DEVELOPMENTONLY},
{"sv_forceRodeoToFail", FCVAR_DEVELOPMENTONLY},
{"player_find_rodeo_target_per_cmd", FCVAR_DEVELOPMENTONLY}, // todo test before merge
{"hud_takesshots", FCVAR_DEVELOPMENTONLY}, // very likely does not work but would be cool if it did
{"cam_collision", FCVAR_DEVELOPMENTONLY},
{"cam_idealdelta", FCVAR_DEVELOPMENTONLY},
{"cam_ideallag", FCVAR_DEVELOPMENTONLY},
{"cam_collision", FCVAR_DEVELOPMENTONLY},
{"cam_idealdelta", FCVAR_DEVELOPMENTONLY},
{"cam_ideallag", FCVAR_DEVELOPMENTONLY},
// graphics/visual settings
{"mat_colorcorrection", FCVAR_DEVELOPMENTONLY},
{"r_hbaoRadius", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDepthMax", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBlurSharpness", FCVAR_DEVELOPMENTONLY},
{"r_hbaoIntensity", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBias", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDistanceLerp", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBlurRadius", FCVAR_DEVELOPMENTONLY},
{"r_hbaoExponent", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDepthFadePctDefault", FCVAR_DEVELOPMENTONLY},
{"r_drawscreenspaceparticles", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_fadeout_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_fadein_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_transition_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_mintransition_time", FCVAR_DEVELOPMENTONLY},
// these 2 could be FCVAR_CHEAT, i guess?
{"cl_draw_player_model", FCVAR_DEVELOPMENTONLY},
{"cl_always_draw_3p_player", FCVAR_DEVELOPMENTONLY},
{"idcolor_neutral", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb1", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb2", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb3", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb1", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb2", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb3", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorR", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorG", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorB", FCVAR_DEVELOPMENTONLY},
{"playerListUseFriendColor", FCVAR_DEVELOPMENTONLY},
{"fx_impact_neutral", FCVAR_DEVELOPMENTONLY},
{"fx_impact_ally", FCVAR_DEVELOPMENTONLY},
{"fx_impact_enemy", FCVAR_DEVELOPMENTONLY},
{"hitch_alert_color", FCVAR_DEVELOPMENTONLY},
{"particles_cull_all", FCVAR_DEVELOPMENTONLY},
{"particles_cull_dlights", FCVAR_DEVELOPMENTONLY},
{"map_settings_override", FCVAR_DEVELOPMENTONLY},
{"highlight_draw", FCVAR_DEVELOPMENTONLY},
// graphics/visual settings
{"mat_colorcorrection", FCVAR_DEVELOPMENTONLY},
{"r_hbaoRadius", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDepthMax", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBlurSharpness", FCVAR_DEVELOPMENTONLY},
{"r_hbaoIntensity", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBias", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDistanceLerp", FCVAR_DEVELOPMENTONLY},
{"r_hbaoBlurRadius", FCVAR_DEVELOPMENTONLY},
{"r_hbaoExponent", FCVAR_DEVELOPMENTONLY},
{"r_hbaoDepthFadePctDefault", FCVAR_DEVELOPMENTONLY},
{"r_drawscreenspaceparticles", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_fadeout_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_fadein_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_transition_time", FCVAR_DEVELOPMENTONLY},
{"ui_loadingscreen_mintransition_time", FCVAR_DEVELOPMENTONLY},
// these 2 could be FCVAR_CHEAT, i guess?
{"cl_draw_player_model", FCVAR_DEVELOPMENTONLY},
{"cl_always_draw_3p_player", FCVAR_DEVELOPMENTONLY},
{"idcolor_neutral", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb1", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb2", FCVAR_DEVELOPMENTONLY},
{"idcolor_ally_cb3", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb1", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb2", FCVAR_DEVELOPMENTONLY},
{"idcolor_enemy_cb3", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorR", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorG", FCVAR_DEVELOPMENTONLY},
{"playerListPartyColorB", FCVAR_DEVELOPMENTONLY},
{"playerListUseFriendColor", FCVAR_DEVELOPMENTONLY},
{"fx_impact_neutral", FCVAR_DEVELOPMENTONLY},
{"fx_impact_ally", FCVAR_DEVELOPMENTONLY},
{"fx_impact_enemy", FCVAR_DEVELOPMENTONLY},
{"hitch_alert_color", FCVAR_DEVELOPMENTONLY},
{"particles_cull_all", FCVAR_DEVELOPMENTONLY},
{"particles_cull_dlights", FCVAR_DEVELOPMENTONLY},
{"map_settings_override", FCVAR_DEVELOPMENTONLY},
{"highlight_draw", FCVAR_DEVELOPMENTONLY},
// sys/engine settings
{"sleep_when_meeting_framerate", FCVAR_DEVELOPMENTONLY},
{"sleep_when_meeting_framerate_headroom_ms", FCVAR_DEVELOPMENTONLY},
{"not_focus_sleep", FCVAR_DEVELOPMENTONLY},
{"sp_not_focus_pause", FCVAR_DEVELOPMENTONLY},
{"joy_requireFocus", FCVAR_DEVELOPMENTONLY},
// sys/engine settings
{"sleep_when_meeting_framerate", FCVAR_DEVELOPMENTONLY},
{"sleep_when_meeting_framerate_headroom_ms", FCVAR_DEVELOPMENTONLY},
{"not_focus_sleep", FCVAR_DEVELOPMENTONLY},
{"sp_not_focus_pause", FCVAR_DEVELOPMENTONLY},
{"joy_requireFocus", FCVAR_DEVELOPMENTONLY},
{"host_thread_mode", FCVAR_DEVELOPMENTONLY},
{"phys_enable_simd_optimizations", FCVAR_DEVELOPMENTONLY},
{"phys_enable_experimental_optimizations", FCVAR_DEVELOPMENTONLY},
{"host_thread_mode", FCVAR_DEVELOPMENTONLY},
{"phys_enable_simd_optimizations", FCVAR_DEVELOPMENTONLY},
{"phys_enable_experimental_optimizations", FCVAR_DEVELOPMENTONLY},
{"community_frame_run", FCVAR_DEVELOPMENTONLY},
{"sv_single_core_dedi", FCVAR_DEVELOPMENTONLY},
{"sv_stressbots", FCVAR_DEVELOPMENTONLY},
{"community_frame_run", FCVAR_DEVELOPMENTONLY},
{"sv_single_core_dedi", FCVAR_DEVELOPMENTONLY},
{"sv_stressbots", FCVAR_DEVELOPMENTONLY},
{"fatal_script_errors", FCVAR_DEVELOPMENTONLY},
{"fatal_script_errors_client", FCVAR_DEVELOPMENTONLY},
{"fatal_script_errors_server", FCVAR_DEVELOPMENTONLY},
{"script_error_on_midgame_load", FCVAR_DEVELOPMENTONLY}, // idk what this is
{"fatal_script_errors", FCVAR_DEVELOPMENTONLY},
{"fatal_script_errors_client", FCVAR_DEVELOPMENTONLY},
{"fatal_script_errors_server", FCVAR_DEVELOPMENTONLY},
{"script_error_on_midgame_load", FCVAR_DEVELOPMENTONLY}, // idk what this is
{"ai_ainRebuildOnMapStart", FCVAR_DEVELOPMENTONLY},
{"ai_ainRebuildOnMapStart", FCVAR_DEVELOPMENTONLY},
{"save_enable", FCVAR_DEVELOPMENTONLY},
{"save_enable", FCVAR_DEVELOPMENTONLY},
// cheat commands
{"switchclass", FCVAR_DEVELOPMENTONLY},
{"set", FCVAR_DEVELOPMENTONLY},
{"_setClassVarServer", FCVAR_DEVELOPMENTONLY},
// cheat commands
{"switchclass", FCVAR_DEVELOPMENTONLY},
{"set", FCVAR_DEVELOPMENTONLY},
{"_setClassVarServer", FCVAR_DEVELOPMENTONLY},
// reparse commands
{"aisettings_reparse", FCVAR_DEVELOPMENTONLY},
{"aisettings_reparse_client", FCVAR_DEVELOPMENTONLY},
{"damagedefs_reparse", FCVAR_DEVELOPMENTONLY},
{"damagedefs_reparse_client", FCVAR_DEVELOPMENTONLY},
{"playerSettings_reparse", FCVAR_DEVELOPMENTONLY},
{"_playerSettings_reparse_Server", FCVAR_DEVELOPMENTONLY},
// reparse commands
{"aisettings_reparse", FCVAR_DEVELOPMENTONLY},
{"aisettings_reparse_client", FCVAR_DEVELOPMENTONLY},
{"damagedefs_reparse", FCVAR_DEVELOPMENTONLY},
{"damagedefs_reparse_client", FCVAR_DEVELOPMENTONLY},
{"playerSettings_reparse", FCVAR_DEVELOPMENTONLY},
{"_playerSettings_reparse_Server", FCVAR_DEVELOPMENTONLY},
};
const std::vector<std::tuple<const char*, const char*>> CVAR_FIXUP_DEFAULT_VALUES = {
{"sv_stressbots", "0"}, // not currently used but this is probably a bad default if we get bots working
{"cl_pred_optimize", "0"} // fixes issues with animation prediction in thirdperson
{"sv_stressbots", "0"}, // not currently used but this is probably a bad default if we get bots working
{"cl_pred_optimize", "0"} // fixes issues with animation prediction in thirdperson
};
for (auto& fixup : CVAR_FIXUP_ADD_FLAGS)

View file

@ -26,7 +26,7 @@ char, __fastcall, (void* a1, void* a2))
{
// the private_match playlist on mp_lobby is the only situation where there should be any legitimate sending of this netmessage
if (!Cvar_ns_use_clc_SetPlaylistVarOverride->GetBool() || strcmp(R2::GetCurrentPlaylistName(), "private_match") ||
strcmp(R2::g_pGlobals->m_pMapName, "mp_lobby"))
strcmp(R2::g_pGlobals->m_pMapName, "mp_lobby"))
return 1;
return clc_SetPlaylistVarOverride__Process(a1, a2);
@ -114,7 +114,7 @@ ON_DLL_LOAD_RELIESON("engine.dll", PlaylistHooks, (ConCommand, ConVar), (CModule
// disabled altogether, since the custom menus won't use it anyway this should only really be accepted if you want vanilla client
// compatibility
Cvar_ns_use_clc_SetPlaylistVarOverride = new ConVar(
"ns_use_clc_SetPlaylistVarOverride", "0", FCVAR_GAMEDLL, "Whether the server should accept clc_SetPlaylistVarOverride messages");
"ns_use_clc_SetPlaylistVarOverride", "0", FCVAR_GAMEDLL, "Whether the server should accept clc_SetPlaylistVarOverride messages");
// patch to prevent clc_SetPlaylistVarOverride from being able to crash servers if we reach max overrides due to a call to Error (why is
// this possible respawn, wtf) todo: add a warning for this

View file

@ -75,15 +75,15 @@ const char* GetContextName_Short(ScriptContext context)
eSQReturnType SQReturnTypeFromString(const char* pReturnType)
{
static const std::map<std::string, eSQReturnType> sqReturnTypeNameToString = {
{"bool", eSQReturnType::Boolean},
{"float", eSQReturnType::Float},
{"vector", eSQReturnType::Vector},
{"int", eSQReturnType::Integer},
{"entity", eSQReturnType::Entity},
{"string", eSQReturnType::String},
{"array", eSQReturnType::Arrays},
{"asset", eSQReturnType::Asset},
{"table", eSQReturnType::Table}};
{"bool", eSQReturnType::Boolean},
{"float", eSQReturnType::Float},
{"vector", eSQReturnType::Vector},
{"int", eSQReturnType::Integer},
{"entity", eSQReturnType::Entity},
{"string", eSQReturnType::String},
{"array", eSQReturnType::Arrays},
{"asset", eSQReturnType::Asset},
{"table", eSQReturnType::Table}};
if (sqReturnTypeNameToString.find(pReturnType) != sqReturnTypeNameToString.end())
return sqReturnTypeNameToString.at(pReturnType);
@ -320,7 +320,7 @@ template <ScriptContext context> void SquirrelManager<context>::ExecuteCode(cons
}
template <ScriptContext context> void SquirrelManager<context>::AddFuncRegistration(
std::string returnType, std::string name, std::string argTypes, std::string helpText, SQFunction func)
std::string returnType, std::string name, std::string argTypes, std::string helpText, SQFunction func)
{
SQFuncRegistration* reg = new SQFuncRegistration;
@ -480,10 +480,10 @@ void __fastcall ScriptCompileErrorHook(HSquirrelVM* sqvm, const char* error, con
else
{
R2::Cbuf_AddText(
R2::Cbuf_GetCurrentPlayer(),
fmt::format("disconnect \"Encountered {} script compilation error, see console for details.\"", GetContextName(realContext))
.c_str(),
R2::cmd_source_t::kCommandSrcCode);
R2::Cbuf_GetCurrentPlayer(),
fmt::format("disconnect \"Encountered {} script compilation error, see console for details.\"", GetContextName(realContext))
.c_str(),
R2::cmd_source_t::kCommandSrcCode);
// likely temp: show console so user can see any errors, as error message wont display if ui is dead
// maybe we could disable all mods other than the coremods and try a reload before doing this?
@ -636,7 +636,7 @@ template <ScriptContext context> void SquirrelManager<context>::ProcessMessageBu
if (result != 0) // This func returns 0 on success for some reason
{
NS::log::squirrel_logger<context>()->error(
"ProcessMessageBuffer was unable to find function with name '{}'. Is it global?", message.functionName);
"ProcessMessageBuffer was unable to find function with name '{}'. Is it global?", message.functionName);
continue;
}
@ -661,11 +661,11 @@ template <ScriptContext context> void SquirrelManager<context>::ProcessMessageBu
}
ADD_SQFUNC(
"string",
NSGetCurrentModName,
"",
"Returns the mod name of the script running this function",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"string",
NSGetCurrentModName,
"",
"Returns the mod name of the script running this function",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
int depth = g_pSquirrel<context>->getinteger(sqvm, 1);
if (auto mod = g_pSquirrel<context>->getcallingmod(sqvm, depth); mod == nullptr)
@ -681,11 +681,11 @@ ADD_SQFUNC(
}
ADD_SQFUNC(
"string",
NSGetCallingModName,
"int depth = 0",
"Returns the mod name of the script running this function",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"string",
NSGetCallingModName,
"int depth = 0",
"Returns the mod name of the script running this function",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
int depth = g_pSquirrel<context>->getinteger(sqvm, 1);
if (auto mod = g_pSquirrel<context>->getcallingmod(sqvm, depth); mod == nullptr)
@ -772,7 +772,7 @@ ON_DLL_LOAD_RELIESON("client.dll", ClientSquirrel, ConCommand, (CModule module))
g_pSquirrel<ScriptContext::CLIENT>->__sq_GetEntityConstant_CBaseEntity = module.Offset(0x3E49B0).RCast<sq_GetEntityConstantType>();
g_pSquirrel<ScriptContext::CLIENT>->__sq_getentityfrominstance = module.Offset(0x114F0).RCast<sq_getentityfrominstanceType>();
g_pSquirrel<ScriptContext::UI>->__sq_GetEntityConstant_CBaseEntity =
g_pSquirrel<ScriptContext::CLIENT>->__sq_GetEntityConstant_CBaseEntity;
g_pSquirrel<ScriptContext::CLIENT>->__sq_GetEntityConstant_CBaseEntity;
g_pSquirrel<ScriptContext::UI>->__sq_getentityfrominstance = g_pSquirrel<ScriptContext::CLIENT>->__sq_getentityfrominstance;
// Message buffer stuff
@ -789,9 +789,9 @@ ON_DLL_LOAD_RELIESON("client.dll", ClientSquirrel, ConCommand, (CModule module))
g_pSquirrel<ScriptContext::UI>->__sq_sealstructslot = g_pSquirrel<ScriptContext::CLIENT>->__sq_sealstructslot;
MAKEHOOK(
module.Offset(0x108E0),
&RegisterSquirrelFunctionHook<ScriptContext::CLIENT>,
&g_pSquirrel<ScriptContext::CLIENT>->RegisterSquirrelFunc);
module.Offset(0x108E0),
&RegisterSquirrelFunctionHook<ScriptContext::CLIENT>,
&g_pSquirrel<ScriptContext::CLIENT>->RegisterSquirrelFunc);
g_pSquirrel<ScriptContext::UI>->RegisterSquirrelFunc = g_pSquirrel<ScriptContext::CLIENT>->RegisterSquirrelFunc;
g_pSquirrel<ScriptContext::CLIENT>->logger = NS::log::SCRIPT_CL;
@ -882,9 +882,9 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerSquirrel, ConCommand, (CModule module))
g_pSquirrel<ScriptContext::SERVER>->__sq_sealstructslot = module.Offset(0x5510).RCast<sq_sealstructslotType>();
MAKEHOOK(
module.Offset(0x1DD10),
&RegisterSquirrelFunctionHook<ScriptContext::SERVER>,
&g_pSquirrel<ScriptContext::SERVER>->RegisterSquirrelFunc);
module.Offset(0x1DD10),
&RegisterSquirrelFunctionHook<ScriptContext::SERVER>,
&g_pSquirrel<ScriptContext::SERVER>->RegisterSquirrelFunc);
MAKEHOOK(module.Offset(0x8AA0), &sq_compiler_createHook<ScriptContext::SERVER>, &sq_compiler_create<ScriptContext::SERVER>);
@ -897,10 +897,10 @@ ON_DLL_LOAD_RELIESON("server.dll", ServerSquirrel, ConCommand, (CModule module))
// FCVAR_CHEAT and FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS allows clients to execute this, but since it's unsafe we only allow it when cheats
// are enabled for script_client and script_ui, we don't use cheats, so clients can execute them on themselves all they want
RegisterConCommand(
"script",
ConCommand_script<ScriptContext::SERVER>,
"Executes script code on the server vm",
FCVAR_GAMEDLL | FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS | FCVAR_CHEAT);
"script",
ConCommand_script<ScriptContext::SERVER>,
"Executes script code on the server vm",
FCVAR_GAMEDLL | FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS | FCVAR_CHEAT);
StubUnsafeSQFuncs<ScriptContext::SERVER>();

View file

@ -7,8 +7,8 @@
#include "mods/modmanager.h"
/*
definitions from hell
required to function
definitions from hell
required to function
*/
template <ScriptContext context, typename T> inline void SqRecurseArgs(FunctionVector& v, T& arg);
@ -16,7 +16,7 @@ template <ScriptContext context, typename T> inline void SqRecurseArgs(FunctionV
template <ScriptContext context, typename T, typename... Args> inline void SqRecurseArgs(FunctionVector& v, T& arg, Args... args);
/*
sanity below
sanity below
*/
// stolen from ttf2sdk: sqvm types
@ -354,7 +354,7 @@ template <ScriptContext context> class SquirrelManager : public virtual Squirrel
if (!m_pSQVM || !m_pSQVM->sqvm)
{
spdlog::error(
"{} was called on context {} while VM was not initialized. This will crash", __FUNCTION__, GetContextName(context));
"{} was called on context {} while VM was not initialized. This will crash", __FUNCTION__, GetContextName(context));
}
SQObject functionobj {};
@ -378,7 +378,7 @@ template <ScriptContext context> class SquirrelManager : public virtual Squirrel
if (!m_pSQVM || !m_pSQVM->sqvm)
{
spdlog::error(
"{} was called on context {} while VM was not initialized. This will crash", __FUNCTION__, GetContextName(context));
"{} was called on context {} while VM was not initialized. This will crash", __FUNCTION__, GetContextName(context));
}
SQObject functionobj {};
int result = sq_getfunction(m_pSQVM->sqvm, funcname, &functionobj, 0);
@ -425,9 +425,9 @@ template <ScriptContext context> SquirrelManager<context>* g_pSquirrel;
void InitialiseSquirrelManagers();
/*
Beware all ye who enter below.
This place is not a place of honor... no highly esteemed deed is commemorated here... nothing valued is here.
What is here was dangerous and repulsive to us. This message is a warning about danger.
Beware all ye who enter below.
This place is not a place of honor... no highly esteemed deed is commemorated here... nothing valued is here.
What is here was dangerous and repulsive to us. This message is a warning about danger.
*/
#pragma region MessageBuffer templates

View file

@ -19,21 +19,21 @@ class __squirrelautobind;
namespace \
{ \
__squirrelautobind CONCAT2(__squirrelautobind, __LINE__)( \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::UI) \
g_pSquirrel<ScriptContext::UI>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::UI >); \
if constexpr (runOnContext & ScriptContext::CLIENT) \
g_pSquirrel<ScriptContext::CLIENT>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::CLIENT >); \
}, \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::SERVER) \
g_pSquirrel<ScriptContext::SERVER>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::SERVER >); \
}); \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::UI) \
g_pSquirrel<ScriptContext::UI>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::UI >); \
if constexpr (runOnContext & ScriptContext::CLIENT) \
g_pSquirrel<ScriptContext::CLIENT>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::CLIENT >); \
}, \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::SERVER) \
g_pSquirrel<ScriptContext::SERVER>->AddFuncRegistration( \
returnType, __STR(funcName), argTypes, helpText, CONCAT2(Script_, funcName) < ScriptContext::SERVER >); \
}); \
} \
template <ScriptContext context> SQRESULT CONCAT2(Script_, funcName)(HSquirrelVM * sqvm)
@ -42,20 +42,20 @@ class __squirrelautobind;
namespace \
{ \
__squirrelautobind CONCAT2(__squirrelautobind, __LINE__)( \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::UI) \
g_pSquirrel<ScriptContext::UI>->AddFuncOverride(__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::UI >); \
if constexpr (runOnContext & ScriptContext::CLIENT) \
g_pSquirrel<ScriptContext::CLIENT>->AddFuncOverride( \
__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::CLIENT >); \
}, \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::SERVER) \
g_pSquirrel<ScriptContext::SERVER>->AddFuncOverride( \
__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::SERVER >); \
}); \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::UI) \
g_pSquirrel<ScriptContext::UI>->AddFuncOverride(__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::UI >); \
if constexpr (runOnContext & ScriptContext::CLIENT) \
g_pSquirrel<ScriptContext::CLIENT>->AddFuncOverride( \
__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::CLIENT >); \
}, \
[]() \
{ \
if constexpr (runOnContext & ScriptContext::SERVER) \
g_pSquirrel<ScriptContext::SERVER>->AddFuncOverride( \
__STR(funcName), CONCAT2(Script_, funcName) < ScriptContext::SERVER >); \
}); \
} \
template <ScriptContext context> SQRESULT CONCAT2(Script_, funcName)(HSquirrelVM * sqvm)

View file

@ -27,9 +27,9 @@ enum class eSQReturnType
};
const std::map<SQRESULT, const char*> PrintSQRESULT = {
{SQRESULT::SQRESULT_ERROR, "SQRESULT_ERROR"},
{SQRESULT::SQRESULT_NULL, "SQRESULT_NULL"},
{SQRESULT::SQRESULT_NOTNULL, "SQRESULT_NOTNULL"}};
{SQRESULT::SQRESULT_ERROR, "SQRESULT_ERROR"},
{SQRESULT::SQRESULT_NULL, "SQRESULT_NULL"},
{SQRESULT::SQRESULT_NOTNULL, "SQRESULT_NOTNULL"}};
struct CompileBufferState
{
@ -189,7 +189,7 @@ typedef int64_t (*RegisterSquirrelFuncType)(CSquirrelVM* sqvm, SQFuncRegistratio
typedef void (*sq_defconstType)(CSquirrelVM* sqvm, const SQChar* name, int value);
typedef SQRESULT (*sq_compilebufferType)(
HSquirrelVM* sqvm, CompileBufferState* compileBuffer, const char* file, int a1, SQBool bShouldThrowError);
HSquirrelVM* sqvm, CompileBufferState* compileBuffer, const char* file, int a1, SQBool bShouldThrowError);
typedef SQRESULT (*sq_callType)(HSquirrelVM* sqvm, SQInteger iArgs, SQBool bShouldReturn, SQBool bThrowError);
typedef SQInteger (*sq_raiseerrorType)(HSquirrelVM* sqvm, const SQChar* pError);
typedef bool (*sq_compilefileType)(CSquirrelVM* sqvm, const char* path, const char* name, int a4);

View file

@ -19,7 +19,7 @@ enum class MapSource_t
};
const std::unordered_map<MapSource_t, const char*> PrintMapSource = {
{MapSource_t::VPK, "VPK"}, {MapSource_t::MOD, "MOD"}, {MapSource_t::GAMEDIR, "R2"}};
{MapSource_t::VPK, "VPK"}, {MapSource_t::MOD, "MOD"}, {MapSource_t::GAMEDIR, "R2"}};
struct MapVPKInfo
{
@ -62,7 +62,7 @@ void RefreshMapList()
{
const int iNumRetailNonMapVpks = 1;
static const char* const ppRetailNonMapVpks[] = {
"englishclient_frontend.bsp.pak000_dir.vpk"}; // don't include mp_common here as it contains mp_lobby
"englishclient_frontend.bsp.pak000_dir.vpk"}; // don't include mp_common here as it contains mp_lobby
// matches directory vpks, and captures their map name in the first group
static const std::regex rVpkMapRegex("englishclient_([a-zA-Z0-9_]+)\\.bsp\\.pak000_dir\\.vpk", std::regex::icase);
@ -135,10 +135,10 @@ int, __fastcall, (const char *const cmdname, const char *const partial, char com
{
strcpy(commands[numMaps], cmdname);
strncpy_s(
commands[numMaps++] + cmdLength,
COMMAND_COMPLETION_ITEM_LENGTH,
&vMapList[i].name[0],
COMMAND_COMPLETION_ITEM_LENGTH - cmdLength);
commands[numMaps++] + cmdLength,
COMMAND_COMPLETION_ITEM_LENGTH,
&vMapList[i].name[0],
COMMAND_COMPLETION_ITEM_LENGTH - cmdLength);
}
}
@ -146,11 +146,11 @@ int, __fastcall, (const char *const cmdname, const char *const partial, char com
}
ADD_SQFUNC(
"array<string>",
NSGetLoadedMapNames,
"",
"Returns a string array of loaded map file names",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
"array<string>",
NSGetLoadedMapNames,
"",
"Returns a string array of loaded map file names",
ScriptContext::UI | ScriptContext::CLIENT | ScriptContext::SERVER)
{
// Maybe we should call this on mods reload instead
RefreshMapList();

View file

@ -17,23 +17,23 @@ void InitialiseVersion()
{
sprintf(version, "%d.%d.%d.%d+dev", northstar_version[0], northstar_version[1], northstar_version[2], northstar_version[3]);
ua_len += snprintf(
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
"R2Northstar/%d.%d.%d+dev",
northstar_version[0],
northstar_version[1],
northstar_version[2]);
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
"R2Northstar/%d.%d.%d+dev",
northstar_version[0],
northstar_version[1],
northstar_version[2]);
}
else
{
sprintf(version, "%d.%d.%d.%d", northstar_version[0], northstar_version[1], northstar_version[2], northstar_version[3]);
ua_len += snprintf(
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
"R2Northstar/%d.%d.%d",
northstar_version[0],
northstar_version[1],
northstar_version[2]);
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
"R2Northstar/%d.%d.%d",
northstar_version[0],
northstar_version[1],
northstar_version[2]);
}
if (IsDedicatedServer())
@ -75,12 +75,12 @@ void InitialiseVersion()
// windows version
if (osvi.dwMajorVersion)
ua_len += snprintf(
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
" Windows/%d.%d.%d",
osvi.dwMajorVersion,
osvi.dwMinorVersion,
osvi.dwBuildNumber);
NSUserAgent + ua_len,
sizeof(NSUserAgent) - ua_len,
" Windows/%d.%d.%d",
osvi.dwMajorVersion,
osvi.dwMinorVersion,
osvi.dwBuildNumber);
// wine version
if (wine_version && wine_build_id)

View file

@ -78,51 +78,51 @@ void LibraryLoadError(DWORD dwMessageId, const wchar_t* libName, const wchar_t*
std::string message = std::system_category().message(dwMessageId);
sprintf_s(
text,
"Failed to load the %ls at \"%ls\" (%lu):\n\n%hs\n\nMake sure you followed the Northstar installation instructions carefully "
"before reaching out for help.",
libName,
location,
dwMessageId,
message.c_str());
text,
"Failed to load the %ls at \"%ls\" (%lu):\n\n%hs\n\nMake sure you followed the Northstar installation instructions carefully "
"before reaching out for help.",
libName,
location,
dwMessageId,
message.c_str());
if (dwMessageId == 126 && std::filesystem::exists(location))
{
sprintf_s(
text,
"%s\n\nThe file at the specified location DOES exist, so this error indicates that one of its *dependencies* failed to be "
"found.\n\nTry the following steps:\n1. Install Visual C++ 2022 Redistributable: "
"https://aka.ms/vs/17/release/vc_redist.x64.exe\n2. Repair game files",
text);
text,
"%s\n\nThe file at the specified location DOES exist, so this error indicates that one of its *dependencies* failed to be "
"found.\n\nTry the following steps:\n1. Install Visual C++ 2022 Redistributable: "
"https://aka.ms/vs/17/release/vc_redist.x64.exe\n2. Repair game files",
text);
}
else if (!fs::exists("Titanfall2.exe") && (fs::exists("..\\Titanfall2.exe") || fs::exists("..\\..\\Titanfall2.exe")))
{
auto curDir = std::filesystem::current_path().filename().string();
auto aboveDir = std::filesystem::current_path().parent_path().filename().string();
sprintf_s(
text,
"%s\n\nWe detected that in your case you have extracted the files into a *subdirectory* of your Titanfall 2 "
"installation.\nPlease move all the files and folders from current folder (\"%s\") into the Titanfall 2 installation directory "
"just above (\"%s\").\n\nPlease try out the above steps by yourself before reaching out to the community for support.",
text,
curDir.c_str(),
aboveDir.c_str());
text,
"%s\n\nWe detected that in your case you have extracted the files into a *subdirectory* of your Titanfall 2 "
"installation.\nPlease move all the files and folders from current folder (\"%s\") into the Titanfall 2 installation directory "
"just above (\"%s\").\n\nPlease try out the above steps by yourself before reaching out to the community for support.",
text,
curDir.c_str(),
aboveDir.c_str());
}
else if (!fs::exists("Titanfall2.exe"))
{
sprintf_s(
text,
"%s\n\nRemember: you need to unpack the contents of this archive into your Titanfall 2 game installation directory, not just "
"to any random folder.",
text);
text,
"%s\n\nRemember: you need to unpack the contents of this archive into your Titanfall 2 game installation directory, not just "
"to any random folder.",
text);
}
else if (fs::exists("Titanfall2.exe"))
{
sprintf_s(
text,
"%s\n\nTitanfall2.exe has been found in the current directory: is the game installation corrupted or did you not unpack all "
"Northstar files here?",
text);
text,
"%s\n\nTitanfall2.exe has been found in the current directory: is the game installation corrupted or did you not unpack all "
"Northstar files here?",
text);
}
MessageBoxA(GetForegroundWindow(), text, "Northstar Launcher Error", 0);
@ -195,16 +195,16 @@ void EnsureOriginStarted()
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZE;
CreateProcessA(
originPath,
(char*)"",
NULL,
NULL,
false,
CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi);
originPath,
(char*)"",
NULL,
NULL,
false,
CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi);
std::cout << "[*] Waiting for Origin..." << std::endl;
@ -233,22 +233,22 @@ void PrependPath()
if (result == -1)
{
MessageBoxW(
GetForegroundWindow(),
L"Warning: could not prepend the current directory to app's PATH environment variable. Something may break because of "
L"that.",
L"Northstar Launcher Warning",
0);
GetForegroundWindow(),
L"Warning: could not prepend the current directory to app's PATH environment variable. Something may break because of "
L"that.",
L"Northstar Launcher Warning",
0);
}
free(pPath);
}
else
{
MessageBoxW(
GetForegroundWindow(),
L"Warning: could not get current PATH environment variable in order to prepend the current directory to it. Something may "
L"break because of that.",
L"Northstar Launcher Warning",
0);
GetForegroundWindow(),
L"Warning: could not get current PATH environment variable in order to prepend the current directory to it. Something may "
L"break because of that.",
L"Northstar Launcher Warning",
0);
}
}
@ -352,10 +352,10 @@ int main(int argc, char* argv[])
if (!GetExePathWide(exePath, sizeof(exePath)))
{
MessageBoxA(
GetForegroundWindow(),
"Failed getting game directory.\nThe game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
GetForegroundWindow(),
"Failed getting game directory.\nThe game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
return 1;
}
@ -383,26 +383,26 @@ int main(int argc, char* argv[])
std::cout << "[*] Loading stubs" << std::endl;
HMODULE gssao, gtxaa, d3d11;
if (!(gssao = GetModuleHandleA("GFSDK_SSAO.win64.dll")) && !(gtxaa = GetModuleHandleA("GFSDK_TXAA.win64.dll")) &&
!(d3d11 = GetModuleHandleA("d3d11.dll")))
!(d3d11 = GetModuleHandleA("d3d11.dll")))
{
if (!(gssao = LoadDediStub("GFSDK_SSAO.win64.dll")) || !(gtxaa = LoadDediStub("GFSDK_TXAA.win64.dll")) ||
!(d3d11 = LoadDediStub("d3d11.dll")))
!(d3d11 = LoadDediStub("d3d11.dll")))
{
if ((!gssao || FreeLibrary(gssao)) && (!gtxaa || FreeLibrary(gtxaa)) && (!d3d11 || FreeLibrary(d3d11)))
{
std::cout << "[*] WARNING: Failed to load d3d11/gfsdk stubs from bin/x64_dedi. "
"The stubs have been unloaded and the original libraries will be used instead"
<< std::endl;
"The stubs have been unloaded and the original libraries will be used instead"
<< std::endl;
}
else
{
// this is highly unlikely
MessageBoxA(
GetForegroundWindow(),
"Failed to load one or more stubs, but could not unload them either.\n"
"The game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
GetForegroundWindow(),
"Failed to load one or more stubs, but could not unload them either.\n"
"The game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
return 1;
}
}
@ -411,8 +411,8 @@ int main(int argc, char* argv[])
{
// this should never happen
std::cout << "[*] WARNING: Failed to load stubs because conflicting modules are already loaded, so those will be used instead "
"(did Northstar initialize too late?)."
<< std::endl;
"(did Northstar initialize too late?)."
<< std::endl;
}
}
@ -467,12 +467,12 @@ int main(int argc, char* argv[])
auto LauncherMain = GetLauncherMain();
if (!LauncherMain)
MessageBoxA(
GetForegroundWindow(),
"Failed loading launcher.dll.\nThe game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
GetForegroundWindow(),
"Failed loading launcher.dll.\nThe game cannot continue and has to exit.",
"Northstar Launcher Error",
0);
std::cout.flush();
return ((int(/*__fastcall*/*)(HINSTANCE, HINSTANCE, LPSTR, int))LauncherMain)(
NULL, NULL, NULL, 0); // the parameters aren't really used anyways
NULL, NULL, NULL, 0); // the parameters aren't really used anyways
}

View file

@ -31,10 +31,10 @@ BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
if (!GetExePathWide(exePath, 4096))
{
MessageBoxA(
GetForegroundWindow(),
"Failed getting game directory.\nThe game cannot continue and has to exit.",
"Northstar Wsock32 Proxy Error",
0);
GetForegroundWindow(),
"Failed getting game directory.\nThe game cannot continue and has to exit.",
"Northstar Wsock32 Proxy Error",
0);
return true;
}
@ -67,13 +67,13 @@ BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
if (!std::filesystem::exists(temp_dir))
{
swprintf_s(
buffer2,
L"Failed copying wsock32.dll from system32 to \"%s\"\n\n%S\n\nFurthermore, we failed copying wsock32.dll into "
L"temporary directory at \"%s\"\n\n%S",
buffer1,
e1.what(),
temp_dir.c_str(),
e2.what());
buffer2,
L"Failed copying wsock32.dll from system32 to \"%s\"\n\n%S\n\nFurthermore, we failed copying wsock32.dll into "
L"temporary directory at \"%s\"\n\n%S",
buffer1,
e1.what(),
temp_dir.c_str(),
e2.what());
MessageBoxW(GetForegroundWindow(), buffer2, L"Northstar Wsock32 Proxy Error", 0);
return false;
}

View file

@ -16,10 +16,10 @@ void LibraryLoadError(DWORD dwMessageId, const wchar_t* libName, const wchar_t*
if (dwMessageId == 126 && std::filesystem::exists(location))
{
sprintf_s(
text,
"%s\n\nThe file at the specified location DOES exist, so this error indicates that one of its *dependencies* failed to be "
"found.",
text);
text,
"%s\n\nThe file at the specified location DOES exist, so this error indicates that one of its *dependencies* failed to be "
"found.",
text);
}
MessageBoxA(GetForegroundWindow(), text, "Northstar Wsock32 Proxy Error", 0);
}
@ -117,7 +117,7 @@ bool ProvisionNorthstar()
if (MH_Initialize() != MH_OK)
{
MessageBoxA(
GetForegroundWindow(), "MH_Initialize failed\nThe game cannot continue and has to exit.", "Northstar Wsock32 Proxy Error", 0);
GetForegroundWindow(), "MH_Initialize failed\nThe game cannot continue and has to exit.", "Northstar Wsock32 Proxy Error", 0);
return false;
}
@ -125,16 +125,16 @@ bool ProvisionNorthstar()
if (!launcherHandle)
{
MessageBoxA(
GetForegroundWindow(),
"Launcher isn't loaded yet.\nThe game cannot continue and has to exit.",
"Northstar Wsock32 Proxy Error",
0);
GetForegroundWindow(),
"Launcher isn't loaded yet.\nThe game cannot continue and has to exit.",
"Northstar Wsock32 Proxy Error",
0);
return false;
}
LPVOID pTarget = (LPVOID)GetProcAddress(launcherHandle, "LauncherMain");
if (MH_CreateHook(pTarget, (LPVOID)&LauncherMainHook, reinterpret_cast<LPVOID*>(&LauncherMainOriginal)) != MH_OK ||
MH_EnableHook(pTarget) != MH_OK)
MH_EnableHook(pTarget) != MH_OK)
MessageBoxA(GetForegroundWindow(), "Hook creation failed for function LauncherMain.", "Northstar Wsock32 Proxy Error", 0);
return true;