mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-05 15:33:21 +00:00
84 lines
2.5 KiB
SourcePawn
84 lines
2.5 KiB
SourcePawn
#include <sourcemod>
|
|
#include <sdktools_functions>
|
|
#include <sdktools_entinput>
|
|
|
|
// Fixed issues:
|
|
// - Server crash when kicking a bot who have been an active target of camera (point_viewcontrol_survivor)
|
|
// - Multiple visual spectator bugs after team swap in finale
|
|
|
|
public void Event_round_start_pre_entity(Event event, const char[] name, bool dontBroadcast)
|
|
{
|
|
static char classes[][] = {
|
|
"point_viewcontrol",
|
|
"point_viewcontrol_survivor",
|
|
"point_viewcontrol_multiplayer",
|
|
};
|
|
|
|
for (int i = 0; i < sizeof(classes); i++) {
|
|
int entity = INVALID_ENT_REFERENCE;
|
|
while ((entity = FindEntityByClassname(entity, classes[i])) != INVALID_ENT_REFERENCE) {
|
|
// Invoke a "Disable" input on camera entities to free all players
|
|
// Doing so on round_start_pre_entity should help to not let map logic kick in too early
|
|
AcceptEntityInput(entity, "Disable");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnClientDisconnect(int client)
|
|
{
|
|
if (!IsClientInGame(client)) {
|
|
return;
|
|
}
|
|
|
|
int viewEntity = GetEntPropEnt(client, Prop_Send, "m_hViewEntity");
|
|
if (!IsValidEdict(viewEntity)) {
|
|
return;
|
|
}
|
|
|
|
char cls[64];
|
|
GetEdictClassname(viewEntity, cls, sizeof(cls));
|
|
if (strncmp(cls, "point_viewcontrol", 17) != 0) {
|
|
return;
|
|
}
|
|
|
|
// Matches CSurvivorCamera, CTriggerCamera
|
|
if (strcmp(cls[17], "_survivor") == 0 || cls[17] == '\0') {
|
|
// Disable entity to prevent CMoveableCamera::FollowTarget to cause a crash
|
|
// m_hTargetEnt EHANDLE is not checked for existence and can be NULL
|
|
// CBaseEntity::GetAbsAngles being called on causing a crash
|
|
AcceptEntityInput(viewEntity, "Disable");
|
|
}
|
|
|
|
// Matches CTriggerCameraMultiplayer
|
|
if (strcmp(cls[17], "_multiplayer") == 0) {
|
|
AcceptEntityInput(viewEntity, "RemovePlayer", client);
|
|
}
|
|
}
|
|
|
|
public void OnPluginStart()
|
|
{
|
|
HookEvent("round_start_pre_entity", Event_round_start_pre_entity, EventHookMode_PostNoCopy);
|
|
}
|
|
|
|
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
|
|
{
|
|
switch (GetEngineVersion()) {
|
|
case Engine_Left4Dead2, Engine_Left4Dead:
|
|
{
|
|
return APLRes_Success;
|
|
}
|
|
}
|
|
|
|
strcopy(error, err_max, "Plugin only supports Left 4 Dead and Left 4 Dead 2.");
|
|
|
|
return APLRes_SilentFailure;
|
|
}
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "[L4D/2] Unlink Camera Entities",
|
|
author = "shqke",
|
|
description = "Frees cached players from camera entity",
|
|
version = "1.1",
|
|
url = "https://github.com/shqke/sp_public"
|
|
};
|