Spieler - Winkelberechnung

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich nutze die Funktion von niCe aus dem englischen SAMP Forum.
    Mir ist aber aufgefallen das diese Rechnung nur für das genaue drauf schauen gedacht ist und nicht zum Objekt selber stehen.


    Was meine ich genau?
    Diese Funktion reagiert positiv auf dieses Bild, da ich in die Richtung schaue.



    Sie soll aber erst reagieren wenn ich wirklich im vollen möglichem Umfang davor stehe.. sprich so:



    niCe sein Quellcode

    //By niCe (c)
    stock Float:DistanceCameraTargetToLocation(Float:CamX, Float:CamY, Float:CamZ, Float:ObjX, Float:ObjY, Float:ObjZ, Float:FrX, Float:FrY, Float:FrZ)
    {
    new Float:TGTDistance, Float:tmpX, Float:tmpY, Float:tmpZ;
    TGTDistance = floatsqroot((CamX - ObjX) * (CamX - ObjX) + (CamY - ObjY) * (CamY - ObjY) + (CamZ - ObjZ) * (CamZ - ObjZ));
    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));
    return 1;
    }


    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, Float:vertical, Float:horizontal;
    GetPlayerCameraPos(playerid, camera_x, camera_y, camera_z);
    GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);


    switch (GetPlayerWeapon(playerid))
    {
    case 34..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 0;
    }


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


    stock IsPlayerAimingAtObject(playerid, targetobject)
    {
    new Float:x, Float:y, Float:z;
    GetObjectPos(targetobject, x, y, z);
    return IsPlayerAimingAt(playerid, x, y, z, 1.1);
    }

  • Give it a try:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S