Вопросы

Привет всем! 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 пользователей онлайн

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

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

    • patrickk
      От patrickk
      Всем привет, решил написать dm сервер и довольно хорошим получился, даже на голову выше Goat dm. Оставил не решенную проблему тем что  у меня есть 4 локации с rp run и cj run ну а как добавить cj бег на те локации не знаю и как эта система работает. Надеюсь мне помогут знающие люди
    • Samolet
      От Samolet
      Здраствуйте, cоздаю копию Arizona на ОМП, опен мультиплеер, загрузил и подключил бд, но сервер не хочет вот лог :[2026-10-20T21:03:32+0300] [Info] Log file reloaded. Starting open.mp server (1.5.8.3079) from commit c6759bd8d265171ae3d86598895a23d5a8d92a3b Loading component $CAPI.so Successfully loaded component C-API (1.5.8.3079) with UID 10467dd8d4c56fc6 Loading component LegacyConfig.so Successfully loaded component LegacyConfig (1.5.8.3079) with UID 24ef6216838f9ffc Loading component NPCs.so Successfully loaded component NPCs (1.5.8.3079) with UID 3d0e59e87f4e90bc Loading component Recordings.so Successfully loaded component Recordings (1.5.8.3079) with UID 871144d399f5f613 Loading component Checkpoints.so Successfully loaded component Checkpoints (1.5.8.3079) with UID 44a937350d611dde Loading component TextDraws.so Successfully loaded component TextDraws (1.5.8.3079) with UID 9b5dc2b1d15c992a Loading component Pawn.so Successfully loaded component Pawn (1.5.8.3079) with UID 78906cd9f19c36a6 Loading component GangZones.so Successfully loaded component GangZones (1.5.8.3079) with UID b3351d11ee8d8056 Loading component Actors.so Successfully loaded component Actors (1.5.8.3079) with UID c81ca021eae2ad5c Loading component Pickups.so Successfully loaded component Pickups (1.5.8.3079) with UID cf304faa363dd971 Loading component Dialogs.so Successfully loaded component Dialogs (1.5.8.3079) with UID 44a111350d611dde Loading component Objects.so Successfully loaded component Objects (1.5.8.3079) with UID 59f8415f72da6160 Loading component Console.so Successfully loaded component Console (1.5.8.3079) with UID bfa24e49d0c95ee4 Loading component TextLabels.so Successfully loaded component TextLabels (1.5.8.3079) with UID a0c57ea80a009742 Loading component Variables.so Successfully loaded component Variables (1.5.8.3079) with UID 75e121848bc01fa2 Loading component Databases.so Successfully loaded component Databases (1.5.8.3079) with UID 80092e7eb5821a96 Loading component LegacyNetwork.so Successfully loaded component RakNetLegacyNetwork (1.5.8.3079) with UID ea9799fd79cf8442 Loading component CustomModels.so Successfully loaded component CustomModels (1.5.8.3079) with UID 15e3cb1e7c77ffff Loading component Menus.so Successfully loaded component Menus (1.5.8.3079) with UID 621e219eb97ee0b2 Loading component Vehicles.so Successfully loaded component Vehicles (1.5.8.3079) with UID 3f1f62ee9e22ab19 Loading component Classes.so Successfully loaded component Classes (1.5.8.3079) with UID 8cfb3183976da208 Loading component Timers.so Successfully loaded component Timers (1.5.8.3079) with UID 2ad8124c5ea257a3 Loaded 22 component(s) from /home/gs113492/components Executing Server Config... [2026-10-20T21:03:33+0300] [Info] Loading plugin: crashdetect.so [2026-10-20T21:03:33+0300] [Info] CrashDetect plugin 4.19 [2026-10-20T21:03:33+0300] [Info] Loading plugin: mapandreas.so [2026-10-20T21:03:33+0300] [Info] Loading plugin: streamer.so [2026-10-20T21:03:33+0300] [Info] *** Streamer Plugin v2.9.4 by Incognito loaded *** [2026-10-20T21:03:33+0300] [Info] Loading plugin: sscanf.so [2026-10-20T21:03:33+0300] [Info] [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] sscanf plugin loaded. [2026-10-20T21:03:33+0300] [Info] Version: 2.8.3 [2026-10-20T21:03:33+0300] [Info] (c) 2018 Alex "Y_Less" Cole [2026-10-20T21:03:33+0300] [Info] =============================== [2026-10-20T21:03:33+0300] [Info] Loading plugin: TOTP.so [2026-10-20T21:03:33+0300] [Info] TOTP plugin v1.0.1 by Games loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: mysql_static.so [2026-10-20T21:03:33+0300] [Info] >> plugin.mysql: R39-6 successfully loaded. [2026-10-20T21:03:33+0300] [Info] Loading plugin: libpawn_json.so [2026-10-20T21:03:34+0300] [Error] Function not registered: YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_RegAlias [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Reset [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_RegHandler [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_Delete [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_New [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_IgnoreBits [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_Init [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendRPC [2026-10-20T21:03:34+0300] [Error] Function not registered: PR_SendPacket [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_WriteValue [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Error] Function not registered: BS_ReadValue [2026-10-20T21:03:34+0300] [Error] Function not registered: PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] YSF_SetTickRate [2026-10-20T21:03:34+0300] [Error] File or function is not found [2026-10-20T21:03:34+0300] [Info] [debug] Run time error 19: "File or function is not found" [2026-10-20T21:03:34+0300] [Info] [debug] PC_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_ReadValue [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetNumberOfBytesUsed [2026-10-20T21:03:34+0300] [Info] [debug] BS_WriteValue [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendPacket [2026-10-20T21:03:34+0300] [Info] [debug] PR_SendRPC [2026-10-20T21:03:34+0300] [Info] [debug] PR_Init [2026-10-20T21:03:34+0300] [Info] [debug] BS_IgnoreBits [2026-10-20T21:03:34+0300] [Info] [debug] BS_SetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] BS_ResetReadPointer [2026-10-20T21:03:34+0300] [Info] [debug] BS_New [2026-10-20T21:03:34+0300] [Info] [debug] BS_Delete [2026-10-20T21:03:34+0300] [Info] [debug] PR_RegHandler [2026-10-20T21:03:34+0300] [Info] [debug] BS_Reset [2026-10-20T21:03:34+0300] [Info] [debug] BS_GetWriteOffset [2026-10-20T21:03:34+0300] [Info] [debug] PC_RegAlias [2026-10-20T21:03:34+0300] [Info] Legacy Network started on ***.**.**.***:2717. Помогите пожалуйста