added SprayManager (made by Obus)
added PlayerVisibility StopSound: reload sounds are now muted and cleanup SelfMute: cleanup AdminCheats, WeaponCleaner: fixed error
This commit is contained in:
parent
11aefe731b
commit
a393310e29
@ -74,6 +74,9 @@ public void UpdateClients()
|
|||||||
|
|
||||||
public void OnClientPutInServer(int client)
|
public void OnClientPutInServer(int client)
|
||||||
{
|
{
|
||||||
|
if(IsFakeClient(client))
|
||||||
|
return;
|
||||||
|
|
||||||
SendConVarValue(client, g_CVar_sv_cheats, "0");
|
SendConVarValue(client, g_CVar_sv_cheats, "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
149
PlayerVisibility/scripting/PlayerVisibility.sp
Normal file
149
PlayerVisibility/scripting/PlayerVisibility.sp
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
#pragma semicolon 1
|
||||||
|
|
||||||
|
#include <sourcemod>
|
||||||
|
#include <sdkhooks>
|
||||||
|
#include <zombiereloaded>
|
||||||
|
|
||||||
|
public Plugin myinfo =
|
||||||
|
{
|
||||||
|
name = "PlayerVisibility",
|
||||||
|
author = "BotoX",
|
||||||
|
description = "Fades players away when you get close to them.",
|
||||||
|
version = "1.0",
|
||||||
|
url = ""
|
||||||
|
};
|
||||||
|
|
||||||
|
int g_Client_Alpha[MAXPLAYERS + 1] = {255, ...};
|
||||||
|
|
||||||
|
public void OnPluginStart()
|
||||||
|
{
|
||||||
|
for(int client = 1; client <= MaxClients; client++)
|
||||||
|
{
|
||||||
|
if(IsClientInGame(client))
|
||||||
|
OnClientPutInServer(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPluginEnd()
|
||||||
|
{
|
||||||
|
for(int client = 1; client <= MaxClients; client++)
|
||||||
|
{
|
||||||
|
if(IsClientInGame(client))
|
||||||
|
{
|
||||||
|
if(g_Client_Alpha[client] != 255.0)
|
||||||
|
SetEntityRenderMode(client, RENDER_NORMAL);
|
||||||
|
|
||||||
|
OnClientDisconnect(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientPutInServer(int client)
|
||||||
|
{
|
||||||
|
SDKHook(client, SDKHook_PostThink, OnPostThink);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnClientDisconnect(int client)
|
||||||
|
{
|
||||||
|
SDKUnhook(client, SDKHook_PostThink, OnPostThink);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPostThink(client)
|
||||||
|
{
|
||||||
|
if(!IsPlayerAlive(client))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!ZR_IsClientHuman(client))
|
||||||
|
{
|
||||||
|
if(g_Client_Alpha[client] != 255)
|
||||||
|
{
|
||||||
|
g_Client_Alpha[client] = 255;
|
||||||
|
if(GetEntityRenderMode(client) != RENDER_NONE)
|
||||||
|
ToolsSetEntityAlpha(client, 255);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GetEntityRenderMode(client) == RENDER_NONE)
|
||||||
|
{
|
||||||
|
g_Client_Alpha[client] = 255;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float fAlpha = 255.0;
|
||||||
|
for(int i = 1; i <= MaxClients; i++)
|
||||||
|
{
|
||||||
|
if(i == client || !IsClientInGame(i) || !IsPlayerAlive(i))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!ZR_IsClientHuman(i))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
static float fVec1[3];
|
||||||
|
static float fVec2[3];
|
||||||
|
GetClientAbsOrigin(client, fVec1);
|
||||||
|
GetClientAbsOrigin(i, fVec2);
|
||||||
|
|
||||||
|
float fMaxDistance = 150.0;
|
||||||
|
float fDistance = GetVectorDistance(fVec1, fVec2, false);
|
||||||
|
|
||||||
|
if(fDistance <= fMaxDistance)
|
||||||
|
{
|
||||||
|
float fFactor = fDistance / fMaxDistance;
|
||||||
|
if(fFactor < 0.75)
|
||||||
|
fFactor = 0.75;
|
||||||
|
|
||||||
|
fAlpha *= fFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fAlpha < 100.0)
|
||||||
|
fAlpha = 100.0;
|
||||||
|
|
||||||
|
int Alpha = RoundToNearest(fAlpha);
|
||||||
|
int LastAlpha = g_Client_Alpha[client];
|
||||||
|
g_Client_Alpha[client] = Alpha;
|
||||||
|
|
||||||
|
if(Alpha == LastAlpha)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ToolsSetEntityAlpha(client, Alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolsSetEntityAlpha(int client, int Alpha)
|
||||||
|
{
|
||||||
|
if(Alpha == 255)
|
||||||
|
{
|
||||||
|
SetEntityRenderMode(client, RENDER_NORMAL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int aColor[4];
|
||||||
|
ToolsGetEntityColor(client, aColor);
|
||||||
|
|
||||||
|
SetEntityRenderMode(client, RENDER_TRANSCOLOR);
|
||||||
|
SetEntityRenderColor(client, aColor[0], aColor[1], aColor[2], g_Client_Alpha[client]);
|
||||||
|
}
|
||||||
|
|
||||||
|
stock ToolsGetEntityColor(int entity, int aColor[4])
|
||||||
|
{
|
||||||
|
static bool s_GotConfig = false;
|
||||||
|
static char s_sProp[32];
|
||||||
|
|
||||||
|
if(!s_GotConfig)
|
||||||
|
{
|
||||||
|
Handle GameConf = LoadGameConfigFile("core.games");
|
||||||
|
bool Exists = GameConfGetKeyValue(GameConf, "m_clrRender", s_sProp, sizeof(s_sProp));
|
||||||
|
CloseHandle(GameConf);
|
||||||
|
|
||||||
|
if(!Exists)
|
||||||
|
strcopy(s_sProp, sizeof(s_sProp), "m_clrRender");
|
||||||
|
|
||||||
|
s_GotConfig = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Offset = GetEntSendPropOffs(entity, s_sProp);
|
||||||
|
|
||||||
|
for(int i = 0; i < 4; i++)
|
||||||
|
aColor[i] = GetEntData(entity, Offset + i, 1);
|
||||||
|
}
|
@ -19,7 +19,7 @@ bool g_Plugin_zombiereloaded = false;
|
|||||||
bool g_Plugin_voiceannounce_ex = false;
|
bool g_Plugin_voiceannounce_ex = false;
|
||||||
bool g_Plugin_AdvancedTargeting = false;
|
bool g_Plugin_AdvancedTargeting = false;
|
||||||
|
|
||||||
#define PLUGIN_VERSION "2.0.1"
|
#define PLUGIN_VERSION "2.1"
|
||||||
|
|
||||||
public Plugin myinfo =
|
public Plugin myinfo =
|
||||||
{
|
{
|
||||||
@ -78,10 +78,10 @@ public void OnPluginStart()
|
|||||||
public void OnAllPluginsLoaded()
|
public void OnAllPluginsLoaded()
|
||||||
{
|
{
|
||||||
g_Plugin_ccc = LibraryExists("ccc");
|
g_Plugin_ccc = LibraryExists("ccc");
|
||||||
g_Plugin_zombiereloaded = true;//LibraryExists("zombiereloaded");
|
g_Plugin_zombiereloaded = LibraryExists("zombiereloaded");
|
||||||
g_Plugin_voiceannounce_ex = LibraryExists("voiceannounce_ex");
|
g_Plugin_voiceannounce_ex = LibraryExists("voiceannounce_ex");
|
||||||
g_Plugin_AdvancedTargeting = LibraryExists("AdvancedTargeting");
|
g_Plugin_AdvancedTargeting = LibraryExists("AdvancedTargeting");
|
||||||
PrintToServer("CCC: %s\nZombieReloaded: %s\nVoiceAnnounce: %s\nAdvancedTargeting: %s",
|
LogMessage("CCC: %s\nZombieReloaded: %s\nVoiceAnnounce: %s\nAdvancedTargeting: %s",
|
||||||
(g_Plugin_ccc ? "loaded" : "not loaded"),
|
(g_Plugin_ccc ? "loaded" : "not loaded"),
|
||||||
(g_Plugin_zombiereloaded ? "loaded" : "not loaded"),
|
(g_Plugin_zombiereloaded ? "loaded" : "not loaded"),
|
||||||
(g_Plugin_voiceannounce_ex ? "loaded" : "not loaded"),
|
(g_Plugin_voiceannounce_ex ? "loaded" : "not loaded"),
|
||||||
@ -805,94 +805,111 @@ void DisplayUnMuteMenu(int client)
|
|||||||
/*
|
/*
|
||||||
* HOOKS
|
* HOOKS
|
||||||
*/
|
*/
|
||||||
#define MAX_MESSAGES 8
|
int g_MsgDest;
|
||||||
|
int g_MsgClient;
|
||||||
int g_MsgDest[MAX_MESSAGES];
|
char g_MsgName[256];
|
||||||
int g_MsgClient[MAX_MESSAGES] = {-1, ...};
|
char g_MsgParam1[256];
|
||||||
char g_MsgName[MAX_MESSAGES][256];
|
char g_MsgParam2[256];
|
||||||
char g_MsgParam1[MAX_MESSAGES][256];
|
char g_MsgParam3[256];
|
||||||
char g_MsgParam2[MAX_MESSAGES][256];
|
char g_MsgParam4[256];
|
||||||
char g_MsgParam3[MAX_MESSAGES][256];
|
char g_MsgRadioSound[256];
|
||||||
char g_MsgParam4[MAX_MESSAGES][256];
|
int g_MsgPlayersNum;
|
||||||
int g_MsgPlayersNum[MAX_MESSAGES];
|
int g_MsgPlayers[MAXPLAYERS + 1];
|
||||||
int g_MsgPlayers[MAX_MESSAGES][MAXPLAYERS + 1];
|
|
||||||
|
|
||||||
int g_NumMessages = 0;
|
|
||||||
|
|
||||||
public Action Hook_UserMessageRadioText(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
public Action Hook_UserMessageRadioText(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
||||||
{
|
{
|
||||||
if(g_NumMessages >= MAX_MESSAGES)
|
g_MsgDest = BfReadByte(bf);
|
||||||
return Plugin_Handled; // Silently drop
|
g_MsgClient = BfReadByte(bf);
|
||||||
|
BfReadString(bf, g_MsgName, sizeof(g_MsgName), false);
|
||||||
|
BfReadString(bf, g_MsgParam1, sizeof(g_MsgParam1), false);
|
||||||
|
BfReadString(bf, g_MsgParam2, sizeof(g_MsgParam2), false);
|
||||||
|
BfReadString(bf, g_MsgParam3, sizeof(g_MsgParam3), false);
|
||||||
|
BfReadString(bf, g_MsgParam4, sizeof(g_MsgParam4), false);
|
||||||
|
|
||||||
g_MsgDest[g_NumMessages] = BfReadByte(bf);
|
// Check which clients need to be excluded.
|
||||||
g_MsgClient[g_NumMessages] = BfReadByte(bf);
|
g_MsgPlayersNum = 0;
|
||||||
BfReadString(bf, g_MsgName[g_NumMessages], sizeof(g_MsgName[]), false);
|
|
||||||
BfReadString(bf, g_MsgParam1[g_NumMessages], sizeof(g_MsgParam1[]), false);
|
|
||||||
BfReadString(bf, g_MsgParam2[g_NumMessages], sizeof(g_MsgParam2[]), false);
|
|
||||||
BfReadString(bf, g_MsgParam3[g_NumMessages], sizeof(g_MsgParam3[]), false);
|
|
||||||
BfReadString(bf, g_MsgParam4[g_NumMessages], sizeof(g_MsgParam4[]), false);
|
|
||||||
|
|
||||||
g_MsgPlayersNum[g_NumMessages] = playersNum;
|
|
||||||
for(int i = 0; i < playersNum; i++)
|
for(int i = 0; i < playersNum; i++)
|
||||||
g_MsgPlayers[g_NumMessages][i] = players[i];
|
{
|
||||||
|
int client = players[i];
|
||||||
|
if(!GetIgnored(client, g_MsgClient))
|
||||||
|
g_MsgPlayers[g_MsgPlayersNum++] = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No clients were excluded.
|
||||||
|
if(g_MsgPlayersNum == playersNum)
|
||||||
|
{
|
||||||
|
g_MsgClient = -1;
|
||||||
|
return Plugin_Continue;
|
||||||
|
}
|
||||||
|
else if(g_MsgPlayersNum == 0) // All clients were excluded and there is no need to broadcast.
|
||||||
|
{
|
||||||
|
g_MsgClient = -2;
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
char g_MsgRadioSound[MAX_MESSAGES][256];
|
|
||||||
|
|
||||||
public Action Hook_UserMessageSendAudio(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
public Action Hook_UserMessageSendAudio(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
||||||
{
|
{
|
||||||
if(g_NumMessages >= MAX_MESSAGES)
|
if(g_MsgClient == -1)
|
||||||
return Plugin_Handled; // Silently drop
|
return Plugin_Continue;
|
||||||
|
else if(g_MsgClient == -2)
|
||||||
|
return Plugin_Handled;
|
||||||
|
|
||||||
BfReadString(bf, g_MsgRadioSound[g_NumMessages], sizeof(g_MsgRadioSound[]), false);
|
BfReadString(bf, g_MsgRadioSound, sizeof(g_MsgRadioSound), false);
|
||||||
|
|
||||||
if(!g_NumMessages)
|
DataPack pack = new DataPack();
|
||||||
CreateTimer(0.1, Timer_PlayerRadio);
|
pack.WriteCell(g_MsgDest);
|
||||||
|
pack.WriteCell(g_MsgClient);
|
||||||
|
pack.WriteString(g_MsgName);
|
||||||
|
pack.WriteString(g_MsgParam1);
|
||||||
|
pack.WriteString(g_MsgParam2);
|
||||||
|
pack.WriteString(g_MsgParam3);
|
||||||
|
pack.WriteString(g_MsgParam4);
|
||||||
|
pack.WriteString(g_MsgRadioSound);
|
||||||
|
pack.WriteCell(g_MsgPlayersNum);
|
||||||
|
|
||||||
g_NumMessages++;
|
ArrayList aPlayers = new ArrayList(g_MsgPlayersNum, 1);
|
||||||
|
aPlayers.SetArray(0, g_MsgPlayers, g_MsgPlayersNum);
|
||||||
|
pack.WriteCell(aPlayers);
|
||||||
|
|
||||||
|
RequestFrame(OnPlayerRadio, pack);
|
||||||
|
|
||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action Timer_PlayerRadio(Handle timer)
|
public void OnPlayerRadio(DataPack pack)
|
||||||
{
|
{
|
||||||
for(int NumMsg = 0; NumMsg < g_NumMessages; NumMsg++)
|
pack.Reset();
|
||||||
{
|
g_MsgDest = pack.ReadCell();
|
||||||
if(g_MsgClient[NumMsg] == -1)
|
g_MsgClient = pack.ReadCell();
|
||||||
continue;
|
pack.ReadString(g_MsgName, sizeof(g_MsgName));
|
||||||
|
pack.ReadString(g_MsgParam1, sizeof(g_MsgParam1));
|
||||||
|
pack.ReadString(g_MsgParam2, sizeof(g_MsgParam2));
|
||||||
|
pack.ReadString(g_MsgParam3, sizeof(g_MsgParam3));
|
||||||
|
pack.ReadString(g_MsgParam4, sizeof(g_MsgParam4));
|
||||||
|
pack.ReadString(g_MsgRadioSound, sizeof(g_MsgRadioSound));
|
||||||
|
g_MsgPlayersNum = pack.ReadCell();
|
||||||
|
ArrayList aPlayers = pack.ReadCell();
|
||||||
|
CloseHandle(pack);
|
||||||
|
|
||||||
int[] players = new int[g_MsgPlayersNum[NumMsg] + 1];
|
aPlayers.GetArray(0, g_MsgPlayers, g_MsgPlayersNum);
|
||||||
int playersNum = 0;
|
delete aPlayers;
|
||||||
|
|
||||||
for(int i = 0; i < g_MsgPlayersNum[NumMsg]; i++)
|
Handle RadioText = StartMessage("RadioText", g_MsgPlayers, g_MsgPlayersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||||
{
|
BfWriteByte(RadioText, g_MsgDest);
|
||||||
int client = g_MsgPlayers[NumMsg][i];
|
BfWriteByte(RadioText, g_MsgClient);
|
||||||
if(IsClientInGame(client) && !GetIgnored(client, g_MsgClient[NumMsg]))
|
BfWriteString(RadioText, g_MsgName);
|
||||||
players[playersNum++] = client;
|
BfWriteString(RadioText, g_MsgParam1);
|
||||||
}
|
BfWriteString(RadioText, g_MsgParam2);
|
||||||
|
BfWriteString(RadioText, g_MsgParam3);
|
||||||
|
BfWriteString(RadioText, g_MsgParam4);
|
||||||
|
EndMessage();
|
||||||
|
|
||||||
Handle RadioText = StartMessage("RadioText", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
Handle SendAudio = StartMessage("SendAudio", g_MsgPlayers, g_MsgPlayersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||||
BfWriteByte(RadioText, g_MsgDest[NumMsg]);
|
BfWriteString(SendAudio, g_MsgRadioSound);
|
||||||
BfWriteByte(RadioText, g_MsgClient[NumMsg]);
|
EndMessage();
|
||||||
BfWriteString(RadioText, g_MsgName[NumMsg]);
|
|
||||||
BfWriteString(RadioText, g_MsgParam1[NumMsg]);
|
|
||||||
BfWriteString(RadioText, g_MsgParam2[NumMsg]);
|
|
||||||
BfWriteString(RadioText, g_MsgParam3[NumMsg]);
|
|
||||||
BfWriteString(RadioText, g_MsgParam4[NumMsg]);
|
|
||||||
EndMessage();
|
|
||||||
|
|
||||||
Handle SendAudio = StartMessage("SendAudio", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
|
||||||
BfWriteString(SendAudio, g_MsgRadioSound[NumMsg]);
|
|
||||||
EndMessage();
|
|
||||||
|
|
||||||
g_MsgClient[NumMsg] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_NumMessages = 0;
|
|
||||||
|
|
||||||
return Plugin_Stop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
2144
SprayManager/scripting/SprayManager.sp
Normal file
2144
SprayManager/scripting/SprayManager.sp
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,40 +2,36 @@
|
|||||||
|
|
||||||
#include <sourcemod>
|
#include <sourcemod>
|
||||||
#include <sdktools>
|
#include <sdktools>
|
||||||
#include <morecolors>
|
#include "morecolors.inc"
|
||||||
|
#undef REQUIRE_PLUGIN
|
||||||
|
|
||||||
#define PLUGIN_NAME "Toggle Weapon Sounds"
|
#pragma newdecls required
|
||||||
#define PLUGIN_VERSION "1.2.0"
|
#define PLUGIN_VERSION "1.3.0"
|
||||||
|
|
||||||
#define UPDATE_URL "http://godtony.mooo.com/stopsound/stopsound.txt"
|
bool g_bStopSound[MAXPLAYERS+1];
|
||||||
|
bool g_bHooked;
|
||||||
|
static char g_sKVPATH[PLATFORM_MAX_PATH];
|
||||||
|
KeyValues g_hWepSounds;
|
||||||
|
|
||||||
new bool:g_bStopSound[MAXPLAYERS+1], bool:g_bHooked;
|
public Plugin myinfo =
|
||||||
static String:g_sKVPATH[PLATFORM_MAX_PATH];
|
|
||||||
new Handle:g_hWepSounds;
|
|
||||||
|
|
||||||
public Plugin:myinfo =
|
|
||||||
{
|
{
|
||||||
name = PLUGIN_NAME,
|
name = "Toggle Weapon Sounds",
|
||||||
author = "GoD-Tony, edit by id/Obus",
|
author = "GoD-Tony, edit by Obus + BotoX",
|
||||||
description = "Allows clients to stop hearing weapon sounds",
|
description = "Allows clients to stop hearing weapon sounds",
|
||||||
version = PLUGIN_VERSION,
|
version = PLUGIN_VERSION,
|
||||||
url = "http://www.sourcemod.net/"
|
url = "http://www.sourcemod.net/"
|
||||||
};
|
};
|
||||||
|
|
||||||
public OnPluginStart()
|
public void OnPluginStart()
|
||||||
{
|
{
|
||||||
// Detect game and hook appropriate tempent.
|
// Detect game and hook appropriate tempent.
|
||||||
decl String:sGame[32];
|
static char sGame[32];
|
||||||
GetGameFolderName(sGame, sizeof(sGame));
|
GetGameFolderName(sGame, sizeof(sGame));
|
||||||
|
|
||||||
if (StrEqual(sGame, "cstrike"))
|
if(StrEqual(sGame, "cstrike"))
|
||||||
{
|
|
||||||
AddTempEntHook("Shotgun Shot", CSS_Hook_ShotgunShot);
|
AddTempEntHook("Shotgun Shot", CSS_Hook_ShotgunShot);
|
||||||
}
|
else if(StrEqual(sGame, "dod"))
|
||||||
else if (StrEqual(sGame, "dod"))
|
|
||||||
{
|
|
||||||
AddTempEntHook("FireBullets", DODS_Hook_FireBullets);
|
AddTempEntHook("FireBullets", DODS_Hook_FireBullets);
|
||||||
}
|
|
||||||
|
|
||||||
// TF2/HL2:DM and misc weapon sounds will be caught here.
|
// TF2/HL2:DM and misc weapon sounds will be caught here.
|
||||||
AddNormalSoundHook(Hook_NormalSound);
|
AddNormalSoundHook(Hook_NormalSound);
|
||||||
@ -43,62 +39,81 @@ public OnPluginStart()
|
|||||||
CreateConVar("sm_stopsound_version", PLUGIN_VERSION, "Toggle Weapon Sounds", FCVAR_NOTIFY|FCVAR_DONTRECORD|FCVAR_REPLICATED);
|
CreateConVar("sm_stopsound_version", PLUGIN_VERSION, "Toggle Weapon Sounds", FCVAR_NOTIFY|FCVAR_DONTRECORD|FCVAR_REPLICATED);
|
||||||
RegConsoleCmd("sm_stopsound", Command_StopSound, "Toggle hearing weapon sounds");
|
RegConsoleCmd("sm_stopsound", Command_StopSound, "Toggle hearing weapon sounds");
|
||||||
|
|
||||||
if (g_hWepSounds != INVALID_HANDLE)
|
g_hWepSounds = new KeyValues("WeaponSounds");
|
||||||
{
|
|
||||||
CloseHandle(g_hWepSounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hWepSounds = CreateKeyValues("WeaponSounds");
|
|
||||||
BuildPath(Path_SM, g_sKVPATH, sizeof(g_sKVPATH), "data/playerprefs.WepSounds.txt");
|
BuildPath(Path_SM, g_sKVPATH, sizeof(g_sKVPATH), "data/playerprefs.WepSounds.txt");
|
||||||
|
g_hWepSounds.ImportFromFile(g_sKVPATH);
|
||||||
|
|
||||||
FileToKeyValues(g_hWepSounds, g_sKVPATH);
|
// Suppress reload sound effects
|
||||||
|
UserMsg ReloadEffect = GetUserMessageId("ReloadEffect");
|
||||||
|
if(ReloadEffect != INVALID_MESSAGE_ID)
|
||||||
|
HookUserMessage(ReloadEffect, Hook_ReloadEffect, true);
|
||||||
|
|
||||||
// Updater.
|
// Late load
|
||||||
//if (LibraryExists("updater"))
|
for(int client = 1; client <= MaxClients; client++)
|
||||||
//{
|
{
|
||||||
// Updater_AddPlugin(UPDATE_URL);
|
if(IsClientInGame(client) && IsClientAuthorized(client))
|
||||||
//}
|
{
|
||||||
|
static char sAuth[32];
|
||||||
|
GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
|
||||||
|
OnClientAuthorized(client, sAuth);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public OnLibraryAdded(const String:name[])
|
public void OnPluginEnd()
|
||||||
{
|
{
|
||||||
if (StrEqual(name, "updater"))
|
for(int client = 1; client <= MaxClients; client++)
|
||||||
{
|
{
|
||||||
Updater_AddPlugin(UPDATE_URL);
|
if(IsClientInGame(client))
|
||||||
|
OnClientDisconnect_Post(client);
|
||||||
}
|
}
|
||||||
}*/
|
|
||||||
|
|
||||||
public Action:Command_StopSound(client, args)
|
// Detect game and unhook appropriate tempent.
|
||||||
|
static char sGame[32];
|
||||||
|
GetGameFolderName(sGame, sizeof(sGame));
|
||||||
|
|
||||||
|
if(StrEqual(sGame, "cstrike"))
|
||||||
|
RemoveTempEntHook("Shotgun Shot", CSS_Hook_ShotgunShot);
|
||||||
|
else if(StrEqual(sGame, "dod"))
|
||||||
|
RemoveTempEntHook("FireBullets", DODS_Hook_FireBullets);
|
||||||
|
|
||||||
|
// TF2/HL2:DM and misc weapon sounds were caught here.
|
||||||
|
RemoveNormalSoundHook(Hook_NormalSound);
|
||||||
|
|
||||||
|
UserMsg ReloadEffect = GetUserMessageId("ReloadEffect");
|
||||||
|
if(ReloadEffect != INVALID_MESSAGE_ID)
|
||||||
|
UnhookUserMessage(ReloadEffect, Hook_ReloadEffect, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action Command_StopSound(int client, int args)
|
||||||
{
|
{
|
||||||
if (client == 0)
|
if(client == 0)
|
||||||
{
|
{
|
||||||
PrintToServer("[SM] Cannot use command from server console.");
|
PrintToServer("[SM] Cannot use command from server console.");
|
||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args > 0)
|
if(args > 0)
|
||||||
{
|
{
|
||||||
decl String:Arguments[32];
|
static char Arguments[32];
|
||||||
GetCmdArg(1, Arguments, sizeof(Arguments));
|
GetCmdArg(1, Arguments, sizeof(Arguments));
|
||||||
|
|
||||||
if (StrEqual(Arguments, "save"))
|
static char SID[32];
|
||||||
|
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
|
||||||
|
|
||||||
|
if(StrEqual(Arguments, "save"))
|
||||||
{
|
{
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
|
|
||||||
decl String:SID[32];
|
if(g_hWepSounds.JumpToKey(SID, true))
|
||||||
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
|
|
||||||
|
|
||||||
if (KvJumpToKey(g_hWepSounds, SID, true))
|
|
||||||
{
|
{
|
||||||
new disabled;
|
int disabled = g_hWepSounds.GetNum("disabled", 0);
|
||||||
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
|
if(!disabled)
|
||||||
|
|
||||||
if (!disabled)
|
|
||||||
{
|
{
|
||||||
//CPrintToChat(client, "[StopSound] Saved entry for STEAMID({green}%s{default}) {green}successfully{default}.", SID);
|
//CPrintToChat(client, "[StopSound] Saved entry for STEAMID({green}%s{default}) {green}successfully{default}.", SID);
|
||||||
KvSetNum(g_hWepSounds, "disabled", 1);
|
g_hWepSounds.SetNum("disabled", 1);
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
|
g_hWepSounds.ExportToFile(g_sKVPATH);
|
||||||
|
|
||||||
g_bStopSound[client] = true;
|
g_bStopSound[client] = true;
|
||||||
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {red}disabled{default} - {green}entry saved{default}.");
|
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {red}disabled{default} - {green}entry saved{default}.");
|
||||||
@ -109,9 +124,9 @@ public Action:Command_StopSound(client, args)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//CPrintToChat(client, "[StopSound] Entry for STEAMID({green}%s{default}) {green}successfully deleted{default}.", SID);
|
//CPrintToChat(client, "[StopSound] Entry for STEAMID({green}%s{default}) {green}successfully deleted{default}.", SID);
|
||||||
KvDeleteThis(g_hWepSounds);
|
g_hWepSounds.DeleteThis();
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
|
g_hWepSounds.ExportToFile(g_sKVPATH);
|
||||||
|
|
||||||
g_bStopSound[client] = false;
|
g_bStopSound[client] = false;
|
||||||
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
|
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
|
||||||
@ -121,24 +136,21 @@ public Action:Command_StopSound(client, args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
}
|
}
|
||||||
else if (StrEqual(Arguments, "delete"))
|
else if(StrEqual(Arguments, "delete"))
|
||||||
{
|
{
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
|
|
||||||
decl String:SID[32];
|
if(g_hWepSounds.JumpToKey(SID, false))
|
||||||
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
|
|
||||||
|
|
||||||
if (KvJumpToKey(g_hWepSounds, SID, false))
|
|
||||||
{
|
{
|
||||||
g_bStopSound[client] = false;
|
g_bStopSound[client] = false;
|
||||||
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
|
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
|
||||||
CheckHooks();
|
CheckHooks();
|
||||||
|
|
||||||
KvDeleteThis(g_hWepSounds);
|
g_hWepSounds.DeleteThis();
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
|
g_hWepSounds.ExportToFile(g_sKVPATH);
|
||||||
|
|
||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
@ -162,41 +174,34 @@ public Action:Command_StopSound(client, args)
|
|||||||
return Plugin_Handled;
|
return Plugin_Handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OnClientPutInServer(client)
|
public void OnClientAuthorized(int client, const char[] auth)
|
||||||
{
|
{
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
|
|
||||||
decl String:SID[32];
|
if(KvJumpToKey(g_hWepSounds, auth, false))
|
||||||
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
|
|
||||||
|
|
||||||
if (KvJumpToKey(g_hWepSounds, SID, false))
|
|
||||||
{
|
{
|
||||||
new disabled;
|
int disabled = g_hWepSounds.GetNum("disabled", 0);
|
||||||
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
|
if(disabled)
|
||||||
|
|
||||||
if (disabled)
|
|
||||||
{
|
|
||||||
g_bStopSound[client] = true;
|
g_bStopSound[client] = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckHooks();
|
CheckHooks();
|
||||||
KvRewind(g_hWepSounds);
|
g_hWepSounds.Rewind();
|
||||||
}
|
}
|
||||||
|
|
||||||
public OnClientDisconnect_Post(client)
|
public void OnClientDisconnect_Post(int client)
|
||||||
{
|
{
|
||||||
g_bStopSound[client] = false;
|
g_bStopSound[client] = false;
|
||||||
CheckHooks();
|
CheckHooks();
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckHooks()
|
void CheckHooks()
|
||||||
{
|
{
|
||||||
new bool:bShouldHook = false;
|
bool bShouldHook = false;
|
||||||
|
|
||||||
for (new i = 1; i <= MaxClients; i++)
|
for(int i = 1; i <= MaxClients; i++)
|
||||||
{
|
{
|
||||||
if (g_bStopSound[i])
|
if(g_bStopSound[i])
|
||||||
{
|
{
|
||||||
bShouldHook = true;
|
bShouldHook = true;
|
||||||
break;
|
break;
|
||||||
@ -207,25 +212,22 @@ CheckHooks()
|
|||||||
g_bHooked = bShouldHook;
|
g_bHooked = bShouldHook;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action:Hook_NormalSound(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags)
|
public Action Hook_NormalSound(int clients[MAXPLAYERS], int &numClients, char sample[PLATFORM_MAX_PATH],
|
||||||
|
int &entity, int &channel, float &volume, int &level, int &pitch, int &flags,
|
||||||
|
char soundEntry[PLATFORM_MAX_PATH], int &seed)
|
||||||
{
|
{
|
||||||
// Ignore non-weapon sounds.
|
// Ignore non-weapon sounds.
|
||||||
if (!g_bHooked || !(strncmp(sample, "weapons", 7) == 0 || strncmp(sample[1], "weapons", 7) == 0))
|
if(!g_bHooked || !(strncmp(sample, "weapons", 7) == 0 || strncmp(sample[1], "weapons", 7) == 0))
|
||||||
{
|
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
|
||||||
|
|
||||||
decl i, j;
|
for(int i = 0; i < numClients; i++)
|
||||||
|
|
||||||
for (i = 0; i < numClients; i++)
|
|
||||||
{
|
{
|
||||||
if (g_bStopSound[clients[i]])
|
int client = clients[i];
|
||||||
|
if(g_bStopSound[client])
|
||||||
{
|
{
|
||||||
// Remove the client from the array.
|
// Remove the client from the array.
|
||||||
for (j = i; j < numClients - 1; j++)
|
for(int j = i; j < numClients - 1; j++)
|
||||||
{
|
|
||||||
clients[j] = clients[j + 1];
|
clients[j] = clients[j + 1];
|
||||||
}
|
|
||||||
|
|
||||||
numClients--;
|
numClients--;
|
||||||
i--;
|
i--;
|
||||||
@ -235,39 +237,30 @@ public Action:Hook_NormalSound(clients[64], &numClients, String:sample[PLATFORM_
|
|||||||
return (numClients > 0) ? Plugin_Changed : Plugin_Stop;
|
return (numClients > 0) ? Plugin_Changed : Plugin_Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action:CSS_Hook_ShotgunShot(const String:te_name[], const Players[], numClients, Float:delay)
|
public Action CSS_Hook_ShotgunShot(const char[] te_name, const int[] Players, int numClients, float delay)
|
||||||
{
|
{
|
||||||
if (!g_bHooked)
|
if(!g_bHooked)
|
||||||
{
|
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
|
||||||
|
|
||||||
// Check which clients need to be excluded.
|
// Check which clients need to be excluded.
|
||||||
decl newClients[MaxClients], client, i;
|
int[] newClients = new int[numClients];
|
||||||
new newTotal = 0;
|
int newTotal = 0;
|
||||||
|
|
||||||
for (i = 0; i < numClients; i++)
|
for(int i = 0; i < numClients; i++)
|
||||||
{
|
{
|
||||||
client = Players[i];
|
int client = Players[i];
|
||||||
|
if(!g_bStopSound[client])
|
||||||
if (!g_bStopSound[client])
|
|
||||||
{
|
|
||||||
newClients[newTotal++] = client;
|
newClients[newTotal++] = client;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// No clients were excluded.
|
// No clients were excluded.
|
||||||
if (newTotal == numClients)
|
if(newTotal == numClients)
|
||||||
{
|
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
else if(newTotal == 0) // All clients were excluded and there is no need to broadcast.
|
||||||
else if (newTotal == 0) // All clients were excluded and there is no need to broadcast.
|
|
||||||
{
|
|
||||||
return Plugin_Stop;
|
return Plugin_Stop;
|
||||||
}
|
|
||||||
|
|
||||||
// Re-broadcast to clients that still need it.
|
// Re-broadcast to clients that still need it.
|
||||||
decl Float:vTemp[3];
|
float vTemp[3];
|
||||||
TE_Start("Shotgun Shot");
|
TE_Start("Shotgun Shot");
|
||||||
TE_ReadVector("m_vecOrigin", vTemp);
|
TE_ReadVector("m_vecOrigin", vTemp);
|
||||||
TE_WriteVector("m_vecOrigin", vTemp);
|
TE_WriteVector("m_vecOrigin", vTemp);
|
||||||
@ -284,39 +277,30 @@ public Action:CSS_Hook_ShotgunShot(const String:te_name[], const Players[], numC
|
|||||||
return Plugin_Stop;
|
return Plugin_Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Action:DODS_Hook_FireBullets(const String:te_name[], const Players[], numClients, Float:delay)
|
public Action DODS_Hook_FireBullets(const char[] te_name, const int[] Players, int numClients, float delay)
|
||||||
{
|
{
|
||||||
if (!g_bHooked)
|
if(!g_bHooked)
|
||||||
{
|
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
|
||||||
|
|
||||||
// Check which clients need to be excluded.
|
// Check which clients need to be excluded.
|
||||||
decl newClients[MaxClients], client, i;
|
int[] newClients = new int[numClients];
|
||||||
new newTotal = 0;
|
int newTotal = 0;
|
||||||
|
|
||||||
for (i = 0; i < numClients; i++)
|
for(int i = 0; i < numClients; i++)
|
||||||
{
|
{
|
||||||
client = Players[i];
|
int client = Players[i];
|
||||||
|
if(!g_bStopSound[client])
|
||||||
if (!g_bStopSound[client])
|
|
||||||
{
|
|
||||||
newClients[newTotal++] = client;
|
newClients[newTotal++] = client;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// No clients were excluded.
|
// No clients were excluded.
|
||||||
if (newTotal == numClients)
|
if(newTotal == numClients)
|
||||||
{
|
|
||||||
return Plugin_Continue;
|
return Plugin_Continue;
|
||||||
}
|
else if(newTotal == 0)// All clients were excluded and there is no need to broadcast.
|
||||||
else if (newTotal == 0)// All clients were excluded and there is no need to broadcast.
|
|
||||||
{
|
|
||||||
return Plugin_Stop;
|
return Plugin_Stop;
|
||||||
}
|
|
||||||
|
|
||||||
// Re-broadcast to clients that still need it.
|
// Re-broadcast to clients that still need it.
|
||||||
decl Float:vTemp[3];
|
float vTemp[3];
|
||||||
TE_Start("FireBullets");
|
TE_Start("FireBullets");
|
||||||
TE_ReadVector("m_vecOrigin", vTemp);
|
TE_ReadVector("m_vecOrigin", vTemp);
|
||||||
TE_WriteVector("m_vecOrigin", vTemp);
|
TE_WriteVector("m_vecOrigin", vTemp);
|
||||||
@ -331,3 +315,60 @@ public Action:DODS_Hook_FireBullets(const String:te_name[], const Players[], num
|
|||||||
|
|
||||||
return Plugin_Stop;
|
return Plugin_Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Action Hook_ReloadEffect(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
|
||||||
|
{
|
||||||
|
if(!g_bHooked)
|
||||||
|
return Plugin_Continue;
|
||||||
|
|
||||||
|
int client = msg.ReadShort();
|
||||||
|
|
||||||
|
// Check which clients need to be excluded.
|
||||||
|
int[] newClients = new int[playersNum];
|
||||||
|
int newTotal = 0;
|
||||||
|
|
||||||
|
for(int i = 0; i < playersNum; i++)
|
||||||
|
{
|
||||||
|
int client_ = players[i];
|
||||||
|
if(IsClientInGame(client_) && !g_bStopSound[client_])
|
||||||
|
newClients[newTotal++] = client_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No clients were excluded.
|
||||||
|
if(newTotal == playersNum)
|
||||||
|
return Plugin_Continue;
|
||||||
|
else if(newTotal == 0) // All clients were excluded and there is no need to broadcast.
|
||||||
|
return Plugin_Handled;
|
||||||
|
|
||||||
|
DataPack pack = new DataPack();
|
||||||
|
pack.WriteCell(client);
|
||||||
|
pack.WriteCell(newTotal);
|
||||||
|
|
||||||
|
ArrayList aPlayers = new ArrayList(newTotal, 1);
|
||||||
|
aPlayers.SetArray(0, newClients, newTotal);
|
||||||
|
pack.WriteCell(aPlayers);
|
||||||
|
|
||||||
|
RequestFrame(OnReloadEffect, pack);
|
||||||
|
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnReloadEffect(DataPack pack)
|
||||||
|
{
|
||||||
|
pack.Reset();
|
||||||
|
int client = pack.ReadCell();
|
||||||
|
int playersNum = pack.ReadCell();
|
||||||
|
ArrayList aPlayers = pack.ReadCell();
|
||||||
|
CloseHandle(pack);
|
||||||
|
|
||||||
|
int[] players = new int[playersNum];
|
||||||
|
aPlayers.GetArray(0, players, playersNum);
|
||||||
|
delete aPlayers;
|
||||||
|
|
||||||
|
Handle ReloadEffect = StartMessage("ReloadEffect", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||||
|
if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf)
|
||||||
|
PbSetInt(ReloadEffect, "entidx", client);
|
||||||
|
else
|
||||||
|
BfWriteShort(ReloadEffect, client);
|
||||||
|
EndMessage();
|
||||||
|
}
|
||||||
|
@ -100,6 +100,9 @@ public void OnClientDisconnect(int client)
|
|||||||
SDKUnhook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
|
SDKUnhook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
|
||||||
SDKUnhook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
|
SDKUnhook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
|
||||||
|
|
||||||
|
if(!IsClientInGame(client))
|
||||||
|
return;
|
||||||
|
|
||||||
// Simulate dropping all equipped weapons
|
// Simulate dropping all equipped weapons
|
||||||
for(int i = 0; i < 5; i++)
|
for(int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user