Не блочит.@Oligarx1488, так тебе +left и +right или +moveleft и +moveright?
Если первое то вот это будет блочить срабатывание этих команд:PHP:#include <sdktools_hooks> public Action OnPlayerRunCmd(int client, int &buttons) { static bool block; block = false; if(buttons & IN_LEFT) { buttons &= ~IN_LEFT; block = true; } if(buttons & IN_RIGHT) { buttons &= ~IN_RIGHT; block = true; } return block ? Plugin_Changed : Plugin_Continue; }
Твой вариант самолетик вроде рабочий.Делал когда-то давно , не самый оптимальный вариант :|, но в ксс рабочий точно, проверь на ксго
Визуально у игрока экран то же не поворачивается , но при этом экран игрока трясет.
PHP:#include <sdktools> public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3]) { static float LAngels[65]; if(IsPlayerAlive(client) && !IsFakeClient(client) && (buttons & IN_LEFT) > 0 || (buttons & IN_RIGHT) > 0 ) { angles[1] = LAngels[client]; TeleportEntity(client, NULL_VECTOR, angles, NULL_VECTOR); } LAngels[client] = angles[1]; }
Без тряски экрана, при +left или +right игрок якобы поворачивает , но на деле просто прыгает вперед.
PHP:#include <sdktools> public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3]) { static float lang[65]; if(IsPlayerAlive(client) && (buttons & IN_LEFT) > 0 || (buttons & IN_RIGHT) > 0 ) angles[1] = lang[client]; lang[client] = angles[1]; }
какая игра, какая версия SM? Должно блочить на SM1.7+Не блочит.
+jump это и есть обычный прыжок (сам посмотри в клиенте по пути ...\cfg\config.cfg), разве что можно сделать кулдаун на использование команды, чтобы не срабатывало чаще, чем пропишешь в конфигечтобы обычный прыжок работал а +jump нет
можно: просто удаляешь проверку buttons & IN_LEFTМожно ли сделать чтобы +left к примеру не работало а +right работало.
csgo,sm 1.9какая игра, какая версия SM? Должно блочить на SM1.7+
+jump это и есть обычный прыжок (сам посмотри в клиенте по пути ...\cfg\config.cfg), разве что можно сделать кулдаун на использование команды, чтобы не срабатывало чаще, чем пропишешь в конфигеможно: просто удаляешь проверку buttons & IN_LEFT
Если стоит випка риковская, то там есть модуль, которые позволяет настроить наносимый, и входящий урон.Напишите пожалуйста пример добавления/уменьшения урона для админа (по админу), пример :
Админ с флагом Z наносит урон по игроку и он умножается (урон 100 * 1.5 = 150)
Игрок наносит урон по админу с флагом Z то урон делиться (урон 100 / 1.5 = 66.666666)
Игра [csgo], спасибо.
#include <sdkhooks>
static const float fDmgMult = 1.5;
public void OnClientPostAdminCheck(int client)
{
SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
if(!attacker || !victim || victim == attacker) return Plugin_Continue;
static AdminId aid, vid;
if((aid = GetUserAdmin(attacker)) == INVALID_ADMIN_ID && (vid = GetUserAdmin(victim)) != INVALID_ADMIN_ID)
damage /= fDmgMult;
else if(aid != INVALID_ADMIN_ID && vid == INVALID_ADMIN_ID)
damage *= fDmgMult;
else return Plugin_Continue;
return Plugin_Changed;
}
PHP:#define PATH "" // путь к звуку public void OnPluginStart() { HookEvent("player_death", view_as<EventHook>(PlayerDeath)); } void PlayerDeath(Event hEvent) { ClientCommand(GetClientOfUserId(hEvent.GetInt("attacker")), "play %s", PATH); }
stuck sourcemod | Давай я поищу в Google вместо тебя
Появляется проблема, (если стоят плагины типа round end sound) :
Последнему игроку убившего врага не воспроизводиться музыка. как будто "play %s" все перебивает...
#define PATH "" // путь к звуку
public void OnPluginStart()
{
HookEvent("player_death", view_as<EventHook>(PlayerDeath));
}
void PlayerDeath(Event hEvent)
{
if(isLastAlive())
return;
ClientCommand(GetClientOfUserId(hEvent.GetInt("attacker")), "play %s", PATH);
}
bool isLastAlive()
{
int count;
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && IsPlayerAlive(i))
count++;
}
return count < 2;
}
скорей всего так и естькак будто "play %s" все перебивает
скорей всего так и есть
new const String:RELATIVE_SOUND_PATH[] = "/buttons/bell1.wav";
public Action PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
int attacker = GetClientOfUserId(event.GetInt("attacker"));
if(attacker > 0 && g_bEnabled[attacker])
{
EmitSoundToClient(attacker, RELATIVE_SOUND_PATH);
}
}
@Ровный Кент,--- Добавлено позже ---PHP:#include <sdkhooks> static const float fDmgMult = 1.5; public void OnClientPostAdminCheck(int client) { SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); } public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { if(!attacker || !victim || victim == attacker) return Plugin_Continue; static AdminId aid, vid; if((aid = GetUserAdmin(attacker)) == INVALID_ADMIN_ID && (vid = GetUserAdmin(victim)) != INVALID_ADMIN_ID) damage /= fDmgMult; else if(aid != INVALID_ADMIN_ID && vid == INVALID_ADMIN_ID) damage *= fDmgMult; else return Plugin_Continue; return Plugin_Changed; }
Если нужно именно с флагом, то ещё нужно добавить проверку на флаг
L 04/21/2019 - 10:19:02: Info (map "de_dust2") (file "errors_20190421.log")
L 04/21/2019 - 10:19:02: [SM] Exception reported: Client index 312 is invalid
L 04/21/2019 - 10:19:02: [SM] Blaming: admin_dmg.smx
L 04/21/2019 - 10:19:02: [SM] Call stack trace:
L 04/21/2019 - 10:19:02: [SM] [0] GetUserAdmin
L 04/21/2019 - 10:19:02: [SM] [1] Line 18, admin_dmg.sp::OnTakeDamage
L 04/21/2019 - 10:26:32: Error log file session closed.
L 04/21/2019 - 10:30:44: SourceMod error session started
#include <sdkhooks>
static const float fDmgMult = 1.5;
bool bAdmin[MAXPLAYERS+1];
public void OnClientPostAdminCheck(int client)
{
bAdmin[client] = !IsFakeClient(client) && GetUserAdmin(client) != INVALID_ADMIN_ID;
SDKHook(client, SDKHook_OnTakeDamage, bAdmin[client] ? OnTakeDamageAdmin : OnTakeDamageRegular);
}
public Action OnTakeDamageAdmin(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
if(victim == attacker || !attacker || attacker > MaxClients || bAdmin[attacker]) return Plugin_Continue;
damage /= fDmgMult;
return Plugin_Changed;
}
public Action OnTakeDamageRegular(int victim, int& attacker, int& inflictor, float& damage, int& damagetype)
{
if(victim == attacker || !attacker || attacker > MaxClients || !bAdmin[attacker]) return Plugin_Continue;
damage *= fDmgMult;
return Plugin_Changed;
}
хзА так не поможет?
bool g_tpOn = true; //Тп разшенео (огрначитель по времени с начала раунда)
float g_iPlayerOrigin[MAXPLAYERS+1][3]; //Переменная для координат игроков
public void OnPluginStart()
{
RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял
HookEvent("round_start", Event_RoundStart, EventHookMode_Post);
}
public Event_RoundStart(Handle:event, String:name[], bool:dontBroadcast)
{
for (int iClient = 1; iClient <= MaxClients; ++iClient)
{
if (IsClientInGame(iClient) && IsPlayerAlive(iClient))
{
GetClientAbsOrigin(iClient, g_iPlayerOrigin[3]); // записали координаты спавна каждого игрока в массив
}
}
g_tpOn = true; //В начале раунда разрешаем ТП
CreateTimer(30.0, Timer_tpOff, _, TIMER_FLAG_NO_MAPCHANGE); //Таймер сколько ТП будет доступно
}
public Action Timer_tpOff(Handle hTimer) //Запрещаем ТП после N секунд
{
g_tpOn = false;
}
public Action Command_Respawn(int iClient, int args) //Команда для ТП
{
if(0 < iClient < MaxClients && IsClientInGame(iClient) && g_tpOn == true)
{
TeleportEntity(iClient, g_iPlayerOrigin[iClient], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду
}
return Plugin_Handled;
}
@Ровный Кент, тогда поправь проверку индекса if(!attacker || attacker > MaxClients || !victim || victim == attacker)
--- Добавлено позже ---
А лучше вот так (правда плагин не поддерживает получение/потерю админских привелегий без перезагрузки плагина или перезахода игрока):--- Добавлено позже ---PHP:#include <sdkhooks> static const float fDmgMult = 1.5; bool bAdmin[MAXPLAYERS+1]; public void OnClientPostAdminCheck(int client) { bAdmin[client] = !IsFakeClient(client) && GetUserAdmin(client) != INVALID_ADMIN_ID; SDKHook(client, SDKHook_OnTakeDamage, bAdmin[client] ? OnTakeDamageAdmin : OnTakeDamageRegular); } public Action OnTakeDamageAdmin(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { if(victim == attacker || !attacker || attacker > MaxClients || bAdmin[attacker]) return Plugin_Continue; damage /= fDmgMult; return Plugin_Changed; } public Action OnTakeDamageRegular(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { if(victim == attacker || !attacker || attacker > MaxClients || !bAdmin[attacker]) return Plugin_Continue; damage *= fDmgMult; return Plugin_Changed; }
хз
Там главное, чтобы звук воспроизводился в канале, отличном от того, что используется в RES
EmitSoundToClient(attacker, "/buttons/bell1.wav", SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_RAIDSIREN, SND_NOFLAGS, 90.0);
EmitSoundToClient(attacker, " */buttons/bell1.wav", SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_RAIDSIREN, SND_NOFLAGS, 90.0);
public Action PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
int attacker = GetClientOfUserId(event.GetInt("attacker"));
if(attacker > 0 && g_bEnabled[attacker])
{
EmitSoundToClient(attacker, "/buttons/bell1.wav", SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_RAIDSIREN, SND_NOFLAGS, 90.0);
}
}
ClientCommand(attacker, "play */buttons/bell1.wav");
float fPos[MAXPLAYERS+1][3]; //Переменная для координат игроков
int iTime;
public void OnPluginStart()
{
RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}
public void Event_RoundStart(Event event, String[] name, bool dontBroadcast)
{
for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
GetClientAbsOrigin(i, fPos[3]); // записали координаты спавна каждого игрока в массив
iTime = GetTime() + 30;
}
public Action Command_Respawn(int client, int args) //Команда для ТП
{
if(client && GetTime() <= iTime && IsPlayerAlive(client)) TeleportEntity(client, fPos[client], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду
return Plugin_Handled;
}
Телепортирует в стену, а не на точку спавна.@Ровный Кент, а слэш в начале пути убрать не пробовал?
--- Добавлено позже ---
@Mr.Black, вообще-то в твоём случае таймер не нужен:PHP:float fPos[MAXPLAYERS+1][3]; //Переменная для координат игроков int iTime; public void OnPluginStart() { RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); } public void Event_RoundStart(Event event, String[] name, bool dontBroadcast) { for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) GetClientAbsOrigin(i, fPos[3]); // записали координаты спавна каждого игрока в массив iTime = GetTime() + 30; } public Action Command_Respawn(int client, int args) //Команда для ТП { if(client && GetTime() <= iTime && IsPlayerAlive(client)) TeleportEntity(client, fPos[client], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду return Plugin_Handled; }
@Ровный Кент, а слэш в начале пути убрать не пробовал?
--- Добавлено позже ---
@Mr.Black, вообще-то в твоём случае таймер не нужен:PHP:float fPos[MAXPLAYERS+1][3]; //Переменная для координат игроков int iTime; public void OnPluginStart() { RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); } public void Event_RoundStart(Event event, String[] name, bool dontBroadcast) { for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) GetClientAbsOrigin(i, fPos[3]); // записали координаты спавна каждого игрока в массив iTime = GetTime() + 30; } public Action Command_Respawn(int client, int args) //Команда для ТП { if(client && GetTime() <= iTime && IsPlayerAlive(client)) TeleportEntity(client, fPos[client], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду return Plugin_Handled; }
Привет. Помогите, пожалуйста, пытаюсь сделать телепорт игрока по команде на одну из точек спавна его команды. Но пока спавнит либо криво (в центр карты) либо спавнит в одну и туже точку. Подскажите, что я делаю не так.
Как я пытаюсь это сделать:
При спавне беру координаты тимейтов, сохраняю. И когда кто-то пишет команду отправляют на координаты (не понятно как отправить на рандомные координаты и в какой момент делать проверку на команду игрока(т или кт))
C-подобный:bool g_tpOn = true; //Тп разшенео (огрначитель по времени с начала раунда) float g_iPlayerOrigin[MAXPLAYERS+1][3]; //Переменная для координат игроков public void OnPluginStart() { RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял HookEvent("round_start", Event_RoundStart, EventHookMode_Post); } public Event_RoundStart(Handle:event, String:name[], bool:dontBroadcast) { for (int iClient = 1; iClient <= MaxClients; ++iClient) { if (IsClientInGame(iClient) && IsPlayerAlive(iClient)) { GetClientAbsOrigin(iClient, g_iPlayerOrigin[3]); // записали координаты спавна каждого игрока в массив } } g_tpOn = true; //В начале раунда разрешаем ТП CreateTimer(30.0, Timer_tpOff, _, TIMER_FLAG_NO_MAPCHANGE); //Таймер сколько ТП будет доступно } public Action Timer_tpOff(Handle hTimer) //Запрещаем ТП после N секунд { g_tpOn = false; } public Action Command_Respawn(int iClient, int args) //Команда для ТП { if(0 < iClient < MaxClients && IsClientInGame(iClient) && g_tpOn == true) { TeleportEntity(iClient, g_iPlayerOrigin[iClient], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду } return Plugin_Handled; }
Что то ты не внимательный...@Mr.Black, вообще-то в твоём случае таймер не нужен:PHP:float fPos[MAXPLAYERS+1][3]; //Переменная для координат игроков int iTime; public void OnPluginStart() { RegConsoleCmd("sm_sp", Command_Respawn); //Команда если застрял HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); } public void Event_RoundStart(Event event, String[] name, bool dontBroadcast) { for(int i = 1; i <= MaxClients; ++i) if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) GetClientAbsOrigin(i, fPos[3]); // записали координаты спавна каждого игрока в массив iTime = GetTime() + 30; } public Action Command_Respawn(int client, int args) //Команда для ТП { if(client && GetTime() <= iTime && IsPlayerAlive(client)) TeleportEntity(client, fPos[client], NULL_VECTOR, NULL_VECTOR); //ТП написавшего команду return Plugin_Handled; }
#include <cstrike>
#include <sdktools>
float g_fPos[MAXPLAYERS + 1][3];
int g_iTime;
public void OnPluginStart()
{
RegConsoleCmd("sm_sp", Command_Respawn);
HookEvent("round_start", eRS);
}
public void eRS(Event event, const char[] szName, bool dontBroadcast)
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
{
GetClientAbsOrigin(i, g_fPos[i]);
}
}
g_iTime = GetTime() + 30;
}
public Action Command_Respawn(int iClient, int iArgs)
{
if(iClient > 0 && GetTime() <= g_iTime && IsPlayerAlive(iClient))
{
TeleportEntity(iClient, g_fPos[iClient], NULL_VECTOR, NULL_VECTOR);
}
return Plugin_Handled;
}
#include <cstrike>
#include <sdktools>
float g_fPosCT[MAXPLAYERS][3],
g_fPosT[MAXPLAYERS][3];
public void OnPluginStart()
{
RegConsoleCmd("sm_resp", RCC_Resp);
HookEvent("round_start", eRS);
}
public Action RCC_Resp(int iClient, int iArgs)
{
if(iClient > 0)
{
Tele_to_spawn(iClient);
}
return Plugin_Handled;
}
public void eRS(Event hEvent, const char[] szName, bool bD)
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
{
g_fPosCT[i][0] = 0.0; g_fPosCT[i][1] = 0.0; g_fPosCT[i][2] = 0.0;
g_fPosT[i][0] = 0.0; g_fPosT[i][1] = 0.0; g_fPosT[i][2] = 0.0;
switch(GetClientTeam(i))
{
case CS_TEAM_CT:
{
GetClientAbsOrigin(i, g_fPosCT[i]);
}
case CS_TEAM_T:
{
GetClientAbsOrigin(i, g_fPosT[i]);
}
default:
{
continue;
}
}
}
}
}
void Tele_to_spawn(int iClient)
{
int iCount[2], iClients[MAXPLAYERS][2];
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i))
{
switch(GetClientTeam(i))
{
case CS_TEAM_CT:
{
iClients[iCount[0]][0] = i;
iCount[0]++;
}
case CS_TEAM_T:
{
iClients[iCount[1]][1] = i;
iCount[1]++;
}
}
}
}
int iRandom, iTeam;
switch(GetClientTeam(iClient))
{
case CS_TEAM_CT:
{
iTeam = 0;
}
case CS_TEAM_T:
{
iTeam = 1;
}
default:
{
iTeam = -1;
}
}
if(iTeam != -1)
{
iRandom = GetRandomInt(0, iCount[iTeam]);
while(!IsClientInGame(iRandom))
{
iRandom = GetRandomInt(0, iCount[iTeam]);
}
if(iTeam == 0)
{
TeleportEntity(iClient, g_fPosCT[iRandom], NULL_VECTOR, NULL_VECTOR);
}
else
{
TeleportEntity(iClient, g_fPosT[iRandom], NULL_VECTOR, NULL_VECTOR);
}
}
}
А ты делаешь прекеш звука?слеш убирал даже пробовал "sound/buttons/bell1.wav" все равно ничего не воспроизводит....
#include <sdktools_functions>
int iCD,
iTime,
iSpawns[2];
float fSpawnPos[2][MAXPLAYERS+1][3];
public void OnPluginStart()
{
ConVar CVar;
(CVar = CreateConVar("sm_tele_cd", "30", "Время после начала раунда, в течении которого доступна телепортация. 0 - плагин отключён, -1 - ограничение отключено", FCVAR_NOTIFY, true, -1.0, true, 3600.0)).AddChangeHook(CVarChanged_CD);
iCD = CVar.IntValue;
RegAdminCmd("sm_tele_refresh", Cmd_Refresh, ADMFLAG_CONFIG, "Refresh spawnpoints coordinates");
RegConsoleCmd("sm_sp", Cmd_Tele);
RegConsoleCmd("sm_spawn", Cmd_Tele);
RegConsoleCmd("sm_tospawn", Cmd_Tele);
RegConsoleCmd("sm_tele", Cmd_Tele);
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}
public void CVarChanged_CD(ConVar CVar, const char[] oldValue, const char[] newValue)
{
iCD = CVar.IntValue;
}
public Event_RoundStart(Handle:event, String:name[], bool:dontBroadcast)
{
iTime = GetTime();
}
public void OnMapStart()
{
FindSpawnpoints();
}
public Action Cmd_Refresh(int client, int args)
{
FindSpawnpoints();
}
public Action Cmd_Tele(int client, int args)
{
static int team, i;
if(!client || !iCD)
return Plugin_Handled;
if(!IsPlayerAlive(client) || team < 0)
{
PrintToChat(client, "Мёртвые и наблюдатели не могут использовать команду!");
return Plugin_Handled;
}
if(iSpawns[team] < 0) // а вдруг?
return Plugin_Handled;
if(iCD > 1 && GetTime() - iTime > iCD)
{
PrintToChat(client, "Время на телепортацию истекло!");
return Plugin_Handled;
}
i = GetRandomInt(0, iSpawns[team]);
TeleportEntity(client, fSpawnPos[team][i], NULL_VECTOR, NULL_VECTOR);
return Plugin_Handled;
}
stock void FindSpawnpoints()
{
iSpawns[0] = iSpawns[1] = -1;
char cls[32];
for(int i = MaxClients, maxent = GetMaxEntities(); i < maxent; i++)
if(IsValidEntity(i) && GetEntityClassname(i, cls, sizeof(cls)) && !StrContains(cls, "info_player_")
&& StrContains(cls[12], "terrorist") != -1)
GetEntPropVector(i, Prop_Data, "m_vecOrigin", cls[12] == 't' ? fSpawnPos[0][++iSpawns[0]] : fSpawnPos[1][++iSpawns[1]]);
PrintToServer("\nSpawn points detected: T - %i, CT - %i\n", iSpawns[0]+1, iSpawns[1]+1);
}
sound/ в пути не нужендаже пробовал "sound/buttons/bell1.wav"
Что то ты не внимательный...
Как минимум так должно быть
PHP:#include <cstrike> #include <sdktools> float g_fPos[MAXPLAYERS + 1][3]; int g_iTime; public void OnPluginStart() { RegConsoleCmd("sm_sp", Command_Respawn); HookEvent("round_start", eRS); } public void eRS(Event event, const char[] szName, bool dontBroadcast) { for(int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) { GetClientAbsOrigin(i, g_fPos[i]); } } g_iTime = GetTime() + 30; } public Action Command_Respawn(int iClient, int iArgs) { if(iClient > 0 && GetTime() <= g_iTime && IsPlayerAlive(iClient)) { TeleportEntity(iClient, g_fPos[iClient], NULL_VECTOR, NULL_VECTOR); } return Plugin_Handled; }
--- Добавлено позже ---Можно и лучше, но лень
PHP:#include <cstrike> #include <sdktools> float g_fPosCT[MAXPLAYERS][3], g_fPosT[MAXPLAYERS][3]; public void OnPluginStart() { RegConsoleCmd("sm_resp", RCC_Resp); HookEvent("round_start", eRS); } public Action RCC_Resp(int iClient, int iArgs) { if(iClient > 0) { Tele_to_spawn(iClient); } return Plugin_Handled; } public void eRS(Event hEvent, const char[] szName, bool bD) { for(int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) { g_fPosCT[i][0] = 0.0; g_fPosCT[i][1] = 0.0; g_fPosCT[i][2] = 0.0; g_fPosT[i][0] = 0.0; g_fPosT[i][1] = 0.0; g_fPosT[i][2] = 0.0; switch(GetClientTeam(i)) { case CS_TEAM_CT: { GetClientAbsOrigin(i, g_fPosCT[i]); } case CS_TEAM_T: { GetClientAbsOrigin(i, g_fPosT[i]); } default: { continue; } } } } } void Tele_to_spawn(int iClient) { int iCount[2], iClients[MAXPLAYERS][2]; for(int i = 1; i <= MaxClients; i++) { if(IsClientInGame(i) && !IsFakeClient(i)) { switch(GetClientTeam(i)) { case CS_TEAM_CT: { iClients[iCount[0]][0] = i; iCount[0]++; } case CS_TEAM_T: { iClients[iCount[1]][1] = i; iCount[1]++; } } } } int iRandom, iTeam; switch(GetClientTeam(iClient)) { case CS_TEAM_CT: { iTeam = 0; } case CS_TEAM_T: { iTeam = 1; } default: { iTeam = -1; } } if(iTeam != -1) { iRandom = GetRandomInt(0, iCount[iTeam]); while(!IsClientInGame(iRandom)) { iRandom = GetRandomInt(0, iCount[iTeam]); } if(iTeam == 0) { TeleportEntity(iClient, g_fPosCT[iRandom], NULL_VECTOR, NULL_VECTOR); } else { TeleportEntity(iClient, g_fPosT[iRandom], NULL_VECTOR, NULL_VECTOR); } } }
А ты делаешь прекеш звука?
public OnMapStart()
{
PrecacheSound("buttons/bell1.wav");
}