It sounds like the weapon is rotated around it's center and then translated, so maybe the order of
transformations is a problem and you can try to change translate * rotate to rotate * translate.
In general, you want the weapon to have a fixed position in camera space.
Therefore the easiest way is to not transform the weapon at all.
If you transform all your objects by the same "world" matrix, however, you want to give the weapon
a local transformation that cancels this effect. that is the weapon matrix is the inverse of the world matrix.
Try using a standard Invert() method first and see if it gives the desired results.
After that you can try to replace the Invert() call with a product of translation and rotation matrices.