It's not very often that I need to stream custom textures through DLC content for GTA:V but this is pretty much how you do it.
If you are looking for something like this...
These are done through a .ytd
file.
Tool You Need
- https://www.gta5-mods.com/tools/texture-toolkit
- https://gametechdev.github.io/Intel-Texture-Works-Plugin/
- Photoshop
You are going to want to install the File Format plugins for Photoshop in the following folders:
C:\Program Files (x86)\Adobe\Adobe Photoshop CS6\Plug-ins\File Formats
C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Plug-ins\File Formats
You should place a file inside called IntelTextureWorks.8bi
from the Intel Texture Works link above.
Using the Tools
Open Photoshop and any Icon / Texture you want to use.
After opening the image you will have two pathways.
- You do not need transparency in your image.
- You need transparency.
If you keep need transparency follow the following steps. It not; skip these steps.
Go ahead and CTRL + Left Click
the icon preview image in your layers tab on the right-hand side.
This specifically:
After you will see that your image is selected; but only the non-transparent parts.
Next in the right-hand side there's a tab called channels
open that and click the save selection as chanel
at the bottom. It's a square with a circle icon inside of it. Easy to miss.
You should have something like this if your channel was created correctly.
Black is transparent and white is solid.
Finally, just enable the layer.
Great, now we can save the texture.
File -> Save As -> .dds
Now, depending on if your texture has transparency you'll want to do either of the following settings.
Transparency
No Transparency
Great! Now your file is saved and you can make a new
file with the Texture Toolkit
plugin and import your file and then save it as .ytd
Now when you stream it in-game it will follow the following criteria:
Dictionary: The name of the file.
Image: The name of the texture inside of the file.
Here's some example alt:V code to use with an everyTick or 0ms interval.
export function drawTexture(dictionary: string, name: string, position: alt.Vector3, scale: number = 1) {
const identifier = `${dictionary}${name}`;
if (!textureData[identifier]) {
const [_, width, height] = native.getActiveScreenResolution(0, 0);
const resolution = native.getTextureResolution(dictionary, name);
textureData[identifier] = {
x: resolution.x / width,
y: resolution.y / height
};
}
const texture = textureData[identifier];
if (!texture) {
return;
}
const width = texture.x * scale;
const height = texture.y * scale;
const [visible, x, y] = native.getScreenCoordFromWorldCoord(position.x, position.y, position.z);
if (!visible) {
return;
}
native.setDrawOrigin(position.x, position.y, position.z, 0);
native.drawSprite(dictionary, name, 0, 0, width, height, 0, 255, 255, 255, 255, false);
native.clearDrawOrigin();
}