Raised This Month: $12 Target: $400
 3% 

[EXTENSION] Left 4 Downtown 2 (0.5.4.2) - L4D2 Only, Updated Left4Downtown


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
ProdigySim
SourceMod Plugin Approver
Join Date: Feb 2010
Old 07-31-2010 , 02:29   [EXTENSION] Left 4 Downtown 2 (0.5.4.2) - L4D2 Only, Updated Left4Downtown
Reply With Quote #1

Left 4 Downtown 2
v0.5.4.2

Latest Gamedata is always HERE.

IMPORTANT: As of 0.5.3, we're splitting left4downtown2 release into playerslots and no-playerslots builds.
This is in response to the numerous issues we see with users trying to run both l4dtoolz and left4downtown.

Description:
Left4Downtown2 is psychonic and ProdigySim's L4D2-only continuation of Downtown1's Left 4 Dead extension.
Unlock maximum players slots ( up to 18*) in Left 4 Dead 2. Only available on playerslots builds
Adds SM command targets @survivors and @infected.
Also provides a boat load of new L4D2-related natives and forwards for plugin developers.

Installation:
Download the left4downtown2-v0.5.4.2.zip located at the bottom of the post and extract it into /left4dead2/addons/sourcemod/

Usage:
Simply set the l4d_maxplayers CVAR to what you want in server.cfg (e.g. l4d_maxplayers 12), or -1 to disable override. You can also set -maxplayers or +maxplayers from command line instead of using the CVAR. (Playerslots builds only)
To use the special targets just use them in a command. e.g. sm_kick @infected or !slay @survivors

Plugins/Maxplayers - take advantage of those extra slots!
ConVars:
Code:
* l4d_maxplayers - valid value is x, such that -1 <= x <= +maxplayers <= maxclients 
  - using -1 will disable the slots patching (default behavior)
  - using any other value will patch L4D to allow more than the default slots
  - setting +maxplayers to anything other than 8 will change the default cvar value to that
* left4downtown_version - the current version of this extension
Plugins/Developers - plugins using Left4Downtown natives
Developer features:
Left4Downtown provides a large number of useful forwards and natives for Left4Dead2 plugin developers. To see a full listing of our scripting features, see Our includes directory. The following is a listing of some of our forwards/natives.

Forwards:
PHP Code:
/**
 * @brief Called whenever ZombieManager::SpawnTank(Vector&,QAngle&) is invoked
 * @remarks Not invoked if z_spawn tank is used and it gives a ghosted/dead player tank
 *
 * @param vector    Vector coordinate where tank is spawned
 * @param qangle    QAngle where tank will be facing
 * @return         Pl_Handled to block tank from spawning, Pl_Continue otherwise.
 */
