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 a = GetAngle(vfront, velocitymissile);
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.228802 vfront - 0.199747
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.212599 vfront - -0.174038
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.211161 vfront - 0.183851
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - 0.210562 vfront - -0.172467
L 03/04/2019 - 21:16:32: [l4d_fly_infected.smx] a - NaN vfront - NaN
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;
}
float a = GetAngle(vfront, velocitymissile);
if(a != a)
{
LogMessage("'a' is NaN!");
return;
}
float amax = 3.14159*duration*2.0;
if(a > amax ) a = amax;
ScaleVector(vfront, a);
LogMessage("a - %f vfront - %f", a, vfront);
Пришлось читать википедию С++ NaN.судя по тому что тебе предложили на АМ, ты разве что можешь делать проверку на NaN: сравнивай a c a и если будет не равно, то у тебя NaN.
Как-то так
PHP:float a = GetAngle(vfront, velocitymissile); if(a != a) { LogMessage("'a' is NaN!"); return; } float amax = 3.14159*duration*2.0; if(a > amax ) a = amax; ScaleVector(vfront, a); LogMessage("a - %f vfront - %f", a, vfront);
float a = GetAngle(vfront, velocitymissile);
float amax = 3.14159*duration*2.0;
if(a > amax || a < amax || a == amax || a != amax || a * amax || a + amax || a - amax) a = amax;
L 03/05/2019 - 23:10:58: [SM] Call stack trace:
L 03/05/2019 - 23:10:58: [SM] [0] GetEntProp
L 03/05/2019 - 23:10:58: [SM] [1] Line 341, C:\Users\Алексей\Desktop\sourcemod-1.9.0-git6275-windows\scripting\l4d_fly_infected.sp::IsInfected
L 03/05/2019 - 23:10:58: [SM] [2] Line 99, C:\Users\Алексей\Desktop\sourcemod-1.9.0-git6275-windows\scripting\l4d_fly_infected.sp::entity_visible
L 03/05/2019 - 23:10:58: [SM] Exception reported: Entity 5 (5) is invalid
.
public void entity_visible(Event event, const char [] name, bool dontBroadcast)
{
int client = GetClientOfUserId(event.GetInt("userid"));
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK))
{
for(int i = 1; i < MaxClients; i++)
{
/*99*/ switch(i != client && IsClientInGame(i) && GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK) && GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
{
case 0: PrintToChatAll("false"), hasVisibleThreats = false;
case 1: PrintToChatAll("true"), hasVisibleThreats = true;
}
}
}
}
int IsInfected(int client, int type)
{
341 int class = GetEntProp(client, Prop_Send, "m_zombieClass");
if(type==class)return true;
else return false;
}
Да экспериментировал с этим оператором :D. он мне больше нравится чем if/else if =). На счет ошибки, возможно ложную проверку сделать?@alexmy, в том, что если игрок не в игре, то выполняются действия, которые следуют за оператором ИЛИ (||). И кто вообще додумался в такой манере использовать оператор switch?! Это как-то даже не правильно с моральной точки зрения
Хотя уже всё, разобрался!@alexmy, в том, что если игрок не в игре, то выполняются действия, которые следуют за оператором ИЛИ (||). И кто вообще додумался в такой манере использовать оператор switch?! Это как-то даже не правильно с моральной точки зрения
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK))
if(IsPlayerAlive(client) && GetClientTeam(client) == 2 && IsInfected(client, ZOMBIECLASS_TANK))
Потому что 2 - выжившие, а 3 - инфицированные.Так пробовал, вообще мертво всё.
PHP:if(IsPlayerAlive(client) && GetClientTeam(client) == 2 && IsInfected(client, ZOMBIECLASS_TANK))
if(IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
public void entity_visible(Event event, const char [] name, bool dontBroadcast)
{
int client = GetClientOfUserId(event.GetInt("userid"));
if(client && IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
for(int i = 1; i <= MaxClients; i++)
if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
{
if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
PrintToChatAll("true"), hasVisibleThreats = true;
else PrintToChatAll("false"), hasVisibleThreats = false;
}
}
int IsInfected(int client, int type)
{
return GetClientTeam(client) == 3 && type == GetEntProp(client, Prop_Send, "m_zombieClass");
}
Привет. да тоже самое что и у меня вроде выходит:@Oligarx1488, скорей всего, что нет: у меня обычная версия переделана была под КСГО, а для этого плагина нужна версия для зомбимода (квары и нативы отличаются, скорей всего)
--- Добавлено позже ---
@alexmy, попробуй вот так:--- Добавлено позже ---PHP:public void entity_visible(Event event, const char [] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(client && IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK))) for(int i = 1; i <= MaxClients; i++) if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK))) { if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats")) PrintToChatAll("true"), hasVisibleThreats = true; else PrintToChatAll("false"), hasVisibleThreats = false; } } int IsInfected(int client, int type) { return GetClientTeam(client) == 3 && type == GetEntProp(client, Prop_Send, "m_zombieClass"); }
Вот только я не понимаю для чего тебе такой спам: у тебя цикл пройдётся по всем игрокам и для каждого определит значение m_hasVisibleThreats, по завершению цикла у тебя в чате будет столько сообщений "true/false", сколько игроков в каждой из команд и переменная hasVisibleThreats будет иметь такое значение, какое значение имело m_hasVisibleThreats у последнего валидного игрока из цикла
public Action entity_visible(Event event, const char [] name, bool dontBroadcast)
{
int client = GetClientOfUserId(event.GetInt("userid"));
if(IsPlayerAlive(client) && (GetClientTeam(client) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
{
for(int i = 1; i < MaxClients; i++)
{
if(i != client && IsValidEntity(i) && IsValidEdict(i) && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(client, ZOMBIECLASS_TANK)))
{
int lost = GetEntProp(i, Prop_Send, "m_hasVisibleThreats");
if(lost == 0) PrintToChatAll("false"), hasVisibleThreats = false;
else if(lost == 1) PrintToChatAll("true"), hasVisibleThreats = true;
break;
}
}
}
}
if(GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 0 && !hasVisibleThreats)
{
hasVisibleThreats = true;
StopFly(ent);
PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Потерял выживших");
for(int i = 1; i < MaxClients; i++)
{
if (i != ent && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
{
float pos[3];
GetClientAbsOrigin(i, pos);
TeleportEntity(ent, pos, NULL_VECTOR,NULL_VECTOR);
break;
}
}
PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Был телепортирован к выжившим");
}
int lost = GetEntProp(i, Prop_Send, "m_hasVisibleThreats");
if(lost == 0) PrintToChatAll("false"), hasVisibleThreats = false;
else if(lost == 1) PrintToChatAll("true"), hasVisibleThreats = true;
if(!GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
PrintToChatAll("false"), hasVisibleThreats = false;
else PrintToChatAll("true"), hasVisibleThreats = true;
А как ты событие таймером отловишь?Для сервера как лучше обновлять код таймером повторяющим или событием вот как сейчас?
Я имел виду, есть на него события когда он появляется на карте, вот передавать по таймеру его данные, да пробовал не вариант. Нужно тогда отдельное событие для выживших.А как ты событие таймером отловишь?
Блокирует эту часть кода:Кстати что означает у тебя булева переменная hasVisibleThreats?
if(GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 0 && !hasVisibleThreats)
{
hasVisibleThreats = true;
StopFly(ent);
PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Потерял выживших");
for(int i = 1; i < MaxClients; i++)
{
if (i != ent && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
{
float pos[3];
GetClientAbsOrigin(i, pos);
TeleportEntity(ent, pos, NULL_VECTOR,NULL_VECTOR);
break;
}
}
PrintToChatAll("\x03[\x04FLY TANK\x03] \x05Был телепортирован к выжившим");
}
for(int i = 1; i <= MaxClients; i++)
if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
{
if(GetEntProp(i, Prop_Send, "m_hasVisibleThreats"))
PrintToChatAll("true"), hasVisibleThreats = true;
else PrintToChatAll("false"), hasVisibleThreats = false;
}
if(i != client && IsClientInGame(i) && (GetClientTeam(i) == 2 || IsInfected(i, ZOMBIECLASS_TANK)))
GetEntProp(ent, Prop_Send, "m_hasVisibleThreats") == 1