Beiträge von Goldkiller

    nice :thumbup:
    wo hast du denn die daten für die distances her?


    Hab mir mal ein kleines Programm geschrieben,dass mir die Daten aus den IDE Datein des Spieles ausgelesen hat.

    Zitat

    \data\maps\*\*.IDE
    Bsp:\data\maps\SF\SFe.IDE


    stock Float:GetOptimalIDEDistance(modelid,Float:input) {
    for(new i; i < sizeof(IDEData) ; i++) {
    if(modelid == IDEData[i][IDE_iModelID]) {
    return IDEData[i][IDE_fDistance];
    }
    }
    return input;
    }
    stock CreateDynamicObjectEX(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 200.0,Float:extra_distance = 20.0) {
    distance = GetOptimalIDEDistance(modelid,distance);
    return CreateDynamicObject(modelid,x,y,z,rx,ry,rz, worldid, interiorid, playerid,distance + extra_distance);
    }
    Entweder benutzt du GetOptimalIDEDistance() und gibst dort eine ModelID und eine default DrawDistance an.Die default DrawDistance wird gebrauchst,falls kein Eintrag für die ModelID gefunden wird.
    GetOptimalIDEDistance(10343,200.0);
    10343 - ModelID
    200.0 - DrawDistance,falls kein Eintrag für diese ModelID gefunden wurde.Denn ungefähr 100 von ~15000 Einträgen fehlen ( Die du aber mit sehr sehr hoher wahrscheinlichkeit eh nicht nutzt,weil das TOBJs sind ).
    Liefert dir direkt als return Wert die Distanz.


    Oder du benutzt direkt CreateDynamicObjectEX(), die ist aber ausgelegt für das Streamer Plugin von Incognito.Du kannst es aber für jeden Streamer benutzten,und anstatt eine DrawDistanz die Funktion GetOptimalIDEDistance einfügen.


    gStream_Helper # Pastebin V.2
    gStream_Helper.rar


    //Edit: Neue Version,Text komplett geändert usw usf.

    Im Beispiel wovon er redet,hat er sehr wohl recht.
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/help", cmdtext, true, 5) == 0)
    {
    if(IsPlayerConnected(playerid)) {
    SendClientMessage(playerid,COLOR_RED,"Du hast die Hilfe abgefragt");
    }
    return 1;
    }
    return 0;
    }
    Wenn man zu so etwas ein Beispiel sucht,findet man nichts :pinch: , daher hier ein Beispiel.


    Sowas sieht man immer wieder, die Abfrage macht absolut keinen Sinn.Nur viele wollen das nicht begreifen,denn wie soll der Befehl eingegeben werden,wenn der Spieler der es eigentlich eingegeben haben soll, nicht auf dem Server ist bzw nicht existiert ?
    Irgendjemand hat mal damit angefangen den sinnlosen Check einzuführen,zu viele haben den Mist dann nachgemacht.


    [...]
    Noch als Hinweis, wenn du irgendwelche Fehler angezeigt bekommst,wäre es sicher vom Vorteil,wenn du die Zeilen dazu markierst.


    HousePickup[hInfo] = ...
    Dann überleg mal,wieso hInfo dort falsch ist ;).


    HousePickup[houseid] = CreatePickup(1273, 23, iconX, iconY, iconZ);
    Müsste so mit houseid funktionieren.Falls nich,poste die Zeile mit Fehler.

    Denke er meint sowas hier:
    PreloadAnimLib(playerid,"DANCING");


    stock PreloadAnimLib(playerid, animlib[]) {
    ApplyAnimation(playerid,animlib,"null",0.0,0,0,0,0,0);
    return 1;
    }
    Die meisten fügen PreloadAnimLib() unter OnPlayerConnect ein.

    Ehm,Ich sehe jetzt erst,dass da bei dir was total durcheinander gekommen ist.


    Wie hast du HousePickup definiert?Falls du es mit einem enum füllst,zeig das auch mal.Noch als Hinweis, wenn du irgendwelche Fehler angezeigt bekommst,wäre es sicher vom Vorteil,wenn du die Zeilen dazu markierst.

    new hInfo[MAX_HOUSES][HouseInfo];
    Multi-Dimensionales Array.
    HousePickup[hInfo] = CreatePickup(1273, 23, iconX, iconY, iconZ);//Die

    Kein Multi-Dimensionales Array.
    HousePickup[][hInfo] fehlt.


    HousePickup[houseid][hInfo]

    stock Float:GetDistancePointToLinear(Float:fPoint[3],Float:fStart[3],Float:fDVector[3]) {
    new
    Float:fCrossProduct[3],
    Float:fDistance;
    fCrossProduct[0] = ( ( fDVector[1] * (fPoint[2] - fStart[2]) ) - ( fDVector[2] * (fPoint[1] - fStart[1]) ) );
    fCrossProduct[1] = ( ( fDVector[2] * (fPoint[0] - fStart[0]) ) - ( fDVector[0] * (fPoint[2] - fStart[2]) ) );
    fCrossProduct[2] = ( ( fDVector[0] * (fPoint[1] - fStart[1]) ) - ( fDVector[1] * (fPoint[0] - fStart[0]) ) );
    fDistance = floatsqroot( (fCrossProduct[0] * fCrossProduct[0]) + (fCrossProduct[1] * fCrossProduct[1]) + (fCrossProduct[2] * fCrossProduct[2]));
    fDistance = ( fDistance / floatsqroot( (fDVector[0] * fDVector[0]) + (fDVector[1] * fDVector[1]) + (fDVector[2] * fDVector[2]) ) );
    return fDistance;
    }
    Ganz nützlich um zu überprüfen ob ein Spieler in eine bestimmte Richtung zielt.Damit kann man leicht ein Feuerwehr Script erstellen um zu schauen,ob man wirklich mit dem Strahl irgendwo hin zielt.


    //Edit:


    {fPoint} - Der Punkt der überprüft werden soll auf die Distanz
    {fStart} - Der Aufpunkt für die Gerade
    {fDVector} - Der Richtungsvektor ( GetPlayerCameraFrontVector }

    Deko.Die werden definitiv kein Schaden bekommen.
    Das sind einfach Objekte wie jedes Andere das du mappen kannst,mit dem Unterschied,dass die aus lediglich einem Partikel Effekt bestehen,ansonsten komplett wie ein normales Objekt handeln.Du siehst also nichts außer den Effekt.Ziemlich billig die Methode,wundert mich lediglich nur noch,wo SA:MP den Speicher dafür her nimmt.
    Denn GTA SA hat auch Limits wieviele IDE ( Definierte Objekte die man nutzen kann ) Einträge es geben kann.Die Limits bzw ein Tool das diese crackt, gibt es,ist aber soweit Ich weiss relativ unstabil. Mal abwartem wie die fertige Version wird.


    //Edit:
    lawl

    //Edit2:



    strval(inputtext); // Zeile 101
    Diese Zeile ist total unnötig.
    new string1[256],string2[256],string3[256],string4[256],string5[256],string6[256],string7[256],string8[512];
    Maximaler Inputtext in Dialogen ist 192 Zeichen,es reicht also wenn du anstatt 256 192+1 machst.Für String8 solltest du denn jeweils sizeof(StringX) nehmen,da du ja bei String1 und String7 nicht die 256 bzw (192+1) Zeichen ausnutzt.
    Das Gleiche gilt auch für msg1-5


    if (strcmp("/chat", cmdtext, true, 10) == 0)
    Dort brauchst du auch nicht 10Zeichen zu überprüfen,es reicht wohl auch 5 ;).


    //Edit:
    Bei UpdateChat() solltest du die ganzen Strings außerhalb des Loops einmalig erstellen.Du erstellst sie im Loop immer wieder neu,wenn Ich mich richtig erinnere haust du dadurch irgendeinen Speicher voll.Auch solltest du sie einmalig formatieren,ist definitiv besser von der Performence bei mehr als 1Spieler im Chat.


    //Edit2:
    Oh...das ganze unter UpdateChat() müsste so aussehen:
    public UpdateChat()
    {
    new
    string1[128],
    /*
    Wozu diese Strings?
    string2[256],
    string3[256],
    string4[256],
    string5[256],
    string6[256],
    */
    string7[128],
    string8[7*(192+1)+1];
    format(string1, sizeof(string1), "|________________________ Chatroom ______________________|");
    /*
    Die brauchst du doch nicht formatieren,wenn sie eh in den globalen Strings sind
    Musst halt nur im letzten format() die globalen Strings einsetzten
    format(string2, sizeof(string2), "%s",msg5);
    format(string3, sizeof(string3), "%s",msg4);
    format(string4, sizeof(string4), "%s",msg3);
    format(string5, sizeof(string5), "%s",msg2);
    format(string6, sizeof(string6), "%s",msg1);
    */ format(string7, sizeof(string7), "|________________________________________________________|");
    format(string8, sizeof(string8), "%s\n%s\n%s\n%s\n%s\n%s\n%s",string1,msg5,msg4,msg3,msg2,msg1,string7);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(inchat[i] == 1)
    {
    ShowPlayerDialog(i,chatdiag,DIALOG_STYLE_INPUT,"Chatroom",string8,"Senden","Verlassen");
    }
    }
    return 1;
    }


    //Edit3: @Unter mir:
    Tjo,leider :S

    Dann wäre es wohl besser du schaust dir kurz und knapp eine Anleitung zu MYSQL an.
    Wie auch immer,wenn Ich mich richtig erinnere,wäre es trotzdem logischer es mit mysql_fetch_row zu machen.


    new
    amount,
    sResult[128];
    format(Textstring256,sizeof Textstring256, "SELECT * FROM `NachrichtenTabelle` WHERE Nickname='%s'",GetName(playerid));
    mysql_query(Textstring256);
    mysql_store_result();
    amount = mysql_num_rows();
    if(amount) {
    while(mysql_fetch_row(sResult)) {
    //sResult ist dann die gesamte Zeile
    }
    }

    Wieso es crasht könnte vielleicht noch hier liegen:
    while(counter <= amount)
    counter wird immer kleiner als amount sein,denn weder counter noch amount ändern bei dir ihre Werte.Muss nicht daran liegen,kann aber ;).

    Welches MYSQL Plugin nutzt du überhaupt,es gibt 3 Verschiedene.
    Generell würde Ich aber sagen,du hast nicht gelesen,was da in der Log steht.Denn dort steht,du speichert nach dem query() nicht das Ergebniss um von dort aus die numrows zu bekommen.



    print("1");
    format(Textstring256,sizeof Textstring256, "SELECT * FROM `NachrichtenTabelle` WHERE Nickname='%s'",GetName(playerid));
    print("2");
    mysql_query(Textstring256);
    print("3");
    mysql_store_result();
    print("4");
    new amount = mysql_num_rows();
    print("5");
    new counter;
    print("6");
    while(counter <= amount)
    { // !!!!!!!!!!
    print("7");
    format(Textstring256,sizeof(Textstring256),"SELECT * FROM `NachrichtenTabelle` WHERE Nickname='%s' LIMIT %d,1",GetName(playerid),counter);
    print("8");
    mysql_query(Textstring256);
    print("9");
    if(mysql_num_rows())
    {
    print("10");
    SendClientMessage(playerid,FARBE_WEISS,"Test");
    return 1;
    }
    } //!!!!!

    Wozu machst du das ganze eigentlich doppelt?Mit der while() Schleife gehst du doch bereits alle Einträge durch 0o.


    //Edit: Achja,vergessen.mysql_fetch_row wäre das Stichwort :-O

    Bewirkt das,was der Name schon sagt.
    Der Streamer führt ein Update durch bzw aktualisiert ( Streamer_Update )für den Spieler die Items,sei es nun Objekte,Checkpoints,MapIcons oder ähnliches.Dabei führt das Plugin allerdings das Update an der Position durch,wo sich der Spieler gerade befindet.
    Dort ist dann auch der Unterschied zu Streamer_UpdateEx.Dort kann man Koordiaten angeben ( X, Y und Z ) von wo aus für den Spieler das Plugin eine Aktualisierung vornimmt von allen Items ( Objekte,Checkpoints,MapIcons ... ).
    Das kann man dann zB nutzen wenn man den Spieler teleporieren möchte, aber bevor er dort ankommt, für ihn die Objekte bereits erstellt sein müssen,damit er nicht durch die Map fällt.


    Hab dazu auch noch eine kleine Definition in der readme gefunden.

    Zitat

    - Use Streamer_UpdateEx to preload items before setting a player's
    position or to stream items under OnPlayerRequestClass.

    Was funktioniert denn daran nicht?
    Es gibt wie bei jedem gutem Release auch eine readme,die man lesen sollte wenn man keine Ahnung hat.

    Zitat

    Dann auch noch in Englisch.


    Das ist natürlich ein exzellenter Grund ihn nicht zu nutzen.


    Ist bei allen Streamern mehr oder weniger gleich,erhöh die Stream-Distanz oder setzt das Timerintervall runter.