But this way you still need the formula to find the right position on the texture. In the examples from the Blitz CD (no idea if they come with the download version as well) is something named paintmesh or something similar. You could use it to calculate the position of the hole on the texture.
But IMHO this is all a big trouble, compared to the sprite method. Don't forget, if multiple meshes are using this Texture, they may have that bullethole too, automaticly.
Blitz optimizes the Loading of Textures, so when you load a texture muliple times, it will use an instance of the first on instead. You really need to create new textures in this case, using CreateTexture and CopyRect from the original one... Big troubles IMHO.
If I was you, I would write that sprite thing as a seperate test, using a sphere and a sprite. If this once works, you know how to deal with it.
THere is an other thing you may need to consider: You "man" mesh: is this mesh animated? Did you load it with LoadAnimMesh? Well, then you need to handle the children, and not the top handle. Because LoadAnimMesh is using a Dummy Pivot at the top level of the Model, and it's children are Meshes or bones.
The easiest way to prevent such troubles would be to attach the Sprite not to "man", but to the handle that was returned by the pick command you used (I guess Linepick or CamerPick)
picknick=CameraPick(mousex(),mousey())
if picknick<>0
positionentity spri,pickedx(),pickedy(),pickedz(),1
alignToVector spri,pickednx(),pickedny(),pickednz(),1
turnentity spri,0,180,0
moveentity spri,0,0,.05
parententity spri,picknick
endif