| 
				
				Отталкивание от точки
				 |   |  
| 
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  | 
 
|   | 
 |    |     
		
		
 
 |