horr0rjkee
Участник
- Сообщения
- 5
- Реакции
- 0
Вообщем делал откидывание, при взрыве гранаты.
.
Но я не понимаю, почему тут не работает? Вроде все просто.
1) Получаем позицию игрока и гранаты.
2) Находим угол для ускорения по векторам. Используя atan2(поз.гранаты - поз.игрока).
3) К вектору велосити X прибавляем косинус полученного угла.
4) К вектору велосити Y прибавляем синус полученного угла.
Основная ошибка в том, что откидывает в неправильный угол, проблема не в atan2(проверял).
Прошу, помогите. В другой игре, все это работает!
P.S. Последние две функции (из моего инклюда вырезал, просто лень весь инклюд сюда закидывать):
IsClientInRangeOfPoint - проверяет, в радиусе ли игрок от определенной точки.
GetDistance - возвращает дистанцию между двумя точками.
PHP:
#include <sourcemod>
new VelocityOffset[3],BaseVelocityOffset;
public OnPluginStart()
{
HookEvent("hegrenade_detonate", OnBounce);
VelocityOffset[0]=FindSendPropOffs("CBasePlayer","m_vecVelocity[0]");
VelocityOffset[1]=FindSendPropOffs("CBasePlayer","m_vecVelocity[1]");
VelocityOffset[2]=FindSendPropOffs("CBasePlayer","m_vecVelocity[2]");
BaseVelocityOffset=FindSendPropOffs("CBasePlayer","m_vecBaseVelocity");
}
public OnBounce(Handle:event, const String:name[], bool:dontBroadcast)
{
new Float:finalvec[3], Float:angle, Float:gpos[3], Float:plpos[3];
gpos[0] = GetEventFloat(event, "x");
gpos[1] = GetEventFloat(event, "y");
gpos[2] = GetEventFloat(event, "z");
for(new i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i)) continue;
if(IsClientInRangeOfPoint(i, 400.0, gpos))
{
GetClientAbsOrigin(i, plpos);
angle = ArcTangent2(gpos[0]-plpos[0], gpos[1]-plpos[1]);
PrintToChat(i, "atan2(%0.1f-%0.1f, %0.1f-%0.1f): %f", gpos[0],plpos[0],gpos[1],plpos[1],RadToDeg(angle));
finalvec[0]=GetEntDataFloat(i,VelocityOffset[0]) + Cosine(angle+DegToRad(180.0))*250.0;
finalvec[1]=GetEntDataFloat(i,VelocityOffset[1]) + Sine(angle+DegToRad(180.0))*250.0;
finalvec[2]=GetEntDataFloat(i,VelocityOffset[2]) + 50.0;
SetEntDataVector(i,BaseVelocityOffset,finalvec,true);
}
}
}
stock IsClientInRangeOfPoint(client, Float:radius, Float:cpos[3]) //by horr0r
{
if(!IsClientInGame(client)) return false;
new Float:ppos[3];
GetClientAbsOrigin(client, ppos);
if(GetDistance(ppos, cpos) <= radius) return true;
return false;
}
stock Float:GetDistance(Float:pos1[3], Float:pos2[3]) //by horr0r
{
return SquareRoot( Pow(pos2[0] - pos1[0], 2.0) + Pow(pos2[1] - pos1[1], 2.0) + Pow(pos2[2]-pos1[2], 2.0) );
}
Но я не понимаю, почему тут не работает? Вроде все просто.
1) Получаем позицию игрока и гранаты.
2) Находим угол для ускорения по векторам. Используя atan2(поз.гранаты - поз.игрока).
3) К вектору велосити X прибавляем косинус полученного угла.
4) К вектору велосити Y прибавляем синус полученного угла.
Основная ошибка в том, что откидывает в неправильный угол, проблема не в atan2(проверял).
Прошу, помогите. В другой игре, все это работает!
P.S. Последние две функции (из моего инклюда вырезал, просто лень весь инклюд сюда закидывать):
IsClientInRangeOfPoint - проверяет, в радиусе ли игрок от определенной точки.
GetDistance - возвращает дистанцию между двумя точками.
Последнее редактирование: