ну что никак уже не зделать?@makentosh, чуть оптимизировал кодPHP:static const String:team_prefix[][] = {"", "SPEC", "T", "CT"}; public bool:GetMenuItemPlayers(client, &Handle:hMenu, bool:showbot, bool:showdead) { new EngineVersion:nEngine = GetEngineVersion(); new iUserId[MAXPLAYERS+1], iArray[MAXPLAYERS], iSize, bool:teams; // вообще эту проверку нужно вынести из этой функции в OnPluginStart() teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO; for (new i = 1; i <= MaxClients; i++) { if (IsClientConnected(i)) { iUserId[i] = GetClientUserId(i); if (bool:iUserId[i] && IsClientInGame(i)) { if (!showbot && IsFakeClient(i) || !showdead && !IsPlayerAlive(i) || !CanUserTarget(client, i)) continue; iArray[iSize++] = iUserId[i]; } } } SortIntegers(iArray, iSize, Sort_Descending); decl String:sBuffer[2][128]; for (new i, j; i < iSize; i++) { for (j = 1; j <= MaxClients; j++) if (iArray[i] == iUserId[j]) { if (!IsClientInKickQueue(j)) { if (!GetClientName(j, sBuffer[1], sizeof(sBuffer[]))) Format(sBuffer[1], sizeof(sBuffer[]), "Имя не распознано! [#%i] [%i]", iUserId[j], j); IntToString(iUserId[j], sBuffer[0], sizeof(sBuffer[])); // зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера if (!teams) Format(sBuffer[1], sizeof(sBuffer[]), "%s #%s", sBuffer[1], sBuffer[0]); else Format(sBuffer[1], sizeof(sBuffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], sBuffer[1], sBuffer[0]); AddMenuItem(hMenu, sBuffer[0], sBuffer[1]); } break; } } if (bool:GetMenuItemCount(hMenu)) return true; CloseHandle(hMenu); return false; }
#include <sourcemod>
#include <sdktools>
public Plugin:myinfo =
{
name = "[CSGO] Grenades sounds",
author = "css-rus.ru(skype:linuxuser41)",
description = "Плагин добавляет звуки гранат",
version = "1.0",
url = "http://css-rus.ru/"
};
//Пути к звукам заменять на строчках с EmitAmbientSound
public OnPluginStart()
{
LoadAllFiles();
AddNormalSoundHook(SoundCallBackHook);
}
public OnMapStart()
{
LoadAllFiles();
}
LoadAllFiles()
{
new Handle:dir = OpenDirectory("sound/replaced_sounds");
if (dir)
{
decl String:Name[100];
decl String:fsnd[256];
new FileType:type;
while (ReadDirEntry(dir, Name, 100, type))
{
if (type == FileType:2)
{
Format(fsnd, 256, "replaced_sounds/%s", Name);
PrintToServer(fsnd);
PrecacheSound(fsnd, true);
Format(fsnd, 256, "sound/replaced_sounds/%s", Name);
AddFileToDownloadsTable(fsnd);
}
}
CloseHandle(dir);
}
else
{
PrintToServer("Не удалось открыть директорию");
}
}
public Action:SoundCallBackHook(clients[64], &numClients, String:sample[256], &entity, &channel, &Float:volume, &level, &pitch, &flags)
{
new Owner = GetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity");
new Float:sndplace[3] = 0.0;
if (Owner > 0 && Owner <= MaxClients)
{
if (StrEqual(sample, "^weapons/smokegrenade/sg_explode.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/sg_explode.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "weapons/smokegrenade/grenade_hit1.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/grenade_hit1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "^weapons/flashbang/flashbang_explode1.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/flashbang_explode1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "^weapons/flashbang/flashbang_explode2.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/flashbang_explode2.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "weapons/flashbang/grenade_hit1.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/grenade_hit1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "^weapons/hegrenade/explode3.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/explode3.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "^weapons/hegrenade/explode4.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/explode4.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "^weapons/hegrenade/explode5.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/explode5.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
if (StrEqual(sample, "weapons/hegrenade/he_bounce-1.wav", true))
{
GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
EmitAmbientSound("replaced_sounds/he_bounce-1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
return Plugin_Handled;
}
}
return Plugin_Continue;
}
L 05/21/2018 - 01:06:54: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 71/cs_ragdoll)
L 05/21/2018 - 01:06:54: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:06:54: [SM] [0] Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:07:34: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 76/cs_ragdoll)
L 05/21/2018 - 01:07:34: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:07:34: [SM] [0] Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:09:52: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 85/cs_ragdoll)
L 05/21/2018 - 01:09:52: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:09:52: [SM] [0] Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:16:23: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 75/cs_ragdoll)
static const char team_prefix[][] = {"", "SPEC", "T", "CT"};
public bool GetMenuItemPlayers(int client, Menu &hMenu, bool showbot, bool showdead)
{
if(hMenu == null)
return false;
EngineVersion nEngine = GetEngineVersion();
int userID[MAXPLAYERS+1], array[MAXPLAYERS], size;
// вообще эту проверку нужно вынести из этой функции в OnPluginStart()
bool teams;
teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO;
for (int i = 1; i <= MaxClients; i++)
if (IsClientConnected(i) && (userID[i] = GetClientUserId(i)) && IsClientInGame(i)
&& (showbot || !IsFakeClient(i)) && (showdead || IsPlayerAlive(i)) && CanUserTarget(client, i))
array[size++] = userID[i];
SortIntegers(array, size, Sort_Descending);
for (new i, j; i < size; i++)
{
for (j = 1; j <= MaxClients; j++) if (array[i] == userID[j])
{
if (!IsClientInKickQueue(j))
{
static char buffer[2][128];
if (!GetClientName(j, buffer[1], sizeof(buffer[])))
Format(buffer[1], sizeof(buffer[]), "Имя не распознано! [#%i] [%i]", userID[j], j);
IntToString(userID[j], buffer[0], sizeof(buffer[]));
// зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера
if (!teams) Format(buffer[1], sizeof(buffer[]), "%s #%s", buffer[1], buffer[0]);
else Format(buffer[1], sizeof(buffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], buffer[1], buffer[0]);
hMenu.AddItem(buffer[0], buffer[1]);
}
break;
}
}
if (hMenu.ItemCount)
return true;
CloseHandle(hMenu);
return false;
}
@makentosh, вот на новом:PHP:static const char team_prefix[][] = {"", "SPEC", "T", "CT"}; public bool GetMenuItemPlayers(int client, Menu &hMenu, bool showbot, bool showdead) { if(hMenu == null) return false; EngineVersion nEngine = GetEngineVersion(); int userID[MAXPLAYERS+1], array[MAXPLAYERS], size; // вообще эту проверку нужно вынести из этой функции в OnPluginStart() bool teams; teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO; for (int i = 1; i <= MaxClients; i++) if (IsClientConnected(i) && (userID[i] = GetClientUserId(i)) && IsClientInGame(i) && (showbot || !IsFakeClient(i)) && (showdead || IsPlayerAlive(i)) && CanUserTarget(client, i)) array[size++] = userID[i]; SortIntegers(array, size, Sort_Descending); for (new i, j; i < size; i++) { for (j = 1; j <= MaxClients; j++) if (array[i] == userID[j]) { if (!IsClientInKickQueue(j)) { static char buffer[2][128]; if (!GetClientName(j, buffer[1], sizeof(buffer[]))) Format(buffer[1], sizeof(buffer[]), "Имя не распознано! [#%i] [%i]", userID[j], j); IntToString(userID[j], buffer[0], sizeof(buffer[])); // зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера if (!teams) Format(buffer[1], sizeof(buffer[]), "%s #%s", buffer[1], buffer[0]); else Format(buffer[1], sizeof(buffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], buffer[1], buffer[0]); hMenu.AddItem(buffer[0], buffer[1]); } break; } } if (hMenu.ItemCount) return true; CloseHandle(hMenu); return false; }
ну а как зделано в см 1.6.3 там не через бд@Felton, ну попробуй так
--- Добавлено позже ---
@makentosh, исправь for (new i, j; i < size; i++) на for (int i, j; i < size; i++)
--- Добавлено позже ---
@opportune, для вышедших игроков нужно отдельный плагин пилить (который будет использовать БД, как я понимаю)
А для остального есть файл adminmenu_custom.txt
зделал и заменил скомплектировал плагини те что надо и толку 0 что было то и сталось!ну а как зделано в см 1.6.3 там не через бд
соррян не то прочитал так что как зделать как на 1.6.3 что я спросил?@makentosh, так я про БД писал opportune, а не тебе
Это ты сам про БД начал мне писать
без ошибок ну то да а почему не ту приставки я скрин кидал@makentosh, ну так у тебя компилится уже без ошибок?
Но я думаю, что не особо это и поможет (по идее просто меньше вероятность появления сообщений об ошибоках в консоли сервера)if(hMenu == null)
return false;
Используется SB-MaterialAdmin/NewServer и сейчас в меню есть такой пункт. Требуется просто упорядочить пункты как указано в ТЗ, надеюсь на Вашу помощь)@Felton, ну попробуй так
--- Добавлено позже ---
@makentosh, исправь for (new i, j; i < size; i++) на for (int i, j; i < size; i++)
--- Добавлено позже ---
@opportune, для вышедших игроков нужно отдельный плагин пилить (который будет использовать БД, как я понимаю)
А для остального есть файл adminmenu_custom.txt