mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-07 07:53:21 +00:00
Merge branch 'master' of github.com:Jackzmc/sourcemod-plugins
This commit is contained in:
commit
5b60b8a95f
34 changed files with 2116 additions and 236 deletions
84
scripting/disable_cameras.sp
Normal file
84
scripting/disable_cameras.sp
Normal file
|
@ -0,0 +1,84 @@
|
|||
#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"
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue