I'm starting to understand more and more about this. Thanks you so much for that code!
I'm going through it atm and changing my code to work the same way.
One thing I'm not sure about:

function ProjectileLocal(strCommand, playerId, teamId)
{
if ( playerId == player_id || playerId == MP_ALL_PLAYERS)
{
DecodeString(strCommand);
}
}

Does passing MP_ALL_PLAYERS to MP_SendChatMessage include the player that is executing the command? Because that would mean that the projectile is created on the sending machine twice. And if it's not the case, then why the line "PlayerId == player_id" ? Because that will never be true. And if it is the case, then you DON'T want the if statement to be true, because otherwise it will go on creating the projectile using the decoded message, even though it already created it on the machine before sending the message, and you end up having the projectile twice on one machine??

Micha


~"I never let school interfere with my education"~
-Mark Twain