then it could be that x1 > x2 or z1 > z2. This in turn causes numBorder=0 and a division by zero.
Code: Select all
float CUnitHandler::GetBuildHeight(float3 pos, const UnitDef* unitdef)
{
float minh=-5000;
float maxh=5000;
int numBorder=0;
float borderh=0;
float maxDif=unitdef->maxHeightDif;
int x1 = max(0,(pos.x-(unitdef->xsize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
int x2 = min(gs->mapx,x1+unitdef->xsize);
int z1 = max(0,(pos.z-(unitdef->ysize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
int z2 = min(gs->mapy,z1+unitdef->ysize);
if (x1 > gs->mapx) x1 = gs->mapx;
if (x2 < 0) x2 = 0;
if (z1 > gs->mapy) z1 = gs->mapy;
if (z2 < 0) z2 = 0;
for(int x=x1; x<=x2; x++){
for(int z=z1; z<=z2; z++){
float orgh=readmap->orgheightmap[z*(gs->mapx+1)+x];
float h=readmap->heightmap[z*(gs->mapx+1)+x];
if(x==x1 || x==x2 || z==z1 || z==z2){
numBorder++;
borderh+=h;
}
if(minh<min(h,orgh)-maxDif)
minh=min(h,orgh)-maxDif;
if(maxh>max(h,orgh)+maxDif)
maxh=max(h,orgh)+maxDif;
}
}
float h=borderh/numBorder;
if(h<minh && minh<maxh)
h=minh+0.01;
if(h>maxh && maxh>minh)
h=maxh-0.01;
return h;
}
Code: Select all
if (x1 > gs->mapx) x1 = gs->mapx;
if (x2 < 0) x2 = 0;
if (z1 > gs->mapy) z1 = gs->mapy;
if (z2 < 0) z2 = 0;
Also this:
Code: Select all
void CGlobalAIHandler::UnitDamaged(CUnit* attacked,CUnit* attacker,float damage)
{
if(ais[attacked->team]){
float3 dir=helper->GetUnitErrorPos(attacker,attacked->allyteam)-attacked->pos;
dir.Normalize();
ais[attacked->team]->ai->UnitDamaged(attacked->id,attacker->id,damage,dir);
}
}
Code: Select all
void CGlobalAIHandler::UnitDamaged(CUnit* attacked,CUnit* attacker,float damage)
{
if(ais[attacked->team]){
float3 dir; // in case of something like fire damage, attacker is 0
if (attacker) {
dir=helper->GetUnitErrorPos(attacker,attacked->allyteam)-attacked->pos;
dir.Normalize();
}
ais[attacked->team]->ai->UnitDamaged(attacked->id,attacker->id,damage,dir);
}
}