3D Text Labels в Pawn: создание текстовых меток

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

3D Text Labels позволяют отображать текст в игровом мире. Разберем работу с ними.

Создание 3D Text Label
Код:
Create3DTextLabel(text[], color, Float:x, Float:y, Float:z, Float:drawDistance, virtualworld, testLOS);
// Пример:
new Text3D:label = Create3DTextLabel("Добро пожаловать!", 0xFFFFFFFF, 0.0, 0.0, 3.0, 20.0, 0, 0);

Параметры:
- text - текст метки
- color - цвет в формате ARGB
- x, y, z - координаты
- drawDistance - дистанция прорисовки
- virtualworld - виртуальный мир (-1 для всех)
- testLOS - проверка видимости (0/1)

Управление метками
Код:
// Обновить текст
Update3DTextLabelText(Text3D:id, color, text[]);

// Удалить метку
Delete3DTextLabel(Text3D:id);

// Прикрепить к игроку
Attach3DTextLabelToPlayer(Text3D:id, playerid, Float:offsetX, Float:offsetY, Float:offsetZ);

// Прикрепить к транспорту
Attach3DTextLabelToVehicle(Text3D:id, vehicleid, Float:offsetX, Float:offsetY, Float:offsetZ);

Пример: метки для домов
Код:
enum HouseInfo
{
    Float:hX,
    Float:hY,
    Float:hZ,
    hPrice,
    hOwner[MAX_PLAYER_NAME],
    Text3D:hLabel
}

new HouseData[100][HouseInfo];
new TotalHouses = 0;

CreateHouse(Float:x, Float:y, Float:z, price)
{
    if(TotalHouses >= sizeof(HouseData))
    {
        return -1;
    }
    
    new string[128];
    if(strlen(HouseData[TotalHouses][hOwner]) == 0)
    {
        format(string, sizeof(string), "Дом на продажу\nЦена: $%d\nНажмите F", price);
    }
    else
    {
        format(string, sizeof(string), "Дом\nВладелец: %s\nНажмите F", HouseData[TotalHouses][hOwner]);
    }
    
    HouseData[TotalHouses][hX] = x;
    HouseData[TotalHouses][hY] = y;
    HouseData[TotalHouses][hZ] = z;
    HouseData[TotalHouses][hPrice] = price;
    HouseData[TotalHouses][hLabel] = Create3DTextLabel(string, 0xFFFFFFFF, x, y, z + 1.0, 20.0, 0, 0);
    
    TotalHouses++;
    return TotalHouses - 1;
}

UpdateHouseLabel(houseid)
{
    new string[128];
    if(strlen(HouseData[houseid][hOwner]) == 0)
    {
        format(string, sizeof(string), "Дом на продажу\nЦена: $%d\nНажмите F", HouseData[houseid][hPrice]);
        Update3DTextLabelText(HouseData[houseid][hLabel], 0xFFFFFFFF, string);
    }
    else
    {
        format(string, sizeof(string), "Дом\nВладелец: %s\nНажмите F", HouseData[houseid][hOwner]);
        Update3DTextLabelText(HouseData[houseid][hLabel], 0x00FF00FF, string);
    }
}

BuyHouse(playerid, houseid)
{
    if(GetPlayerMoney(playerid) < HouseData[houseid][hPrice])
    {
        SendClientMessage(playerid, -1, "Недостаточно денег");
        return 0;
    }
    
    GetPlayerName(playerid, HouseData[houseid][hOwner], MAX_PLAYER_NAME);
    GivePlayerMoney(playerid, -HouseData[houseid][hPrice]);
    UpdateHouseLabel(houseid);
    
    SendClientMessage(playerid, -1, "Дом куплен!");
    return 1;
}

Пример: метки для транспорта
Код:
enum VehicleInfo
{
    vModel,
    Text3D:vLabel,
    vOwner[MAX_PLAYER_NAME]
}

new VehicleData[MAX_VEHICLES][VehicleInfo];

public OnGameModeInit()
{
    new vehicleid = CreateVehicle(411, 0.0, 0.0, 3.0, 0.0, 0, 1, -1);
    
    new string[128];
    format(string, sizeof(string), "Транспорт\nМодель: %d\nНажмите F", 411);
    VehicleData[vehicleid][vLabel] = Create3DTextLabel(string, 0xFFFFFFFF, 0.0, 0.0, 1.0, 15.0, 0, 0);
    Attach3DTextLabelToVehicle(VehicleData[vehicleid][vLabel], vehicleid, 0.0, 0.0, 1.0);
    
    return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    if(ispassenger)
    {
        return 1;
    }
    
    new string[128];
    if(strlen(VehicleData[vehicleid][vOwner]) == 0)
    {
        format(string, sizeof(string), "Транспорт\nМодель: %d\nВладелец: Нет", GetVehicleModel(vehicleid));
    }
    else
    {
        format(string, sizeof(string), "Транспорт\nМодель: %d\nВладелец: %s", 
            GetVehicleModel(vehicleid), VehicleData[vehicleid][vOwner]);
    }
    
    Update3DTextLabelText(VehicleData[vehicleid][vLabel], 0xFFFFFFFF, string);
    return 1;
}

Пример: метки для игроков
Код:
new Text3D:PlayerLabel[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    new string[128], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "%s\nLevel: 1", name);
    
    PlayerLabel[playerid] = Create3DTextLabel(string, 0xFFFFFFFF, 0.0, 0.0, 0.5, 20.0, 0, 0);
    Attach3DTextLabelToPlayer(PlayerLabel[playerid], playerid, 0.0, 0.0, 0.5);
    
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    Delete3DTextLabel(PlayerLabel[playerid]);
    return 1;
}

UpdatePlayerLabel(playerid)
{
    new string[128], name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    format(string, sizeof(string), "%s\nLevel: %d | Money: $%d", 
        name, PlayerInfo[playerid][pLevel], GetPlayerMoney(playerid));
    
    Update3DTextLabelText(PlayerLabel[playerid], 0xFFFFFFFF, string);
}

public OnPlayerUpdate(playerid)
{
    static lastUpdate[MAX_PLAYERS];
    if(GetTickCount() - lastUpdate[playerid] > 1000)
    {
        UpdatePlayerLabel(playerid);
        lastUpdate[playerid] = GetTickCount();
    }
    return 1;
}

Цвета меток
Код:
// Белый
0xFFFFFFFF

// Красный
0xFF0000FF

// Зеленый
0x00FF00FF

// Синий
0x0000FFFF

// Желтый
0xFFFF00FF

// Прозрачный фон
0xFFFFFFAA

Важные моменты:
- Максимум 1024 метки на сервере
- Обновляйте метки при изменении данных
- Используйте прикрепление для динамических меток
- Оптимизируйте drawDistance для производительности

3D Text Labels делают информацию доступной в игровом мире!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху