Написание плагинов

Wans

Участник
Сообщения
6
Реакции
2
Подскажите код, хочу сделать что бы когда игрок получал подарок в конце карты shop ball, его убивало
 

Truyn

King of clowns
Сообщения
1,591
Реакции
749
@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];
}
Твой вариант самолетик вроде рабочий.

Ребят,Grey83 и Samoletik1337. Можно ли сделать чтобы +left к примеру не работало а +right работало.
Мне надо именно вот одно из них заблокировать.

И вопрос по +jump можно ли как то заблокировать чтобы обычный прыжок работал а +jump нет?Нужно для сервера zombie чтобы на колесико не могли биндить +jump
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
какая игра, какая версия SM? Должно блочить на SM1.7+
чтобы обычный прыжок работал а +jump нет
+jump это и есть обычный прыжок (сам посмотри в клиенте по пути ...\cfg\config.cfg), разве что можно сделать кулдаун на использование команды, чтобы не срабатывало чаще, чем пропишешь в конфиге
Можно ли сделать чтобы +left к примеру не работало а +right работало.
можно: просто удаляешь проверку buttons & IN_LEFT
 

Truyn

King of clowns
Сообщения
1,591
Реакции
749
какая игра, какая версия SM? Должно блочить на SM1.7+
+jump это и есть обычный прыжок (сам посмотри в клиенте по пути ...\cfg\config.cfg), разве что можно сделать кулдаун на использование команды, чтобы не срабатывало чаще, чем пропишешь в конфигеможно: просто удаляешь проверку buttons & IN_LEFT
csgo,sm 1.9
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
Напишите пожалуйста пример добавления/уменьшения урона для админа (по админу), пример :

Админ с флагом Z наносит урон по игроку и он умножается (урон 100 * 1.5 = 150)
Игрок наносит урон по админу с флагом Z то урон делиться (урон 100 / 1.5 = 66.666666)

Игра [csgo], спасибо.
 

41kg

Участник
Сообщения
165
Реакции
24
Напишите пожалуйста пример добавления/уменьшения урона для админа (по админу), пример :

Админ с флагом Z наносит урон по игроку и он умножается (урон 100 * 1.5 = 150)
Игрок наносит урон по админу с флагом Z то урон делиться (урон 100 / 1.5 = 66.666666)

Игра [csgo], спасибо.
Если стоит випка риковская, то там есть модуль, которые позволяет настроить наносимый, и входящий урон.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Ровный Кент,
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;
}
--- Добавлено позже ---
Если нужно именно с флагом, то ещё нужно добавить проверку на флаг
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
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" все перебивает...
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Появляется проблема, (если стоят плагины типа round end sound) :

Последнему игроку убившего врага не воспроизводиться музыка. как будто "play %s" все перебивает...
PHP:
#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;
}
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
скорей всего так и есть

PHP:
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;
}
--- Добавлено позже ---
Если нужно именно с флагом, то ещё нужно добавить проверку на флаг

Появляются ошибки :

PHP:
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
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Ровный Кент, тогда поправь проверку индекса 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
 
Последнее редактирование:

Mr.Black

Участник
Сообщения
145
Реакции
61
Привет. Помогите, пожалуйста, пытаюсь сделать телепорт игрока по команде на одну из точек спавна его команды. Но пока спавнит либо криво (в центр карты) либо спавнит в одну и туже точку. Подскажите, что я делаю не так.
Как я пытаюсь это сделать:
При спавне беру координаты тимейтов, сохраняю. И когда кто-то пишет команду отправляют на координаты (не понятно как отправить на рандомные координаты и в какой момент делать проверку на команду игрока(т или кт))
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;
}
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
@Ровный Кент, тогда поправь проверку индекса 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

Чтот у меня не как не хочет воспроизводиться :

PHP:
EmitSoundToClient(attacker, "/buttons/bell1.wav", SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_RAIDSIREN, SND_NOFLAGS, 90.0);

либо

PHP:
EmitSoundToClient(attacker, " */buttons/bell1.wav", SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_RAIDSIREN, SND_NOFLAGS, 90.0);

пример :

PHP:
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);
    }
}

если что g_bEnabled = enabled

сам звук в .vpk лежит (то есть он изначально есть в игре а не какая то моя левая mp3).

а вот :
PHP:
ClientCommand(attacker, "play */buttons/bell1.wav");

работает но как я выше писал он перебивает... mp3 музыку в конце...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Ровный Кент, а слэш в начале пути убрать не пробовал?
--- Добавлено позже ---
@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

Участник
Сообщения
145
Реакции
61
@Ровный Кент, а слэш в начале пути убрать не пробовал?
--- Добавлено позже ---
@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;
}
Телепортирует в стену, а не на точку спавна.
 

Ровный Кент

Участник
Сообщения
703
Реакции
121
@Ровный Кент, а слэш в начале пути убрать не пробовал?
--- Добавлено позже ---
@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;
}

слеш убирал даже пробовал "sound/buttons/bell1.wav" все равно ничего не воспроизводит....
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Привет. Помогите, пожалуйста, пытаюсь сделать телепорт игрока по команде на одну из точек спавна его команды. Но пока спавнит либо криво (в центр карты) либо спавнит в одну и туже точку. Подскажите, что я делаю не так.
Как я пытаюсь это сделать:
При спавне беру координаты тимейтов, сохраняю. И когда кто-то пишет команду отправляют на координаты (не понятно как отправить на рандомные координаты и в какой момент делать проверку на команду игрока(т или кт))
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;
}
Что то ты не внимательный...
Как минимум так должно быть

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);
        }
    }
}
--- Добавлено позже ---
слеш убирал даже пробовал "sound/buttons/bell1.wav" все равно ничего не воспроизводит....
А ты делаешь прекеш звука?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Mr.Black, вот так должно телепортировать на случайный спавн своей команды (если кто-то будет AFK на спавне возможно застревание друг в друге):
PHP:
#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/buttons/bell1.wav"
sound/ в пути не нужен
 
Последнее редактирование:

Ровный Кент

Участник
Сообщения
703
Реакции
121
Что то ты не внимательный...
Как минимум так должно быть

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);
        }
    }
}
--- Добавлено позже ---

А ты делаешь прекеш звука?

PHP:
public OnMapStart() 
{ 
    PrecacheSound("buttons/bell1.wav"); 
}

все равно не играет.
 
Сверху Снизу