Beiträge von BlackLegend

    public BenzinVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Engine[i] == true && !IsNoTankVeh(i))
    {
    Tank[i]--;
    if (Tank[i] < 1)
    {
    Tank[i] = 0;
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,VEHICLE_PARAMS_OFF,alarm,doors,bonnet,boot,objective);
    Engine[i] = false;
    }
    }
    }
    return 1;
    }


    BlackLegend

    Jo ist mir auch noch aufgefallen, habs ja noch editiert.
    Aber bitte achte genauer auf meinen Code, da war noch ein Fehler drin, der ausgebessert wurde:


    stock Float:GetVehicleVerbrauch(vehicleid){
    new model = GetVehicleModel(vehicleid); // <- Unnötige Klammer entfernt
    if(model >= 400 && model <= 611){
    return Verbrauch[(model-400)];
    }
    return 10.0;
    }



    BlackLegend

    Füg dieses Callback einfach irgentwo ins Script, außerhalb einer Funktion ein.


    public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
    {
    new string[64];
    format(string, sizeof(string), "%.2f", amount);
    SendClientMessage(playerid, 0xFF5A00FF, string);
    return 1;
    }


    Musst natürlich mein Beispiel für dein Script editieren und ergänzen.



    BlackLegend

    Du solltest auf keinen Fall den Timer unter OnPlayerUpdate starten und schon garnicht wiederholend.
    Weißt du wieviele Timer du dann am Ende hast? Ein Spieler updatet sehr oft in der Sekunde.


    Mach da am besten einen Timer:


    forward GetPlayerAFKPos()
    public GetPlayerAFKPos()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(i, X, Y, Z);
    SetTimerEx("AFKChecker",1000*10,0,"ifff",playerid,X,Y,Z);
    }
    }


    public OnGameModeInit()
    {
    SetTimer("GetPlayerAFKPos", 5000, 1);
    }


    Soviel dazu, jetzt zum eigentlichen Problem:


    Du vergleichst hier Floats und Integer, du musst natürlich in der Parameterliste
    die Variablen auch als Float kennzeichnen:


    public AFKChecker(playerid, Float:X, Float:Y, Float:Z)
    {
    new Float:pX, Float:pY, Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    if(pX == X && pY == Y && pZ==Z && GetPVarInt(playerid,"AFKVerdacht")!=1)
    }



    BlackLegend

    Nein, soetwas gibt es nicht.
    Du kannst aber ein Array erstellen, das so groß wie die maximale Anzahl der Fahrzeuge ist.


    new Variable[MAX_VEHICLES];


    Wenn du jetzt irgentwo die den Wert der Variable eines bestimmten Fahrzeuges ändern möchtest,
    so schreibst du in die eckige Klammer einfach die Fahrzeugid und benutzt dann die normalen Zuweisungsoperatoren.


    Bsp.:


    Variable[GetPlayerVehicleID(playerid)] = 10;



    BlackLegend

    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(playerid != INVALID_PLAYER_ID && killerid != INVALID_PLAYER_ID)
    {
    new string[64], pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "Du hast %s getötet", pName);
    SendClientMessage(killerid, 0xAA3333AA, string);
    }
    return 1;
    }



    BlackLegend

    Bei den Includes fügst du folgendes ein:
    #include <utils>


    Und die Zeile mit der Variable tmp löscht du einfach:


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256];
    new idx;
    cmd = strtok(cmdtext, idx);


    if(strcmp("/report", cmd, true, 10) == 0)
    {
    new params[256];
    params = strtok(cmdtext, idx);
    if(!strlen(params)){return SendClientMessage(playerid, 0xAA3333AA, "Benutzung: /report [Spieler] [Grund]");}
    new target = ReturnUser(params);
    if(target != INVALID_PLAYER_ID)
    {
    params = strtok(cmdtext, idx);
    if(!strlen(params)){return SendClientMessage(playerid, 0xAA3333AA, "Benutzung: /report Spieler [Grund]");}
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(isPlayerAnAdmin(i, 5))
    {
    new string[64], TargetName[MAX_PLAYER_NAME], PlayerName[MAX_PLAYER_NAME];
    GetPlayerName(target, TargetName, sizeof(TargetName));
    GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
    format(string, sizeof(string), "Spieler %s hat Spieler %s reported. Grund: %s", PlayerName, TargetName, params);
    SendClientMessage(i, 0xAA3333AA, string);
    }
    }
    }
    else
    {
    new string[64];
    format(string, sizeof(string), "Der Spieler %s konnte nicht gefunden werden.", params);
    SendClientMessage(playerid, 0xAA3333AA, string);
    }
    return 1;
    }
    }

    Ich mach ihn dir umsonst:



    Als erstes brauchst du die strtok Funktion, pack die am besten ganz unten ins Script.


    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }


    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    Jetzt der Befehl und ein paar Variablen:


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new cmd[256];
    new tmp[256];
    new idx;
    cmd = strtok(cmdtext, idx);


    if(strcmp("/report", cmd, true, 10) == 0)
    {
    new params[256];
    params = strtok(cmdtext, idx);
    if(!strlen(params)){return SendClientMessage(playerid, 0xAA3333AA, "Benutzung: /report [Spieler] [Grund]");}
    new target = ReturnUser(params);
    if(target != INVALID_PLAYER_ID)
    {
    params = strtok(cmdtext, idx);
    if(!strlen(params)){return SendClientMessage(playerid, 0xAA3333AA, "Benutzung: /report Spieler [Grund]");}
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(isPlayerAnAdmin(i, 5))
    {
    new string[64], TargetName[MAX_PLAYER_NAME], PlayerName[MAX_PLAYER_NAME];
    GetPlayerName(target, TargetName, sizeof(TargetName));
    GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
    format(string, sizeof(string), "Spieler %s hat Spieler %s reported. Grund: %s", PlayerName, TargetName, params);
    SendClientMessage(i, 0xAA3333AA, string);
    }
    }
    }
    else
    {
    new string[64];
    format(string, sizeof(string), "Der Spieler %s konnte nicht gefunden werden.", params);
    SendClientMessage(playerid, 0xAA3333AA, string);
    }
    return 1;
    }
    }


    Farben bei SendClientMessage kannste dir ja selber raussuchen.


    BlackLegend

    var[0] = 1000;
    var[1] = 200;
    var[2] = 64;


    new highestvar = -99999;//Sollte einen möglichst geringen Wert haben, denn sollte eine Variable kleiner als der Startwert von highestvar sein, bleibt highestvar der Startwert und nimmt nicht den Wert der gesuchten, höchsten Variablen an.
    for(new i = 0; i < sizeof(var); i++)
    {
    if(var[i] > highestvar)
    {
    highestvar = var[i];
    }
    }


    Simple Mathematik....



    BlackLegend

    Die einzig richtig Antwort.


    Nicht ganz, zwar hatte ich das übersehen, jedoch hätte der Befehl dann auch nicht funktioniert,
    zumindest nicht wie er es sollte, denn er (Threadersteller) wollte ja, dass man sowohl Fahrzeugname
    als auch Fahrzeugid als Parameter übergeben kann.
    Bitte nicht alle über einen Kamm scheren.



    BlackLegend

    Eine Zahl kann in einem String stehen, deswegen reicht es hier, wenn du einfach "s" verwendest.
    Bei "u" "i" usw. wandelt sscanf das sowieso nur in einen Integer, Float etc. um.
    Das machst du in dem Befehl ja auch und so kannst du in diesem Fall Zahlen und Strings als Parameter im Befehl verwenden.


    ocmd:v(playerid, params[])
    {
    new model[50];
    if(sscanf(params, "s", model))return SendClientMessage(playerid, 0xFF0023FF, "Falsche Eingabe: /v [Fahrzeug Name/ID]");
    if(GetPVarInt(playerid, "VehiclesSpawned") <= 4)
    {
    new modelid = -1;
    if(!IsNumeric(model))
    {
    for(new sauto=0; sauto < 212; sauto++)
    {
    if(!strcmp(Fahrzeugname[sauto], model, true))
    {
    modelid = sauto+400;
    break;
    }
    }
    }
    else modelid = strval(model);
    if(modelid == -1) return SendClientMessage(playerid, ROT, "Unbekannter Fahrzeugname!");
    {
    new vehicleForPlayer;
    new Float:x, Float:y, Float:z, Float:angleplayer;
    GetPlayerPos(playerid, x, y, z);
    GetPlayerFacingAngle(playerid,angleplayer);
    vehicleForPlayer = CreateVehicle(modelid, x, y, z, angleplayer, random(0-252), random(0-252),60);
    PutPlayerInVehicle(playerid, vehicleForPlayer, 0);
    }
    }
    else
    return SendClientMessage(playerid, 0xFF0023FF, "Maximale Slotanzahl verbraucht! Tippe /desall oder /des 1-4 um alle Fahrzeuge zu löschen.");
    return 1;
    }



    BlackLegend


    (e): sscanf Problem behoben

    Okay also das Script an sich funktioniert, habs gerade nochmal alles getestet.
    So kann ich jetzt keinen Fehler feststellen, am besten schickst du mir mal den kompletten Source
    von dem Keybinder, der sich unter http://www.autohotkey.net/~lace/Gang-Keybinder/Gang-Keybinder.exe, %A_ScriptName%.new befindet und dann werde ich mir das genauer anschauen.
    Denn der Fehler muss sich im Source des Keybinders befinden, der unter besagter URL zu finden ist.




    BlackLegend

    1. Wie gesagt.


    2. Ich habe es gerade bei mir lokal getestet, so funktioniert es:


    ocmd:sweapons(playerid,params[])
    {
    new pID;
    if(!isPlayerAnAdmin(playerid,1))return SendClientMessage(playerid,0xFFFFFFFF,"Hmhmh");
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,0xFFFFFFFF,"Blub");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,0xFFFFFFFF,"Bla");
    new bullets[13];
    new curweapons[13];
    for(new i = 0; i < 12; i++)
    {
    GetPlayerWeaponData(pID, i+1, curweapons[i], bullets[i]);
    }
    new string1[60],string2[60],string3[60],string4[60],string5[60],string6[60],string7[60],string8[60],string9[60],string10[60],string11[60],string12[60],string13[60],rest[800];
    format(string1, sizeof string1, "Waffen von: %s (Id: %d)",SpielerName(pID),pID);
    format(string2, sizeof string2, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[1]],curweapons[1],bullets[1]);
    format(string3, sizeof string3, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[2]],curweapons[2],bullets[2]);
    format(string4, sizeof string4, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[3]],curweapons[3],bullets[3]);
    format(string5, sizeof string5, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[4]],curweapons[4],bullets[4]);
    format(string6, sizeof string6, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[5]],curweapons[5],bullets[5]);
    format(string7, sizeof string7, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[6]],curweapons[6],bullets[6]);
    format(string8, sizeof string8, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[7]],curweapons[7],bullets[7]);
    format(string9, sizeof string9, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[8]],curweapons[8],bullets[8]);
    format(string10, sizeof string10, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[9]],curweapons[9],bullets[9]);
    format(string11, sizeof string11, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[10]],curweapons[10],bullets[10]);
    format(string12, sizeof string12, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[11]],curweapons[11],bullets[11]);
    format(string13, sizeof string13, "%s (WpnId: %d) (Munition: %i)",Waffenname[curweapons[12]],curweapons[12],bullets[12]);
    format(rest, sizeof rest, "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s", string1,string2,string3,string4,string5,string6,string7,string8,string9,string10,string11,string12,string13);
    ShowPlayerDialog(playerid,WEAPON_DIA,DIALOG_STYLE_MSGBOX,"Waffen:",rest,"Ok","");
    return 1;
    }


    Undzwar trat dieser Fehler aus folgendem Grund auf:
    Wenn der Spieler keine Waffe hat, dann ist die Waffenid und somit curweapons[x] 0.
    Die Mathematik besagt, dass 0 - 1 = -1 ist.
    Und einem Array kann logischerweise keine negative Zahl übergeben werden.
    (Waffenname[-1] exisitiert nicht).


    Füge bei deinem Waffennamen Array an erster Stelle am besten einfach "Keine" ein:


    new Waffenname[][] =
    {
    "Keine","Schlagringe","Golfschläger","Schlagstock","Messer","Baseballschläger","Schaufel","Poolstock","Katana","Kettensege",
    "Dildo","Dildo","Vibrator","Vibrator","Blumen","Gehstock","Granate","Tränengas","Molotov-Cocktail","xxxx","xxxx","xxxx","Pistole","schallgedämpfte Pistole","Desert Eagle","Schrotflinte","abgesägte Schrotflinte","automatische Schrotflinte",
    "UZI","MP5","AK 47","M4","TEC9","Rifle","Sniper","Raketenwerfer","Bazuka","Flammenwerfer","Minigun","Auslöser","Rucksackbombe","Farbspray","Feuerlöscher","Kamera","XXXX","XXXX","Fallschirm"
    };


    BlackLegend