Don't let each client do it. Route everything through the channel's host. Instead of simply calling an RFC like tno.Send("SetMaterial", Target.All, ...), do a request instead: tno.Send("RequestSetMaterial", Target.Host, ...). Inside this RequestSetMaterial, which is guaranteed to be executed only on one client, check -- is the material already taken by someone else? If so, send some RFC that says "choice invalid". Otherwise proceed to tno.Send("SetMaterial", Target.All, ...).