Рекомендованные сообщения



Не найдено.

6 posts in this topic

Привет всем! 1. Хочу поинтересоваться, возможно ли одновременное сосуществование двух разных ORM_ID? К чему я веду? Например, есть функция загрузки данных игрока, ей присваивается ORM_ID по которому она и осуществляет запросы, но мне нужно после загрузки игрока загрузить автомобили, так же через ORM. Для того, чтобы это сделать, мне нужно вызвать orm_destroy и "убить" предыдущий ORM-сценарий, но тогда, в дальнейшем мне недоступно, к примеру, то же сохранение игрока. Как быть? Каким образом можно реализовать через ORM-сценарии другие функции загрузок: машин, домов, кланов и т.д. 2. И да, возможно ли сразу полная загрузка всех строк из таблицы, а не по отдельности для каждого игрока? (Ведь, cache_get_row_count тут уже не проканает...)

Share this post


Link to post
Share on other sites

@xqtOr, а Вы на WIKI читали за ORM? Кажется, там есть ответ на Ваш первый вопрос. Тык и тык.

Share this post


Link to post
Share on other sites
16 минут назад, odosenok сказал:

@xqtOr, а Вы на WIKI читали за ORM? Кажется, там есть ответ на Ваш первый вопрос. Тык и тык.

Да, читал. Я, пошарив далеко не на первых страницах гугла понял, что нужно использовать orm_apply_cache
Вы дали первую ссылку (github) на систему регистрации основанную на ORM, именно эту заготовку я у себя и использую!
Давайте, я Вам постараюсь все внятно объяснить и с участками кода, дабы Вы поняли, чего я хочу добиться.
В системе, которую Вы скинули, которую я и использую, есть паблик загрузки данных игрока:
 

forward LoadingPlayerData(playerid);
public LoadingPlayerData(playerid)
{
	g_MysqlRaceCheck[playerid]++;

	// reset player data
	static const empty_player[E_PLAYERS];
	Player[playerid] = empty_player;

	GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);

	// create orm instance and register all needed variables
	new ORM: ormid = Player[playerid][ORM_ID] = orm_create("players", g_SQL);

	orm_addvar_int(ormid, Player[playerid][ID], "id");
	orm_addvar_string(ormid, Player[playerid][Name], MAX_PLAYER_NAME, "username");
	orm_addvar_string(ormid, Player[playerid][Password], 65, "password");
	orm_addvar_string(ormid, Player[playerid][Salt], 17, "salt");
	orm_addvar_float(ormid, Player[playerid][X_Pos], "x");
	orm_addvar_float(ormid, Player[playerid][Y_Pos], "y");
	orm_addvar_float(ormid, Player[playerid][Z_Pos], "z");
	orm_addvar_float(ormid, Player[playerid][A_Pos], "angle");
	orm_addvar_int(ormid, Player[playerid][Interior], "interior");
	orm_setkey(ormid, "username");

	// tell the orm system to load all data, assign it to our variables and call our callback when ready
	orm_load(ormid, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
	return 1;
}

В которой мы объявляем новый ORM-сценарий (кстати, здесь загрузка идет для конкретного подключившегося игрока, о чем, в дальнейшем, я буду говорить)

new ORM: ormid = Player[playerid][ORM_ID] = orm_create("players", g_SQL);

