Beiträge von Jeffry

    Also geklappt hatte das ganze nun doch, da ich es unter OnPlayerState... Reingehauen habe.

    OnPlayerStateChange ist dafür meist das richtige Callback, denn OnPlayerEnterVehicle wird zu dem Zeitpunkt aufgerufen, wenn der Spieler "Enter"/"F" drückt, also der Spieler ja noch gar nicht im Fahrzeug ist. "Meist" deshalb, weil es auch Systeme geben kann, die es bereits vorher anzeigen möchten.
    Bei OnPlayerStateChange ist der Spieler dann im Fahrzeug.

    Nein, an der Stelle an der du den Code erzeugst:
    new str[32];
    for(new i=0; i<12; i++)
    {
    hackCode[playerid][i] = random(10);
    format(str, sizeof(str), "%s%d", str, hackCode[playerid][i]);
    }
    SendClientMessage(playerid, 0xFFFFFFFF, str);


    Im Dialog zur Prüfung:
    new str[32];
    for(new i=0; i<12; i++) format(str, sizeof(str), "%s%d", str, hackCode[playerid][i]);
    if(!strcmp(inputtext, str))
    {
    //Code richtig eingegeben
    }

    Oder muss ich das alles einzeln machen? Ich hab da 17 verschiedene Koordinaten für Checkpoints

    Das kannst du mit einer Schleife durch das Array erreichen:
    for(new i = 0; i < sizeof(checkpoint); i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 5.0, checkpoint[i][0], checkpoint[i][1], checkpoint[i][2]))
    {
    //Spieler in der Nähe von Checkpoint mit der ID "i"
    printf("Spieler %d ist in der Nähe von Checkpoint %d.", playerid, i);
    return 1;
    }
    }
    //Spieler bei keinem Checkpoint
    printf("Spieler %d ist bei keinem Checkpoint.", playerid);
    return 1;

    Das wird so nicht klappen, da du nur ein Textdraw für alle Spieler hast, somit zeigt es jedem Spieler immer den gleichen Tank-Typ an.
    Hinsichtlich der Anzahl verwendeter Textdraws macht es hier am meisten Sinn, einfach zwei Textdraws zu erstellen, die statisch sind. Eines steht für Diesel und eins für Benzin.


    Der Code beim Einsteigen sieht dann so aus:
    if(Diesel(vehicleid))
    {
    TextDrawShowForPlayer(playerid, TankArtDiesel);
    pInfo[playerid][pTankart] = 1;//Diesel
    }
    else
    {
    TextDrawShowForPlayer(playerid, TankArtBenzin);
    pInfo[playerid][pTankart] = 2;//Benzin
    }

    Dann scheint da das sscanf Plugin irgendwas nicht richtig mitzubekommen. Grund sind eventuell andere Script/Plugins oder ein Fehler an einer ganz anderen Stelle.
    Versuche es mal hiermit:


    if(sscanf(params,"uis",pID,Anzahl,Grund)) return SendClientMessage(playerid,INFO,"Benutze: /wa [{FFFFFF}Playerid {008080}| {FFFFFF}Namen{008080}] [{FFFFFF}Anzahl{008080}] [{FFFFFF}Grund{008080}]");
    zu:
    new pidstr[32];
    pID = INVALID_PLAYER_ID;
    if(sscanf(params,"s[32]is[28]",pidstr,Anzahl,Grund)) return SendClientMessage(playerid,INFO,"Benutze: /wa [{FFFFFF}Playerid {008080}| {FFFFFF}Namen{008080}] [{FFFFFF}Anzahl{008080}] [{FFFFFF}Grund{008080}]");
    if(IsNumeric(pidstr)) if(IsPlayerConnected(strval(pidstr))) pID = strval(pidstr);
    if(pID == INVALID_PLAYER_ID) pID = ReturnPlayerID(pidstr);


    Zusammen mit diesen beiden Funktionen ganz unten im Gamemode:
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }


    stock IsNumeric(string[])
    {
    for(new i = 0, j = strlen(string); i < j; i++)
    {
    if(string[i] < '0' || string[i] > '9') return 0;
    }
    return 1;
    }

    Die 0 steht für die X Position im Array, die 1 für Y, die 2 für Z und die 3 für die Rotation. Da du keine Rotation benötigst, kannst du die weg lassen.


    SetPlayerCheckpoint(playerid, checkpoint[rand][0], checkpoint[rand][1], checkpoint[rand][2]);

    enn ihr Erfahrungen mit solchen Sachen habt, gibt bitte ein kommentar ab und bitte begründet wieso ihr der Meinung seid.

    Das ist kein Hack. Die Aussage basiert auf über 6 Jahren als Server Besitzer mit über 60.000 Bans in dieser Zeit, sowie unten aufgeführten Punkten.
    Der Test den ihr da am Ende gemacht habt ist fehlerhaft, der Spieler muss herumrennen und in gleichem Winkel die Waffe abfeuern. Außerdem muss der "Zuschauer" den gleichen Abstand zum Spieler haben, am besten an der gleichen Position.


    Der Grund warum die Schüsse so weit auseinander auf den Boden auftreffen wird der sein, dass der Spieler die Waffen beim Schuss in der Drehung nicht auf gleicher Höhe hat und somit nicht mit beiden Waffen geradeaus schießt:
    <Bild auf Wunsch vom Thread-Starter entfernt>
    Somit ergeben sich unterschiedliche Flugbahnen.



    Der Grund warum hier
    <Bild auf Wunsch vom Thread-Starter entfernt>
    keine Funken angezeigt kann entweder sein, dass der Zuschauer zu weit weg ist, oder dass diese lokal einfach nicht erzeugt worden sind, diese sind wie Feuer lokal geregelt. Das kommt hin und wieder auch vor, da die Funken nicht immer identisch erzeugt werden. Das ist aber kein Hack, vor allem weil das nur genau einmal im ganzen Video passiert.



    Ein Aimbot ist dies ebenfalls nicht, sonst würde er nicht so massiv daneben schießen und die Bewegungen wären viel unnatürlicher.



    Ein Beweis für einen Hack (selbst wenn er einen hat) ist dieses Video aber bei weitem nicht.

    Weiterhin sind die WeaponPickups da, funktionieren auch, jedoch bekomme ich z.B. wenn ich eine Katana einsammle, eine M4

    Du greifst beim OnPlayerPickUpDynamicPickup mit der pickupid auf das Array zu, dann mach das auch beim erstellen und lass diese Counter weg! Zum dritten mal!
    WeaponPickups[PickupCounter[GENERIC_WEAPON]] = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
    WeaponInfo[PickupCounter[GENERIC_WEAPON]][wModel] = modelid;
    WeaponInfo[PickupCounter[GENERIC_WEAPON]][wAmmo] = random(1000)+10;
    zu:
    new pickupid = CreateDynamicPickup(modelid,type,rx1,ry2,rz3,virtualworld);
    WeaponInfo[pickupid][wModel] = modelid;
    WeaponInfo[pickupid][wAmmo] = random(1000)+10;


    Nochmal sage ich das nicht.


    Zudem ist dein komplettes System so überkompliziert, da blickt man gar nicht mehr durch. Was sollen zum Beispiel die Sortierfunktionen für einen Zweck erfüllen?
    Die binarysearch Funktionen in GetPickupType haben ebenfalls keinen Sinn, da dein Index immer 0 ist. Ich verstehe auch nicht was das bezwecken soll.


    Das System an sich kannst du eigentlich komplett in die Tonne treten (sorry, aber ist so) und neu schreiben. Das geht wesentlich einfacher.


    -> Ein Array mit enum für die Pickups (enum: Model [Welche Waffe z.B.], Menge [für Geld und Ammo], Typ [ob Geldpickup(0), Waffenpickup(1), etc).
    -> Index ist die pickupid
    -> Eine Funktion, die die Model-ID zur Waffen-ID zurück gibt.
    -> Random Funktion für Position und Waffen-ID.


    Und wenns ein Geld Pickup sein soll, dann kann das ins gleiche Array. Jede Pickup-ID gibt es schließlich nur einmal, da hast du schon eine Eindeutigkeit.


    Mehr ist es nicht. Das kann man in 1 Stunde problemlos funktionsfähig schreiben.




    Zudem:
    Dieser Thread ist für kleine Fragen, nicht für elendslange Codes.
    Erstelle bitte einen separaten Thread für weitere Fragen.

    Du darfst hinter einem if nur eine direkte Anweisung haben, mit Semikolon:
    if(sSpieler[playerid][Drogen] == 10) sSpieler[playerid][Drogen] = 9; SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)"); GivePlayerHealth(playerid,10);


    Entweder (schlecht!):
    if(sSpieler[playerid][Drogen] == 10) sSpieler[playerid][Drogen] = 9, SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)"), GivePlayerHealth(playerid,10);


    Oder (gut!):
    if(sSpieler[playerid][Drogen] == 10)
    {
    sSpieler[playerid][Drogen] = 9;
    SendClientMessage(playerid,Weiß,"Du hast 1g Drogen genommen und 10HP erhalten (9/10)");
    GivePlayerHealth(playerid,10);
    }



    Oder am besten direkt so:
    dcmd_usedrugs(playerid,params[])
    {
    #pragma unused params
    if(sSpieler[playerid][Drogen] <= 0) return SendClientMessage(playerid,Weiß,"Du hast keine Drogen!");
    sSpieler[playerid][Drogen]--;
    new str[145];
    format(str, sizeof(str), "Du hast 1g Drogen genommen und 10HP erhalten (%d/10)", sSpieler[playerid][Drogen]);
    SendClientMessage(playerid,Weiß, str);
    GivePlayerHealth(playerid,10);
    return 1;
    }

    Wie muss ich den stock ändern, das keine 26 Errors kommen?

    stock GetRangName(playerid)
    {
    new name[32];
    name = "<Unbekannt>";
    switch(sSpieler[playerid][Fraktion])
    {
    case 1: //Fraktion 1
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Newbie";
    case 2: name = "Pro";
    //...
    }
    }
    case 2:
    {
    switch(sSpieler[playerid][Rang])
    {
    case 1: name = "Praktikant";
    case 2: name = "Angestellter";
    //...
    }
    }
    //...
    }
    return name;
    }