Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Создание объектов из игры (MySQL, DC_CMD, sscanf)

Статус
В этой теме нельзя размещать новые ответы.

Untonyst

Изучающий
Регистрация
10 Ноя 2015
Сообщения
135
Лучшие ответы
0
Репутация
87
Классическая система создания объектов из игры​


Здравствуйте, уважаемые пользователи форума. Хочу представить вам уже классическую тему - создание объектов из игры. Но весь сахар в том, что объекты сохраняются и загружаются из базы данных. Немного про тех. характеристики: MySQL R39-x, sscanf2, dc_cmd. Внизу будет ссылка на скачку тестового мода, где я собственно и писал систему, я приложу ее как демо. Как разобраться с модом, где только одна система, надеюсь, сможете сами :).

На форуме была пара тем с подобной системой, но есть но: темы не темы (шапка очищена, кода нет + моя на MySQL.

Автор системы: Untonyst





Вставляем это в начало мода. Здесь мы будем сохранять информацию об каждом созданном объекте.
PHP:
#define o<%1:%0> \
	db_objects[%0][%1]

const OBJECTS_LIMIT = 1000;

new IsLastObject;

enum DB_OBJECTS
{
	object_id,
	model_id,
	Float:f_x,
	Float:f_y,
	Float:f_z,
	Float:f_rx,
	Float:f_ry,
	Float:f_rz,
	world_id,
	interior_id
}
new db_objects[OBJECTS_LIMIT][DB_OBJECTS];
Это вставляем туда, где у вас все команды. Так как это ZCMD/DC_CMD, то в каллбэк OnPlayerCommandText это вставлять НЕ надо! Команда создает объект на сервере.

PHP:
COMMAND:create(playerid, params[])
{
	if(sscanf(params, "i", params[0]))
		return SendClientMessage(playerid, -1, "Введите /create [model id]");
	new Float:x, Float:y, Float:z;
	GetPlayerPos(playerid, x, y, z);
	IsLastObject = CreateObject(params[0], x, y, z, 0, 0, 0);
	printf("Объект id %i", IsLastObject);
	EditObject(playerid, IsLastObject);
	return 1;
}
Если у вас нет каллбэка OnPlayerEditObject, то добавьте весь код, который ниже, а если у вас есть этот паблик, то добавляем код, который внутри каллбэка приведенного ниже. Он отвечает управление объектом.
PHP:
public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
{
	if(!playerobject)
	{
		if(!IsValidObject(objectid))
			return 1;
		MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
	}
	if(response == EDIT_RESPONSE_FINAL)
	{
		o<f_x:IsLastObject> = fX;
		o<f_y:IsLastObject> = fY;
		o<f_z:IsLastObject> = fZ;
		o<f_rx:IsLastObject> = fRotX;
		o<f_ry:IsLastObject> = fRotY;
		o<f_rz:IsLastObject> = fRotZ;
		o<world_id:IsLastObject> = GetPlayerVirtualWorld(playerid);
		o<interior_id:IsLastObject> = GetPlayerInterior(playerid);
		o<model_id:IsLastObject> = GetObjectModel(IsLastObject);
		MySQL__CreateObjects(IsLastObject);
		CancelEdit(playerid);
		SendClientMessage(playerid, -1, "Объект установлен.");
		return 1;
	}
	if(response == EDIT_RESPONSE_CANCEL)
	{
		SendClientMessage(playerid, -1, "Установка объекта отменена.");
		DestroyObject(IsLastObject);
		IsLastObject -= 1;
		CancelEdit(playerid);
		return 1;
	}
	return 1;
}
Это добавим в конец мода, ну как обычно. Функция создают в таблице с объектами столбец с конктертным объектом.

PHP:
stock MySQL__CreateObjects(i)
{
	new str[1054];
	format(str, sizeof(str), "INSERT INTO `objects` (`ID`, `Model`, `fX`, `fY`, `fZ`, `fRX`, `fRY`, `fRZ`, `World`, `Interior`) VALUES ('%i', '%i', '%f', '%f', '%f', '%f', '%f', '%f', '%i', '%i')",
	i, o<model_id:i>, o<f_x:i>, o<f_y:i>, 	o<f_z:i>, o<f_rx:i>, o<f_ry:i>, o<f_rz:i>, o<world_id:i>, o<interior_id:i>);
    mysql_function_query(/* id подключения к бд */, str, false, "", "");
    return 1;
}
Это функцию тоже в конец мода. Функция загружает все объекты из базы данных и устанавливает их на сервере.

PHP:
forward MySQL__LoadObjects();
public MySQL__LoadObjects()
{
	new rows, fields;
	cache_get_data(rows, fields);
	if(rows)
	{
		for(new i; i < rows; i++)
		{
			o<object_id:i> = cache_get_field_content_int(i, "ID", /* id подключения к бд */);
			o<model_id:i> = cache_get_field_content_int(i, "Model", /* id подключения к бд */);
			o<f_x:i> = cache_get_field_content_float(i, "fX", /* id подключения к бд */);
			o<f_y:i> = cache_get_field_content_float(i, "fY", /* id подключения к бд */);
			o<f_z:i> = cache_get_field_content_float(i, "fZ", /* id подключения к бд */);
			o<f_rx:i> = cache_get_field_content_float(i, "fRX", /* id подключения к бд */);
			o<f_ry:i> = cache_get_field_content_float(i, "fRY", /* id подключения к бд */);
			o<f_rz:i> = cache_get_field_content_float(i, "fRZ", /* id подключения к бд */);
			o<world_id:i> = cache_get_field_content_int(i, "World", /* id подключения к бд */);
			o<interior_id:i> = cache_get_field_content_int(i, "Interior", /* id подключения к бд */);
			o<object_id:i> = CreateDynamicObject(o<model_id:i>, o<f_x:i>, o<f_y:i>, o<f_z:i>, o<f_rx:i>, o<f_ry:i>, o<f_rz:i>, o<world_id:i>, o<interior_id:i>);
			o<object_id:i> = IsLastObject;
		}
	}
	return 1;
}
Ищем каллбэк OnGameModeInit и вставляем туда.

PHP:
mysql_function_query(/* id подключения к бд */, "SELECT * FROM `objects`", true, "MySQL__LoadObjects", "");
Запрос на создание таблицы "objects" в базе данных.

PHP:
CREATE TABLE IF NOT EXISTS `objects` (
  `ID` int(4) NOT NULL,
  `Model` int(5) NOT NULL,
  `fX` float NOT NULL,
  `fY` float NOT NULL,
  `fZ` float NOT NULL,
  `fRX` float NOT NULL,
  `fRY` float NOT NULL,
  `fRZ` float NOT NULL,
  `World` int(11) NOT NULL,
  `Interior` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу