17.07.2012, 07:59
Option 1:
*NOTE: I did NOT make this function, I don't know who did make it, but whoever did thank you for this.
By the way, this is the ORIGINAL function so I think you would need to remove the weapon check
Put it in your script, to use you would do this:
IsPlayerAimingAt(playerid, x, y, z, range);
The XYZ would be the pos of the object and the range would be the radius form the center of the object.
Option 2:
You could check the distance between the player and the wall object.
You can use this: https://sampwiki.blast.hk/wiki/GetPlayerDistanceFromPoint
And then use the example given here: https://sampwiki.blast.hk/wiki/GetPlayerCameraFrontVector
the fScale would be the distance between you and the object.
Those suggestions aren't very efficient and maybe not so accurate but thats what you could do for now until you get a better way to do it.
*NOTE: I did NOT make this function, I don't know who did make it, but whoever did thank you for this.
pawn Код:
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;
}
public 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));
}
Put it in your script, to use you would do this:
IsPlayerAimingAt(playerid, x, y, z, range);
The XYZ would be the pos of the object and the range would be the radius form the center of the object.
Option 2:
You could check the distance between the player and the wall object.
You can use this: https://sampwiki.blast.hk/wiki/GetPlayerDistanceFromPoint
And then use the example given here: https://sampwiki.blast.hk/wiki/GetPlayerCameraFrontVector
the fScale would be the distance between you and the object.
Those suggestions aren't very efficient and maybe not so accurate but thats what you could do for now until you get a better way to do it.