[FilterScript] Многоугольные зоны
#1

Добрый день!

Многие часто задавались вопросом: реально ли сделать в сампе многоугольные границы?
Часто ответ был таков: это не мта, в сампе можно делать по одной зоне.

Но это суждение - неверное.

Хочу представить вам свою "разработку", если ее такой можно назвать.
Суть этой системы такова:
Она загружает из файла определенное количество зон, создает их, и прогоняет игроков на нахождение в них.

В этой системе я для примера сделал 3 зоны, при выходе из которой игрока возвращает на последнюю координату в зоне, кому нужно - изменят под себя

Теперь о коде:

В самой системе я разрешил создавать не более 3-х зон, но вы можете сделать это под себя, достаточно будет изменить строки:

PHP Code:
#define m_a 12//12 - максимум зон * 4, т.к. гангзоны содержат 4 координаты
#define m_z 3//максимальное количество зон 
Для прогрузки зоны используется mxINI

Цикл загрузки зон остановится в 3-х условиях

PHP Code:
Координаты тупо нету
Прогрузилось все что есть
Где
-то допущена координата 0.00000 
Если вы допустили кол-во координат, которое не делится на 4 - зоны попросту не создадутся.

Для загрузки зоны используйте

PHP Code:
readFileZone("тут размещение вашего файла с координатами"); 
Папка с файлом с тестовыми координатами (засунуть в директорию scriptfiles):

http://rghost.ru/45963410

Для тех, кто вообще ничерта не понял:

http://www.youtube.com/watch?v=oxiMW...ature=*********

Ну и ссылка на скачивание: http://pastebin.com/k1fg73gS

Автор: Seregamil
Reply
#2

Чтение файла внутри main() плохая идея, для этого существует OnFilterScriptInit.
Quote:
Originally Posted by Seregamil1
Если вы допустили кол-во координат, которое не делится на 4 - зоны попросту не создадутся.
не стоит так делать, конечный "потребитель" не должен этим заморачиваться, этим должен заморачиваться ваш скрипт.
pawn Code:
search(i,&index)
а зачем index передавать по ссылке если он используется только для проверки?
null - очень, просто ужас какое плохое имя для переменной!
И внутри функция можно было бы использовать не i, а смело использовать playerid, код станет более читаемый.
Оформление кода почему-то хромает от одного вида к другому. Как и типы функций.
Часть кода можно упростить, избавиться от ненужных конструкций, например:
pawn Code:
search(playerid, index) {
        for (new i; i != index; i++) {
            if (InTheGangZone(playerid, pos[i][0], pos[i][1], pos[i][2], pos[i][3])) {
                save(playerid);
                escape(playerid);
                return 1;
            }
        }
        return 0;
}
Reply
#3

Quote:

Чтение файла внутри main() плохая идея, для этого существует OnFilterScriptInit.

хорошо, возьму на заметку
Quote:

null - очень, просто ужас какое плохое имя для переменной!

неимеет значение
Quote:

И внутри функция можно было бы использовать не i, а смело использовать playerid, код станет более читаемый.

код писался лично для себя, и тут уже мой выбор
Quote:

if (InTheGangZone(playerid, pos[i][0], pos[i][1], pos[i][2], pos[i][3])) {
save(playerid);
escape(playerid);
return 1;
}

а вот тут вы неправы, если верить вашему коду, игрока сохранит и тут же вернет
Reply
#4

Quote:
Originally Posted by Seregamil1
View Post
неимеет значение
даже в pawn есть null, так что имеет!
Quote:
Originally Posted by Seregamil1
View Post
код писался лично для себя, и тут уже мой выбор
Зачем вы тогда его опубликовали, если он "лично для себя", опубликовали код, будьте любезны его привести в удобочитаемый вид. Это не только упростит его понимание, но и улучшит отношение к автору.
Quote:
Originally Posted by Seregamil1
View Post
а вот тут вы неправы, если верить вашему коду, игрока сохранит и тут же вернет
Согласен, не доглядел, читаемость кода подвела. Но лишняя переменная тут явно не нужна.
Reply
#5

Quote:

даже в pawn есть null, так что имеет!

Quote:

Зачем вы тогда его опубликовали, если он "лично для себя", опубликовали код, будьте любезны его привести в удобочитаемый вид. Это не только упростит его понимание, но и улучшит отношение к автору.

переделал, так лучше?
Quote:

Но лишняя переменная тут явно не нужна.

если вы про select - то по какой то причине при проверке всех зон, реагировала только нулевая, остальные не подавали признаки жизни
Reply
#6

Эту возможность предоставляет стример от Инкогнито

pawn Code:
native CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);
с возможностью их динамического использования. А учитывая то, что этот стример использует большенство пользователей, я думаю им будет куда удобнее использовать его функцию
Reply
#7

Quote:

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

я уж думаю ненапишут...
данный скрипт делался в качестве прототипа этой функции,
помимо того, что многие юзают стример, есть люди, которые ненуждаются в нем, так зачем подключать доп. плагины ради одной функции?
Reply
#8

Seregamil1, ради скорости?! Мне кажется плагин быстрее обсчитает чем код. Поправьте если ошибаюсь.
Reply
#9

Quote:
Originally Posted by -Stranger-
View Post
Seregamil1, ради скорости?! Мне кажется плагин быстрее обсчитает чем код. Поправьте если ошибаюсь.
свой код протестировал, незнаю, верно или нет, но:

Загрузка 48 арен
PHP Code:
[14:43:57Количество арен:48
[14:43:57На поиски потрачено3ms 
Код теста:
PHP Code:
readCoords(arg[])
{
    new 
time GetTickCount();
/*Весь код этой функции*/
    
printf("На поиски потрачено: %ims"GetTickCount()-time);
    return 
1;

И тест поиска по этим 48 зонам, хотя больше чем уверен что это бред, ID=0
PHP Code:
[14:40:03На поиски потрачено0ms
[14:40:04На поиски потрачено1ms
[14:40:04На поиски потрачено0ms
[14:40:05На поиски потрачено0ms 
Reply
#10

Seregamil1, что-то нето, покажите весь код теста.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)