As you're using VCE, dont bother with Print Loops. Although they work well enough, I dont trust them.. Instead use the following:
OnActivate > Self > VCE_StateFunction > [<var:client:BL_ID>] [ ]
OnActivate > Self > VCE_CallFunction > [<var:client:BL_ID>] [ ]
OnVariableFunction > Self > VCE_CallFunction > [<var:client:BL_ID>] [ ]
OnVariableFunction > Client > VCE_ModVariable > [hunger] [-] [1]
OnVariableFunction > Client > CenterPrint > [<color:ffff00>Your hunger dropped! You are now <var:cl:hunger>/6 full!]
As long as you only have one function on the brick, it will work for unlimited players, because each player has his/her own function named as their BL_ID. The only problem with this is if two or more people with the same ID join..
Also, the reason why relays can't be used for this isn't because they can only hold one ID, or whatever. But its because relays 'Overwrite' each other. Basicly, if a relay is going to be fired in 3 seconds, but someone fires a relay onto the brick, then the current relay being fired will be canceled, and started from the other person. If you're clever enough you can use this to make temporary pauses for relay loops. Just make a relay that fires quicker than the one you wish to delay, to target the relay loop. Although it is easier just to cancelEvents, then fire a relay once its done, that can cause other events to mess up on the brick. Therefore this method is quiet useful. Think as it of a way to cancel the relays on a brick without damaging anything else.