Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    195
    Репутация:
    21 ±

    Как избежать путаницы с ID транспорта?

    Написал в моде систему личного автомобиля и один автосалон с покупкой.
    В OnGameModeInit стоит n-ное количество загружаемых на сервер машин (и личных, и фракционных, и любых других) со своими ID, выданными им сервером в порядке загрузки.
    Если купить авто, ей выдастся первый свободный ID (типа, если на сервере 50, скажем, фракционных тачек, то ID новой купленной, соответственно, будет 51).
    Но вызов функции LoadVehicles у меня стоит до загрузки всех остальных фракционных, рабочих, выставочных и т.д. машин, и таким образом после рестарта ID той купленной машины будет назначаться уже перед всеми остальными тачками (будет не 51 а уже 1).
    Это сильно усложняет работу, к тому же на остальных серверах я видел, что такой путаницы нет, и купленные машины создаются сразу со своим постоянным и никогда не меняющимся ID.
    Подскажите, как это сделать? Уже устал придумывать функции и решения...
    Последний раз редактировалось Edwin; 19.02.2014 в 09:24.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,441
    Репутация:
    1922 ±
    Повлиять на серверный ID можно только путём создания транспорта (то бишь заполнения пустых ID, как я знаю. Так что легче всего перестроить свою систему, а не сервер. Например, создай столбец-идентификатор в таблице и с машинами. А после у игрока сделай такой же. И, соответственно, переменную для хранения этого ID и для игрока, и для загрузки. Он и будет являться постоянным ID, связывающим игрока и сервер. На его основе и строй все проверки.
    Теперь при загрузке авто узнавай ID, под которым она создаётся, и грузи именно в эту переменную информацию. Узнать ID можно с помощью цикла в цикле, который и будет искать несозданное авто. Что-то типа такого:
    PHP код:
    new carid;
    for(new 
    ix3i++)
    {
        while(
    carid MAX_VEHICLES)
        {
            
    carid ++;
            if(
    IsValidVehicle(carid)) continue;
            break
        }
        \\
    загрузка авто в переменныегде номерами ячейка будет значение нашей переменной
         
    \\создание транспорта (получится тот же IDчто и выше

    Ну и провурки будут выглядеть, примерно, так:
    PHP код:
    if(CarInfo[GetPlayerVehicleID(playerid)][CarID] != pInfo[playerid][pCarId]) return SendClientMessage(playerid, -1"Вы не владелец этого авто"); 

  3. Пользователь сказал cпасибо:
    Edwin (19.02.2014)
  4. #3
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    195
    Репутация:
    21 ±
    Столбец-идентификатор?
    Ты имеешь в виду AUTO_INCREMENT?
    И как загрузить пустой слот на сервер?..

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,441
    Репутация:
    1922 ±
    Цитата Сообщение от Edwin Посмотреть сообщение
    Столбец-идентификатор?
    Ты имеешь в виду AUTO_INCREMENT?
    И как загрузить пустой слот на сервер?..
    Можно AUTO_INCREMENT, а можно самостоятельно подсчитывать и устанавливать идентификатор. Просто стоит учитывать, что AUTO_INCREMENT идёт в порядке возрастания и если, например, AUTO_INCREMENT равен 15 (то есть 16 строк создано) и удаляется 10-ая строка, следующая строка будет создана не с 9-ым AUTO_INCREMENT, а с 16. А вот если самостоятельно делать столбец-идентификатор, это можно учесть.

    Про пустой слот не понял.
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    Edwin (18.02.2014)
  7. #5
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    195
    Репутация:
    21 ±
    Не понял... какая "личность" посмела тебе нажать минус на репутации? Сейчас исправим.
    Я имею в виду, пустой слот авто. То есть, id загружаются в порядке возрастания. Как сделать свободными первые, скажем, 700 id, чтобы загружаемые рабочие тачки начинались с id 701?
    Вчера на работе мне пришёл в голову такой вариант: создать переменную в стоке загрузки, приравнять её к параметру id авто (AutoInfo[carid][aID]), а потом прописать "переменная" = CreateVehicle и т.д.
    Это поможет, как думаешь, Влади?

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,441
    Репутация:
    1922 ±
    Цитата Сообщение от Edwin Посмотреть сообщение
    Не понял... какая "личность" посмела тебе нажать минус на репутации? Сейчас исправим.
    Я имею в виду, пустой слот авто. То есть, id загружаются в порядке возрастания. Как сделать свободными первые, скажем, 700 id, чтобы загружаемые рабочие тачки начинались с id 701?
    Вчера на работе мне пришёл в голову такой вариант: создать переменную в стоке загрузки, приравнять её к параметру id авто (AutoInfo[carid][aID]), а потом прописать "переменная" = CreateVehicle и т.д.
    Это поможет, как думаешь, Влади?
    Да, вроде, не ставил никто минусов мне :) С кем-то перепутал, наверное :)
    Автомобили автоматически занимают первый попавшийся свободный ID. Со стороны сервера ты никак не сможешь управлять этими самыми ID (ну или придётся заполнять первые 700 ID автомобилями, потом создавать нужное авто и потом удалять те 700 автомобилей).
    Зачем обязательно основывать систему на ID авто? Они нужны будут только для того, чтоб определить какую авто вызвал игрок и не более. А так можешь самостоятельно сделать систему ID авто (не серверную, а скриптовую).
    То бишь в БД создай столбец и туда уже пиши хоть 700, хоть 500, хоть 1000000. В общем, любую информацию. А уже транспорт грузи в свободные ID на сервере, как я показал выше
    PHP код:
    //Это всё в сток загрузки авто с БД
    new carid;//В этой переменной будет храниться ID свободной авто
    for(new ix3i++)//А это цикл на весь транспорт, который грузим 
    {
        while(
    carid MAX_VEHICLES)//Второй цикл, который и ищет свободный ID
        
    {
            
    carid ++;//Просматриваем каждый ID
            
    if(IsValidVehicle(carid)) continue;//Если авто создано - новый такт
            
    break;//Иначе останавливаем цикл и дальше уже используем переменную carid как номер ячейки, в который будем грузить инфо об авто
        
    }
        
    //То есть типа:
        
    new bufer[30];
        
    mysql_fetch_field_row(bufer,"PosX");
        
    CarInfo[carid][PosX] = bufer;
        
    //...
        
    CreateVehicle(модельCarInfo[carid][PosX], ...);//ID созданной авто как-раз будет совпадать с ID, записанной в carid

    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #7
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    195
    Репутация:
    21 ±
    Вчера ещё была 90 репутация, сегодня уже 89)
    А что такое "х3"?
    Так подожди, грузится у меня итак с самого начала
    При покупке машина создаётся с чёрт знает каким id, а после рестарта отсчёт начинается уже с первого
    Мне нужно, чтобы машина всегда имела один и тот же id
    Ради хотя бы одной такой функции:
    Код HTML:
    GetVehiclePos(PlayerInfo[playerid][pCarKey1], X, Y, Z);
    Последний раз редактировалось Edwin; 18.02.2014 в 18:07.

  10. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,441
    Репутация:
    1922 ±
    Цитата Сообщение от Edwin Посмотреть сообщение
    Вчера ещё была 90 репутация, сегодня уже 89)
    А что такое "х3"?
    Условие, которое я не знаю как устроено у тебя :)
    В общем, скинь сток загрузки авто + enum для транспорта и покажу как сделать
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. #9
    Аватар для Edwin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    195
    Репутация:
    21 ±
    Код HTML:
    enum aInfo
    {
        aKey,
        aModel,
        Float:aCar_x,
        Float:aCar_y,
        Float:aCar_z,
        Float:aCar_a,
    	aColor1,
    	aColor2,
    	aOwner[24],
    	aLock,
    	aTun0,
    	aTun1,
    	aTun2,
    	aTun3,
    	aTun4,
    	aTun5,
    	aTun6,
    	aTun7,
    	aTun8,
    	aTun9,
    	aTun10,
    	aTun11,
    	aTun12,
    	aTun13,
    	aPaintJob,
    };
    new AutoInfo[MAX_VEHICLES][aInfo];
    Код HTML:
    stock LoadVehicles()
    {
        new query[512];
        mysql_query("SELECT * FROM `vehicles`");
        mysql_store_result();
        new rows = mysql_num_rows(), carid, text[12];
        if(rows > 0)
        {
            for(new idx; idx < rows; idx++)
            {
                for(carid = 1; carid < MAX_VEHICLES; carid++)
    	        {
    	            if(IsValidVehicle(carid)) continue;
    	            break;
    	        }
            	mysql_fetch_row_format(query, "|");
                sscanf(query, "p<|>iiffffiis[24]iiiiiiiiiiiiiiii",
                AutoInfo[carid][aKey],
                AutoInfo[carid][aModel],
                AutoInfo[carid][aCar_x],
                AutoInfo[carid][aCar_y],
                AutoInfo[carid][aCar_z],
                AutoInfo[carid][aCar_a],
    			AutoInfo[carid][aColor1],
    			AutoInfo[carid][aColor2],
    			AutoInfo[carid][aOwner],
    	        AutoInfo[carid][aLock],
    	        AutoInfo[carid][aTun0],
    	        AutoInfo[carid][aTun1],
             	AutoInfo[carid][aTun2],
    	        AutoInfo[carid][aTun3],
    	        AutoInfo[carid][aTun4],
    	        AutoInfo[carid][aTun5],
    	        AutoInfo[carid][aTun6],
    	        AutoInfo[carid][aTun7],
    	        AutoInfo[carid][aTun8],
    	        AutoInfo[carid][aTun9],
    	        AutoInfo[carid][aTun10],
    	        AutoInfo[carid][aTun11],
    	        AutoInfo[carid][aTun12],
    	        AutoInfo[carid][aTun13],
    	        AutoInfo[carid][aPaintJob]);
    			CreateVehicle(AutoInfo[carid][aModel], AutoInfo[carid][aCar_x], AutoInfo[carid][aCar_y], AutoInfo[carid][aCar_z]+1, AutoInfo[carid][aCar_a], AutoInfo[carid][aColor1], AutoInfo[carid][aColor2], 6000);
    	    	format(text,sizeof(text),"LS %d-%d",AutoInfo[carid][aKey],carid);
    			SetVehicleNumberPlate(carid,text);
    	  		SetVehicleParamsEx(carid,VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,alarm,AutoInfo[carid][aLock],VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,objective);
    			Engine[carid] = 0;
    			Lights[carid] = 0;
    			VehicleFuel[carid] = 100;
                vehicles++;
            }
        }
        mysql_free_result();
        return 1;
    }

  12. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,441
    Репутация:
    1922 ±
    Ну, собстно, всё верно, кроме некоторых моментов
    PHP код:
    stock LoadVehicles()
    {
        new 
    query[512];
        
    mysql_query("SELECT * FROM `vehicles`");
        
    mysql_store_result();
        new 
    rows mysql_num_rows(),text[12], carid;
        if(
    rows <= 0) return;
        for(new 
    idxidx rowsidx++)
        {
            for(
    caridcarid MAX_VEHICLEScarid++)
            {
                if(
    IsValidVehicle(carid)) continue;
                break;
            }
            
    mysql_fetch_row_format(query"|");
            
    sscanf(query"p<|>iiffffiis[24]iiiiiiiiiiiiiiii",
                
    AutoInfo[carid][aKey],
                
    AutoInfo[carid][aModel],
                
    AutoInfo[carid][aCar_x],
                
    AutoInfo[carid][aCar_y],
                
    AutoInfo[carid][aCar_z],
                
    AutoInfo[carid][aCar_a],
                
    AutoInfo[carid][aColor1],
                
    AutoInfo[carid][aColor2],
                
    AutoInfo[carid][aOwner],
                
    AutoInfo[carid][aLock],
                
    AutoInfo[carid][aTun0],
                
    AutoInfo[carid][aTun1],
                 
    AutoInfo[carid][aTun2],
                
    AutoInfo[carid][aTun3],
                
    AutoInfo[carid][aTun4],
                
    AutoInfo[carid][aTun5],
                
    AutoInfo[carid][aTun6],
                
    AutoInfo[carid][aTun7],
                
    AutoInfo[carid][aTun8],
                
    AutoInfo[carid][aTun9],
                
    AutoInfo[carid][aTun10],
                
    AutoInfo[carid][aTun11],
                
    AutoInfo[carid][aTun12],
                
    AutoInfo[carid][aTun13],
                
    AutoInfo[carid][aPaintJob]);
            
    CreateVehicle(AutoInfo[carid][aModel], AutoInfo[carid][aCar_x], AutoInfo[carid][aCar_y], AutoInfo[carid][aCar_z]+1AutoInfo[carid][aCar_a], AutoInfo[carid][aColor1], AutoInfo[carid][aColor2], 6000);
            
    format(text,sizeof(text),"LS %d-%d",AutoInfo[carid][aKey],carid);
            
    SetVehicleNumberPlate(carid,text);
            
    SetVehicleParamsEx(carid,VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,alarm,AutoInfo[carid][aLock],VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,objective);
            
    Engine[carid] = 0;
            
    Lights[carid] = 0;
            
    VehicleFuel[carid] = 100;
            
    vehicles++;
        }
        
    mysql_free_result();
        return 
    1;

    Например, carid не нужно каждый раз ровнять 1, ибо смысл? Пусть лучше цикл стартует с последнего найденного свободного ID :) Вряд ли во время создания освободятся предыдущие ID.
    Если всё таки очень нужны определённые ID, можешь в таблице создать новый столбец и туда записывать нужные, а после выгружать их в отдельную переменную и использовать :)
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •