Beiträge von Goldkiller

    Mach es nicht,wie ganzereuro geschrieben hat.

    Zitat

    Aber Pawno gibt folgende Fehler aus:
    "warning 213: tag mismatch" (gilt für beide letzten Zeilen)..


    Nicht wirklich gut beschrieben welche Zeilen gemeint sind.


    Du solltest wissen,dass die 3DTexte in PAWN ein brauchen,damit du keine Warnungen erhälst.
    new
    BotName[MAX_PLAYER_NAME],
    Text3D:BotTextLabel[MAX_PLAYERS]; // Text3D: !
    BotName = sendername; // ?
    GetPlayerName(playerid,BotName,sizeof(BotName)); // vllt brauchst es ja
    BotTextLabel[playerid] = Create3DTextLabel(BotName,COLOR_WHITE,0.0,0.0,0.0,70.5,1);
    Attach3DTextLabelToPlayer(BotTextLabel[playerid],playerid,0.0,0.0,0.45);

    Ist aber eigentlich sinnlos es so "Text3D:BotTextLabel[MAX_PLAYERS]" zu erstellen,wenn du es nicht in einer Schleife benötigst.Es würde sicherlich ausreichen nur "Text3D:BotTextLabel" zu benutzten,aber das musst du wissen.Ich hab ja nicht dein Script vor mir liegen ;).

    Das hättest du sogar Googlen können,und du hättest den Fehler erklärt bekommen.

    Zitat

    ich habe mich schon Umgesehen etc auch in den tuts hier gegugt aber vll finded jmd ja mein Fehler


    Du benutzt aber das Plugin,falls du das Tutorial von mir zur PAWN Code Version von sscanf gelesen hast,ist das klar das du den Fehler nicht findest.Die Plugin - Version unterscheided sich stark von der PAWN - Code Version.

    Zitat

    The above code should be:
    new
    str[32],
    val;
    sscanf("hello\\ there 27", "s[32]i", str, val);


    As you can see - the format specifier now contains the length of the target string, ensuring that you can never have your strings overflow and cause problems.


    Heisst also, du musst bei Strings die größe mit angeben.In deinem Fall ist "Area_tele" 64 Zellen groß,daher
    if(sscanf(params, "s[64]",Area_tele)) {

    Das ist eine Neuheit in sscanf2.


    Gibt seit kurzem auch ein sscanf 2 ( sscanf 2 = Plugin Version ) Tutorial hier im Forum.
    http://forum.sa-mp.de/wbb/san-…torials/50342-sscanf-2-0/

    3DText:
    Das Tag lautet aber
    Text3D:,daher
    auch
    Text3D:Jonny
    Die Warnung besagt nur,dass du zwar Jonny einen Wert zuweist,ihn aber selber nie gebrauchst. Das ist aber nicht gerade schwierig zu verstehen,war dort in Englisch steht.


    Create3DTextLabel("Tippe /job", 0xCC9933FF,3.0,362.0108,178.4597,1008.3828,3,false)
    http://wiki.sa-mp.com/wiki/Create3DTextLabel



    Jetzt schau mal wie das bei dir ist:


    text[] - "Tippe /job"
    color - 0xCC9933FF
    x - 3.0 ( !!!! )
    y - 362.0108 ( Eigentlich X )
    z - 178.4597 ( Eigentlich Y )
    drawdistance - 1008.3828 ( Eigentlich Z )
    virtualworld - 3
    testLOS - false


    Du hast bei dir Anscheinend die drawdistance an der falschen Stelle als Parameter übergeben.Ordne es wieder in die korrekte Reihenfolge die du im Wiki siehst bzw hier im Post und probier es erneut.


    Ne,es gibt 0 bzw false zurück wenn die Strings identisch sind.

    Du solltest das aber dennoch weiter ausbauen.
    Denn es ist doch etwas hart wenn man direkt gekickt wird,sobald man 1x ein "schlimmes Wort" benutzt hat.Selbst Admins werden bei dir gekickt,wenn sie ausversehen mal "Noob" schreiben :-O


    2. Nein ist nicht das gleiche, das 2te bedeutet wenn sich nicht gleich sind


    Quatsch.
    if(strcmp(cmdtext, "/befehl", true)==0) // #1
    if(!strcmp(cmdtext, "/befehl", true)) // #2
    Ist definitiv das Gleiche.
    In #1 wird genau so geprüft ob die Funktion 0 returnt wie auch in #2.In #2 ist allerdings das Negations-Zeichen ! vor der Funktion,weshalb es das Gleiche bewirkt wie ein == 0.
    Die Funktion strcmp() ist etwas gewöhnungsbedürtig, denn es gibt 0 / false zurück wenn die Strings gleich sind, alles Andere wenn sie nicht gleich sind.
    http://wiki.sa-mp.com/wiki/Strcmp
    Für die überprüfung ob die ungleich sind,nimmt man:
    if(strcmp(cmdtext, "/befehl", true)) // #3

    Keine groben Fehler drin,hab aber ein paar Anmerkungen:
    // \/ = Lass hier einfach leer.Dann erkennt der Compiler automatisch die größe des Arrays
    // \/ 64 ist die maximale String-länge die du angibst.Würde es aber auch leer lassen,denn du benutzt nirgendwo annähernt 64zeichen.
    // Der Compiler benutzt dann die Länge des längsten von dir eingesetzten Strings
    // Würde dann wegen "Arschloch" 10 sein da "Arschloch" 9 + 1
    new word[][]= {
    {"Fick"},
    {"Opfer"},
    {"Nutte"},
    {"Stinkt"},
    {"Hure"},
    {"Arschloch"},
    {"Maul"},
    {"Kiddy"},
    {"Noob"}
    };


    new string[128], // 128 Zeichen reichen,denn der Output / Input der Chatbox in SA:MP erfasst nicht mehr Zeichen
    plname[MAX_PLAYER_NAME]; // 64 ist auch bischen viel,benutzt lieber MAX_PLAYER_NAME ( ist ein define )



    Zitat

    Wäre cool wen das an die Pin kommt.


    Wohl eher nicht :)

    Du kannst INGAME auch einfach /DBL eingeben,dass zeigt dir die vehicleid und noch viel mehr.
    new
    Text3D:label,
    str[30];
    for(new i = 0; i<MAX_VEHICLES; i++)
    {
    format(str, sizeof(str), "GGL - %d", i);
    label = Create3DTextLabel(str, 0x0080C000, 0.0, 0.0, 0.0, 30.0, 0, 0);
    if( _: label != INVALID_3DTEXT_ID) { // Zur Sicherheit prüfen ob 3DText erstellt wurde
    Attach3DTextLabelToVehicle(label, i, 0.0, 0.0, 0.75);
    }
    }
    Du müsstest aber auch wissen,ob es überhaupt ein Fahrzeug mit der vehicleid i gibt.

    dcmd_veh(playerid, params[])
    {
    new v, c1, c2;
    if(sscanf(params, "ddd", v, c1, c2))
    {
    return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
    }
    GetPlayerPos(playerid, x,y, z);
    GetPlayerFacingAngle(playerid, r);
    CreateVehicle(v, x, y, z, r, c1, c2, 1);
    PutPlayerInVehicle(playerid, v, 1);
    return 1;
    }
    Da ist ja auch der Fehler,dass du niemals in das richtige Fahrzeug gesetzt wirst. Denn du setzt den Spieler in das Fahrzeug mit der VehicleID "v",was bei dir aber vorher als Angabe für die ModelID diente.


    dcmd_veh(playerid, params[])
    {
    new
    vehicleid,
    v,
    c1,
    c2;
    if(sscanf(params, "ddd", v, c1, c2))
    {
    return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
    }
    if( ( v < 400 ) || ( v > 611) ) {
    return SendClientMessage(playerid, rot, "Ungültige ModelID");
    }
    GetPlayerPos(playerid, x,y, z);
    GetPlayerFacingAngle(playerid, r);
    vehicleid = CreateVehicle(v, x, y, z, r, c1, c2, 1);
    PutPlayerInVehicle(playerid, vehicleid, 1);
    printf("vehicleid = %d , modelid = %d",vehicleid,v);
    return 1;
    }


    //Edit:
    Wow,WLAN ist heute wieder super :/.Füg trotzdem mal Debug-Notes in die Befehl bei dir ein:
    dcmd_veh(playerid, params[])
    {
    printf("dcmd_veh(%d, %s)",playerid,params);
    new
    vehicleid,
    v,
    c1,
    c2;
    if(sscanf(params, "ddd", v, c1, c2))
    {
    return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
    }
    if( ( v < 400 ) || ( v > 611) ) {
    return SendClientMessage(playerid, rot, "Ungültige ModelID");
    }
    GetPlayerPos(playerid, x,y, z);
    GetPlayerFacingAngle(playerid, r);
    vehicleid = CreateVehicle(v, x, y, z, r, c1, c2, 1);
    PutPlayerInVehicle(playerid, vehicleid, 1);
    printf("vehicleid = %d , modelid = %d",vehicleid,v);
    return 1;
    }
    Denn wenn du sagst Ingame passiert nichts,würde die Funktion nicht aufgerufen werden :-O

    Logicaltrue - Angenommen du lädst aus einer config einen Eintrag "b_PrintDebug" kannst du sowohl true als auch false angeben.

    Zitat

    b_PrintDebug = false

    Könntest natürlich auch 0 oder 1 anstatt false oder true benutzten. Bei L / l erkennt sscanf aber sowohl"true" als auch "false" als Angabe,ob es bei Logical auch 0 und 1 weiss ich nicht( Müsste man im Sourcecode nachschlagen ).
    Außerdem heisst es nur Logical, nicht Logicaltrue.Bei Y_Less sind dort im Post überall keine Leerzeichen zwischen dem Titel und dem ersten Beispiel ;).



    Binärcode - Nützlich beim auslesen von Bitflags.
    //00000011101111
    enum ( <<= 1)
    {
    e_Flag_Inventory_Health_S = 1,
    e_Flag_Inventory_Health_M,
    e_Flag_Inventory_Armor_S,
    e_Flag_Inventory_Armor_M,
    e_Flag_Inventory_Joint,
    e_Flag_Inventory_Wine,
    e_Flag_Inventory_Beer,
    e_Flag_Inventory_Sprunk,
    e_Flag_Inventory_Bomb,
    e_Flag_Inventory_Detonator,
    e_Flag_Inventory_Fight_Normal,
    e_Flag_Inventory_Fight_KungFu,
    e_Flag_Inventory_Fight_Boxing,
    e_Flag_Inventory_Fight_Wrestle
    }
    Anhand des Binärcodes kann ich auslesen,welche Flags enthalten sind ( e_Flag_Inventory_Health_S , e_Flag_Inventory_Health_M , e_Flag_Inventory_Armor_S , e_Flag_Inventory_Armor_M , e_Flag_Inventory_Wine, e_Flag_Inventory_Beer, e_Flag_Inventory_Sprung ) .
    Das ist aber ein riesen Kapitel,sehr sehr Nützlich.Nutzt aber leider kaum einer :/.
    "g" heisst wie es dort auch steht IEEE Float / IEEE Gleitkommazahl.Ist Platzhalter "f" + ein paar besondere Zahlen wie NaN,Unendlich ( INFINITY ) .Die können dann als Text "NaN" oder "INFINITY" ausgelesen werden und richtig in einer Variable gespeichert werden.
    In der Tabell ist "u" 2x angegeben.
    Bei "z" solltest lieber schreiben dass dieser unnötiger ist,da alles über Großschreibung Optional wird und die später im Tutorial darauf ein gehst.
    Finde du solltest nochmal etwas zu den Quiet Sections schreiben und zeigen wie man den p - Platzhalter benutzt.Denn Ich glaube du hast nirendwo erwähnt,dass man nun das Trennsymbol zwischen < und > setzt.
    p<,>
    Finde die Farbwahl für dein Beispiel auch etwas grell,musste wirklich genau hingucken :(.


    Boah fast nur negatives geschrieben,sollte Ich wohl noch etwas abrunden.
    Nee,gefällt mir dass hier wenigstens einer das sscanf Plugin benutzt.Wollte auch schon seit langem mal mein Tutorial mit sscanf v2 erweitern, hab aber nie Zeit gefunden es fertig zu schreiben.Eventuell solltest du auch überlegen nicht noch leichtere Beispiele anzugeben,denn Ich glaube kaum,dass jeder auf den ersten Blick versteht was du genau machst.
    An sonsten,gutes Tutorial :thumbup:

    Kannst ja auch bischen selber mitdenken.


    Zitat

    0,0025V = 2,5 * 10 ^ -3 aber hier hast du doch keine Vorsatzsilbe benutz ?


    10 ^ -3 hab Ich oben geschrieben bedeutet milli ( m ). Also 2,5mV


    Zitat

    127mA = 0,127A Woher sind die Zahlen ?

    Die stehen da vllt?
    127 * ( 10 ^ - 3 ) A , da ja ( 10 ^ - 3 ) milli ist.

    e) 2^-3 = 1 / 2 ^ 3 = 1/8 oder [2] -> [EXP] -> [-] -> [3]
    h) 3,5 ^ -5 , 10^5 * 3 , 10 ^ 5 * 105
    j) kp was damit gemeint ist. k steht immer für kilo , also 1000. Heisst also 11 * 1000 ( K ) * A , 11000. Milli ist * 0.001 ( * 10 ^ -3 )
    k) Umgekehrter quatsch. 1200V -> 1,2kV ; 0,0025V = 2,5 * 10 ^ -3 ; 127mA = 0,127A
    c) Ist einfach so x)


    new geld[MAX_PLAYERS];
    Diese variable hat 501Slots, die for schleife zählt auch bis zu den 501 slots,und gibt jedem slot den Wert 100 (also 100$).
    Da das setzen der Variable länger braucht als das abfragen ob der Spieler Online ist sollte man also lieber abfragen und die schleife den slot einfach überspringen lassen, bei wenig Variablen bringt das zwar kaum was aber später wenn man erstmal ziemlich viel zeugs hat bringt es eben doch was.


    LG


    Erzähl mal,wie kommst du auf 501 ?


    Die meisten Funktionen in SA:MP haben bereits intern einen IsPlayerConnected check.Anfängs in 0.1b gab es nämlich deshalb viele crashes soweit Ich weiss,wenn man Funktionen an SpielerIDs anwendete,die nicht benutzt sind.


    public PayDay() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    GivePlayerMoney(i,1000);
    }
    return 1;
    }
    Ist daher auch problemlos möglich,erspart den IsPlayerConnected check,da sich dieser nochmal in GivePlayerMoney befindet.
    Würde aber der übersich halber dort immer den IsPlayerConnected check lassen.
    public PayDay() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    if( IsPlayerConnected(i) ) {
    GivePlayerMoney(i,1000);
    }
    }
    return 1;
    }


    Deshalb kann man auch super so abfragen ob ein Spieler connected ist:
    if( GetPlayerName(i,sName,sizeof(sName) ) { }


    Kleiner Exkurs :P

    Du stellst dir das etwas falsch vor.
    Man erstellt für den Streamer das Objekt einmalig mit diversen Information, wie zB X,Y,Z oder der DrawDistance / Distanz.Der Streamer ( Egal welcher ) weiss dann für sich intern, dass man ein Objekt erstellt haben möchte.
    Wann das Objekt letztendlich für den Spieler erstellt wird, berechnet der Streamer anhand der Distanz die man für ein bestimmte Objekt angegeben hat.Will man,dass ein Objekt von 1000 Units entfernt gestreamt wird, dann wird es für den Spieler nur erstellt sobald man sich innerhalb dieser 1000 Units Abstand befindet.
    Und für das zerstören umgekehrt,ist das Objekt für den Spieler erstellt,er befindet sich aber nicht mehr in den 1000 Units Umkreis,so wird es zerstört.


    Mit diesem Include erhälst du letztendlich die DrawDistance / Distanz , ab wann das Objekt in GTA selber erst angezeigt wird.Denn GTA erstellt dir selbstverständlich keine Objekte die sich in LV befinden ( Eigentlich doch,aber dass sind LOD Objekte die eine sehr niedrige Auflösung haben und kaum Resourcen fressen ) ,wenn du aber in LS bist.Das würde sonst die Resourcen höher treiben :p.

    kenn mich nicht so gut aus, aber wenn da jetzt jedes mal
    wen ein objekt erstellt wird eine schleife 13000 mal läuft


    das geht doch auf die ressourcen oder :?:


    Da hast du auch recht.Nur hatte Ich bisher keine Zeit eine Include auszusuche für BinTrees womit das viel schneller funktionieren würde.
    Seh da aber auch kein wirklich großes Problem drin,da du bzw die meisten ihre Objekte direkt beim Start ( OnGameModeInit() ) erstellen und dies dann ja einmalig ist.Bei mir dauert der StartUp mit etwas mehr als 4000Objekte 1.1 Sekunden,da es ja nur bei OnGameModeInit passiert,ist das für mich kein Problem.


    Ich glaube aber,Ich werde es etwas abändern,sodass zwar das Array im Script wächst,allerdings kein Loop mehr benötigt wird.Man wird also direkt über den Index auf die Distanz zugreifen können.


    //Edit
    Hab es mal getestet.In der Version aus dem Post oben,brauch man ~12500ms um jede ModelID 1x auszulesen. Das bei einer AMX Größe von 138kb,die lediglich aus dem Streamer und dem Testlauf besteht. Dagegen jetzt bei einer AMX Größe von 193kb ( 55kb größer ) nur noch ~5ms bei der FAST_VERSION( Keine prinft() Infos ) und ~1041ms bei der Normalen Version.


    //Edit2:
    Noch etwas verbessert, nun 145kb bei nur noch ~5ms bei der FAST_VERSION( Keine prinft() Infos ) und ~1041ms bei der Normalen Version.