Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для Edwin
    Пользователь

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

    Как избежать путаницы с 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Повлиять на серверный 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
    Адрес
    Беларусь
    Сообщений
    188
    Репутация:
    20 ±
    Столбец-идентификатор?
    Ты имеешь в виду AUTO_INCREMENT?
    И как загрузить пустой слот на сервер?..

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

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

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

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

    Steve Pavlina

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

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

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от 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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    188
    Репутация:
    20 ±
    Вчера ещё была 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от Edwin Посмотреть сообщение
    Вчера ещё была 90 репутация, сегодня уже 89)
    А что такое "х3"?
    Условие, которое я не знаю как устроено у тебя :)
    В общем, скинь сток загрузки авто + enum для транспорта и покажу как сделать
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    14.02.2014
    Адрес
    Беларусь
    Сообщений
    188
    Репутация:
    20 ±
    Код 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Ну, собстно, всё верно, кроме некоторых моментов
    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, можешь в таблице создать новый столбец и туда записывать нужные, а после выгружать их в отдельную переменную и использовать :)
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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