Форум Pawn.Wiki - Воплоти мечту в реальность!: Убираем флуд на пикапах - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Scr ][ All ]
Убираем флуд на пикапах
Оценка: -----

#1
Пользователь офлайн   Olegsuper1 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Часто когда вы создаете пикап с каким-то действием например показ диалога, то он работает не так как вам хотелось бы. Ведь когда на него встаешь то выводится диалоговое окно и даже если его закрыть то он снова выводится до тех пор пока игрок не сойдет полностью с пикапа. Здесь я покажу вам как этого избежать Приступим.
В самый вверх мода ко всем переменным добавим это:

new Float:x[MAX_PLAYERS];
new Float:y[MAX_PLAYERS];
new Float:z[MAX_PLAYERS];
new timer[MAX_PLAYERS];
new bool:dialog[MAX_PLAYERS] = false;

[MAX_PLAYERS] - Делает переменную индивидуальной для каждого игрока, то есть у каждого игрока она разная.
И ко всем forward добавляем:

forward FloodStop(playerid);

Эти переменные нам вскоре очень пригодятся.
Теперь переходим к нашим пикапам, ищем public OnPlayerPickUpPickup и ищем ваш пикап, который нужно оградить от флуда. Для примера приведу этот:

if(pickupid == pickup[0]) // pickup[0] - раннее созданный мною пикап, в вашем случаи он будет другой.
{
          SetPlayerHealth(playerid, 100); // даем игроку 100 хп
          SendClientMessage(playerid, COLOR_WHITE, "Здоровье пополнено."); // Выводим игроку в чат сообщение
}

Изменяем на это:
if(pickupid == pickup[0] && dialog[playerid] == false)
{
          SetPlayerHealth(playerid, 100); // даем игроку 100 хп
          SendClientMessage(playerid, COLOR_WHITE, "Здоровье пополнено.");
          dialog[playerid] = true; // пока эта переменная будет равна true  пикап не откроется снова
          GetPlayerPos(playerid, x[playerid],y[playerid],z[playerid]); // узнаем свои координаты и раз мы стоим на пикапе, то и координаты пикапа
          timer[playerid] = SetTimer("FloodStop", 1000, true); // запускаем таймер проверки координат
}

Теперь идем в самый низ и вставляем туда:
public FloodStop(playerid)
{
        if(!IsPlayerInRangeOfPoint(playerid, 2.0, x[playerid],y[playerid],z[playerid])) /// проверяем координаты игрока и если игрок не находится в координатах пикапа то:
        {
        dialog[playerid] = false; // разрешаем снова воспроизводить сценарий пикапа
        KillTimer(timer[playerid]); // убиваем таймер
        }
}

Все готово! Теперь если вам нужно убрать флуд с пикапа то просто к условию добавляем:
dialog[playerid] == false

И в конец сценария пикапа это:
dialog[playerid] = true;
GetPlayerPos(playerid, x[playerid],y[playerid],z[playerid]);
timer[playerid] = SetTimer("FloodStop", 1000, true);

Если что-то не понятно спрашивайте.
Автор: Olegsuper1
1

#2
Пользователь офлайн   Zerg 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
Можно намного проще, в 3 строки

Ко всем new:
new timepickup[MAX_PLAYERS];


В "public OnPlayerPickupPickup"

В начало, сразу после "if(pickupid == ...)" ставим:


if(timepickup[playerid] > gettime()) return true;
timepickup[playerid] = gettime() + 4; // 4 - задержка в секундах

1

#3
Пользователь офлайн   Detector-Nubov 

  • Местный
  • Вставить ник
  • Раскрыть информацию
А я для пикапов с показами диалога делаю телепорт на метр в сторону и не флудит :smile:
2

#4
Пользователь офлайн   Olegsuper1 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияZerg (11 января 2014 - 10:48) писал:

Можно намного проще, в 3 строки

Ко всем new:
new timepickup[MAX_PLAYERS];


В "public OnPlayerPickupPickup"

В начало, сразу после "if(pickupid == ...)" ставим:


if(timepickup[playerid] > gettime()) return true;
timepickup[playerid] = gettime() + 4; // 4 - задержка в секундах


Твой способ намного удобней, а мой к сожеленью оказывается совсем не рабочим, т.к если на сервере более 1 человека то он работал не правильно.

Тут нельзя чтоли отредактировать первый пост? Печаль беда, тогда тему можно DELETE. Пересоздам как нибудь с другим способом(Не как у Zerg, не много другой но такой же короткий)
0

#5
Пользователь офлайн   Free 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Все готово! Теперь если вам нужно убрать флуд с пикапа то просто к условию добавляем:
dialog[playerid] == false

И в конец сценария пикапа это:
dialog[playerid] = true;
GetPlayerPos(playerid, x[playerid],y[playerid],z[playerid]);
timer[playerid] = SetTimer("FloodStop", 1000, true);

Если что-то не понятно спрашивайте.
Автор: Olegsuper1
[/quote]

Всё это куда?

Просмотр сообщенияFree (10 мая 2014 - 22:04) писал:

Все готово! Теперь если вам нужно убрать флуд с пикапа то просто к условию добавляем:
dialog[playerid] == false

И в конец сценария пикапа это:
dialog[playerid] = true;
GetPlayerPos(playerid, x[playerid],y[playerid],z[playerid]);
timer[playerid] = SetTimer("FloodStop", 1000, true);

Если что-то не понятно спрашивайте.
Автор: Olegsuper1

Всё это куда?


А, разобрался, спасибо!
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика