PDA

Просмотр полной версии : [Мануал] Warp System



Long-
02.03.2017, 15:08
Автор:
Long-


Командный процессор:
DC_CMD


Хранения данных:
Mysql r39-4




Информация:



Система подойдет для всех модов, так-же подойдет на разбор новичков этой системы.
Огромное спасибо DeimoS, помог мне увидеть ошибку в коде.
Если у вас есть более оптимизированный вариант кидайте его в комментарии, рассмотрим, и добавлю ваш вариант(Если конечно он лучше).
Критика так-же присутствует, только без мата/оскорбления и еще прочего что нарушает правило.


Особенности:



1.Не имеет не одного PVar'a.
2.Не имеет багов.
3.У автора данной системы прямые руки.(Но это не точно)
4.Все команды хорошо функционируют.



Создание WARP'a командой:



Ко всем глобальным переменным:


const WARP_LIST = 900;
const MAX_WARP_NAME = 10;


Команда:


CMD:setwarp(playerid, params[])
{
if (isnull(params))
return SendClientMessage(playerid,-1,!"Введите:/setwarp [name]");
new
Float:position_x,
Float:position_y,
Float:position_z;

if(!(1 < strlen(params) < MAX_WARP_NAME ))
return SendClientMessage(playerid,-1, !"[X] Названия варпа не может быть больше 10 символов или меньше 1");

GetPlayerPos(playerid, position_x, position_y, position_z);

static const mysql_string[] = "INSERT INTO `warps` (`name_warp`,`position_x`,`position_y`,`position_z`,`int`,`virtual_world`)\
VALUES ('%s','%f','%f','%f','%d','%d')";

new string;
format(string, sizeof(string), mysql_string, params, position_x, position_y, position_z, GetPlayerInterior(playerid), GetPlayerVirtualWorld(playerid));
mysql_function_query(connect,string,false,"","");

return 1;
}


[SIZE=1]Все варп успешно создан и занесен в нашу базу данных, проверку на админку я не ставил, если вам нужно воткните сами.


2.Сам телепорт по нашему WARP'y(Команда)



CMD:warp(playerid, params[])
{
if (isnull(params))
return SendClientMessage(playerid,-1, !"Введите:/warp [name]");
if(!(1 < strlen(params) < 10))
return SendClientMessage(playerid,-1, !"[X] Названия варпа не может быть больше 10 символов или меньше 1");

static const fmt_str[] = "SELECT * FROM `warps` WHERE `name_warp` = '%s'";
new string;
format(string, sizeof(string), fmt_str, params);

mysql_function_query(connect,string,true,!"LoadWarpName","ds",playerid,params);
return 1;
}


[SIZE=1]Теперь создадим наш коллбэк самого запроса:


forward LoadWarpName(playerid, warp[]);
public LoadWarpName(playerid, warp[])
{
if(!cache_get_row_count(connect))
return SendClientMessage(playerid, -1, "Такого WARP'a не существует.(Используйте /warps -> Warp List)");
new
fmt_str[33-2+10+3],
Float:position_x = cache_get_field_content_float(0, "position_x", connect),
Float:position_y = cache_get_field_content_float(0, "position_y", connect),
Float:position_z = cache_get_field_content_float(0, "position_z", connect),
interior = cache_get_field_content_int(0, "int", connect),
virtual_world = cache_get_field_content_int(0, "virtual_world", connect);

SetPlayerPos(playerid, position_x, position_y, position_z);
SetPlayerInterior(playerid, interior);
SetPlayerVirtualWorld(playerid, virtual_world);

format(fmt_str, sizeof(fmt_str), "Вы были телепортированы на варп [%s]", warp);
SendClientMessage(playerid, -1, fmt_str);
return 1;
}


Все телепорт успешно выполняется , вся система проверена.


3.Теперь удалим наш WARP (Команда)



