OKStyle
Эксперт
Недавно на форуме проскакивал мануал по ТОПу собирателей конфет для этого праздника. В данном уроке я решил немного изменить концепцию эвента и собирать тыквы, выставленные жителями.
1. Для начала найдём модель тыквы с помощью Editor'а, про который я рассказывал в прошлых уроках.
2. Теперь нарисуем текстдрав, чтобы всё было наглядно. Делайте с промощью тех инструментов, которые вам удобны. Я предпочитаю Zamaroht's TextDraw Editor (версия с поддержкой превью моделей).
3. Выбирайте сами, что для вас проще: сделать 2 персональных текстдрава, либо 1 глобальный (тыква) и 1 персональный (счётчик). Я выбрал второй вариант. Нарисовал - экспортировал и получилось:
В начале создадим эти переменные текстдравов:
В OnFilterScriptInit:
В OnFilterScriptExit:
В OnPlayerConnect:
4. Далее надо собрать координаты мест появления пикапов тыквы. Я выбрал коттеджный посёлок в Сан-Фиерро. В этом месте можно все дома сделать с интерьером без телепорта (что и было сделано в Vintage с подбором соответствующих текстур, кстати).
Подходим к дверям, набираем /save и так до нужного количества.
Кстати, собранные мной координаты можно использовать и для пикапов телепорта в интерьер этих домов, либо для расскидывания пикапов покупки.
5. Собрав все координаты, открываем наш лог по адресу: Documents\GTA San Andreas User Files\SAMP\savedpositions.txt
Создаём соответствующую переменную и, копируя координаты, вставляем в наш ФС.
У меня получилось 121 строка. Сделаем константу для работы с массивами:
6. Теперь нужно эти координаты преобразовать в требуемый вид. Выделяем все координаты, нажимаем TAB, чтобы сделать отступ по всем строкам. Нажимаем Ctrl + H и вводим:
В Search for...
Replace with...
Затем "Yes to all"
Мы заменили часть ненужного кода на нужный. Теперь для красоты нужно поставить пробелы после запятых, чтобы визуально отделить координаты по осям X, Y, Z. Снова нажимаем Ctrl + H, но теперь в первое поле ставим запятую, а во второе - запятую и пробел.
ВНИМАНИЕ: "Yess to all" заменит по всему коду, поэтому преобразовывать координаты лучше до внедрения кода текстдравов, чтобы не убирать двойные пробелы (хотя метод такой же: в первое поле 2 пробела, во второе - 1).
Далее нужно заменить окончание кода на необходимое, поэтому снова Ctrl + H, первое поле:
второе:
ВНИМАНИЕ: Обратите внимание, что на последней строке координат запятую нужно будет убрать.
Далее можно было убрать координату поворота (вручную, т.к. они разные), но чтобы не тратить время я просто увеличу кол-во координат в заголовке массива:
7. Теперь нужно расставить пикапы. Сделаем это циклом при загрузке скрипта.
P.S. Я рекомендую сделать так, чтобы следующая тыква появлялась на рандомном месте после подбора предыдущей. Так будет интереснее и челлендж намного усложнится. Также рекомендую сделать его запуск командой админа с запросом участников на перемещение в зону эвента. Также можно сделать отдельный виртуальный мир, чтобы никто не мешал.
8. Теперь следует сделать реакцию на подбор пикапа. В OnPlayerPickUpPickup также циклом, как и реакция на остальные массовые пикапы, типа телепорта или покупки недвижки:
9. Теперь выбираете когда показывать текстдрав (например, при старте админом эвента). Я покажу при коннекте:
10. И не забываем удалять при дисконнекте:
11. Устанавливаем серверный параметр для счётчика тыковок. В OnFilterScriptInit:
12. В реакции на подбор пикапа добавим убавление:
и покажем сообщение, что все тыквы кончились:
Ну а дальше ваш полёт фантазии никто не ограничивает: делайте топы участников, награды за выполнение и много всего остального, о чём вы догадались, а я ещё не написал.
Полный листинг кода урока:
Автор: OKStyle
1. Для начала найдём модель тыквы с помощью Editor'а, про который я рассказывал в прошлых уроках.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
2. Теперь нарисуем текстдрав, чтобы всё было наглядно. Делайте с промощью тех инструментов, которые вам удобны. Я предпочитаю Zamaroht's TextDraw Editor (версия с поддержкой превью моделей).
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
3. Выбирайте сами, что для вас проще: сделать 2 персональных текстдрава, либо 1 глобальный (тыква) и 1 персональный (счётчик). Я выбрал второй вариант. Нарисовал - экспортировал и получилось:
В начале создадим эти переменные текстдравов:
PHP:
new Text:TD_Pumpkin, PlayerText:TD_PCount[MAX_PLAYERS];
PHP:
TD_Pumpkin = TextDrawCreate(553.0, 43.0, "Pumpkin");
TextDrawBackgroundColor(TD_Pumpkin, 0);
TextDrawFont(TD_Pumpkin, 5);
TextDrawLetterSize(TD_Pumpkin, 0.5, 1.0);
TextDrawSetOutline(TD_Pumpkin, 0);
TextDrawUseBox(TD_Pumpkin, 1);
TextDrawTextSize(TD_Pumpkin, 94.0, 108.0);
TextDrawSetPreviewModel(TD_Pumpkin, 19320);
TextDrawSetPreviewRot(TD_Pumpkin, -16.0, 0.0, -55.0, 1.0);
PHP:
for(new i; i < sizeof(TD_PCount); i++) PlayerTextDrawDestroy(i, TD_PCount[i]);
TextDrawDestroy(TD_Pumpkin);
PHP:
TD_PCount[playerid] = CreatePlayerTextDraw(playerid, 589.0, 110.0, "1000/1000");
PlayerTextDrawAlignment(playerid, TD_PCount[playerid], 3);
PlayerTextDrawFont(playerid, TD_PCount[playerid], 3);
PlayerTextDrawLetterSize(playerid, TD_PCount[playerid], 0.39, 1.4);
PlayerTextDrawColor(playerid, TD_PCount[playerid], 0xC16001FF); // -1050672641
PlayerTextDrawSetOutline(playerid, TD_PCount[playerid], 1);
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Подходим к дверям, набираем /save и так до нужного количества.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Кстати, собранные мной координаты можно использовать и для пикапов телепорта в интерьер этих домов, либо для расскидывания пикапов покупки.
5. Собрав все координаты, открываем наш лог по адресу: Documents\GTA San Andreas User Files\SAMP\savedpositions.txt
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Создаём соответствующую переменную и, копируя координаты, вставляем в наш ФС.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
У меня получилось 121 строка. Сделаем константу для работы с массивами:
PHP:
#define MAX_PUMPKINS 121
В Search for...
Код:
AddPlayerClass(0,
Код:
{
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Мы заменили часть ненужного кода на нужный. Теперь для красоты нужно поставить пробелы после запятых, чтобы визуально отделить координаты по осям X, Y, Z. Снова нажимаем Ctrl + H, но теперь в первое поле ставим запятую, а во второе - запятую и пробел.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
ВНИМАНИЕ: "Yess to all" заменит по всему коду, поэтому преобразовывать координаты лучше до внедрения кода текстдравов, чтобы не убирать двойные пробелы (хотя метод такой же: в первое поле 2 пробела, во второе - 1).
Далее нужно заменить окончание кода на необходимое, поэтому снова Ctrl + H, первое поле:
Код:
, 0, 0, 0, 0, 0, 0); //
Код:
},
Далее можно было убрать координату поворота (вручную, т.к. они разные), но чтобы не тратить время я просто увеличу кол-во координат в заголовке массива:
PHP:
new Float:Coord_Pumpkins[MAX_PUMPKINS][4];
PHP:
for(new i; i < MAX_PUMPKINS; i++) PU_Pumpkin[i] = CreatePickup(19320, 23, Coord_Pumpkins[i][0], Coord_Pumpkins[i][1], Coord_Pumpkins[i][2]);
8. Теперь следует сделать реакцию на подбор пикапа. В OnPlayerPickUpPickup также циклом, как и реакция на остальные массовые пикапы, типа телепорта или покупки недвижки:
PHP:
for(new i, string[10], pumpkin = GetPVarInt(playerid, !"Pumpkin"); i < MAX_PUMPKINS; i++)
{
if(pickupid != PU_Pumpkin[i]) continue;
DestroyPickup(pickupid); // уничтожаем пикап после подбора, чтобы не собирать дважды
SetPVarInt(playerid, !"Pumpkin", pumpkin + 1); // прибавляем кол-во собранных тыковок
format(string, sizeof(string), "%04d/%04d", pumpkin + 1, MAX_PUMPKINS);
PlayerTextDrawSetString(playerid, TD_PCount[playerid], string); // обновляем текстдрав
SendClientMessage(playerid, -1, !"Вы подобрали {C16001}тыковку{FFFFFF}! Собирайте дальше!");
}
PHP:
PlayerTextDrawShow(playerid, TD_PCount[playerid]);
PHP:
PlayerTextDrawDestroy(playerid, TD_PCount[playerid]);
PHP:
SetSVarInt(!"PumpkinsCount", 121);
PHP:
SetSVarInt(!"PumpkinsCount", GetSVarInt(!"PumpkinCount") - 1);
PHP:
if(pcount - 1 == 0) return SendClientMessage(playerid, -1, !"Эвент окончен!"); // сюда же добавить удаление текстдравов, удаление переменных PVar и SVar
Полный листинг кода урока:
PHP:
#include <a_samp>
// Pumpkin Event by O.K.Style™ [24.12.2020]
#define MAX_PUMPKINS 121
new Text:TD_Pumpkin, PlayerText:TD_PCount[MAX_PLAYERS], PU_Pumpkin[MAX_PUMPKINS], Float:Coord_Pumpkins[MAX_PUMPKINS][4] = {
{-2621.3674, -198.0738, 4.3359, 89.9277},
{-2625.6733, -191.2275, 7.2031, 100.2678},
{-2620.7019, -185.8254, 7.2031, 181.4219},
{-2620.6172, -173.2786, 5.0000, 83.0576},
{-2621.7275, -169.5667, 4.3426, 89.3244},
{-2625.8499, -162.5011, 7.2031, 3.7110},
{-2618.7795, -153.5234, 4.3359, 83.9977},
{-2620.7920, -146.4186, 7.2031, 350.6235},
{-2621.0166, -134.6980, 5.0000, 86.8177},
{-2619.0415, -127.5098, 4.3359, 86.8177},
{-2620.7024, -120.0114, 7.2031, 178.3119},
{-2621.6951, -112.4494, 4.3426, 87.7577},
{-2625.8496, -105.1983, 7.2031, 91.5177},
{-2623.2092, -99.3233, 7.2031, 355.8776},
{-2619.2542, 57.5593, 4.3359, 83.6842},
{-2618.9607, 67.9465, 4.3359, 92.7709},
{-2621.7654, 71.7744, 4.3359, 2.7709},
{-2625.8086, 78.7744, 7.2031, 113.7645},
{-2620.7578, 96.7588, 5.0000, 94.9643},
{-2620.6794, 103.3893, 7.2031, 355.9500},
{-2621.0403, 114.9412, 5.0000, 96.5310},
{-2620.7449, 120.8148, 7.2031, 173.2984},
{-2623.2734, 131.6887, 7.2031, 177.4443},
{-2621.9482, 168.5939, 7.1953, 89.9509},
{-2628.0203, 168.5343, 5.0000, 343.4166},
{-2639.4277, 168.4971, 7.1953, 276.3627},
{-2635.0046, 239.6991, 4.4956, 273.2296},
{-2631.1357, 252.7615, 7.1875, 273.2296},
{-2635.0579, 260.9764, 4.3281, 288.8964},
{-2628.5161, 267.3065, 7.1953, 275.1096},
{-2632.2046, 274.6188, 4.3348, 173.8293},
{-2654.1670, 200.4650, 5.0000, 297.0922},
{-2660.6685, 200.4579, 7.1953, 90.8443},
{-2672.2083, 200.3595, 5.0000, 176.6983},
{-2678.3008, 200.4976, 7.1953, 271.0126},
{-2689.0466, 198.0978, 7.2031, 186.4352},
{-2688.6738, 137.0862, 4.3426, 270.7226},
{-2684.4626, 130.0085, 7.2031, 263.8292},
{-2691.0789, 123.7171, 4.3359, 270.7226},
{-2686.7974, 115.4100, 7.1953, 254.1158},
{-2691.1750, 102.1918, 4.3359, 272.6028},
{-2689.5020, 96.1190, 7.2031, 90.6504},
{-2689.5056, 74.6677, 7.2031, 183.9287},
{-2690.7029, 64.5144, 4.6169, 278.8696},
{-2689.4954, 56.7925, 7.2031, 359.3970},
{-2688.3779, -89.4245, 4.3359, 263.5163},
{-2684.6008, -96.5022, 7.2031, 265.3964},
{-2689.5359, -101.7230, 7.2031, 353.4438},
{-2689.5259, -114.1691, 5.0000, 255.9962},
{-2688.3879, -118.1242, 4.3426, 274.4831},
{-2684.4653, -125.1037, 7.2031, 265.3963},
{-2690.9751, -133.9093, 4.3359, 261.9497},
{-2689.5298, -141.0202, 7.2031, 176.7222},
{-2689.3955, -152.7797, 5.0000, 273.5433},
{-2690.7087, -159.8818, 4.6237, 274.7967},
{-2689.5149, -167.4953, 7.2031, 348.4307},
{-2688.4209, -175.2361, 4.3426, 275.7368},
{-2684.4685, -182.1861, 7.2031, 266.0234},
{-2687.0938, -188.0933, 7.2031, 158.7897},
{-2724.0979, -191.2534, 4.3359, 107.4751},
{-2728.0925, -184.0993, 7.2031, 88.3615},
{-2722.9854, -179.0755, 7.2031, 176.4090},
{-2723.2131, -166.3926, 5.0000, 86.1681},
{-2724.0471, -162.7380, 4.3426, 85.5415},
{-2728.1350, -155.6331, 7.2031, 74.8880},
{-2721.5056, -146.8372, 4.3359, 76.1414},
{-2722.9932, -139.6268, 7.2031, 10.3407},
{-2723.0854, -127.8931, 5.0000, 82.4081},
{-2721.6111, -120.6580, 4.3359, 78.6480},
{-2723.0598, -113.3589, 7.2031, 178.6022},
{-2724.0784, -105.5257, 4.3426, 87.1314},
{-2728.1099, -98.4537, 7.2031, 76.4780},
{-2725.5388, -92.4684, 7.2031, 357.1314},
{-2724.0940, -58.0708, 4.3426, 93.0848},
{-2728.1948, -50.9410, 7.2031, 96.8448},
{-2721.8198, -44.7243, 4.3359, 187.7849},
{-2725.4780, -36.4602, 7.1953, 83.6847},
{-2721.8088, -23.4010, 4.5713, 60.1845},
{-2723.0845, -17.2875, 7.2031, 189.2791},
{-2723.0510, 4.3401, 7.2031, 3.1573},
{-2721.9087, 14.4917, 4.6347, 87.4447},
{-2723.1689, 22.0719, 7.2031, 92.3856},
{-2792.2358, 218.6695, 7.8594, 262.9364},
{-2791.8933, 212.0003, 10.0547, 267.3956},
{-2791.7397, 200.4682, 7.8594, 262.6231},
{-2791.8320, 194.5210, 10.0547, 349.1040},
{-2789.2559, 183.7364, 10.0625, 268.8900},
{-2791.7195, 143.2712, 10.0547, 357.8775},
{-2791.9133, 130.6062, 7.8594, 273.6135},
{-2790.6411, 126.8061, 7.2020, 269.8535},
{-2786.9888, 119.7936, 10.0625, 259.2000},
{-2793.4072, 110.9931, 7.1875, 242.9065},
{-2791.9331, 103.5950, 10.0547, 179.2993},
{-2791.8376, 92.1330, 7.8594, 265.1534},
{-2793.3779, 84.9856, 7.1875, 257.9467},
{-2791.8267, 77.4084, 10.0547, 2.9143},
{-2790.6724, 69.7640, 7.2020, 269.8769},
{-2786.8469, 62.6373, 10.0625, 270.1903},
{-2793.3169, 21.3722, 7.1875, 252.0170},
{-2793.1423, 11.0408, 7.4320, 278.6506},
{-2790.8000, 7.2039, 7.1953, 269.2505},
{-2786.9758, 0.0985, 10.0625, 279.9040},
{-2791.8357, -17.8683, 7.8594, 272.6974},
{-2791.9045, -24.3966, 10.0547, 186.2166},
{-2791.6580, -35.9584, 7.8594, 269.5642},
{-2791.8704, -41.8746, 10.0547, 354.4784},
{-2789.2520, -52.7647, 10.0625, 271.7576},
{-2790.7473, -82.5973, 7.1953, 275.5178},
{-2787.0608, -89.7776, 10.0625, 262.3577},
{-2791.8149, -94.7834, 10.0547, 341.3185},
{-2791.8196, -107.4489, 7.8594, 259.8512},
{-2790.5808, -111.1961, 7.2020, 277.3982},
{-2786.7854, -118.2342, 10.0625, 247.3177},
{-2793.4670, -127.0373, 7.1875, 217.2375},
{-2791.9170, -134.4646, 10.0547, 184.3372},
{-2791.5859, -146.0358, 7.8594, 269.5647},
{-2793.2432, -153.1073, 7.1875, 279.2781},
{-2791.8325, -160.4682, 10.0547, 2.3123},
{-2790.6843, -168.2618, 7.2020, 272.0949},
{-2786.9297, -175.3923, 10.0625, 256.7415},
{-2789.3833, -181.4192, 10.0625, 273.3483}
};
public OnFilterScriptInit()
{
SetSVarInt(!"PumpkinsCount", 121);
TD_Pumpkin = TextDrawCreate(553.0, 43.0, "Pumpkin");
TextDrawBackgroundColor(TD_Pumpkin, 0);
TextDrawFont(TD_Pumpkin, 5);
TextDrawLetterSize(TD_Pumpkin, 0.5, 1.0);
TextDrawSetOutline(TD_Pumpkin, 0);
TextDrawUseBox(TD_Pumpkin, 1);
TextDrawTextSize(TD_Pumpkin, 94.0, 108.0);
TextDrawSetPreviewModel(TD_Pumpkin, 19320);
TextDrawSetPreviewRot(TD_Pumpkin, -16.0, 0.0, -55.0, 1.0);
for(new i; i < MAX_PUMPKINS; i++) PU_Pumpkin[i] = CreatePickup(19320, 23, Coord_Pumpkins[i][0], Coord_Pumpkins[i][1], Coord_Pumpkins[i][2]);
return 1;
}
public OnFilterScriptExit()
{
for(new i; i < sizeof(TD_PCount); i++) PlayerTextDrawDestroy(i, TD_PCount[i]);
TextDrawDestroy(TD_Pumpkin);
return 1;
}
public OnPlayerConnect(playerid)
{
TD_PCount[playerid] = CreatePlayerTextDraw(playerid, 589.0, 110.0, "1000/1000");
PlayerTextDrawAlignment(playerid, TD_PCount[playerid], 3);
PlayerTextDrawFont(playerid, TD_PCount[playerid], 3);
PlayerTextDrawLetterSize(playerid, TD_PCount[playerid], 0.39, 1.4);
PlayerTextDrawColor(playerid, TD_PCount[playerid], -1050672641);
PlayerTextDrawSetOutline(playerid, TD_PCount[playerid], 1);
PlayerTextDrawShow(playerid, TD_PCount[playerid]);
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
PlayerTextDrawDestroy(playerid, TD_PCount[playerid]);
return 1;
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
for(new i, string[10], pumpkin = GetPVarInt(playerid, !"Pumpkin"), pcount = GetSVarInt(!"PumpkinCount"); i < MAX_PUMPKINS; i++)
{
if(pickupid != PU_Pumpkin[i]) continue;
DestroyPickup(pickupid);
SetPVarInt(playerid, !"Pumpkin", pumpkin + 1);
SetSVarInt(!"PumpkinCount", pcount - 1);
format(string, sizeof(string), "%04d/%04d", pumpkin + 1, MAX_PUMPKINS);
PlayerTextDrawSetString(playerid, TD_PCount[playerid], string);
SendClientMessage(playerid, -1, !"Вы подобрали {C16001}тыковку{FFFFFF}! Собирайте дальше!");
if(pcount - 1 == 0) return SendClientMessage(playerid, -1, !"Эвент окончен!");
}
return 1;
}
Последнее редактирование:
