Работа с координатами (x, y, z)
| |
_wS_
|
Дата: Пятница, 16.03.2012, 15:06:18 | Сообщение # 1 |
|
Как можно получить координаты, куда смотрит ваш прицел:
Код #include <sourcemod> #include <sdktools>
public OnPluginStart() { HookEvent("player_say", player_say, EventHookMode_Post); }
public player_say(Handle:event, const String:name[], bool:silent) { new client = GetClientOfUserId(GetEventInt(event, "userid")); decl String:t[10]; GetEventString(event, "text", t, sizeof(t)); if (StrEqual(t, "1")) { decl Float:v[3]; GetLookPos(client, v);
PrintToChatAll("%f, %f, %f", v[0], v[1], v[2]); PrintToServer("%f, %f, %f", v[0], v[1], v[2]);
new index = CreateEntityByName("weapon_awp"); if (index > MaxClients) { DispatchKeyValueVector(index, "origin", v); DispatchKeyValue(index, "spawnflags", "1"); DispatchSpawn(index); } } }
stock GetLookPos(client, Float:v[3]) { decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace; GetClientEyePosition(client, EyePosition); GetClientEyeAngles(client, EyeAngles); h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, GetLookPos_Filter, client); TR_GetEndPosition(v, h_trace); CloseHandle(h_trace); }
public bool:GetLookPos_Filter(ent, mask, any:client) { return client != ent; }
Сдвинуть позицию вперед, назад, влево, вправо:
Код decl Float:EyePos[3], Float:EyeAngles[3]; GetClientEyePosition(client, EyePos); GetClientEyeAngles(client, EyeAngles); Movepos_Func(EyePos, EyeAngles, 150.0);
Movepos_Func(Float:position[3], const Float:constAngles[3], const Float:distance) { new Float:angles[3], Float:direction[3];
// Если вперед, то так angles[1] = constAngles[1];
// Если назад, то так angles[1] = constAngles[1] + 180.0;
// Если влево, то так angles[1] = constAngles[1] + 90.0;
// Если вправо, то так angles[1] = constAngles[1] + 270.0; GetAngleVectors(angles, direction, NULL_VECTOR, NULL_VECTOR); position[0] = position[0] + direction[0] * distance; position[1] = position[1] + direction[1] * distance; }
|
|
| |
horr0r
|
Дата: Пятница, 31.05.2013, 13:02:35 | Сообщение # 2 |
![Пользователь](http://world-source.ru/groupicon/user_icon.jpg) |
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
Пара моих функций. Если сюда можно выложить, то:Код stock Float:GetDistance(Float:pos1[3], Float:pos2[3]) //получает дистанцию между двух точек. (В 2д пространстве). { return SquareRoot( Pow(pos2[0] - pos1[0], 2.0) + Pow(pos2[1] - pos1[1], 2.0) ); }
stock IsClientInRangeOfPoint(client, Float:radius, Float:cpos[3]) //проверяет предыдущей функцией, в радиусе ли игрок от определенной точки. { new Float:ppos[3]; GetClientAbsOrigin(client, ppos); if(GetDistance(ppos, cpos) <= radius) return true; return false; }
Сделал пример. Когда граната взорвется, будет сотрясение экрана. Даже если она взорвалась за стеной и вы не получили урона. Пример:Код #include <sourcemod>
public OnPluginStart() { HookEvent("hegrenade_detonate", fbdeto); //отлавливаем событие }
public fbdeto(Handle:event, const String:name[], bool:dontBroadcast) { new Float:grpos[3], Float:ppos[3]; grpos[0] = GetEventFloat(event, "x"); //получаем позиции эвента взрыва гранаты grpos[1] = GetEventFloat(event, "y"); //получаем позиции эвента взрыва гранаты grpos[2] = GetEventFloat(event, "z"); //получаем позиции эвента взрыва гранаты for(new i = 1; i <= MaxClients; i++) //проходим всех игроков { if(IsClientInRangeOfPoint(i, 400.0, grpos)) //если игрок в радиусе 400 от взрыва гранаты то, { GetClientAbsOrigin(i, ppos); //получаем позицию игрока new Float:shakepower = (400 - GetDistance(ppos, grpos)) * 0.04; //получаем будущую амплидуту энтити env_shake //от 400 отнимем дистанцию, между игроком и позицей взорваной гранаты. (Т.к. максимальная амплитуда = 16. //Мы умножим полученное число на 0.4. 400*0.4 = 16 new Handle:hBf=StartMessageOne("Shake", i); //начинаем создавать энтити env_shake if(hBf!=INVALID_HANDLE) //удалось создать { BfWriteByte(hBf, 0); BfWriteFloat(hBf, shakepower); //амплитуда взрыва BfWriteFloat(hBf, 1.0); BfWriteFloat(hBf, 1.5); //длительность EndMessage(); } } } }
Принцип работы шейка - если игрок в радиусе от взрыва гранаты -> сотрясаем экран. Чем дальше игрок от взрыва, тем меньше будет сотрясаться экран.
Сообщение отредактировал horr0r - Пятница, 31.05.2013, 13:05:34 |
|
| |
ppc
|
Дата: Четверг, 28.01.2016, 12:24:54 | Сообщение # 3 |
![Активный](http://world-source.ru/groupicon/active_icon.jpg) |
Сообщений: 85
Репутация: 0 [ +/- ]
|
|
Пытаюсь написать плагин для cs go. Пишет ошибку нет такой функции IsClientInRangeOfPoint.
Сообщение отредактировал ppc - Четверг, 28.01.2016, 12:31:52 |
|
| |
BarD
|
Дата: Четверг, 28.01.2016, 13:12:47 | Сообщение # 4 |
![Пользователь](http://world-source.ru/groupicon/user_icon.jpg) |
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
ppc, ты сами функции-то копируй в свой исходник.
Цитата horr0r ( ![Ссылка на цитируемый текст](http://s9.ucoz.net/img/fr/ic/2/lastpost.gif) ) stock IsClientInRangeOfPoint(client, Float:radius, Float:cpos[3]) { 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]) { return SquareRoot( Pow(pos2[0] - pos1[0], 2.0) + Pow(pos2[1] - pos1[1], 2.0) ); }
Сообщение отредактировал BarD - Четверг, 28.01.2016, 13:15:49 |
|
| |
|