PDA

Просмотр полной версии : [Мануал] Расстановка дорожных знаков (0.3.7)



Desulaid
12.12.2015, 16:02
Малообновленный вариант первоначальной версии системы (косметические изменения).

Версия: 1.1.1

Что изменилось:

Переправлены команды по примерам мифа #4 (клац) (http://pro-pawn.ru/showthread.php?12988).
Избавился от switch ветвлений, теперь есть массив.


Скриншоты:






https://pp.vk.me/c629423/v629423894/25863/p-lR6iV9lP8.jpg
https://pp.vk.me/c629423/v629423894/2586a/WAmMwRZEGWc.jpg
https://pp.vk.me/c629423/v629423894/25871/9LtXq1AcsCs.jpg
https://pp.vk.me/c629423/v629423894/2587a/3NZxk4GbeYY.jpg






https://pp.vk.me/c629423/v629423894/258a2/7pH8x_BoJwk.jpg
https://pp.vk.me/c629423/v629423894/25881/Pe3vitXiCYo.jpg
https://pp.vk.me/c629423/v629423894/25889/knceJwylAVI.jpg





https://pp.vk.me/c629423/v629423894/25899/YPEbP06rKrw.jpg
https://pp.vk.me/c629423/v629423894/25892/Rx_dhi84nj4.jpg



А теперь добавление всего этого в мод. Для начала:

Добавим это ко всем вашим переменным:


#include <streamer>
#include <sscanf2>
#include <dc_cmd>

#define MAX_ROAD_SIGN_MODELS 45

#define MAX_SIGNS_LABEL_TEXT 31

static const
road_sign_models[MAX_ROAD_SIGN_MODELS] =
{
19955, 19954, 19953, 19952, 19951,
19950, 19949, 19948, 19963, 19962,
19961, 19960, 19959, 19958, 19957,
19956, 19971, 19970, 19969, 19968,
19967, 19966, 19965, 19964, 19979,
19978, 19977, 19976, 19975, 19974,
19973, 19972, 19987, 19986, 19985,
19984, 19983, 19982, 19981, 19980,
19988, 19989, 19990, 19991, 19992
};

static const
road_sign_color_text[] =
{
0xADD8E6FF, // LightBlue
0x006400FF, // DarkGreen
0x00FF00FF, // Green
0xFFFF00FF, // Yellow
0xFF6347FF, // Tomato
0xFF0000FF, // Red
0x0000FFFF, // Blue
0x607B8BFF // LightSkyBlue
};

enum
E_ROAD_SIGN
{
model,
Float:f_x,
Float:f_y,
Float:f_z,
Float:f_rx,
Float:f_ry,
Float:f_rz,
v_world,
Text3D:r_label,
r_label_text[MAX_SIGNS_LABEL_TEXT],
r_label_text_color
};
new road_sign[][E_ROAD_SIGN], last_road_sign;

new PlayerText:TD_road_sign_view;

Это добавим ко всем вашим командам:


// добавить дорожный знак
COMMAND:addsign(playerid, params[])
{
new cmd_sign_model_id;

if (sscanf(params, "i", cmd_sign_model_id))
{
SendClientMessage(playerid, -1, "Введите /addsign <номер модели знака>");
SendClientMessage(playerid, -1, "* чтобы узнать номера знаков введите /signnum");
return 0;
}

if (cmd_sign_model_id > MAX_ROAD_SIGN_MODELS)
return SendClientMessage(playerid, -1, "* чтобы узнать номера знаков введите /signnum");

new Float:x, Float:y, Float:z, Float:angle;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, angle);
x += floatsin(-angle, degrees);
y += floatcos(-angle, degrees);
SetPVarInt(playerid, "road_sign_editor", 1);
last_road_sign = CreateDynamicObject(road_sign_models[cmd_sign_model_id], x, y, z - 0.35, 0, 0, 0, GetPlayerVirtualWorld(playerid));
EditDynamicObject(playerid, last_road_sign);
return 1;
}

// узнать как выглядит знак по его порядковому номеру модели
COMMAND:signnum(playerid, params[])
{
new cmd_sign_model_id;

if (sscanf(params, "i", cmd_sign_model_id))
return SendClientMessage(playerid, -1, "Введите /signnum <номер модели знака>");

if (cmd_sign_model_id > MAX_ROAD_SIGN_MODELS)
return SendClientMessage(playerid, -1, "Упс, несуществующий номер модели. Повторите еще раз!");

PlayerTextDrawSetPreviewModel(playerid, TD_road_sign_view, road_sign_models[cmd_sign_model_id]);
PlayerTextDrawSetPreviewRot(playerid, TD_road_sign_view, 0.0, 0.0, 180.0, 1.0);
PlayerTextDrawShow(playerid, TD_road_sign_view);
SetTimerEx("@__HideTextDrawRoadSign", 3000, false, "i", playerid);
return 1;
}

@__HideTextDrawRoadSign(playerid);
@__HideTextDrawRoadSign(playerid)
{
PlayerTextDrawHide(playerid, TD_road_sign_view);
}


