Fraktion zurücksetzen Befehl

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,


    gerne möchte ich mit einem OCMD Befehl die Daten einer Fraktion zurücksetzen. Das ganze soll wie folgt funktionieren,


    Wenn man folgendes eingibt /clearfrak [FraktionsID]


    sollen alle Spieler Abgefragt werden die die FraktionsID besitzen. Diese soll dann auf 0 gesetzt werden. Das ganze soll bei Spielern geschehen die InGame eingeloggt sind und bei Spielern die nicht eingeloggt sind. Wie kann man sowas am besten definieren ?


    Über jede hilfe bin ich dankbar :)


    //Edit


    Ich habe mal angefangen aber ich weiß nicht ob es sehr sinnvoll ist. Hier habe ich es erstmal so eingestellt das der Spieler zumindest aus der Fraktion gelöscht wird und neu gespawnt wird sofern er Online ist. Wie würde ich das beim Offline sein am besten machen also dem else?



    ocmd:frakdel(playerid,params[])
    {
    new pID,frak;
    if(isAdmin(playerid,8))
    {
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if(sscanf(params, "ud",pID,frak))
    {
    if(IsPlayerConnected(i) && PlayerInfo[playerid][pMember]==frak)
    {
    PlayerInfo[playerid][pMember]=0;
    PlayerInfo[playerid][pLeader]=0;
    PlayerInfo[playerid][pFRang]=0;
    SpawnPlayer(pID);
    SendClientMessage(pID,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    }
    else
    {



    }
    }
    }
    }
    return 1;
    }

    Einmal editiert, zuletzt von robbi2304 ()

  • Wie mache ich denn am besten Abfragen mit MySQL. So im groben und ganzen habe ich das nun verstanden also wie folgt


    SELECT * FROM `users` WHERE `pMember`=frak


    Also er fragt in der Tabelle Users ab wer pMember mit der FrakID ist.
    Allerdings weiß ich nicht wie ich das in ne if abfrage am besten einbaue

  • Ich glaube wir sprechen gerade aneinander vorbei. Ich muss ja zunächst Abfragen ob der Spieler in der Fraktion ist. Das ganze würde ich ja mit einer if Abfrage denke ich mal machen also sowas wie z.b


    if(PlayerInfo[playerid][Eingeloggt]==1)
    {
    Werte auf Zivi setzen
    }


    Da weiß ich nicht wie ich es am besten mache

  • Ich dachte du möchtest es auch setzen wenn er Offline ist. Die einfachste Methode wäre ein Variable zu setzen die du per Befehl z.B auf 1 setzen kannst ist diese auf 1 dann kannst du eine If abfrage zu der Variable machen und dementsprechend den Spieler aus der Fraktion kicken wenn es auf 1 steht



    Bsp.


    New LSPDCLOSED


    Das packst du z.B in ein Befehl


    /Lspdclosed
    {
    LSPDCLOSED = 1;
    }


    dann bei onplayer connect


    If (LSPDCLOSED == 1)
    {
    If -> Fraktionsabfrage
    {
    -> Uninvite
    }
    }


    Das ganze kannst du dann ja noch in Dialogen aufbauen wäre dann Ingame übersichtlicher z.B in einer Liste wo du das dann dementsprechend auswählen kannst


    //Handy
    Wenn du Hilfe brauchst meld dich mal per PN kann dir das auch schnell machen für eine Fraktion

  • Ich möchte nicht das er das beim nächsten Connect auf 0 setzt sondern das er bei den Offline Spielern das ganze schon jn der Datenbank auf 0 setzt ohne das sie Online sein müssen


    Aktueller Code



    ocmd:frakdel(playerid,params[])
    {
    new pID,frak;
    if(isAdmin(playerid,8))
    {
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if(!sscanf(params, "u",frak))
    {
    SendClientMessage(playerid,COLOR_RED,"3");
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak || PlayerInfo[i][pLeader]==frak)
    {
    PlayerInfo[playerid][pMember]=0;
    PlayerInfo[playerid][pLeader]=0;
    PlayerInfo[playerid][pFRang]=0;
    SpawnPlayer(pID);
    SaveUserStats(pID);
    SendClientMessage(pID,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(playerid,0);
    return 1;
    }
    else
    {
    //Ofline Zivilist setzen
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"6");
    return SendClientMessage(pID,COLOR_RED,"Falsche Eingabe");
    }
    }
    }
    return 1;
    }

    Einmal editiert, zuletzt von robbi2304 ()

  • Der Query muss ungefähr so aussehen:


    SQL
    UPDATE `users` SET `pMember`='0' WHERE `Name`='%s' AND `pMember`='%d'

    ast2ufdyxkb1.png


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

  • Wie soll er %s auslesen wenn der Spieler Offline ist ?

    Um den Spieler offline anzusprechen muss man den Namen eingeben (Also der Spieler der den Command ausführt muss logischerweise den Spielernamen eingeben, sscanf nutz also nur bei dem online spieler, bei dem offline spieler arbeite direkt mit dem params (escape den string natürlich vorher erst)..er hat ja schließlich keine spielerid ^^

    ast2ufdyxkb1.png


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

  • Gibt es keine möglichkeit das man den Spielernamen nicht im Befehl mit Angeben muss ? Ich würde gerne das er alle Spieler durchläuft und alle auf 0 setztz.



    Ebenfalls macht der Online Code auch noch Probleme,



    ocmd:frakdel(playerid,params[])
    {
    new pID,frak;
    if(isAdmin(playerid,6))
    {
    for(new i=0; i <MAX_PLAYERS; i++)
    {
    if(sscanf(params, "u",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /su [ID] [Anzahl] [Grund] ");
    {
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak)
    {
    PlayerInfo[playerid][pMember]=0;
    PlayerInfo[playerid][pLeader]=0;
    PlayerInfo[playerid][pFRang]=0;
    SpawnPlayer(pID);
    SaveUserStats(pID);
    SendClientMessage(pID,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(playerid,0);
    return 1;
    }
    else
    {
    //Ofline Zivilist setzen
    }
    }
    }
    }
    return 1;
    }


    der PlayerInfo[i][pMember]==frak Wert kann nicht abgerufen werden

    Einmal editiert, zuletzt von robbi2304 ()

  • // Edit


    Online Befehl funktioniert wieder


    if(sscanf(params, "u",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /su [ID] [Anzahl] [Grund] ");


    zu


    if(sscanf(params, "d",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /frakdel [Fraktionsid]");


    //Edit Befehl geupdatet er sieht nun wie folgt aus



    ocmd:frakdel(playerid,params[])
    {
    new pID,frak,query[64];
    if(isAdmin(playerid,6))
    {
    for(new i; i<GetMaxPlayers(); i++)
    {
    if(sscanf(params, "d",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /frakdel [FraktionsID]");
    {
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak)
    {
    PlayerInfo[playerid][pMember]=0;
    PlayerInfo[playerid][pLeader]=0;
    PlayerInfo[playerid][pFRang]=0;
    SpawnPlayer(pID);
    SaveUserStats(pID);
    SendClientMessage(pID,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(playerid,0);
    format(query,sizeof(query),"UPDATE users SET member ='0' WHERE member`='%d'",frak);
    print(query);
    mysql_format(handle,query,false,"","");
    return 1;
    }
    else
    {
    //Ofline Zivilist setzen
    }
    }
    }
    }
    return 1;
    }


    format(query,sizeof(query),"UPDATE users SET `member`='0' WHERE `member`='%d'",frak);
    wird derzeit nicht geupdatet da ich sicher ein fehler hab


    /push 9.03
    /push 11.03


    @Jeffry

    4 Mal editiert, zuletzt von robbi2304 ()

  • Problem ist, dass du das Query in einer Spieler-Abhängigen Schleife hast, die eventuell nicht aufgerufen wird, wenn kein Spieler der Fraktion online ist.
    Außerdem fehlt im Befehl ein Anführungszeichen nach WHERE vor member.


    Zusätzlich nutzt du in der Schleife "pID", welches nie einen Wert bekommt, und "playerid", was der eingebende Spieler ist.


    Versuche es so:
    ocmd:frakdel(playerid,params[])
    {
    new frak,query[128];
    if(isAdmin(playerid,6))
    {
    if(sscanf(params, "d",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /frakdel [FraktionsID]");
    for(new i; i<GetMaxPlayers(); i++)
    {
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak)
    {
    PlayerInfo[i][pMember]=0;
    PlayerInfo[i][pLeader]=0;
    PlayerInfo[i][pFRang]=0;
    SpawnPlayer(i);
    SaveUserStats(i);
    SendClientMessage(i,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(i,0);
    }
    }
    format(query,sizeof(query),"UPDATE users SET member = '0' WHERE member = '%d'",frak);
    print(query);
    mysql_pquery(handle,query,"","");
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: mysql_format -> mysql_pquery

  • Hallo Jeffry, vielen dank für deine Hilfe. Ich habe soeben den Befehl ausgeführt. Die User die Offline sind, bleiben auf dem Wert von dem sie vorher auch sind.



    Anhand der Logs kann ich nicht viel erkennen. Ich kriege aus der MySQL Log folgendes



    [08:00:47] [DEBUG] mysql_format(1, 0x03DEC030, 0, "")


    ich habe den Query wie folgt auslesen lassen




    printf("logs %s",query);


    dieser ergab folgendes in der server.log


    [08:04:46] logs UPDATE users SET member = '0' WHERE member = '1'
    die werte werden allerdings in der Datenbank nicht gelöscht bzw gesetzt

  • Ah, klar. Da habe ich auch nicht drauf geachtet, mysql_format ist natürlich die falsche Funktion.
    mysql_format(handle,query,false,"","");
    zu:
    mysql_pquery(handle,query,"","");
    Bzw. eventuell
    mysql_function_query(handle,query,false,"","");
    Wenn du es so definiert hast.

  • mysql_pquery(handle,query,"","");


    also das erste wars


    danke



    Wie würde ich nun Fahrzeuge vom Server löschen ?


    Habe so angefangen

    ocmd:frakdel(playerid,params[])
    {
    new frak,query[128];
    if(isAdmin(playerid,6))
    {
    if(sscanf(params, "d",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /frakdel [FraktionsID]");
    for(new i; i<GetMaxPlayers(); i++)
    {
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak)
    {
    PlayerInfo[i][pMember]=0;
    PlayerInfo[i][pLeader]=0;
    PlayerInfo[i][pFRang]=0;
    SetPlayerVirtualWorld(i,0);
    SpawnPlayer(i);
    SaveUserStats(i);
    SendClientMessage(i,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(i,0);
    }
    }



    format(query,sizeof(query),"UPDATE users SET member = '0' WHERE member = '%d'",frak);
    mysql_pquery(handle,query,"","");
    new rows;
    cache_get_row_count(rows);
    for(new i=0; i<cache_num_rows(); i++)
    {
    new id = getFreeCarID();
    cache_get_value_name_int(i, "id", cInfo[id][db_id] );//Integer
    cache_get_value_name_int(i, "model", cInfo[id][model]);//Integer
    cache_get_value_name_int(i, "besitzer", cInfo[id][besitzer]);//Integer
    cache_get_value_name_float(i, "x", cInfo[id][c_x]); //Float
    cache_get_value_name_float(i, "y", cInfo[id][c_y]);//Float
    cache_get_value_name_float(i, "z", cInfo[id][c_z]);//Float
    cache_get_value_name_float(i, "r", cInfo[id][c_r]);//Float
    cache_get_value_name_int(i, "c1", cInfo[id][color1]);//Integer
    cache_get_value_name_int(i, "c2", cInfo[id][color2]);//Integer
    cache_get_value_name_int(i, "c3", cInfo[id][color3]);//Integer
    cache_get_value_name_int(i, "key", cInfo[id][key]);//Integer
    cache_get_value_name_int(i, "c_gesperrt", cInfo[id][c_gespeert] );//Integer
    if(cInfo[id][fraktion] == frak)
    {
    cInfo[id][id_x] = DestroyVehicle(cInfo[i][fraktion]==frak);
    }
    }


    }
    return 1;
    }


    allerdings gibt es kein cache wodurch er das ganze nicht ausführt. Ich hätte aber gerade keine Idee wie ich das machen könnte

    2 Mal editiert, zuletzt von robbi2304 ()

  • Ich hätte aber gerade keine Idee wie ich das machen könnte

    ocmd:frakdel(playerid,params[])
    {
    new frak,query[128];
    if(isAdmin(playerid,6))
    {
    if(sscanf(params, "d",frak)) return SendClientMessage(playerid,COLOR_RED,"Benutzung: /frakdel [FraktionsID]");
    for(new i; i<GetMaxPlayers(); i++)
    {
    if(PlayerInfo[i][pLoggedIn]==true && PlayerInfo[i][pMember]==frak)
    {
    PlayerInfo[i][pMember]=0;
    PlayerInfo[i][pLeader]=0;
    PlayerInfo[i][pFRang]=0;
    SetPlayerVirtualWorld(i,0);
    SpawnPlayer(i);
    SaveUserStats(i);
    SendClientMessage(i,COLOR_RED,"Du wurdest soeben aus deiner Fraktion gekickt. Grund: Fraktionsauflösung");
    SetPlayerVirtualWorld(i,0);
    }
    }
    format(query,sizeof(query),"UPDATE users SET member = '0' WHERE member = '%d'",frak);
    mysql_pquery(handle,query,"","");
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    if(cInfo[i][fraktion] == frak)
    {
    DestroyVehicle(cInfo[id][id_x]);
    }
    }
    format(query,sizeof(query),"DELETE FROM frakVehicles WHERE frak = '%d'",frak); //Eventuell anpassen
    mysql_pquery(handle,query,"","");
    }
    return 1;
    }