Beiträge von IPrototypeI


    maddin warum nur format ? Für was gibt es die möglichkeit strcatzu nutzen oder das ganze in dem Fall direkt gleich zu setzen.
    case 0: wName="Fist";
    case 18: wName="Molotov Cocktail";
    case 44: wName="Night Vis Goggles";
    case 45: wName="Thermal Goggles";
    default: wName="Invalid Weapon Id";



    Das ganze hat optimierungspotenzial mit gepackten strings und stock const was zusätzlich den memory verbrauch reduziert bei der Benutzung.


    stock const WeaponNames[44][20 char] = {
    !"Unarmed",!"Brass Knuckles",!"Golf Club",!"Night Stick",!"Knife",!"Baseball Bat",!"Shovel",!"Katana",
    !"Chainsaw",!"Purple Dildo",!"White Dildo",!"Long White Dildo",!"White Dildo 2",!"Flowers",!"Cane",
    !"Grenades",!"Tear Gas",!"Molotovs",!"Pistol",!"Silenced Pistol",!"Desert Eagle",!"Shotgun",!"Sawn Off Shotgun",
    !"Combat Shotgun",!"Micro Uzi",!"Mac 10",!"MP5",!"AK47",!"M4",!"Tec9",!"Rifle",!"Sniper Rifle",!"RPG",!"Missile Launcher",
    !"Flame Thrower",!"Minigun",!"Sachel Charges",!"Detonator",!"Spray Paint",!"Fire Extinguisher",!"Camera",
    !"Nightvision Goggles",!"Thermal Goggles",!"Parachute"
    };

    Oke also nicht wichtig danke^^


    Du kannst das mit einem zusätzlichen kompileparameter hinzufügen


    Dazu erstellst du in deinem Pawno ordner eine .cfg datei mit dem Namen pawn.cfg und schreibst in diese -d3 oder -d2 rein damit wird dein skript mit mehr informationen kompilt


    Diese Nachricht wie du sie gepostet hast erscheint dann wenn dein dynamischer Memory zu hoch ist
    so bekommt den warning weg wenn man dies via #pragma dynamic anpasst

    Naja ich weiß Grad nicht wie ich das scripten soll? Hab ins enum pSerial ist ja ein String wie frag ich ab ob beim cdonnerten der serial der gleiche also ser gebannte ist?


    Wie wäre es wenn du die Hashes in einem file doer datenbank speicherst, wenn du diesen bannst. Dann solltest du den Hash des Users , welcher auf den Server Connectet auslesen und danach mit den anderen
    in dem File oder der Datenbank vergleichen.

    Also ich weiß ja nicht was du machen willst , jedoch so klappt das nicht wie du willst.




    Ich hab dir mal eine Funktion geschrieben damit kannst du das ganze abgleichen
    CheckPass(cstring[],wstring[])return ((strlen(cstring) < 50 && cstring[0])?((!strcmp(cstring,wstring,true)?(1):(2))):(0));
    Verwendung
    switch(CheckPass(inputtext,Safe[AnSafe(playerid)][Loesung])){
    case 0:ShowPlayerDialog(playerid,DIALOG_SAFE,DIALOG_STYLE_INPUT,"Safe Lösungswort","Bitte gebe nun das von dir geschätze Lösungswort ein:","Bestätigen","Abbrechen");
    case 1:SendClientMessage(playerid,HELLBLAU,"Du hast das Wort herrausgefunden");
    case 2:SendClientMessage(playerid,WRONGCMD,"Das Wort war leider falsch. Viel Glück beim nächsten mal.");
    }

    Das liegt an deinem MySQL Plugin , welches nicht geladen wurde.
    Ich denk mal das liegt an deinem OS , welches für den vServer , Root genutzt wird.
    Daher ist es das beste du setzt dich mal mit maddint0r in Kontakt.


    //edit es gibt in dem Ordner ja zwei linux plugins kannst ja beide mal testen mysql.so und mysql_static.so


    Wenn er das jetzt so macht bekommt er später Probleme aufgrund des fehlenden Null 'Zeichens'


    Also ein Größer
    new nummerschild[2][3];


    sscanf kann so bleiben :thumbup:


    sscanf würde ich nicht so lassen wenn der spieler das ganze so eingibt sollte man auch nach dem Zeichen "-" splitten und nicht nach dem leerzeichen



    enum kenzeichen {
    Block1[3],
    Block2[3],
    Block3,
    }


    new Kennzeichen[kenzeichen];
    sscanf(inputtext,"p<->e<s[3]s[3]i>",Kennzeichen)



    Ich weiß ja nicht ob du dich mit defines auskennst mit Directives. Defines sind dazu da dir alles etwas leichter zu machen. Da du diese erstellen kannst und das was sich dahinter verbirgt
    nicht extra immer und immer wieder schreiben musst. Beim Kompilen existieren defines nicht mehr da diese ersetzt werden mit den code elementen was sich dahinter verbirgt.


    Daher ist das ganze auch logisch


    return PlayerName(playerid);
    würde so kompilt werden


    return PlayerInfo[playerid][pName];;


    resultat => Error daher einfach das Semicolon entfernen beim Define :D



    Zum Thema Skripten will ich dir mal paar Tipps geben.


    Bitte wenn du ein string zusammenfügen willst ohne Platzhalter benutzt dazu nicht format , dazu gibt es strcat oder memcpy. Zu dem wenn der string in einer Anweisung deklariert ist
    wie bei deinem einen Befehl.


    ocmd:zeigescheine(playerid,params[])
    format(string,sizeof(string),"Führerschein: Nicht Bestanden");


    entweder
    strcat(string,"Führerschein: Nicht Bestanden");
    und davor
    strdel(string,sizeof(string));


    oder


    string="Führerschein: Nicht Bestanden";


    Als weiteres benutz doch Bit-Arrays, wenn du nur 1 wert specihern musst
    Das kannst du selbst machen oder eine include verwenden wie r-bits oder y_iterator.


    also weiteren Punkt du benutzt ja schon in deinem enum pName warum dazu noch eine extra Funktion um den Namen zurückzugeben
    einfach bei OnPlayerConnect
    GetPlayerName(playerid,PlayerInfo[playerid][pName],MAX_PLAYER_NAME+1);


    und oben das define

    #define PlayerName(%0) PlayerInfo[%0][pName];


    Zu Thema Dialog
    benutz doch auch ein enum dazu das nimmt dir viel Arbeit ab


    enum {
    Dialog_Reg,
    DIALOG_GESCHLECHT,
    }


    Dialog_Reg hat nun den wert 0 und DIALOG_GESCHLECHT 1 du kannst auch direkt bei 1 einsteigen


    enum {
    Dialog_Reg=1,
    DIALOG_GESCHLECHT,
    }


    Ahja so nebenbei
    "#HTML_WHITE"
    ist nicht nötig da reicht "HTML_WHITE" man verwendet # nur dann wenn man " " nicht verwenden kann und andersrum ist eine kleine Zeitersparnis :D


    PlayerInfo[playerid][LastLogin]
    dazu muss man nicht umbedingt einen das ganze auslesne und als string formatieren dazu gibt es den SQL befehl NOW() und zum auslesen auch DATE_FORMAT :D



    xD zur anschuldigung wegen der PRP skript muss ich sagen sind ja Absurd


    Beispiel das Mutesystem

    forward @MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,UnMuteName[]);
    @MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,UnMuteName[])
    {
    new bool:muted = !!cache_get_field_content_int(0,"Muted");


    Ich glaube nicht das du sowas dort findest da erstens der Ersteller vom Prp bestimmt nichtmal weiß wozu das gut ist und zweitens ist das von mir was ich für ihn geschrieben habe bei seinem Problem Thread zum dem Thema hier im Forum.



    Zu den Farben das soll ja wohl ein witz sein seit wann sind Farbcodes Copyright bei jemanden, genau bei den anderen Funktionen diese anderszuschreiben macht doch auch kein Sinn.(isPlayerInFrakt, PlayerTalkPublic nun gut dort hätte man ja wenigstens ein Array nutzen können).

    Vielen Dank für das feedback


    MFG


    PAWN


    Zum Thema i , i steht für Integer nicht id.


    An deiner Stelle würde ich das einfach über eine Array laufen lassen und nicht über 2 Arrays und diverse unnötige Schleifen.
    Zuzüglich möchte ich dich mal aufklären auf die verwendung von break in schleifen diese kannst du nutzen um die Schleife abzubrechen da es nicht umbedingt nötig ist
    bei deinem call-befehl die schleife obwohl ein treffer erzielt werden konnte fortzuführen. Als weiterer Punkt ist es wenn du schon eine konstante Länge hast bei einem string so diese bei format auch zu nutzen da Konstante Werte immer schneller verarbeitet werden als dies erstmal auszulesen. Du hast ein kleinen Fehle runten bei OnPlayerText dies ist ein string also text kein integer.


    Ich denk mal mit dem ersten Punkt wirst du nix anfangen können daher habe ich dir das mal umgeschrieben


    new Anrufer[MAX_PLAYERS] ={ -1,...};


    command(h, playerid, params[])
    {
    if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy");
    if(Anrufer[playerid] == -1)return SendClientMessage(playerid,Rot,"Du wurdest nicht angerufen!");
    new str[128];
    format(str,128,"%s hat aufgelegt!",GetName(playerid));
    SendClientMessage((Anrufer[playerid]-1),Rot,str);
    format(str,128,"Du hast das Telefonat mit %s beendet!",GetName((Anrufer[playerid]-1)));
    SendClientMessage(playerid,Gelb,str);
    printf("Hier %d",Anrufer[playerid]);
    Anrufer[(Anrufer[playerid]-1)] = -1;
    Anrufer[playerid] = -1;
    return 1;
    }
    command(call, playerid, params[])
    {
    if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy!");
    if(Anrufer[playerid] != -1)return SendClientMessage(playerid,Rot,"Du telefonierst schon!");
    extract params -> new nummer;else return SendClientMessage(playerid,Weiß,"Befehl : /call [nummer]");
    if(nummer == sStats[playerid][sNummer])return SendClientMessage(playerid,Rot,"Du kannst dich nicht selber anrufen!");
    for(new i; i<MAX_PLAYERS; ++i){
    if(sStats[i][sNummer] != nummer)continue;
    if(Anrufer[i] != -1)return SendClientMessage(playerid,Rot,"Dieser Spieler telefoniert schon!");
    Anrufer[i] = playerid;
    Anrufer[playerid] = i;
    new str[128];
    format(str,128,"%s ruft dich an, /p zum annehmen /h zum auflegen!",GetName(playerid));
    SendClientMessage(i,Gelb,str);
    format(str,128,"Du rufst %s an warte auf eine Antwort!",GetName(i));
    SendClientMessage(playerid,Gelb,str);
    break;
    }
    return 1;
    }
    command(p, playerid, params[])
    {
    if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy!");
    if(Anrufer[playerid] == -1)return SendClientMessage(playerid,Rot,"Du wurdest nicht angerufen!");
    new str[128];
    format(str,128,"%s hat den Hörer abgenommen!",GetName(playerid));
    SendClientMessage(Anrufer[playerid],Gelb,str);
    SendClientMessage(playerid,Weiß,"Angenommen!");
    Anrufer[Anrufer[playerid]] = playerid+1;
    Anrufer[playerid] = Anrufer[playerid]+1;
    return 1;
    }
    public OnPlayerText(playerid,text[])
    {
    if(Anrufer[(Anrufer[playerid]-1)] == (playerid+1))
    {
    new str[128];
    format(str,128,"(Handy) %s : %s",GetName(playerid),text);
    SendClientMessage((Anrufer[playerid]-1),-1,str);
    return 0;
    }
    return 1;
    }

    Es kommt drauf an ob du ein cmd prozessor benutzt oder den Befehl unter OnPlayerCommandText hast .
    Beim einen kannst die funktion direkt aufrufen oder via CallLocalFunction bei OnPlayerCommandText ist dies nicht anders entweder auch wieder über CallLocalFunction
    oder das ganze normal aufrufen für den Spieler OnPlayerCommandText(playerid, "/gate"); .

    So ich wollte dir schon gestern schreiben bin jedoch dann offline gegangen hast du auch FCNPC_SetUpdateRate gesetzt


    Hier mal ein ganz einfacher code


    FCNPC_SetUpdateRate(30);
    new npcid = FCNPC_Create("Test");
    FCNPC_Spawn(npcid, 0, 815.26093, -1090.85486, 29.08000);
    FCNPC_GoTo(npcid, 0.0, 0.0, 0.0, MOVE_TYPE_RUN, 0.0, 1);


    damit sollte ein bot mit diesem namen connecten ohne probleme und zum 0 Punkt laufen ich hoffe du hast die npc anzahl hochgeschraubt.


    Ps:
    Hier gibt es auch beispiel skripts zum downloaden
    https://code.google.com/p/fcnpc/downloads/list


    das bg filterskript und das citizen sind ganz witzig.


    Man sollte sich eine basis schaffen bevor man weiter springt


    Da Thread Querys und Caching was anderes ist und bevor man an sowas ran geht sollte man auch wissen was man macht um sein horizont zu erweitern und um mit neuem effizent umzugehen.
    Ich weiß ja nicht ob du schonmal was von einem hermeneutischen zirkel gehört hast.
    Aber ich sags mal so wenn du richtig einsteigen willst wird das noch erbärmlicher als das was du momentan schon postest.


    Ich zitiere

    Zitat

    error 017: undefined symbol "query"
    mysql_query(query);


    Ich hatte davor noch was anderes dort stehen und hab das nicht entfernt und es sollte logisch auf der Hand liegen das dort der string mit dem SQL Befehl rein muss
    mysql_query(string);

    stock SpielerLaden(playerid)
    {
    if(IsPlayerNPC(playerid))return 1;
    new string[800],esString[MAX_PLAYER_NAME];
    GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
    mysql_real_escape_string(SpielerInfo[playerid][pName],esString);
    format(string,100,"SELECT * FROM `SpielerKonten` WHERE `Name`= '%s' LIMIT 0,1",esString);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row_format(string);
    sscanf(string, "p<|>e<s[24]s[128]iiis[128]s[128]iiiiiiis[24]s[128]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffiiffiiiiii>", SpielerInfo[playerid]);
    return mysql_free_result();
    }


    mysql_format und den platzhalter %e kann man auch verwenden beim formatieren jedoch bnötigt man dazu noch den verbindungshandler und das jetzt zu suchen und da einzutragen wollte ich dir ersparen.


    //edit
    Ahja es macht kein SInn abzuprüfen ob der Spieler verbunden ist da wenn diese funktion aufgerufen wird der Spieler zu 100% auf dem Server sein wird.
    Zum Thema splitten
    Die Abfolge an Variabeln im Enum muss der, der Tabelle entsprechen



    Zum Thema Plugin , solltest du dich ein wenig damit auskennen so empfehle ich dir dan umzusteigen entweder auf die r7 r33 oder dan schon höher Version von BlueG/ maddinat0r oder auf das MySQL & PostgreSQL Plugin von Dan.. , weil diese sind die zwei besten MySQL Plugins momentan


    Brauchen die auch Recordings? Weil ich würde halt gerne das mehrer NPC so knapp (40) Durch ganz LS/SF/LV fahren aber auch ausweichen.


    Ja/Nein Du kannst records benutzen brauchst es nicht am besten ladst du dir das plugin runter und die beispiel skripts und testest dich einfach durch die Funktionen des Plugin.