forward Action:L4D_OnSpawnTank(const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Called whenever ZombieManager::SpawnWitch(Vector&,QAngle&) is invoked
 *
 * @param vector    Vector coordinate where witch is spawned
 * @param qangle    QAngle where witch will be facing
 * @return         Pl_Handled to block witch from spawning, Pl_Continue otherwise.
 */
forward Action:L4D_OnSpawnWitch(const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Called whenever ZombieManager::SpawnWitchBride(Vector&,QAngle&) is invoked
 *
 * @param vector    Vector coordinate where witch is spawned
 * @param qangle    QAngle where witch will be facing
 * @return         Pl_Handled to block witch from spawning, Pl_Continue otherwise.
 */
forward Action:L4D_OnSpawnWitchBride(const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Called whenever ZombieManager::SpawnSpecial(ZombieClassType,Vector&,QAngle&) is invoked
 * @remarks Only used for bot special spawns (not players)
 *
 * @param zombieClass    Zombie class that will be spawned.
 * @param vector        Vector coordinate where special will be spawned
 * @param qangle        QAngle where spcial will be facing
 * @return                 Pl_Handled to block special from spawning, 
 *                 Pl_Changed to change the zombie class type to spawn, Pl_Continue otherwise.
 */
forward Action:L4D_OnSpawnSpecial(&zombieClass, const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Called whenever CTerrorGameRules::ClearTeamScores(bool) is invoked
 * @remarks     This resets the map score at the beginning of a map, and by checking 
 *                the campaign scores on a small timer you can see if they were reset as well.
 * 
 * @param newCampaign  if true then this is a new campaign, if false a new chapter
 * @return         Pl_Handled to block scores from being cleared, Pl_Continue otherwise.
 */
forward Action:L4D_OnClearTeamScores(bool:newCampaign);

/**
 * @brief Called whenever CTerrorGameRules::SetCampaignScores(int,int) is invoked
 * @remarks The campaign scores are updated after the 2nd round is completed
 * 
 * @param scoreA  score of logical team A
 * @param scoreB  score of logical team B
 * @return         Pl_Handled to block campaign scores from being set, Pl_Continue otherwise.
 */
forward Action:L4D_OnSetCampaignScores(&scoreA, &scoreB);

/**
 * @brief Called whenever CDirector::OnFirstSurvivorLeftSafeArea is invoked
 * @remarks A versus round is started when survivors leave the safe room, or force started
 *           after 90 seconds regardless.
 * 
 * @param client  the survivor that left the safe area first
 * 
 * @return         Pl_Handled to block round from being started, Pl_Continue otherwise.
 */
forward Action:L4D_OnFirstSurvivorLeftSafeArea(client);

/**
 * @brief Called whenever CDirector::GetScriptValue(const char*, int) is invoked
 * @remarks A script value is map specific
 * 
 * @param key     the script's key name
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetScriptValueInt(const String:key[], &retVal);

/**
 * @brief Called whenever CDirector::GetScriptValue(const char*, float) is invoked
 * @remarks A script value is map specific
 * 
 * @param key     the script's key name
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetScriptValueFloat(const String:key[], &Float:retVal);

/**
 * @brief Called whenever CDirector::GetScriptValue(const char*, const char*, char*, int) is invoked
 * @remarks A script value is map specific
 * 
 * @param key           the script's key name
 * @param defaultVal  default key return, usually empty
 * @param retVal      returned String
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetScriptValueString(const String:key[], const String:defaultVal[], String:retVal[128]);

/**
 * @brief Called whenever CTerrorPlayer::OnEnterGhostState(CTerrorPlayer*) is invoked
 * @remarks This happens when a player enters ghost mode (or in finales auto-materialized)
 * 
 * @param client  the client that has entered ghost mode
 */
forward L4D_OnEnterGhostState(client);

/**
 * @brief Called whenever CDirector::TryOfferingTankBot is invoked
 * @remarks Is used for displaying the "X gets Tank" window and transferring Tank control
 * 
 * @return         Pl_Handled to block window from showing and to keep Tank Bot, Pl_Continue otherwise
 */
forward Action:L4D_OnTryOfferingTankBot(tank_index, &bool:enterStasis);

/**
 * @brief Called whenever CDirector::OnMobRushStart(void) is invoked
 * @remarks called on random hordes, mini- and finale hordes, and boomer hordes, causes Zombies to attack
 *           Not called on "z_spawn mob", hook the console command and check arguments to catch plugin mobs
 *           This function is used to reset the Director's natural horde timer
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnMobRushStart();

/**
 * @brief Called whenever ZombieManager::SpawnITMob(int) is invoked
 * @remarks called on boomer hordes, increases Zombie Spawn Queue
 * 
 * @param amount    Amount of Zombies to add to Queue
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnSpawnITMob(&amount);

/**
 * @brief Called whenever ZombieManager::SpawnMob(int) is invoked
 * @remarks called on natural hordes & z_spawn mob, increases Zombie Spawn 
 *           Queue, triggers player OnMobSpawned (vocalizations), sets horde
 *           direction, and plays horde music.
 * 
 * @param amount    Amount of Zombies to add to Queue
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnSpawnMob(&amount);

/**
 * @brief Called whenever CTerrorPlayer::OnShovedBySurvivor(CTerrorPlayer, Vector&) is invoked
 * @remarks L4D2 only uses this on Special Infected
 *
 * @param client    the client that did the shoving
 * @param victim    the client that was shoved (CAUTION: retrieved from function pointer, dont meddle with it)
 * @param vector    Vector Angle of Shoveforce
 *
 * @return         Pl_Handled to block melee effect (staggering), Pl_Continue otherwise.
 */
forward Action:L4D_OnShovedBySurvivor(clientvictim, const Float:vector[3]);

/**
 * @brief Called whenever CTerrorPlayer::GetCrouchTopSpeed() is invoked
 *
 * @param target    the client that its being called on (not changible)
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetCrouchTopSpeed(target, &Float:retVal);

/**
 * @brief Called whenever CTerrorPlayer::GetRunTopSpeed() is invoked
 *
 * @param target    the client that its being called on (not changible)
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetRunTopSpeed(target, &Float:retVal);

/**
 * @brief Called whenever CTerrorPlayer::GetWalkTopSpeed() is invoked
 *
 * @param target    the client that its being called on (not changible)
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetWalkTopSpeed(target, &Float:retVal);

/**
 * @brief Called whenever CTerrorGameRules::HasConfigurableDifficultySetting() is invoked
 * @remarks used to deny/allow difficulty changes in different game modes
 *
 * @param retVal  what to override the return value with. 1 to allow difficulty configuration, 0 to deny.
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnHasConfigurableDifficulty(&retVal);

/**
 * @brief Called whenever CTerrorGameRules::GetSurvivorSet(void) is invoked
 *
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnGetSurvivorSet(&retVal);

/**
 * @brief Called whenever CTerrorGameRules::FastGetSurvivorSet(void) is invoked
 *
 * @param retVal  what to override the return value with
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D_OnFastGetSurvivorSet(&retVal);

/**
 * @brief Called whenever CDirectorVersusMode::GetMissionVersusBossSpawning() is invoked
 * @remarks Passed values are from the map's Mission Keyvalues. If those keyvalues don't exist, they are from cvar and other globals
 *
 * @param spawn_pos_min        Minimum spawn position (percent of flow distance) for bosses
 * @param spawn_pos_max        Maximum spawn position (perfect of flow distance) for bosses
 * @param tank_chance        Chance for a tank to spawn on this map
 * @param witch_chance        Chance for a witch to spawn on this map
 * 
 * @return         Pl_Handled to block reading map data, Pl_Changed to use overwritten values from plugin, Pl_Continue to continue to read from mission data.
 */
forward Action:L4D_OnGetMissionVSBossSpawning(&Float:spawn_pos_min, &Float:spawn_pos_max, &Float:tank_chance, &Float:witch_chance);

/**
 * @brief Called whenever CThrow::ActivateAbility(void) is invoked
 * @remarks Called when a tank throws a rock. Blocking this call will
 *            keep the tank from throwing a rock.
 *
 * @param ability    ability_throw entity index
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnCThrowActivate(ability);

/**
 * @brief Called whenever InfectedShoved::OnShoved(Infected *, CBaseEntity *) is invoked
 * @remarks Called when common Infected are about to get shoved
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnInfectedShoved(infectedentity);

/**
 * @brief Called whenever CTerrorMeleeWeapon::StartMeleeSwing(CTerrorPlayer *, bool) is invoked
 * @remarks Called when a player uses his melee Weapons primary attack. This is before the game
 *            reads the melee weapon data (model etc) and decides if he CAN attack at all.
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D_OnStartMeleeSwing(clientbool:boolean);

/**
 * @brief Called whenever CDirectorScriptedEventManager::SendInRescueVehicle(void) is invoked
 * @remarks Called when the last Finale stage is reached and the Rescue Means becomes 'available'.
 *            Take note this forward WILL fire upon using the native of the same function.
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D2_OnSendInRescueVehicle();

/**
 * @brief Called whenever CDirectorScriptedEventManager::ChangeFinaleStage is invoked
 *
 * @param FinaleStageType    integer value
 * @remarks some values for FinaleStageType: 1 - Finale Started; 6 - Rescue Vehicle Ready; 7 - Zombie Hordes; 8 - Tank; 10 - Combat Respite (nothing spawns)
 * @remarks SendInRescueVehicle does not depend on Finale Stage being 6, that only signals endless Hordes/Tanks
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D2_OnChangeFinaleStage(&finaleType, const String:arg[]);

/**
 * @brief Called whenever CDirectorVersusMode::EndVersusModeRound(bool) is invoked
 *
 * @param countSurvivors    True if the survival multiplier count needs to be nonzero. I guess.
 * @remarks Not sure what bool does exactly yet. Just monitor it. If true, survivors will be counted for multiplier. If false, survival multiplier will be set to 0.
 * @remarks A lot of Score calculations happen on this function, and the round-end scoreboard comes up doing this. Don't block unless you're sure you can reproduce this logic.
 * 
 * @return         Pl_Handled to block, Pl_Continue otherwise
 */
forward Action:L4D2_OnEndVersusModeRound(bool:countSurvivors);

/**
 * @brief Called when CBaseAnimating::SelectWeightedSequence(int Activity) is invoked with tank attack activity
 * @remarks Called whenever a tank uses his primary (punch) or secondary (throw) attack
 *
 * @param client   the client that is playing as tank
 * @param sequence  current selected sequence for attack, option to override the return value with it
 * @remarks    sequences(punches): 40(uppercut), 43(right hook), 45(left hook), 46 and 47 (pounding the ground)
 * @remarks    sequences(throws): 48(undercut), 49(1handed overhand), 50(throw from the hip), 51(2handed overhand)
 * 
 * @return         Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D2_OnSelectTankAttack(client, &sequence);

/**
 * @brief Called when CTerrorPlayer::OnRevived(void) is invoked
 * @remarks Called post-revive so all data values are post-revive status.
 *
 * @param client   the client that has been revived
 *
 * @noreturn Pl_Handled to override return value, Pl_Continue otherwise.
 */
forward Action:L4D2_OnRevived(client); 
Natives:
PHP Code:
/**
 * @brief Get the current campaign scores stored in the Director
 * @remarks The campaign scores are updated after L4D_OnSetCampaignScores
 * 
 * @deprecated This will set the scores to -1 for both sides on L4D2,
 *               this function is no longer supported.
 * 
 * @param scoreA  score of logical team A
 * @param scoreB  score of logical team B
 * @return         1 always
 */
#pragma deprecated Use GetTeamScore and OnClearTeamScores instead
native L4D_GetCampaignScores(&scoreA, &scoreB);

/**
 * @brief Get the team scores for the current map
 * @remarks The campaign scores are not set until the end of round 2,
 *           use L4D_GetCampaignScores to get them earlier.
 *
 * @deprecated This function can be called through SDKTools using CTerrorGameRules,
 *          and so you should switch off to using SDKTools instead of this native.
 * 
 * @param logical_team  0 for A, 1 for B
 * @param campaign_score  true to get campaign score instead of map score
 * @return         the logical team's map score 
 *                      or -1 if the team hasn't played the round yet,
 *                or the team's campaign score if campaign_score = true
 */
native L4D_GetTeamScore(logical_teamcampaign_score=false);

/**
 * @brief Restarts the setup timer (when in scavenge mode)
 * @remarks If game has already started, the setup timer will show,
 *           but it still won't go back into setup.
 */
native L4D_ScavengeBeginRoundSetupTime();

/**
 * @brief Restarts the round, switching the map if necessary
 * @remarks Set the map to the current map to restart the round
 * 
 * @param map  the mapname it should go to after the round restarts
 * @return     1 always
 */
native L4D_RestartScenarioFromVote(const String:map[]);

/**
 * @brief Removes lobby reservation from a server
 * @remarks Sets the reservation cookie to 0,
 *           it is safe to call this even if it's unreserved.
 */
native L4D_LobbyUnreserve();

/**
 * @brief Checks if the server is currently reserved for a lobby
 * @remarks Server is automatically unreserved if it hibernates or
 *          if all players leave.
 *
 * @deprecated This will always return false on L4D2 or on Linux.
 *
 * @return     true if reserved, false if not reserved
 */
#pragma deprecated This will always return false on L4D2 or on Linux.
native bool:L4D_LobbyIsReserved();

/**
 * @brief Gets the max versus completion score for the map
 * @remarks Requires GameRules to be initialized--map must be loaded
 *           Seems to be updated before OnMapStart
 *
 *
 * @return     The map's max completion distance (map distance score)
 */
native L4D_GetVersusMaxCompletionScore();

/**
 * @brief Sets the max versus completion score for the map
 * @remarks Requires GameRules to be initialized--map must be loaded
 *           Seems to be updated before OnMapStart and checked on round_start
 *
 * @param    score    The versus max completion score to set for the round
 */
native L4D_SetVersusMaxCompletionScore(score);

/**
 * @brief Tells if the Mission (map) is the final map of the campaign
 *
 * @return        true if the map is the last map of the campaign (finale)
 */
native bool:L4D_IsMissionFinalMap();

/**
 * @brief Resets the natural mob (horde) timer
 * @remarks    Requires the Director to be available--map must be started
 *
 * @noreturn
 */
native L4D_ResetMobTimer();

/**
 * @brief Notifies the CGameRulesProxy that the game state has been changed
 * @remarks Use this function before changing networked members of GameRules,
 *           like with L4D_SetVersusMaxCompletionScore()
 *
 * @noreturn
 */
native L4D_NotifyNetworkStateChanged();

/**
 * @brief Trigger's a target player's stagger behavior 
 * @remarks Works on any CTerrorPlayer--survivor or infected.
 * 
 * @param target         Player to stagger
 * @param source_ent    Source of the stagger (another player, etc)
 * @param source_vector Source location of the stagger. If NULL_VECTOR, origins of source_ent is used.
 * @noreturn                 
 */
native L4D_StaggerPlayer(targetsource_entFloat:source_vector[3]);

/**
 * @brief Get the time remaining before the next director horde. 
 * @remarks This timer is used for scripted event hordes and natural timed hordes
 * 
 * @return     Time remaining before next director horde
 */
#pragma deprecated Use L4D2_CTimerGetRemainingTime(L4D2CT_MobSpawnTimer)
native Float:L4D_GetMobSpawnTimerRemaining();

/**
 * @brief Get the duration the horde timer was set to after the last horde
 * @remarks This timer is used for scripted event hordes and natural timed hordes
 * 
 * @return     Total time from last horde to next horde.
 */
#pragma deprecated Use L4D2_CTimerGetCountdownDuration(L4D2CT_MobSpawnTimer)
native Float:L4D_GetMobSpawnTimerDuration();

/**
 * @brief Get the remaining spawn time for an SI
 * @remarks This is meant for Special infected in ghost mode in versus.
 * 
 * @return     Time (seconds) until the SI will spawn.
 */
native Float:L4D_GetPlayerSpawnTime(player);

/**
 * @brief Calls CDirectorScriptedEventManager::SendInRescueVehicle(void)
 *
 * @remarks will fire the forward of the same function
 * 
 * @noreturn
 */
native L4D2_SendInRescueVehicle();

/**
 * @brief Calls CDirectorScriptedEventManager::ChangeFinaleStage(CDirectorScriptedEventManager::FinaleStageType,char  const*)
 *
 * @param FinaleStageType    integer value
 * @remarks some values for FinaleStageType: 1 - Finale Started; 6 - Rescue Vehicle Ready; 7 - Zombie Hordes; 8 - Tank; 10 - Combat Respite (nothing spawns)
 * @remarks
 * @remarks will fire the forward of the same function
 *
 * @noreturn
 */
native L4D2_ChangeFinaleStage(finaleType, const String:arg[]);

/**
 * @brief Calls ZombieManager::SpawnTank(Vector&,QAngle&)
 *
 * @param vector    Vector coordinate where the tank will be spawned
 * @param qangle    QAngle where the tank will be facing
 * @return             Entity index of the spawned tank
 */
native L4D_SpawnTank(const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Calls ZombieManager::SpawnSpecial(ZombieClassType,Vector&,QAngle&)
 * @remarks Only used for bot special spawns (not players)
 *
 * @param vector    Vector coordinate where the SI will be spawned
 * @param qangle    QAngle where the SI will be facing
 * @return             Entity index of the spawned SI
 */
native L4D_SpawnSpecial(zombieClass, const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Calls ZombieManager::SpawnWitch(Vector&,QAngle&)
 *
 * @param vector    Vector coordinate where the witch will be spawned
 * @param qangle    QAngle where the witch will be facing
 * @return             Entity index of the spawned witch
 */
native L4D_SpawnWitch(const Float:vector[3], const Float:qangle[3]);

/**
 * @brief Calls ZombieManager::SpawnWitchBride(Vector&,QAngle&)
 *
 * @param vector    Vector coordinate where the witch bride will be spawned
 * @param qangle    QAngle where the witch bride will be facing
 * @return             Entity index of the spawned witch bride
 */
native L4D_SpawnWitchBride(const Float:vector[3], const Float:qangle[3]); 
Notes:
  • The maximum players reported by HLSW/server browser will change automatically without using sv_visiblemaxplayers (you can still use sv_visiblemaxplayers like normal to override it for whatever reason).
  • By default teams are still locked to 4 infected, 4 survivors, so other plugins are necessary to use the extra slots for something other than show.
  • l4d_maxplayers is locked to be less than +maxplayers set from command line, so if you can't go above 8, buy more slots from your GSP.
  • With l4d_maxplayers -1 and +maxplayers 8, no code in memory is patched (default behaviour). With +maxplayers x (and x is not 8 ) the default value for l4d_maxplayers is x.
  • By connecting from lobby (or console with sv_allow_lobby_connect_only 1), no more than 4 on coop/survival or 8 on versus will be able to connect without unreserving the lobby. Use a plugin such as Remove Lobby Reservation or Super Versus to remove the reservation.

Current Developers:
  • ProdigySim - Confogl developer interested in expanding and updating left4downtown
  • AtomicStryker - Sourcemod plugin developer, and part of the original left4downtown team.
  • psychonic - Resident Sourcemod insider, started left4downtown2

Development sources:
Thanks to:
  • Downtown1 and XBetaAlpha--authors of the original Left4Downtown
  • Anyone who tests, runs, or develops plugins for this extension
  • asherkin for hosting the autobuild server
  • CanadaRox, vintik, rochellecrab, and anyone else who has submitted code in any way.

Changelog
  • 0.5.4.2 (Bugfix release)
    • Changed some GCC/MSVC settings to fix compatibility issues users were having.
    • Fix typo in include file for L4D2_SpawnTank()
  • 0.5.4.1 (Bugfix release)
    • Various bugfixes relating to SpawnX forwards/natives.
    • Added Pl_Changed return handling to SpawnSpecial, allowing the spawned special to be changed.
    • Added SpawnSpecial/SpawnWitchBride forwards and respective natives to include files
    • Updated test plugin for said natives/forwards.
  • 0.5.4
    • Added forward L4D2_OnEndVersusModeRound() to give a hook for messing with round-end scoring changes (ProdigySim)
    • Added forward L4D2_OnRevived to give a pre-revive hook for reading vars (CanadaRox)
    • Added forward L4D2_OnSelectTankAttack to allow modifying tank attack animations (vintik)
    • Added forwards L4D_OnSpawnSpecial and L4D_OnSpawnWitchBride (rochellecrab/ProdigySim)
    • Added natives L4D_SpawnTank, L4D_SpawnWitch, L4D_SpawnWitchBride, L4D_SpawnSpecial (rochellecrab/ProdigySim)
  • 0.5.3
    • Added a bunch of natives for editing weapon stats (l4d2weapons.inc)
    • Added some natives for reading/setting director data: L4D2_GetTankCount(), L4D2_Get/SetVersusCampaignScores(), L4D2_Get/SetVersusTankFlowPercent()
    • Left4downtown2 now registers the "left4downtown2" library.
    • Removed now-defunct finale-ghost-toggling code.
    • Added L4D2_(On)ChangeFinaleStage forward/natives
    • Added L4D2_(On)SendInRescueVehicle forward/natives
    • Added L4D2_OnGetScriptValueString/Float forwards
    • Made playerslots patching optional (two separate builds)
  • 0.5.2.3
    • Fixed players getting Valve_Reject_Server_Full on linux when connecting some times.
    • Added Forward L4D_OnCThrowActivate()
  • 0.5.2.2
    • Fixed L4D_OnHasConfigurableDifficulty() on linux
  • 0.5.2.1
    • Refactored some detouring code
    • Removed L4D_OnGetDifficulty() Forward
    • Added L4D_OnHasConfigurableDifficulty() Forward
    • Minor includes file changes
  • 0.5.2.0
    • New Forward: L4D_OnGetMissionVSBossSpawning()
    • New Natives for various Director Countdown/Interval Timers
      • Mob Spawn Timer
      • SI Spawn/Death Timers
      • Versus Auto-Start Timer
      • Versus Update Markers Timer
  • 0.5.1.0
    • Updated signatures and offsets for the Sacrifice DLC (2041)
    • Started some director reverse engineering--not much use yet
    • New Natives:
      • L4D_GetMobSpawnTimerRemaining()
      • L4D_GetMobSpawnTimerDuration()
      • L4D_GetPlayerSpawnTime()
    • New Forwards:
      • L4D_OnGetWalkTopSpeed()
      • L4D_OnGetCrouchTopSpeed()
      • L4D_OnGetRunTopSpeed()
      • L4D_OnGetDifficulty()
      • L4D_OnGetSurvivorSet()
      • L4D_OnFastGetSurvivorSet()
  • 0.5.0.2
    • Fixed Human player limit patching on windows
    • Minor code upkeep
  • 0.5.0.1
    • Fixed NotifyNetworkStateChange signature
  • 0.5.0.0
    • Fixed players being able to join the server past l4d_maxplayers when direct connecting from console
    • Added support for "@infected" and "@survivors" command targets
    • Updated L4D_OnTryOfferingTankBot for patchversion 2.0.3.0
    • New Natives:
      • L4D_GetVersusMaxCompletionScore()
      • L4D_SetVersusMaxCompletionScore()
      • L4D_IsMissionFinalMap()
      • L4D_ResetMobTimer()
      • L4D_NotifyNetworkStateChanged()
      • L4D_StaggerPlayer()
    • New Forwards:
      • L4D_OnShovedBySurvivor()
      • L4D_OnSpawnMob()
      • L4D_OnSpawnITMob()
    • Various code and build system updates

See Also: Original Left4Downtown thread

DOWNLOADS:
If you want playerslots patching, download the playerslots build. If you are going to use L4DToolz for playerslots, you should probably just use the default build. We recommend only using the playerslots build if you're absolutely sure you need it.
Attached Files
File Type: zip left4downtown2-v0.5.4.2.zip (181.3 KB, 33294 views)
File Type: zip left4downtown2-v0.5.4.2-playerslots.zip (182.8 KB, 21526 views)
File Type: zip left4downtown2-v0.5.4.2-src.zip (197.1 KB, 7860 views)

Last edited by ProdigySim; 10-22-2012 at 13:37. Reason: 0.5.4.2 update
ProdigySim is offline
realdreams
Senior Member
Join Date: Feb 2010
Old 07-31-2010 , 04:15   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #2

Thanks. I'll try it out. Do I need left4downtown.inc if I dont need to compile it?
BTW how can I remove lobby reservation without Remove Lobby Reservation or Super Versus? Those 2 plugins cause problems on the server.
realdreams is offline
ProdigySim
SourceMod Plugin Approver
Join Date: Feb 2010
Old 07-31-2010 , 04:22   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #3

Quote:
Originally Posted by realdreams View Post
Thanks. I'll try it out. Do I need left4downtown.inc if I dont need to compile it?
BTW how can I remove lobby reservation without Remove Lobby Reservation or Super Versus? Those 2 plugins cause problems on the server.
They'll work fine. I think you were using an old version of Remove Lobby Reservation though. Try to get an updated version.
ProdigySim is offline
realdreams
Senior Member
Join Date: Feb 2010
Old 07-31-2010 , 04:33   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #4

SuperVersus definitely has a few bugs and causes weird problems recently
I use it for a couple hours and get a lot of errors in log
L 07/30/2010 - 19:138: [SM] Displaying call stack trace for plugin "l4d_superversus.smx":
L 07/30/2010 - 19:138: [SM] [0] Line 174, /home/groups/alliedmodders/forums/files/9/7/0/1/54755.attach::l4dt()
L 07/30/2010 - 19:138: [SM] [1] Line 203, /home/groups/alliedmodders/forums/files/9/7/0/1/54755.attach::OnClientPutInServer()
L 07/30/2010 - 19:13:45: [SM] Native "GetConVarFloat" reported: Invalid convar handle 0 (error 4)

I think Remove Lobby Reservation can crash the server(crash on joining or map change, especially first map) after recent updates, I'll try again with l4dt2 0.5.1

I noticed a crash on first joining after installed Remove Lobby Reservation with l4dt2 0.5.1 and sometimes I need to unsecure lobby manually

Last edited by realdreams; 07-31-2010 at 05:10.
realdreams is offline
GanjaStar
Senior Member
Join Date: Jun 2009
Old 07-31-2010 , 05:49   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #5

thx for the updated version but something is still not right since the update. srs mod isnt working anymore.
GanjaStar is offline
Blakeocity
Senior Member
Join Date: Nov 2009
Old 07-31-2010 , 09:02   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #6

Clients connecting after 8 have joined get this error.

Human Limit Reached (8/8.)

I had to install L4DToolZ on top and set this to get past the message.
sv_removehumanlimit 1

Do I need this plugin to get past it without using L4DToolZ? I've been using Atomics version of Downtowns for a while and didnt have this issue.
Plugin I was referring too: http://forums.alliedmods.net/showthread.php?t=94415

Last edited by Blakeocity; 07-31-2010 at 09:05.
Blakeocity is offline
RasterMan
Senior Member
Join Date: Mar 2004
Location: Luton, UK
Old 08-01-2010 , 05:40   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #7

@ Ellis I 2nd that
__________________
RasterMan is offline
Send a message via MSN to RasterMan
AtomicStryker
Veteran Member
Join Date: Apr 2009
Location: Teutonia!!
Old 08-01-2010 , 09:04   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #8

No. L4D1 works entirely different in many ways, rendering most of this extension completely incompatible by now.
AtomicStryker is offline
ProdigySim
SourceMod Plugin Approver
Join Date: Feb 2010
Old 08-01-2010 , 12:20   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #9

I don't know exactly what you'd want. Most of the forwards/natives would be invalid. Isn't there a build of left4downtown for l4d1 that has player slots working?
ProdigySim is offline
realdreams
Senior Member
Join Date: Feb 2010
Old 08-02-2010 , 03:00   Re: [EXTENSION] Left 4 Downtown 2 (0.5.0.1) - L4D2 Only, Updated Left4Downtown
Reply With Quote #10

Is there a way to get rid of l4dunreservelobby.smx, that plugin crashes server.
realdreams is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 04:47.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode