Заказать Сервер Заказать Плагин Контакты Поиск

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

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Работа с координатами (x, y, z)
Работа с координатами (x, y, z)
_wS_ Дата: Пятница, 16.03.2012, 15:06:18 | Сообщение # 1
Как можно получить координаты, куда смотрит ваш прицел:

Code
#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
     HookEvent("player_say", player_say);
}

public player_say(Handle:event, const String:name[], bool:dontBroadcast)
{
     new i = GetClientOfUserId(GetEventInt(event, "userid"));
     decl String:t[3];
     GetEventString(event, "text", t, 3);
     if (StrEqual(t, "1"))
     {
         decl Float:wS_Pos[3];
         wS_GetLookPos(i, wS_Pos);

         PrintToChatAll("%f, %f, %f", wS_Pos[0], wS_Pos[1], wS_Pos[2]);
         PrintToServer("%f, %f, %f", wS_Pos[0], wS_Pos[1], wS_Pos[2]);

         new index = CreateEntityByName("weapon_awp");
         if (index > 0)
         {
             DispatchKeyValueVector(index, "origin", wS_Pos);
             DispatchKeyValue(index, "spawnflags", "1");
             DispatchSpawn(index);
         }
     }
}

wS_GetLookPos(i, Float:wS_Pos[3])
{
     decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace;
     GetClientEyePosition(i, EyePosition);
     GetClientEyeAngles(i, EyeAngles);
     h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, wS_GetLookPos_Filter, i);
     TR_GetEndPosition(wS_Pos, h_trace);
     CloseHandle(h_trace);
}

public bool:wS_GetLookPos_Filter(ent, mask, any:i)
{
      return i != ent;
}


Сдвинуть позицию вперед, назад, влево, вправо:

Code
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)
{
     decl 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
Сообщений: 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
Сообщений: 85
Репутация: 0 [ +/- ]
Пытаюсь написать плагин для cs go. Пишет ошибку нет такой функции IsClientInRangeOfPoint.


Сообщение отредактировал ppc - Четверг, 28.01.2016, 12:31:52
 
BarD Дата: Четверг, 28.01.2016, 13:12:47 | Сообщение # 4
Сообщений: 945
Репутация: 132 [ +/- ]
ppc, ты сами функции-то копируй в свой исходник.

Цитата horr0r ()
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
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Работа с координатами (x, y, z)
Страница 1 из 11
Поиск: