Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20
  1. #1
    Аватар для Alanchick
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.01.2016
    Сообщений
    15
    Репутация:
    9 ±

    SetPlayerTimeSkin - скин на время

    Доброго времени суток, Ув. пользователи Pro-Pawn.Ru!
    На досуге пришла идея реализовать функцию, которая будет выдавать скин игроку на время.
    Собственно, не долго думая, я решил это сделать.

    SetPlayerTimeSkin(playerid, skinid, time);
    playerid - id игрока;
    skinid - id скина;
    time - время(в секундах);

    Код функции:
      Открыть/закрыть

    PHP код:
    stock SetPlayerTimeSkin(playeridskintime)
    {
        
    // умножаем time на 1000, т.е.
        // переводим в секунды
        
    time time*1000;
        
    // в переменную old_skin записываем
        // нынешний id скина (дабы его потом вернуть игроку)
        
    new old_skin GetPlayerSkin(playerid);
        
    // таймер
        
    SetTimerEx("OnTimeToSkinFinished"timefalse"ii"playeridold_skin);
        
    // в итоге выдаем указанному игроку
        // указанный скин
        
    return SetPlayerSkin(playeridskin);
    }

    forward OnTimeToSkinFinished(playeridold_skin);
    public 
    OnTimeToSkinFinished(playeridold_skin)
    {
        
    // спустя указанное время - возвращаем
        // игроку старый скин
        
    SetPlayerSkin(playeridold_skin);


    Пример использования (команда /setskin):
      Открыть/закрыть

    PHP код:
    CMD:setskin(playeridparams[])
    {
        new 
    targetid// переменная ID игрока
            
    skin,     // переменная ID нового скина
            
    time;     // переменная времени
        // если не введен один из параметров - выводится текст
        
    if(sscanf(params"ddd"targetidskintime))
            return 
    SendClientMessage(playerid, -1,
            !
    "Введите: /setskin [ID игрока] [ID скина] [время в секундах]");
        
    // в итоге выдаем указанному игроку указанный скин на указанное время.
        
    SetPlayerTimeSkin(targetidskintime);
        return 
    true;



    Жду адекватной критики.
    Автор: Alanchick.
    Большое спасибо за помощь в реализации: Untonyst.
    Последний раз редактировалось Alanchick; 25.04.2016 в 22:07.
    Команды:
    [CMD]/byplayer
    [CMD] /virtmir
    [CMD] /hp
    Функции:
    [FUNCTION] SetPlayerTimeSkin

    Код:
    Хочешь спрятать дерево — спрячь его в лесу // Конан Дойл, «Записки о Шерлоке Холмсе»

  2. #2
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    PHP код:
    stock SetPlayerTempSkin(playeridskintime
    {  
        
    // таймер 
        
    SetTimerEx("OnTimeToSkinFinished"time*1000false"ii"playeridGetPlayerSkin(playerid)); 
        return 
    SetPlayerSkin(playeridskin); 

    заменил time, на сокращенное temporary (временный)

  3. #3
    Аватар для Alanchick
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.01.2016
    Сообщений
    15
    Репутация:
    9 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    PHP код:
    stock SetPlayerTempSkin(playeridskintime
    {  
        
    // таймер 
        
    SetTimerEx("OnTimeToSkinFinished"time*1000false"ii"playeridGetPlayerSkin(playerid)); 
        return 
    SetPlayerSkin(playeridskin); 

    заменил time, на сокращенное temporary (временный)
    По поводу самой функции что можешь сказать?
    Команды:
    [CMD]/byplayer
    [CMD] /virtmir
    [CMD] /hp
    Функции:
    [FUNCTION] SetPlayerTimeSkin

    Код:
    Хочешь спрятать дерево — спрячь его в лесу // Конан Дойл, «Записки о Шерлоке Холмсе»

  4. #4
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    SetPlayerSkin(playerid, skinid, time);
    playerid - id игрока;
    skinid - id скина;
    time - время(в секундах);
    поменяй вот здесь вот название стандартной функции на свою.

  5. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Смысла в объявлении переменной old_skin нет. Ты используешь функцию один раз.

  6. #6
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±
    А что если так:
    У игрока до смены скина с помощью /setskin был ид 73, а затем после /setskin купил другой скин (ид 99), а затем ему дали снова новый скин через /setskin.

    По этому предлагаю:
    PHP код:
    /*
    Пример использования:
    CMD:setskin(playerid, params[])
    {
        new targetid, // переменная ID игрока
            skin,     // переменная ID нового скина
            time;     // переменная времени
        // если не введен один из параметров - выводится текст
        if(sscanf(params, "ddd", targetid, skin, time))
            return SendClientMessage(playerid, -1,
            !"Введите: /setskin [ID игрока] [ID скина] [время в секундах]");
        // в итоге выдаем указанному игроку указанный скин на указанное время.
        SetPlayerSkin(targetid, skin, time);
        return true;
    }
    */
    new timerskins[MAX_PLAYERS];

    stock SetPlayerTimeSkin(playeridskintime 0)
    {
        if(!(
    <= playerid <= MAX_PLAYERS))
            return 
    1;
        if(
    == IsPlayerConnected(playerid))
            return 
    1;
        if(
    time != 0)
        {
            if(
    timerskins[playerid] != -2)
                
    KillTimer(timerskins[playerid]);
            
    timerskins SetTimerEx("OnTimeToSkinFinished"time 1000false"ii"playeridskin);
            
    SetPlayerSkin(playeridskin);
        }
        
    SetPlayerSkin(playeridskin);

        return 
    1;
    }
    #if defined _ALS_SetPlayerSkin // Перехватчик
    #undef SetPlayerSkin
    #else
    #define SetPlayerTimeSkin
    #endif
    #define SetPlayerSkin SetPlayerTimeSkin

    public OnPlayerConnect(playerid)
    {
        
    timerskins[playerid] = -2;
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playerid)
    {
        
    timerskins[playerid] = -2;
        return 
    1;
    }

    forward OnTimeToSkinFinished(playeridold_skin);
    public 
    OnTimeToSkinFinished(playeridold_skin)
    {
        if(
    == IsPlayerConnected(playerid))
            return 
    1;
        
    SetPlayerSkin(playeridold_skin);
        return 
    1;

    Последний раз редактировалось Иван Бубнов; 26.04.2016 в 18:22. Причина: поправил пример использования (SetPlayerSkin)

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
        // умножаем time на 1000, т.е.
        // переводим в секунды
        
    time time*1000;
        
    // в переменную old_skin записываем
        // нынешний id скина (дабы его потом вернуть игроку)
        
    new old_skin GetPlayerSkin(playerid); 
     Один вопрос
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #8
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
        // умножаем time на 1000, т.е.
        // переводим в секунды
        
    time time*1000;
        
    // в переменную old_skin записываем
        // нынешний id скина (дабы его потом вернуть игроку)
        
    new old_skin GetPlayerSkin(playerid); 
     Один вопрос
    Что зачем? Время переводить, или скин запоминать?
    Первое, очевидно, для удобства. Нет смысла ставить скин на 200 мс. А без второго это работать не будет. Если конечно не имеется в виду объявление переменной, но про это уже написали.

    Дополню:
    Цитата Сообщение от Иван Бубнов Посмотреть сообщение
    А что если так:
    У игрока до смены скина с помощью /setskin был ид 73, а затем после /setskin купил другой скин (ид 99), а затем ему дали снова новый скин через /setskin.

    По этому предлагаю:
    PHP код:
    /*
    Пример использования:
    CMD:setskin(playerid, params[])
    {
        new targetid, // переменная ID игрока
            skin,     // переменная ID нового скина
            time;     // переменная времени
        // если не введен один из параметров - выводится текст
        if(sscanf(params, "ddd", targetid, skin, time))
            return SendClientMessage(playerid, -1,
            !"Введите: /setskin [ID игрока] [ID скина] [время в секундах]");
        // в итоге выдаем указанному игроку указанный скин на указанное время.
        SetPlayerSkin(targetid, skin, time);
        return true;
    }
    */
    new timerskins[MAX_PLAYERS];

    stock SetPlayerTimeSkin(playeridskintime 0)
    {
        if(
    time == 0)
        {
            if(
    timerskins[playerid] != 0)
                
    KillTimer(timerskins[playerid]);
            
    timerskins SetTimerEx("OnTimeToSkinFinished"time 1000false"ii"playeridskin);
            
    SetPlayerSkin(playeridskin);
        }
        
    SetPlayerSkin(playeridskin);
        return 
    1;
    }
    #if defined _ALS_SetPlayerSkin // Перехватчик
    #undef SetPlayerSkin
    #else
    #define SetPlayerTimeSkin
    #endif
    #define SetPlayerSkin SetPlayerTimeSkin

    public OnPlayerConnect(playerid)
    {
        
    timerskins[playerid] = 0;
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playerid)
    {
        
    timerskins[playerid] = 0;
        return 
    1;
    }

    forward OnTimeToSkinFinished(playeridold_skin);
    public 
    OnTimeToSkinFinished(playeridold_skin)
    {
        if(
    == IsPlayerConnected(playerid))
            return 
    1;
        
    SetPlayerSkin(playeridold_skin);
        return 
    1;

    Этот вариант вообще по моему не нужен, ибо должна существовать простая функция, которая будет ставить его без ограничений по времени. Да и к тому же, если ввести 0 в аргумент time, то это работать не будет вообще (скорее всего в проверке "time == 0" подразумевалось "time != 0").
    И да, таймеры начинаются с нуля, поэтому, ещё одно: массиву "timerskins" нужно присваивать -1 и сверять в "if(timerskins[playerid] != 0)" не с 0, а с -1.

    А, и ещё вдогонку. При создании функций, которые заменяют стандартные, проверяйте вводные данные (параметры) на валидность! Я же могу просто ввести, например, в качестве playerid'а 59869546 и хорошо от этого уже не будет.
    Последний раз редактировалось Nexius_Tailer; 26.04.2016 в 16:08.

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Что зачем? Время переводить, или скин запоминать?
    Первое, очевидно, для удобства. Нет смысла ставить скин на 200 мс. А без второго это работать не будет. Если конечно не имеется в виду объявление переменной, но про это уже написали.
    Как про переменную, так и про вынос перемножения в отдельное действие. Либо ты просто обращаешься к значению переменной и потом умножаешь это значение на 1000, либо ты сначала обращаешься к значению переменной, умножаешь его на 1000, сохраняешь и потом опять обращаешься к значению переменной... "Слышу звон, да не знаю где он"
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #10
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как про переменную, так и про вынос перемножения в отдельное действие. Либо ты просто обращаешься к значению переменной и потом умножаешь это значение на 1000, либо ты сначала обращаешься к значению переменной, умножаешь его на 1000, сохраняешь и потом опять обращаешься к значению переменной... "Слышу звон, да не знаю где он"
    Ну это мелочи уже. И поговорка здесь не к месту

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •