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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±

    Расстановка дорожных знаков (0.3.7)

    Малообновленный вариант первоначальной версии системы (косметические изменения).

    Версия: 1.1.1

    Что изменилось:
    • Переправлены команды по примерам мифа #4 (клац).
    • Избавился от switch ветвлений, теперь есть массив.


    Скриншоты:

     Открыть/закрыть


     Добавление знака:








     Изменение текста и цвета (цвет по желанию):







     Просмотр моделей по их порядковому номеру:





    А теперь добавление всего этого в мод. Для начала:
    • Добавим это ко всем вашим переменным:
      PHP код:
      #include <streamer>
      #include <sscanf2>
      #include <dc_cmd>

      #define MAX_ROAD_SIGN_MODELS 45

      #define MAX_SIGNS_LABEL_TEXT 31

      static const
          
      road_sign_models[MAX_ROAD_SIGN_MODELS] =
      {
          
      1995519954199531995219951,
          
      1995019949199481996319962,
          
      1996119960199591995819957,
          
      1995619971199701996919968,
          
      1996719966199651996419979,
          
      1997819977199761997519974,
          
      1997319972199871998619985,
          
      1998419983199821998119980,
          
      1998819989199901999119992
      };

      static const
          
      road_sign_color_text[] =
      {
          
      0xADD8E6FF// LightBlue
          
      0x006400FF// DarkGreen
          
      0x00FF00FF// Green
          
      0xFFFF00FF// Yellow
          
      0xFF6347FF// Tomato
          
      0xFF0000FF// Red
          
      0x0000FFFF// Blue
          
      0x607B8BFF  // LightSkyBlue
      };

      enum
          E_ROAD_SIGN
      {
          
      model,
          
      Float:f_x,
          
      Float:f_y,
          
      Float:f_z,
          
      Float:f_rx,
          
      Float:f_ry,
          
      Float:f_rz,
          
      v_world,
          
      Text3D:r_label,
          
      r_label_text[MAX_SIGNS_LABEL_TEXT],
          
      r_label_text_color
      };
      new 
      road_sign[][E_ROAD_SIGN], last_road_sign;

      new 
      PlayerText:TD_road_sign_view
    • Это добавим ко всем вашим командам:
      PHP код:
      // добавить дорожный знак
      COMMAND:addsign(playeridparams[])
      {
          new 
      cmd_sign_model_id;

          if (
      sscanf(params"i"cmd_sign_model_id))
          {
              
      SendClientMessage(playerid, -1"Введите /addsign <номер модели знака>");
              
      SendClientMessage(playerid, -1"* чтобы узнать номера знаков введите /signnum");
              return 
      0;
          }

          if (
      cmd_sign_model_id MAX_ROAD_SIGN_MODELS)
              return 
      SendClientMessage(playerid, -1"* чтобы узнать номера знаков введите /signnum");

          new 
      Float:xFloat:yFloat:zFloat:angle;
          
      GetPlayerPos(playeridxyz);
          
      GetPlayerFacingAngle(playeridangle);
          
      += floatsin(-angledegrees);
          
      += floatcos(-angledegrees);
          
      SetPVarInt(playerid"road_sign_editor"1);
          
      last_road_sign CreateDynamicObject(road_sign_models[cmd_sign_model_id], xy0.35000GetPlayerVirtualWorld(playerid));
          
      EditDynamicObject(playeridlast_road_sign);
          return 
      1;
      }

      // узнать как выглядит знак по его порядковому номеру модели
      COMMAND:signnum(playeridparams[])
      {
          new 
      cmd_sign_model_id;
          
          if (
      sscanf(params"i"cmd_sign_model_id))
              return 
      SendClientMessage(playerid, -1"Введите /signnum <номер модели знака>");

          if (
      cmd_sign_model_id MAX_ROAD_SIGN_MODELS)
              return 
      SendClientMessage(playerid, -1"Упс, несуществующий номер модели. Повторите еще раз!");

          
      PlayerTextDrawSetPreviewModel(playeridTD_road_sign_viewroad_sign_models[cmd_sign_model_id]);
          
      PlayerTextDrawSetPreviewRot(playeridTD_road_sign_view0.00.0180.01.0);
          
      PlayerTextDrawShow(playeridTD_road_sign_view);
          
      SetTimerEx("@__HideTextDrawRoadSign"3000false"i"playerid);
          return 
      1;
      }

      @
      __HideTextDrawRoadSign(playerid);
      @
      __HideTextDrawRoadSign(playerid)
      {
          
      PlayerTextDrawHide(playeridTD_road_sign_view);
      }


      // удаляем дорожный знак по его id
      COMMAND:deletesign(playeridparams[])
      {
          new 
      cmd_sign_id;
          
          if (
      sscanf(params"i"cmd_sign_id))
              return 
      SendClientMessage(playerid, -1"Введите /deletesign (или /drs) <номер знака>");

          
      road_sign[cmd_sign_id][model] = 0;
          
      road_sign[cmd_sign_id][f_x] =
          
      road_sign[cmd_sign_id][f_y] =
          
      road_sign[cmd_sign_id][f_z] =
          
      road_sign[cmd_sign_id][f_rx] =
          
      road_sign[cmd_sign_id][f_ry] =
          
      road_sign[cmd_sign_id][f_rz] = 0.0;
          
      road_sign[cmd_sign_id][v_world] = -1;
          
      road_sign[cmd_sign_id][r_label_text][0] = EOS;
          
      road_sign[cmd_sign_id][r_label_text_color] = -1;
          
      DestroyDynamic3DTextLabel(road_sign[cmd_sign_id][r_label]);
          
      DestroyDynamicObject(cmd_sign_id);
          return 
      1;
      }

      // обновляем описание pyfrf
      COMMAND:signname(playeridparams[])
      {
          new 
      cmd_sign_id;
          
          if (
      sscanf(params"is[31]"cmd_sign_idparams))
              return 
      SendClientMessage(playerid, -1"Введите /signname <номер знака> <описание знака>");

          if (
      strlen(params) > MAX_SIGNS_LABEL_TEXT)
              return 
      SendClientMessage(playerid, -1"* слишком больное оисание для знака.");

          
      sscanf(params"s[31]"road_sign[cmd_sign_id][r_label_text]);
          
      SetPVarInt(playerid"road_sign_id"cmd_sign_id);
          
      ShowPlayerDialog(playerid2DIALOG_STYLE_LIST"Обновить цвет?",  "{ADD8E6}Цвет 1\n{006400}Цвет 2\n{00FF00}Цвет 3\n{FFFF00}Цвет 4\n{FF6347}Цвет 5\n{FF0000}Цвет 6\n{0000FF}Цвет 7\n{607B8B}Цвет 8""Выбрать""Нет");
          return 
      1;

    • Это добавим к OnPlayerEditObject, если нету, то добавьте (клацни по мне плес)0))).
      PHP код:
      if (GetPVarInt(playerid"road_sign_editor") == 1)
      {
          if (
      response == EDIT_RESPONSE_CANCEL)
          {
              
      SendClientMessage(playerid, -1"Установка дорожного знака отменена.");
              
      DestroyDynamicObject(last_road_sign);
              
      last_road_sign -= 1;
              
      CancelEdit(playerid);
              return 
      1;
          }

          if (
      response == EDIT_RESPONSE_FINAL)
          {
              
      road_sign[last_road_sign][model] = objectid;
              
      road_sign[last_road_sign][f_x] = fX;
              
      road_sign[last_road_sign][f_y] = fY;
              
      road_sign[last_road_sign][f_z] = fZ;
              
      road_sign[last_road_sign][f_rx] = fRotX;
              
      road_sign[last_road_sign][f_ry] = fRotY;
              
      road_sign[last_road_sign][f_rz] = fRotZ;
              
      road_sign[last_road_sign][v_world] = GetPlayerVirtualWorld(playerid);
              
      ShowPlayerDialog(playerid0DIALOG_STYLE_INPUT"Добавить текст""{FFFFFF}Вы можете добавить описание этому знаку""Добавить""Нет");
              return 
      1;
          }

    • Это добавляем в OnDialogResponse, а он то у всех есть
      PHP код:
      switch(dialogid)
      {
          case 
      0:
          {
              if(!
      response)
              {
                  
      SendClientMessage(playerid, -1"Установка дорожного знака завершена.");
                  
      CancelEdit(playerid);
                  return 
      1;
              }

              if (
      sscanf(inputtext"s[31]"road_sign[last_road_sign][r_label_text]))
              return 
      ShowPlayerDialog(playerid0DIALOG_STYLE_INPUT"Добавить текст""{FFFFFF}Вы можете добавить описание этому знаку""Добавить""Нет");

              
      ShowPlayerDialog(playerid1DIALOG_STYLE_LIST"Цвет текста""{ADD8E6}Цвет 1\n{006400}Цвет 2\n{00FF00}Цвет 3\n{FFFF00}Цвет 4\n{FF6347}Цвет 5\n{FF0000}Цвет 6\n{0000FF}Цвет 7\n{607B8B}Цвет 8""Выбрать""");
          }
          case 
      1:
          {
              if(!
      response)
              {
                  
      SendClientMessage(playerid, -1"Установка дорожного знака завершена.");
                  
      CancelEdit(playerid);
                  return 
      1;
              }
              
              
      road_sign[last_road_sign][r_label_text_color] = road_sign_color_text[listitem];
              
      road_sign[last_road_sign][r_label]  = CreateDynamic3DTextLabel(road_sign[last_road_sign][r_label_text], road_sign[last_road_sign][r_label_text_color], road_sign[last_road_sign][f_x], road_sign[last_road_sign][f_y], road_sign[last_road_sign][f_z] + 1.550.0__0road_sign[last_road_sign][v_world], 0_);
              
      SendClientMessage(playerid, -1"Установка дорожного знака завершена.");
              
      CancelEdit(playerid);
          }
          case 
      2:
          {
              
      #define ROAD_SIGN_ID GetPVarInt(playerid, "road_sign_id")
              
      if(!response)
              {
                  
      UpdateDynamic3DTextLabelText(road_sign[ROAD_SIGN_ID][r_label], road_sign[ROAD_SIGN_ID][r_label_text_color], road_sign[ROAD_SIGN_ID][r_label_text]);
                  
      SendClientMessage(playerid, -1"Описание дорожного знака обновлено.");
                  
      DeletePVar(playerid"road_sign_id");
                  return 
      1;
              }
              
              
      road_sign[ROAD_SIGN_ID][r_label_text_color] = road_sign_color_text[listitem];
              
      UpdateDynamic3DTextLabelText(road_sign[ROAD_SIGN_ID][r_label], road_sign[ROAD_SIGN_ID][r_label_text_color], road_sign[ROAD_SIGN_ID][r_label_text]);
              
      SendClientMessage(playeridroad_sign[ROAD_SIGN_ID][r_label_text_color], "Цвет дорожного знака обновлен.");
              
      DeletePVar(playerid"road_sign_id");
              
      #undef ROAD_SIGN_ID
          
      }

    • А это в OnPlayerConnect
      PHP код:
      TD_road_sign_view CreatePlayerTextDraw(playerid462.000000251.562500"LD_SPAC:white");
      PlayerTextDrawTextSize(playeridTD_road_sign_view132.000000187.687500);
      PlayerTextDrawUseBox(playeridTD_road_sign_view1);
      PlayerTextDrawBoxColor(playeridTD_road_sign_view90);
      PlayerTextDrawFont(playeridTD_road_sign_view5); 


    Важно: не стал добавлять константы для id диалогов. Ни все в этой жизни ctr + c / v

    С include пока повременим, как и с FS. Скоро добавлю плюшек :3

    Автор: Untonyst

    И глаголит Untonystъ истину простую своей рукой и четырьмя персатми, набирающие текст на иноземной неведанной доске всем, чтобы ты, узревшие тему очами зоркими своими, не спрятал свою гордыню и не украл честный труд Untonystъ. Но разрешает он словом своим в личной переписке, что разрешит он скопировать труд Untonystъ на всеобщее обозрение, если тот укажет настоящего автора этой летописи и желательно ссылку на летопись указать, если возможности позволяют. И истина эта проста, да не все с ней справляются.
    Последний раз редактировалось Desulaid; 13.12.2015 в 14:01.

  2. 4 пользователя(ей) сказали cпасибо:
    #Streamer (13.12.2015) L0ndl3m (13.12.2015) Nurick (14.12.2015) VVWVV (13.12.2015)
  3. #2
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Хорошая идея. Только вот было бы удобно, если бы цвета макросами были. Ну и конечно на диалогах более удобнее и практичнее, но я так понял, тебе было лень, поэтому ты по максимуму упростил систему)



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  4. Пользователь сказал cпасибо:
    Desulaid (13.12.2015)
  5. #3
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Хорошая идея. Только вот было бы удобно, если бы цвета макросами были. Ну и конечно на диалогах более удобнее и практичнее, но я так понял, тебе было лень, поэтому ты по максимуму упростил систему)
    Не, цвета на диалогах, а остальное это да :D

  6. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Превосходная работа, но я бы порекомендовал сделать это в виде отдельного «filterscript», так как это только лишь на два раза, и вшивать это в скрипт — не очень хорошая идея. И да, эти нижние подчёркивания(«under_score») в командах, для чего вообще они там нужны, почему бы не сделать команду тривиальнее. Например, «addsign» вместо «put_road_sign».
    Я не проверял код, однако работать будет.
    Последний раз редактировалось VVWVV; 12.12.2015 в 18:11.

  7. 2 пользователя(ей) сказали cпасибо:
    Desulaid (13.12.2015) Unreal (12.05.2016)
  8. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Превосходная работа, но я бы порекомендовал сделать это в виде отдельного «fliterscript», так как это только лишь на два раза, и вшивать это в скрипт — не очень хорошая идея. И да, эти нижние подчёркивания(«under_score») в командах, для чего вообще они там нужны, почему бы не сделать команду тривиальнее. Например, «addsign» вместо «put_road_sign».
    Я не проверял код, однако работать будет.
    Учту ваши пожелания и все сделаю в виде «fliterscript», спасибо

  9. #6
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    1. Вынести ID диалогов в константу.
    2. Сделать лучше всего includ'ом.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  10. #7
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    1. Вынести ID диалогов в константу.
    2. Сделать лучше всего includ'ом.
    Да. Идея с инклудом мне нравится, но я там скрою некую часть функций и прочего, к чему вам явно прикасаться не стоит, да и незачем.

  11. #8
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Да. Идея с инклудом мне нравится, но я там скрою некую часть функций и прочего, к чему вам явно прикасаться не стоит, да и незачем.
    class - private?
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  12. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    class - private?
    static же.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  13. #10
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    1. Вынести ID диалогов в константу.
    2. Сделать лучше всего includ'ом.
    Можно отдельным include'ом, однако зачем? Несомненно, если имеются функции, с которыми можно взаимодействовать, то можно сделать и include'ом, однако этих функций нет, а, следовательно, делать все include'ом — бессмысленно.
    Последний раз редактировалось VVWVV; 12.12.2015 в 23:35.

 

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

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

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

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

Ваши права

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