Nützliche Codeschnipsel

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Dann würde ich jetzt gerne sehen, wie du das mit einer Schleife realisieren kannst, sodass der Code 1:1 das macht was mein Code macht. Alles andere interessiert mich hier nicht mehr.
    Und nur wenn da ein Code-Schnipsel (kein Plugin etc) kommt, der zudem noch ressourcenschonender (bzw. mindestens gleichwertig ist), dann geb ich dir gerne Recht. Ansonsten bleibe ich bei meiner Aussage oben.


    Das mit einer Schleife zu realisierne ist möglich, wenn man zusätzlich noch eine variabel deklariert :D.



    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1;
    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;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (!cName)?(INVALID_PLAYER_ID):(i);
    }


    //edit Flüchtigkeitsfehler beseitigt danke Kaliber

  • Das mit einer Schleife zu realisierne ist möglich, wenn man zusätzlich noch eine variabel deklariert .


    Du hast da noch flüchtigkeits Fehler drinnen ^^


    Schreibs mal so:


    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1,i;
    for(; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (!cName)?(INVALID_PLAYER_ID):(i);
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Scriptborn: Das was du hast mag auf den ersten Blick funktionieren, aber spätestens bei der Deagle etc. kriegst du Probleme den die schießt ohne Rapid Fire unter einer Sekunde, hier musst du mit Millisekunden arbeiten, bei Sekunden kommst du hier nicht weit und musst sehr viele Fehlbans in Kauf nehmen, so habe ich es momentan:


    new ShootTimer[MAX_PLAYERS];
    public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
    {
    new bool:detected;
    switch(weaponid)//Alle Waffen die das Cleo beeinflussen
    {
    case 24: if(GetTickCount()-ShootTimer[playerid] < 300)detected=true;
    case 25: if(GetTickCount()-ShootTimer[playerid] < 700)detected=true;
    case 26: if(GetTickCount()-ShootTimer[playerid] < 50)detected=true;
    case 31: if(GetTickCount()-ShootTimer[playerid] < 60)detected=true;
    case 33: if(GetTickCount()-ShootTimer[playerid] < 500)detected=true;
    case 34: if(GetTickCount()-ShootTimer[playerid] < 500)detected=true;
    }
    if(detected)
    {
    new String[100];
    format(String, sizeof(String), "ID %d benutzt mglw. Rapid Fire. (Letzter Schuss %d ms her)", playerid, GetTickCount()-ShootTimer[playerid]);
    SendClientMessageToAll(-1, String);
    ShootTimer[playerid]=GetTickCount();
    return 0;//Damit der Schuss keinen Schaden anrichtet
    }
    ShootTimer[playerid]=GetTickCount();
    return 1;
    }
    Hier sind die Schuss Zeiten für jede Waffe extra gemessen worden, hiermit gibt es deutlich weniger Fehlbans.

  • IPrototypeI: Die Idee ist Klasse! Da wäre ich an dieser Stelle nie drauf gekommen eine Variable zu nehmen und das zwischen zu speichern. Es ist also tatsächlich mit einer Schleife möglich, Danke für den Beweis!! Soo, und jetzt kommt das aber, ich hab mir mal die Performance angeschaut:


    Test-Code:

    Spoiler anzeigen
    public OnPlayerConnect(playerid)
    {
    new name[24], partname[10],t;
    GetPlayerName(playerid, name, sizeof(name));
    strmid(partname, name, 1, 4);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID(name);
    printf("1: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID(partname);
    printf("2: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID_2(name);
    printf("3: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID_2(partname);
    printf("4: %dms", GetTickCount() - t);

    Spoiler anzeigen
    return 1;
    }

    Spoiler anzeigen
    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;
    }

    Spoiler anzeigen
    stock ReturnPlayerID_2(l_PlayerName[])
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1,i;
    for(; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (!cName)?(INVALID_PLAYER_ID):(i);
    }


    Hier die Zeiten vom Test:

    Code
    [16/03/2014 00:57:56] 1: 403ms[16/03/2014 00:57:56] 2: 20ms[16/03/2014 00:57:57] 3: 713ms[16/03/2014 00:57:57] 4: 20ms[16/03/2014 00:58:01] Incoming connection: 127.0.0.1:53710[16/03/2014 00:58:01] [npc:join] Mini_Vanquisher has joined the server (9:127.0.0.1)[16/03/2014 00:58:01] 1: 423ms[16/03/2014 00:58:01] 2: 21ms[16/03/2014 00:58:02] 3: 798ms[16/03/2014 00:58:02] 4: 20ms[16/03/2014 00:58:06] Incoming connection: 127.0.0.1:53711[16/03/2014 00:58:06] [npc:join] [PhAnToM]BillRizer has joined the server (10:127.0.0.1)[16/03/2014 00:58:07] 1: 484ms[16/03/2014 00:58:07] 2: 20ms[16/03/2014 00:58:08] 3: 767ms[16/03/2014 00:58:08] 4: 21ms[16/03/2014 00:58:11] Incoming connection: 127.0.0.1:53712[16/03/2014 00:58:12] [npc:join] PS.Rhino has joined the server (11:127.0.0.1)[16/03/2014 00:58:12] 1: 416ms[16/03/2014 00:58:12] 2: 21ms[16/03/2014 00:58:14] 3: 1667ms[16/03/2014 00:58:14] 4: 21ms[16/03/2014 00:58:17] Incoming connection: 127.0.0.1:53713[16/03/2014 00:58:17] [npc:join] Ultra_Mikes_Taxi has joined the server (12:127.0.0.1)[16/03/2014 00:58:17] 1: 485ms[16/03/2014 00:58:17] 2: 21ms[16/03/2014 00:58:18] 3: 924ms[16/03/2014 00:58:18] 4: 21ms[16/03/2014 00:58:22] Incoming connection: 127.0.0.1:53714[16/03/2014 00:58:22] [npc:join] PS.Bone has joined the server (13:127.0.0.1)[16/03/2014 00:58:23] 1: 501ms[16/03/2014 00:58:23] 2: 22ms[16/03/2014 00:58:25] 3: 2124ms[16/03/2014 00:58:25] 4: 20ms[16/03/2014 00:58:27] Incoming connection: 127.0.0.1:53715[16/03/2014 00:58:27] [npc:join] Caveman has joined the server (14:127.0.0.1)[16/03/2014 00:58:28] 1: 442ms[16/03/2014 00:58:28] 2: 22ms[16/03/2014 00:58:30] 3: 2048ms[16/03/2014 00:58:30] 4: 21ms


    Es ist klar, dass die Zeiten bei der Part-Prüfung identisch sein sollten, aber bei Eingabe eines kompletten Namens versagt der Code von dir leider.



    Ich habe auch noch einen zweiten Test gemacht, und zwar habe ich von playerid 0 - 4 den Namen von ID 0 suchen lassen, und ab 5 den Namen von ID 5.
    Ergebnis:

    Code
    [16/03/2014 00:59:50] [npc:join] Packy has joined the server (0:127.0.0.1)[16/03/2014 00:59:51] 1: 74ms[16/03/2014 00:59:51] 2: 21ms[16/03/2014 00:59:51] 3: 74ms[16/03/2014 00:59:51] 4: 21ms[16/03/2014 00:59:55] Incoming connection: 127.0.0.1:53717[16/03/2014 00:59:55] [npc:join] Pecky has joined the server (1:127.0.0.1)[16/03/2014 00:59:55] 1: 74ms[16/03/2014 00:59:55] 2: 20ms[16/03/2014 00:59:55] 3: 74ms[16/03/2014 00:59:55] 4: 21ms[16/03/2014 01:00:01] Incoming connection: 127.0.0.1:64804[16/03/2014 01:00:01] [npc:join] Pocky has joined the server (2:127.0.0.1)[16/03/2014 01:00:01] 1: 80ms[16/03/2014 01:00:01] 2: 21ms[16/03/2014 01:00:02] 3: 75ms[16/03/2014 01:00:02] 4: 21ms[16/03/2014 01:00:07] Incoming connection: 127.0.0.1:64805[16/03/2014 01:00:07] [npc:join] Pucky has joined the server (3:127.0.0.1)[16/03/2014 01:00:07] 1: 77ms[16/03/2014 01:00:07] 2: 21ms[16/03/2014 01:00:07] 3: 74ms[16/03/2014 01:00:07] 4: 21ms[16/03/2014 01:00:12] Incoming connection: 127.0.0.1:64806[16/03/2014 01:00:12] [npc:join] [UGP]Chauffeur has joined the server (4:127.0.0.1)[16/03/2014 01:00:12] 1: 75ms[16/03/2014 01:00:12] 2: 21ms[16/03/2014 01:00:12] 3: 75ms[16/03/2014 01:00:13] 4: 20ms[16/03/2014 01:00:18] Incoming connection: 127.0.0.1:64807[16/03/2014 01:00:18] [npc:join] iFabbers_Taxi_Service has joined the server (5:127.0.0.1)[16/03/2014 01:00:18] 1: 368ms[16/03/2014 01:00:18] 2: 21ms[16/03/2014 01:00:19] 3: 438ms[16/03/2014 01:00:19] 4: 21ms[16/03/2014 01:00:23] Incoming connection: 127.0.0.1:64808[16/03/2014 01:00:23] [npc:join] ICECREAM has joined the server (6:127.0.0.1)[16/03/2014 01:00:24] 1: 372ms[16/03/2014 01:00:24] 2: 21ms[16/03/2014 01:00:24] 3: 438ms[16/03/2014 01:00:24] 4: 20ms[16/03/2014 01:00:28] Incoming connection: 127.0.0.1:64809[16/03/2014 01:00:29] [npc:join] KnightRiders_PropRide has joined the server (7:127.0.0.1)[16/03/2014 01:00:29] 1: 370ms[16/03/2014 01:00:29] 2: 21ms[16/03/2014 01:00:29] 3: 439ms[16/03/2014 01:00:29] 4: 21ms[16/03/2014 01:00:34] Incoming connection: 127.0.0.1:64810[16/03/2014 01:00:34] [npc:join] [BB]PilotTrainer has joined the server (8:127.0.0.1)[16/03/2014 01:00:34] 1: 376ms[16/03/2014 01:00:34] 2: 20ms[16/03/2014 01:00:35] 3: 439ms[16/03/2014 01:00:35] 4: 21ms[16/03/2014 01:00:39] Incoming connection: 127.0.0.1:53192[16/03/2014 01:00:39] [npc:join] Mini_Vanquisher has joined the server (9:127.0.0.1)[16/03/2014 01:00:40] 1: 371ms[16/03/2014 01:00:40] 2: 21ms[16/03/2014 01:00:40] 3: 438ms[16/03/2014 01:00:40] 4: 20ms[16/03/2014 01:00:45] Incoming connection: 127.0.0.1:64928[16/03/2014 01:00:45] [npc:join] [PhAnToM]BillRizer has joined the server (10:127.0.0.1)[16/03/2014 01:00:45] 1: 370ms[16/03/2014 01:00:45] 2: 21ms[16/03/2014 01:00:46] 3: 439ms[16/03/2014 01:00:46] 4: 21ms[16/03/2014 01:00:50] Incoming connection: 127.0.0.1:64929[16/03/2014 01:00:50] [npc:join] PS.Rhino has joined the server (11:127.0.0.1)[16/03/2014 01:00:51] 1: 379ms[16/03/2014 01:00:51] 2: 20ms[16/03/2014 01:00:51] 3: 440ms[16/03/2014 01:00:51] 4: 21ms[16/03/2014 01:00:55] Incoming connection: 127.0.0.1:64930[16/03/2014 01:00:56] [npc:join] Ultra_Mikes_Taxi has joined the server (12:127.0.0.1)[16/03/2014 01:00:56] 1: 369ms[16/03/2014 01:00:56] 2: 20ms[16/03/2014 01:00:56] 3: 440ms[16/03/2014 01:00:56] 4: 20ms[16/03/2014 01:01:01] Incoming connection: 127.0.0.1:64931[16/03/2014 01:01:01] [npc:join] PS.Bone has joined the server (13:127.0.0.1)[16/03/2014 01:01:01] 1: 367ms[16/03/2014 01:01:01] 2: 20ms[16/03/2014 01:01:02] 3: 438ms[16/03/2014 01:01:02] 4: 21ms[16/03/2014 01:01:06] Incoming connection: 127.0.0.1:64932[16/03/2014 01:01:06] [npc:join] Caveman has joined the server (14:127.0.0.1)[16/03/2014 01:01:07] 1: 370ms[16/03/2014 01:01:07] 2: 21ms[16/03/2014 01:01:07] 3: 440ms[16/03/2014 01:01:07] 4: 20ms


    Und auch hier sehen wir wieder, dass, sobald die ID > 0 ist wird der Code langsamer als der Code mit zwei Schleifen von mir.



    Ich habe natürlich auch die Funktionalität getestet:
    printf("%d", ReturnPlayerID(name));
    printf("%d", ReturnPlayerID(partname));
    printf("%d", ReturnPlayerID_2(name));
    printf("%d", ReturnPlayerID_2(partname));



    Dass hier was falsch ist sieht wohl jeder. :)


    Richtig wäre: ( Kaliber: )
    stock ReturnPlayerID_2(l_PlayerName[])
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1,i;
    for(; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (cName==-1)?(INVALID_PLAYER_ID):(cName);
    }

    Dennoch ist der Code bei Weitem nicht so effizient wie mein Code.



    Ich habe unterdessen noch die "IsPlayerConnected" Abfrage entfernt, da die tatsächlich nicht nötig ist:
    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;
    }
    Das wäre, Stand jetzt, der leistungsfähigste Code. (Wobei die Abfrage mit IsPlayerConnected auf 100.000 Abfragen ~4ms ausgemacht hat, was eigentlich nicht der Rede wert ist.)

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: @ vergessen


  • Und was ist mit C-Bug?
    Ich kann mit der Deagle in 300ms locker 2x schießen. xD


  • So wie Jeffry schon schrieb, funktioniert der Code nicht. Ich erkläre auch gerne warum:
    1. Die zusätzliche Prüfung "&& cName == 1" ist nicht ganz so gut mMn. Denn es sorgt dafür, dass immer nur der 1. Teilnahme funktioniert. Angenommen folgender Spieler:
    ID 0: Peter
    ID 1: Pechvogel
    Ich such nach "Pe".
    Identisch ist der ID 0 "Peter" nicht, also strfind() und cName = -1. Da passt es, cName = 0
    Identisch ist ID 1 "Pechvogel" nicht, also strfind() und cName = 0. Da passt es teilweise, aber cName ist nicht mehr -1. Wir bleiben also bei "Peter" ID 0.
    Vom Prinzip her wären es mehrere Treffer, der 1. bleibt aber immer als "gültig" stehen bis ein identischer Treffer vorhanden ist.
    Mehrere Treffer die teilweise passen, sind für mich nicht genau genug.Würde das als ungültige Suche abstempeln.


    2. !cName ist definitiv falsch. Das würde bedeuten,dass ID 0 niemals funktionieren wird falls nach ihm teilweise gesucht wurde. Du hast als ungültig cName = -1 definiert, nicht cName = 0.
    Ebenfalls ist "i" an dieser Stelle nicht mehr gültig. Deswegen hat Kaliber "i" wahrscheinlich nicht in der Schleife deklariert, sondern außerhalb.


    3. Es macht vieles einfacher, wenn man als ungültigen Spieler INVALID_PLAYER_ID verwendet.
    Dann würde man sich den Quatsch bei return sparen.
    cName = INVALID_PLAYER_ID;
    // [...]
    return cName; // Wenn kein Treffer vorhanden ist,ist cName immernoch INVALID_PLAYER_ID. Bei gültigen Treffern,ist cName die richtige ID.



    //Edit:
    Postet doch nur Code, denn ihr getestet habt. Zumindest kompilieren sollte erste Vorraussetzung sein, bevor man hier postet.

  • Mal im Ernst, wieso schreibt ihr es nicht einfach so:


    stock ReturnPlayerID(l_PlayerName[]) //(c) by Kaliber
    {
    new pName[MAX_PLAYER_NAME+1];
    for(new i; i<MAX_PLAYERS; i++) {
    if(!IsPlayerConnected(i)) continue;
    GetPlayerName(i,pName,sizeof pName);
    if(!strcmp(pName,l_PlayerName,true)) return i;
    else if(strfind(pName,l_PlayerName,true)!=-1) return i;
    }
    return INVALID_PLAYER_ID;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Weil er erst alle auf den vollständigen (strcmp ) Namen prüfen möchte und danach alle auf den Namen teilweise ( strfind ).
    Bei dir wird jeder Spieler einzelnt erst vollständig und direkt danach teilweise geprüft.
    Das Ergebnis bei dir würde wie in diesem Beitrag nicht dem entsprechen,was Jeffry dort geschrieben hat.



    Bei "Jeff" würdest du immer Jeffry erhalten ( ID 0 ) , nicht Jeff ( ID 1 ).


    Deswegen.

  • Deswegen.


    Dann wäre der sicherste Code der hier:


    ReturnPlayerID(l_PlayerName[]) {
    new pName[MAX_PLAYER_NAME+1];
    for(new i; i<MAX_PLAYERS; i++) {
    if(!IsPlayerConnected(i)) continue;
    GetPlayerName(i,pName,sizeof pName);
    if(!strcmp(pName,l_PlayerName)) return i;
    }
    return INVALID_PLAYER_ID;
    }


    So, weil bei Jeffrys Methode auch Fehler auftreten.


    Sagen wir einer heißt Jeffry, der andere Jeff und der andere Jef...dann hat man mit strfind ein Problem...


    und mit strcmp + true hat man das Problem wenn es Jeffry und JeffRy gibt...


    deshalb wäre der Code oben von mir der, der zu 100% die richtige Spielerid returnt ^^


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Wie ich schon sagte, Goldkiller: hat das Prinzip verstanden, wobei es klar ist, dass bei einer doppelten Übereinstimmung die erste Übereinstimmung ausgegeben wird. Dabei ging es mir aber auch gar nicht, weil es soll möglichst genau einen Wert zurückgeben, und wenn es zwei Möglichkeiten gibt, dann eben den ersten. Für mich fällt das in die Kategorie "It's not a bug, it's a feature!". Das sollte bei sscanf (ich benutze es nicht) auch so sein, wenn man "u" als Parameter nimmt. Wie auch immer, Goldkiller hat völlig recht, dass wenn man hier Codes postet, dann sollte man sich bewusst darüber sein, was sie machen und sie wenigstens kompiliert und getestet haben.


    deshalb wäre der Code oben von mir der, der zu 100% die richtige Spielerid returnt ^^


    Mag schon sein, aber wie ich bereits mehrere Male sagte, meine Version ist die "extendet" Version, die eben auch zu einem Teil-Name einen Wert zurückgibt, und zwar immer den zuerst gefundenen in der Spielerliste.



    Ich bleibe bei meiner Meinung: http://forum.sa-mp.de/gta-mult…eschnipsel-54#post1833593


    ...Und ehrlich gesagt verstehe ich den Affenzirkus darum nicht. Es ist eine simple Funktion, die gestetet wurde, die, für das was sie machen soll, funktioniert und zudem so optimiert ist, dass es keine bessere Variante gibt. Alles was danach gepostet wurde war entweder nicht entsprechend dem gleichen Ergebnis, nicht funktionsfähig oder leistungsschwächer.
    Wobei ich es auch von BlackAce eine Glanzleistung finde, einfach mal seinen Senf rein zu blöken, ohne jegliche Art von Versuch diesen auch zu belegen, und das war ja nicht das erste mal. Das hat ja diesen Zirkus erst gestartet, aber Hauptsache gepostet.

  • Weiß nicht ob es das hier schon gibt, aber wenn man den Fahrer eines Fahrzeugs haben möchte, dann hier ein kleiner, aber meiner Meinung nach nützlicher stock:
    stock GetVehicleDriver(vehicleid) {
    for(new v = 0; v < MAX_PLAYERS; v++) if(GetPlayerVehicleID(v) == vehicleid && GetPlayerState(i) == PLAYER_STATE_DRIVER)return v;
    return -1;
    }

  • Weiß nicht ob es das hier schon gibt, aber wenn man den Fahrer eines Fahrzeugs haben möchte, dann hier ein kleiner, aber meiner Meinung nach nützlicher stock:


    Das funktioniert so nicht :D
    1. Du benutzt i und hast es nicht deklariert.
    2. Sobald er einen Fahrer finden würde, würde er 1 returnen andernfalls 0 ^^


    Schreibs am besten mal so:


    stock GetVehicleDriver(vehicleid) {
    for(new i; i<MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == vehicleid && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
    return -1;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ich poste hier eine Funktion um die Geschwindikt eines Spielers/Fahrzeug auszulesen


    getPlayerSpeed(playerid) {new Float:x, Float:y, Float:z, Float:retrn; if(IsPlayerInAnyVehicle(playerid))GetVehicleVelocity(GetPlayerVehicleID(playerid), x, y, z); else GetPlayerVelocity(playerid, x, y, z); retrn = floatsqroot(x*x + y*y + z*z); return floatround(retrn * 100 * 1.60); }


    Ist ziemlich einfach gehalten

  • Hier mal ein Codeschnipsel für die Konvertierung von 1000 in 1.000, gab es zwar schon, aber die hier ist besser:


    stock sMoney(geld) {
    new str[24],i;valstr(str,geld),i=(geld > 0) ? strlen(str)-3 : strlen(str)-4;
    for(; i>0; i-=3) strins(str,".",(geld > 0) ? i : i+1,24);
    return str;
    }


    //Nutzung:
    printf("%s$",sMoney(10000)); //-> Output: 10.000$


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Gibt eine ID von irgendeinen Spieler wieder


    Befehl mit dem es getestet wurde

    PHP
    ocmd:test(playerid,params[])
    {
    	new pID = GetRandomPlayerID();
    	SendClientMessage(pID,COLOR_RED,"Hallo Zuckermaus");
    	return 1;
    }

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • deins Gibt soweit ich sehe, nur eine Zahl zwischen 0-500 aus
    sry falls deiner doch Funktioniert, hab gerade Kopf drehen und bin Müde :D

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.


  • Absoluter Müll...
    Da wird auch was genommen das garnicht Online ist...
    Sprich 2 user sind drauf, ich will nen random haben (0 & 1 gibt es) und ich bekomme als ausgabe 252 wieder
    Das macht also kein Sinn wenn der User nicht vorhanden ist.


    Das von Kaito funktioniert dagegen jedoch kann man es gut abkürzen wie hier im Muster
    GetRandomPlayerID()
    {
    nochmal:
    new uID = random(MAX_PLAYERS);
    if(!IsPlayerConnected(uID))goto nochmal;
    return uID;
    }
    Das macht nen Zufall von 0-499 sofern 500 User online sind
    Sind nur 2 online werden auch nur die id´s von den online usern angegeben

    All in all it's just another brick in the wall

  • Danke schon Beavis:


    aber geht das wirklich mit "nochmal:" oder hattest du das jetzt nur noch hingeschrieben?
    bin zwar schon lange im Geschäft, aber man lernt ja nie aus ;D

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • klar ab den Punkt wo ich nochmal: stehen habe soll er wieder beginnen
    ich kann es auch unter der deklarierung schreiben, jedoch geht er immer von den Punkt an bis ein Spieler online ist :D
    kannst aber auch hier nachlesen wie das gemacht wird

    All in all it's just another brick in the wall

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen