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



Не найдено.

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

    • Awesome Basketball
      By Awesome Basketball
      Нужен человек, который сделает лаунчер на андройд, Цену пишите в комментариях
      Желательно с примерами работ
      ТЗ:
      3 экрана - Сервера, Настройки и Донат
      Сервера - список серверов и онлайн на них
      Настройки - стандартно: ваш ник, переустановить лаунчер, клиент, кэш
      Донат - Ввод ника, выбор услуг с ценами, и оплата
       
    • Guest Слава
      By Guest Слава
      Кто готов сделать лаучнер для проекта крмп звоните в дс: vadimyst#5775 - ЦЕНА ДОГОВОРНАЯ
    • Сергей Помазан
      By Сергей Помазан
      как можно сделать так что-бы сервер понял что человек сидит с лаунчера (c#), я в этом не сильно понимаю, могу купить решение у кого есть