Jump to content

3D Text Labels (etykiety tekstowe)


Recommended Posts

Nazwa: Quis 3D Text Labels

Wersja: 1.1

Screeny: Screen 1 Screen 2 (zielona etykieta ma nadany indeks 1) Screen 3 (etykieta przyczepiona do naczepy)

Przydatne informacje: Utworzone etykiety są elementami MTA, tak samo jak praktycznie wszystko co istnieje w MTA, czyli gracze, pojazdy, pickupy i inne. Typ elementu, dla etykiety to "text3d".

Rozmiar tekstu dla każdej etykiety tekstowej jest skalowany w zależności od odległości od gracza. Im dalej, tym tekst będzie mniejszy.

Lista zmian w wersji 1.1:

  • poprawiono błąd, który powodował że nie dało się ustawić wartości "checkLOS" na false. Błąd ten został też poprawiony w wersji 1.0, godzinę po jej wystawieniu
  • dodano czarną obwódkę do etykiet, dla ładniejszego wyglądu
  • dodano funkcje attach3DTextLabel i detach3DTextLabel umożliwiające przyczepianie etykiet do innych elementów
  • dodano parametr "index" w create3DTextLabel

Lista funkcji (tylko server-side):

text3d create3DTextLabel( string text, float posx, float posy, float posz, [ int red = 255, int green = 255, int blue = 255, float drawdistance = 100.0, bool checkLOS = true, int index = 0 ] ) 

Tworzy nową etykietę tekstową i zwraca jej element. Funkcja automatycznie konwertuje wszystkie zmienne jeśli ich typ jest nieprawidłowy, jeśli konwersja się nie powiedzie, zwraca "false".

  • text - ciąg znaków, który będzie zawarty w etykiecie
  • posx - pozycja X etykiety
  • posy - pozycja Y etykiety
  • posz - pozycja Z etykiety
  • red - ilość koloru czerwonego w kolorze etykiety, domyślnie 255
  • green - ilość koloru zielonego w kolorze etykiety, domyślnie 255
  • blue - ilość koloru niebieskiego w kolorze etykiety, domyślnie 255
  • drawdistance - z jakiej odległości ma być widoczna etykieta, domyślnie 100.0
  • checkLOS - czy w przypadku generowania etykiety, ma być sprawdzana linia wzroku (Line-Of-Sight), tzn. czy etykieta nie jest za jakimś obiektem. Domyślnie true.
  • index - taki jakby priorytet, im wyższy indeks, tym etykieta będzie generowana "wyżej" na stosie. Tzn. jeśli w jednym miejscu na ekranie nakłada się kilka etykiet, to na wierzchu będzie ta z najwyższym indeksem.

bool set3DTextLabelText( text3d label, string text ) 

Zmienia tekst etykiety tekstowej. Zwraca true gdy operacja się powiedzie, false gdy podano nieprawidłowe parametry.

 

string get3DTextLabelText( text3d label ) 

Zwraca aktualny tekst zawarty w etykiecie tekstowej.

 

bool set3DTextLabelColor( text3d label, int red, int green, int blue ) 

Zmienia kolor etykiety tekstowej. Zwraca true gdy operacja się powiedzie, false gdy podano nieprawidłowe parametry.

 

int, int, int get3DTextLabelColor( text3d label ) 

Zwraca kolor etykiety tekstowej w postaci trzech liczb.

 

 

bool attach3DTextLabel( text3d label, element theElement, [ float offsetX = 0.0, float offsetY = 0.0, float offsetZ = 0.0 ] ) 

Przyczepia etykietę do innego elementu. Dane są konwertowane na prawidłowy typ, tak jak zawsze. Jeśli konwersja się nie powiedzie, funkcja zwraca "false", a w przypadku powodzenia "true".

  • label - etykieta tekstowa, która ma zostać doczepiona
  • theElement - element, do którego ma zostać doczepiona etykieta tekstowa
  • offsetX - odległość X względem pozycji elementu
  • offsetY - odległość Y względem pozycji elementu
  • offsetZ - odległość Z względem pozycji elementu

bool detach3DTextLabel( text3d label ) 

Odczepia etykietę tekstową od elementu, etykieta wraca na pozycję ustaloną przy jej tworzeniu. Zwraca "true" w przypadku powodzenia, "false" w przypadku błędu. Ta funkcja jest równoznaczna z:

attach3DTextLabel(label, nil) 

Inne funkcje:

Ponieważ etykieta tekstowa jest elementem, działa na nią także mnóstwo innych funkcji, wbudowanych w MTA. Przykłady: destroyElement, getElementPosition, setElementPosition

Download:

Tym razem spakowałem dwa pliki .lua w archiwum ZIP, myślę że będzie to wygodniejsze od kopiowania. Wystarczy wgrać te pliki do zasobu w którym chcemy używać etykiet tekstowych, dodać dwie linijki w meta.xml, i już możemy cieszyć się nowymi funkcjami.

QuisTextLabels1_1.zip (Dropbox)

Wersja 1.0:

Kodu dużo nie ma, tak więc nie będę go nigdzie wstawiał. Skrypt można sobie wkleić do swojego zasobu, albo dodać jako nowy plik w istniejącym zasobie. Można też utworzyć całkiem nowy zasób, ale dostęp do funkcji będzie utrudniony (export).

Server-Side:

-- SERVER-SIDE  
-- Quis 3D Text Labels 1.0 
-- Etykiety tekstowe w MTA 
-- Proszę, zostaw te trzy linijki komentarza, w którym zawarte są informacje o autorze. 
  
