Расстановка дорожных знаков (0.3.7)
Малообновленный вариант первоначальной версии системы (косметические изменения).
Версия: 1.1.1
Что изменилось:
- Переправлены команды по примерам мифа #4 (клац).
- Избавился от switch ветвлений, теперь есть массив.
Скриншоты:
Открыть/закрыть
Добавление знака:
Изменение текста и цвета (цвет по желанию):
Просмотр моделей по их порядковому номеру:
А теперь добавление всего этого в мод. Для начала:
- Добавим это ко всем вашим переменным:
PHP код:
#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;
- Это добавим ко всем вашим командам:
PHP код:
// добавить дорожный знак
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))).
PHP код:
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:
PHP код:
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
PHP код:
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ъ на всеобщее обозрение, если тот укажет настоящего автора этой летописи и желательно ссылку на летопись указать, если возможности позволяют. И истина эта проста, да не все с ней справляются.