About camping, here i have a snippet of code (can't reply more, gotta go now)
Code:
// Find a node which has almost no danger!
int cNodeMachine::node_camp(Vector vOrigin, int iTeam)
{
// Use Meredians to search for nodes
int iX, iY;
VectorToMeredian(vOrigin, &iX, &iY);
float fDanger=2.0;
float fDistance=9999;
int iVisibility=9999;
int iBestNode=-1;
// Theory:
// Find a node, close, and less danger...
// and with less visibility
if (iX > -1 && iY > -1)
{
// Search in this meredian
for (int i=0; i < NODES_MEREDIANS; i++)
if (Meredians[iX][iY].iNodes[i] > -1)
{
int iNode = Meredians[iX][iY].iNodes[i];
if (Nodes[iNode].iNodeBits & BIT_WATER)
continue; // next node, do not camp under water!
if (InfoNodes[iNode].fDanger[iTeam] < fDanger)
if (func_distance(vOrigin, Nodes[iNode].origin) < fDistance)
{
// Calculate visibility
int iVis=-1;
for (int iVisNr=0; iVisNr < iNode; iVisNr++)
if (GetVisibilityFromTo(iNode,iVisNr))
iVis++;
if (iVis < 0)
iVis = 99999;
if (iVis < iVisibility)
{
iBestNode = iNode;
fDistance = func_distance(vOrigin, Nodes[iNode].origin);
fDanger = InfoNodes[iNode].fDanger[iTeam];
iVisibility = iVis;
}
}
}
}
return iBestNode;
}