function create3DTextLabel(text, posx, posy, posz, red, green, blue, drawdistance, checkLOS) 
    if (not red) then red = 255 end 
    if (not green) then green = 255 end 
    if (not blue) then blue = 255 end 
    if (not drawdistance) then drawdistance = 100.0 end 
    if (checkLOS == nil) then checkLOS = true end 
    if (type(text) ~= "string") then 
        text = tostring(text) 
        if (type(text) ~= "string") then return false end 
    end 
    if (type(posx) ~= "number") then 
        posx = tonumber(posx) 
        if (type(posx) ~= "number") then return false end 
    end 
    if (type(posy) ~= "number") then 
        posy = tonumber(posy) 
        if (type(posy) ~= "number") then return false end 
    end 
    if (type(posz) ~= "number") then 
        posz = tonumber(posz) 
        if (type(posz) ~= "number") then return false end 
    end 
    if (type(red) ~= "number") then 
        red = tonumber(red) 
        if (type(red) ~= "number") then return false end 
    end 
    if (type(green) ~= "number") then 
        green = tonumber(green) 
        if (type(green) ~= "number") then return false end 
    end 
    if (type(blue) ~= "number") then 
        blue = tonumber(blue) 
        if (type(blue) ~= "number") then return false end 
    end 
    if (type(drawdistance) ~= "number") then 
        drawdistance = tonumber(drawdistance) 
        if (type(drawdistance) ~= "number") then return false end 
    end 
    if (type(checkLOS) ~= "boolean") then return false end 
     
    local label = createElement("text3d") 
    local data = { } 
    data.Text = text 
    data.Red = red 
    data.Green = green 
    data.Blue = blue 
    data.DrawDistance = drawdistance 
    data.CheckLOS = checkLOS 
    setElementPosition(label, posx, posy, posz) 
    setElementData(label, "text3dData", data, true) 
    return label 
end 
  
function set3DTextLabelText(label, text) 
    if (not isElement(label) or getElementType(label) ~= "text3d") then return false end 
    if (type(text) ~= "string") then 
        text = tostring(text) 
        if (type(text) ~= "string") then return false end 
    end 
     
    local labelData = getElementData(label, "text3dData") 
    labelData.Text = text 
    setElementData(label, "text3dData", labelData, true) 
    return true 
end 
  
function get3DTextLabelText(label) 
    if (not isElement(label) or getElementType(label) ~= "text3d") then return false end 
    local labelData = getElementData(label, "text3dData") 
    return labelData.Text 
end 
  
function set3DTextLabelColor(label, red, green, blue) 
    if (not isElement(label) or getElementType(label) ~= "text3d") then return false end 
    if (type(red) ~= "number") then 
        red = tonumber(red) 
        if (type(red) ~= "number") then return false end 
    end 
    if (type(green) ~= "number") then 
        green = tonumber(green) 
        if (type(green) ~= "number") then return false end 
    end 
    if (type(blue) ~= "number") then 
        blue = tonumber(blue) 
        if (type(blue) ~= "number") then return false end 
    end 
    local labelData = getElementData(label, "text3dData") 
    labelData.Red = red 
    labelData.Green = green 
    labelData.Blue = blue 
    setElementData(label, "text3dData", labelData, true) 
    return true 
end 
  
function get3DTextLabelColor(label) 
    if (not isElement(label) or getElementType(label) ~= "text3d") then return false end 
    local labelData = getElementData(label, "text3dData") 
    return labelData.Red, labelData.Green, labelData.Blue 
end 

Client-Side:

-- CLIENT-SIDE  
-- Quis 3D Text Labels 1.0 
-- Etykiety tekstowe w MTA 
-- Proszę, zostaw te trzy linijki komentarza, w którym zawarte są informacje o autorze. 
  
addEventHandler("onClientRender", root, function() 
    if (not isPedDead(localPlayer)) then 
        local playerX, playerY, playerZ = getElementPosition(localPlayer) 
        for i,label in ipairs(getElementsByType("text3d")) do 
            local labelData = getElementData(label, "text3dData", false) 
            local labelX, labelY, labelZ = getElementPosition(label) 
            local distance = getDistanceBetweenPoints3D(playerX, playerY, playerZ, labelX, labelY, labelZ) 
            if (distance < labelData.DrawDistance) then 
                local showLabel = false 
                if (labelData.CheckLOS) then 
                    local cameraX, cameraY, cameraZ = getCameraMatrix() 
                    if (isLineOfSightClear(cameraX, cameraY, cameraZ, labelX, labelY, labelZ, true, false, false)) then 
                        showLabel = true 
                    else 
                        showLabel = false 
                    end 
                else 
                    showLabel = true 
                end 
                if (showLabel) then 
                    local posScreenX, posScreenY = getScreenFromWorldPosition(labelX, labelY, labelZ) 
                    if (posScreenX and posScreenY) then 
                        local scale = (-0.004*distance)+1.2 
                        dxDrawText(labelData.Text, posScreenX-100, posScreenY-50, posScreenX+100, posScreenY+50, tocolor(labelData.Red, labelData.Green, labelData.Blue), scale, "default-bold", "center", "center", false, true, false) 
                    end 
                end 
            end 
        end 
    end 
end) 

Będę robił aktualizacje, nie jest to ostatnia wersja, tak więc możecie zgłaszać bugi i propozycje, będę wdzięczny :)

Miłej zabawy.

  • Like 1
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...