This is what I ended up with. I have a shoulderPoint/rotationPoint. Then I have a muzzleOffsetPoint. I have the angle from the shoulderPoint to the mouse as angle, because the arm and attached gun rotate around the shoulder.

double translatedMuzzleOffsetX = (muzzleOffsetX*Math.cos(angleInRad))-(muzzleOffsetY*Math.sin(angleInRad));

double translatedMuzzleOffsetY = (muzzleOffsetX*Math.sin(angleInRad))+(muzzleOffsetY*Math.cos(angleInRad));

Factoring in the size of the bullets afterwards proved a terrible curse, but I got it done.

Well, it turns out I didn't get it done. It only works with one size of bullets. When I use one that is another width and height, I get displacement errors.

My bullets always point to the right initially, and are positioned at the shoulder. Then retrieve the muzzleOffset from where they would go if the guy is pointing his gun straight to the right, and translate it using the functions in the quote above. I've tried numerous ways to go about this, and none seem to work all the way around. I've even tried to have different projectile-height and -width offsets for each quadrant, but nothing translates to more than one size of bullet.

Question: It should be possible, using the functions in the quote, to translate the projectiles correctly all the way around the character, without doing different calculations for each quadrant, right?

I would think it should be done by placing the projectile correctly according to when he's pointing the gun directly to the right, subtract half the height of the projectile from Y, and then translate the derived point using the angle. But it doesn't seem to work. Can any math-savvy person confirm this is the way to go?