Форум Pawn.Wiki - Воплоти мечту в реальность!: Улучшенные пикапы на ALT (smart_pickup) - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Улучшенные пикапы на ALT (smart_pickup) Оценка: -----

#1
Пользователь офлайн   continue 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Привет! Начал на форуме замечать много тем о том как сделать пикапы на ALT. Ещё в 2021 у меня стояла задача написать гибкую систему пикапов, которая работала бы через создание пикапа и обратным вызовом коллбэка, где можно было бы описать логику пикапов. Полировка функционала прошла длительный процесс, после которого данный инклуд трогался редко. Представляю Вам smart_pickup (название было придумано на коленке, теперь у smart_* инклудов есть: smart_moving_object (управление движением объекта), smart_actor, smart_3dtext) Все это завернуто через динамические зоны (перфекционисты вышли из чата, то что зоны медленно работают). Переходим к функционалу:

- Работа по разным типам фигур (shape):

  • Цилиндер
  • Куб
  • Полуцилиндер


- Обратный вызов при взаимодействий с пикапом (OnPlayerEnterSmartPickup/OnPlayerLeaveSmartPickup)

И функции get'ры (достать иды 3д текстов и т.д) [смотреть в код, кому то лень описывать все это]

Перейдем к созданию пикапов:

Сигнатура функции:

stock [email protected](
	const model_pickup,
	const Float: x_pos,
	const Float: y_pos,
	const Float: z_pos,
	const Float: size,
	const e_smart_pick_action_type: action_type, // созданы для определения типа действия (бизнесы/дома и т.д)
	const Float: min_z = -FLOAT_INFINITY,
	const Float: max_z = FLOAT_INFINITY,
	const description_text[] = "",
	const e_smart_pick_shape_type: shape_type = SMART_PICK_CUBOID_TYPE,
	const virtual_world = 0,
	const Float: angle = 245.0,
	const interior_id = 0,
	const key_id = -1,
	const Float: text3d_draw_distance = SMART_PICK_DRAW_DIST_3D_LABEL,
	const bool: test_los = false,
	const bool: is_need_debug_area = false
)


Как видно из сигнатуры функции прямо тут же можно создавать описание пикапа (3д текст над пикапом) за это отвечает параметр description_text. Сообственно 3 пикапа с разными типами фигур (область действия пикапа):

public OnGameModeInit()
{
	g_smrt_pick_semicylinder_id = [email protected](
		1_582,
		0.3996,
		1.2518,
		3.1172,
		2.5,
		.action_type = SMART_PICK_INFO_ACTION_TYPE,
		.description_text = "Привет! Я пикап с зоной действия \"полуцилиндер\"",
		.shape_type = SMART_PICK_SEMICYLINDER_TYPE,
		.key_id = KEY_JUMP, // зададим пикапу с полуцилиндром работать ТОЛЬКО на LSHIFT. Если указано -1, то кнопка не установлена и пикап будет триггерится на заход в зону!
		.test_los = false,
		.is_need_debug_area = true
	);

	g_smrt_pick_cuboid_id = [email protected](
		2_057,
		22.4809,
		8.5867,
		3.1172,
		2.5,
		.action_type = SMART_PICK_INFO_ACTION_TYPE,
		.description_text = "Привет! Я пикап с зоной действия \"куб\"",
		.shape_type = SMART_PICK_CUBOID_TYPE,
		.key_id = -1,
		.test_los = false,
		.is_need_debug_area = true
	);

	g_smrt_pick_cylinder_id = [email protected](
		2_057,
		33.4954,
		13.0710,
		3.1172,
		2.5,
		.action_type = SMART_PICK_INFO_ACTION_TYPE,
		.description_text = "Привет! Я пикап с зоной действия \"цилиндер\"",
		.shape_type = SMART_PICK_CYLINDER_TYPE,
		.key_id = -1,
		.test_los = false,
		.is_need_debug_area = true
	);
	return 1;
}


