Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Отталкивание от точки
BarD Дата: Среда, 04.06.2014, 14:19:12 | Сообщение # 1
Сообщений: 943
Репутация: 137 [ +/- ]
Всем привет! Перейдем к делу:

У меня есть точка Float:pos[3]. Нужно от нее оттолкнуть всех в радиусе 300 единиц.

Код
for (new i = 1; i<=MaxClients;i++)
{
     if (IsClientInGame(i) && IsPlayerAlive(i) && IsClientInRangeOfPoint(i, 300.0, pos))//Если игрок в игре, жив и в радиусе 300 ед.
     {
        //Тут код отталкивания от точки pos.
      }
}

stock Float:GetDistance(Float:pos1[3], Float:pos2[3]) //получает дистанцию между двух точек. (В 3д пространстве).      
{    
new Float:res;
     res = SquareRoot( Pow(pos2[0] - pos1[0], 2.0) + Pow(pos2[1] - pos1[1], 2.0) );          
     new Float:high;
     if (pos1[2] < pos2[2])
     {
      high = pos2[2] - pos1[2];
     }     
     else
     {
       high = pos1[2] - pos2[2];
     }
     new Float:end;
     end = SquareRoot( Pow(high, 2.0) + Pow(res , 2.0) );
     return end;
}

stock IsClientInRangeOfPoint(client, Float:radius, Float:cpos[3]) //проверяет предыдущей функцией, в радиусе ли игрок от определенной точки.   
{   
        new Float:ppos[3];   
        GetClientAbsOrigin(client, ppos);   
        if(GetDistance(ppos, cpos) <= radius) return true;   
        return false;   
}


Кто знает, как это можно сделать, помогите, пожалуйста!)

Нашел функцию толкания вперед, как ее прикрутить к точке?

Код
Push(client)
{
decl Float:EyeAngles[3];
GetClientEyeAngles(client, EyeAngles);

decl Float:Push[3];
Push[0] = (FloatMul(50.0, Cosine(DegToRad(EyeAngles[1]))));
Push[1] = (FloatMul(50.0, Sine(DegToRad(EyeAngles[1]))));
Push[2] = (FloatMul(50.0, Sine(DegToRad(EyeAngles[0]))));
ScaleVector(Push, 20.0);

TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, Push);
}


Сообщение отредактировал BarD - Среда, 04.06.2014, 14:19:39
 
«SeReGa»☆ Дата: Среда, 04.06.2014, 17:03:19 | Сообщение # 2
Сообщений: 395
Репутация: 37 [ +/- ]
Видел подобное в плагине EntControlMenu
 
BarD Дата: Среда, 04.06.2014, 17:31:57 | Сообщение # 3
Сообщений: 943
Репутация: 137 [ +/- ]
Мне нужно, чтоб именно от точки отталкивало. Отталкивание есть, надо только создать вектор из 2 точек и по нему толкнуть. Я не знаю, как работать с векторами, даже не представляю. Если кто-то может научить, напишите здесь в лс свой скайп. Если у вас есть время. Много вопросов не задаю! Помогите, пожалуйста.
 
хвостег Дата: Среда, 04.06.2014, 18:31:56 | Сообщение # 4
Сообщений: 161
Репутация: 53 [ +/- ]
я вот так сделал
Код
#include <sdktools>

new Float:S_Center[3];
new bool:Start = false;

public OnPluginStart()
{
  RegConsoleCmd("point", Command_SetPoint);
  RegConsoleCmd("push", Command_Push_Entity);
}

public Action:Command_SetPoint(client, args)
{
  GetClientAbsOrigin(client, S_Center);
  PrintToChatAll("Set Point");
}

public Action:Command_Push_Entity(client, args)
{
  Start = !Start;
  PrintToChatAll("Push %s", Start ? "Activate" : "Deactivate");
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
  if(Start) { Push(300.0, 3); }
}

stock Push(Float:Radius, Power)
{
  new Float:EntPos[3];
  for(new i = 1; i<=MaxClients;i++)
  {
   GetClientAbsOrigin(i, EntPos);
    
   if(IsClientInGame(i) && IsPlayerAlive(i) && (GetVectorDistance(S_Center, EntPos) <= Radius))
   {
    new Float:NewVel[3];
     
    NewVel[0] = (EntPos[0] - S_Center[0]) * Power;
    NewVel[1] = (EntPos[1] - S_Center[1]) * Power;
    NewVel[2] = (EntPos[2] - S_Center[2]) * Power;
     
    TeleportEntity(i, NULL_VECTOR, NULL_VECTOR, NewVel);
   }
  }
}

Добавлено (04.06.2014, 18:31:56)
---------------------------------------------
конечно, можно добавить нормализацию векторов, но мне лень и так вполне сносно работает!

 
BarD Дата: Среда, 04.06.2014, 18:35:23 | Сообщение # 5
Сообщений: 943
Репутация: 137 [ +/- ]
Спасибо, завтра попробую! Как обычно, + к репе!
 
хвостег Дата: Четверг, 05.06.2014, 11:38:04 | Сообщение # 6
Сообщений: 161
Репутация: 53 [ +/- ]
небольшое изменение.
Код
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
  if(Start) { Push(300.0, 1000.0); }
}

stock Push(Float:Radius, Float:Power)
{
  new Float:EntPos[3];
  for(new i = 1; i<=MaxClients;i++)
  {
   if(IsClientInGame(i) && IsPlayerAlive(i))
   {
    GetClientAbsOrigin(i, EntPos);
     
    if((GetVectorDistance(S_Center, EntPos) <= Radius))
    {
     new Float:NewVel[3];
      
     MakeVectorFromPoints(S_Center, EntPos, NewVel);
     NormalizeVector(NewVel, NewVel);
     ScaleVector(NewVel, Power);
      
     TeleportEntity(i, NULL_VECTOR, NULL_VECTOR, NewVel);
    }
   }
  }
}
 
BarD Дата: Четверг, 05.06.2014, 11:42:00 | Сообщение # 7
Сообщений: 943
Репутация: 137 [ +/- ]
Спасибо огромное, все работает! Что бы я без тебя делал)


Сообщение отредактировал BarD - Четверг, 05.06.2014, 11:52:51
 
хвостег Дата: Четверг, 05.06.2014, 12:35:42 | Сообщение # 8
Сообщений: 161
Репутация: 53 [ +/- ]
И еще кое что, для тех кто не знает как работает Нормализация вектора

Код

stock Float:Normalize(const Float:Orig_Vec[3], Float:Out_Vec[3])
{
  new Float:Len = SquareRoot(Pow(Orig_Vec[0], 2.0) + Pow(Orig_Vec[1], 2.0) + Pow(Orig_Vec[2], 2.0)); // длина вектора
   
  // получаем нормированный вектор
  Out_Vec[0] = Orig_Vec[0] * (1/Len); // умножаем на инверсию длины
  Out_Vec[1] = Orig_Vec[1] * (1/Len); //
  Out_Vec[2] = Orig_Vec[2] * (1/Len); //
   
  return Len; // возвращаем длину вектора
}


этот код делает то же самое что и NormalizeVector(NewVel, NewVel);


Сообщение отредактировал хвостег - Четверг, 05.06.2014, 13:01:09
 
  • Страница 1 из 1
  • 1
Поиск: