void Left4Downtown::SDK_OnAllLoaded() { SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools); SM_GET_LATE_IFACE(SDKTOOLS, g_pSDKTools); if (!g_pBinTools || !g_pSDKTools) { L4D_DEBUG_LOG("Failed to load bintools or failed to load sdktools"); return; } IServer *server = g_pSDKTools->GetIServer(); L4D_DEBUG_LOG("Address of IServer is %p", server); //reading out server->GetName() we consistently seem to get (the same?) //garbage characters. this is possibly causing a crash on windows servers //when a player connects. so lets not read the server name :( //L4D_DEBUG_LOG("Server name is %s", server->GetName()); g_pServer = server; InitializeValveGlobals(); g_AddonsEclipse.InstallChangeCallback(::OnAddonsEclipseChanged); AddonsDisabler::AddonsEclipse = g_AddonsEclipse.GetInt(); #ifdef USE_PLAYERSLOTS_PATCHES /* allow more than 8 players in l4d if l4d_maxplayers is not -1 also if +maxplayers or -maxplayers is not the default value (8) */ g_MaxPlayers.InstallChangeCallback(::OnMaxPlayersChanged); /* read the +-maxplayers from command line */ /*commenting out the code below seems to not make it crash during connection to my NFO START HERE */ ICommandLine *cmdLine = CommandLine_Tier0(); int maxplayers = -1; L4D_DEBUG_LOG("Command line is: %s", cmdLine->GetCmdLine()); maxplayers = cmdLine->ParmValue("+maxplayers", -1); L4D_DEBUG_LOG("Command line +maxplayers is: %d", maxplayers); if(maxplayers == -1) { maxplayers = cmdLine->ParmValue("-maxplayers", -1); } /* end here */ PlayerSlots::MaxPlayers = maxplayers; #endif /* detour the witch/spawn spawns */ //automatically will unregister/cleanup themselves when the ext is unloaded g_PatchManager.Register(new AutoPatch<Detours::SpawnSpecial>()); g_PatchManager.Register(new AutoPatch<Detours::SpawnTank>()); g_PatchManager.Register(new AutoPatch<Detours::SpawnWitch>()); g_PatchManager.Register(new AutoPatch<Detours::SpawnWitchBride>()); g_PatchManager.Register(new AutoPatch<Detours::ClearTeamScores>()); g_PatchManager.Register(new AutoPatch<Detours::SetCampaignScores>()); g_PatchManager.Register(new AutoPatch<Detours::FirstSurvivorLeftSafeArea>()); g_PatchManager.Register(new AutoPatch<Detours::GetScriptValueInt>()); g_PatchManager.Register(new AutoPatch<Detours::GetScriptValueFloat>()); g_PatchManager.Register(new AutoPatch<Detours::GetScriptValueString>()); g_PatchManager.Register(new AutoPatch<Detours::TryOfferingTankBot>()); g_PatchManager.Register(new AutoPatch<Detours::MobRushStart>()); g_PatchManager.Register(new AutoPatch<Detours::SpawnITMob>()); g_PatchManager.Register(new AutoPatch<Detours::SpawnMob>()); g_PatchManager.Register(new AutoPatch<Detours::ShovedBySurvivor>()); g_PatchManager.Register(new AutoPatch<Detours::GetCrouchTopSpeed>()); g_PatchManager.Register(new AutoPatch<Detours::GetRunTopSpeed>()); g_PatchManager.Register(new AutoPatch<Detours::GetWalkTopSpeed>()); g_PatchManager.Register(new AutoPatch<Detours::HasConfigurableDifficulty>()); g_PatchManager.Register(new AutoPatch<Detours::GetSurvivorSet>()); g_PatchManager.Register(new AutoPatch<Detours::FastGetSurvivorSet>()); g_PatchManager.Register(new AutoPatch<Detours::GetMissionVersusBossSpawning>()); g_PatchManager.Register(new AutoPatch<Detours::CThrowActivate>()); g_PatchManager.Register(new AutoPatch<Detours::StartMeleeSwing>()); g_PatchManager.Register(new AutoPatch<Detours::UseHealingItems>()); g_PatchManager.Register(new AutoPatch<Detours::FindScavengeItem>()); g_PatchManager.Register(new AutoPatch<Detours::SendInRescueVehicle>()); g_PatchManager.Register(new AutoPatch<Detours::ChangeFinaleStage>()); g_PatchManager.Register(new AutoPatch<Detours::EndVersusModeRound>()); g_PatchManager.Register(new AutoPatch<Detours::SelectWeightedSequence>());//for SelectTankAttack g_PatchManager.Register(new AutoPatch<Detours::Revived>()); g_PatchManager.Register(new AutoPatch<Detours::WaterMove>()); g_PatchManager.Register(new AutoPatch<Detours::PlayerStagger>()); g_PatchManager.Register(new AutoPatch<Detours::TerrorWeaponHit>()); g_PatchManager.Register(new AutoPatch<Detours::CTerrorGameRules>()); g_PatchManager.Register(new AutoPatch<Detours::CBaseServer>()); //new style detours that create/destroy the forwards themselves g_PatchManager.Register(new AutoPatch<Detours::IsFinale>()); g_PatchManager.Register(new AutoPatch<Detours::OnEnterGhostState>()); #ifdef USE_PLAYERSLOTS_PATCHES g_PatchManager.Register(new AutoPatch<Detours::ServerPlayerCounts>()); #endif }
bool StripperPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) { PLUGIN_SAVEVARS(); #if defined METAMOD_PLAPI_VERSION GET_V_IFACE_ANY(GetServerFactory, server, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); #if SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_SDK2013 // Shim to avoid hooking shims engine = (IVEngineServer *)ismm->GetEngineFactory()("VEngineServer023", nullptr); if (!engine) { engine = (IVEngineServer *)ismm->GetEngineFactory()("VEngineServer022", nullptr); if (!engine) { engine = (IVEngineServer *)ismm->GetEngineFactory()("VEngineServer021", nullptr); if (!engine) { if (error && maxlen) { ismm->Format(error, maxlen, "Could not find interface: VEngineServer023 or VEngineServer022 or VEngineServer021"); } return false; } } } #else GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); #endif GET_V_IFACE_ANY(GetServerFactory, clients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); #else GET_V_IFACE_ANY(serverFactory, server, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); GET_V_IFACE_ANY(serverFactory, clients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); #endif engine->GetGameDir(game_path, sizeof(game_path)); stripper_game.game_path = game_path; stripper_game.stripper_path = "addons/stripper"; stripper_game.stripper_cfg_path = stripper_cfg_path; strncpy(stripper_cfg_path, cvar_stripper_cfg_path.GetString(), sizeof(stripper_cfg_path)); cvar_stripper_cfg_path.InstallChangeCallback( stripper_cfg_path_changed ); #if SOURCE_ENGINE==SE_DARKMESSIAH ICvar* cvar = GetICVar(); const char* temp = (cvar == NULL) ? NULL : cvar->GetCommandLineValue("+stripper_path"); #else const char* temp = CommandLine()->ParmValue("+stripper_path"); #endif if (temp != NULL && temp[0] != '\0') { g_SMAPI->PathFormat(stripper_path, sizeof(stripper_path), "%s", temp); stripper_game.stripper_path = stripper_path; } #if defined __linux__ #define PLATFORM_EXT ".so" #elif defined __APPLE__ #define PLATFORM_EXT ".dylib" #else #define PLATFORM_EXT ".dll" #endif char path[256]; g_SMAPI->PathFormat(path, sizeof(path), "%s/%s/bin/stripper.core" PLATFORM_EXT, game_path, stripper_game.stripper_path); #undef PLATFORM_EXT stripper_lib = dlopen(path, RTLD_NOW); if (stripper_lib == NULL) { #if defined __linux__ || defined __APPLE__ snprintf(error, maxlen, "%s", dlerror()); #elif defined WIN32 DWORD dw = GetLastError(); if (FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), error, maxlen, NULL) == 0) { _snprintf(error, maxlen, "Unknown error: %d", dw); error[maxlen - 1] = '\0'; } #endif return false; } STRIPPER_LOAD stripper_load = (STRIPPER_LOAD)dlsym(stripper_lib, "LoadStripper"); if (stripper_load == NULL) { dlclose(stripper_lib); stripper_load = NULL; snprintf(error, maxlen, "Could not find LoadStripper function"); error[maxlen - 1] = '\0'; return false; } stripper_load(&stripper_game, &stripper_core); SH_ADD_HOOK_STATICFUNC(IVEngineServer, GetMapEntitiesString, engine, GetMapEntitiesString_handler, false); SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelInit, server, LevelInit_handler, false); SH_ADD_HOOK_STATICFUNC(IServerGameClients, SetCommandClient, clients, SetCommandClient, false); #if SOURCE_ENGINE==SE_ORANGEBOX || SOURCE_ENGINE==SE_LEFT4DEAD || SOURCE_ENGINE==SE_LEFT4DEAD2 || SOURCE_ENGINE==SE_TF2 || SOURCE_ENGINE==SE_DODS || SOURCE_ENGINE==SE_HL2DM || SOURCE_ENGINE==SE_NUCLEARDAWN || \ SOURCE_ENGINE==SE_ALIENSWARM || SOURCE_ENGINE==SE_BLOODYGOODTIME || SOURCE_ENGINE==SE_CSGO || SOURCE_ENGINE==SE_CSS || SOURCE_ENGINE==SE_INSURGENCY || SOURCE_ENGINE==SE_SDK2013 g_pCVar = GetICVar(); ConVar_Register(0, this); #else ConCommandBaseMgr::OneTimeInit(this); #endif return true; }