That's actually what I ended up doing. One script in the object I want to sit on that will transmit its UUID on a channel when I sit, and another script I added to my collar that listens to that same channel and only changes my head when it receives the specific UUID.
If you or anyone else is curious (or is looking for something similar), that's the script to add to your furniture:
integer dialog_channel;
key user_id;
default {
changed(integer change) {
if (change & CHANGED_LINK) {
user_id = llAvatarOnSitTarget();
if (user_id != NULL_KEY) {
dialog_channel = (integer)("0x"+llGetSubString((string)user_id,-8,-1)) ^ 0xAAAAAAAB;
llSay(dialog_channel, (string)llGetKey());
}
}
}
}
And that's the one to be added to an object you're wearing:
integer listen_handle;
integer dialog_channel;
key user_id;
integer m4_channel = -13042018;
key furniture_key = "your furniture UUID goes here";
default {
state_entry() {
user_id = llGetOwner();
dialog_channel = (integer)("0x"+llGetSubString((string)user_id,-8,-1)) ^ 0xAAAAAAAB;
listen_handle = llListen(dialog_channel, "", NULL_KEY, "");
}
listen(integer channel, string name, key id, string message) {
if (message == furniture_key) {
llRegionSayTo(llGetOwner(), m4_channel, "M4int:LidL:1:LidR:1:Blush:3:Mouth:6:RollL:5:RollR:5");
}
}
on_rez(integer start_param) {
llResetScript();
}
}
This works fine this way.