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

    Статус
    Оффлайн
    Регистрация
    27.06.2016
    Сообщений
    26
    Репутация:
    0 ±

    Команда /savecarpos | File.inc | немного доработки gl_common.inc (совсем чутка)))

    Итак, я опять от нечего делать решил написать команду связанную с транспортом. Ну и немного "поплагиатить" :D

    При вводе команды вы сохраняете позицию транспорта. Предупреждаю: если вы не замените "-1,-1" в файле Vehicles.txt (папка scriptfiles), то у транспорта будут случайные цвета.



     Старая версия команды
     Вот сама команда:
    PHP код:
    CMD:savecarpos(playerid// Стяжкин рекомендует использовать CMD:savecarpos(playerid, params[])
    {
            if(!
    IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, -1"Для начала сядьте в машину");
            new 
    File:file_ptrstring[52], vehiclemodelFloat:X,Float:Y,Float:ZFloat:R;
            
            
    vehiclemodel GetVehicleModel(GetPlayerVehicleID(playerid));
            
    GetVehiclePos(GetPlayerVehicleID(playerid), X,Y,Z);
            
    GetVehicleZAngle(GetPlayerVehicleID(playerid), R);

            
    file_ptr fopen("Vehicles.txt",filemode:io_append);
            if(
    file_ptr != File:0)
            {
                
    format(stringsizeof(string), "%d,%.4f,%.4f,%.4f,%.4f,-1,-1; \r\n"vehiclemodelX,Y,ZR);
                
    fwrite(file_ptrstring);
            }
            
    fclose(file_ptr);
            
    SendClientMessage(playerid, -1"Вы записали координаты! (Файл Vehicles.txt)");
            return 
    1;



     А вот то, что к ней обязательно
    PHP код:
    public OnGameModeInit()
    // Но я советую это перенести в FilterScript, чтобы при перезагрузки FS (/rcon reload addstatic, где addstatic ваш фильтрскрипт) **
        
    new vehicle_load;
        
    vehicle_load LoadStaticVehiclesFromFile("Vehicles.txt");
        
    printf("Загружено: %d транспорта"vehicle_load);
        return 
    1;
    // ** он сразу появлялся, без перезаходов на сервер/перезапуска основного мода (сервера через /rcon gmx и т.п.).

    stock LoadStaticVehiclesFromFile(const filename[])
    {
        new 
    File:file_ptrloadinfo[52], var_from_line[10], indexvehicle_load;
        new 
    vehiclemodelFloat:X,Float:Y,Float:ZFloat:Rcolor1,color2;

        
    file_ptr fopen(filename,filemode:io_read);
        if(!
    file_ptr) return 0;

        while(
    fread(file_ptrloadinfosizeof(loadinfo)) > 0)
        {
            
    index 0;

              
    index token_by_delim(loadinfo,var_from_line,',',index); // vehicleid
              
    if(index == (-1)) continue;
              
    vehiclemodel strval(var_from_line);
               if(
    vehiclemodel 400 || vehiclemodel 611) continue;

              
    index token_by_delim(loadinfo,var_from_line,',',index+1); // X
              
    if(index == (-1)) continue;
              
    floatstr(var_from_line);
              
    index token_by_delim(loadinfo,var_from_line,',',index+1); // Y
              
    if(index == (-1)) continue;
              
    floatstr(var_from_line);
              
    index token_by_delim(loadinfo,var_from_line,',',index+1); // Z
              
    if(index == (-1)) continue;
              
    floatstr(var_from_line);

              
    index token_by_delim(loadinfo,var_from_line,',',index+1); // R
              
    if(index == (-1)) continue;
              
    floatstr(var_from_line);

              
    index token_by_delim(loadinfo,var_from_line,',',index+1); // color1
              
    if(index == (-1)) continue;
              
    color1 strval(var_from_line);
              if(
    color1 == -1color1 random(366);
              
    index token_by_delim(loadinfo,var_from_line,';',index+1); // color2
              
    if(index == (-1)) continue;
              
    color2 strval(var_from_line);
              if(
    color2 == -1color2 random(366);

              
    AddStaticVehicleEx(vehiclemodelX,Y,ZRcolor1color23000);
            
    vehicle_load++;
        }
        return 
    vehicle_load;
    }

    stock token_by_delim(const string[], return_str[], delimstart_index)
    {
        new 
    x=0;
        while(
    string[start_index] != EOS && string[start_index] != delim)
        {
            
    return_str[x] = string[start_index];
            
    x++;
            
    start_index++;
        }
        
    return_str[x] = EOS;
        if(
    string[start_index] == EOSstart_index = (-1);
        return 
    start_index;



    Решил послушать советы (по sscanf'у и /vehicle) и "исправил" свой код в по этим советам. Также добавил команду для сохранения и выгрузки транспорта с БД. Любуемся :3
     На MySQL R39-2 (Если что, я не совсем в нем "Шарю")
    PHP код:
    public OnGameModeInit()
    {
        
    mysql_connect_id mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_DATABASEMYSQL_PASSWORD);
        switch(
    mysql_errno()) // Спасибо Димасу :D (DeimoS)
        
    {
            case 
    0: print("Подключение к базе данных удалось");
            case 
    1044: print("[MySQL]: Подключение к базе данных не удалось [Указано неизвестное имя пользователя]");
            case 
    1045: print("[MySQL]: Подключение к базе данных не удалось [Указан неизвестный пароль]");
            case 
    1049: print("[MySQL]: Подключение к базе данных не удалось [Указана неизвестная база данных]");
            case 
    2003: print("[MySQL]: Подключение к базе данных не удалось [Хостинг с базой данных недоступен]");
            case 
    2005: print("[MySQL]: Подключение к базе данных не удалось [Указан неизвестный адрес хостинга]");
        }
        
    mysql_function_query(mysql_connect_id"SELECT * FROM `vehicles`"true"LoadVehiclesFromTable","");
        return 
    1;
    }

    CMD:savepos(playeridparams[])
    {
        new 
    query_string[94+8*4], Float:X,Float:Y,Float:Z,Float:R;
        if(
    IsPlayerInAnyVehicle(playerid))
        {
            new 
    vehicleid GetPlayerVehicleID(playerid), modelid GetVehicleModel(vehicleid), color[2];
            
    sscanf(params"dd"color[0], color[1]);

            
    GetVehiclePos(vehicleidX,Y,Z);
            
    GetVehicleZAngle(vehicleidR);

            
    format(query_stringsizeof(query_string), "INSERT INTO `vehicles` (`vModel`, `vX`, `vY`, `vZ`, `vR`) VALUES (%i, '%.4f', '%.4f', '%.4f', '%.4f')"modelidX,Y,Z,R);
            
    mysql_function_query(mysql_connect_idquery_stringfalse"""");
            
    SendClientMessage(playerid, -1"Вы записали координаты! (БД: vehicles)");
            return 
    1;
        }
        return 
    1;
    }

    forward LoadVehiclesFromTable();
    public 
    LoadVehiclesFromTable()
    {
        new 
    rowsfieldsvehicleid;
        
    cache_get_data(rowsfieldsmysql_connect_id);

        if(!
    rows) return !print("В базе данных нет требуемых значений. Используйте /savepos (в игре, находясь в машине)");
        while(
    vehicleid <= rows)
        {
            
    vInfo[vehicleid][vX] = cache_get_field_content_float(vehicleid"vX"mysql_connect_id);
            
    vInfo[vehicleid][vY] = cache_get_field_content_float(vehicleid"vY"mysql_connect_id);
            
    vInfo[vehicleid][vZ] = cache_get_field_content_float(vehicleid"vZ"mysql_connect_id);
            
    vInfo[vehicleid][vR] = cache_get_field_content_float(vehicleid"vR"mysql_connect_id);

            
    vInfo[vehicleid][vModel] = cache_get_field_int(vehicleid"vModel"mysql_connect_id);
            
    CreateVehicle(vInfo[vehicleid][vModel], vInfo[vehicleid][vX], vInfo[vehicleid][vY], vInfo[vehicleid][vZ], vInfo[vehicleid][vR], 234random(366), 30000);
            
    vehicleid++;
        }
        if(
    vehicleid == 2) return print("[MySQL]: Транспортное средство было загружено");
        
    printf("[MySQL]: %d транспортных средств было загружено", --vehicleid);
        return 
    1;


     На файлах (file.inc)
    PHP код:
    public OnGameModeInit()
    {
        new 
    vehicles LoadVehiclesFromFile();

        switch(
    vehicles)
        {
            case -
    1: print("[File]: В файле нет требуемых значений. Используйте /savepos (в игре, находясь в машине)");
            case 
    0: print("[File]: Транспортное средство было загружено");
            default: 
    printf("[File]: %d транспортных средств было загружено"vehicles);
        }
        return 
    1;
    }

    CMD:savepos(playeridparams[])
    {
        new 
    File:file_ptrstring[120];

        new 
    Float:X,Float:Y,Float:ZFloat:Rinteriorid GetPlayerInterior(playerid), condition[8], value1 = -1value2 = -1;

        new 
    vehicleid GetPlayerVehicleID(playerid), modelid GetVehicleModel(vehicleid);
        
    sscanf(params"s[8]dd"conditionvalue1value2);

        if(
    IsPlayerInAnyVehicle(playerid))
        {

            if(!
    vehicleid)
            {
                
    SendClientMessage(playerid, -1"Ошибка: для использования этого условия нужно находится в машине.");
                
    SendClientMessage(playerid, -1"Примечание: также доступно сохранения цвета. Пример использования: /savepos vehicle 6 0.");
                return 
    1;
            }
            
    GetVehiclePos(vehicleidX,Y,Z);
            
    GetVehicleZAngle(vehicleidR);

            
    file_ptr fopen("Vehicles.txt",filemode:io_append);
            if(
    file_ptr != File:0)
            {
                
    format(stringsizeof(string), "%d,%d,%.4f,%.4f,%.4f,%.4f,%d,%d; \r\n"interioridmodelidX,Y,ZRvalue1value2);
                
    fwrite(file_ptrstring);
            }
            
    fclose(file_ptr);
            
    SendClientMessage(playerid, -1"Вы записали координаты! (Файл Vehicles.txt)");
        }
        return 
    1;
    }

    LoadVehiclesFromFile()
    {
        new 
    File:file_ptrvehicle_loadloadinfo[60];
        new 
    interioridvehiclemodelFloat:X,Float:Y,Float:ZFloat:Rcolor1color2vehicleid;

        
    file_ptr fopen("Vehicles.txt",filemode:io_read);
        if(!
    file_ptr) return 0;

        while(
    fread(file_ptrloadinfosizeof(loadinfo)))
        {
            if(
    sscanf(loadinfo"p<,>iiffffip<;>i"interioridvehiclemodelX,Y,ZRcolor1color2))
            {
                continue;
            }
            if(
    color1 == -1color1 random(366);
            if(
    color2 == -1color2 random(366);

            
    vehicleid CreateVehicle(vehiclemodelX,Y,ZRcolor1color260000);
            
    LinkVehicleToInterior(vehicleidinteriorid);

            
    vehicle_load++;
        }
        
    vehicle_load--;
        return 
    vehicle_load;



     А теперь бонус-команда :D
    PHP код:
    new aVehicle[MAX_PLAYERS];
    CMD:vehicle(playeridparams[])
    {
        new 
    modelidcolor[2], Float:XFloat:YFloat:ZFloat:Rvehicleid GetPlayerVehicleID(playerid);
        
        
    GetPlayerPos(playeridX,Y,Z);
        
    sscanf(params"ddd"modelidcolor[0], color[1]);
        if(
    modelid == && color[0] == && color[1] == 0)
        {
            if(!
    vehicleid && !aVehicle[playerid])
                return 
    SendClientMessage(playerid, -1"(( Введите: /vehicle [modelid] [color1] [color2] ))");
            else if(
    GetPlayerVehicleSeat(playerid) == 0)
            {
                if(
    vehicleid == aVehicle[playerid]) DestroyVehicle(aVehicle[playerid]), aVehicle[playerid] = 0;
                else
                {
                    
    SetVehicleToRespawn(vehicleid);
                    
    SendClientMessage(playerid, -1"(( Ваш транспорт был успешно перемещен на место появления ))");
                    return 
    1;
                }
            }
            else if(
    aVehicle[playerid])
            {
                
    DestroyVehicle(aVehicle[playerid]);
                
    aVehicle[playerid] = 0;
            }
            
    SendClientMessage(playerid, -1"(( Ваш транспорт был успешно удален ))");
        }
        else
        {
            if(
    aVehicle[playerid] && vehicleid != aVehicle[playerid])
                return 
    SendClientMessage(playerid, -1"(( Вы уже создавали транспорт. Для удаление введите: /vehicle ))");
            if(!(
    400 modelid 611)) return SendClientMessage(playerid, -1"(( Модель не может быть меньше 400 или больше 611! ))");
            if(!(
    <= color[0] <= 255) || !(<= color[1] <= 255))
                return 
    SendClientMessage(playerid, -1"(( Цвет не может быть меньше 0 или больше 255! ))");
            if(
    GetPlayerVehicleSeat(playerid) == 0)
            {
                
    GetVehicleZAngle(vehicleidR);
                if(
    vehicleid == aVehicle[playerid]) DestroyVehicle(aVehicle[playerid]);
                else 
    SetVehicleToRespawn(vehicleid);
                
    SendClientMessage(playerid, -1"(( Вы успешно пересоздали транспорт ))");
            }
            else if(!
    vehicleidGetPlayerFacingAngle(playeridR), SendClientMessage(playerid, -1"(( Вы успешно создали транспорт ))");
            
    aVehicle[playerid] = CreateVehicle(modelidX,Y,Z,Rcolor[0], color[1], 60000);
            
    PutPlayerInVehicle(playeridaVehicle[playerid], 0);
        }
        return 
    1;



    P.S. базу данных сами создать сможете :D
    Последний раз редактировалось Тузик; 31.07.2016 в 17:35. Причина: Обновил команды
    Телеграфируем в соц.сети "вконтакте" или же мылимся на веревке "VKontakte"?

  2. #2
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    А разве стандартная команда /save не сохраняет координаты автомобиля?
    Мои глаза от твоего кода лезут на гавно-инфо и создают тему о расстановке пикапов.

  3. #3
    Аватар для MrJu[N]ior
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.02.2016
    Сообщений
    5
    Репутация:
    3 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    А разве стандартная команда /save не сохраняет координаты автомобиля?
    Сохраняет, но что-вы, это суперская команда, она незаменима. Она сохраняет не только коорды, но и выбранный цвет! (впрочем /save более функциональнее -_-).

    И поидеи при вводе команды сохранение идет в папку сервера, а не игрока. Смысл команды зашкалил за нуль

  4. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    А разве стандартная команда /save не сохраняет координаты автомобиля?
    Цитата Сообщение от MrJu[N]ior Посмотреть сообщение
    Сохраняет, но что-вы, это суперская команда, она незаменима. Она сохраняет не только коорды, но и выбранный цвет! (впрочем /save более функциональнее -_-).

    И поидеи при вводе команды сохранение идет в папку сервера, а не игрока. Смысл команды зашкалил за нуль
    Суть этой команды заключается в том, что с помощью неё можно добавить транспорт на сервер, который будет сохранён после его перезагрузки. А /save сохраняет координаты на клиенте, которые нужно потом ещё куда-то копировать.

    P.S. Автору следует срочно начать использовать sscanf.

  5. 2 пользователя(ей) сказали cпасибо:
    iWors (24.07.2016) Nash_Brigers (24.07.2016)
  6. #5
    Аватар для MrJu[N]ior
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.02.2016
    Сообщений
    5
    Репутация:
    3 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Суть этой команды заключается в том, что с помощью неё можно добавить транспорт на сервер, который будет сохранён после его перезагрузки. А /save сохраняет координаты на клиенте, которые нужно потом ещё куда-то копировать.

    P.S. Автору следует срочно начать использовать sscanf.
    В команде без параметров? sscanf? Боже. Не серьезно, там обычная команда без параметров. Почему-бы не объявить params и не добавить пару параметров? Просто так?

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

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    P.S. Автору следует срочно начать использовать sscanf.
    Зато это функция работает на любом стоковом Grand Larceny.

  8. #7
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от MrJu[N]ior Посмотреть сообщение
    В команде без параметров? sscanf? Боже. Не серьезно, там обычная команда без параметров. Почему-бы не объявить params и не добавить пару параметров? Просто так?
    О чём ты? Применение sscanf не ограничивается командами, команды - лишь одна из множества подобных областей. Зачем объявлять params? По всей видимости, ты не понимаешь сути sscanf.
    Вот так бы выглядела функция LoadStaticVehiclesFromFile со sscanf:
    PHP код:
    stock LoadStaticVehiclesFromFile(const filename[])
    {
        new 
    File:file_ptrvehicle_load;
        new 
    vehiclemodelFloat:xFloat:yFloat:zFloat:rcolor1color2;

        
    file_ptr fopen(filename,filemode:io_read);
        if (!
    file_ptr) {
            return 
    0;
        }

        while (
    fread(file_ptrloadinfosizeof(loadinfo))) {
            if (
    sscanf(loadinfo"p<,>ffffii"xyzrcolor1color2)) {
                continue;
            }

            
    AddStaticVehicleEx(vehiclemodelX,Y,ZRcolor1color23000);
            
    vehicle_load++;
        }
        return 
    vehicle_load;

    А теперь сравни с функцией, которую предоставил автор.

  9. #8
    Аватар для Тузик
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.06.2016
    Сообщений
    26
    Репутация:
    0 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    О чём ты? Применение sscanf не ограничивается командами, команды - лишь одна из множества подобных областей. Зачем объявлять params? По всей видимости, ты не понимаешь сути sscanf.
    Вот так бы выглядела функция LoadStaticVehiclesFromFile со sscanf:
    PHP код:
    stock LoadStaticVehiclesFromFile(const filename[])
    {
        new 
    File:file_ptrvehicle_load;
        new 
    vehiclemodelFloat:xFloat:yFloat:zFloat:rcolor1color2;

        
    file_ptr fopen(filename,filemode:io_read);
        if (!
    file_ptr) {
            return 
    0;
        }

        while (
    fread(file_ptrloadinfosizeof(loadinfo))) {
            if (
    sscanf(loadinfo"p<,>ffffii"xyzrcolor1color2)) {
                continue;
            }

            
    AddStaticVehicleEx(vehiclemodelX,Y,ZRcolor1color23000);
            
    vehicle_load++;
        }
        return 
    vehicle_load;

    А теперь сравни с функцией, которую предоставил автор.
    Спасибо за комментарий. Не так много я знаю о sscanf'е (на печаль мне). Ну буду изучать..

    - - - Добавлено - - -

    Цитата Сообщение от MrJu[N]ior Посмотреть сообщение
    В команде без параметров? sscanf? Боже. Не серьезно, там обычная команда без параметров. Почему-бы не объявить params и не добавить пару параметров? Просто так?
    Вскоре я попрошу удалить эту тему из-за написания FS с подобной командой но большим функционалом (я не стану редактировать этот пост, т.к. это будет в отдельном FS для создания фракций с выгрузкой на сервер).

    Вот там ваши сообщения я постараюсь тщательнее отслежить (комп убогий, с телефона следить тоже убого..)

    - - - Добавлено - - -

    Суть Fs: сделать код для копирования в текстовых файлах и в тоже время выгрузку для проверки самого файла.

    Функционал:
    1) создание транспорта
    2) создание места спавна
    3) создание пикапов (выдача брони и т.п./вывод диалог.окна/телепорт)
    4) создание команд (есть идея для реализации создания команд прямо в игре)...

  10. #9
    Аватар для Тузик
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.06.2016
    Сообщений
    26
    Репутация:
    0 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    О чём ты? Применение sscanf не ограничивается командами, команды - лишь одна из множества подобных областей. Зачем объявлять params? По всей видимости, ты не понимаешь сути sscanf.
    Вот так бы выглядела функция LoadStaticVehiclesFromFile со sscanf:
    PHP код:
    stock LoadStaticVehiclesFromFile(const filename[])
    {
        new 
    File:file_ptrvehicle_load;
        new 
    vehiclemodelFloat:xFloat:yFloat:zFloat:rcolor1color2;

        
    file_ptr fopen(filename,filemode:io_read);
        if (!
    file_ptr) {
            return 
    0;
        }

        while (
    fread(file_ptrloadinfosizeof(loadinfo))) {
            if (
    sscanf(loadinfo"p<,>ffffii"xyzrcolor1color2)) {
                continue;
            }

            
    AddStaticVehicleEx(vehiclemodelX,Y,ZRcolor1color23000);
            
    vehicle_load++;
        }
        return 
    vehicle_load;

    А теперь сравни с функцией, которую предоставил автор.
    Теперь не так сильно похож на каку? :С
    Телеграфируем в соц.сети "вконтакте" или же мылимся на веревке "VKontakte"?

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

    Статус
    Оффлайн
    Регистрация
    18.07.2016
    Сообщений
    17
    Репутация:
    3 ±
    В условии ошибка, ты не сможешь ввести 400 и 611. Используй <= в обоих местах.
    PHP код:
    if(!(400 modelid 611)) return SendClientMessage(playerid, -1"(( Модель не может быть меньше 400 или больше 611! ))"); 

 

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

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

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

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

Ваши права

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