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

Реклама


   

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

    Статус
    Оффлайн
    Регистрация
    22.11.2016
    Сообщений
    23
    Репутация:
    2 ±

    Anti-Flood Пикапов

    Описание:
    1. Если игрок стоит на пикапе, повторно вызывать его не произойдет (Пока игрок не уйдет с пикапа).
    2. Если игрок телепортировался с пикапа на пикап, повторно вызова пикапа не произойдет,
    то есть (не будет телепортировать игрока с пикапа на пикап) принцип 1.

    Ко всем глобальным переменным
    PHP код:
    new
        
    pPickup_AntiFlood[MAX_PLAYERS],
        
    Float:pPickup_Pos[MAX_PLAYERS][3],
        
    bool:pPickup_Status[MAX_PLAYERS char]

    В public OnPlayerConnect(playerid)
    PHP код:
        pPickup_Status{playerid} = false
    В public OnPlayerPickUpPickup(playerid, pickupid) и public OnPlayerPickUpDynamicPickup(playerid, pickupid)
    PHP код:
        new gettimer gettime();
        if(
    pPickup_Status{playerid} && pPickup_AntiFlood[playerid] < gettimer) {
            if(!
    IsPlayerInRangeOfPoint(playerid,1.0,pPickup_Pos[playerid][0],pPickup_Pos[playerid][1],pPickup_Pos[playerid][2])) pPickup_Status{playerid} = false;
            
    GetPlayerPos(playerid,pPickup_Pos[playerid][0],pPickup_Pos[playerid][1],pPickup_Pos[playerid][2]);
        }
        if(
    pPickup_Status{playerid} || pPickup_AntiFlood[playerid] > gettimer) return 1;
        else {
            
    pPickup_Status{playerid} = true;
            
    pPickup_AntiFlood[playerid] = gettimer+2;
        } 
    Автор: Guldan
    Последний раз редактировалось Guldan; 01.01.2017 в 19:23.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,007
    Репутация:
    1202 ±
    Гораздо продуктивнее использовать IsPlayerInRangeOfPoint, нежели GetPlayerDistanceFromPoint.
    Во-первых, сама функция быстрее.
    Во-вторых, переменную лишнюю создавать не нужно (хотя и в твоём случае можно было обойтись без переменной)

    А вот gettime лучше записать в переменную

    - - - Добавлено - - -

    Я бы сделал как-то так (правда не проверял на работоспособность )
    PHP код:
    enum e_PICKUP_ANTIFLOOD_INFO
    {
        
    bool:pick_status[MAX_PLAYERS char],
        
    pick_time[MAX_PLAYERS],
        
    Float:pick_pos_x[MAX_PLAYERS],
        
    Float:pick_pos_y[MAX_PLAYERS],
        
    Float:pick_pos_z[MAX_PLAYERS]
    };
    new 
    pickup_antiflood[e_PICKUP_ANTIFLOOD_INFO];

    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////

    pickup_antiflood[pick_status]{playerid} = false
    pickup_antiflood[pick_time][playerid] = 0;
    pickup_antiflood[pick_pos_x][playerid] = 
    pickup_antiflood[pick_pos_y][playerid] = 
    pickup_antiflood[pick_pos_z][playerid] = 0.0

    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////

    if(pickup_antiflood[pick_status]{playerid})

        new 
    timestamp gettime();
        if(
    pickup_antiflood[pick_time][playerid] <= timestamp)
        {
            if(!
    IsPlayerInRangeOfPoint(playerid1.0pickup_antiflood[pick_pos_x][playerid], pickup_antiflood[pick_pos_y][playerid],pickup_antiflood[pick_pos_z][playerid])) 
            { 
                
    pickup_antiflood[pick_status]{playerid} = false
                
    pickup_antiflood[pick_time][playerid] = 0
            }
            else
            {
                
    pickup_antiflood[pick_status]{playerid} = true
                
    pickup_antiflood[pick_time][playerid] = timestamp+4
            }
            
    GetPlayerPos(playeridpickup_antiflood[pick_pos_x][playerid], pickup_antiflood[pick_pos_y][playerid], pickup_antiflood[pick_pos_z][playerid]); 
        }
        else
            return 
    1

    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    22.11.2016
    Сообщений
    23
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Гораздо продуктивнее использовать IsPlayerInRangeOfPoint, нежели GetPlayerDistanceFromPoint.
    Во-первых, сама функция быстрее.
    Во-вторых, переменную лишнюю создавать не нужно (хотя и в твоём случае можно было обойтись без переменной)

    А вот gettime лучше записать в переменную

    - - - Добавлено - - -

    Я бы сделал как-то так (правда не проверял на работоспособность )
    PHP код:
    enum e_PICKUP_ANTIFLOOD_INFO
    {
        
    bool:pick_status[MAX_PLAYERS char],
        
    pick_time[MAX_PLAYERS],
        
    Float:pick_pos_x[MAX_PLAYERS],
        
    Float:pick_pos_y[MAX_PLAYERS],
        
    Float:pick_pos_z[MAX_PLAYERS]
    };
    new 
    pickup_antiflood[e_PICKUP_ANTIFLOOD_INFO];

    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////

    pickup_antiflood[pick_status]{playerid} = false
    pickup_antiflood[pick_time][playerid] = 0;
    pickup_antiflood[pick_pos_x][playerid] = 
    pickup_antiflood[pick_pos_y][playerid] = 
    pickup_antiflood[pick_pos_z][playerid] = 0.0

    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////

    if(pickup_antiflood[pick_status]{playerid})

        new 
    timestamp gettime();
        if(
    pickup_antiflood[pick_time][playerid] <= timestamp)
        {
            if(!
    IsPlayerInRangeOfPoint(playerid1.0pickup_antiflood[pick_pos_x][playerid], pickup_antiflood[pick_pos_y][playerid],pickup_antiflood[pick_pos_z][playerid])) 
            { 
                
    pickup_antiflood[pick_status]{playerid} = false
                
    pickup_antiflood[pick_time][playerid] = 0
            }
            else
            {
                
    pickup_antiflood[pick_status]{playerid} = true
                
    pickup_antiflood[pick_time][playerid] = timestamp+4
            }
            
    GetPlayerPos(playeridpickup_antiflood[pick_pos_x][playerid], pickup_antiflood[pick_pos_y][playerid], pickup_antiflood[pick_pos_z][playerid]); 
        }
        else
            return 
    1

    В тупик загнал if(pickup_antiflood[pick_status]{playerid})

    - - - Добавлено - - -

    И мне кажется твой вариант будет флудить, к примеру если даже игрок телепортировался по пикапу вход/выход, он у тебя будет бесконечно телепортировать (с паузой)

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,007
    Репутация:
    1202 ±
    Хоть это и изобретение велосипеда, но вот ещё более упрощённый вариант



      Открыть/закрыть
    PHP код:
    enum e_PICKUP_ANTIFLOOD_INFO
    {
        
    pick_id,
        
    pick_freeztime
    };
    new 
    pickup_antiflood[MAX_PLAYERS][e_PICKUP_ANTIFLOOD_INFO]; 
    PHP код:
    public OnPlayerPickUpPickup(playeridpickupid)
    {
        new 
    timestamp gettime();
        if(
    pickup_antiflood[playerid][pick_id] == pickupid)
        {
            if(
    pickup_antiflood[playerid][pick_freeztime] > timestamp)
                return 
    1;
            else
                
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
        }
        else
        {
            
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
            
    pickup_antiflood[playerid][pick_id] = pickupid;
        }
        
    //Тут код пикапов
        
    return 1;



    Обнулять при входе ничего не нужно
    Последний раз редактировалось DeimoS; 23.11.2016 в 02:24.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  5. #5
    Аватар для Guldan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.11.2016
    Сообщений
    23
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хоть это и изобретение велосипеда, но вот ещё более упрощённый вариант



      Открыть/закрыть
    PHP код:
    enum e_PICKUP_ANTIFLOOD_INFO
    {
        
    pick_id,
        
    pick_freeztime
    };
    new 
    pickup_antiflood[MAX_PLAYERS][e_PICKUP_ANTIFLOOD_INFO]; 
    PHP код:
    public OnPlayerPickUpPickup(playeridpickupid)
    {
        new 
    timestamp gettime();
        if(
    pickup_antiflood[playerid][pick_id] == pickupid)
        {
            if(
    pickup_antiflood[playerid][pick_freeztime] > timestamp)
                return 
    1;
            else
                
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
        }
        else
        {
            
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
            
    pickup_antiflood[playerid][pick_id] = pickupid;
        }
        
    //Тут код пикапов
        
    return 1;



    Обнулять при входе ничего не нужно
    Жди флуда

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,007
    Репутация:
    1202 ±
    Цитата Сообщение от Guldan Посмотреть сообщение
    Жди флуда
    А если проверить код, а не писать сообщения от балды?
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  7. #7
    Аватар для Guldan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.11.2016
    Сообщений
    23
    Репутация:
    2 ±
    Тогда так, самый оптимальный вариант

    Ко всем глобальным переменным
    PHP код:
    new pPickup_Status[MAX_PLAYERS char];
    new 
    pPickup_PickupId[MAX_PLAYERS];
    new 
    pPickup_AntiFlood[MAX_PLAYERS]; 
    В public OnPlayerConnect(playerid)
    PHP код:
    pPickup_Status{playerid} = 0
    В public OnPlayerPickUpPickup(playerid, pickupid) и public OnPlayerPickUpDynamicPickup(playerid, pickupid)
    PHP код:
        new gtime gettime();
        if(
    pPickup_Status{playerid} && pPickup_AntiFlood[playerid] < gtime) {
            if(
    pPickup_PickupId[playerid] != pickupidpPickup_Status{playerid} = 0;
        }
        if(
    pPickup_Status{playerid} || pPickup_PickupId[playerid] == pickupid) return 1;
        else {
            
    pPickup_Status{playerid} = 1;
            
    pPickup_PickupId[playerid] = pickupid;
            
    pPickup_AntiFlood[playerid] = gtime+3
        } 

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,007
    Репутация:
    1202 ±
    Всё же проверь мой код и не изобретай велосипед с костылями
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  9. #9
    Аватар для Guldan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.11.2016
    Сообщений
    23
    Репутация:
    2 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Всё же проверь мой код и не изобретай велосипед с костылями
    Проверял, есть флуд

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,007
    Репутация:
    1202 ±
    Цитата Сообщение от Guldan Посмотреть сообщение
    Проверял, есть флуд
    Серьёзно? Что-то у меня флуда не видно :(

    PHP код:
    enum e_PICKUP_ANTIFLOOD_INFO
    {
        
    pick_id,
        
    pick_freeztime
    };
    new 
    pickup_antiflood[MAX_PLAYERS][e_PICKUP_ANTIFLOOD_INFO];  

    new 
    pick_test[2];
    public 
    OnGameModeInit()
    {
        
    pick_test[0] = CreatePickup(123912392.8389, -1530.118824.0000);
        
    pick_test[1] = CreatePickup(123912386.8389, -1530.118824.0000);
        return 
    1;
    }


    public 
    OnPlayerPickUpPickup(playeridpickupid)
    {
        new 
    timestamp gettime();
        if(
    pickup_antiflood[playerid][pick_id] == pickupid)
        {
            if(
    pickup_antiflood[playerid][pick_freeztime] > timestamp)
                return 
    SendClientMessage(playerid, -1"Антифлуд");
            else
                
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
        }
        else
        {
            
    pickup_antiflood[playerid][pick_freeztime] = timestamp 4
            
    pickup_antiflood[playerid][pick_id] = pickupid;
        }
        
    //Тут код пикапов

        
    if(pickupid == pick_test[0])
            
    SendClientMessage(playerid, -1"Сработал первый пикап");
        else if(
    pickupid == pick_test[1])
            
    SendClientMessage(playerid, -1"Сработал второй пикап");
        return 
    1;

     Screen
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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