Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20
  1. #1
    Аватар для Alanchick
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.01.2016
    Сообщений
    16
    Репутация:
    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
    Сообщений
    375
    Репутация:
    144 ±
    PHP код:
    stock SetPlayerTempSkin(playeridskintime
    {  
        
    // таймер 
        
    SetTimerEx("OnTimeToSkinFinished"time*1000false"ii"playeridGetPlayerSkin(playerid)); 
        return 
    SetPlayerSkin(playeridskin); 

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

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

    Статус
    Оффлайн
    Регистрация
    05.01.2016
    Сообщений
    16
    Репутация:
    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
    Сообщений
    375
    Репутация:
    144 ±
    SetPlayerSkin(playerid, skinid, time);
    playerid - id игрока;
    skinid - id скина;
    time - время(в секундах);
    поменяй вот здесь вот название стандартной функции на свою.

  5. #5
    Аватар для untonyst
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    664
    Репутация:
    234 ±
    Смысла в объявлении переменной old_skin нет. Ты используешь функцию один раз.
    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

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

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    PHP код:
        // умножаем time на 1000, т.е.
        // переводим в секунды
        
    time time*1000;
        
    // в переменную old_skin записываем
        // нынешний id скина (дабы его потом вернуть игроку)
        
    new old_skin GetPlayerSkin(playerid); 
     Один вопрос
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    346
    Репутация:
    106 ±
    Цитата Сообщение от 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Что зачем? Время переводить, или скин запоминать?
    Первое, очевидно, для удобства. Нет смысла ставить скин на 200 мс. А без второго это работать не будет. Если конечно не имеется в виду объявление переменной, но про это уже написали.
    Как про переменную, так и про вынос перемножения в отдельное действие. Либо ты просто обращаешься к значению переменной и потом умножаешь это значение на 1000, либо ты сначала обращаешься к значению переменной, умножаешь его на 1000, сохраняешь и потом опять обращаешься к значению переменной... "Слышу звон, да не знаю где он"
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

 

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

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

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

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

Ваши права

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