diff options
-rw-r--r-- | NorthstarDLL/exploitfixes.cpp | 2 | ||||
-rw-r--r-- | NorthstarDLL/host.cpp | 46 | ||||
-rw-r--r-- | NorthstarDLL/misccommands.cpp | 77 | ||||
-rw-r--r-- | NorthstarDLL/misccommands.h | 1 | ||||
-rw-r--r-- | NorthstarDLL/printcommands.cpp | 2 |
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; |