// удаляем дорожный знак по его id
COMMAND:deletesign(playerid, params[])
{
new cmd_sign_id;

if (sscanf(params, "i", cmd_sign_id))
return SendClientMessage(playerid, -1, "Введите /deletesign (или /drs) <номер знака>");

road_sign[cmd_sign_id][model] = 0;
road_sign[cmd_sign_id][f_x] =
road_sign[cmd_sign_id][f_y] =
road_sign[cmd_sign_id][f_z] =
road_sign[cmd_sign_id][f_rx] =
road_sign[cmd_sign_id][f_ry] =
road_sign[cmd_sign_id][f_rz] = 0.0;
road_sign[cmd_sign_id][v_world] = -1;
road_sign[cmd_sign_id][r_label_text][0] = EOS;
road_sign[cmd_sign_id][r_label_text_color] = -1;
DestroyDynamic3DTextLabel(road_sign[cmd_sign_id][r_label]);
DestroyDynamicObject(cmd_sign_id);
return 1;
}

// обновляем описание pyfrf
COMMAND:signname(playerid, params[])
{
new cmd_sign_id;

if (sscanf(params, "is[31]", cmd_sign_id, params))
return SendClientMessage(playerid, -1, "Введите /signname <номер знака> <описание знака>");

if (strlen(params) > MAX_SIGNS_LABEL_TEXT)
return SendClientMessage(playerid, -1, "* слишком больное оисание для знака.");

sscanf(params, "s[31]", road_sign[cmd_sign_id][r_label_text]);
SetPVarInt(playerid, "road_sign_id", cmd_sign_id);
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_LIST, "Обновить цвет?", "{ADD8E6}Цвет 1\n{006400}Цвет 2\n{00FF00}Цвет 3\n{FFFF00}Цвет 4\n{FF6347}Цвет 5\n{FF0000}Цвет 6\n{0000FF}Цвет 7\n{607B8B}Цвет 8", "Выбрать", "Нет");
return 1;
}

Это добавим к OnPlayerEditObject, если нету, то добавьте (клацни по мне плес)0)) (http://wiki.sa-mp.com/wiki/OnPlayerEditObject)).

if (GetPVarInt(playerid, "road_sign_editor") == 1)
{
if (response == EDIT_RESPONSE_CANCEL)
{
SendClientMessage(playerid, -1, "Установка дорожного знака отменена.");
DestroyDynamicObject(last_road_sign);
last_road_sign -= 1;
CancelEdit(playerid);
return 1;
}

if (response == EDIT_RESPONSE_FINAL)
{
road_sign[last_road_sign][model] = objectid;
road_sign[last_road_sign][f_x] = fX;
road_sign[last_road_sign][f_y] = fY;
road_sign[last_road_sign][f_z] = fZ;
road_sign[last_road_sign][f_rx] = fRotX;
road_sign[last_road_sign][f_ry] = fRotY;
road_sign[last_road_sign][f_rz] = fRotZ;
road_sign[last_road_sign][v_world] = GetPlayerVirtualWorld(playerid);
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Добавить текст", "{FFFFFF}Вы можете добавить описание этому знаку", "Добавить", "Нет");
return 1;
}
}
Это добавляем в OnDialogResponse, а он то у всех есть :dirol:


switch(dialogid)
{
case 0:
{
if(!response)
{
SendClientMessage(playerid, -1, "Установка дорожного знака завершена.");
CancelEdit(playerid);
return 1;
}

if (sscanf(inputtext, "s[31]", road_sign[last_road_sign][r_label_text]))
return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Добавить текст", "{FFFFFF}Вы можете добавить описание этому знаку", "Добавить", "Нет");

ShowPlayerDialog(playerid, 1, DIALOG_STYLE_LIST, "Цвет текста", "{ADD8E6}Цвет 1\n{006400}Цвет 2\n{00FF00}Цвет 3\n{FFFF00}Цвет 4\n{FF6347}Цвет 5\n{FF0000}Цвет 6\n{0000FF}Цвет 7\n{607B8B}Цвет 8", "Выбрать", "");
}
case 1:
{
if(!response)
{
SendClientMessage(playerid, -1, "Установка дорожного знака завершена.");
CancelEdit(playerid);
return 1;
}

road_sign[last_road_sign][r_label_text_color] = road_sign_color_text[listitem];
road_sign[last_road_sign][r_label] = CreateDynamic3DTextLabel(road_sign[last_road_sign][r_label_text], road_sign[last_road_sign][r_label_text_color], road_sign[last_road_sign][f_x], road_sign[last_road_sign][f_y], road_sign[last_road_sign][f_z] + 1.5, 50.0, _, _, 0, road_sign[last_road_sign][v_world], 0, _);
SendClientMessage(playerid, -1, "Установка дорожного знака завершена.");
CancelEdit(playerid);
}
case 2:
{
#define ROAD_SIGN_ID GetPVarInt(playerid, "road_sign_id")
if(!response)
{
UpdateDynamic3DTextLabelText(road_sign[ROAD_SIGN_ID][r_label], road_sign[ROAD_SIGN_ID][r_label_text_color], road_sign[ROAD_SIGN_ID][r_label_text]);
SendClientMessage(playerid, -1, "Описание дорожного знака обновлено.");
DeletePVar(playerid, "road_sign_id");
return 1;
}

road_sign[ROAD_SIGN_ID][r_label_text_color] = road_sign_color_text[listitem];
UpdateDynamic3DTextLabelText(road_sign[ROAD_SIGN_ID][r_label], road_sign[ROAD_SIGN_ID][r_label_text_color], road_sign[ROAD_SIGN_ID][r_label_text]);
SendClientMessage(playerid, road_sign[ROAD_SIGN_ID][r_label_text_color], "Цвет дорожного знака обновлен.");
DeletePVar(playerid, "road_sign_id");
#undef ROAD_SIGN_ID
}
}

А это в OnPlayerConnect

TD_road_sign_view = CreatePlayerTextDraw(playerid, 462.000000, 251.562500, "LD_SPAC:white");
PlayerTextDrawTextSize(playerid, TD_road_sign_view, 132.000000, 187.687500);
PlayerTextDrawUseBox(playerid, TD_road_sign_view, 1);
PlayerTextDrawBoxColor(playerid, TD_road_sign_view, 90);
PlayerTextDrawFont(playerid, TD_road_sign_view, 5);


Важно: не стал добавлять константы для id диалогов. Ни все в этой жизни ctr + c / v :hang1:

С include пока повременим, как и с FS. Скоро добавлю плюшек :3

Автор: Untonyst

И глаголит Untonystъ истину простую своей рукой и четырьмя персатми, набирающие текст на иноземной неведанной доске всем, чтобы ты, узревшие тему очами зоркими своими, не спрятал свою гордыню и не украл честный труд Untonystъ. Но разрешает он словом своим в личной переписке, что разрешит он скопировать труд Untonystъ на всеобщее обозрение, если тот укажет настоящего автора этой летописи и желательно ссылку на летопись указать, если возможности позволяют. И истина эта проста, да не все с ней справляются.

Profyan
12.12.2015, 16:20
Хорошая идея. Только вот было бы удобно, если бы цвета макросами были. Ну и конечно на диалогах более удобнее и практичнее, но я так понял, тебе было лень, поэтому ты по максимуму упростил систему)