И работает этот сценарий вплоть до OnPlayerDisconnect, где срабатывает orm_destroy и данный сценарий удаляется.
Теперь, давайте создадим такую же функцию загрузки для транспорта (enum'ы я здесь прописывать не буду, просто сразу перейдем к функции)
И сразу же возникает вопрос, как нам загружать транспорт при коннекте, если загрузка идет для конкретного игрока, значит она будет и для конкретного транспорта... Тогда как к нему обращаться? Отсюда и вытекает способ с использованием orm_apply_cache, для загрузки сразу всех автомобилей из таблицы. Расписывать Enum с данными автомобиля я не стал, представим, что он есть.

forward OnVehiclesLoad();   
public OnVehiclesLoad()   
{   
	for(new r=0; r < cache_num_rows(); ++r)
	{   
    	new ORM:ormid = Vehicle[r][ORM_ID] = orm_create("vehicles");   // тут мы так же создаем ORM_ID с которым, впоследствии, будет конфликт
	
	    orm_addvar_int(ormid, Vehicle[r][ID], "ID"); //это наш ключ   
	    orm_addvar_int(ormid, Vehicle[r][ModelID], "ModelID");   
	    orm_addvar_int(ormid, Vehicle[r][Color1], "Color1");   
	    orm_addvar_string(ormid, Vehicle[r][Plate], 32, "Plate"); 
                                      
		orm_setkey(ormid, "ID");
                                      
	    orm_apply_cache(ormid, r);   
	}   
	return 1;   
}

Как Вы могли заметить, тут мы так же создаем ORM_ID, и вот в чем загвоздка, если мы будем это так использовать, то автомобили просто не будут загружаться, ибо мы уже используем этот ORM_ID в загрузке игроков. Если мы пропишем в эту функцию, в начале, orm_destroy(Player[playerid][ORM_ID]); тем самым убив предыдущий ORM сценарий, то наша функция выполнится, но сохранение игрока при дисконнекте, которое зависело от Player[playerid][ORM_ID] - не произойдет.

Отсюда и вопрос, как быть?
Да и дело не только в этом, допустим, загрузили мы авто таким способом, но как мы их свяжем с игроком? Устанавливать в качестве ключа - имя игрока и постоянно сравнивать строки? Тогда Vehicle[MAX_VEHICLES][E_VEHICLES] должно выглядеть как Vehicle[MAX_PLAYERS_NAME][E_VEHICLES]... а это уже выдаст ошибки при выполнении.
В общем, я не до конца понимаю, как реализовать различные загрузки данных и как их одновременно выполнять и завершать.

Share this post


Link to post
Share on other sites

Так-с, начал юзать способ с orm_apply_cache который описал выше и отправлять запрос 

mysql_tquery(g_SQL, "SELECT * FROM `vehicles`", "OnVehiclesLoad", "d", playerid);

Получать авто я теперь могу, но только получать! (предварительно, в БД, от руки сам засунул пару строк).
Осталось 2 вопроса, как мне создавать строку в базе данных, при регистрации игрока без создания прямого запроса:

mysql_tquery(g_SQL, "INSERT INTO `vehicles` (`owner`,`model`) VALUES ('William_Wolf','562')"); // как пример запроса

И, самое главное - как связать эти строки с игроком? Как обращаться к определенной машине? Мне нужно каждый раз вытаскивать owner и сравнивать с ником?

Share this post


Link to post
Share on other sites

Пока свою думу думал, нашел такой выход, но мы же с Вами понимаем, что это костыли и, при 10.000 строк в БД, это может очень негативно сказаться на скорости и работе, ибо если машина человека в БД на 9000 строке, то это фиаско... Я прокомментировал в коде...
Может можно это как-то более аккуратно сделать?

forward OnVehiclesLoad(playerid);
public OnVehiclesLoad(playerid)
{
	for(new r = 0; r < cache_num_rows(); ++r)
	{
    	new ORM: ormid = Vehicle[r][ORM_ID] = orm_create("vehicles");

	    orm_addvar_int(ormid, Vehicle[r][ID], "id");
	    orm_addvar_string(ormid, Vehicle[r][Owner], MAX_PLAYER_NAME, "owner");
		orm_addvar_int(ormid, Vehicle[r][Veh], "veh_1");
		orm_setkey(ormid, "owner");

	    orm_apply_cache(ormid, r);

		if(!strcmp(Vehicle[r][Owner], Player[playerid][Name], false, 25)) // каждую получаемую строку из бд, содержащюю данные о машине, сравниваем по параметру Owner с именем игрока, зашедшего на сервер
		{
			VehIdForPlayer[playerid] = r; // приравниваем к сторонней переменной номер строки в базе данных, по которому мы потом сможем обращаться к этой строке и вытаскивать нужные данные о машине, принадлежащей игроку
		}
	}
	return 1;
}

 

Share this post


Link to post
Share on other sites

Со всем разобрался. Тема закрыта, если кому-то интересно, могу написать урок, такого на многих pawn порталах не найдете:D

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • _bogdan_
      By _bogdan_
      Слив игрового мода "Frendly RolePlay"
      Просмотр файла Frendly RolePlay.                           
      Хранение данных(версия MySQL): R39-6
      Командный процессор: DC_CMD
      Кол-во строк в игровом моде: 54348
      Анти-чит: (AntiCheat(Frendly RP).
      Автор: Неизвестно.
      Клиент: SA-MP 0.3.7-R2 с картой CR-MP.
      База данных  находится в папке с файлами.
       
      P.S - В папке с игровым модом, будет ссылка на игровую сборку.
       
      Добавил _bogdan_ Добавлено 19.10.2021 Категория Моды Автор Неизвестно.  
      UP: Залил базу данных.
    • _bogdan_
      By _bogdan_
      Frendly RolePlay.                           
      Хранение данных(версия MySQL): R39-6
      Командный процессор: DC_CMD
      Кол-во строк в игровом моде: 54348
      Анти-чит: (AntiCheat(Frendly RP).
      Автор: Неизвестно.
      Клиент: SA-MP 0.3.7-R2 с картой CR-MP.
      База данных  находится в папке с файлами.
       
      P.S - В папке с игровым модом, будет ссылка на игровую сборку.
       
    • Zerno303
      By Zerno303


      Просмотр файла Продажа мода Race RP.
      -------------------------------------------------------------------------------------------------------------------
      ВАЖНО!
      Перед покупкой лучше спросите лишний раз, чем потом кидать претензии в мою сторону!
      -------------------------------------------------------------------------------------------------------------------
      Доброго времени суток! Этот мод подойдёт по основу и даже под открытие.
      9 уровней админки.
      Лидерки: Мэрия, ГУВД, УГИБДД, ФСБ, Больница, Автошкола, Южная ОПГ, Арзамасская ОПГ, Армия, Лыткаринская ОПГ, Батыревская ОПГ,, RECORD FM и Спецназ.
      Работы: Городской склад, Шахта, Лесопилка и Автомеханик.
      crmp 0.3e
      Мод без сборки(Сборка не нужна). 
      Мод-пак есть. Если понадобится пишите в лс.
      Добавил Zerno303 Добавлено 16.10.2021 Категория Моды Автор Zerno303  
    • Zerno303
      By Zerno303
      -------------------------------------------------------------------------------------------------------------------
      ВАЖНО!
      Перед покупкой лучше спросите лишний раз, чем потом кидать претензии в мою сторону!
      -------------------------------------------------------------------------------------------------------------------
      Доброго времени суток! Этот мод подойдёт по основу и даже под открытие.
      9 уровней админки.
      Лидерки: Мэрия, ГУВД, УГИБДД, ФСБ, Больница, Автошкола, Южная ОПГ, Арзамасская ОПГ, Армия, Лыткаринская ОПГ, Батыревская ОПГ,, RECORD FM и Спецназ.
      Работы: Городской склад, Шахта, Лесопилка и Автомеханик.
      crmp 0.3e
      Мод без сборки(Сборка не нужна). 
      Мод-пак есть. Если понадобится пишите в лс.
    • panda1999
      By panda1999
      Публикация В Google Play
      Публикация приложения в Google Play Market на мой аккаунт разработчика.

      Имею большой опыт в публикации различных приложений и сервисов. Помогу пройти модерацию приложения.

      По статистике приложения проходят модерацию в течение 2-х (двух) дней после публикации.

      Это важно! Я, как владелец аккаунта Google Play Developer, вправе удалить приложение со своего аккаунта без ведома уведомления заказчика, если приложение или связанные с ним любые ресурсы будут нарушать правила Google Play, а также, если на приложение будет оставлено более трёх отрицательных отзывов, которые указывают на не правомерную деятельность приложения или любых связанных с ним ресурсами.

      ЕСЛИ У ВАС возникнут ЛЮБЫЕ вопросы пишите!

      С радостью проконсультирую!))

      Нужно для заказа:
      1. Файл приложения в формате . aab.

      С августа 2021 года все приложения в Google Play будут публиковаться в формате Android App Bundle (AAB) вместо старого APK.

      2. Название приложения (макс. длина текста 50 символов).

      3. Краткое описание (макс. длина текста 80 символов).

      4. Полное описание приложения (макс. длина текста 4000 символов).

      5. Значок приложения.

      PNG или JPEG

      512х512 пкс

      До 1 Мб

      6. Картинка для описания.

      PNG или JPEG

      1024x500 пкс

      До 1 Мб

      7. Скриншоты 2-8 шт.
      Принимаем QIWI
      Принимаем Карта банка.
      Если вас заинтересовало, обращайтесь ко мне в л\с. Вконтакте