Beiträge von Kaliber

    Nun...das geht nur ganz schlecht.


    Weil die meisten Commands ja ziemlich Komplex sind und du nicht mal kurz dynamisch irgendwas erstellen kannst, was eine gewisse Komplexität mit sich bringt.


    Du kannst zwar etwas vordefinieren, worauf du zurückgreifen kannst, aber das bringt nicht wirklich was.


    Es ist doch durch CMD-Includes nicht mehr so aufwändig Commands zu erstellen und durch sscanf, kannst du diese ziemlich schnell zerlegen.


    Wozu willst du also irgendein aufwändiges "dynamisches" System erstellen, wenn es viel einfacher und schneller statisch geht? :rolleyes:

    Du fängst aber bei row 0 an...und nicht bei 1...


    Sprich schreib den Command mal so:


    ocmd:exit(playerid)
    {
    for(new i; i<sizeof(H_W); i++)
    {
    if(!IsPlayerInRangeOfPoint(playerid, 7.0, H_W[i][0], H_W[i][1], H_W[i][2])) continue;
    new v=GetPlayerVirtualWorld(playerid)-1;
    SetPlayerInterior(playerid, 0),SetPlayerVirtualWorld(playerid, 0);
    return SetPlayerPos(playerid, HausInfo[v][hX],HausInfo[v][hY],HausInfo[v][hZ]),1;
    }
    return SendClientMessage(playerid,-1,!"Sie befinden sich an keinem Haus!");
    }


    mfg. :thumbup:

    Warum zur Hölle so kompliziert? :huh:


    Machs einfach nur so:


    stock const Float:H_W[][3] = {
    {244.4221, 305.0592, 999.1484},
    {266.7091, 305.0197, 999.1484},
    {2324.4587, -1148.8004, 1050.7101},
    {235.3885, 1187.0400, 1080.2578},
    {225.7580, 1239.9197, 1082.1406},
    {223.1530, 1287.4996, 1082.1406},
    {225.7527, 1021.9715, 1084.0162},
    {295.0053, 1472.9153, 1080.2578},
    {328.0984, 1478.0658, 1084.4375},
    {386.7174, 1471.7593, 1080.1875},
    {2269.7668, -1210.4520, 1047.5625},
    {2365.2903, -1135.0590, 1050.8750}
    };


    ocmd:exit(playerid)
    {
    for(new i; i<sizeof(H_W); i++)
    {
    if(!IsPlayerInRangeOfPoint(playerid, 7.0, H_W[i][0], H_W[i][1], H_W[i][2])) continue;
    new v=GetPlayerVirtualWorld(playerid);
    printf("Welt: %d | %.02f | %.02f | %.2f",v,HausInfo[v][hX],HausInfo[v][hY],HausInfo[v][hZ]);
    SetPlayerInterior(playerid, 0),SetPlayerVirtualWorld(playerid, 0);
    return SetPlayerPos(playerid, HausInfo[v][hX],HausInfo[v][hY],HausInfo[v][hZ]),1;
    }
    return SendClientMessage(playerid,-1,!"Sie befinden sich an keinem Haus!");
    }


    Schau mal was dir geprintet wird...wenn da 0|0|0 in den Koordinaten rauskommt, stimmt die VirtuelleWelt nicht mit dem index von HausInfo überein...


    Du solltest dir vielleicht überlegen, dass alles in ein Array zu schreiben ^^


    mfg. :thumbup:

    Werde aber trotzdem gekickt, wenn ich den Namen habe.


    Machs so:


    stock const Betatester[][] = { //oben ins Skript
    "Admin","Test"
    };


    new b_name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, b_name, MAX_PLAYER_NAME);
    for(new j; j < sizeof(Betatester); j++)
    {
    if(strcmp(b_name, Betatester[j]) != 0)
    {
    SendClientMessage(playerid, COLOR_ERROR, "Der Server befindet sich in der Betaphase. Du musst eingetragen sein, um zu spielen.");
    return Kick(playerid);
    }
    }

    In einem Timer:


    Wofür brauchst du bitte einen Timer? :huh:


    Man muss die Daten doch nur 1x beim Ausloggen speichern...und da ist es immer wieder die selbe Struktur.


    Und bei Registrieren muss man halt 1x einen Insert Query ausführen und der hat natürlich auch die selbe Struktur.


    Für triviale kleine Querys, brauchst du das natürlich nicht verwenden...


    Mein Gott :rolleyes:

    Du hast das Array mit den Spalten, das macht es im Endeffekt mehr Code. Da jedes Query unterschiedlich ist, muss ich für jedes Query die Spalten neu dort angeben, das macht es eher mehr Code, als weniger.


    Dir sollte bewusst sein, wenn du meinen Text gelesen hast, dass es nur um das Speichern z.B. von Spielerdaten o.ä. geht.


    Und da reicht es 1x die Tabellen Struktur zu deklarieren, somit es es wesentlich weniger Code!


    Auf den ersten Blick sehe ich hier nicht, welches davon richtig ist, und welches falsch ist. Sowas kann schnell passieren und man merkt es nicht. Das bezieht sich auch auf die Wartbarkeit. Ich muss immer hin und her scrollen, zwischen dem rows Array und der Zeile hier, um herauszufinden, dann entweder alter oder money richtig ist. Bei einem Query mit 100 Attributen wird das lustig.


    Dir ist klar, dass es bei dem normalen format nicht anders ist du scherzkeks.


    Zudem kann man sich die Struktur auch dahin als Kommentar schreiben...


    Da sehe ich ganz genau, was zu was gehört.


    Das ist aber langsamer...
    und wie gesagt...die Struktur kann man angeben, das nicht so kompiziert als kommentar...


    Nur weiß das kaum einer.


    Ändert nichts an der Tatsache...


    Queries wird das ziemlich unübersichtlich


    Nun, wenn man es 1x am Anfang richtig gemacht hat...ist es sehr einfach weitere dazuzutun.
    Man muss das halt schritt für schritt machen, aber dafür ist es wesentlich einfacher, neue Sachen leicht hinzuzufügen.


    und ein normales Query in diesem Maße ist noch viel unübersichtlicher...


    Aber wie gesagt..ist jedem selbst überlassen wie er es macht...


    Ein paar Leute wollten so eine Include, also habe ich sie Ihnen zur Verfügung gestellt, ich verstehe dein Problem damit nicht.

    Du darfst hier kein Prepared Statement verwenden:


    Zitat

    However, they are not allowed for identifiers (such as table or column names), in the select list that names the columns to be returned by a SELECT statement, or to specify both operands of a binary operator such as the = equal sign.


    Du musst hier ein normales Query senden... :rolleyes:


    PS: Deine Nutzung ist übrigens falsch, lies dir dazu nochmal eine Dokumentation durch...

    oder wie ihr es gelöst habt.


    Da gibt es diesen Callback:


    public OnActorStreamIn(actorid, forplayerid)
    {
    SetActorPos(actorid,acInfo[actorid][ac_x],acInfo[actorid][ac_y],acInfo[actorid][ac_z]);
    SetActorFacingAngle(actorid,acInfo[actorid][ac_a]);
    return 1;
    }


    Dir sollte aufgefallen sein, dass das 3DTextLabel immer richtig sitzt, aber der Actor nicht.


    Das liegt daran, dass die Positionen zwar richtig geladen werden, der Actor an sich aber aSynchron ist und du ihn somit immer richtig setzen musst :)


    mfg. :thumbup:

    Weil ich will das ganze nämlich mit dem Wetter System zb bauen das es auch mal Wetter gibt wo Plötzlich die Stadt Überschwemmt wird Habe sowas bei Samp bisher noch nicht gesehen


    Nun in SA:MP ist das mit den bisherigen nativen Funktionen auch nicht so gut machbar.


    Wenn du sowas gut umsetzen willst und neue Features brauchst, schau dir das hier mal an: SAMPFox - Über 90 neue Natives! Jetzt für SA:MP 0.3z!


    mfg. :thumbup:

    Mehr Code


    Also eine simple Zeile ist länger, als 6 Zeilen wo man mit jedem Komma und jedem Sonderzeichen zu kämpfen hat...ok


    Langsamer


    Bei 100 Aufrufen...1ms


    Fehleranfälliger


    Eigentlich ja eher nicht.
    Wieso auch....wenn man es so macht wie ich es gezeigt habe, werden eben keine Fehler auftreten, dafür ist es ja da...man muss sich mit den Kommas etc nicht mehr rumplagen und es wird ja geprüft ob Spalten & Anzahl der Attribute übereinstimmt :)


    PS: Wenn String > 1024 kann man ihn erhöhen, das steht dann in der Konsole, genauso die anderen Fehlermeldungen...


    Unübersichtlicher als ein ganz normales Query


    Du findest eine Zeile wo du klar siehst welche Variable zu was gehört unübersichtlicher als 6 oder mehr Zeilen, die voll geschrieben sind mit Sonderzeichen und Feldern...alles klar ?(


    Schlechte Wartbarkeit


    Wieso? Wenn was nicht funktioniert...muss es ja an einem der 2 Kriterien liegen...eigentlich ist das eine sehr gute Wartbarkeit


    Allgemeinverständlichkeit (niemand weiß, dass Name|Alter für Name und Alter steht, da hätte ich wenigstens & genommen)


    Es stehen beide Zeichen indirekt dafür:


    new x,y,z
    if(x | y | z) //Hier geht der Compiler auch durch alle Variablen, anstatt bei der 1. falschen abzubrechen ^^



    Zudem kommt, dass wenn man mehrere Queries hat, die unterschiedliche Spalten in derselben Tabelle ändern, dann muss man die "rows" Variable für dieses Query jedes mal, bzw. oft, neu anlegen, das ist Speicherverschwendung, wenn man in Betracht zieht, dass kein wirklicher Vorteil dabei entsteht.


    Ich hoffe dir ist bewusst, dass man nicht gezwungen ist diese Funktionen zu verwenden, aber in den Meisten Fällen kann dies sehr praktisch sein.


    Um noch etwas anzumerken das MySQL Query von BlueG/ maddinator beinhaltet das ORM - System, damit spart man sich genug Zeit.


    Joa das ist ja jedem selbst überlassen :)

    Probier mal mein System aus, das sollte einfacher und übersichtlicher sein :)


    Es ist zwar ressourcenfressender logischerweise, allerdings macht es bei 10.000 Aufrufen nur ca 50ms Unterschied :)


    //Edit: Bei 100 aufrufen, liegt der unterschied nur bei 1ms :D