OnPlayerWeaponShot Problem

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
  • Hallo zusammen,
    ich verstehe irgendwie trotz wiki nicht wirklich den public "OnPlayerWeaponShot".
    Mein Versuch war wie folgt:


    Spoiler anzeigen
    if(hittype == BULLET_HIT_TYPE_PLAYER_OBJECT)
    {
    if(amkaputtmachen[playerid] == 1)
    {
    for(new drug=0;drug<MAX_DROGEN;drug++)
    {
    if(IsPlayerInRangeOfPoint(playerid,3.5,DrogenInfo[drug][DrugX],DrogenInfo[drug][DrugY],DrogenInfo[drug][DrugZ]) && DrogenInfo[drug][druggepflanzt] == 1)
    {
    if(IsValidObject(hitid) && hitid == DrogenInfo[drug][drugobjekt])
    {
    DestroyObject(DrogenInfo[drug][drugobjekt]);
    Delete3DTextLabel(DrugText[drug]);
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);
    mysql_function_query(MYSQLVerbindung,query,false,"","");
    print("Aufruf bei Objekt getroffen!");
    }
    print("Aufruf für return bei ValidObject");
    return true;
    }
    }
    print("Ende for schleife");
    return true;
    }


    Jedoch hat er mir nicht ein print aufgerufen, was mich jetzt wirklich stutzig macht.
    Meine Frage daher, was ist mein Fehler, was habe ich bei dem public falsch verstanden?
    Wäre hilfreich über ein paar Erklärungen/Antworten :wacko:


    MfG
    ReborN


    Jeffry: :whistling:

  • if(hittype == BULLET_HIT_TYPE_PLAYER_OBJECT)
    {
    if(amkaputtmachen[playerid] == 1)
    {
    for(new drug=0;drug<MAX_DROGEN;drug++)
    {
    if(IsPlayerInRangeOfPoint(playerid,3.5,DrogenInfo[drug][DrugX],DrogenInfo[drug][DrugY],DrogenInfo[drug][DrugZ]) && DrogenInfo[drug][druggepflanzt] == 1)
    {
    if(IsValidObject(hitid) && hitid == DrogenInfo[drug][drugobjekt])
    {
    DestroyObject(DrogenInfo[drug][drugobjekt]);
    Delete3DTextLabel(DrugText[drug]);
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);
    mysql_function_query(MYSQLVerbindung,query,false,"","");
    print("Aufruf bei Objekt getroffen!");
    print("Aufruf für return bei ValidObject");
    return true;
    }
    }
    }
    print("Ende for schleife");
    return true;
    }
    } //hier hat noch eine Klammer gefehlt, vergessen zu kopieren nehme ich an.


    Der return muss unter die IsValidObject(hitid) - Abfrage, da sonst die Schleife nach dem ersten Durchlauf beendet wird.
    Wenn du es dort return'st dann wird der print ganz unten ("Ende for schleife") nicht mehr aufgerufen. Wenn der aufgerufen werden soll, musst du das "return true;" innerhalb der Schleife zu "break;" machen.

  • Ok das habe ich soweit jetzt verstanden.
    Jedoch wird mir mit diesem Code: (Hatte die Bullet_hit_Type noch falsch gehabt)


    Spoiler anzeigen
    if(hittype == BULLET_HIT_TYPE_OBJECT)
    {
    if(amkaputtmachen[playerid] == 1)
    {
    for(new drug=0;drug<MAX_DROGEN;drug++)
    {
    if(IsPlayerInRangeOfPoint(playerid,3.5,DrogenInfo[drug][DrugX],DrogenInfo[drug][DrugY],DrogenInfo[drug][DrugZ]) && DrogenInfo[drug][druggepflanzt] == 1)
    {
    if(IsValidObject(hitid) && hitid == DrogenInfo[drug][drugobjekt])
    {
    DestroyObject(DrogenInfo[drug][drugobjekt]);
    Delete3DTextLabel(DrugText[drug]);
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);
    mysql_function_query(MYSQLVerbindung,query,false,"","");
    print("Aufruf bei Objekt getroffen!");
    break;
    }
    }
    }
    print("Ende for schleife");
    return true;
    }
    }


    Dennoch nicht einen print der mir ausgegeben wird,
    wo ich nicht wirklich weiß wieso 8|


    MfG

  • Zwar in Ordnung:

    PHP
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);


    Allerdings sind die ' nicht nötig, wenn Du einen Integer ersetzt.


    Kannst Du auch so schreiben:

    PHP
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = %d",DrogenInfo[drug][drogenid]);
  • Debugge es mal und poste dann was im Server Log steht (mit den Zeitstempeln bitte).
    printf("playerid: %d", playerid);
    if(hittype == BULLET_HIT_TYPE_OBJECT)
    {
    printf("amkaputtmachen: %d", amkaputtmachen[playerid]);
    if(amkaputtmachen[playerid] == 1)
    {
    for(new drug=0;drug<MAX_DROGEN;drug++)
    {
    printf("drug: %d -> druggepflanzt: %d", drug, DrogenInfo[drug][druggepflanzt]);
    if(IsPlayerInRangeOfPoint(playerid,3.5,DrogenInfo[drug][DrugX],DrogenInfo[drug][DrugY],DrogenInfo[drug][DrugZ]) && DrogenInfo[drug][druggepflanzt] == 1)
    {
    printf("In Range -> %d == %d (%d)", hitid, rogenInfo[drug][drugobjekt], IsValidObject(hitid));
    if(IsValidObject(hitid) && hitid == DrogenInfo[drug][drugobjekt])
    {
    printf("Passt.");
    DestroyObject(DrogenInfo[drug][drugobjekt]);
    Delete3DTextLabel(DrugText[drug]);
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);
    mysql_function_query(MYSQLVerbindung,query,false,"","");
    print("Aufruf bei Objekt getroffen!");
    print("Aufruf für return bei ValidObject");
    return true;
    }
    }
    }
    print("Ende for schleife");
    return true;
    }
    }

  • Ja habe ich eingeschaltet, da ich das auch gefunden hatte in der wiki.
    Deshalb verwundert mich das ein wenig.
    Der Print mit "playerid: %d" ist nach einem new query, die erste Zeile die in diesem Public aufgerufen wird.
    Hab jetzt beides mal versucht, Lagcomp on sowie off, bei beiden Sachen wird dieser Public nicht aufgerufen.

  • Zu Frage 1: Nein habe ich nicht.


    Hier der gesamte Public:


    Spoiler anzeigen
    public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
    {
    new query[500];
    printf("playerid: %d", playerid);
    if(hittype == BULLET_HIT_TYPE_OBJECT)
    {
    printf("amkaputtmachen: %d", amkaputtmachen[playerid]);
    if(amkaputtmachen[playerid] == 1)
    {
    for(new drug=0;drug<MAX_DROGEN;drug++)
    {
    printf("drug: %d -> druggepflanzt: %d", drug, DrogenInfo[drug][druggepflanzt]);
    if(IsPlayerInRangeOfPoint(playerid,3.5,DrogenInfo[drug][DrugX],DrogenInfo[drug][DrugY],DrogenInfo[drug][DrugZ]) && DrogenInfo[drug][druggepflanzt] == 1)
    {
    printf("In Range -> %d == %d (%d)", hitid, DrogenInfo[drug][drugobjekt], IsValidObject(hitid));
    if(IsValidObject(hitid) && hitid == DrogenInfo[drug][drugobjekt])
    {
    printf("Passt.");
    DestroyObject(DrogenInfo[drug][drugobjekt]);
    Delete3DTextLabel(DrugText[drug]);
    format(query,sizeof(query),"DELETE FROM drogen WHERE drogenid = '%d'",DrogenInfo[drug][drogenid]);
    mysql_function_query(MYSQLVerbindung,query,false,"","");
    print("Aufruf bei Objekt getroffen!");
    print("Aufruf für return bei ValidObject");
    break;
    }
    }
    }
    print("Ende for schleife");
    return true;
    }
    }
    return true;
    }


    Es befindet sich nichts weiter darin, als das mit dem Drogen System

  • Ok, sehr komisch. 8|


    Setze den print mal vor das "new query...".
    Dann gehe in den Server und probiere es mit verschiedenen Waffen. Wird das playerid dann mit irgendeiner Waffe geprintet?


    Wenn nein: Hast du auch den 0.3z Server, oder nutzt du nur dessen Includes?

  • Also haben den 0.3z Server und ja auch installiert / geupdatet.


    Jedenfalls wird mit einer Shotgun der Print mit playerid ausgeführt und zeigt mir auch meine Spieler ID mit "28" an. (so wie ich diese auch im Server habe).
    Weiteres wird jedoch nicht angezeigt.

  • Vielleicht liegt es auch an dem Objekt das du gesetzt hast.
    Ist es ein Objekt durch das man durchlaufen kann?


    Ändere den print auch mal zu:
    printf("playerid: %d | weaponid: %d | hittype: %d | hitid: %d | x:%f | y:%f | z:%f", playerid, weaponid, hittype, hitid, fX, fY, fZ);


    Dann weißt du genau was passiert, wenn du schießt.

  • Ist es ein Objekt durch das man durchlaufen kann?

    Hab ist es, hatte es gerade mal unglücklicherweise (ID falsch gesetzt gehabt) mit einem anderen Objekt versucht, hierbei wurde dies auch zerstört und alles geprintet.
    Ist es also nicht möglich (Bsp. Pflanzen Objekte) durch diesen Public zerstören zu lassen? O_o

  • Ich denke nicht, denn du kannst durch diese ja problemlos durchlaufen, das heißt auch durchschießen, somit wird das Objekt eigentlich nicht getroffen.
    Mit Pflanzen wird den Vorhaben nicht klappen, du musst vielleicht ein Objekt in die Pflanze setzen, welches du durchsichtig machst.