Quis Posted February 24, 2015 Share Posted February 24, 2015 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. 1 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now