PDA

Просмотр полной версии : [Include] GoodArea



Seviel
21.11.2018, 00:41
GoodArea

Описание
Данная библиотека позволяет удобно работать с динамическими зонами streamer-а (http://github.com/samp-incognito/samp-streamer-plugin/releases) в стиле zcmd.

Функции
Добавление/изменение функции, возвращает 1 - при успешном выполнении, 0 - фиаско.

SetAreaFunction(STREAMER_TAG_AREA area, const function[])

Удаление/открепление функции от динамической зоны.
Возвращает 1 - если был откреплен, 0 - если динамическая зона не была связана с функцией.

RemoveAreaFunction(GOOD_AREA_TAG area)

Создание групп дин. зон, все добавленные дин. зоны в группу будут вызывать эту функцию.
Возвращает id группы, а при неудачном выполнение функции возвращает -1.

CreateGroupGoodAreas(const function[])

Добавление дин. зоны к группе.
Аргументы: id группы, дин. зона, а третий это что-то вроде id, чтобы в функции с кучей дин. зон было удобнее работать.

AddGroupGoodAreas(ga_groupid, STREAMER_TAG_AREA area, areaindex)

Получает id и index(опционально) GA(Good Area) группы игрока, если игрок находится в динамической зоне связанной с GA группой.
Возвращает: 1 - если игрок находится в динамической зоной связанной с GA, 0 - если нет.

GetPlayerGroupGoodAreaID(playerid, &areaid, &areaindex = 0)

Удаляет группу GA.
Возвращает: 1 - успех, 0 - фиаско.

DeleteGroupGoodAreas(ga_groupid)

Константы
Данная константа позволяет вам изменять максимальное возможное количество доступных наименований функций.


#define MAX_GOOD_AREAS 5000

А эта константа позволяет менять tag в зависимости от версии streamer-а, по стандарту она выглядит так:


#define GOOD_AREA_TAG STREAMER_TAG_AREA:


Типы вызовов функции:

GA_RESPONSE_ENTER - Когда игрок вошел в дин. зону
GA_RESPONSE_LEAVE - Когда игрок вышел из дин. зоны
GA_RESPONSE_PRESS_KEY - Когда игрок нажал кнопку в дин. зоне



Пример кода
Обычный:


public OnGameModeInit()
{
new STREAMER_TYPE_AREA area = CreateDynamicSphere(310.4742, 2055.8142, 17.6, 2.0);
SetAreaFunction(area, GoodArea:test);
}

// - Первый вариант

AreaResponse:test(playerid, response, key)
{
switch(response)
{
case GA_RESPONSE_ENTER:
{
SendClientMessage(playerid, -1, "Вы вошли зону");
}
case GA_RESPONSE_LEAVE:
{
SendClientMessage(playerid, -1, "Вы вышли из зоны");
}
case GA_RESPONSE_PRESS_KEY:
{
if(key & KEY_WALK) SendClientMessage(playerid, -1, "Вы нажали на ALT в зоне");
else if(key == KEY_JUMP) SendClientMessage(playerid, -1, "Вы нажали на прыжок в зоне");
else SendClientMessage(playerid, -1, "Вы нажали на кнопку в зоне");
}
}
return 1;
}

// - Второй вариант

goodarea test(playerid, response, key)
{
switch(response)
{
case GA_RESPONSE_ENTER:
{
SendClientMessage(playerid, -1, "Вы вошли зону");
}
case GA_RESPONSE_LEAVE:
{
SendClientMessage(playerid, -1, "Вы вышли из зоны");
}
case GA_RESPONSE_PRESS_KEY:
{
if(key & KEY_WALK) SendClientMessage(playerid, -1, "Вы нажали на ALT в зоне");
else if(key == KEY_JUMP) SendClientMessage(playerid, -1, "Вы нажали на прыжок в зоне");
else SendClientMessage(playerid, -1, "Вы нажали на кнопку в зоне");
}
}
return 1;
}

Группы:


public OnGameModeInit()
{
new group1 = CreateGroupGoodAreas(GoodArea:test);
new STREAMER_TAG_AREA:area = CreateDynamicSphere(310.4742, 2055.8142, 17.6, 2.0);
CreateDynamicCP(310.4742, 2055.8142, 17.6, 2.0);
AddGroupGoodAreas(group1, area, 1);
area = CreateDynamicSphere(310.4742, 2050.0, 17.6, 2.0);
CreateDynamicCP(310.4742, 2050.0, 17.6, 2.0);
AddGroupGoodAreas(group1, area, 2);
return 1;
}

// - Первый вариант

GAResponse:test(playerid, response, key, index)
{
new string[144];
switch(response)
{
case GA_RESPONSE_ENTER:
{
format(string, sizeof string, "Вы вошли зону с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_LEAVE:
{
format(string, sizeof string, "Вы вышли из зоны с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_PRESS_KEY:
{
if(key & KEY_WALK)
{
format(string, sizeof string, "Вы нажали на ALT в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else if(key == KEY_JUMP)
{
format(string, sizeof string, "Вы нажали на прыжок в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else
{
format(string, sizeof string, "Вы нажали на кнопку в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}

// - Второй вариант

goodgarea test(playerid, response, key, index)
{
new string[144];
switch(response)
{
case GA_RESPONSE_ENTER:
{
format(string, sizeof string, "Вы вошли зону с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_LEAVE:
{
format(string, sizeof string, "Вы вышли из зоны с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_PRESS_KEY:
{
if(key & KEY_WALK)
{
format(string, sizeof string, "Вы нажали на ALT в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else if(key == KEY_JUMP)
{
format(string, sizeof string, "Вы нажали на прыжок в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else
{
format(string, sizeof string, "Вы нажали на кнопку в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}



Примечание
Подключать только после streamer-а.
Возможно не будет работать на старых версиях плагина.
Если вы используете E_STREAMER_EXTRA_ID, то лучше откажитесь от инклуда.
Это alpha версия, не бейте меня, пожалуйста.

Скачать
Тут можете скачать (https://github.com/Barty-Knox/GoodArea/releases/tag/1.2.1)

Автор: knox (https://www.youtube.com/channel/UCcWcOCdPmBFK4_pLCE6GMaQ)

DeimoS
21.11.2018, 01:49
Советую обновиться до новой версии стримера, ибо там сейчас изменили принцип написания тэгов и твой текущий код будет выдавать ошибки :)
А так - хорошая задумка

Seviel
21.11.2018, 14:59
Советую обновиться до новой версии стримера, ибо там сейчас изменили принцип написания тэгов и твой текущий код будет выдавать ошибки :)
А так - хорошая задумка

Спасибо, исправил это добавлением новой константы:

#define GOOD_AREA_TAG STREAMER_TAG_AREA:
Если у Вас tag такой, то можете её не использовать, а если не такой, то заменяйте на свой.
Например:


#define GOOD_AREA_TAG STREAMER_TAG_AREA
#include <GoodArea>

Seviel
21.11.2018, 15:51
Обновление 1.1

Описание
Были добавлены группы, то есть функцию может вызывать не одна дин. зона, а не сколько.

Функции
Чтобы создать группу необходимо использовать следующую функцию:

CreateGroupGoodAreas(function[])
Она возвращает id группы, который понадобится в следующей функции. А также возвращает -1 если не смогло создать группу.


AddGroupGoodAreas(ga_groupid, GOOD_AREA_TAG area, areaindex)
Данная функция добавляет дин. зону в группу, первый аргумент это id группы, второй дин. зона, а третий это что-то вроде id, чтобы в функции с кучей дин. зон было удобнее работать.

Пример


public OnGameModeInit()
{
new group1 = CreateGroupGoodAreas(GoodArea:test);
new STREAMER_TAG_AREA:area = CreateDynamicSphere(310.4742, 2055.8142, 17.6, 2.0);
CreateDynamicCP(310.4742, 2055.8142, 17.6, 2.0);
AddGroupGoodAreas(group1, area, 1);
area = CreateDynamicSphere(310.4742, 2050.0, 17.6, 2.0);
CreateDynamicCP(310.4742, 2050.0, 17.6, 2.0);
AddGroupGoodAreas(group1, area, 2);
return 1;
}

GAResponse:test(playerid, response, key, index)
{
new string[144];
switch(response)
{
case GA_RESPONSE_ENTER:
{
format(string, sizeof string, "Вы вошли зону с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_LEAVE:
{
format(string, sizeof string, "Вы вышли из зоны с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
case GA_RESPONSE_PRESS_KEY:
{
if(key & KEY_WALK)
{
format(string, sizeof string, "Вы нажали на ALT в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else if(key == KEY_JUMP)
{
format(string, sizeof string, "Вы нажали на прыжок в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
else
{
format(string, sizeof string, "Вы нажали на кнопку в зоне с индексом %d", index);
SendClientMessage(playerid, -1, string);
}
}
}
return 1;
}

Kovshevoy
21.11.2018, 18:20
CreateGroupGoodAreas(function[])


Последняя версия компилятора будет кричать, что нету "const".

Seviel
21.11.2018, 18:39
Последняя версия компилятора будет кричать, что нету "const".

Компилятор плохой мальчик, а инклуд хороший мальчик.

Обновил.

Seviel
13.12.2018, 21:24
Обновление 1.2

Были добавлены функции:


RemoveAreaFunction(GOOD_AREA_TAG area);
GetPlayerGroupGoodAreaID(playerid, &areaid, &areaindex = 0);
DeleteGroupGoodAreas(ga_groupid);


Подробнее о функциях описано выше.

DeimoS
14.12.2018, 02:24
Я бы советовал соблюсти общий стиль для имён функций. Например, название "GoodArea" перенести в префикс, а уже в самом названии отражать функционал. Будет гораздо более понятнее и удобнее.

ziggi
21.12.2018, 13:41
Мне кажется, хватит и одного AreaResponse, а GAResponse и выглядит не очень, да и усложнение лишнее. И, раз уж всё-равно есть ограничение на количество зон (MAX_GOOD_AREAS), можно отказаться от использования E_STREAMER_EXTRA_ID и создать массив с необходимыми данными.

Seviel
21.12.2018, 15:41
Мне кажется, хватит и одного AreaResponse, а GAResponse и выглядит не очень, да и усложнение лишнее. И, раз уж всё-равно есть ограничение на количество зон (MAX_GOOD_AREAS), можно отказаться от использования E_STREAMER_EXTRA_ID и создать массив с необходимыми данными.

Группы это самое крутое. С помощью них можно сделать систему домов (https://drive.google.com/file/d/121LDlfLbGTrHNQmw0isUgUQ_3pZUHgcY/view?usp=sharing) и не только.

Использую E_STREAMER_EXTRA_ID, дабы не было перебора всех динамических зон и/или переменной.

Хотя чтобы избавиться от использования E_STREAMER_EXTRA_ID, нужно немного изменить код в функциях GetGoodAreaIndex и GetGroupGoodAreaIndex

Seviel
21.12.2018, 16:17
Обновление 1.2.1

Была добавлена проверка на подключен ли streamer
Были добавлены ещё один способ написания функций:


Индивидуальные:
goodarea test(playerid, response, key)
Группы:
goodgarea test(playerid, response, key, index)


За это благодарю @desulaid

ziggi
21.12.2018, 17:29
Группы это самое крутое. С помощью них можно сделать систему домов (https://drive.google.com/file/d/121LDlfLbGTrHNQmw0isUgUQ_3pZUHgcY/view?usp=sharing) и не только.

Использую E_STREAMER_EXTRA_ID, дабы не было перебора всех динамических зон и/или переменной.

Хотя чтобы избавиться от использования E_STREAMER_EXTRA_ID, нужно немного изменить код в функциях GetGoodAreaIndex и GetGroupGoodAreaIndex

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


AreaResponse:test(playerid, response, key, index)


И в index передавать -1, если группы нет. И если я не буду использовать группы, то я по-прежнему могу не объявлять index в качестве аргумента. То есть этот синтаксис сохранится:

AreaResponse:test(playerid, response, key)