Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

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

Статус
В этой теме нельзя размещать новые ответы.

Untonyst

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

Версия: 1.1.1

Что изменилось:
  • Переправлены команды по примерам мифа #4 от Daniel_Cortez.
  • Избавился от 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] =
    {
        19955, 19954, 19953, 19952, 19951,
        19950, 19949, 19948, 19963, 19962,
        19961, 19960, 19959, 19958, 19957,
        19956, 19971, 19970, 19969, 19968,
        19967, 19966, 19965, 19964, 19979,
        19978, 19977, 19976, 19975, 19974,
        19973, 19972, 19987, 19986, 19985,
        19984, 19983, 19982, 19981, 19980,
        19988, 19989, 19990, 19991, 19992
    };
    
    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(playerid, params[])
    {
        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:x, Float:y, Float:z, Float:angle;
        GetPlayerPos(playerid, x, y, z);
        GetPlayerFacingAngle(playerid, angle);
        x += floatsin(-angle, degrees);
        y += floatcos(-angle, degrees);
        SetPVarInt(playerid, "road_sign_editor", 1);
        last_road_sign = CreateDynamicObject(road_sign_models[cmd_sign_model_id], x, y, z - 0.35, 0, 0, 0, GetPlayerVirtualWorld(playerid));
        EditDynamicObject(playerid, last_road_sign);
        return 1;
    }
    
    // узнать как выглядит знак по его порядковому номеру модели
    COMMAND:signnum(playerid, params[])
    {
        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(playerid, TD_road_sign_view, road_sign_models[cmd_sign_model_id]);
        PlayerTextDrawSetPreviewRot(playerid, TD_road_sign_view, 0.0, 0.0, 180.0, 1.0);
        PlayerTextDrawShow(playerid, TD_road_sign_view);
        SetTimerEx("@__HideTextDrawRoadSign", 3000, false, "i", playerid);
        return 1;
    }
    
    @__HideTextDrawRoadSign(playerid);
    @__HideTextDrawRoadSign(playerid)
    {
        PlayerTextDrawHide(playerid, TD_road_sign_view);
    }
    
    
    // удаляем дорожный знак по его id
    COMMAND:deletesign(playerid, params[])
    {
        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(playerid, params[])
    {
        new cmd_sign_id;
        
        if (sscanf(params, "is[31]", cmd_sign_id, params))
            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(playerid, 2, DIALOG_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, если нету, то ).
    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(playerid, 0, DIALOG_STYLE_INPUT, "Добавить текст", "{FFFFFF}Вы можете добавить описание этому знаку", "Добавить", "Нет");
    		return 1;
    	}
    }
  • Это добавляем в OnDialogResponse, а он то у всех есть :dirol:
    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(playerid, 0, DIALOG_STYLE_INPUT, "Добавить текст", "{FFFFFF}Вы можете добавить описание этому знаку", "Добавить", "Нет");
    
    		ShowPlayerDialog(playerid, 1, DIALOG_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.5, 50.0, _, _, 0, road_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(playerid, road_sign[ROAD_SIGN_ID][r_label_text_color], "Цвет дорожного знака обновлен.");
    		DeletePVar(playerid, "road_sign_id");
    		#undef ROAD_SIGN_ID
    	}
    }
  • А это в OnPlayerConnect
    PHP:
    TD_road_sign_view = CreatePlayerTextDraw(playerid, 462.000000, 251.562500, "LD_SPAC:white");
    PlayerTextDrawTextSize(playerid, TD_road_sign_view, 132.000000, 187.687500);
    PlayerTextDrawUseBox(playerid, TD_road_sign_view, 1);
    PlayerTextDrawBoxColor(playerid, TD_road_sign_view, 90);
    PlayerTextDrawFont(playerid, TD_road_sign_view, 5);

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

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

Автор: Untonyst

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