Well that's unfortunate. Here's a (very slightly modified) version that you can use as a client, too. It works the same exact way the default one does.
function New_QueueSO(%size) {
if(%size <= 1 || %size > 10000) {
error("ERROR: New_QueueSO() - invalid size \'" @ %size @ "\'");
return;
}
%ret = new ScriptObject() {
class = "QueueSO";
size = %size;
head = 0;
tail = 0;
};
if(isObject(MissionCleanup))
MissionCleanup.add(%ret);
for(%i = 0; %i < %size; %i++) {
%ret.val[%i] = 0;
}
return %ret;
}
function QueueSO::push(%obj, %val) {
%obj.val[%obj.head] = %val;
%obj.head = (%obj.head+1) % %obj.size;
%obj.val[%obj.head] = 0;
if(%obj.head == %obj.tail)
%obj.tail = (%obj.tail + 1) % %obj.size;
}
function QueueSO::pop(%obj) {
if(%obj.head != %obj.tail) {
%obj.head--;
if(%obj.head < 0)
%obj.head = %obj.size - 1;
%ret = %obj.val[%obj.head];
%obj.val[%obj.head] = 0;
}
return %ret;
}
function QueueSO::dumpVals(%obj) {
for(%i = 0; %i < %obj.size; %i++) {
%line = %i @ ": " @ %obj.val[%i];
if(%obj.head == %i)
%line = %line @ " <Head";
if(%obj.tail == %i)
%line = %line @ " <Tail";
echo(%line);
}
}