public OnPlayerEnterSmartPickup(const playerid, const smart_pickup_id, const key_id)
{
	static const shape_type_names[][] = 
	{
		{ "полуцилиндер" },
		{ "куб" },
		{ "цилиндер" }
	};

	new
		e_smart_pick_shape_type: shape_type = [email protected](smart_pickup_id),
		player_name[MAX_PLAYER_NAME + 1],
		key_id_str[32];

	format(key_id_str, sizeof(key_id_str), "%d (id)", key_id);

	GetPlayerName(playerid, player_name);

	static const str[] = "Игрок %s [ID: %d] зашел в умный пикап с ID'ом: %d. Кнопка: %s, зона действия: %s";
	new fmt_str[sizeof(str) - 2 * 4 + MAX_PLAYER_NAME + 1  + 11 * 2 + 64 + sizeof(key_id_str)];
	format(
		fmt_str,
		sizeof(fmt_str),
		str,
		player_name,
		playerid,
		smart_pickup_id,
		(key_id == -1) ? "пикап без кнопки" : key_id_str,
		shape_type_names[_:shape_type]
	);
	SendClientMessageToAll(-1, fmt_str);

	if (g_smrt_pick_cylinder_id == smart_pickup_id)
	{
		// действие на пикап с цилиндром
	}
	else if (g_smrt_pick_cuboid_id == smart_pickup_id)
	{
		// действие на пикап с кубом
	}
	else if (g_smrt_pick_semicylinder_id == smart_pickup_id)
	{
		// действия на пикап с полуцилиндром
	}
	return 1;
}


Для работы нужен: foreach, streamer (3dtryg для того чтобы рисовать зону действия, если вы не используйте is_need_debug_area, то Вам он не нужен). Видео с работой библиотеки:



По всему вопросам могу ответить либо я, либо @Saibot (у него имеется опыт использование данной нанотенхологии библиотеки)


Код: https://gist.github....cb8c5b080b02859

P.S: Код далек от идеала, но это работает, мне лень фиксить некоторые моменты, может быть когда нибудь исправлю.
Прикрепленные файлы [Показать]

Сообщение отредактировал continue: 14 ноября 2022 - 10:57

5

#2
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Годно) Еще ждем готовую систему шлагбаумов :happy:
0

#3
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Закинь на пасту или ещё куда нибудь, чтоб не скачивать.
0

#4
Пользователь офлайн   continue 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (14 ноября 2022 - 10:42) писал:

Закинь на пасту или ещё куда нибудь, чтоб не скачивать.


https://gist.github....cb8c5b080b02859
1

#5
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Ещё бы добавить поддержку y_hooks с коробки, эх :rolleyes:

Но задумка гениальная, спору нет.
0

#6
Пользователь офлайн   continue 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (14 ноября 2022 - 11:11) писал:

Ещё бы добавить поддержку y_hooks с коробки, эх :rolleyes:

Но задумка гениальная, спору нет.


Использовалось в боевых условиях. В моих разработках y_hooks не живет, но может быть как нибудь потом добавлю :)

Сообщение отредактировал continue: 14 ноября 2022 - 11:30

1

#7
Пользователь офлайн   Romzes 

  • ( ^_^ )
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (14 ноября 2022 - 11:11) писал:

добавить поддержку y_hooks с коробки


Страшно, не надо. Ну если только опционально, то можно...
0

#8
Пользователь онлайн   aureliusnull 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Хорошая работа.

Сообщение отредактировал aureliusnull: 15 ноября 2022 - 10:43

0

#9
Пользователь офлайн   continue 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Обнова:



Работает через Streamer_SetArrayData, нужны для того чтобы можно было создавать пикапы на одних координатах, но в разных мирах (как пример: больница).
Прикрепленные файлы [Показать]

Сообщение отредактировал continue: 25 марта 2023 - 16:57

0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика