Here is my current script.
//gives inventory to object when it rezzes.
string inventory;
string object;
list obj_list;
list obj_menu;
integer num_objects;
integer channel = 1000;
integer counter;
default
{
state_entry()
{
llListen(channel,"", "",""

;
num_objects=llGetInventoryNumber(INVENTORY_OBJECT);
}
changed(integer change)
{
if(change & CHANGED_INVENTORY)
{
llResetScript();
}
}
touch_start(integer count)
{
if(llDetectedKey(0) == llGetOwner())
{
if(num_objects != 0)
{
counter = 0;
obj_list = [];
obj_menu = [];
for (counter = 0; counter < num_objects; counter++)
{
obj_list += [(string)counter + ".) " + llGetInventoryName(INVENTORY_OBJECT,counter)];
obj_menu += [(string)counter];
}
llDialog(llDetectedKey(0), "Select VTAL to Rez by number from the following list:\n" + llDumpList2String(obj_list, ", "

+ ".",obj_menu,channel);
}
else
{
llSay(0,"This rez pad has no VTALs to rez."

;
}
}
else
{
llSay(0,llDetectedName(0) + ", you are not authorized to use this rez pad."

;
}
}
listen(integer chan, string name, key id, string mes)
{
object=llGetInventoryName(INVENTORY_OBJECT,(integer)mes);
llRezAtRoot(object, llGetPos() + <1.0, 0.75, 1.25>, ZERO_VECTOR, <0.0,0.0,1.0,2.0>, 0);
}
}
Sorry not a lot of comments, was really bad at that when I wrote it. Anyway is has an open listener on channel 1000 which on my land = 3 such listeners and one reason for wanting to restrict them. Second is proximity, I have two close together so I had to change the channel on the other so it did not rez when the other one did, this works but means I have to be mindful of this when I update the scripts. And the biggest reason is to reduce any lag I may be causing, though this may be minimal.
So my thoughts were to only have the listener listen after the pad has been touched inside the IF that checks if the person that touched it is the owner, then turn off the listener once the input is received or after a time out.