Skocz do zawartości
Quis

Etykiety tekstowe 3D z SA-MPa do MTA

Rekomendowane odpowiedzi

Cześć

Napisałem sobie skrypt na etykiety tekstowe podobne do tych z SA-MPa, do MTA. Jak na razie nie ma tutaj nic nadzwyczajnego, ale mam zamiar trochę to rozwinąć, dać możliwość zmiany czcionki, rozmiaru, zmiany koloru w środku tekstu, dodać możliwość tworzenia etykiet client-side, widocznych tylko dla jednego klienta, i inne.

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.

Edytowane przez Quis

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
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.

 

Proponowałbym dodać doczepianie 3dtextów do gracza/pojazdu/obiektu.

I ewentualnie ustawianie czcionki tekstu :P

Edytowane przez aSQw37rh

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Liczyłem, że funkcja attachElements to umożliwi, ale niestety nie działa :(

Mam już zrobione doczepianie u siebie, ale jakoś nie miałem czasu wstawić tutaj aktualizacji, chciałem dodać jeszcze odpowiedniki client-side :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Aktualizacja do wersji 1.1!

 

Lista zmian:

  • 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 to innych elementów
  • dodano parametr "index" w create3DTextLabel
Download w pierwszym poście.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×