Вопросы

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

Поделиться сообщением


Ссылка на сообщение

5 ответов на этот вопрос

  • 0
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]... а это уже выдаст ошибки при выполнении.
В общем, я не до конца понимаю, как реализовать различные загрузки данных и как их одновременно выполнять и завершать.

Поделиться сообщением


Ссылка на сообщение
  • 0

Так-с, начал юзать способ с 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 и сравнивать с ником?

Поделиться сообщением


Ссылка на сообщение
  • 0

Пока свою думу думал, нашел такой выход, но мы же с Вами понимаем, что это костыли и, при 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;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Дебилойд
      От Дебилойд
      Здравствуйте!
      Мы ищем талантливого 3D-моделлера в команду нашего CRMP-проекта!
      Что нужно будет делать:
      Моделировать и адаптировать автомобили.
      Создавать и настраивать скины (модели персонажей).
      Большим плюсом будет:
      Умение создавать качественные и оптимизированные интерьеры.
      Если вы хотите стать частью нашей команды и развивать проект вместе с нами, пишите в ЛС. Ждем ваши портфолио!
    • LORDIKUS
      От LORDIKUS
      Уважаемые участники форума - всех приветствую, кто перешел в беседу моей темы обсуждения. В настоящее время у меня зарождается огромное желание и мысль создать собственный CR:MP проект, но столкнулся с единственной проблемой - с отсутствием команды людей, у которых будет искреннее желание ежедневно вкладывать свой труд на разработку проекта. Особого опыта в скриптинге, маппинге, дизайне или в моделировании у меня не имеется, поэтому такой критерий как опыт в определенной сфере для желающих вступить в команду я не рассматриваю. Так как проект не открыт и находится на начальной стадии создания, мое сотрудничество выстраивается на некоммерческой основе (без выплаты за проделанную работу и труд), однако я не собираюсь отрицать высокую ценность вложенного командой труд — труд, особенно на первой стадии разработки я рассматриваю превыше всего. После открытия проекта в зависимости от коммерции и чистой прибыли каждый участник будет получать настоящую выплату, однако это также может убить еще значительное время. Мне нужна команда, которая проявит искренний интерес в создании общего между командой CR:MP проекта, пожертвует свое время, а также вложит собственный труд благодаря заработанным навыкам. Если вас заинтересовала данная тема обсуждения, пожалуйста, свяжитесь со мной по любым возможным и удобным для вас контактам связи ниже. Спасибо всем, кто зашел в мою беседу!

      🔗 Спец. Связь:
      — DISCORD: https://discord.com/users/1452715348196589691 (перейти по ссылке и добавить в друзья) ИЛИ _shin833_ (ввести никнейм и отправить запрос дружбы)
      — VK: https://vk.com/shin833
      — TG: https://t.me/s_hin833
    • Korochansky
      От Korochansky
      Настало время объявить о скором выпуске первого релиза среды разработки под названием Spawn.

      В настоящее время программа находится на заключительных этапах доработки кода и локализации интерфейса.
      Таким образом, в течение следующей недели будет выпущена быстрая и современная среда разработки, обладающая следующими возможностями (о которых я расскажу сейчас, а о других — позже):
       
      Полнофункциональный локальный Git: 
      Индексирование, фиксации, индикаторы состояния и мягкий/жесткий сброс до любой точки сохранения одним щелчком мыши. Разрабатывайте свой игровой сервер, не боясь его сломать.
      Новички могут рассматривать это как историю кодовой базы вашего сервера (что и есть на самом деле).
       
      Чистый UTF-8 (без BOM): 
      Полный отказ от устаревшей кодировки Windows-1251 (CP1251) для абсолютной стабильности и идеальной совместимости с Git.
      Реализация поддержки CP1251 привела бы к нестабильному поведению программы и ухудшила бы пользовательский опыт.
       
      История изменений строк: Редактор выделяет измененные строки в реальном времени в полях рядом с номерами строк. Это позволяет мгновенно видеть границы изменений, внесенных с момента открытия файла.
       
      Сопоставление и выделение фигурных скобок: мгновенное выделение открывающих и закрывающих фигурных скобок для быстрой навигации по структуре кода и защиты от ошибок компиляции.
       
      Интеграция с SAMPCTL: готовая к использованию автоматизация процессов. Сборка, запуск сервера и менеджер зависимостей (управление библиотеками и плагинами) работают напрямую из интерфейса редактора.
       
      И многое другое...
       
      И самое главное: проект будет с открытым исходным кодом под лицензией GPLv3!
      Следите за новостями о выпуске в репозитории: https://github.com/daniilkorochansky/spawn
    • KodBi
      От KodBi
      шапка
      по одиночке работают
      нужны оба