Beiträge von IPrototypeI

    Ja aber er kann mir ja nicht die Zahl oder was auch immer in dem Feld steht returnen somit macht diese Funktion keinen sinn


    mfg tdXkiller


    es kommt drauf was du zurück geben möchtest an global definierte arrays , integer oder floats geht das ohne probleme. Zu dem kannst du parameter an die Funktion übergeben, welche aufgerufen wird


    Wie oft soll ich es noch schreiben ja du sollst alle Objecte die du via CreateObject unter OnGameModeInit erstellen lässt mit CreateDynamicObject nun erstellen.

    Jop dort sind auch CreateObjects aber das meiste nur DynamicObject.
    Wenn ich das jetzt umändere ändert sich Mapmäßig nichts oder?


    xD doch, wenn du noch oben bei OnGameModeInit Streamer_VisibleItems(STREAMER_TYPE_OBJECT,1000); kannst du größere maps bis zu 1000 Objekte im umkreis ohne
    Probleme einstreamen lassen. Weil wenn du rund 1000 Objekte via CreateObjects erstellen lässt bringt der streamer nix mehr dieser basiert
    auf CreatePlayerObject und CreateObjects ist nicht unabhängig von CreatePlayerObject , weil wenn du 1 Objekt mit CreateObjects erstellst geht für jeden Spieler
    dieser Slot verloren , das bedeutet du kannst nun weniger Objekte für den Spieler erstellen.


    Also hast du 1000 Objekte mit CreateObjects erstellt wird dir keine map mehr eingestreamt über den streamer und die ersten Objekte die du mit CreateObject erstellst sollten vorhanden sein.


    Daher solltest du wie schon angemerkt alle Objekte die du unter OnGameModeInit oder über filterskripts laden lässt zu CreateDynamicObject umändern dazu einfach die Objecte markieren strg + h drücken oben CreateObject rein schreiben und unten CreateDynamicObject und noch Select text only aktivieren und okay klicken.

    Hmm ja aber wie soll ich sonst an einzelne werte zu Überprüfung von sachen kommen ? 8| muss ich sogesehen für jeden kleinen Pippifax alles aus der db laden lassen und abspeichern lassen um es zu verwenden also ist es so gesehen kaum möglich einzelne vars zur Überprüfung zu laden ?


    Das kannst du mit einem ganz einfachen Query machen und danach musst du abprüfen ob der eintrag existiert.


    format(query,64,"SELECT 1 FROM `accounts` WHERE `Banane` = '%d' LIMIT 0,1",var);
    mysql_query(query)
    mysql_store_result();
    if(!mysql_num_rows())return print("Eintrag nicht gefunden"),mysql_free_result();
    print("Eintrag gefunden");
    mysql_free_result();


    oder
    format(query,64,"SELECT COUNT(*) FROM `accounts` WHERE `Banane` = '%d' LIMIT 0,1",var);
    oder
    format(query,64,"SELECT `Curry` FROM `accounts` WHERE `Banane` = '%d' LIMIT 0,1",var);


    bei dem Select query kannst du danach raus lesen was du willst ob du das zählen lässt 1 zurück geben lässt oder den inhalt einer Zelle, das ist egal.


    Bei der R7 Version würde das so aussehen


    forward @MYSQL_CHECK_ENTRY();


    format(query,64,"SELECT 1 FROM `accounts` WHERE `Banane` = '%d' LIMIT 0,1",var);
    mysql_function_query(con_Handle,query,true,"@MYSQL_CHECK_ENTRY","");



    @MYSQL_CHECK_ENTRY(){
    new entry[2];
    cache_get_data(entry[0],entry[1]);
    if(!entry[0])return print("kein Eintrag gefunden");
    return print("Eintrag gefunden");
    }

    Blood.


    Weil du so auch kein array zurück geben kannst, wie soll auch so der Memory wieder frei geben werden.


    so sollte es gehen.

    stock GetBesitzerName(zID)
    {
    new fName[20]="INVALID";
    switch(Zone[zID][Besitzer])
    {
    case 0: fName="Grove Street";
    case 1: fName="Ballas Family";
    case 2: fName="Los Vagos";
    case 3: fName="Atzecas";
    }
    return fName;
    }

    Also das hauptproblem bei dir ist das du erstmal die namen brauchst von den Leadern diese solltest du in ihrgend einer ini speichern.
    Weil du bist auf den datei name angewiesen da es keine möglichkeit gibt alle files einfach so auszulesen mit den Namen.


    Also kleine Anmerkung wenn du den Fraktionsname über eine Funktion zurück gibst ist das ganze viel übersichtlicher dazu braucht man keine 100 if abfragen, zu dem solltest du deinen dialog anzeigen lassen wenn die schleife beendet ist also außerhalb der schleife.


    stock GetFraktion(playerid){
    new fName[20]="Unbekannt";
    switch(PlayerInfo[playerid][pLeader]){
    case 1: fName="LSPD";
    case 2: fName="SFPD";
    case 3: fName="Armee";
    case 4: fName="Rettungsdienst";
    case 5: fName="La Cosa Nostra";
    case 6: fName="Yakuza";
    case 7: fName="Regierungs";
    case 8: fName="Hitman";
    case 9: fName="News Reporter";
    case 10: fName="Taxi Company";
    case 11: fName="Fahrschul";
    case 12: fName="Groove Street";
    case 13: fName="Ballas";
    case 14: fName="Hells Angels";
    case 15: fName="Aztecas";
    case 16: fName="LVPD";
    case 17: fName="Terroristen";
    case 18: fName="ADAC";
    }
    return fname;


    }


    ocmd:leaders(playerid,params[])
    {
    new string[500],name[100], vz[50],FraktionsText[20];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || PlayerInfo[i][pLeader] == 0)continue;
    GetPlayerName(i, name, 24);
    format(vz, 50,"%s Leader: (%d)%s\n",GetFraktion(i),i,name);
    strcat(string, vz);
    }
    ShowPlayerDialog(playerid,325,DIALOG_STYLE_LIST,"Leaders",string,"Bestätigen","");
    }

    if(IsPlayerInRangeOfPoint(playerid,R,X,Y,Z))return GebeSpielerRandomGeld(playerid,mysql,45), DestroyVehicle(GetPlayerVehicleID(playerid));
    R- radiusX,Y,Z gegen Koordinaten tauschen
    Jedoch um das ganze ohne Checkpoint , Pickup oder Zone(streamer) zu machen benötigst du einen Timer, weil sonst könntest du mit Callbacks arbeiten.

    Und wenn ein Spieler 2x in der Datenbank steht?
    Es sollen die einträge, wenns mehrere sind aufgelistet werden


    n
    ew query[128],ALLSTRING[500];
    GetPlayerName(pID, usedname, sizeof(usedname));
    format(query,128,"SELECT * from `Strafen` WHERE `Spielername` = '%s'",usedname);
    mysql_query(query);
    mysql_store_result();
    while(mysql_fetch_row_format(query)){
    sscanf(query,"p<|>...",....);
    format(query,128,"%s Strafe: \n",usedname,...);
    strcat(ALLSTRING,query);
    }
    mysql_free_result();


    ... da musst du selbst hand anlegen ich weiß ja nicht was du alles dort speicherst , die specifer müssen der reihenfolge der ausgelesen daten angepasst werden
    hier im Forum gibts dazu auch ein tutorial siehe sscanf 2.0 oder schau im englischen Forum nach einfach in google samp sscanf 2.8.1 eingeben

    Also wenn ich inga /save eingebe Speichert er die Kordinaten, und das dann der Keybinder (angenomen x=2y=4z=3) dort einen Command (/gate eingibt)
    Wie bekomme ich das hin das der Keybinder die Kordinaten erkennt und es dort eingibt


    Dazu benutzt du am besten die samp api für autohotkey


    am besten schaust du mal hier rein http://forum.samp-api.net/


    http://wiki.samp-api.net/index.php/Hauptseite


    Da auch dort die FUnktion IsPlayerInRangeOfPoint dabei ist ich denk mal zur benutzung wird bestimmt dort im wiki was drinne stehen


    Hier macht es sinn sscanf zu nutzen da er nicht nur zur nächsten reihe springt sondern auch den inhalt der reihen ausließt dies ist im string data dann gespeichert und diesen kann man mit sscanf dann splitten sonst würde nur in der while -schleife mysql_retrieve_row sinn machen aber nur sofern das MySQL Plugin von BlueG genutzt wird die r5 - r6 Version

    Der Code ist auch der reinste Rotz, abgesehen das ein spieler nie mehr als 24 Zeichen haben wird daher reicht da auch MAX_PLAYER_NAME bei pID.


    cache_get_field_content_int funktioniert ohne query davor auch nicht daher solltest du abprüfen ob der Spieler vllt direkt schon gemutet ist oder nicht
    und bei der funktion mysql_function_query wirst du eine funktion aufrufen und dort kannst du alles auslesen.

    ocmd:offunmute(playerid,params[])
    {
    new pID[35],query[256];
    if(!isPlayerAnAdmin(playerid,3))return SendClientMessage(playerid,GRAU,"Du bist kein "#SERVERTAG" Teammitglied./Du hast nicht den jeweiligen Adminrang.");
    if(sscanf(params,"s[35]",pID)) return SendClientMessage(playerid,WRONGCMD,"BENUTZE: Offunmute [Name]");
    mysql_format(mycon,query, 256, "SELECT `Muted` FROM `"#SERVERTAG"_Account` WHERE `Name` = '%e' LIMIT 1",pID);
    mysql_function_query(mycon,query,true,"@MYSQL_QUERY_FINISH_MUTED_CHECK","is",playerid, pID);
    return 1;
    }


    In der Funktion kannst du gleich gewisse parameter übergeben wie die playerid von dem spieler der das eingegeben hat dann kannst du diesem gleich eine nachricht schicken und natürlich den eingegeben namen um das Update query auszuführen und nicht vergessen die string mit dem platzhalter %e zu escapen


    forward @MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,pName[]);
    @MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,pName[]){
    new bool:muted = !!cache_get_field_content_int(0,"Muted");
    if(!muted)return SendClientMessage(playerid,-1,"Der Spieler wurde nicht gefunden");
    new query[256];
    format(query,64,"Du hast %s entmuted",pName);
    SendClientMessage(playerid,-1,query);
    mysql_format(mycon,query, 256, "UPDATE `"#SERVERTAG"_Account` SET `MuteTime` = '0', `Muted` = '0' WHERE `Name` = '%e' LIMIT 1",pName);
    mysql_tquery(mycon,query,"","");
    return 1;
    }


    //edit LIMIT 1 nicht vergessen

    Wenn du die sufu benutzt wirst du schon ein paar tutorials finden zu dem ist noch die frage wie dein accountsystem arbeitet. Da mann je nach Speicherungsart unterschiedlich mit timestamps arbeiten kann.