Skip to content

create3dtextlabel /createtextdraw #4

@Suchty112

Description

@Suchty112

https://samp-udf.net/index.php?thread/37-create3dtextlabel-text-color-float-x-float-y-float-z-float-drawdistance-virtualw/

createTextLabel(sText, dwColor, fX, fY, fZ, fDrawDistance := 50.0, bTestLOS := 0, wPlayerID := 0xFFFF, wVehicleID := 0xFFFF) {
if (!checkHandles())
return -1

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)

Loop, 2048 {
	wID := A_Index - 1

	if (!readDWORD(hGTA, dwAddress + 0xE800 + wID * 4)) {
		return callWithParams(hGTA, dwSAMP + 0x11C0, [["i", dwAddress], ["i", wID], ["s", sText], ["i", dwColor], ["f", fX], ["f", fY], ["f", fZ]
			, ["f", fDrawDistance], ["i", bTestLOS], ["i", wPlayerID], ["i", wVehicleID]], false, true) ? wID : -1
	}
}

return -1

}

updateTextLabel(wID, sText, dwColor) {
if (wID < 0 || wID > 2047 || !checkHandles())
return false

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)
fX := readFloat(hGTA, dwAddress + wID * 0x1D + 0x8)
fY := readFloat(hGTA, dwAddress + wID * 0x1D + 0xC)
fZ := readFloat(hGTA, dwAddress + wID * 0x1D + 0x10)
fDrawDistance := readFloat(hGTA, dwAddress + wID * 0x1D + 0x14)
bTestLOS := readMem(hGTA, dwAddress + wID * 0x1D + 0x18, 1, "Byte")
wPlayerID := readMem(hGTA, dwAddress + wID * 0x1D + 0x19, 2, "UShort")
wVehicleID := readMem(hGTA, dwAddress + wID * 0x1D + 0x1B, 2, "UShort")

return callWithParams(hGTA, dwSAMP + 0x11C0, [["i", dwAddress], ["i", wID], ["s", sText], ["i", dwColor], ["f", fX], ["f", fY], ["f", fZ], ["f", fDrawDistance]
	, ["i", bTestLOS], ["i", wPlayerID], ["i", wVehicleID]], false, true)

}

deleteTextLabel(ByRef wID) {
if (!checkHandles())
return false

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0xC)
if (callWithParams(hGTA, dwSAMP + 0x12D0, [["i", dwAddress], ["i", wID]], false, true)) {
	wID := -1
	return true
}

return false

}

callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true, bThisCall = false, bReturn = false, sDatatype = "Char") {
if (!hProcess)
return -1

dataOffset := 0
i := aParams.MaxIndex()
bytesUsed := 0
bytesMax := 5120
dwLen := i * 5 + bCleanupStack * 3 + bReturn * 5 + 6
VarSetCapacity(injectData, dwLen, 0)

while (i > 0) {
	if (aParams[i][1] == "i" || aParams[i][1] == "p" || aParams[i][1] == "f")
		value := aParams[i][2]
	else if (aParams[i][1] == "s") {
		if (bytesMax - bytesUsed < StrLen(aParams[i][2]))
			return -1

		value := pMemory + bytesUsed
		writeString(hProcess, value, aParams[i][2])

		bytesUsed += StrLen(aParams[i][2]) + 1
		if (ErrorLevel)
			return -1
	}
	else
		return -1

	NumPut((bThisCall && i == 1 ? 0xB9 : 0x68), injectData, dataOffset, "UChar")
	NumPut(value, injectData, ++dataOffset, aParams[i][1] == "f" ? "Float" : "Int")
	dataOffset += 4
	i--
}

offset := dwFunc - (pInjectFunc + dataOffset + 5)
NumPut(0xE8, injectData, dataOffset, "UChar")
NumPut(offset, injectData, ++dataOffset, "Int")
dataOffset += 4
if (bReturn) {
	NumPut(sDatatype = "Char" ? 0xA2 : 0xA3, injectData, dataOffset, "UChar")
	NumPut(pParam1, injectData, ++dataOffset, "UInt")
	dataOffset += 4 
}
if (bCleanupStack) {
	NumPut(0xC483, injectData, dataOffset, "UShort")
	dataOffset += 2
	NumPut((aParams.MaxIndex() - bThisCall) * 4, injectData, dataOffset, "UChar")
	dataOffset++
}
NumPut(0xC3, injectData, dataOffset, "UChar")

writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
if (ErrorLevel)
	return -1

hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
if (ErrorLevel)
	return -1

waitForSingleObject(hThread, 0xFFFFFFFF)
closeProcess(hThread)
if (bReturn)
	return readMem(hGTA, pParam1, 4, sDatatype)

return true

}