CMD:deletewarp(playerid, params[])
{
if (isnull(params))
return SendClientMessage(playerid,-1, !"Введите:/deletewarp [name]");
if(!(1 < strlen(params) < 10))
return SendClientMessage(playerid,-1, !"[X] Названия варпа не может быть больше 10 символов или меньше 1");

static const mysql_fmt[] = "DELETE FROM `warps` WHERE `name_warp` = '%s'";
new string;
format(string, sizeof string, mysql_fmt, params);

mysql_function_query(connect,string,false,"","");
return 1;
}


[SIZE=1]Все удаления наше успешно выполнено, еще раз повторю все системы проверены, и работают.


Посмотреть список варпов(команда) и телепорт при их нажатии:



Сама команда:


CMD:warplist(playerid)
{
mysql_function_query(connect, "SELECT * FROM `warps`", true, "WarpList", "i", playerid);
return true;
}


В OnDialogResponse:


case WARP_LIST:
{
if(!response)return true;
static const fmt_str[] = "SELECT * FROM `warps` WHERE `name_warp` = '%s'";
new string;
format(string, sizeof(string), fmt_str, inputtext);
mysql_function_query(connect,string,true,"LoadWarpName","d",playerid);
}


forward WarpList(playerid);
public WarpList(playerid)
{
if(!cache_get_row_count(connect))
return SendClientMessage(playerid, -1, !"Созданных Варпов не найдено!");

const MAX_WARP = 50;

new name_warp[MAX_WARP_NAME],
str_fmt[MAX_WARP_NAME*MAX_WARP];

for(new i = 0; i < rows; i++)
{
cache_get_field_content(i,"name_warp", name_warp);
format(str_fmt, sizeof(str_fmt), "%s%s\n",str_fmt, name_warp);
}
ShowPlayerDialog(playerid,WARP_LIST,DIALOG_STYLE_LIST,"WarpList",str_fmt,"Выбрать","Выход");
return true;
}


[SIZE=1]Теперь в команде /warplist вы сможете посмотреть созданные варпы, а так же выбрать любой из них и сразу телепортироваться.


Немного еще информации:



Выложил свою старенькую работу, около 2-3 месяца назад писал.
Нашли какую то ошибку? Или более оптимизированный вариант? Напиши в комментарии.

vovandolg
02.03.2017, 15:53
Я один не понял для чего такая система?
(В MTA подобное в админке видел, но там то понятно для чего, а тут тупо респавн или откат к старым коордам?)

Long-
02.03.2017, 16:02
Я один не понял для чего такая система?
(В MTA подобное в админке видел, но там то понятно для чего, а тут тупо респавн или откат к старым коордам?)

Нет, данная система создает точку варпа.
То бишь, пишем /createwarp на этом месте где стоит игрок создается точка которая будет записана в БД, далее можно телепортироваться к этой точке вводом /warplist , высвечивается диалог варпов, при нажатии на любой он телепортирует на то место где вы установили варп(по имени варпа телепорт)

DeimoS
02.03.2017, 18:34
В /warplist ты вызываешь функцию @_WarpList, но самой функции нет :)
И логирование можно было бы убрать

vovandolg
02.03.2017, 18:43
Тут случаем не получится так что будет 2(или более) варпа с одинаковым именем?
А то я вот проверок не вижу)

Long-
03.03.2017, 15:17
В /warplist ты вызываешь функцию @_WarpList, но самой функции нет :)
И логирование можно было бы убрать

Спасибо за подсказку, исправил.

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


Тут случаем не получится так что будет 2(или более) варпа с одинаковым именем?
А то я вот проверок не вижу)

Да, верно, спасибо.
Исправлю.

Guldan
03.03.2017, 23:50
int = GetPlayerInterior(playerid);
virtual_world = GetPlayerVirtualWorld(playerid);

Зачем создавать лишние переменные? когда можно и без их

vovandolg
04.03.2017, 02:57
Зачем создавать лишние переменные? когда можно и без их

Можно, но так он затраты по скорости выполнения уменьшает.

DeimoS
04.03.2017, 10:52
Можно, но так он затраты по скорости выполнения уменьшает.

Каким образом? Переменные, впоследствии, используются лишь в одном месте (при форматировании диалога). Он лишь лишние переменные инициализирует и лишнюю запись проводит.

