Problem mit STRING?

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

  • ocmd:contract(playerid,params[])
    {
    new targetid;
    new cash1;
    if(sscanf(params,"ui",targetid, cash1))return SendClientMessage(playerid,ROT,"Contract [ID/NAME] [Bezahlung]");
    if(GetPlayerMoney(playerid) < cash1)return SendClientMessage(playerid,GELB,"Du hast nicht soviel Geld!");
    if(cash1 < 10000)return SendClientMessage(playerid, ROT, "Die Auftragsmörder wollen mindenstens 10000$ von dir sehen!");
    if(!IsPlayerConnected(targetid) || targetid == INVALID_PLAYER_ID) return SendClientMessage(playerid,ROT, "Spieler ist nicht online!");
    if(SpielerInfo[targetid][Contracted] == 1)return SendClientMessage(playerid, ROT, "Spieler ist bereits contracted!");
    SendClientMessage(targetid,ROT, "Unbekannt hat dich auf die Contractliste der Hitmans gesetzt!");
    SpielerInfo[targetid][Contracted] = 1;
    GivePlayerMoney(playerid, -cash1);
    Hitmankasse += cash1;
    return 1;
    }



    ocmd:contractlist(playerid,params[])
    {
    if(SpielerInfo[playerid][Fraktion] == 4)
    {
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(SpielerInfo[i][Fraktion] == 4)
    {
    new string[600];
    new targetid;
    new cash2;
    if(IsPlayerConnected(i))
    {
    if(SpielerInfo[i][Fraktion] == 4)
    {
    format(string,sizeof(string),"%s %i$ Kopfgeld",SpielerName(targetid),cash2); <-- Hier (Cash2) Soll dass Kopfgeld von /contract ausgelesen werden - > Siehe oben Contract Befehl
    ShowPlayerDialog(playerid,DIALOG_Contract,DIALOG_STYLE_MSGBOX,"Contractliste",string,"0K","");
    }
    }
    }
    }
    }
    return 1;
    }


    So jetzt die Frage, wie kann ich unten dass Geld (cash1) von /contract Abfragen und in dem Strign ausgeben?


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Du musst die Summer einfach irgendwo zwischendurch
    speichern, um sie in anderen Funktionen wieder aufrufen zu können.


    Hier empfiehlt sich einfach SetPVarInt(), wenn ich Dich
    richtig verstanden haben sollte.


    Falls nicht, korrigiere mich bitte nochmal. :rolleyes:

  • Wie meinst du das mit SetPVarInt? ich habe kein dini mehr als Speichermethode.


    Also, bei Contract, wird ja das Kopfgeld um den eingegeben Betrag erhöht bzw. Gesetzt, und dieses Kopfgeld soll in dem Dialog_Contract als Integer angezeigt werden.


    Bomber - 2500$ Kopfgeld


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • 1) Du solltest im /contract Befehl einen Wert von der Ziel-Person auf den Preis setzen lassen.
    2)
    Erstelle eine Variable.
    Erstelle eine Schleife durch alle Spieler.
    Frage in der Schleife ab, ob "xy" connected und eingeloggt ist.
    Frage in der Schleife ab, ob "xy" 'contracted' ist.
    formatiere den String und setze am Ende des Strings einen newline-character
    Verwende die Funktion "strcat" und setze den vorher formatierten String in einen anderen hinein.
    Setze die Variable die wir oben erstellt haben auf 1. (true)
    Schließe alle Klammern wieder.
    Mache eine Abfrage nach der Schleife, ob die Variable 0 ist.
    Wenn 0, dann lass anzeigen dass kein Auftragsmord vorhanden ist.
    Wenn 1, dann lass den Dialog mit dem formatierten String anzeigen.


    - Fertig :)

  • Wenn du mir noch erklärst was ein Newline Charachter ist? (\n) ?<-



    for (new i=0; i<sizeof(i); i++)
    {
    if(IsPlayerConnected(i)
    {
    new string[128];
    if(SpielerInfo[playerid][Contracted] == 1
    {
    }
    }
    }
    return 1;
    }

    Der Dialog soll ja nur bei /Contractlist angezeigt werden, nicht bei /Contract.^^


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • SetPVarInt() deklariert global beliebige Spielervariablen
    und ist keine Funktion, wie dini, die Deine Inhalte jetzt
    in irgendwelche Dateien einträgt.


    Ein verdammt schlauer Kerl, hat sich nämlich endlich
    mal bemüht, diese Spielervariablen so zu deklarieren,
    dass der Server nicht immer belastet wird.


    Hier kannst Du's nachlesen: SAMP-Wiki



    Meiner Meinung nach, eine kleine Revolution, auch wenns
    das nun schon ein paar Tage lang gibt
    ^^


    Ich verwende diese Spielervariablen nur, auch in Filterscripts,
    da es einfach ressourcen-schonendes Scripten ist.

  • Sagen wir ich habe jetzt oben, "new Auftragsgeld;" definiert


    SetPVarInt(targetid, "Kopfgeld", Auftragsgeld);


    Und denn oben bei /contractlist -> GetPVarInt(targetid,"Kopf",Auftragsgeld);?


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Nein!


    Du musst bei den Spielervariablen nichts definieren.


    Wenn der Befehl ausgeführt wird, wie hoch das
    Kopfgeld auf den Spieler sein soll, fügst Du folgendes hinzu:


    SetPVarInt(targetid, "Kopfgeld", 9999);
    Die 9999 ist der Integer-Wert, für die Variable Kopfgeld,
    die dem Spieler zugeordnet ist, auf den das Kopfgeld gegeben ist.


    D.h. für den Wert 9999, kannst Du Deinen Kopfgeldwert einfügen.



    Abrufen, kannst Du sie dann einfach mit GetPVarInt().


    Siehe hier: SAMP-Wiki



    Nochmal deutlich:


    Bei den Spielervariablen sind keine Deklarationen mehr nötig.


    Egal in welcher Funktion Du diese Variablen setzt, sie sind
    immer und überall im Script global gültig, bis Du sie löschst.

  • Danke, hat geklappt.


    Super!


    Aber wird die Variable jetzt auch gespeichert? bis er von einem Hitman erschossen wurde. (Von der Contractliste) gelöscht wurde?


    Engelsflügel am Astonkühler, als Schutz vor dem Teufel!

  • Die Spielervariablen sind jetzt solange aktiv, bis Du
    sie einfach löschst, oder die Spieler ID den Server verlässt.


    Genau das, ist ja die meindliche Revolution an dem System.


    Meiner Meinung nach, immer noch echt super!
    Und nicht nur das, ressourcenschonend ist es allemal.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Das wiederum, ist das Problem an den Spielervariablen.


    ABER, wenn der Spieler den Server verlässt, sollte man
    ja sowieso alle Variablen des Spielers, bsp. in einer Datei
    oder einen Datenbank speichern.



    Verbindet sich der Spieler dann neu, kannst Du gleich
    beim Laden der Infos des Spielers, diese Variablen setzen.



    ALS GANZ GROßEN TIPP EMPFIEHLT SICH: :D
    Spielervariablen, die für den Spieler gesetzt wurden, sollten
    beim Verlassen des Spieler, unbedingt gelöscht werden.
    Und erst beim Laden seiner Variablen wieder deklariert werden.

  • Wenn Du diesen System so durch Dein gesamtes
    Script ziehst, arbeitest Du nicht nur verdammt übersichtlich,
    nein sondern auch ressorcenschonend.


    Und genau das ist ja das tolle daran.


    Denn, mit ein paar kleinen Tipps, kann man viel damit erreichen :thumbup:




    EDIT sonic


    Ich muss mir ja noch etwas für weitere Beiträge aufheben
    und kann nicht gleich alles preisgeben, dann ist's ja langweilig.
    :D


    Geschnallt? Also bitte... :P

  • Naja, Du solltest die Variablen, vielleicht bei der Funktion
    OnPlayerDisconnect() leeren und nicht beim Verbinden.


    Und laden bzw. deklarieren tust Du sie dann, wenn die
    Spielervariablen aus der Datei geladen werden.



    Noch als kleiner Tipp:


    Ein Script, dass nicht unter diesem System arbeitet,
    ist sehr aufwendig, alles umzuschreiben, denn nahzu
    alle Variablen, die in der PlayerInfo definiert sind, also
    eigentlich das ganze Enum ist für'n A****.


    Denn wenn Du Dir das System wirklich animmst,
    verwendest Du es im gesamten Script, soweit möglich.



    sonic


    Das weiß ich doch, dass es nicht so gemeint war.
    Deswegen auch der gut gemeinde Smilie dahinter.
    :D

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