I totally forgot that adding locators through code on-the-fly is TOTALLY possible. Maximues wrote the WriteLocatorGlobal function for that:<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->void WriteLocatorGlobal(string locationID, string locatorGroup, string locatorName, string locatorText, int charIndex, float posX, float posY, float posZ, bool bTempLocator)
{
if (FindLocation(locationID) < 0) return; // KK
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).tmpLocator = bTempLocator;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).corpseIdx = charIndex;
if(sti(charIndex)<0) { wholeWorld.(locationID).locators.(locatorGroup).(locatorName).corpseIdx = -1; }
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).text = locatorText;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).x = posX;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).y = posY;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).z = posZ;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.z = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.z = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.z = 0.0;
wholeWorld.(locationID).locators_radius.(locatorGroup).(locatorName) = 2.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).radius = 1.5;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).corpseIdx = charIndex;
if(sti(charIndex)<0) { locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).corpseIdx = -1; }
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).tmpLocator = bTempLocator;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).text = locatorText;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).x = posX;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).y = posY;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).z = posZ;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.z = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.z = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.z = 0.0;
locations[FindLocation(locationID)].locators_radius.(locatorGroup).(locatorName) = 2.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).radius = 1.5;
}<!--c2--></div><!--ec2-->
See here it's use for adding camp fires to QC port and Guadeloupe:<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->void AddNewLocators()
{
WriteLocatorGlobal("QC_port", "camp_fire", "campfire", "", -1, 1.6411, 2.2977, -5.4587, false);
Locations[FindLocation("QC_port")].models.night.lights.camp_fire = "heater";
Locations[FindLocation("QC_port")].locators_radius.camp_fire = 3.0;
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire1", "", -1, 20.4638252, 4.1738091, -3.6956100, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire2", "", -1, 20.4540234, 4.2214670, 9.8807011, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire3", "", -1, 24.2642326, 6.3004465, 9.8717833, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire4", "", -1, 24.2460709, 6.3005228, 5.9918156, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire5", "", -1, 24.2430992, 6.3004966, 0.2543197, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire6", "", -1, 24.2746677, 6.3004422, -3.5939960, false);
Locations[FindLocation("Guadeloupe_Port")].models.night.lights.camp_fire = "heater";
Locations[FindLocation("Guadeloupe_Port")].locators_radius.camp_fire = 4.0;
}<!--c2--></div><!--ec2-->
And, more relevant, it's of course also used for corpse looting!<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->WriteLocatorGlobal(chr.location, "box", newLocName, TranslateString("","body_of_"+chr.sex)+" "+GetMySimpleName(chr), sti(chr.index), stf(chr.deathx), stf(chr.deathy), stf(chr.deathz), true);<!--c2--></div><!--ec2-->
I hand't realized it before, but that provides us with a wealth of new options! <img src="style_emoticons/<#EMO_DIR#>/w00t.gif" style="vertical-align:middle" emoid="
" border="0" alt="w00t.gif" />
On a less postive note, Jack Rackham is reporting adding buildings through random item locators doesn't always solve the lighting problem.
Hopefully at some point we will be able to figure out when the lighting does/doesn't work right.
{
if (FindLocation(locationID) < 0) return; // KK
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).tmpLocator = bTempLocator;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).corpseIdx = charIndex;
if(sti(charIndex)<0) { wholeWorld.(locationID).locators.(locatorGroup).(locatorName).corpseIdx = -1; }
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).text = locatorText;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).x = posX;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).y = posY;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).z = posZ;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vx.z = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vy.z = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.x = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.y = 0.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).vz.z = 0.0;
wholeWorld.(locationID).locators_radius.(locatorGroup).(locatorName) = 2.0;
wholeWorld.(locationID).locators.(locatorGroup).(locatorName).radius = 1.5;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).corpseIdx = charIndex;
if(sti(charIndex)<0) { locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).corpseIdx = -1; }
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).tmpLocator = bTempLocator;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).text = locatorText;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).x = posX;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).y = posY;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).z = posZ;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vx.z = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vy.z = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.x = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.y = 0.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).vz.z = 0.0;
locations[FindLocation(locationID)].locators_radius.(locatorGroup).(locatorName) = 2.0;
locations[FindLocation(locationID)].locators.(locatorGroup).(locatorName).radius = 1.5;
}<!--c2--></div><!--ec2-->
See here it's use for adding camp fires to QC port and Guadeloupe:<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->void AddNewLocators()
{
WriteLocatorGlobal("QC_port", "camp_fire", "campfire", "", -1, 1.6411, 2.2977, -5.4587, false);
Locations[FindLocation("QC_port")].models.night.lights.camp_fire = "heater";
Locations[FindLocation("QC_port")].locators_radius.camp_fire = 3.0;
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire1", "", -1, 20.4638252, 4.1738091, -3.6956100, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire2", "", -1, 20.4540234, 4.2214670, 9.8807011, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire3", "", -1, 24.2642326, 6.3004465, 9.8717833, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire4", "", -1, 24.2460709, 6.3005228, 5.9918156, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire5", "", -1, 24.2430992, 6.3004966, 0.2543197, false);
WriteLocatorGlobal("Guadeloupe_Port", "camp_fire", "campfire6", "", -1, 24.2746677, 6.3004422, -3.5939960, false);
Locations[FindLocation("Guadeloupe_Port")].models.night.lights.camp_fire = "heater";
Locations[FindLocation("Guadeloupe_Port")].locators_radius.camp_fire = 4.0;
}<!--c2--></div><!--ec2-->
And, more relevant, it's of course also used for corpse looting!<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->WriteLocatorGlobal(chr.location, "box", newLocName, TranslateString("","body_of_"+chr.sex)+" "+GetMySimpleName(chr), sti(chr.index), stf(chr.deathx), stf(chr.deathy), stf(chr.deathz), true);<!--c2--></div><!--ec2-->
I hand't realized it before, but that provides us with a wealth of new options! <img src="style_emoticons/<#EMO_DIR#>/w00t.gif" style="vertical-align:middle" emoid="

On a less postive note, Jack Rackham is reporting adding buildings through random item locators doesn't always solve the lighting problem.
Hopefully at some point we will be able to figure out when the lighting does/doesn't work right.