• Страница 1 из 1
  • 1
Модератор форума: [east_side]_trane, drifter-dron, valych, admin  
[FUNCTION] IsPlayerAimingAt
adminДата: Четверг, 30.12.2010, 15:37:46 | Сообщение # 1

Группа: Администраторы
Сообщений: 3869
Эта функция использует RedShirt's "DistanceCameraTargetToLocation" и изменение GetPlayerFacingAngleToPoint, которые я изменил в GetPointAngleToPoint.

Если вы хотите, чтобы обнаружить, если игрок стремится в любом положении, вам не нужно только POS-камеры и вектор камеры переднего, так как перекрестье позиция не корреляции камеры вектор. Я установил функцию IsPlayerAimingAt поэтому он отражает все угла (горизонтальной и вертикальной) различия по оружию.

Code
Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) {

  new Float:TGTDistance;

  TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));

  new Float:tmpX, Float:tmpY, Float:tmpZ;

  tmpX = FrX * TGTDistance + CamX;
  tmpY = FrY * TGTDistance + CamY;
  tmpZ = FrZ * TGTDistance + CamZ;

  return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ));
}

stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) {

   new Float:DX, Float:DY;
   new Float:angle;

   DX = floatabs(floatsub(x2,X));
   DY = floatabs(floatsub(y2,Y));

   if (DY == 0.0 || DX == 0.0) {
     if(DY == 0 && DX > 0) angle = 0.0;
     else if(DY == 0 && DX < 0) angle = 180.0;
     else if(DY > 0 && DX == 0) angle = 90.0;
     else if(DY < 0 && DX == 0) angle = 270.0;
     else if(DY == 0 && DX == 0) angle = 0.0;
   }
   else {
     angle = atan(DX/DY);

     if(X > x2 && Y <= y2) angle += 90.0;
     else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
     else if(X < x2 && Y >= y2) angle -= 90.0;
     else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
   }

   return floatadd(angle, 90.0);
}

stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance) {
  x += (distance * floatsin(-angle, degrees));
  y += (distance * floatcos(-angle, degrees));
}

stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) {
   new Float:camera_x,Float:camera_y,Float:camera_z,Float:vector_x,Float:vector_y,Float:vector_z;
   GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z);
   GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);

  new Float:vertical, Float:horizontal;

  switch (GetPlayerWeapon(playerid)) {
    case 34,35,36: {
    if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true;
    return false;
    }
    case 30,31: {vertical = 4.0; horizontal = -1.6;}
    case 33: {vertical = 2.7; horizontal = -1.0;}
    default: {vertical = 6.0; horizontal = -2.2;}
  }

   new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
   new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees);
   GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees));

   if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true;
   return false;
}

Вы должны выполнять все эти функции. IsPlayerAimingAt затем используется для обнаружения, где игроки стремятся их перекрестия. точность около 98%.
Code
stock IsPlayerAimingAtPlayer(playerid, targetplayerid) {
   new Float:x, Float:y, Float:z;
   GetPlayerPos(targetplayerid, x, y, z);
   return IsPlayerAimingAt(playerid, x, y, z, 1.1);
}

Эта функция определяет, если игрок стремится к другому игроку.
Code
stock IsHeadshot(playerid, targetplayerid) {
   new Float:x, Float:y, Float:z;
   GetPlayerPos(targetplayerid, x, y, z);
   return IsPlayerAimingAt(playerid, x, y, z+0.8, 0.2);
}


zm-jail.ru

Разработка сайта samp-pawno.ru


 
СообщениеЭта функция использует RedShirt's "DistanceCameraTargetToLocation" и изменение GetPlayerFacingAngleToPoint, которые я изменил в GetPointAngleToPoint.

Если вы хотите, чтобы обнаружить, если игрок стремится в любом положении, вам не нужно только POS-камеры и вектор камеры переднего, так как перекрестье позиция не корреляции камеры вектор. Я установил функцию IsPlayerAimingAt поэтому он отражает все угла (горизонтальной и вертикальной) различия по оружию.

Code
Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ) {

  new Float:TGTDistance;

  TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));

  new Float:tmpX, Float:tmpY, Float:tmpZ;

  tmpX = FrX * TGTDistance + CamX;
  tmpY = FrY * TGTDistance + CamY;
  tmpZ = FrZ * TGTDistance + CamZ;

  return floatsqroot((tmpX - ObjX) * (tmpX - ObjX) + (tmpY - ObjY) * (tmpY - ObjY) + (tmpZ - ObjZ) * (tmpZ - ObjZ));
}

stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) {

   new Float:DX, Float:DY;
   new Float:angle;

   DX = floatabs(floatsub(x2,X));
   DY = floatabs(floatsub(y2,Y));

   if (DY == 0.0 || DX == 0.0) {
     if(DY == 0 && DX > 0) angle = 0.0;
     else if(DY == 0 && DX < 0) angle = 180.0;
     else if(DY > 0 && DX == 0) angle = 90.0;
     else if(DY < 0 && DX == 0) angle = 270.0;
     else if(DY == 0 && DX == 0) angle = 0.0;
   }
   else {
     angle = atan(DX/DY);

     if(X > x2 && Y <= y2) angle += 90.0;
     else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
     else if(X < x2 && Y >= y2) angle -= 90.0;
     else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
   }

   return floatadd(angle, 90.0);
}

stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance) {
  x += (distance * floatsin(-angle, degrees));
  y += (distance * floatcos(-angle, degrees));
}

stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) {
   new Float:camera_x,Float:camera_y,Float:camera_z,Float:vector_x,Float:vector_y,Float:vector_z;
   GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z);
   GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);

  new Float:vertical, Float:horizontal;

  switch (GetPlayerWeapon(playerid)) {
    case 34,35,36: {
    if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, vector_x, vector_y, vector_z) < radius) return true;
    return false;
    }
    case 30,31: {vertical = 4.0; horizontal = -1.6;}
    case 33: {vertical = 2.7; horizontal = -1.0;}
    default: {vertical = 6.0; horizontal = -2.2;}
  }

   new Float:angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x*vector_x+vector_y*vector_y), vector_z) - 270.0;
   new Float:resize_x, Float:resize_y, Float:resize_z = floatsin(angle+vertical, degrees);
   GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y)+horizontal, floatcos(angle+vertical, degrees));

   if (DistanceCameraTargetToLocation(camera_x, camera_y, camera_z, x, y, z, resize_x, resize_y, resize_z) < radius) return true;
   return false;
}

Вы должны выполнять все эти функции. IsPlayerAimingAt затем используется для обнаружения, где игроки стремятся их перекрестия. точность около 98%.
Code
stock IsPlayerAimingAtPlayer(playerid, targetplayerid) {
   new Float:x, Float:y, Float:z;
   GetPlayerPos(targetplayerid, x, y, z);
   return IsPlayerAimingAt(playerid, x, y, z, 1.1);
}

Эта функция определяет, если игрок стремится к другому игроку.
Code
stock IsHeadshot(playerid, targetplayerid) {
   new Float:x, Float:y, Float:z;
   GetPlayerPos(targetplayerid, x, y, z);
   return IsPlayerAimingAt(playerid, x, y, z+0.8, 0.2);
}

Автор - admin
Дата добавления - 30.12.2010 в 15:37:46
  • Страница 1 из 1
  • 1
Поиск:
Загрузка страницы, займет меньше минуты...
Загрузка...

Статистика Форума
Последнии темы Читаемые темы Лучшие пользователи Новые пользователи
Система телефонов поломалась
Не в себе
фильм скалайн
Трансформеры 3
форсаж 6
Ищу [FS]Для админок на сервер
нужны координаты карты для отметки зон...
Помогите найти мод
pawno урок автоматические ворота
обращение к скриптерам.
Вопросы по скриптингу
Ваши ошибки при компиляции GM/FS

Вопросы по скриптингу

(1081)

Считаем до 1000

(274)

Ваши ошибки при компиляция gm

(260)

Набор в команду

(80)

Ваши ошибки при компиляции GM/FS

(71)

вопроосы по скриптингу от 22.04.2013

(64)

Баннеробмен

(64)

несколько команд на samp 0.3 c

(64)

Оценки сайта samp-pawno.ru

(55)

Заказ хостинга

(51)

Набор в команду(форум)

(45)

Урок №61 по созданию системы авто для GodFather

(45)

admin

(3869)

[east_side]_trane

(443)

TWiX

(316)

valych

(501)

drifter-dron

(477)

danik_rok

(317)

Dimka_71rus

(360)

Drifter96

(300)

MaNb9K

(220)

[MTA]MaPeR5518

(181)

Dima_Tkach

(107)

Nik_Ull

(184)

system32xzxz

(Четверг 09:25:24)

torbin169

(Суббота 23:09:29)

kuchuk_00

(Суббота 17:10:14)

artem_boyko_3

(Суббота 15:57:37)

greggelbak

(Среда 18:29:37)

vladisvlavs

(Среда 13:51:57)

add02102002

(Понедельник 22:37:15)

Диман221

(Понедельник 18:12:45)

almas051004

(Воскресенье 11:05:32)

megasuccessms

(Суббота 14:15:36)

nawe

(Пятница 22:25:23)

swoysb

(Пятница 14:55:29)

Вверх
21:24:38
ОбновитьСмайлыУправление мини-чатом
ЧАТ-PAWNO
2010-2025

vkontakte :samp-pawno.ru: