Beiträge von Mostey

    kleinkiko:
    Da gibt es mehrere Möglichkeiten. Du könntest dir das Leben schwer machen indem du folgendes machst:


    new SomeObjectArray[40];


    SomeObjectArray[0] = CreateObject(...
    SomeObjectArray[1] = CreateObject(...
    SomeObjectArray[2] = CreateObject(...
    ...


    Das mag natürlich niemand, ist unsauber und führt zu unwartbarem Code.


    Ich würde das so machen:


    new SomeObjectArguments[][7] = // Bin mir hier nicht ganz sicher ob das in PAWN möglich ist, also ob man die zweite Dimension eines Arrays explizit festlegen kann, ohne die erste zu bestimmen
    {
    { 19357,-1458.5000000,2666.4001465,824.0999756,0.0000000,0.0000000,0.0000000 },
    { 19358,-1452.5000000,2666.4001465,824.0999756,0.0000000,0.0000000,0.0000000 },
    { 19359,-1451.5000000,2666.4001465,824.0999756,0.0000000,0.0000000,0.0000000 }
    // Für jedes weitere Objekt fügst du hier die Koordinaten und den ganzen Shit ein, den die Funktion CreateObject erfordert
    }



    new SomeObjectArray[sizeof(SomeObjectArguments)];


    for(new i; i < sizeof(SomeObjectArray); i++) // Loop durch jedes Objekt für das du die Argumente oben eingegeben hast
    SomeObjectArray[i] = CreateObject(SomeObjectArguments[i][0], SomeObjectArguments[i][1], SomeObjectArguments[i][2], SomeObjectArguments[i][3], SomeObjectArguments[i][4], SomeObjectArguments[i][5], SomeObjectArguments[i][6]);



    @ TheBlueFireKing:
    Verstehe deine Frage leider immer noch nicht, es würde helfen wenn du den Kontext näher erklärst, wozu diese Funktion verwendet wird zum Beispiel.


    Würde dir gerne helfen, ist allerdings ohne Kontext total schwer zu verstehen und sich in deine Lage zu versetzen. Vielleicht erklärst du auch etwas genauer warum es überhaupt zu einer weiteren print-Anweisung kommt? Ich sehe nur eine die dem Muster von unten entspricht.



    new awand[40], ib;


    "ib" wird deklariert und mit 0 initialisiert. Alle Objekte wandern in "awand[0]" und überschreiben sich immer gegenseitig. Deshalb wird maximal ein Objekt später geändert.

    #define DEF_RESPAWN_TIME 60 // Respawnzeit in Sekunden die benötigt wird damit ein Spieler respawnen darf
    new HospitalRespawnTime[MAX_PLAYERS]; // Zeit die schon verstrichen ist, die der Spieler also schon gewartet hat
    new HospitalRespawnTimer[MAX_PLAYERS];


    // Anwendung:
    HospitalRespawnTime[playerid] = 0;
    HospitalRespawnTimer[playerid] = SetTimerEx("IncrementHospitalRespawnTime", 1000, true, "ii", playerid, 1); // jede Sekunde (1000) immer um 1 (1) erhöhen, also jedes mal wird eine Sekunde zur verstrichenen Zeit dazu addiert.


    public IncrementHospitalRespawnTime(playerid, value)
    {
    HospitalRespawnTime[playerid] += value;


    if(!(DEF_RESPAWN_TIME - HospitalRespawnTime[playerid]) )
    // Zeit abgelaufen
    KillTimer(HospitalRespawnTimer[playerid]);


    return 1;
    }


    Übrigens würde ich die Methoden immer so konzipieren, dass sie mehrfach verwendet werden können.


    Edit: gettime() gibt übrigens nur den Unix Timestamp zurück, also die verstrichenen Sekunden seit dem 01.01.1970 was für deine Funktion nicht gerade zu gebrauchen ist.

    SetTimer("Tank",30000, true); {Tank[veh] = Tank[veh]-1;}


    Da meckert der Compiler doch bestimmt, du kannst doch keinen Codeblock ohne Kontrollstruktur einfügen.


    new Float:Tank[3];
    new string[10];
    Tank[veh] = 100;
    SetTimerEx("DecreaseTank",30000, true, "ii", i, veh);


    public DecreaseTank (playerid, veh)
    {
    Tank[veh]--;


    if(Tank[veh] < 100) {format(string, 10,"~w~Tank: ~r~%i",Tank[veh]);}
    if(Tank[veh] < 60) {format(string, 10,"~w~Tank: ~y~%i",Tank[veh]);}
    if(Tank[veh] < 20) {format(string, 10,"~w~Tank: ~g~%i",Tank[veh]);}
    if(Tank[veh] < 1) {SetVehicleHealth(veh,0);}
    TextDrawSetString(Tacho_Tank[playerid],string);
    }


    Hab das jetzt mal einigermaßen zusammengewürfelt aber du unterschlägst natürlich Informationen wie zum Beispiel den Spieler, der dieses Textdraw angezeigt bekommt.


    Das habe ich wohl gesehen aber das macht keinen Unterschied aus, da der TE vermutlich vorher auch schon irgendwo sein Float Array deklariert hat.

    Das dürfte gar nicht compilen weil du da einige Fehler hast.


    SetTimer("Motorstarten",2000,false,"i",playerid);


    kann keine Argumente an Funktionen übergeben und wird deshalb zu


    SetTimerEx("Motorstarten",2000,false,"i",playerid);



    Du übergibst einen Integer (playerid) als Argument obwohl die Funktion überhaupt keine Argumente annimmt, deshalb:


    public Motorstarten(playerid)
    {
    new veh;
    GetVehicleParamsEx(veh,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(veh,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    SendClientMessage(playerid,NEONGRUEN,"Motor wurde gestartet.");
    Motor[veh] = true;
    }

    Meiner Meinung nach ist C nicht zu empfehlen. Vorallem dann nicht, wenn man seine Kenntnisse irgendwann mal mit C++ oder C# erweitern müsste. Ich spreche da auch einfach aus Erfahrung da man (vorallem bei casts) leider relativ häufig von Reflex aus auf C Methoden in C++ zurückgreift und das eben nicht dem Modell der Sprache entspricht. Kann man ungefähr mit "eingedeutschten" Begriffen in unserer Sprache gleichsetzen. :thumbup:


    Lernen sollte man mit .NET sowieso nicht sondern klein anfangen - Grundprinzipien der Sprache verstehen und sich mit OOP auseinandersetzen. Klappt am Besten über die gute alte Kommandozeile wie SBIKA schon erwähnt hat.

    Wo ist jetzt der Unterschied?


    Ich vermute mal die Objekt ID, sicher dass die stimmt? Probier's mal mit einem anderen Objekt.


    Jetzt kommt "du kannst keine Beamten Wanteds geben"


    Dann würde ich Spieler[pID][Team] mal auf den Wert prüfen.


    Hast du das eigentlich selber geschrieben oder nur kopiert und hoffst jetzt darauf, dass wir dir jede Kleinigkeit korrigieren?

    Ich habe dir deine Version mal etwas korrigiert, allerdings würde ich hier das Design mal überarbeiten damit es später nicht zu Redundanzen kommt. (Das heißt dass du dir Funktionen für Rangnamen schreiben solltest u.ä., später möchtest du die nämlich sicherlich mal abfragen)


    Auch würde ich dir empfehlen mal von dem return wegzukommen wenn du nicht weißt wie man es benutzt. Grundlagen eventuell nochmal anschauen.


    if(sInfo[playerid][Rang] == 6) return SendClient.... // Wenn der Spieler den Rang 6 hat soll die Funktion mit einer SendClientMessage beendet werden, demzufolge würden alle Spieler die Rang 6 haben diese Meldung bekommen. Das ist sicherlich nicht das, was du möchtest.


    Korrigierte Version:



    ocmd:rangaendern(playerid,params[])
    {
    new pID,F_Rang,gemacht[200],gekriegt[200],rtext[90];
    if(sInfo[playerid][Rang] != 6) return SendClientMessage(playerid,COLOR_RED,"Dein Rang ist zu niedrig");
    if(sscanf(params,"ud",pID,F_Rang)) return SendClientMessage(playerid,COLOR_RED,"INFO: /rangaendern [PlayerID] [Rang 0-5]");
    sInfo[playerid][Rang]=F_Rang;
    switch(sInfo[playerid][Fraktion])
    {
    case 1:
    {
    switch(F_Rang)
    {
    case 1: { rtext = "Auszubilder"; }
    case 2: { rtext = "Officer"; }
    case 3: { rtext = "Bike - Officer"; }
    case 4: { rtext = "Komissar"; }
    case 5: { rtext = "Stelv. Oberkomissar"; }
    case 6: { rtext = "Oberkomissar"; }
    }
    }
    }
    format(gemacht,sizeof(gemacht),"Dein Leader: %s hat dein Rang zu %i geändert.",PlayerName(playerid),F_Rang);
    SendClientMessage(pID,Blau,gemacht);
    format(gekriegt,sizeof(gekriegt),"Du hast %s den Rang zu %i geändert.", PlayerName(pID), F_Rang);
    SendClientMessage(playerid,Blau,gekriegt);
    savePlayer(pID);
    //printf("%d",sInfo[playerid][Rang]);
    return 1;
    }


    stock PlayerName(playerid)
    {
    new Name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Name, sizeof(Name));
    return Name;
    }




    Flüchtigkeitsfehler könnten dabei sein, hab das jetzt in VS getippt aber das kannst du sicherlich beheben.


    Du liegst da etwas falsch, eine Abfrage ohne explizite Wertgleichung ergibt immer true wenn der Rückgabewert der Funktion ein positiver Wert größer gleich 1 ist:


    if(dini_Exists(Accounts)) // > 1
    if(!dini_Exists(Accounts)) // 0

    #define strcmp


    Entfern das auch nochmal, am besten wäre es wenn du die Makrodefinierungen erstmal alle raus lässt da du anscheinend nicht weißt, wie man sie benutzt.

    Sollte es nicht cmdtext heißen statt cmd ?
    public OnPlayerCommandText(playerid, cmdtext[])


    "cmdtext" wäre in diesem Fall richtig. Würde ich den Callback jetzt folgendermaßen definieren:


    public OnPlayerCommandText(playerid, cmd[])


    wäre "cmd" richtig. Du sprichst ja die übergebene Variable an.

    if (strcmp("/mycommand", cmdtext, true, 10) == 0) <- Das beispiel aus nem frischen Script.


    if(strcmp("/abnehmen", cmd, true) ==0);


    Irrelevant an welcher Stelle das "/abnehmen" steht, der Fehler liegt an der fehlerhaften Makrodefinierung von "cmd".


    Kurz an den TE:


    #define <makroname> <makrovalue>
    #define hallo "das ist nur text"


    print(hallo) // "das ist nur text"