PDA

Просмотр полной версии : [Include] Pickup Stop Flood (Анти повторный подбора пикапов)



vasyok28
27.02.2017, 03:42
Описание: Инклюд предотвращает повторный вызов пикапа. Чтобы пикап повторно сработал нужно отойти от него на определенное расстояние. Инклюд в реализации довольно прост, любой скриптер сможет реализовать такую систему, данное решение скорей всего для новичков. Писал несколько месяцев назад, сегодня вспомнил про него и решил поделится.

Подключение:


После
#include <a_samp>
#include <streamer> (Не обязательно)

Добавить
#include <pickup_stop_flood>


Ссылки:
pastebin: тык (http://pastebin.com/X6SA0wpY)
yandex: тык (https://yadi.sk/d/2nt-cSul3EhcwC)

Важно: Этот фикс не вызывает пикап через определенное количество секунд, а срабатывает исключительно на определенное расстояние (расстояние можно менять в самом инклюде).

П.С Писал для себя, возможно где-то есть в интернете похожий принцип, тогда уж извините и снесите тему.

Guldan
27.02.2017, 10:56
static bool:sf__PlayerPickUp[MAX_PLAYERS char];
Вот интересно ты создал static bool:sf__PlayerPickUp[MAX_PLAYERS char]; как char
есть ли разница использовать его как sf__PlayerPickUp[playerid] = false; или же sf__PlayerPickUp{playerid} = false;


for(new i, p = GetPlayerPoolSize()+1; i < p; i++)
Чем for(new i, p = GetPlayerPoolSize()+1; i < p; i++) лучше этого for(new i, p = GetPlayerPoolSize(); i <= p; i++)
Ну да это мелочи, прост видел подобную ситуацию в уроках Кортеза


new Float:sf__p_x, Float:sf__p_y, Float:sf__p_z;
В таймере лучше уже static

И да не люблю нагружать мод лишними таймерами, за старание + конечно

DeimoS
27.02.2017, 12:55
Вот интересно ты создал static bool:sf__PlayerPickUp[MAX_PLAYERS char]; как char
есть ли разница использовать его как sf__PlayerPickUp[playerid] = false; или же sf__PlayerPickUp{playerid} = false;

Естественно есть. Найди на форуме статью о char и прочти. Там всё описано

vasyok28
27.02.2017, 13:19
1. Привык использовать bool+char исключительно только в иклюдах, и чтобы не словить переполнение массив, типа чтобы не превышать размер. Без разницы что использовать ([] или {})

2. Тут уже по привычки, в свое время читал как работают условие, может я не прав в данном случае, но я вижу твое условие как меньше или равно (< || ==) Две условие. (Но скорей всего моя привычка)

3. Насчет static не знаю, может быть, но все равно переменные будут видны только в теле цикла. Насчет таймеров тоже так думал, но это если запустить мод на калькуляторе, на крайняк можно и общий таймер засунуть проверку и поставить еще проверку на иклюду.

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

Хотя насчет [] и {} загнул, опечаточка получается в инклюде размер массив указал, а вот обращаюсь не к байтам массива, поправьте меня если я не прав

vovandolg
27.02.2017, 13:19
Без разницы что использовать ([] или {})

На сколько я знаю если ты "зачаровал" массив то и юзать его надо в дальнейшем через {} такие скобки,
по крайней мере будут косяки если не правильно скобки ставить(из личного опыта).
Так что есть разница.

Nexius_Tailer
27.02.2017, 17:25
Чем for(new i, p = GetPlayerPoolSize()+1; i < p; i++) лучше этого for(new i, p = GetPlayerPoolSize(); i <= p; i++)
Ну да это мелочи, прост видел подобную ситуацию в уроках Кортеза
Не особая разница. Лучше уже вообще вот так:

for(new i = GetPlayerPoolSize(); i != -1; --i)


По коду:


for(new i, p = GetPlayerPoolSize()+1; i < p; i++) // <-
{
if(!IsPlayerConnected(i) || sf__PlayerPickUp[i] == false) continue;

new Float:sf__p_x, Float:sf__p_y, Float:sf__p_z; // <-
Не надо так. Переменные будут создаваться и удаляться по началу и завершению каждой итерации, что в разы всё замедлит. Создавать их лучше до или в шапке цикла, пример:

for(new i, p = GetPlayerPoolSize()+1, Float:sf__p_x, Float:sf__p_y, Float:sf__p_z; i < p; i++) // <-
{
if(!IsPlayerConnected(i) || sf__PlayerPickUp[i] == false) continue;

//...

Вот это, как я понимаю, определение расстояния по x и y:

if(floatsqroot(floatadd(floatpower(sf__x[i]-sf__p_x, 2), floatpower(sf__y[i]-sf__p_y, 2))) > LossPickup)
Для этого давно есть готовая функция VectorSize:

if(VectorSize(sf__x[i] - sf__p_x, sf__y[i] - sf__p_y, 0.0) > LossPickup)

А так в целом неплохо, молодец)

vasyok28
27.02.2017, 18:13
Не особая разница. Лучше уже вообще вот так:

for(new i = GetPlayerPoolSize(); i != -1; --i)


По коду:


for(new i, p = GetPlayerPoolSize()+1; i < p; i++) // <-
{
if(!IsPlayerConnected(i) || sf__PlayerPickUp[i] == false) continue;

new Float:sf__p_x, Float:sf__p_y, Float:sf__p_z; // <-
Не надо так. Переменные будут создаваться и удаляться по началу и завершению каждой итерации, что в разы всё замедлит. Создавать их лучше до или в шапке цикла, пример:

for(new i, p = GetPlayerPoolSize()+1, Float:sf__p_x, Float:sf__p_y, Float:sf__p_z; i < p; i++) // <-
{
if(!IsPlayerConnected(i) || sf__PlayerPickUp[i] == false) continue;

//...

Вот это, как я понимаю, определение расстояния по x и y:

if(floatsqroot(floatadd(floatpower(sf__x[i]-sf__p_x, 2), floatpower(sf__y[i]-sf__p_y, 2))) > LossPickup)
Для этого давно есть готовая функция VectorSize:

if(VectorSize(sf__x[i] - sf__p_x, sf__y[i] - sf__p_y, 0.0) > LossPickup)

А так в целом неплохо, молодец)

Насчет переменных тупанул жестко) И про расстояние тоже) Пасиб

Guldan
27.02.2017, 22:47
Вася опыта наберется :pardon: с этого поста, не ну а как еще, часто вкладывайте свои работы, вас будут делать замечание, давать годные советы

DeimoS
28.02.2017, 10:09
Вася опыта наберется :pardon: с этого поста, не ну а как еще, часто вкладывайте свои работы, вас будут делать замечание, давать годные советы

Как ещё? Смотреть чужие темы и изучать советы, что давали там? А не забивать форум однотипными темами.
Это к слову о "часто выкладывайте свои работы". Выкладывать нужно лишь годное. Иначе рано или поздно вас просто пошлют, а ваши темы удалят, если они не будут иметь пользы и будут создаваться лишь для того, чтоб получить советы

Nexius_Tailer
28.02.2017, 14:24
Как ещё? Смотреть чужие темы и изучать советы, что давали там? А не забивать форум однотипными темами.
Это к слову о "часто выкладывайте свои работы". Выкладывать нужно лишь годное. Иначе рано или поздно вас просто пошлют, а ваши темы удалят, если они не будут иметь пользы и будут создаваться лишь для того, чтоб получить советы
Нигде не подписано самим автором, что он "сливает"/выкидывает (что в принципе одно и тоже) нам какую-то работу как мусор. Скорее всего это действительно имеет какой-то интерес для какой-то части пользователей. А не выкладывание тем и опыт лишь на чужих противоречит друг другу: не будет тем, не будет и материала, который можно изучать. Так что это как-бы звенья одной цепи.

DeimoS
28.02.2017, 16:56
Нигде не подписано самим автором, что он "сливает"/выкидывает (что в принципе одно и тоже) нам какую-то работу как мусор. Скорее всего это действительно имеет какой-то интерес для какой-то части пользователей. А не выкладывание тем и опыт лишь на чужих противоречит друг другу: не будет тем, не будет и материала, который можно изучать. Так что это как-бы звенья одной цепи.

Речь шла о том, что не стоит выкладывать вообще всё подряд. Представь, что сейчас каждый из новичков на форуме выложит свою версию антифлуда пикапов с целью услышать то, что можно было бы услышать зайдя, например, в эту тему. Кому от этого лучше станет? Никому.
Я призываю пользоваться поиском, прежде чем что-то выкладывать. Не стоит забывать, что этот форум создан не для того, чтоб обучить Pawn конкретного Васю Пупкина. Не превращайте этот форум в очередной p-i, где можно найти миллион нерабочих аналогов одной системы

vasyok28
28.02.2017, 17:47
Речь шла о том, что не стоит выкладывать вообще всё подряд. Представь, что сейчас каждый из новичков на форуме выложит свою версию антифлуда пикапов с целью услышать то, что можно было бы услышать зайдя, например, в эту тему. Кому от этого лучше станет? Никому.
Я призываю пользоваться поиском, прежде чем что-то выкладывать. Не стоит забывать, что этот форум создан не для того, чтоб обучить Pawn конкретного Васю Пупкина. Не превращайте этот форум в очередной p-i, где можно найти миллион нерабочих аналогов одной системы

Ваша логика железная, вроде понято написал, что делал для себя, и решил поделится может кому понадобится. Допустим я не хожу по форумам и беру чужие работы, а делаю сам, мне проще написать самому, чем разобратся в чужом коде. Если вас не устраивает тема, приймиите меры, зачем тогда модераторы на форуме? Мне както все равно на плюсики минусы, и отзывы.

Вроде в посте написал:

П.С Писал для себя, возможно где-то есть в интернете похожий принцип, тогда уж извините и снесите тему.

vovandolg
28.02.2017, 19:01
П.С Писал для себя, возможно где-то есть в интернете похожий принцип, тогда уж извините и снесите тему.

Чтобы такого не было, надо было поиск тут заюзать))
Если не ошибаюсь то по этой теме один мэн написал инклуд, а другой мануал(в нём разные варианты все кидали).

