Originally, the script was using llKey2Name to check if a rep was on one of the SIMS, but it was not very reliable, so I decided a normal online check would be fine, regardless of whether the rep is on the SIMS or not.
The root of the board has the main script and there are linked objects that have pictures of each rep (in the contents of the object) as well as their avatar key (in a notecard).
A person touches the board and a standard message is sent to all online reps.
This is the script for each linked object (one per representative). I am struggling where to do the llRequestAgentData(welcomer_key, DATA_ONLINE without additional dataserver calls (state available, state not_available). Where I get lost is that once the initial state is determined, I need to check to make sure the reps online status has not changed before each call is sent.
I apologize for the mess. Any help would be greatly appreciated.
CODE
integer channel;
string welcomer_name;
key welcomer_key;
key queryID;
float time_gap = 60;
vector def_tex_repeats = <1.0, 1.0, 0.0>;
vector def_tex_ofsets = <0.0, 0.0, 0.0>;
key def_texture;
list portrait_params;
set_welcomer_portrait() {
string portrait = llGetInventoryName(INVENTORY_TEXTURE, 0);
if(llGetInventoryNumber(INVENTORY_TEXTURE) == 0) {
llSetPrimitiveParams([
PRIM_TEXTURE,
0,
def_texture,
def_tex_repeats,
def_tex_ofsets,
0.0
]);
} else {
portrait_params = llGetPrimitiveParams([PRIM_TEXTURE,0]);
llSetPrimitiveParams([
PRIM_TEXTURE,
0,
portrait,
llList2Vector(portrait_params,1),
llList2Vector(portrait_params,2),
llList2Float(portrait_params,3)
]);
}
}
integer set_welcomer_name() {
if(llGetInventoryNumber(INVENTORY_NOTECARD)>0) {
welcomer_name = llGetInventoryName(INVENTORY_NOTECARD,0);
llSetObjectName("WELCOME MESSENGER of " + welcomer_name);
if(llGetSubString(llGetObjectDesc(), 0, 0) != "<") {
llSetObjectDesc((string)def_tex_repeats + (string)def_tex_ofsets);
}
set_welcomer_portrait();
return TRUE;
} else {
llSetObjectName("Welcomer");
llSetObjectDesc("Messenger v1");
set_welcomer_portrait();
return FALSE;
}
}
default {
on_rez(integer start_param) {
llResetScript();
}
state_entry() {
llSetText( "Initilizing...", <1, 1, 1>, 1 );
llSetPrimitiveParams([
PRIM_FULLBRIGHT, 0, TRUE,
PRIM_COLOR, ALL_SIDES, <1, 1, 1>, 1.0
]);
llMessageLinked(LINK_ROOT, 0, "channel", "");
}
link_message (integer sender_num, integer num, string message, key def_tex) {
def_texture = def_tex;
if (sender_num == LINK_ROOT) {
channel = num + (integer)message;
}
if(set_welcomer_name()) {
queryID = llGetNotecardLine(welcomer_name, 0);
} else {
state empty;
}
}
dataserver(key query_id, string data) {
if (query_id == queryID) {
welcomer_key = (key)data;
if (llRequestAgentData(welcomer_key, DATA_ONLINE)) {
state available;
} else {
state not_available;
}
}
}
state_exit() {
llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE] );
}
}
state empty {
on_rez(integer start_param) {
llResetScript();
}
state_entry() {
llSetText( "", <1, 1, 1>, 1 );
llSetPrimitiveParams([
PRIM_FULLBRIGHT, ALL_SIDES, FALSE,
PRIM_COLOR, ALL_SIDES, <1.0, 1.0, 1.0>, 1.0
]);
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
state default;
}
}
link_message(integer sender_num, integer num, string str, key id) {
if(sender_num==LINK_ROOT && str=="Reset all") {
state default;
}
}
}
state available {
on_rez(integer start_param) {
llResetScript();
}
state_entry() {
llSetTimerEvent( time_gap );
llSetPrimitiveParams([PRIM_FULLBRIGHT, 0, TRUE]);
}
timer() {
//[check here to see if the avatar went offline]
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
state not_available;
}
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
state default;
}
}
link_message(integer sender_num, integer num, string str, key id) {
if(sender_num==LINK_ROOT && str=="Reset all") {
state default;
} else if(sender_num==LINK_ROOT && num==1) {
llInstantMessage ( welcomer_key, "\n>>>>>>>> " + str + "<<<<<<<<\n" );
}
}
state_exit() {
llSetTimerEvent( 0 );
}
}
state not_available {
on_rez(integer start_param) {
llResetScript();
}
state_entry() {
llSetTimerEvent( time_gap );
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
}
timer() {
//[check here to see if the avatar came online]
llSetPrimitiveParams([PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
state available;
}
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
state default;
}
}
link_message(integer sender_num, integer num, string str, key id) {
if(sender_num==LINK_ROOT && str=="Reset all") {
state default;
}
}
state_exit() {
llSetTimerEvent( 0 );
}
}CODE
Instead, here's something a little more simplistic. It does, however, have its logic being controlled via the dataserver Event (which is mainly what I was trying to demonstrate). 