void TraceFly(int ent, int button, float time, float duration)
{
if(time-StartTime[ent] > GetConVarFloat(l4d_flyinfected_maxtime))
{
StopFly(ent);
return;
}
float posmissile[3], velocitymissile[3];
GetClientAbsOrigin(ent, posmissile);
posmissile[2]+=30.0;
GetEntDataVector(ent, g_iVelocity, velocitymissile);
bool fake=IsFakeClient(ent);
if(!fake && (button & IN_JUMP) && !(LastButton[ent] & IN_JUMP))
{
GetClientEyeAngles(ent, velocitymissile);
GetAngleVectors(velocitymissile, velocitymissile, NULL_VECTOR, NULL_VECTOR);
velocitymissile[2]=0.0;
NormalizeVector(velocitymissile, velocitymissile);
ScaleVector(velocitymissile, 310.0);
velocitymissile[2]=150.0;
TeleportEntity(ent, NULL_VECTOR,NULL_VECTOR, velocitymissile);
StopFly(ent);
return;
}
CopyVector(ClientVelocity[ent], velocitymissile);
if(GetVectorLength(velocitymissile)<10.0)return ;
NormalizeVector(velocitymissile, velocitymissile);
int enemyteam = 2;
int enemy=Enemy[ent];
if(ScanTime[ent]+1.0<=time)
{
ScanTime[ent]=time;
if(fake)enemy=GetEnemy(posmissile, velocitymissile, enemyteam);
else
{
float lookdir[3];
GetClientEyeAngles(ent, lookdir);
GetAngleVectors(lookdir, lookdir, NULL_VECTOR, NULL_VECTOR);
NormalizeVector(lookdir, lookdir);
//ScaleVector(lookdir, 310.0);
enemy=GetEnemy(posmissile, lookdir, enemyteam);
}
//PrintToChatAll("scan %f %N", time, enemy);
}
if(enemy>0 && IsClientInGame(enemy) && IsPlayerAlive(enemy))
{
Enemy[ent]=enemy;
}
else
{
enemy=0;
Enemy[ent]=enemy;
}
float velocityenemy[3], vtrace[3], missionangle[3];
vtrace[0]=vtrace[1]=vtrace[2]=0.0;
bool visible = false;
float disenemy = 1000.0;
if(enemy>0)
{
float posenemy[3];
GetClientEyePosition(enemy, posenemy);
disenemy=GetVectorDistance(posmissile, posenemy);
visible=IfTwoPosVisible(posmissile, posenemy, ent);
//if(visible)PrintToChatAll("%N visible %f ", client, disenemy);
GetEntDataVector(enemy, g_iVelocity, velocityenemy);
ScaleVector(velocityenemy, duration);
AddVectors(posenemy, velocityenemy, posenemy);
MakeVectorFromPoints(posmissile, posenemy, vtrace);
// PrintToChatAll("%N lock %N D:%f", client,enemy, disenemy);
if(enemy>0 && IsClientInGame(enemy) && IsPlayerAlive(enemy))
{
PrintHintText(enemy, "Warning! flying tank, Distance: %d", RoundFloat(disenemy) );
EmitSoundToClient(enemy, SOUNDMISSILELOCK);
}
}
GetVectorAngles(velocitymissile, missionangle);
float vleft[3], vright[3], vup[3], vdown[3], vfront[3], vv1[3], vv2[3], vv3[3], vv4[3], vv5[3], vv6[3], vv7[3], vv8[3];
vfront[0]=vfront[1]=vfront[2]=0.0;
float factor2=0.5;
float factor1=0.2;
float t;
float base=1500.0;
if(visible)
{
base=80.0;
}
{
int flag=FilterSelfAndSurvivor;
int self=ent;
float front=CalRay(posmissile, missionangle, 0.0, 0.0, vfront, self, flag);
float down=CalRay(posmissile, missionangle, 90.0, 0.0, vdown, self, flag);
float up=CalRay(posmissile, missionangle, -90.0, 0.0, vup, self);
float left=CalRay(posmissile, missionangle, 0.0, 90.0, vleft, self, flag);
float right=CalRay(posmissile, missionangle, 0.0, -90.0, vright, self, flag);
float f1=CalRay(posmissile, missionangle, 30.0, 0.0, vv1, self, flag);
float f2=CalRay(posmissile, missionangle, 30.0, 45.0, vv2, self, flag);
float f3=CalRay(posmissile, missionangle, 0.0, 45.0, vv3, self, flag);
float f4=CalRay(posmissile, missionangle, -30.0, 45.0, vv4, self, flag);
float f5=CalRay(posmissile, missionangle, -30.0, 0.0, vv5, self, flag);
float f6=CalRay(posmissile, missionangle, -30.0, -45.0, vv6, self, flag);
float f7=CalRay(posmissile, missionangle, 0.0, -45.0, vv7, self, flag);
float f8=CalRay(posmissile, missionangle, 30.0, -45.0, vv8, self, flag);
//LogMessage("front - %f up - %f down - %f left- %f right - %f",front, up, down, left, right);
NormalizeVector(vfront,vfront);
NormalizeVector(vup,vup);
NormalizeVector(vdown,vdown);
NormalizeVector(vleft,vleft);
NormalizeVector(vright,vright);
NormalizeVector(vtrace, vtrace);
NormalizeVector(vv1,vv1);
NormalizeVector(vv2,vv2);
NormalizeVector(vv3,vv3);
NormalizeVector(vv4,vv4);
NormalizeVector(vv5,vv5);
NormalizeVector(vv6,vv6);
NormalizeVector(vv7,vv7);
NormalizeVector(vv8,vv8);
if(front>base) front=base;
if(up>base) up=base;
if(down>base) down=base;
if(left>base) left=base;
if(right>base) right=base;
if(f1>base) f1=base;
if(f2>base) f2=base;
if(f3>base) f3=base;
if(f4>base) f4=base;
if(f5>base) f5=base;
if(f6>base) f6=base;
if(f7>base) f7=base;
if(f8>base) f8=base;
float b2=10.0;
if(front<b2) front=b2;
if(up<b2) up=b2;
if(down<b2) down=b2;
if(left<b2) left=b2;
if(right<b2) right=b2;
if(f1<b2) f1=b2;
if(f2<b2) f2=b2;
if(f3<b2) f3=b2;
if(f4<b2) f4=b2;
if(f5<b2) f5=b2;
if(f6<b2) f6=b2;
if(f7<b2) f7=b2;
if(f8<b2) f8=b2;
t=-1.0*factor1*(base-front)/base;
ScaleVector( vfront, t);
t=-1.0*factor1*(base-up)/base;
ScaleVector( vup, t);
t=-1.0*factor1*(base-down)/base;
ScaleVector( vdown, t);
t=-1.0*factor1*(base-left)/base;
ScaleVector( vleft, t);
t=-1.0*factor1*(base-right)/base;
ScaleVector( vright, t);
t=-1.0*factor1*(base-f1)/f1;
ScaleVector( vv1, t);
t=-1.0*factor1*(base-f2)/f2;
ScaleVector( vv2, t);
t=-1.0*factor1*(base-f3)/f3;
ScaleVector( vv3, t);
t=-1.0*factor1*(base-f4)/f4;
ScaleVector( vv4, t);
t=-1.0*factor1*(base-f5)/f5;
ScaleVector( vv5, t);
t=-1.0*factor1*(base-f6)/f6;
ScaleVector( vv6, t);
t=-1.0*factor1*(base-f7)/f7;
ScaleVector( vv7, t);
t=-1.0*factor1*(base-f8)/f8;
ScaleVector( vv8, t);
if(disenemy>=500.0)disenemy=500.0;
t=1.0*factor2*(1000.0-disenemy)/500.0;
ScaleVector(vtrace, t);
AddVectors(vfront, vup, vfront);
AddVectors(vfront, vdown, vfront);
AddVectors(vfront, vleft, vfront);
AddVectors(vfront, vright, vfront);
AddVectors(vfront, vv1, vfront);
AddVectors(vfront, vv2, vfront);
AddVectors(vfront, vv3, vfront);
AddVectors(vfront, vv4, vfront);
AddVectors(vfront, vv5, vfront);
AddVectors(vfront, vv6, vfront);
AddVectors(vfront, vv7, vfront);
AddVectors(vfront, vv8, vfront);
AddVectors(vfront, vtrace, vfront);
NormalizeVector(vfront, vfront);
}
float a = GetAngle(vfront, velocitymissile);
float amax = 3.14159*duration*2.0;
if(a > amax )a = amax;
ScaleVector(vfront, a);
LogMessage("a - %f vfront - %f", a, vfront);
float newvelocitymissile[3];
AddVectors(velocitymissile, vfront, newvelocitymissile);
float speed=GetConVarFloat(l4d_flyinfected_speed);
if(speed<60.0)speed=60.0;
NormalizeVector(newvelocitymissile, newvelocitymissile);
ScaleVector(newvelocitymissile, speed);
TeleportEntity(ent, NULL_VECTOR, NULL_VECTOR ,newvelocitymissile);
CopyVector(newvelocitymissile, ClientVelocity[ent]);
}
int GetEnemy(float pos[3], float vec[3], int enemyteam)
{
float min=4.0;
float pos2[3];
float t;
int s=0;
for(int client = 1; client <= MaxClients; client++)
{
if(IsClientInGame(client) && GetClientTeam(client) == enemyteam && IsPlayerAlive(client))
{
GetClientEyeAngles(client, pos2);
GetClientEyePosition(client, pos2);
MakeVectorFromPoints(pos, pos2, pos2);
t = GetAngle(vec, pos2);
//LogMessage(">>>>>>>> %N %f ", client, 360.0*t/3.1415926/2.0);
//PrintToChatAll("%N %f", client, 360.0*t/3.1415926/2.0);
if(t<=min)
{
min=t;
s=client;
}
}
}
return s;
}