DeimoS
28.02.2017, 20:21
Эмм, стоп. С чего кто-то взял, что я говорю сейчас конкретно про автора темы? Моё "замечание" было направлено в сторону данного высказывания


...не ну а как еще, часто вкладывайте свои работы, вас будут делать замечание, давать годные советы

и сделано оно было для того, чтоб люди, которые впоследствии прочтут эту тему, не решили, что подход "лить любой код на форум без разбора" - верное решение. Вот и всё.

А тема с фиксом пикапов не такая уж и заезженная, поэтому и такая реализация имеет место быть. Я только не уверен в том, что VectorSize будет шустрее старого-доброго IsPlayerInRangeOfPoint. Но, в целом, такой реализации в виде готового инклуда на форуме не было, так что к автору претензий по поводу уникальности быть не может.

Nexius_Tailer
01.03.2017, 01:50
и делано оно было для того, чтоб люди, которые впоследствии прочтут эту тему, не решили, что подход "лить любой код на форум без разбора" - верное решение. Вот и всё.
Так это и ежу понятно)
Но вот только не думаю что те, кто выкладывает реальный треш, вообще что-либо читают где-то там в комментариях. Набиватели постов и плюсов были всегда, но это никак не относится к иному большинству.


Я только не уверен в том, что VectorSize будет шустрее старого-доброго IsPlayerInRangeOfPoint. Но, в целом, такой реализации в виде готового инклуда на форуме не было, так что к автору претензий по поводу уникальности быть не может.
IsPlayerInRangeOfPoint будет быстрее, но у автора не та ситуация. Он без z координаты расстояние сверял