you _really_ have to watch the objects; thats how typcasting works...
Some variable called Blarg in some object thats in the variable called weapon in some object within the variable called pawn.
Thats a lot of information within those three words. Brackets don't change anything; it just gets bigger and bigger (if you can follow along, I don't mind long typecasting statements provided its all used properly).
Basically you wrote for the variable to be a part of some object which is a _function_ of the playercontroller... That, and the following is how I would dissasemble that line:
if Other.Controller is a valid statement, there is no need to cast this AS a controller, for Controller is a var of Other, and if anything you should make sure 'Other' is a pawn, though in this case I'd assume Other is a local variable of the type pawn so Other.Pawn is a controller garenteed.
And, if this is the case, there is no need to find this controller's pawn, as this pawn who's controller you're looking into is already declared as Other...
Also, the brackets must be all encompassing. Bob.CheeseLog(Gross) would access the CheeseLog() function of Bob, with the variable Gross. However, CheeseLog(Bob.Gross) means the CheeseLog object in the variable Gross of the object Bob.
Also, you use a raw 'Pawn' variable; if it were Other.Controller.Pawn that would be the pawn in the controller of the something other, but as I think your Other looks to be a Pawn with a controller, using this pawn variable as such makes no sense, and is contradictory. This may not be accurate, but without the full function and class I have to go with the most likely situation.
Neways, this is probally what you would want in the end...
Code:
if(Pawn.Weapon != none && NSFWeaponFire(Pawn.Weapon.FireMode[0]) != none)
NSFWeaponFire(NSFWeaponFire(Pawn.Weapon.FireMode[0])).variable += variable2;
The if statement to make sure the accessed objects do not exist.