Различные примеры простых кодов для новичков в Source Pawn

Тема в разделе "Программирование / Скриптинг", создана пользователем Satan, 7 дек 2011.

?

Узнали ли вы что либо новое для себя?

  1. Нет

    21,8%
  2. Да

    78,2%
  1. Satan

    Satan

    Сообщения:
    162
    Симпатии:
    338
    По настроению буду здесь выкладывать простые примеры для новичков в Source Pawn.



    Это полезно в первую очередь для новичков!
    Для "продвинутых" юзеров на мой взгляд пост не актуален


    Пример №1 : Плагин для добавления возможности играть только за КТ

    Исходник:
    PHP:
    /**
        Данный скрип является ознакомительным;
        
        Обновления и т.д. не будет;
        
        За возможные варианты обхода не несу ответственности;
        
        Можете использовать любую часть кода в своих целях.
        
        P.s. Если есть какие то ошибки, извиняйте. Писал за 3 минуты :)
        
        P.s.s. Оптимальнее отлавливать не player_spawn а player_team ... но это уже в другой раз 
        
    **/

    // include
    #include <sourcemod>
    #include <cstrike>


    // Информация о авторе плагина
    public Plugin:myinfo =
    {
        
    name     =     "",
        
    author     =    "",
        
    version =     "1.0"
    };

    public 
    OnPluginStart()
    {
        
    // Регистрация момента попытки перехода в другую команду
        
    AddCommandListener(ChooseTeam"jointeam");
        
    //  Отлов события "ВОЗРОЖДЕНИЕ ИГРОКА"
        
    HookEvent("player_spawn",         OnPlayerSpawn);
    }


    // Действие при при переходе
    public Action:ChooseTeam(client, const String:command[], args)  
    {
        if (
    client == 0)
            return 
    Plugin_Continue;
        
        
    decl String:teamString[3];
        
    GetCmdArg(1teamStringsizeof(teamString));
        new 
    Target_Team StringToInt(teamString);
        
        
    // Предотвращение выбора команды Т
        
    if (Target_Team == CS_TEAM_T)
        {
            
    // Сообщение игроку в Hint [Область подсказок]
            
    PrintHintText(client"Вы можете играть только за КТ!" );
            
    // Сообщение игроку в чате
            
    PrintToChat(client"\x05[SM]\x04 Можно играть только за КТ");
            
    // Повторное открытие панели выбора команды
            
    ShowVGUIPanel(client"team");
            return 
    Plugin_Handled;
        }
        return 
    Plugin_Continue
    }


    // Событие респауна игрока
    public Action:OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    // Узнаем id игрока на сервере
        
    new client GetClientOfUserId(GetEventInt(event"userid"));

         
        
    // Проверяем клиента:
        // !IsFakeClient - клиент не должен быть ботом
        // GetClientTeam(client) == CS_TEAM_T  - Команда клиента должна быть Т
        
    if (!IsFakeClient(client) && GetClientTeam(client) == CS_TEAM_T)
        {
            
    // Меняем команду клиенту с Т на КТ
            
    CS_SwitchTeam(clientCS_TEAM_CT);
            
    // Возрождаем клинта
            
    CS_RespawnPlayer(client);
            
    // Выводим в чат сообщение для клиента
            
    PrintToChat(client"\x05[SM]\x04 Вы были автоматический перенесены в команду КТ.");
        }
        return 
    Plugin_Continue;
    }


    Пример №2 "Отлов" события "РАУНД СТАРТ", вывод текста всем игрокам в чат при этом событии. Открытие вашего сайта в окне motd игроку, который ввел некую команду в чат


    Исходник:
    PHP:
    // include
    #include <sourcemod>
    #include <cstrike>


    public OnPluginStart()
    {
        
    // Отлов события РАУНД СТАРТ
        
    HookEvent("round_start",         OnRoundStart);
        
        
    // Регистрация консольной команды (+ чат команды)
        
    RegConsoleCmd("hlmod"CommandSay);
    }


    // Событие РАУД СТАРТ
    public Action:OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    // В начале каждого раунда выводим в чат всем игрокам сообщение
        
    PrintToChatAll("\x05[SM] \x04Напишите в чате \x03!hlmod\x04, чтобы посетить наш сайт");
    }

    // Действие при отлове команды
    public Action:CommandSay(clientargs
    {
        
    // Открываем окно motd, и отображаем там сайт
        
    ShowMOTDPanel(client,"Сообщество администраторов игровых серверов""http://hlmod.ru/"MOTDPANEL_TYPE_URL);
        
    // Возвращаем остановку плагина (Чтобы не писало в консоли unknown command)
        
    return Plugin_Handled;
    }
      


    Пример №3 "Отлов" события "ВОЗРОЖДЕНИЕ ИГРОКА", Удаление всего оружия у игрока через 1.0 сек после данного события
    P.s Полезен сам stock RemoveAllWeapons

    Исходник:
    PHP:
     /**
        1)    Данный образец плагина удаляет у всех игроков ВСЕ оружие через 1.0 секунду после возрождения
        
        2)    Вы можете использовать stock Remove All Weapons в других событиях и условиях.
        
        2)    Этот образец НЕ предотвращает покупку и поднятие оружия. 
            Т.е. если на карте есть оружие или зона закупки игроки смогут купить себе оружие
    **/

    // include
    #include <sourcemod>
    #include <sdktools>
    #include <sdkhooks>

    public OnPluginStart()
    {
        
    //    Отлов события ВОЗРОЖДЕНИЕ ИГРОКА
        
    HookEvent("player_spawn"OnPlayerSpawn);
    }


    //    Событие спавна игрока
    public OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast
    {
        
    //    Узнаем id игрока на сервере
        
    new client GetClientOfUserId(GetEventInt(event"userid"));
        
        
    // Запускаем таймер для клиента (в 1.0 сек)
        
    CreateTimer(1.0TimerPlayerSpawnclient);
    }


    // Действие при срабатывании таймера 
    public Action:TimerPlayerSpawn(Handle:timerany:client)
    {    
        
    //    Проверяем игрока:
        // IsClientInGame(client) - Клиент должен быть в игре
        // IsPlayerAlive(client) - клиент должен быть жив
        // && -оба условия должны выполняться
        
    if (IsClientInGame(client) && IsPlayerAlive(client))
        {
            
    // Выполняем на клиенте stock RemoveAllWeapons
            
    RemoveAllWeapons(client);
            
            
    // Проверка игрока:
            // !IsFakeClient(client) - клиент НЕ должен быть ботом
            
    if (!IsFakeClient(client))
                
    // Если клиент не бот, то выводим ему текст в чат
                
    PrintToChat(client"\x05[SM]\x04 Все ваше оружие было удалено.");
        }
    }


    // С stock сами разбирайтесь :)
    stock RemoveAllWeapons(client
    {
        
        if(!
    IsClientInGame(client) || !IsPlayerAlive(client) || !Client_IsPlayer(client) || !IsValidEdict(client))
            return -
    1;
        
        new 
    String:clientNetClass[64];
        
        if(!
    GetEntityNetClass(client,clientNetClass,sizeof(clientNetClass))){
            return -
    1;
        }
        
        new 
    offset_PlayerWeapons FindSendPropOffs(clientNetClass"m_hMyWeapons");
        
        if(
    offset_PlayerWeapons == -1){
            
    LogError("[SMLIB] Error: Can't get m_hMyWeapons from client '%N' clientindex: %d offset: %d. Wrong playernetclass? PlayerNetClass is: %s",client,offset_PlayerWeapons,clientNetClass);
            return -
    1;
        }
        
        new 
    entity;
        new 
    removedweapons 0;
        new 
    bool:success;
        
        for (new 
    offset=0;offset<128;offset+=4){
            
            
    entity GetEntDataEnt2(clientoffset_PlayerWeapons+offset);
            
            if (
    IsValidEdict(entity) && IsValidEntity(entity)){
                
                
    success RemovePlayerItem(client,entity);
                if(!
    success){continue;}
                
    RemoveEdict(entity);
                
    removedweapons++;
            }
        }
        
        return 
    removedweapons;
    }

    stock bool:Client_IsPlayer(entity
    {
        
        if (
    entity GetMaxEntities()) 
        {
            
    entity EntRefToEntIndex(entity);
        }

        if (
    entity >= && entity <= MaxClients) {
            if (
    IsValidEntity(entity) && IsClientInGame(entity)) 
            {
                return 
    true;
            }
        }
        
        return 
    false;


    Пример №4 "Отлов" события "СМЕРТЬ ИГРОКА", Вывод сообщения игроку которого убили с ником его убийцы из файла перевода
    P.s Описание к коду завтра дополню ибо щас ухожу.


    Исходник:
    PHP:
    //     include
    #include <sourcemod>
    #include <sdktools>



    public OnPluginStart() 
    {
        
    //    Отлов события СМЕРТЬ ИГРОКА        ( EventHookMode_Post означает, что событие сработает с задержкой, а не одновременно со смертью игрока )
        
    HookEvent("player_death"OnPlayerDeathEventHookMode_Post);
        
        
    // Загружаем файл перевода (в кавычках его название без расширения .txt)
        
    LoadTranslations("test.phrases");
    }


    //    Событие СМЕРТЬ ИГРОКА
    public Action:OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    //    Узнаем id игрока, которого убили, на сервере
        
    new victim   =     GetClientOfUserId(GetEventInt(event"userid"));
        
        
    //    Узнаем id игрока на сервере который убил
        
    new client      =     GetClientOfUserId(GetEventInt(event"attacker"));
        
        
    // Проверяем индекс клиента
        
    if (!(client != victim && client != 0))
            return 
    Plugin_Continue;
            
            
        
    //    Получаем ник игрока
        
    decl String:Name[32];
        
    GetClientName(clientNamesizeof(Name));
        
        
    //    Выводим сообщение игроку, которого убили, о том, кто его убил
        //    victim - выводим сообщение игроку КОТОРОГО убили

        
    PrintToChat(victim"\x05[SM]\x04 %t %s""TEST"Name);
        
        
    // Возвращаем продолжение работы плагина
        
    return Plugin_Continue;
    }
    Содержимое test.phrases.txt

    PHP:
    "Phrases"
    {
        
    "TEST"
        
    {
            
    "en"            "you killed a player:"
            "ru"            "Вас убил игрок:"
        
    }
    }


    P.S. Уважайте чужое время и труд.

    Данные коды являются примерами. Если вы обнаружите ошибки просьба сообщить о них в комментариях
     

    Вложения:

    • Lock_T_team.sp
      Размер файла:
      2,8 КБ
      Просмотров:
      10
    • Motd.sp
      Размер файла:
      1,1 КБ
      Просмотров:
      19
    • AllWeaponRemove.sp
      Размер файла:
      3,5 КБ
      Просмотров:
      13
    • PrintToChat.zip
      Размер файла:
      3,1 КБ
      Просмотров:
      23
    Последнее редактирование: 15 дек 2011
    KrasPvP, rotmir, zig_ro и 20 другим нравится это.
  2. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Re: Пример кода для предотвращения перехода в какую либо команду

    Молодец, плюс за старания. Лови критику ;)

    Замечания:
    1) Выделение памяти под g_bEnabled, когда она по сути не юзается.
    2) Смотри логику:
    Событие player_spawn вызывается когда? При "оживании" игрока. Зачем проверка на не "мертвость"? Да, есть прикол у сорс движка, что при заходе на серв евент тоже вызывается. Но ведь ты позже жестко проверяешь команду игрока. Так что эта проверка - лишняя операция.
    3) Да, я понимаю, в официальном вики примеры по отлавливанию команд написаны с помощью RegConsoleCmd. Но все же форум тоже нужно почитывать. Для отлова уже существующих команд лучше использовать AddCommandListener, который, в отличии от RegConsoleCmd, создает легкий хук на команду, а не фактически регистрирует ее заново.
    Пруф линки на AddCommandListener:
    Так называемые Tips'n'Tricks
    AddCommandListener в API
    Callback для AddCommandLstener
     
    Besenok_Kid, Andrey, NagarD и ещё 1-му нравится это.
  3. Satan

    Satan

    Сообщения:
    162
    Симпатии:
    338
    Re: Пример кода для предотвращения перехода в какую либо команду

    S1deX

    Убрал

    Просмотрел, исправил.

    Заменил

    Спасибо за подсказки
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Такс.. почистил тему от старых и не нужных постов. Пожалуй апну её, а по возможности буду обновлять.
    "Новички", напишите примеры чего написать.
     
  5. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.194
    Симпатии:
    427
    R1KO, работу с methodmap напиши :)
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Ок. еще пару предложений будет и напишу сразу все.