deleteTextDraw(ByRef wID) {
if (wID < 0 || wID > 2047 || !checkHandles())
return false

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)
if (callWithParams(hGTA, dwSAMP + 0x1AD00, [["i", dwAddress], ["i", wID]], false, true)) {
	wID := -1
	return true
}

return false

}

createTextDraw(sString, fX, fY, dwLetterColor := 0xFFFFFFFF, bFont := 3, fLetterWidth := 0.4, fLetterHeight := 1, bShadowSize := 0, bOutline := 1
, dwShadowColor := 0xFF000000, bBox := 0, dwBoxColor := 0xFFFFFFFF, fBoxSizeX := 0.0, fBoxSizeY := 0.0, bLeft := 0, bRight := 0, bCenter := 1
, bProportional := 1, wModel := 0, fXRot := 0.0, fYRot := 0.0, fZRot := 0.0, fZoom := 1.0, wColor1 := 0xFFFF, wColor2 := 0xFFFF) {

if (StrLen(sString) > 800 || bFont > 5 || !checkHandles())
	return -1

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)

Loop, 2048 {
	wID := A_Index - 1

	if (!readDWORD(hGTA, dwAddress + wID * 4)) {
		VarSetCapacity(struct, 63, 0)

		NumPut((bBox ? 1 : 0) + (bLeft ? 2 : 0) + (bRight ? 4 : 0) + (bCenter ? 8 : 0) + (bProportional ? 16 : 0), &struct, 0, "Byte")
		NumPut(fLetterWidth, &struct, 1, "Float")
		NumPut(fLetterHeight, &struct, 5, "Float")
		NumPut(dwLetterColor, &struct, 9, "Int")
		NumPut(fBoxSizeX, &struct, 0xD, "Float")
		NumPut(fBoxSizeY, &struct, 0x11, "Float")
		NumPut(dwBoxColor, &struct, 0x15, "Int")
		NumPut(bShadowSize, &struct, 0x19, "Byte")
		NumPut(bOutline, &struct, 0x1A, "Byte")
		NumPut(dwShadowColor, &struct, 0x1B, "Int")
		NumPut(bFont, &struct, 0x1F, "Byte")
		NumPut(1, &struct, 0x20, "Byte")  ; should be 0/1 - TextDrawSelectable ?
		NumPut(fX, &struct, 0x21, "Float")
		NumPut(fY, &struct, 0x25, "Float")
		NumPut(wModel, &struct, 0x29, "Short")
		NumPut(fXRot, &struct, 0x2B, "Float")
		NumPut(fYRot, &struct, 0x2F, "Float")
		NumPut(fZRot, &struct, 0x33, "Float")
		NumPut(fZoom, &struct, 0x37, "Float")
		NumPut(wColor1, &struct, 0x3B, "Short")
		NumPut(wColor2, &struct, 0x3D, "Short")

		writeRaw(hGTA, pParam5, &struct, 63)
		if (ErrorLevel)
			return -1

		return callWithParams(hGTA, dwSAMP + 0x1AE20, [["i", dwAddress], ["i", wID], ["i", pParam5], ["s", sString]], false, true) ? wID : -1
	}
}

return -1

}

moveTextDraw(wID, xPos, yPos) {
if (wID < 0 || wID > 2047 || !checkHandles())
return false

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10) + wID * 4 + (4 * (SAMP_MAX_PLAYERTEXTDRAWS + SAMP_MAX_TEXTDRAWS)))
return writeMemory(hGTA, dwAddress + 0x98B, xPos, 4, "Float") && writeMemory(hGTA, dwAddress + 0x98F, yPos, 4, "Float")

}

updateTextDraw(wID, sString) {
if (wID < 0 || wID > 2047 || StrLen(sString) > 800 || !checkHandles())
return false

dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x10)
return writeString(hGTA, readDWORD(hGTA, dwAddress + wID * 4 + (4 * (SAMP_MAX_PLAYERTEXTDRAWS + SAMP_MAX_TEXTDRAWS))), sString)

}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions