Hitabfrage und Abfrage welcher Spieler am nähesten ist??

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
  • Hey Leute.
    Ich habe 2 Fragen.
    Die erste Frage lautet: Wie kann ich abfragen, ob jemand mit dem Messer getroffen wurde, sprich ob Spieler2 (der gemesserte) in der Nähe ist und ob der andere Spieler(playerid), der Spieler2 messert, auch in die Richtige Richtung guckt etc.? Das Ganze soll weltenübergreifend funktionieren, sprich man kann nicht abfragen, ob Spieler2 Health verliert, denn das tut er ja nicht, da die 2 Personen sich nicht sehen (sie sind in 2 verschiedenen virtuellen Welten).
    Ich hoffe nur, dass das einer verstanden hat :S
    ------------------------------------------------------
    Meine 2. Frage lautet: Wie finde ich heraus, welcher Spieler einem anderen Spieler(playerid) am nähesten ist und ob er in einem bestimmten Radius von dem anderen Spieler steht?
    ------------------------------------------------------
    Ich hoffe, dass mir da einer helfen kann :)


    MfG
    Hardy

  • So sollte das ungefähr aussehen
    GetClosestPlayer(playerid, Float: fRadius)
    {
    new
    iClosestID = INVALID_PLAYER_ID,
    Float: fFinalDistance,
    Float: fDistance,
    Float: fX,
    Float: fY,
    Float: fZ;
    GetPlayerPos(playerid, fX, fY, fZ);
    fFinalDistance = fRadius;

    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if((fDistance = GetPlayerDistanceFromPoint(i, fX, fY, fZ)) < fFinalDistance)
    {
    fFinalDistance = fDistance;
    iClosestID = i;
    }
    }
    return iClosestID;
    }

  • GetClosestPlayer(playerid, Float: fRadius)
    {
    new
    iClosestID = INVALID_PLAYER_ID,
    sName[MAX_PLAYER_NAME+1],
    Float: fFinalDistance,
    Float: fDistance,
    Float: fX,
    Float: fY,
    Float: fZ;
    GetPlayerPos(playerid, fX, fY, fZ);
    fFinalDistance = fRadius;

    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if((fDistance = GetPlayerDistanceFromPoint(i, fX, fY, fZ)) < fFinalDistance)
    {
    fFinalDistance = fDistance;
    iClosestID = i;
    }
    }
    GetPlayerName(iClosestID, sName, sizeof(sName));
    return sName;
    }


    Das returnt dann direkt den Namen, anstatt der ID.


    if (strcmp("/test", cmdtext, true, 10) == 0)
    {
    new name[MAX_PLAYER_NAME+1];
    GetPlayerName(playerid, name, sizeof(name));
    return 1;
    }

  • Na dann so:



    if (strcmp("/test", cmdtext, true, 10) == 0)
    {
    GetClosestPlayer(playerid, 5.0); // <-- Das gibt dir gleich den Namen raus. Verwendung wie folgt:
    new string[MAX_PLAYER_NAME+1];
    format(string, sizeof(string), "Dein nächster Spieler ist %s",GetClosestPlayer(playerid, 5.0));
    SendClientMessage(playerid, -1, string);
    return 1;
    }

  • Es wird nicht playerid zurückgegeben.
    Das Playerid ist da, um von dem Spieler "playerid" den nähsten Spieler im Radius von 5 zu suchen.


    Zurück gegeben wird, bei dem, was ich geschrieben habe, immer der Name vom nahsten Spieler. Außer es ist keiner in der Nähe.

  • Wenn keiner in der nähe ist, wird INVALID_PLAYER_ID genommen.




    GetClosestPlayer(playerid, Float: fRadius)
    {
    new
    iClosestID = INVALID_PLAYER_ID,
    sName[MAX_PLAYER_NAME+1],
    Float: fFinalDistance,
    Float: fDistance,
    Float: fX,
    Float: fY,
    Float: fZ;
    GetPlayerPos(playerid, fX, fY, fZ);
    fFinalDistance = fRadius;

    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if((fDistance = GetPlayerDistanceFromPoint(i, fX, fY, fZ)) < fFinalDistance)
    {
    fFinalDistance = fDistance;
    iClosestID = i;
    }
    }
    if(iClosestID == INVALID_PLAYER_ID)
    {
    return iClosestID;
    }
    else
    {
    GetPlayerName(iClosestID, sName, sizeof(sName));
    return sName;
    }
    }


    So müsstest du dann einfach nur noch Abfragen, ob der return von GetClosestPlayer (also if(GetClosestPlayer(playerid, 5.0) == INVALID_PLAYER_ID)) und wenn es so ist, dann die Nachricht senden, dass kein Spieler in der nähe ist.
    Als Else kannst du dann einfach die Nachricht wie hier senden:



    €dit:


    Wenn du noch Probleme damit hast, kannst du dich auch bei mir in Skype melden. - Name im Profil.