Long-
04.03.2017, 14:04
Убрал лишние переменные, спасибо Guldan

vovandolg
04.03.2017, 17:13
Каким образом? Переменные, впоследствии, используются лишь в одном месте (при форматировании диалога). Он лишь лишние переменные инициализирует и лишнюю запись проводит.

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


forward LoadWarpName(playerid, warp[]);
public LoadWarpName(playerid, warp[])
{
if(!cache_get_row_count(connect))
return SendClientMessage(playerid, -1, "Такого WARP'a не существует.(Используйте /warps -> Warp List)");
new
fmt_str[33-2+10+3],
Float:position_x = cache_get_field_content_float(0, "position_x", connect),
Float:position_y = cache_get_field_content_float(0, "position_y", connect),
Float:position_z = cache_get_field_content_float(0, "position_z", connect),
interior = cache_get_field_content_int(0, "int", connect),
virtual_world = cache_get_field_content_int(0, "virtual_world", connect);

printf("position_x: %f, position_y: %f, position_z: %f, interior: %d, virtual_world: %d",
position_x, position_y, position_z, interior, virtual_world);

SetPlayerPos(playerid, position_x, position_y, position_z);
SetPlayerInterior(playerid, interior);
SetPlayerVirtualWorld(playerid, virtual_world);

format(fmt_str, sizeof(fmt_str), "Вы были телепортированы на варп [%s]", warp);
SendClientMessage(playerid, -1, fmt_str);
return 1;
}

Что собственно быстрее чу-чуть чем двойное использование)

DeimoS
04.03.2017, 21:30
А теперь давайте всем форумом подумаем над тем, важен ли printf в данной системе...
После долгих раздумий приходим к тому, что, тащемта, он и не нужен там.
Это если рассматривать тот код, что ты дал.

А если говорить о том коде, о котором изначально речь зашла (пример кода дал Guldan в своём сообщении)


CMD:setwarp(playerid, params[])
{
if (isnull(params))
return SendClientMessage(playerid,-1,!"Введите:/setwarp [name]");
new
Float:position_x,
Float:position_y,
Float:position_z,
int,
virtual_world;

if(!(1 < strlen(params) < MAX_WARP_NAME ))
return SendClientMessage(playerid,-1, !"[X] Названия варпа не может быть больше 10 символов или меньше 1");

GetPlayerPos(playerid, position_x, position_y, position_z);

int = GetPlayerInterior(playerid);
virtual_world = GetPlayerVirtualWorld(playerid);

static const mysql_string[] = "INSERT INTO `warps` (`name_warp`,`position_x`,`position_y`,`position_z `,`int`,`virtual_world`)\
VALUES ('%s','%f','%f','%f','%d','%d')";

new string[sizeof(mysql_string)-14+11+9+9+9+2*2];
format(string, sizeof(string), mysql_string, params, position_x, position_y, position_z, int, virtual_world);
mysql_function_query(connect,string,false,"","");

return 1;
}
То сразу всё встанет на свои места

vovandolg
05.03.2017, 10:16
Когда print исчезнет из кода я успокоюсь:rofl:

DeimoS
05.03.2017, 11:55
Когда print исчезнет из кода я успокоюсь:rofl:

Да ёпт, причём тут priint, если речь изначально о другом коде была? О_о

vovandolg
05.03.2017, 18:10
Да ёпт, причём тут priint, если речь изначально о другом коде была? О_о

Ну так там 2 варика ты обсудил)
Про принтф на сколько он важен и кмд))
Я вообще кмд не увидел второй раз когда открыл тему эту(наверное чудо грибы зашалили :D)

DeimoS
05.03.2017, 18:18
Ну так там 2 варика ты обсудил)
Про принтф на сколько он важен и кмд))
Я вообще кмд не увидел второй раз когда открыл тему эту(наверное чудо грибы зашалили :D)

Причём тут я? О_о
http://i.imgur.com/RbPPyqf.png

Long-
06.03.2017, 13:43
Уже про printf начали :D
Убрал))
Больше такого не повторится.