Показано с 1 по 5 из 5
  1. #1

    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    22
    Сообщений
    103
    Репутация
    93
    За третье место в конкурсе по скриптингу

    Система граффити как на GamBit. Практически.

    Предыстория
    Привет. Изначально я начал писать эту систему для одного проекта. Но, видимо, они про меня забыли. Последнее сообщение, отправленное мной было два дня назад (05.04.16), но реакции ноль. Позиция проекта мне не нравится в плане того, что они забывают про своих сотрудников (ору), поэтому, чтобы моя работа не пропала зря, хоть она и не уникальная прям на столько, да и не совсем доделана, но все же я решаюсь ее выложить вам.

    Описание
    Мне надо было сделать копию системы с GamBit RolePlay. Как ТЗ кинули видео. Вот оно.
    Некоторые моменты я не доделал. Но система рабочая. Вот скрины<...>

    Код
    • Система работает с использованием DC_CMD, sscanf2 и streamer плагинов. Логично, если у вас не подключены эти библиотеки, подключить их. (А если их нет, то скачать.)
      PHP код:
      #include <dc_cmd>
      #include <sscanf2>
      #include <streamer> 
    • Переменные и константы
      1. Далее добавим две константы, которые упрощают прочтение кода и его написание.
        PHP код:
        const DIALOG_GRAFFITI_MENU 0;
        const 
        MAX_GRAFFITI_TEXT 128
      2. Тут у нас хранится вся информация о граффити игроков.
        PHP код:
        enum E_GRAFFITI_INFO
        {
            
        g_id,
            
        g_text[MAX_GRAFFITI_TEXT],
            
        g_font[8],
            
        g_color,
            
        g_size,
            
        g_outline,
            
        g_v_worldg_interior,
            
        Float:g_xFloat:g_yFloat:g_z,
            
        Float:g_r_xFloat:g_r_yFloat:g_r_z
        };
        new 
        g_info[MAX_PLAYERS][E_GRAFFITI_INFO]; 
    • Теперь добавим команду.
      PHP код:
      COMMAND:graffiti(playeridparams[])
      {
          static 
      str_g_text_0[] = !"{FFFFFF}1. {FAF0E6}Текст граффити - Не указан\n";
          static 
      str_g_text_1[] = !"{FFFFFF}1. {FAF0E6}Текст граффити - Указан\n";

          static 
      str_g_font_0[] = !"{FFFFFF}2. {FAF0E6}Шрифт граффити - Не указан\n";
          static 
      str_g_font_1[] = !"{FFFFFF}2. {FAF0E6}Шрифт граффити - Указан\n";

          static 
      str_g_color_0[] = !"{FFFFFF}3. {FAF0E6}Цвет граффити - Не указан\n";
          static 
      str_g_color_1[] = !"{FFFFFF}3. {FAF0E6}Цвет граффити - Указан\n";

          static 
      str_g_size_0[] = !"{FFFFFF}4. {FAF0E6}Размер граффити - Не указан\n";
          static 
      str_g_size_1[] = !"{FFFFFF}4. {FAF0E6}Размер граффити - Указан\n";

          static 
      str_g_outline_0[] = !"{FFFFFF}5. {FAF0E6}Обводка граффити - Выключена\n";
          static 
      str_g_outline_1[] = !"{FFFFFF}5. {FAF0E6}Обводка граффити - Включена\n";

          static 
      str_g_end[] = !"{FFFFFF}6. {FAF0E6}Нарисовать граффити";

          static 
      strsizeof str_g_text_0 +
                      
      sizeof str_g_font_0 +
                      
      sizeof str_g_color_0 +
                      
      sizeof str_g_size_0 +
                      
      sizeof str_g_outline_0 +
                      
      sizeof str_g_end ];

          if (
      isnull(g_info[playerid][g_text]))
          {
              
      strcat(strstr_g_text_0);
          }
          else 
      strcat(strstr_g_text_1);

          if (
      isnull(g_info[playerid][g_font]))
          {
              
      strcat(strstr_g_font_0);
          }
          else 
      strcat(strstr_g_font_1);

          if (
      g_info[playerid][g_color] == -1)
          {
              
      strcat(strstr_g_color_0);
          }
          else 
      strcat(strstr_g_color_1);

          if (
      g_info[playerid][g_size] == -1)
          {
              
      strcat(strstr_g_size_0);
          }
          else 
      strcat(strstr_g_size_1);

          if (
      g_info[playerid][g_outline] == -1)
          {
              
      strcat(strstr_g_outline_0);
          }
          else 
      strcat(strstr_g_outline_1);

          
      strcat(strstr_g_end);
          
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENUDIALOG_STYLE_LIST,
              !
      "{FAF0E6}> Граффити",
              
      str,
              !
      "Далее", !"Отмена"
          
      );
          
      str[0] = EOS;
          return 
      1;

    • Добавим ответ на граффити-меню. Это суем в OnDialogResponse
      PHP код:
      case DIALOG_GRAFFITI_MENU:
      {
          if (!
      response)
          {
              return 
      DeleteGraffiti(playerid);
          }
          switch (
      listitem)
          {
              case 
      0:
              {
                  return 
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENU 1DIALOG_STYLE_INPUT,
                      !
      " ",
                      !
      "{FFFFFF}Введите текст для граффити:",
                      !
      "Далее", !"Отмена"
                  
      );
              }
              case 
      1:
              {
                  return 
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENU 2DIALOG_STYLE_LIST,
                      !
      " ",
                      !
      "{FFFFFF}- Arial\n- Calibri\n- Tahoma\n- Verdana",
                      !
      "Далее", !"Отмена"
                  
      );
              }
              case 
      2:
              {
                  return 
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENU 3DIALOG_STYLE_LIST,
                      !
      " ",
                      !
      "{FFFFFF}- Желтый\n- Красный\n- Синий\n- Белый\n- Зеленый\n- Черный\n\
                      - Ввести вручную"
      ,
                      !
      "Далее", !"Отмена"
                  
      );
              }
              case 
      3:
              {
                  return 
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENU 4DIALOG_STYLE_INPUT,
                      !
      " ",
                      !
      "Введите размер:",
                      !
      "Далее", !"Отмена"
                  
      );
              }
              case 
      4:
              {
                  if (
      g_info[playerid][g_outline] == 0)
                  {
                      
      g_info[playerid][g_outline] = 1;
                  }
                  
      g_info[playerid][g_outline] = 0;
                  return 
      cmd::graffiti(playerid"");
              }
              case 
      5:
              {
                  if (
      GetPVarInt(playerid, !"GRAFFITI_VALUE") < 4)
                  {
                      
      DeleteGraffiti(playerid);
                      return 
      SendClientMessage(playerid, -1,
                          !
      "Не все пункты выбраны"
                      
      );
                  }
                  new 
      Float:xFloat:yFloat:z;
                  
      GetPlayerPos(playeridxyz);
                  
      g_info[playerid][g_id] = CreateDynamicObject(
                      
      19353,
                      
      x-1.0yz,
                      
      0.00.00.0,
                      
      GetPlayerVirtualWorld(playerid),
                      
      GetPlayerInterior(playerid)
                  );
                  
      SetDynamicObjectMaterialText(
                      
      g_info[playerid][g_id],
                      
      0,
                      
      g_info[playerid][g_text],
                      
      OBJECT_MATERIAL_SIZE_512x512,
                      
      g_info[playerid][g_font],
                      
      g_info[playerid][g_size],
                      
      g_info[playerid][g_outline],
                      
      g_info[playerid][g_color],
                      
      0,
                      
      OBJECT_MATERIAL_TEXT_ALIGN_CENTER
                  
      );
                  
      EditDynamicObject(playeridg_info[playerid][g_id]);
                  return 
      1;
              }
          }
          return 
      1;
      }
      case 
      DIALOG_GRAFFITI_MENU 1:
      {
          
      SetPVarInt(playerid, !"GRAFFITI_VALUE"GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
          if (!
      response)
          {
              return 
      DeleteGraffiti(playerid);
          }
          if ((
      <= strlen(inputtext) <= MAX_GRAFFITI_TEXT) == 0)  
          {
              return 
      ShowPlayerDialog(playeridDIALOG_GRAFFITI_MENU 1DIALOG_STYLE_INPUT,
                  !
      " ",
                  !
      "{FFFFFF}Введите текст для граффити:",
                  !
      "Далее", !"Отмена"
              
      );
          }
          
      strins(g_info[playerid][g_text], inputtext0);
          return 
      cmd::graffiti(playerid"");
      }
      case 
      DIALOG_GRAFFITI_MENU 2:
      {
          if (!
      response)
          {
              return 
      DeleteGraffiti(playerid);
          }
          
      SetPVarInt(playerid, !"GRAFFITI_VALUE"GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
          static const 
      g_fonts[][] =
          {
              !
      "Arial",
              !
      "Calibri",
              !
      "Tahoma",
              !
      "Verdana"
          
      };
          
      strcat(g_info[playerid][g_font], g_fonts[listitem]);
          return 
      cmd::graffiti(playerid"");
      }
      case 
      DIALOG_GRAFFITI_MENU 3:
      {
          if (!
      response)
          {
              return 
      DeleteGraffiti(playerid);
          }
          
      SetPVarInt(playerid, !"GRAFFITI_VALUE"GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
          if (
      listitem == 6)
          {
              
      sscanf(inputtext"h"g_info[playerid][g_color]);
          }
          else
          {
              static const 
      g_colors[]=
              {
                  
      0xFFFF00AA,
                  
      0xFF0000AA,
                  
      0x0000FFAA,
                  
      0xFFFFFFAA,
                  
      0x00FF00AA,
                  
      0x000000AA
              
      };
              
      g_info[playerid][g_color] = g_colors[listitem];
          }
          return 
      cmd::graffiti(playerid"");
      }
      case 
      DIALOG_GRAFFITI_MENU 4:
      {
          
      SetPVarInt(playerid, !"GRAFFITI_VALUE"GetPVarInt(playerid, !"GRAFFITI_VALUE") + 1);
          if (!
      response)
          {
              return 
      DeleteGraffiti(playerid);
          }
          
      sscanf(inputtext"i"g_info[playerid][g_size]);
          return 
      cmd::graffiti(playerid"");

    • Чтобы зафиксировать актуальное положение граффити, нам необходимо обновить их в OnPlayerEditDynamicObject. В этом же паблике можете добавить такую же "фильтрацию" содержимого граффити. Я этого делать не стал.
      PHP код:
      public OnPlayerEditDynamicObject(playeridobjectidresponseFloat:xFloat:yFloat:zFloat:rxFloat:ryFloat:rz)
      {
          if (!
      response)
          {
              
      DeleteGraffiti(playerid);
              return 
      1;
          }
          
      g_info[playerid][g_x] = x;
          
      g_info[playerid][g_y] = y;
          
      g_info[playerid][g_z] = z;
          
      g_info[playerid][g_r_x] = rx;
          
      g_info[playerid][g_r_y] = ry;
          
      g_info[playerid][g_r_z] = rz;
          return 
      1;

    • Добавим функцию. Суть ее в том, чтобы всем массивам поставить значение '\0' и '-1'. Это нужно для проверки. И просто я мазахист.
      PHP код:
      stock DeleteGraffiti(playerid)
      {
          
      DestroyDynamicObject(g_info[playerid][g_id]);
          
      g_info[playerid][g_text][0] = g_info[playerid][g_font][0] = EOS;
          
      g_info[playerid][g_color] = g_info[playerid][g_size] =
          
      g_info[playerid][g_outline] = g_info[playerid][g_id] = -1;
          return 
      1;

    • Заменим все значения при старте мода. Это суем в OnGameModeInit
      PHP код:
      for (new iMAX_PLAYERSi++)
          
      DeleteGraffiti(i); 


    Автор кода, но не идеи - Untonyst. Я разрешаю вам копипастить куда захотите, но только меня как автора указывать не забывайте.
    Последний раз редактировалось Untonyst; 07.04.2016 в 21:44.
    Дудеть в трубу!
    ору

  2. 2 пользователей сказали cпасибо Untonyst за это полезное сообщение:

    Games (07.04.2016), Меша (07.04.2016)

  3. #2

    Пользователь
    Регистрация
    08.01.2016
    Сообщений
    6
    Репутация
    11
    1. Лучше вынести повторяющие строки в отдельную глобальную переменную для увеличения производительности - экономим сегмент данных.
    2. Наименование ключей в функции G/SetPVar* тоже стоит упаковать. Кстати, и не только в функциях G/SetPVar*, ибо нуль символ тоже считается.
    3. Мне не очень понятно, что ты хотел сказать этим:
    PHP код:
    for (new iMAX_PLAYERSi++)
        
    DeleteGraffiti(i); 
    А также этим:
    PHP код:
    new len strlen(inputtext);
        if (!(
    len) || !(<= len <= MAX_GRAFFITI_TEXT)) 
    Ты, кстати, кроме этой проверки нигде её не используешь, а это значит, что можно сделать так:
    PHP код:
    if ((<= strlen(inputtext) <= MAX_GRAFFITI_TEXT) == 0

  4. 1 пользователь сказал cпасибо VVWVV за это полезное сообщение:

    Untonyst (07.04.2016)

  5. #3

    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    22
    Сообщений
    103
    Репутация
    93
    За третье место в конкурсе по скриптингу
    VVWVV, что увидел, поправил, но я не смог найти повторяющиеся строки :с На счет пункта три - это такой костыль, для заполнения массива другими значениями. Дело в том, что в енумераторе нельзя поставить значение свое, оно там либо "ничего", либо "нуль". Поэтому я провел этот древний шумерский обряд. Использовать его мне пришлось по причине проверок в менюшке. Если брать ноль, то там будет висеть, что мы выбрали что-то из настроек. Спасибо за информативную критику :3
    Дудеть в трубу!
    ору

  6. #4

    Пользователь
    Регистрация
    08.01.2016
    Сообщений
    6
    Репутация
    11
    В функции sscanf тоже можно упаковать параметр.
    Строки, которые ты не нашёл:
    PHP код:
    "GRAFFITI_VALUE"
    "Далее"
    "Отмена"
    "{FFFFFF}Введите текст для граффити:"
    " " 
    Последний раз редактировалось VVWVV; 07.04.2016 в 22:36.

  7. #5
    Аватар для Vovanm93
    Fallout MTA
    Регистрация
    03.01.2011
    Адрес
    Армавир
    Возраст
    25
    Сообщений
    1,142
    Репутация
    128
    На гамбите граффити хуже сделаны


 

Ваши права

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