Desulaid
12.12.2015, 16:27
Хорошая идея. Только вот было бы удобно, если бы цвета макросами были. Ну и конечно на диалогах более удобнее и практичнее, но я так понял, тебе было лень, поэтому ты по максимуму упростил систему)

Не, цвета на диалогах, а остальное это да :D

VVWVV
12.12.2015, 17:37
Превосходная работа, но я бы порекомендовал сделать это в виде отдельного «filterscript», так как это только лишь на два раза, и вшивать это в скрипт — не очень хорошая идея. И да, эти нижние подчёркивания(«under_score») в командах, для чего вообще они там нужны, почему бы не сделать команду тривиальнее. Например, «addsign» вместо «put_road_sign».
Я не проверял код, однако работать будет.

Desulaid
12.12.2015, 18:08
Превосходная работа, но я бы порекомендовал сделать это в виде отдельного «fliterscript», так как это только лишь на два раза, и вшивать это в скрипт — не очень хорошая идея. И да, эти нижние подчёркивания(«under_score») в командах, для чего вообще они там нужны, почему бы не сделать команду тривиальнее. Например, «addsign» вместо «put_road_sign».
Я не проверял код, однако работать будет.

Учту ваши пожелания и все сделаю в виде «fliterscript», спасибо :good:

$continue$
12.12.2015, 19:41
1. Вынести ID диалогов в константу.
2. Сделать лучше всего includ'ом.

Desulaid
12.12.2015, 20:02
1. Вынести ID диалогов в константу.
2. Сделать лучше всего includ'ом.

Да. Идея с инклудом мне нравится, но я там скрою некую часть функций и прочего, к чему вам явно прикасаться не стоит, да и незачем.

$continue$
12.12.2015, 21:42
Да. Идея с инклудом мне нравится, но я там скрою некую часть функций и прочего, к чему вам явно прикасаться не стоит, да и незачем.

class - private? :sarcastic:

Daniel_Cortez
12.12.2015, 21:49
class - private? :sarcastic:
static же.

VVWVV
12.12.2015, 23:31
1. Вынести ID диалогов в константу.
2. Сделать лучше всего includ'ом.

Можно отдельным include'ом, однако зачем? Несомненно, если имеются функции, с которыми можно взаимодействовать, то можно сделать и include'ом, однако этих функций нет, а, следовательно, делать все include'ом — бессмысленно.

L0ndl3m
13.12.2015, 13:29
Если не брать мелкие погрешности, то довольно-таки хорошая работа.
Кстати говоря, при создании текстдравов с тегом "PlayerText" массив не нужен ( инвестигируй свой инклуд ).

Fallen A.
17.06.2017, 18:41
В данном случае
road_sign[last_road_sign][model] = objectid; мы не получим модель объекта.