aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDLL
diff options
context:
space:
mode:
authorBobTheBob9 <for.oliver.kirkham@gmail.com>2022-10-08 01:44:02 +0100
committerBobTheBob9 <for.oliver.kirkham@gmail.com>2022-10-08 01:44:02 +0100
commitd7d92226bc13710f2387492d893187faf8da738b (patch)
tree5e80c337bdfe9fdce6a46aac44f3a02f62c0e3e3 /NorthstarDLL
parentb03070d5b4575581ff6183cada8083446caa351e (diff)
downloadNorthstarLauncher-d7d92226bc13710f2387492d893187faf8da738b.tar.gz
NorthstarLauncher-d7d92226bc13710f2387492d893187faf8da738b.zip
fixup command flags better and reformat
Diffstat (limited to 'NorthstarDLL')
-rw-r--r--NorthstarDLL/exploitfixes.cpp2
-rw-r--r--NorthstarDLL/host.cpp46
-rw-r--r--NorthstarDLL/misccommands.cpp77
-rw-r--r--NorthstarDLL/misccommands.h1
-rw-r--r--NorthstarDLL/printcommands.cpp2
5 files changed, 83 insertions, 45 deletions
diff --git a/NorthstarDLL/exploitfixes.cpp b/NorthstarDLL/exploitfixes.cpp
index 2a5f02f3..240c352c 100644
--- a/NorthstarDLL/exploitfixes.cpp
+++ b/NorthstarDLL/exploitfixes.cpp
@@ -126,7 +126,7 @@ bool, __fastcall, (void* pMsg)) // 48 8B D1 48 8B 49 18 48 8B 01 48 FF 60 10
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
diff --git a/NorthstarDLL/host.cpp b/NorthstarDLL/host.cpp
index 0a44891c..87b1ce4e 100644
--- a/NorthstarDLL/host.cpp
+++ b/NorthstarDLL/host.cpp
@@ -3,6 +3,7 @@
#include "modmanager.h"
#include "printcommand.h"
#include "printmaps.h"
+#include "misccommands.h"
#include "r2engine.h"
#include "tier0.h"
@@ -16,50 +17,7 @@ void, __fastcall, (bool bDedicated))
spdlog::info("Host_Init()");
Host_Init(bDedicated);
- if (Tier0::CommandLine()->CheckParm("-allowdevcvars"))
- {
- // get all mod convars
- std::vector<std::string> vModConvarNames;
- for (auto& mod : g_pModManager->m_LoadedMods)
- for (auto& cvar : mod.ConVars)
- vModConvarNames.push_back(cvar->Name);
-
- // strip hidden and devonly cvar flags
- int iNumCvarsAltered = 0;
- for (auto& pair : R2::g_pCVar->DumpToMap())
- {
- // don't remove from mod cvars
- if (std::find(vModConvarNames.begin(), vModConvarNames.end(), pair.second->m_pszName) != vModConvarNames.end())
- continue;
-
- // strip flags
- int flags = pair.second->GetFlags();
- if (flags & FCVAR_DEVELOPMENTONLY)
- {
- flags &= ~FCVAR_DEVELOPMENTONLY;
- iNumCvarsAltered++;
- }
-
- if (flags & FCVAR_HIDDEN)
- {
- flags &= ~FCVAR_HIDDEN;
- iNumCvarsAltered++;
- }
-
- pair.second->m_nFlags = flags;
- }
-
- spdlog::info("Removed {} hidden/devonly cvar flags", iNumCvarsAltered);
- }
-
- // make servers able to run disconnect on clients
- R2::g_pCVar->FindCommand("disconnect")->m_nFlags |= FCVAR_SERVER_CAN_EXECUTE;
-
- R2::g_pCVar->FindCommand("migrateme")->m_nFlags &= ~FCVAR_SERVER_CAN_EXECUTE;
-
- // make clients able to run status and ping
- R2::g_pCVar->FindCommand("status")->m_nFlags |= FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS;
- R2::g_pCVar->FindCommand("ping")->m_nFlags |= FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS;
+ FixupCvarFlags();
// need to initialise these after host_init since they do stuff to preexisting concommands/convars without being client/server specific
InitialiseCommandPrint();
diff --git a/NorthstarDLL/misccommands.cpp b/NorthstarDLL/misccommands.cpp
index 572d5620..f5698448 100644
--- a/NorthstarDLL/misccommands.cpp
+++ b/NorthstarDLL/misccommands.cpp
@@ -4,8 +4,10 @@
#include "playlist.h"
#include "r2engine.h"
#include "r2client.h"
+#include "tier0.h"
#include "hoststate.h"
#include "masterserver.h"
+#include "modmanager.h"
#include "serverauthentication.h"
#include "squirrel.h"
@@ -63,3 +65,78 @@ void AddMiscConCommands()
// 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);
}
+
+// fixes up various cvar flags to have more sane values
+void FixupCvarFlags()
+{
+ if (Tier0::CommandLine()->CheckParm("-allowdevcvars"))
+ {
+ // strip hidden and devonly cvar flags
+ int iNumCvarsAltered = 0;
+ for (auto& pair : R2::g_pCVar->DumpToMap())
+ {
+ // strip flags
+ int flags = pair.second->GetFlags();
+ if (flags & FCVAR_DEVELOPMENTONLY)
+ {
+ flags &= ~FCVAR_DEVELOPMENTONLY;
+ iNumCvarsAltered++;
+ }
+
+ if (flags & FCVAR_HIDDEN)
+ {
+ flags &= ~FCVAR_HIDDEN;
+ iNumCvarsAltered++;
+ }
+
+ pair.second->m_nFlags = flags;
+ }
+
+ spdlog::info("Removed {} hidden/devonly cvar flags", iNumCvarsAltered);
+ }
+
+ 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},
+
+ // clients need to be able to run these on server, which will then print the results of them on client
+ {"status", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
+ {"ping", 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},
+
+ {"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},
+
+ {"test_setteam", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS},
+ {"melee_lunge_ent", FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS}};
+
+ 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},
+ };
+
+ for (auto& fixup : CVAR_FIXUP_ADD_FLAGS)
+ R2::g_pCVar->FindCommandBase(std::get<0>(fixup))->m_nFlags |= std::get<1>(fixup);
+
+ for (auto& fixup : CVAR_FIXUP_REMOVE_FLAGS)
+ R2::g_pCVar->FindCommandBase(std::get<0>(fixup))->m_nFlags &= ~std::get<1>(fixup);
+}
diff --git a/NorthstarDLL/misccommands.h b/NorthstarDLL/misccommands.h
index fbd41b32..07a07fb3 100644
--- a/NorthstarDLL/misccommands.h
+++ b/NorthstarDLL/misccommands.h
@@ -1,2 +1,3 @@
#pragma once
void AddMiscConCommands();
+void FixupCvarFlags();
diff --git a/NorthstarDLL/printcommands.cpp b/NorthstarDLL/printcommands.cpp
index 90af1575..d03d92c4 100644
--- a/NorthstarDLL/printcommands.cpp
+++ b/NorthstarDLL/printcommands.cpp
@@ -13,6 +13,8 @@ void PrintCommandHelpDialogue(const ConCommandBase* command, const char* name)
// temp because command->IsCommand does not currently work
ConVar* cvar = R2::g_pCVar->FindVar(command->m_pszName);
+ if (cvar)
+ return;
// build string for flags if not FCVAR_NONE
std::string flagString;