Beiträge von IPrototypeI


    Ich geh mal davon aus das du als TG schüler wahrscheinlich im zweiten Jahr bist da man erst ab diesem Jahr die wahl hat Naturwissenschaftlichefächer 4 Stündig oder 2 Stündig zu nehmen jedoch dazu Informatik und du bestimmt nicht wirklich mit der Materie vertraut bist.
    PAWN ist jedoch eine sehr einfach programmiersprache, welche jedoch auch nur eine ableitung von C ist daher gibt es zum beispiel beim reinen C# gewisse ähnlichkeiten.
    Nun gut lange Rede kurzer Sinn. Ich hoffe dir ist bewusst das Dini ein Speichersystem ist beziehungsweise Filesystem und ein enum ist nur ein Schlüsselwort was ein aufzählungstyp ist.
    Daher bestehen dabei keine gemeinsamkeiten außer vllt das es je nach dem als index als array temporär daten speichert.


    Ich weiß ja nicht was du machen möchtest ob du das System hier dynamisch gestalten möchtes,t wo du ingame neue strecken fest legen kannst oder weiß der Geier was du mit DINI einbringen willst.


    Zu dem kann der kompiler nicht durch ein #define abstürzen was so gesehen beim kompielen gar nicht existiert. sonder als normale zahl wieder gegeben wird.


    Hmm Kunstunterricht ja, war aber immer scheiße. Hab dann so schnell wie möglich Musik genommen, wobei dass auch irgendwann scheiße war.^^


    xD ich hatte auch Musik und muss sagen BK wäre mir da lieber gewesen naj aist ja auch vom Lehrer abhängig.


    Naja zum thema logo man hätte auch sowas machen können




    jedoch erfüllt sowas auch nicht wirklich das was ein Logo bewerkstelligen sollte nämlich einem im Kopf zu bleiben

    SetTimerEx währ schon schonender ;)


    Würde ich nicht sagen vllt bei einem spieler . Jedoch macht es die Masse aus 30 Timer die für jeden spieler sind und jede 1 Sekunde updaten sind ressourcenfressender
    als 1 Timer. Als beispiel bei 30 Usern zu dem ist der knack punkt immer der wenn alle zur selben zeit updaten.

    Ein Logo für SAMP Extension zu machen ist extrem schwierig , wenn es auch noch passend sein sollte zum Namen.
    Ich mach mir auch schon seit einer Woche Gedanken drüber und mir sind auch noch keine so kreativen Einfälle gekommen, auch nicht im schlaf.


    Also du machst es in meinen Augen ziemlich umständlich und ressourcenfressend


    #define MAX_DSPOINTS 10


    enum fPoints
    {
    Float:x,
    Float:y,
    Float:z,
    Float:size,
    };
    new DrivingSchoolPoints[MAX_DSPOINTS][fPoints] ={
    {83.2499,-112.4267,0.5920,5.0},
    {76.4198,-93.9598,0.3915,5.0},
    {64.6095,-70.2833,0.3149,5.0},
    {45.9960,-43.9335,0.6408,5.0},
    {23.3448,-20.6985,2.8386,5.0},
    {-14.2797,-17.2095,2.8226,5.0},
    {-25.9122,-37.3183,2.8226,5.0},
    {-36.4352,-66.5518,2.8226,5.0},
    {-44.8992,-96.2774,2.8226,5.0},
    {-53.1776,-126.4076,2.8194,5.0}
    };


    new DSPoint[MAX_PLAYERS char],
    str[35];



    if (strcmp("/start", cmdtext, true, 6) == 0)
    {
    DSPoint[playerid] = 0;
    SetPlayerCheckpoint(playerid,DrivingSchoolPoints[0][x],DrivingSchoolPoints[0][y],DrivingSchoolPoints[0][z],DrivingSchoolPoints[0][size]);
    return 1;
    }


    public OnPlayerEnterCheckpoint(playerid)
    {
    if(IsPlayerInRangeOfPoint(playerid,DrivingSchoolPoints[DSPoint[playerid]][size],DrivingSchoolPoints[DSPoint[playerid]][x],DrivingSchoolPoints[DSPoint[playerid]][y],DrivingSchoolPoints[DSPoint[playerid]][z]) && IsPlayerInAnyVehicle(playerid)){
    if(DSPoint[playerid] == (MAX_DSPOINTS-1)){
    DisablePlayerCheckpoint(playerid);
    return SendClientMessage(playerid,-1,"Du hast es geschaft");
    }else{
    DSPoint[playerid]++;
    SetPlayerCheckpoint(playerid,DrivingSchoolPoints[DSPoint[playerid]][x],DrivingSchoolPoints[DSPoint[playerid]][y],DrivingSchoolPoints[DSPoint[playerid]][z],DrivingSchoolPoints[DSPoint[playerid]][size]);
    strdel(str,0,sizeof(str));
    format(str,35,"Du bist in Checkpoint %d",DSPoint[playerid]);
    return SendClientMessage(playerid,-1,str);
    }
    }
    return 1;
    }


    Ich hab dir mal sowas schnell erstellt zum testen musst du dir nur kurz ein command erstellen um ein auto zu spawnen.
    Den string brauchst du nicht zu beachten ist nur eine kleine spielerei wie die formatierung des textes und sendens bei OnPlayerEnterCheckpoint(playerid).


    Nun gut zur erklärung als aller erstes habe ich ein enum erstellt mit den folgenden werten welche im array als index verwendet werden.
    x , y, z und die größe size daher hat dieses 2 dimensionales array 4 Spalten so kann man sich dies vorstellen es geht natürlich auch nochmal anders mit der verwendung des arrays
    ohne enum da es alles floats sind:



    new Float:DrivingSchoolPoints[MAX_DSPOINTS][4] ={
    ...
    }


    Nun gut das #define definiert die anzahl an einträge in dem array dies kann man auch weg lassen nur meiner meinung nach ist mit sowas lieber als
    immer sizeof(DrivingSchoolPoints) wo er sich den wert her holt das #define hat daher ein konstanten Wert.
    DSPoint[MAX_PLAYERS char];
    hast du auch verwendet in ihr wird der jeweilige punkt bei dem er ist gespeichert das char sorgt dafür das das array nicht so groß ist kann jedoch nicht wie normale integer
    sehr hohe negative bis sehr hohe positive werte speichern sondern nur werte von 0 - 256 daher verbraucht es auch weniger bytes eine Zelle kostet somit 8 Bits einem Byte
    das bedeutet er könnte vom internationalen Zeichen eins wiedergeben.


    Bei dem command /start setze ich das 1D array DSPoint[playerid], welches für den spieler definiert ist auf 0 sollte man dan im gamemode auch machen wenn ein spieler connectet
    um so gesehene Tricks(Bugs) zu vermeiden zu dem wird hier der erste checkpoint erstellt ich man kann dort natürlich wo das 0 steht auch DSPoint[playerid] einfügen es beinhaltet
    den wert 0 jetzt daher macht es zu dem zeitpunkt auch kein unterschied.


    Nun kommen wir zu dem Callback OnPlayerEnterCheckpoint(playerid) welches aufgerufen wird wenn ein spieler ihrgend ein checkpoint betritt.
    Dazu soll der spieler in einem auto sein und an der jeweiligen position sich befinden für den radius würde hier der radius des checkpoints eingestellt macht ja auch sinn
    und das restliche erklärt sich ja von selbst das && gibt die zusätzlich bedingung das er am punkt sein muss und in einem auto.
    Hier wird nun nicht wie vorher 0 eingesetzt man hat ja natürlich mehr checkpoints und will auch durch alle durch kommen sondern der wert der sich dann hinter
    DSPoint[playerid] verbirgt. Das bedeutet sollte dieser 9 Sein so weiß das skript ok hier ist ende daher auch der text. So nun haben wir in der zweiten if abfrage jedoch
    (MAX_DSPOINTS-1) stehen der wert für MAX_DSPOINTS ist ja 10 warum dann nicht einfach auch das system umändert das es mit DSPoint[playerid] übereinstimmt.
    Das in der klammer hat den wert 9 den man letzt endlich hat da die array von 0 an beginnen 0, 1, 2, 3 .. 9 sind jedoch 10 Werte und hier wird vergliechen ob MAX_DSPOINTS
    der dne wert 10 hat -1 dem von DSPoint[playerid] entspricht sollte dies so sein ist die "Prüfung" fertig. Das return hier gibt die naricht zurück welche den wert 1 hat also
    könnte man das auch durch nur ein return 1; ersetzen und bricht den code für dne spieler dort ab . Sollte nun DSPoint[playerid] nicht den wert 9 haben so kommt das else ins spiel was ja auch auf deutsch sonst heißt. Wenn... sonst ... . Dort wird DSPoint[playerid] immer um 1 erhöht durch das ++ += 1 würde auch gehen.
    Und der nächste checkpoint wird danach angezeigt. strdel wird benutzt um den string zu leeren man kan auch nur einen string benutzen für sein gamemode jedoch immer
    wieder leeren sonst wird er nur zu einem teil überschrieben.


    eine globalevriabel erstellen und diese hochzählen lassen. zu dem benutzt man um was neues zu definieren ein new klein geschrieben
    und du musst den wert 1 zurück geben return 1;.
    Zu dem benutz mehr arrays da diese weniger memory verbrauchen. Sollte dies die einzigsten pickups auf dem Server sind kannst du sogar solang die anzahl nicht über 256
    geht ein char in der array benutzen um sogar die memory noch mehr zu drücken und man benutz nun nur 8 bytes pro reihe.



    #define MAX_PICK 100
    new Pick[MAX_PICK], PickID;
    ocmd:create(playerid,params[])
    {
    if(PickID >= MAX_PICK)return SendClientMessage(playerid,-1,"Du kannst keine Pickups mehr erstellen");
    new Float:Pos[3];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    Pick[PickID] = CreatePickup(1234,0,Pos[0],Pos[1],Pos[2],-1);
    PickID++;
    return 1;
    }

    Ich weiß es ja nicht wirklich , aber was bitte schön hast du an dem kleinen update gemacht ich hab mal beide pastbins mal angeschaut von ocmd 2.0.1 und 2.0.2


    was hast du den da geupdatet bis auf das du dies ergänzt hast.


    2.0.1
    supports samp 0.2X, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e
    2.0.2
    supports samp 0.2X, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e, 0.3x


    pastebin 2.0.1

    /*
    OCMD 2.0.1
    by Kleiner Opa
    best command-solution for sa:mp
    supports samp 0.2X, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e
    email: fisch70000@gmail.com
    http://forum.sa-mp.de/index.php?page=User&userID=24998
    */


    #include <a_samp>


    forward ocmdOnPlayerCommandText(playerid,cmdtext[]);
    #if defined OCMD_BEFORE_CALLBACK
    forward BeforePlayerCommandText(playerid,cmdtext[]);
    new bool:ocmdBeforeCallback,bool:ocmdInit;
    #endif


    #define ocmd:%1(%2) forward ocmd_%1(%2);\
    public ocmd_%1(%2)


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    #if defined OCMD_BEFORE_CALLBACK
    if(!ocmdInit)
    {
    if(funcidx("BeforePlayerCommandText")!=-1)ocmdBeforeCallback=true;
    ocmdInit=true;
    }
    #endif
    new ocmdStr[32]="ocmd_",
    i=1,
    #if defined OCMD_COMMAND_LOG
    ocmdName[MAX_PLAYER_NAME],
    #endif
    bool:ocmdNoParams;
    #if defined OCMD_COMMAND_LOG
    GetPlayerName(playerid,ocmdName,sizeof ocmdName);
    printf("[cmd] [%s]: %s",ocmdName,cmdtext);
    #endif
    #if defined OCMD_BEFORE_CALLBACK
    if(ocmdBeforeCallback&&!CallLocalFunction("BeforePlayerCommandText","ds",playerid,cmdtext))return 1;
    #endif
    for(;i<128;i++)
    {
    if(!cmdtext[i]||cmdtext[i]==' ')
    {
    if(!cmdtext[i]||!cmdtext[i+1])ocmdNoParams=true;
    break;
    }
    ocmdStr[i+4]=tolower(cmdtext[i]);
    }
    if(!ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid,cmdtext[i+1]))return 1;
    if(ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid," "))return 1;
    return CallLocalFunction("ocmdOnPlayerCommandText","ds",playerid,cmdtext);
    }


    #define OnPlayerCommandText ocmdOnPlayerCommandText


    pastebin 2.0.2


    /*
    OCMD 2.0.2
    by Kleiner Opa
    best command-solution for sa:mp
    supports samp 0.2X, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e, 0.3x
    email: fisch70000@gmail.com
    http://forum.sa-mp.de/index.php?page=User&userID=24998
    */

    #include <a_samp>

    forward ocmdOnPlayerCommandText(playerid,cmdtext[]);
    #if defined OCMD_BEFORE_CALLBACK
    forward BeforePlayerCommandText(playerid,cmdtext[]);
    new bool:ocmdBeforeCallback,bool:ocmdInit;
    #endif

    #define ocmd:%1(%2) forward ocmd_%1(%2);\
    public ocmd_%1(%2)

    public OnPlayerCommandText(playerid,cmdtext[])
    {
    #if defined OCMD_BEFORE_CALLBACK
    if(!ocmdInit)
    {
    if(funcidx("BeforePlayerCommandText")!=-1)ocmdBeforeCallback=true;
    ocmdInit=true;
    }
    #endif
    new ocmdStr[32]="ocmd_",
    i=1,
    #if defined OCMD_COMMAND_LOG
    ocmdName[MAX_PLAYER_NAME],
    #endif
    bool:ocmdNoParams;
    #if defined OCMD_COMMAND_LOG
    GetPlayerName(playerid,ocmdName,sizeof ocmdName);
    printf("[cmd] [%s]: %s",ocmdName,cmdtext);
    #endif
    #if defined OCMD_BEFORE_CALLBACK
    if(ocmdBeforeCallback&&!CallLocalFunction("BeforePlayerCommandText","ds",playerid,cmdtext))return 1;
    #endif
    for(;i<128;i++)
    {
    if(!cmdtext[i]||cmdtext[i]==' ')
    {
    if(!cmdtext[i]||!cmdtext[i+1])ocmdNoParams=true;
    break;
    }
    ocmdStr[i+4]=tolower(cmdtext[i]);
    }
    if(!ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid,cmdtext[i+1]))return 1;
    if(ocmdNoParams&&CallLocalFunction(ocmdStr,"ds",playerid," "))return 1;
    return CallLocalFunction("ocmdOnPlayerCommandText","ds",playerid,cmdtext);
    }

    #define OnPlayerCommandText ocmdOnPlayerCommandText


    //edit habe 2 zeilen vergessen

    Eine Frage.
    Ist das jetzt ein eigenständiger Client oder auf SA-MP basiert?


    Dies ist ein client der auf SA:MP basiert also diesen man benutzen kann um diese Features auf einen SA:MP Server zu nutzen,
    welcher jedoch auch das entsprechende plugin dazu nutzt.
    Daher auch SA:MP Extensions mit diesem Projekt werden wünsche oder besser gesagt begierden am SA:MP client umgesetzt
    die das Developer Team von SA:MP (Kalcor) nicht umsetzt oder besser gesagt nicht macht.

    if(dialogid==DIALOG_REGISTER){
    if(response){
    if(strlen(inputtext) <= 4){
    SendClientMessage(playerid,0xFF0000FF,"Das Passwort war nicht lang genug.");
    return ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Registrieren","Gib bitte das gewünschte Passwort ein:","Register","Abbrechen");
    }else return Register(playerid,inputtext);
    }else{
    SendClientMessage(playerid,0xFF0000FF,"Du hast den vorgang abgebrochen.");
    return Kick(playerid);
    }
    }


    ich hab response hier mal abgekürzt if(response == 1)
    ist das selbe wie if(response)
    das gilt jedoch nicht wenn response den wert 0 udn geringer oder höher als 1 hat.
    das return sorgt eigentlich nur dafür das der code abgebrochen wird dies kan man auch mit dem aufruf von functionen machen.
    strlen(inputtext) gibt die anzahl an zeichen von dem string inputtext wieder daher darfst du hier kein ! benutzen
    dies bedeutet alles außer. Ich hab das hier mal auf minimal 5 Zeichen gesetzt


    //edit 5 Zeichen nicht 4 :D


    Zum einen bitte ich dich das nächstes mal in den sammelthread zu posten.


    Objecte :
    6959
    bearbeit bar mit SetObjectMaterial
    und ab
    19375 -19381

    Ich würde auch lieber ApplyAnimation nehmen anstelle von SetPlayerSpecialAction. Letzteres funktionierte bei mir irgendwie auch nicht wirklich.


    ApplyAnimation(playerid,"PED","SEAT_down",4.0,0,1,1,1,-1);


    Liegt wahrscheinlich daran das diese mit paar weiteren verschwunden ist steht ja auch im wiki das welche entfernt wurden zwar nicht
    bei sit jedoch kann man das auch annehmen

    mysql_num_rows


    ich hoffe du weisst was mysql_num_rows zurück gibt dann schau dir die funktion an .
    Danach solltest du dich selbst fragen was dies damit zu tun hat .


    Zu dem gibt es dafür auch eine andere funktion diese nennt sich
    cache_get_data


    die gibt die anzahl der reihen und spalten zurück


    daher ist die verwendung so
    new rows , fields;
    cach_get_data(rows, fields);
    if(!rows)return Register
    ...
    ...
    ...


    sogar hier ist fields nicht einmal nötig daher kann man um nur die reihen zu bekommen
    dies auch so verwenden


    new rows;


    cach_get_data(rows, 0);