Beiträge von Kristik47

    So würde ich es machen: Ich würde, wenn der Spieler disconnected, die Position abfragen.


    //Vorab: Natürlich solltest du das Enum und so weiter deinem anpassen, falls dir das irgendwie hilft.
    //Vorab: Natürlich solltest du das Enum und so weiter deinem anpassen, falls dir das irgendwie hilft.
    enum DeinSpielerEnum
    {
    Float:pDisSpawnX,
    Float:pDisSpawnY,
    Float:pDisSpawnZ
    }
    new DSE[MAX_PLAYERS][DeinSpielerEnum];


    //Dann bei OnPlayerDisconnect
    OnPlayerDisconnect(die Params...)
    {
    //Zuerst die Koordinaten abfragen, wo er war, als er disconnected ist und dann
    GetPlayerPos(playerid, DES[playerid][pDisSpawnX]DES[playerid][pDisSpawnY],DES[playerid][pDisSpawnZ]);
    //Dann die ganzen Werte des Spieler speichern.
    SaveUser(playerid);
    return 1;
    }


    //Dann, wenn Spieler spawnt
    OnPlayerSpawn(playerid)
    {
    //So, auf diese Weise würde ich das tun.
    SetPlayerPos(playerid, DES[playerid][pDisSpawnX]DES[playerid][pDisSpawnY],DES[playerid][pDisSpawnZ]);
    return 1;
    }


    Ich habe mich jetzt explizit auf die Disconnect + Spawn-Werte bezogen und nicht auf World und so...
    das kannst du dir dann ja selber anhand meines Beispieles vorstellen, wie ich es meine. Versuch es
    so bzw. vielleicht gab dir das einen kleinen Denkanstoß, wie du das machen kannst.


    Ansonsten könntest du vielleicht mal nach weiteren SetPlayerPos suchen. Zum Beispiel bei OnPlayerRequestClass.


    @Dachdecker

    Finde diese Map sehr schön.
    Sehr ordentlich und präzise gemappt, wenn mich
    mein Auge nicht täuscht. Man sieht die Mühe.
    Außerdem finde ich die Texturen meiner Meinung nach sehr passend.
    Dieses Interior würde ich aber eher in Richtung Luxusapartment
    beurteilen.


    10/10 - fürs Aussehen, die Mühe, Ordentlichkeit und Präzision

    @Flash.
    Es hat leider nicht funktioniert. Man bleibt immer noch für ca. 10sek im Krankenhaus, danach wird man wieder gespawnt.
    Falls die Frage wieder aufkommt, ich habe alles wie schon beschrieben, wieder eingefügt, aber auch die Hilfe von Flash. hat nicht funktioniert. ;(

    Folgenden Vorschläge mache ich dir:


    Entweder du suchst nach einem Timer, der 10000(also 10 Sekunden) läuft, indem du
    STRG+F im Skript drückst und dann 10000 eingibst und alles was die 10000 hat und
    ein Timer ist einmal ausklammerst und testest, ob es dann geht.


    ODER


    Du stellst hier mal deinen OnPlayerDeath rein und dein OnPlayerSpawn sowie
    nochmal den ganzen Timer.


    Aber du kannst auch natürlich beides machen, was noch viel viel besser ist.


    @James.Spader


    pIstTot[playerid] += 1;
    PlayerInfo[playerid][pTod] = 1;
    SetTimerEx("TOTTimer", 120000, 0, "i", playerid); //Fehler sollte hier liegen - bin mir nicht ganz sicher
    SetPVarInt(playerid,"tot_Skin",GetPlayerSkin(playerid));
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Durch deine schweren Verletzungen liegst du im Koma!");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Du befindest dich für 2 Minuten im Krankenhaus.");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: In 2 bis 3 Minuten kommst du wieder raus, da du gerade behandelt wirst.");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SetPlayerPos(playerid,941.7925,1734.3978,21.1277);
    SetPlayerCameraPos(playerid, 993.5776,1653.3435,10.3279);
    SetPlayerCameraLookAt(playerid, 949.7623,1748.0996,26.2525);
    TogglePlayerControllable(playerid, 0);
    ResetPlayerWeapons(playerid);
    SetPlayerInterior(playerid, 0); //Das richtige Interior, in dem er sich befindet, setzen und dann sollte es funktionieren.
    SetPlayerColor(playerid, COLOR_ZIVI);
    ClearCrime(playerid);


    //Ich hoffe, dass du diesen Code bei OnPlayerDeath eingesetzt hast, ansonsten wirds auch nicht funktionieren.
    //Wenns nicht funktioniert, dann weiß ich leider auch nicht weiter.


    public TOTTimer(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pTod] == 1 && pIstTot[playerid] == 2)
    {
    PlayerInfo[playerid][pTod] = 0;
    pIstTot[playerid] = 0;
    SetPlayerVirtualWorld(playerid,0);
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Du bist nun aus dem Krankenhaus entlassen!");
    SetPVarInt(playerid,GetPVarInt(playerid,"tot_Skin"));
    TogglePlayerControllable(playerid,1);
    SpawnPlayer(playerid);
    }
    else if(PlayerInfo[playerid][pTod] == 1 && pIstTot[playerid] != 2)
    {
    //Dein Code, wenn er gestorben ist, aber nicht pIstTod auf 2 ist.
    }
    else return 1;
    }
    return 1;
    }

    So wird er dir das auch gar nicht printen. Wenn du eine Variable definierst die, wie in deinem Falle,
    dem Spieler das Leben auf 100 setzt, kannst du es dem Spieler auch per eigene Eingabe setzen, statt
    Ressourcen zu verschwenden.


    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    //Ordne das ein, wo es deiner Meinung nach bei dir am besten hingehört.
    new Float:health, pleben[2];
    pleben[0] = GetPlayerHealth(playerid,health);
    pleben[1] = SetPlayerHealth(playerid,100);
    printf("Spieler Leben: %f; Spieler leben gesetzt: %f", pleben[0], pleben[1]);



    //...Weiterhin zu deinem Todestimer
    //Und dann halt TOTTimer aufrufen, indem du in ins gewünschte Public einsetzt bzw. in OnPlayerDeath so:

    public OnPlayerDeath(...)
    {
    pIstTot[playerid] += 1;
    PlayerInfo[playerid][pTod] = 1;
    SetTimerEx("TOTTimer", 60000, 1, "i", playerid);
    SetPVarInt(playerid,"tot_Skin",GetPlayerSkin(playerid));
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Durch deine schweren Verletzungen liegst du im Koma!");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Du befindest dich für 2 Minuten im Krankenhaus.");
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: In 2 bis 3 Minuten kommst du wieder raus, da du gerade behandelt wirst.");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SendClientMessage(playerid, COLOR_WHITE, " ");
    SetPlayerPos(playerid,941.7925,1734.3978,21.1277);
    SetPlayerCameraPos(playerid, 993.5776,1653.3435,10.3279);
    SetPlayerCameraLookAt(playerid, 949.7623,1748.0996,26.2525);
    TogglePlayerControllable(playerid, 0);
    ResetPlayerWeapons(playerid);
    SetPlayerInterior(playerid, 0);
    SetPlayerColor(playerid, COLOR_ZIVI);
    return 1;
    }



    public TOTTimer(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pTod] == 1)
    {
    //Dein gewünschter Code, wenn er tot ist, aber pIstTot noch nicht 2 ist, sondern 1 oder so.
    }
    else if(PlayerInfo[playerid][pTod] == 1 && pIstTot[playerid] == 2)
    {
    PlayerInfo[playerid][pTod] = 0;
    pIstTot[playerid] = 0;
    SetPlayerVirtualWorld(playerid,0);
    SendClientMessage(playerid, COLOR_WHITE, "{FFA500}Information{FFFFFF}: Du bist nun aus dem Krankenhaus entlassen!");
    SetPlayerSkin(playerid,GetPVarInt(playerid,"tot_Skin"));
    TogglePlayerControllable(playerid,1);
    SpawnPlayer(playerid);
    }
    else return 1;
    }
    }


    Ich hoffe, ich konnte dir helfen und es funktioniert nun so, wie du es dir wünscht und hoffen wir mal, dass es nun auch richtig printet.


    Mit freundlichen Grüßen


    Kristik47

    Das mit dem 3DTextLabel würde ich eigentlich nicht anders als einfach per /save die Position
    des Objektes einfach dann im Create3DTextLabel einfügen und weiterhin weiß ich um ehrlich
    zu sein selber nicht, was du machen könntest. Das Label höchstwahrscheinlich einfach die ganze Zeit
    updaten per
    Also zuerst das Label erstellen per
    Create3DTextLabel(hitLife, Farbe, x, y, z, 10.0, deinvWelt, obDuWändeLabelSichtbarSeinSoll 0 = nein, 1 = ja);


    Dann bei OnPlayerShot:


    Update3DTextLabelText(labelName, Farbe, hitLife);


    @HandsUper


    Ich weiß leider nicht, ob das so ganz richtig ist, deshalb:


    @Jeffry


    Wenn du eine Sache definierst oder diese bereits in einem anderen Public definiert ist,
    dann darfst du nicht noch eine, gleichnamige Variable oder sonstiges erstellen. Merk dir:
    Es darf nichts gleichnamig sein.


    Mach statt hitid z.B.
    new hitLife = 999;


    Also:

    if(hitid == DeinObject)
    {
    hitLife--; // hitLife wie ich über diesem Absatz hier schreibe oben im Skript als new hitLife = 999; definieren. Nichts darf gleichnamig sein!
    if(hitLife == 0)
    {
    DestroyObject(DeinObject);
    }



    }



    @HandsUper

    Sieht besser aus als die Feuerwehrbase von Devine.
    Gefällt mir echt, ziemlich einfach gehalten und es sieht trotzdem gut aus.
    Die Dächer von den "Hütten" gefallen mir aber leider nicht.

    Hör auf so zu reden. Jeder hier gibt sich Mühe etwas auf die Beine zu stellen.
    Es gibt kein besser und kein schlecht; es gibt nur etwas, was man erweitern kann
    und etwas was alles nötige hat. Bevor du so sprichst, erstell doch erstmal selber
    etwas.


    BTT:


    Es sieht gut aus. Was ich noch verändern und erweitern würde, sind die schwarzen
    Flächen, denn dort kann man noch schöne Dekorationen platzieren.

    announce 1
    Überprüfe es ob du es so in der Server.cfg hast


    Das hat nichts mit der Seite zutun, die der Threadersteller.
    Das setzt man in der server.cfg und das wird nur in der
    samp.exe -> Serverliste angezeigt aber nicht auf monitor.sacnr.com


    E:


    @Trafico


    announce 0 No Toggle server to be announced to SA-MP masterlist. Set to 1 to enable announcing or 0 to disable.


    http://wiki.sa-mp.com/wiki/Server.cfg


    Es ist für Hamachi, aber er möchte bestimmt nicht nur 5 Spieler auf seinem
    Server haben, mit denen er skypen möchte und erklären, wie sie die Verbindung
    zu seinem Netwerk herstellen können.

    Vielen Dank, ich habe meinen Fehler gefunden. Ich glaube ich sollte
    pennen gehen :D war ein echt blöder Konzentrationsfehler von mir.


    Ich danke allen, die geholfen habe :)

    Der weitere Dialog wird nun angezeigt, aber wenn ich das SaveAcc-Passwort aus der Datenbank eingebe, wird
    die else-Abfrage abgespielt und ich bekomme erneut diesen Dialog; es ist also falsch, obwohl die Eingabe identisch
    dem Datenbankeintrag ist.



    enum SPDaten
    {
    SavePass[128]
    }
    new Spieler[MAX_PLAYERS][SPDaten];


    //OnPlayerConnect
    Spieler[playerid][SavePass] = 0;


    //Der Befehl
    ocmd:changepassword(playerid, params[])
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASSWORD, DIALOG_STYLE_INPUT, "Passwort-Änderung","Gebe hier zuersteinmal das Sicherheitspasswort ein, damit wir uns sicher sind, dass das dein Account ist.\nEs geht um das Sicherheitspasswort, dass du im Befehl /saveacc am Anfang eingegeben hast und es dir gut merken/notieren solltest!","Identifizieren","Abbrechen");
    return 1;
    }


    //Die beiden aufeinanderfolgenden Abfragen
    if(dialogid == DIALOG_CHANGEPASSWORD)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    //
    if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Achtung: Du bist gerade dabei dein Passwort zu ändern! Mach dir damit bewusst, dass du erneut /saveacc Vorgang\nmachen >> musst <<, denn wenn dein Passwort geändert werden muss, muss auch das Sicherheitspasswort geändert werden!","Ändern","Abbrechen");
    }
    else
    {
    ocmd_changepassword(playerid, "");
    }
    }
    }
    if(dialogid == DIALOG_CHANGEPASS_TRUE)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    if(strlen(inputtext) < 6 || strlen(inputtext) > 35) return ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Das Passwort darf nicht kürzer als 6 und nicht länger als 35 sein!\nAchtung: Wenn du das Accountpasswort änderst, so musst du das Sicherheitspasswort auch ändern.(/saveacc)","Ändern","Abbrechen");
    mysql_format(handle, pwquery, sizeof(pwquery), "UPDATE users SET password = (MD5('%e')) WHERE pid = '%d'", inputtext, Spieler[playerid][p_id]);
    mysql_function_query(handle, pwquery, true, "OnUserLogin", "d", playerid);
    Spieler[playerid][accSave] = 0;
    ocmd_saveacc(playerid, "");
    }
    }


    //OnUserLogin
    new spstring[128];
    Spieler[playerid][SavePass] = cache_get_field_content(0, "savepass", spstring, handle);


    //Speicherung
    format(fourthQuery, sizeof(fourthQuery),"UPDATE users SET savepass = '%s' WHERE id='%d'",
    Spieler[playerid][SavePass],
    Spieler[playerid][p_id]);


    mysql_function_query(handle, fourthQuery, false, "", "");


    //Das wars mal wieder.

    Okay ich versuchs nochmal,


    Da SavePass kein String ist, brauchst du auch nicht strcmp sondern den "=="(isequal) oder "!="(isnot) Operator


    ersetze if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    durch if(strval(inputtext) == Spieler[playerid][SavePass])


    Sowohl Inputtext als auch SavePass sind Zeichenketten, also Strings. Es sollen ja nicht nur Zahlen als "Sicherheitspasswort"
    gespeichert und abgefragt werden, sondern alles im Sinne von Zeichen. Also: Zahlen, Buchstaben, Symbole.


    @Zim30


    /E: Habs Probiert, so wie du es geschrieben hast, es wird aber dennoch kein Dialog angezeigt.

    Die Abfragen sind schon korrekt. strcmp gibt den Wert zurück, wenn sich die Zeichenketten entsprechen.


    Zeig mal, wie SavePass der Wert zugewiesen wird.



    //Der Enum, wo SavePass als erstes definiert wird (im Enum ist mehr, nur habe ich es zur Übersicht entfernt)
    enum SPDaten
    {
    SavePass,
    }
    new Spieler[MAX_PLAYERS][SPDaten];


    //Dann bei OnPlayerConnect auf 0 gesetzt, damit die ganzen Werte(die ich so habe) per OnUserLogin richtig geladen werden
    Spieler[playerid][SavePass] = 0;


    //Dann bei OnUserLogin
    new spstring[128];
    Spieler[playerid][SavePass] = cache_get_field_content(0, "savepass", spstring, handle);


    //Und als letztes wo es abgespeichert wird unter stock SaveUserStats(playerid);
    new fourthQuery[200];
    format(fourthQuery, sizeof(fourthQuery),"UPDATE users SET savepass = '%s' WHERE id='%d'",
    Spieler[playerid][SavePass],
    Spieler[playerid][p_id]);
    mysql_function_query(handle, fourthQuery, false, "", "");


    // das wars auch schon.

    Moin,


    bin gerade an einem System dran und komme irgendwie nicht drauf, wie ich den Eingabetext, also den Inputtext
    vom Spieler, mit einem Datenbankeintrag vergleichen kann. Sagen wir mal es ist ein Sicherheitspasswort, was
    der Spieler bei der Registration angegeben hat. Sein Problem ist, dass er sein Passwort vergessen hat, aber
    sein Sicherheitscode weiß und die Möglichkeit hat sein Passwort zu ändern. Er macht es und ab da will ich halt
    mal wissen, wie ich seine Eingabe mit seinem früheren Datenbankeintrag vergleichen kann.


    /E: PUSH
    Arbeite weiter an diesem System und habe immer noch das Problem mit der Abfrage.
    Habe zwar, wie von einigen vorgeschlagen, via strcmp verglichen, stoße aber jetzt schon seit einigen
    Stunden auf das Problem, dass der weitere Dialog nicht angezeigt wird:



    if(dialogid == DIALOG_PASSCHANGE_CONFIRM)
    {
    if(!response) return SCM(playerid, -1, "Abgebrochen.");
    if(response)
    {
    if(!strcmp(inputtext, Spieler[playerid][SavePass], false))
    {
    ShowPlayerDialog(playerid, DIALOG_CHANGEPASS_TRUE, DIALOG_STYLE_INPUT,"Passwort-Änderung","Achtung: Du bist gerade dabei dein Passwort zu ändern! Mach dir damit bewusst, dass du erneut /saveacc Vorgang\nmachen >> musst <<, denn wenn dein Passwort geändert werden muss, muss auch das Sicherheitspasswort geändert werden!","Ändern","Abbrechen");
    }
    else
    {
    ocmd_changepassword(playerid, "");
    }
    }
    }

    Ist, wie ich finde, eine sehr attraktive und gelungene Map.
    Sieht sehr sauber und präzise gemacht aus.


    Man sieht, dass du dir Mühe gegeben hast.
    Wenn nicht, dann ist das ja ein Klacks für dich.
    Dann kommen ja noch bessere Maps von dir.


    10/10

    Bei so einem riesen Code kann man leider nur schwer herausfiltern, wo den wirklich der Fehler ist.
    Vielleicht sagst du uns ja mal, was du zuletzt gemacht, verändert, reinkopiert, gelöscht oder sonstiges
    hast, denn möglicherweise merkst du auch, dass der Befehl ein wenig lang ist, wa?

    Bei deinem Object, das du erstellst direkt ein SetObjectHealth Kommando(wenn es das gibt)
    und bei OnPlayerWeaponShot abfragen, ob es dieses Object ist, mit welcher weaponid
    oder einfach direkt das Objekt zerstören, wenn es die hitid ist.
    Im Public zum Beispiel folgendes abfragen:



    if(hitid == NameDeinesObjektes)
    {
    DestroyObject(NameDeinesObjektes);
    //Weiterer Code z.B. Spieler erhält 1000000 EXP.
    }



    @HandsUper