Jump to content

[FUNCTION] IsPlayerAimingAt + funkce pro headshoty


niCe

Recommended Posts

Tahle funkce pouziva funkci od uzivatele RedShirt "DistanceCameraTargetToLocation" a modifikovanou funkci GetPlayerFacingAngleToPoint, kterou jsem si upravil na GetPointAngleToPoint. Protoze k detekci toho, kam hrac miri zamerovacim krizem nestaci pouze zjisteni polohy kamery a vektoru, nastavil jsem funkci IsPlayerAimingAt tak, aby reflektovala ruzne uhlove rozdily u jednotlivych typu zbrani.

 

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;
}

 

Ve vysledku tedy staci implementovat vsechny tyhle funkce, a pak pouzijete funkci IsPlayerAimingAt ke zjisteni toho, kam hrac skutecne miri.

 

stock IsPlayerAimingAtPlayer(playerid, targetplayerid) {
   new Float:x, Float:y, Float:z;
   GetPlayerPos(targetplayerid, x, y, z);
   return IsPlayerAimingAt(playerid, x, y, z, 1.1);
}

 

Tahle funkce treba spolehlive zjisti, jestli mirite na hrace.

 

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);
}

 

A tahle zase zjisti, jestli mirite hraci na hlavu - headshot.

Link to comment
Share on other sites

resil sem to s niCem na ICQ...a rikal ze treba v mim pripade by to bylo hodne tezky to optimalizovat tak aby to nelagovalo server...jelikoz pri vetsim poctu hracu (20+) to hodne zatezuje...a dalsi nevyhoda je ze to dava headshoty i pres zdi...coz je nezadouci

Link to comment
Share on other sites

je pravda ze do nejakyho CS modu by to nebylo spatny...ale ty hedky pres zed sou fakt na pytel

 

tjn, ... taky mohli udělat funkci, která by ti zjistila, jestli koukáš na určitý bod skrz ( neprůstřelnej ) objekt :d

Link to comment
Share on other sites

Jeste maly update, pro lepsi presnost zjisteni, jestli hrac miri na hrace doporucuju vytvoreni vicebodovejch zasahovejch zon, treba:

 

stock IsPlayerAimingAtPlayer(playerid, targetid) {
 new Float:x, Float:y, Float:z;
 GetPlayerPos(target, x, y, z);
 if (IsPlayerAimingAt(playerid, x, y, z-0.75, 0.25)) return true;
 if (IsPlayerAimingAt(playerid, x, y, z-0.25, 0.25)) return true;
 if (IsPlayerAimingAt(playerid, x, y, z+0.25, 0.25)) return true;
 if (IsPlayerAimingAt(playerid, x, y, z+0.75, 0.25)) return true;
 return false;
}

Link to comment
Share on other sites

Pokud jsem to dobře pochopil, (kod sem neštudoval :d) by se to hodilo třeba i na zbrojní průkaz když musí trefit terč přesně do prostřed, nice tut.

Určitě využiju :)

Link to comment
Share on other sites

Kompletne hotovou strelnici, kde mam tyhle funkce, najdete na WTSA, kde si muzete vyzkouset, jak to funguje.

Furt mě zajímalo jak si to udělal :d :D

ještě jednou dík...

Link to comment
Share on other sites

  • 3 weeks later...

J slo ja to tak mam :) Akorad je nevyhoda, kdyz spadne treba jen z malyho utesu a nekdo na nej miri a vystreli tak ho to klidne tky zabije..

Link to comment
Share on other sites

  • Majitel
J slo ja to tak mam :) Akorad je nevyhoda, kdyz spadne treba jen z malyho utesu a nekdo na nej miri a vystreli tak ho to klidne tky zabije..

 

Je hodne mala sance aby ho trefil do hlavy uprostred animace.. kazdej typek bude mirit presne na model a ne 0.8 m nad jeho dolni bod.. ;)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...