void rangeEvent(int rX, int rZ, int rA, int checkBehind, char type, int count){
char engineType;
switch(type){
case "en":
engineType = openborconstant("TYPE_ENEMY");
break;
case "obs":
engineType = openborconstant("TYPE_OBSTACLE");
break;
default:
return;
}
void vSelf = getlocalvar("self");
int seeingEntities = getentityvar(vSelf, "seeing_" + type);
if(seeingEntities == NULL() && findTarget01(rX, rZ, rA, checkBehind, engineType, count) != NULL()){
int lastShout = getentityvar(vSelf, "lastShout");
int elapsed_time = openborvariant("elapsed_time");
if(lastShout == NULL() || lastShout != NULL() && elapsed_time > lastShout + 1000){
//changeentityproperty(vSelf, "animation", openborconstant("ANI_freespecial1")); // Taunt animation
char name = getentityproperty(vSelf, "defaultmodel");
variableSound("data/chars/" + name + "/see_" + type, 1, 3);
setentityvar(vSelf, "lastShout", elapsed_time);
setentityvar(vSelf, "seeing_" + type, 1);
}
} else if(seeingEntities == 1 && findTarget01(rX+100, rZ, rA, checkBehind, engineType, 1) == NULL()){
setentityvar(vSelf, "seeing_" +type, NULL());
}
}
void variableSound(void path, int min, int max){
int r = rand()%((max - min) + 1);
if(r < 0) r = r * -1;
r += min;
playSound(path + r + ".wav");
}
void findTarget01(int Rx, int Rz,int Ra, int searchBack, char find_type, int count){
int iECnt = openborvariant("count_entities");
int iEnt;
void vEnt,ani;
void self = getlocalvar("self");
float x = getentityproperty(self, "x");
float z = getentityproperty(self, "z");
float a = getentityproperty(self, "a");
int dir=getentityproperty(self,"direction");
int currentCount = 0;
for(iEnt=0; iEnt<iECnt; iEnt++) {
vEnt= getentity(iEnt);
if(!getentityproperty(vEnt,"exists")) continue;
if (
getentityproperty(vEnt,"type") == openborconstant(find_type) &&
!getentityproperty(vEnt,"dead") &&
vEnt
){
if (isInRange(self,dir,vEnt,Rx,Rz,Ra,x,z,a, searchBack)){
currentCount++;
if(currentCount >= count) return vEnt;
}
}
}
return NULL();
}
int isBetweenRange(void self,int dir,void target,int rxMin, int rxMax, int rzMin, int rzMax, int raMin, int raMax, float x,float z,float a){
float Tx = getentityproperty(target, "x");
float Tz = getentityproperty(target, "z");
float Ta = getentityproperty(target, "a");
float Disx;
float Disz = Tz - z;
float Disa = Ta - a;
if (dir==0){
Disx = x - Tx;
}else{
Disx = Tx - x;
}
if(Disz < 0){
Disz = -Disz;
}
if(Disa < 0){
Disa = -Disa;
}
//log("\nTa = " + Ta + " ; Disa = " + Disa);
//log("\nTx = " + Tx + " ; Disx = " + Disx);
if(rxMax < rxMin){ // Is out of range
if( (Disx >= rxMin || Disx < rxMax) && Disz <= rzMax && Disz >= rzMin && Disa<=raMax && Disa >= raMin) return 1;
else return 0;
} else if( Disx <= rxMax && Disx > rxMin && Disz <= rzMax && Disz >= rzMin && Disa<=raMax && Disa >= raMin){
return 1;
}else{
return 0;
}
}
int isInRange(void self,int dir,void target,int Rx, int Rz,int Ra,float x,float z,float a, int searchBack){
if(searchBack) return isBetweenRange(self, dir, target, -Rx, Rx, -Rz, Rz, 0, Ra, x, z, a);
else return isBetweenRange(self, dir, target, 0, Rx, 0, Rz, 0, Ra, x, z, a);
}