Beiträge von IPrototypeI

    Hey also derzeit ist nichts passiert hier ist mal der log hilft das iwie?


    Muss ich noch iwas einfügen oder wie mache ich das?

    Ich hoffe dir ist bewusst das dies nur ein beispiel ist

    mysql_query("SELECT * FROM `tabelle` WHERE `Name`= 'IPrototypeI'");


    du solltest schon den string mit deinem Namen formatieren


    Du hast das so in deinem skript drinne stehen
    CMySQLHandler::Query(SELECT * FROM `tabelle` WHERE `Name`= 'IPrototypeI') - An error has occured. (Error ID: 1146, Table 'neuanfang2.tabelle' doesn't exist)


    Da ist es klar das erstmal die tabelle mit dem namen tabelle nicht existiert als auch der User du musst das query schon deiner Datenbankstruktur anpassen

    p<|> , p ist ein Specifer der dafür sorgt das der string nach dem delimiter | gesplittet wird.
    du könntest also das Zeichen | gegen ein , Ersetzen und er würde danach den string ab der stelle splitten wo er ein Komma findet.


    e steht für Enum daher kannst du die werte welche gesplittet werden direkt konvertieren und an das Array weitergeben mit dem Enum als Index.



    Den String bekommst du über mysql_fetch_row_format oder mysql_fetch_row ob beide enthalten sind ist plugin abhängig.
    Bei der Version von BlueG r5 - r6 ist das vorhanden.


    daher



    new string[800];
    mysql_query("SELECT * FROM `tabelle` WHERE `Name`= 'IPrototypeI'");
    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]);
    mysql_free_result();


    dann wird der string danach welcher bei mysql_fetch_row_format zurück gegeben wird gesplittet


    Syntax von mysql_fetch_row_format


    mysql_fetch_row_format(string[], const delimiter[], connectionHandle);


    Hier kannst du den delimiter ändern zum Beispiel zum Komma "," oder was auch immer standartmäßig wird dieses Zeichen verwendet |.
    Es ist das Zeichen welches die ausgelesenen Ergebniss der Spalten trennt in dem string.


    Fehler, welche passieren können ist, wenn der string zu kurz ist oder die Abfolge der Specifer nicht stimmen. So bleibt das Ergebniss leer und "nix" wurde geladen.

    öhm die beste variante ist aber


    if(adminlevel == wert)
    else if(adminlevel == wert) und so weiter?!


    nein ist sie nicht wenn du meinen text lesen würdest


    switch(adminlevel){
    case 1:
    case 2:
    ....
    }


    wäre die schnellste Möglichkeit und die Beste.


    Jedoch hat dies nix mit dem hier geschilderten Problem zutun


    Also beim 2 . und die anderen immer


    else if

    Mal abgesehen davon das man einiges an dem Befehl besser machen könnte ist die nicht verwendung von else if nicht das Problem sondern das return 1; in der schleife welches
    des code danach abbrechen lässt wie die schleife an sich auch.


    Zu dem ist die verwendung von switch und case schneller als else if und funktionieren nach dem selben prinzip das sollte eine Bedingung stimmen das die weiteren nicht
    zusätzlichen noch abgefragt werden.

    Öhm ich versteh nur die hälfte Sendet mir bitte jemand die cords (x,y,z); um es nach recht zu verschieben ?


    Zumal ist deine Ansicht von den X und Y koordinaten nicht richtig es kommt auf die Rotation an und von welchem blickwinkel man das betrachtet.


    Wenn du tore in interiors mappen willst benutz dazu einfach den Samp mapeditor und setze die Kamera an die jeweiligen Punkte hin die Koordinaten findest du hier von den Interiors
    http://weedarr.wikidot.com/interior


    Daher einfach das Tor hinsetzen und danach mit den Pfeiltasten spielen womit du die Objekte verschieben kannst.


    Dein Ernst ?


    schonmal was von Defines gehört
    NichtBefugt(%0) SendClientMessage(%0, GRAU, "Du bist nicht befugt!");
    NichtVerbunden(%0) SendClientMessage(%0, GRAU, "Dieser Spieler ist nicht mit dem Spiel verbunden!");


    Du kannst ja gern mal dein skript via #pragma compress 0 und öffne deine .amx danach mit einem hexeditor dann siehst mal die spannen an Opcodes mehr was dein code zurücklegen muss

    Von außen sieht es ziemlich kahl aus daher würde ich dir empfehlen Texturen zu setzen dies geht mit der Funktion
    SetObjectMaterial( Beim benutzen eines Streamer weicht der Name der Funktion ab beim streamer plugin ist es SetDynamicObjectMaterial)


    Beispiel bei meiner angefangenen Fahrschulebase



    und nun ohne Texturen




    Das ist ein unterschied wie Tag und Nacht, daher probier es auch mal.

    ocmd:car(playerid,params[]){
    if(CarTrue[playerid] != 0)return SendClientMessage(playerid, ROT, "Du hast bereits ein Fahrzeug!");
    if(!isPlayerAnAdmin(playerid, 4)) return ErrorMessages(playerid, 4);
    new carData[3],Float:Pos[4],;
    if(sscanf(params,"k<vehicle>ii",carData[0],carData[1],carData[2])return SendClientMessage(playerid,ORANGE,"Benutzung: /car [Model/ID] [Farbe1] [Farbe2]");
    if(carData[0] == -1)return SendClientMessage(playerid, ROT, "ERROR: Ungültige Vehicle Model ID!");
    GetPlayerPos(playerid, Pos[0],Pos[1],Pos[2]);
    GetPlayerFacingAngle(playerid,Pos[3]);
    DestroyVehicle(CarTrue[playerid]);
    CarTrue[playerid] = CreateVehicle(carData[0], Pos[0]+3,Pos[1],Pos[2], Pos[3],carData[1],carData[2], -1);
    LinkVehicleToInterior(CarTrue[playerid],GetPlayerInterior(playerid));
    format(string, sizeof(string), "|- Du hast einen "%s" gespawned (Model: %d) with Colours: %d,%d -|", VehicleNames[carData[0]-400], carData[0], carData[1],carData[2]);
    return SendClientMessage(playerid,HELLBLAU, string);
    }


    Warum so umständlich wozu gibt es die Pluginversion dort kannst du auch deine eigene specifer erstellen vehicle ist schon vordefiniert siehe sscanf include
    SSCANF:vehicle(string[]) ...

    Es kommt drauf an wie du das ganze verwendest. Solltest du die id beim Laden der Häuser auch auslesen so kannst du Lücken via Schleife finden und diese direkt zuweisen beim neu erstellen eines Hauses.


    Eine weitere möglichkeit ist den ganzen Einträgen beim auslesen eine neue Id zuweißen. Falls du diese nicht anderweitig benutzt.


    Solltest du die Idee nicht wirklich nutzen so kannst du gleich dein Id auf Autincrement stellen.


    Zu dem wäre das auch mit einem SQL-Befehl möglich wäre je nach Art jedoch ein wneig umständlich.

    Ich habe immer nur beim definieren des strings die länge angegeben, aber nicht mehr wenn ich es mit sscanf genutzt habe.
    Bisher hatte ich damit keine probleme.


    Aber jetzt hab ich auch noch etwas dazu gelernt ^^


    Die Warnings String Buffer Overflow, welche in der Serverlog angezeigt werden resultieren darraus , wenn man die Stringlänge vergisst anzugeben. Dies jedoch nur sollte man das Sscanf-Plugin verwenden. Bei der Funktion , welche noch viele nutzen ist das nicht der Fall, jedoch ist es dabei möglich den String zu überladen was letztendlich den Server offline setzt siehe SoL Skript (/sirene , /kofferraum).


    finde es auch amüsant,dass 1000sende spieler die Lust am spielen verlieren


    Auf 1000 Tausend oder mehr kommt es auch nicht an, dass ist nur ein Bruchteil. Dennoch denk ich nicht das die Leute kein Bock mehr auf Samp haben nur, weil sie auf einmal
    eine .exe bekommen oder paar Autos abkriegen.


    http://dev.future-elife.com/sampstats/


    Zudem gibts es noch schlimmere Hacks als paar Crasher, Trollbeit und weitere bösartige Cleos.


    Find ich ja schon irgendwie mies. Da wird die ganze Community heiss gemacht und dann sowas. Naja gut. Das wird für mich aber sicherleich kein Grund sein dort zu spielen. Dennoch danke ich dir, für die Aussage.


    Wie schon gesagt es wäre eine Vermutung , daher ist das keine tatkräftige Aussage.

    IPrototypeI:
    Mich würde auch interessieren, was draus geworden ist. Wäre nömlich eine bereicherung für uns. :S


    Das ganze kann ich dir nicht beantworten ob überhaupt noch weitergearbeitet wird. Soweit ich mal vermute, da BlackAce nichts mehr machen kann und von MyU hört man nix mehr diesbezüglich, da dieser als einzigster Zugang zu allen Sourcen hat Client als auch Plugin, würde ich sagen das dieses Projekt solang auf Eis liegt. Vllt wird ja daran weiter gemacht, wenn Future e-Life on geht entweder dann als Feature für den Server oder als Promo veröffentlicht.

    8| wie meinst du das ? erklär mir das bitte mal bzw was soll mir das bringen


    Hat er doch geschrieben wenn die string gleich sind wird 0 zurück gegeben du fragst ab ob strcmp 1 zurück gibt und das bedeutet in dem fall das die String nicht gleich sind.
    Daher änderst du
    if(strcmp(hash, pInfo[playerid][Password], true))


    zu


    if(strcmp(hash, pInfo[playerid][Password], true)==0)

    oder
    if(!strcmp(hash, pInfo[playerid][Password], true))



    siehe auch
    http://wiki.sa-mp.com/wiki/Strcmp


    Zu dem musst du abprüfen ob die eingabe nicht leer ist das kannst mit


    if(!inputtext[0])
    oder


    if(inputtext[0]==EOS)


    oder
    if(inputtext[0]=='\0')
    machen

    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; }


    tja das sollte man auch etwas umstellen


    stock GetFraktion(leader){
    new fName[20]="Unbekannt";
    switch(leader){
    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;


    }

    Ich hatte es ja deinem Kollegen schon via PN gepostet auf die Anfrage dies zu machen



    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 data[64],pLeader,pName[MAX_PLAYER_NAME],ShowList[500];
    mysql_query("SELECT `Name`, `Leader` FROM `users` WHERE `Leader` > 0");
    mysql_store_result();
    while(mysql_fetch_row_format(data)){
    sscanf(data,"p<|>s[20]d",pName,pLeader);
    format(data,64,"%s Leader: %s\n",GetFraktion(pLeader),pName);
    strcat(ShowList,data);
    }
    mysql_free_result();
    ShowPlayerDialog(playerid,325,DIALOG_STYLE_LIST,"Leaders",ShowList,"Bestätigen","");
    }

    Aber wird der Gamemode dadurch nicht ausgebremmst ? 8| oder habe ich das irgendwie falsch verstanden ?


    Nein natürlich nicht die Anweisungen , welche ausgeführt werden , werden step by step verarbeitet. Wenn du ein query absendest wartet dein Skript nicht solange bis was zurück kommt. Das query wird vom MySQL Server verarbeitet und wenn die Ergebnisse gefunden werden , werden diese verarbeitet vom SA:MP Server Prozess.

    Das liegt daran das ein Objekt von den texturen her verschiedene Materialindexe hat.


    SetObjectMaterial(objectid, materialindex, modelid, txdname[], texturename[], materialcolor);


    Diese Indexe können von 0 - 40 gehen es ist vom Objekt abhängig einfach mal durchprobieren.
    Die anzahl der indexe siehst du mit entsprechenden texturen mit dem samp mapeditor