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