//Supports 3 slots.
objectiveList_init()
{
//Prefix all objectiveList-related variables with ol_
level.ol_objectiveList = [];
level.ol_relative_position = [];
level.ol_max_objectives = 16; // maximum amount of objectives supported by cod
level.ol_redraw_speed = 1;
thread drawAllObjectives();
}
//Adds an objective to "the objective list"
addObjectiveToList(pos, visible_to, icon)
{
if(level.ol_objectiveList.size == level.ol_max_objectives)
{
if(isDefined(self) && isPlayer(self))
self iprintln("^1WARNING:^7 ##-- Objective list is full --##");
return -1;
}
idx = level.ol_objectiveList.size;
relative_idx = findEmptyRelativePosition();
level.ol_objectiveList[idx] = makeNewEntry(pos, visible_to, icon);
level.ol_relative_position[relative_idx] = idx;
return relative_idx;
}
//Remove a position
removeFromobjectiveList(relative_idx)
{
if(relative_idx == -1)
return;
//Check if the position we found is the very last element
last = level.ol_objectiveList.size - 1;
//If the idx is not the last one, copy the last one to pos idx, which replaces idx with a new valid entry
actual_idx = level.ol_relative_position[relative_idx];
if(actual_idx != last)
{
//relative position of the last el
relative_pos_last = findRelativePosition(last);
level.ol_relative_position[relative_pos_last] = idx;
level.ol_objectiveList[idx] = level.ol_objectiveList[last];
}
level.ol_relative_position[relative_idx] = -1;
//We can undefine the last entry because we either copied it somewhere else, or it's the value we want to remove
level.ol_objectiveList[last] = undefined;
}
drawAllObjectives()
{
oldels = -1;
while(1)
{
for(i=-1;i<oldels;oldels--)
Objective_Delete(oldels);
for(i=0;i<level.ol_objectiveList.size;i++)
{
oldels++;
pos = getEntryPos(level.ol_objectiveList[i]);
visible_to = getEntryTeam(level.ol_objectiveList[i]);
icon = getEntryIcon(level.ol_objectiveList[i]);
objective_add(i, "current", pos, icon);
objective_icon(i, icon);
//If empty string, visible to everyone
if(visible_to != "")
objective_team(i, visible_to);
}
wait level.ol_redraw_speed;
}
}
removeAllObjectivesFromCompass()
{
level.ol_objectiveList = [];
}
//Make a new entry containing the position to be displayed on compass, the team this entry is visible to and the icon that should be displayed
makeNewEntry(pos, visible_to, icon)
{
entry = [];
entry[0] = pos;
entry[1] = visible_to;
entry[2] = icon;
return entry;
}
//Returns the position stored in an entry
getEntryPos(entry)
{
return entry[0];
}
//Returns the team an entry should be visible to
getEntryTeam(entry)
{
return entry[1];
}
//Returns the icon that should be displayed on the compass
getEntryIcon(entry)
{
return entry[2];
}
findRelativePosition(actual_idx)
{
for(i=0;i<level.ol_relative_position.size;i++)
if(actual_idx == level.ol_relative_position[i])
return i;
return -1;
}
findEmptyRelativePosition()
{
for(i=0;i<level.ol_max_objectives;i++)
if(!isDefined(level.ol_relative_position[i]))
return i;
else if(level.ol_relative_position[i] == -1)
return i;
}