Предыстория
Привет. Изначально я начал писать эту систему для одного проекта. Но, видимо, они про меня забыли. Последнее сообщение, отправленное мной было два дня назад (05.04.16), но реакции ноль. Позиция проекта мне не нравится в плане того, что они забывают про своих сотрудников (ору), поэтому, чтобы моя работа не пропала зря, хоть она и не уникальная прям на столько, да и не совсем доделана, но все же я решаюсь ее выложить вам.
Описание
Мне надо было сделать копию системы с GamBit RolePlay. Как ТЗ кинули видео. Вот оно.
Некоторые моменты я не доделал. Но система рабочая. Вот скрины<...>
Код
- Система работает с использованием DC_CMD, sscanf2 и streamer плагинов. Логично, если у вас не подключены эти библиотеки, подключить их. (А если их нет, то скачать.)
PHP код:
#include <dc_cmd>
#include <sscanf2>
#include <streamer>
- Переменные и константы
- Далее добавим две константы, которые упрощают прочтение кода и его написание.
PHP код:
const DIALOG_GRAFFITI_MENU = 0;
const MAX_GRAFFITI_TEXT = 128;
- Тут у нас хранится вся информация о граффити игроков.
PHP код:
enum E_GRAFFITI_INFO
{
g_id,
g_text[MAX_GRAFFITI_TEXT],
g_font[8],
g_color,
g_size,
g_outline,
g_v_world, g_interior,
Float:g_x, Float:g_y, Float:g_z,
Float:g_r_x, Float:g_r_y, Float:g_r_z
};
new g_info[MAX_PLAYERS][E_GRAFFITI_INFO];
- Теперь добавим команду.
PHP код:
COMMAND:graffiti(playerid, params[])
{
static str_g_text_0[] = !"{FFFFFF}1. {FAF0E6}Текст граффити - Не указан\n";
static str_g_text_1[] = !"{FFFFFF}1. {FAF0E6}Текст граффити - Указан\n";
static str_g_font_0[] = !"{FFFFFF}2. {FAF0E6}Шрифт граффити - Не указан\n";
static str_g_font_1[] = !"{FFFFFF}2. {FAF0E6}Шрифт граффити - Указан\n";
static str_g_color_0[] = !"{FFFFFF}3. {FAF0E6}Цвет граффити - Не указан\n";
static str_g_color_1[] = !"{FFFFFF}3. {FAF0E6}Цвет граффити - Указан\n";
static str_g_size_0[] = !"{FFFFFF}4. {FAF0E6}Размер граффити - Не указан\n";
static str_g_size_1[] = !"{FFFFFF}4. {FAF0E6}Размер граффити - Указан\n";
static str_g_outline_0[] = !"{FFFFFF}5. {FAF0E6}Обводка граффити - Выключена\n";
static str_g_outline_1[] = !"{FFFFFF}5. {FAF0E6}Обводка граффити - Включена\n";
static str_g_end[] = !"{FFFFFF}6. {FAF0E6}Нарисовать граффити";
static str[ sizeof str_g_text_0 +
sizeof str_g_font_0 +
sizeof str_g_color_0 +
sizeof str_g_size_0 +
sizeof str_g_outline_0 +
sizeof str_g_end ];
if (isnull(g_info[playerid][g_text]))
{
strcat(str, str_g_text_0);
}
else strcat(str, str_g_text_1);
if (isnull(g_info[playerid][g_font]))
{
strcat(str, str_g_font_0);
}
else strcat(str, str_g_font_1);
if (g_info[playerid][g_color] == -1)
{
strcat(str, str_g_color_0);
}
else strcat(str, str_g_color_1);
if (g_info[playerid][g_size] == -1)
{
strcat(str, str_g_size_0);
}
else strcat(str, str_g_size_1);
if (g_info[playerid][g_outline] == -1)
{
strcat(str, str_g_outline_0);
}
else strcat(str, str_g_outline_1);
strcat(str, str_g_end);
ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU, DIALOG_STYLE_LIST,
!"{FAF0E6}> Граффити",
str,
!"Далее", !"Отмена"
);
str[0] = EOS;
return 1;
}
- Добавим ответ на граффити-меню. Это суем в OnDialogResponse
PHP код:
case DIALOG_GRAFFITI_MENU:
{
if (!response)
{
return DeleteGraffiti(playerid);
}
switch (listitem)
{
case 0:
{
return ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU + 1, DIALOG_STYLE_INPUT,
!" ",
!"{FFFFFF}Введите текст для граффити:",
!"Далее", !"Отмена"
);
}
case 1:
{
return ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU + 2, DIALOG_STYLE_LIST,
!" ",
!"{FFFFFF}- Arial\n- Calibri\n- Tahoma\n- Verdana",
!"Далее", !"Отмена"
);
}
case 2:
{
return ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU + 3, DIALOG_STYLE_LIST,
!" ",
!"{FFFFFF}- Желтый\n- Красный\n- Синий\n- Белый\n- Зеленый\n- Черный\n\
- Ввести вручную",
!"Далее", !"Отмена"
);
}
case 3:
{
return ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU + 4, DIALOG_STYLE_INPUT,
!" ",
!"Введите размер:",
!"Далее", !"Отмена"
);
}
case 4:
{
if (g_info[playerid][g_outline] == 0)
{
g_info[playerid][g_outline] = 1;
}
g_info[playerid][g_outline] = 0;
return cmd::graffiti(playerid, "");
}
case 5:
{
if (GetPVarInt(playerid, !"GRAFFITI_VALUE") < 4)
{
DeleteGraffiti(playerid);
return SendClientMessage(playerid, -1,
!"Не все пункты выбраны"
);
}
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
g_info[playerid][g_id] = CreateDynamicObject(
19353,
x-1.0, y, z,
0.0, 0.0, 0.0,
GetPlayerVirtualWorld(playerid),
GetPlayerInterior(playerid)
);
SetDynamicObjectMaterialText(
g_info[playerid][g_id],
0,
g_info[playerid][g_text],
OBJECT_MATERIAL_SIZE_512x512,
g_info[playerid][g_font],
g_info[playerid][g_size],
g_info[playerid][g_outline],
g_info[playerid][g_color],
0,
OBJECT_MATERIAL_TEXT_ALIGN_CENTER
);
EditDynamicObject(playerid, g_info[playerid][g_id]);
return 1;
}
}
return 1;
}
case DIALOG_GRAFFITI_MENU + 1:
{
SetPVarInt(playerid, !"GRAFFITI_VALUE", GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
if (!response)
{
return DeleteGraffiti(playerid);
}
if ((1 <= strlen(inputtext) <= MAX_GRAFFITI_TEXT) == 0)
{
return ShowPlayerDialog(playerid, DIALOG_GRAFFITI_MENU + 1, DIALOG_STYLE_INPUT,
!" ",
!"{FFFFFF}Введите текст для граффити:",
!"Далее", !"Отмена"
);
}
strins(g_info[playerid][g_text], inputtext, 0);
return cmd::graffiti(playerid, "");
}
case DIALOG_GRAFFITI_MENU + 2:
{
if (!response)
{
return DeleteGraffiti(playerid);
}
SetPVarInt(playerid, !"GRAFFITI_VALUE", GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
static const g_fonts[][] =
{
!"Arial",
!"Calibri",
!"Tahoma",
!"Verdana"
};
strcat(g_info[playerid][g_font], g_fonts[listitem]);
return cmd::graffiti(playerid, "");
}
case DIALOG_GRAFFITI_MENU + 3:
{
if (!response)
{
return DeleteGraffiti(playerid);
}
SetPVarInt(playerid, !"GRAFFITI_VALUE", GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
if (listitem == 6)
{
sscanf(inputtext, "h", g_info[playerid][g_color]);
}
else
{
static const g_colors[]=
{
0xFFFF00AA,
0xFF0000AA,
0x0000FFAA,
0xFFFFFFAA,
0x00FF00AA,
0x000000AA
};
g_info[playerid][g_color] = g_colors[listitem];
}
return cmd::graffiti(playerid, "");
}
case DIALOG_GRAFFITI_MENU + 4:
{
SetPVarInt(playerid, !"GRAFFITI_VALUE", GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
if (!response)
{
return DeleteGraffiti(playerid);
}
sscanf(inputtext, "i", g_info[playerid][g_size]);
return cmd::graffiti(playerid, "");
}
- Чтобы зафиксировать актуальное положение граффити, нам необходимо обновить их в OnPlayerEditDynamicObject. В этом же паблике можете добавить такую же "фильтрацию" содержимого граффити. Я этого делать не стал.
PHP код:
public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
if (!response)
{
DeleteGraffiti(playerid);
return 1;
}
g_info[playerid][g_x] = x;
g_info[playerid][g_y] = y;
g_info[playerid][g_z] = z;
g_info[playerid][g_r_x] = rx;
g_info[playerid][g_r_y] = ry;
g_info[playerid][g_r_z] = rz;
return 1;
}
- Добавим функцию. Суть ее в том, чтобы всем массивам поставить значение '\0' и '-1'. Это нужно для проверки. И просто я мазахист.
PHP код:
stock DeleteGraffiti(playerid)
{
DestroyDynamicObject(g_info[playerid][g_id]);
g_info[playerid][g_text][0] = g_info[playerid][g_font][0] = EOS;
g_info[playerid][g_color] = g_info[playerid][g_size] =
g_info[playerid][g_outline] = g_info[playerid][g_id] = -1;
return 1;
}
- Заменим все значения при старте мода. Это суем в OnGameModeInit
PHP код:
for (new i; i < MAX_PLAYERS; i++)
DeleteGraffiti(i);
Автор кода, но не идеи - Untonyst. Я разрешаю вам копипастить куда захотите, но только меня как автора указывать не забывайте.