Gangkasse / Fraktionskasse [GF] version 1.0.5

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
  • Einen schönen guten Abend liebe Community.


    Das Ziel dieses Threads ist es, dass ihr eine funktionierende Gangkasse in eurem Script habt.


    Viele kennen die Gangkasse aus dem XGF-Script, aber mir ist zu Ohren gekommen, dass diese nicht funktioniert.
    Daher habe ich auf Wunsch von djksmurat mich heute Abend hingesetzt und versucht eine Gangkasse zu scripten.


    Und es hat geklappt!


    Ich scripte jetzt aktiv erst seit 3 Wochen und dies ist mein erstes Tutorial, weswegen ich weiß, dass es eventuell sauberere Lösungen gibt. Aber eigentlich geht es ja um das Produkt.


    Inhalt: (A - Basis)


    1. Änderungen am Script!


    2. Wie geht es weiter?


    1. Änderungen am Script!


    Die nachfolgende Detailierung macht euch klar wie und was ihr an eurem Script editieren müsst.


    1.1) Eine globale Variabel:


    Fügt oben in eurem script eine neue Variabel ein.


    new kasse1; //kasse1 ist die globale Variabel



    1.2) Das Abspeichern der globalen Variabel in eine Datei


    Sucht nach : OnGameModeExit()


    Erklärung: Beim Server-Restart oder beim Server-Close werden die Fraktionskassen in eine Datei im Ordner "scriptfiles" gespeichert.


    Fügt darunter ein:


    new File: Kassen = fopen("Kassen.ini", io_write);
    if (Kassen)
    {
    new var[32];
    format(var, 32, "Kasse1=%d\n",kasse1);fwrite(Kassen, var);
    }


    - Kassen ist die File-Id.
    - Kassen.ini ist die Datei in der die Kassen gespeichert werden.
    - kasse1 ist die globale Variable s.o.
    - fopen bedeutet, dass die Datei geöffnet wird. Sollte keine Datei vorhanden sein, wird eine automatisch erstellt.



    1.3) Das Einlesen der globalen Variabel in eine Datei


    Sucht nach: OnGameModeInit()


    Erklärung: Beim Start des Servers, sollen die Fraktionskassen natürlich geladen werden.


    Fügt darunter ein:


    new File: Kassen = fopen("Kassen.ini", io_read);
    if(Kassen)
    {


    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    while ( fread( Kassen , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "Kasse1" , true ) == 0 ) { val = ini_GetValue( Data ); kasse1= strval( val ); }
    }
    fclose(Kassen);
    }


    Wichtig hier ist, dass die Variabeln "Kassen.ini", "Kassen", "Kasse1" und "kasse1" wie bei OnGameModeExit() gleich sind.


    1.4) Die Commands.


    Damit man die Kassen auch verwenden kann brauchen wir auch Commands.


    Sucht nach: public OnPlayerCommandText(playerid, cmdtext[])


    und fügt unter:


    new giveplayerid, moneys, idx;
    cmd = strtok(cmdtext, idx);


    folgendes ein:


    if(strcmp(cmd, "/einzahlen", true) == 0)
    {
    new einzahlgeld;
    tmp = strtok(cmdtext, idx);
    einzahlgeld = strval(tmp);


    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 1)
    {
    if(GetPlayerMoney(playerid) >= einzahlgeld)
    {
    kasse1= kasse1+ einzahlgeld;
    GivePlayerMoney(playerid,-einzahlgeld);
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast Geld in die Fraktionskasse eingezahlt.");
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast nicht genügend Geld!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }
    }
    return 1;
    }
    if(strcmp(cmd, "/abheben", true) == 0)
    {
    new auszahlgeld;
    tmp = strtok(cmdtext, idx);
    auszahlgeld = strval(tmp);
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 1)
    {
    if(kasse1 >= auszahlgeld)
    {
    kasse1 = kasse1- auszahlgeld;
    GivePlayerMoney(playerid,auszahlgeld);
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast Geld aus der Fraktionskasse genommen.");
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"In der Fraktionskasse ist nicht mehr genügend Geld!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }
    }
    return 1;
    }
    if(strcmp(cmd, "/seekasse", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 1)
    {
    format(string, 256, "Kasse1: $%d",kasse1);
    SendClientMessage(playerid, COLOR_GRAD2, string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }


    }
    return 1;
    }


    Natürlich könnte man jetzt einen Ort festlegen wo man diese Befehle nur ausführen kann, aber dazu mehr in Version 1.1


    - PlayerInfo[playerid][pLeader] == 1 bedeutet, dass nur Leader (hier Leader der 1.Fraktion) die Befehle ausführen können.



    2.) Wie geht es weiter?


    Falls euch nicht klar sein sollte wie ihr jetzt eine zweite Gangkasse einfügt: Noch einmal im Schnelldurchlauf:


    Oben:


    new kasse2;


    bei OnGameModeExit()


    new File: Kassen = fopen("Kassen.ini", io_write);
    if (Kassen)
    {
    new var[32];
    format(var, 32, "Kasse2=%d\n",kasse2);fwrite(Kassen, var);
    }


    bei OnGameModeInit()


    new File: Kassen = fopen("Kassen.ini", io_read);
    if(Kassen)
    {


    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    while ( fread( Kassen , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "Kasse2" , true ) == 0 ) { val = ini_GetValue( Data ); kasse2= strval( val ); }
    }
    fclose(Kassen);
    }



    Bei OnPlayerCommandText


    if(strcmp(cmd, "/einzahlen", true) == 0)
    {
    new einzahlgeld;
    tmp = strtok(cmdtext, idx);
    einzahlgeld = strval(tmp);


    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 2)
    {
    if(GetPlayerMoney(playerid) >= einzahlgeld)
    {
    kasse2= kasse2+ einzahlgeld;
    GivePlayerMoney(playerid,-einzahlgeld);
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast Geld in die Fraktionskasse eingezahlt.");
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast nicht genügend Geld!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }
    }
    return 1;
    }
    if(strcmp(cmd, "/abheben", true) == 0)
    {
    new auszahlgeld;
    tmp = strtok(cmdtext, idx);
    auszahlgeld = strval(tmp);
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 2)
    {
    if(kasse2 >= auszahlgeld)
    {
    kasse2 = kasse2- auszahlgeld;
    GivePlayerMoney(playerid,auszahlgeld);
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast Geld aus der Fraktionskasse genommen.");
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"In der Fraktionskasse ist nicht mehr genügend Geld!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }
    }
    return 1;
    }
    if(strcmp(cmd, "/seekasse", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pLeader] == 2)
    {
    format(string, 256, "Kasse2: $%d",kasse2);
    SendClientMessage(playerid, COLOR_GRAD2, string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }


    }
    return 1;
    }


    Man muss eigentlich immer nur die 1 durch die nächste Zahl ersetzen und bei [pLeader] halt die Fraktions-ID.



    Inhalt(B - Features)


    1. Gehalt



    So das wars erstmal von mir.


    Über Rating und Kritik würde ich mich freuen.




    Features demnächst:


    - Befehle nur an der Base / Bank
    - Admin können alle Fraktionskassen einsehen.



    Für eure Fragen stehe ich zur Verfügung.


    8D.

    3 Mal editiert, zuletzt von 8D ()

  • schöne Sache..aber warum OnGameModeInit/Exit? Da kannst du doch auch OnPlayer(Dis)Connect nehmen (?)

    Zitat

    Nimm die Dinge wie sie sind: schlag, wenn du schlagen musst, tritt, wenn du Treten musst
    -Bruce Lee

  • Das wollte ich eigentlich ausführen:


    Wenn ich das bei OnPlayerConnect und OnPlayerDisConnect einfüge, wird die Datei ja gelesen und gespeichert sobald irgendein Spieler online bzw. offline geht, da es ja global ist.


    Nun sagen wir mal es sind 5 Spieler auf dem Server.


    Spieler1 zahlt 4000$ Dollar in die Gangkasse ein, dies wird dann scriptintern gespeichert in der kasse1-Variabel.


    Nun kommt Spieler6 online: die .ini datei wird neu gelesen und der alte Wert für kasse1 ohne die neuen 4000$ übernommen.
    Vielleicht habe ich einen Denkfehler, aber auf Grund dieser Sache finde ich es besser, dass solange der Server online ist alles script intern in der kasse1-Variabel gespeichert wird und beim Offline / Online setzen des Server gespeichert bzw. gelesen wird.


    Gleich kommt noch der /gehalt Befehl.

  • Du kannst das Tutorial ja auch auf No-Gf anpassen und einfach deine Leader / Member Bedingungen anpassen.


    Wie gesagt, ich bin noch recht neu am scripten und hab es halt in eine extra Datei gepackt.




    1.) Gehalt


    Suche nach: enum pInfo


    Füge darunter ein:


    pGehalt,


    Bei OnPlayerConnect()


    suche nach: PlayerInfo[playerid][pCarLic] = 0; oder ähnlichem.


    Füge darunter ein: PlayerInfo[playerid][pGehalt] = 0;


    Bei public ShowStats(playerid,targetid)


    suche nach: new bigfish = PlayerInfo[targetid][pBiggestFish]; oder ähnlichem.


    Füge darunter ein: new gehalt2 = PlayerInfo[targetid][pGehalt];


    suche nach: format(coordsstring, sizeof(coordsstring), "Drogen:[%d] Materialien:[%d] Team:[%s] Krankheit:[%s] Organisation:[%s] Rank:[%s]",drugs,mats,ttext,dtext,ftext,rtext);


    und ersetze es mit: format(coordsstring, sizeof(coordsstring), "Drogen:[%d] Materialien:[%d] Team:[%s] Gehalt:[$%d] Krankheit:[%s] Organisation:[%s] Rank:[%s]",drugs,mats,ttext,gehalt2,dtext,ftext,rtext);


    Bei public PayDay()


    suche nach: if(PlayerInfo[i][pPayDay] >= 5)
    {


    Füge darunter ein: if(PlayerInfo[i][pMember] == 1 || PlayerInfo[i][pLeader]== 1)
    {
    if(PlayerInfo[i][pGehalt] <= kasse1)
    {
    GivePlayerMoney(i,PlayerInfo[i][pGehalt]);
    kasse1= kasse1-PlayerInfo[i][pGehalt];
    }
    else
    {
    SendClientMessage(i,COLOR_GRAD2,"In der Gangkasse ist nicht mehr genügend Geld, beschwere dich bei deinem Leader!");
    }
    }


    Bei public OnPlayerRegister(playerid, password[])


    suche nach: format(var, 32, "Pos_z=%.1f\n",PlayerInfo[playerid][pPos_z]);fwrite(hFile, var); oder ähnlichem.


    Füge darunter ein: format(var, 32, "Gehalt=%d\n",PlayerInfo[playerid][pGehalt]);fwrite(hFile, var);



    Bei public OnPlayerUpdate(playerid)


    suche nach: format(var, 32, "Pos_z=%.1f\n",PlayerInfo[playerid][pPos_z]);fwrite(hFile, var); oder ähnlichem.


    Füge darunter ein: format(var, 32, "Gehalt=%d\n",PlayerInfo[playerid][pGehalt]);fwrite(hFile, var);


    Bei public OnPlayerLogin(playerid,password[])


    suche nach: if( strcmp( key , "Pos_z" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pPos_z] = floatstr( val ); } oder ähnlichem.


    Füge darunter ein: if( strcmp( key , "Gehalt" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pGehalt] = strval( val ); }



    Bei OnPlayerCommandText



    Füge ein: if(strcmp(cmd, "/gehalt", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    new playa;
    new gehalt;
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Verwendung: /gehalt [spielerid] [geld]");
    return 1;
    }
    playa = ReturnUser(tmp);
    tmp = strtok(cmdtext, idx);
    gehalt = strval(tmp);
    if(PlayerInfo[playerid][pLeader] == 1)
    {
    if(IsPlayerConnected(playa))
    {
    if(PlayerInfo[playa][pMember] == 1 || PlayerInfo[playa][pLeader] == 1)
    {
    PlayerInfo[playa][pGehalt] = gehalt;
    SendClientMessage(playerid, COLOR_GRAD2,"Du hast das Gehalt des Spieler erfolgreich bearbeitet.");


    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Dieser Spieler ist nicht in deiner Fraktion.");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Dieser Spieler ist nicht online!");
    }


    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD2,"Du bist kein Leader einer Fraktion!");
    }
    }
    return 1;
    }

    3 Mal editiert, zuletzt von 8D ()

  • ich finde die Fraktionskasse echt klasse. Du hast es gut hinbekommen.

    Zitat

    von 8D. auch auf No-Gf anpassen.

    Das ist für manche Usern
    die mit selfmade GM arbeiten auch nützlich. Mann kann es jedem empfehlen!
    Auch für GF scripter.


    und ich bedank mich nochmal bei dir.
    8D.


    mfg djksmurat

  • So demnächst folgt noch (1 - 2 Tage)


    - Online-Banking, d.h Geld aus der Kasse auf ein Bankkonto eines Spielers überweisen.


    - Spendenkonto, d.h Spieler können für die Fraktion spenden auf ein Spendenkonto.


    - Admins sehen den Betrag aller Kassen


    - Kassen-Commands nur an der Bank / Base-ATM

  • nicht schlecht .. ist zwar nicht all zu schwer geht sogar noch leichter... bzw. auch noch mehr detailierter aber für die anfänger nicht schlecht


    Idee : 8/10.
    Umsetzung : 7/10.
    Schwierigkeit : 2/10.

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Wie wärs,
    wenn du einfach n ganzen FFS machst, mit sachen kassen, bank usw.
    Somit haben Non GFler auch ne Bank und Gangkassen.


    Aber für fortgeschrittene sind Gangkassen eig. kein problem.


    mfg Kavkus

    Könnte ich machen, aber eigentlich wollte ich für neulinge wie mich diese Idee nur aufzeigen und nicht extrem stark ausbauen sondern an der basis festhalten, aber mal schauen.


    @[DotD]Dog ja geht bestimmt um einiges einfacher ^^ aber mir gehts gesagt immer ums produkt und dass ich verstehe was da eigentlich passiert,damit ich schnell meine Fehler finden kann =)


    Danke für das Rating.

  • es geht auch detailierter damit meine ich /einzahlen ..wenn man nur das eingibt das kommt /einzahlen betrag. vollkomende noobs würden dann sagen /einzahlen geht nicht ... :D klingt blöd aber glaub mir sowas gibt es.


    dann bsp. das speicher system viel zu kompliziert es geht viel einfacerh und sogar für non-gf´ler :), das meine ich.
    nur falls die frage auftritt warum ich dann nicht son tutorial mache.. ganz einfach user sollen es selbst lernen habe ich auch, und nicht irgendwo ausm tutorial rauskopieren dann behaupten selber gemacht ..(und so wird jeder GF oder Selfmade noch eintöniger weil selbst noob server das gleiche dann haben was die "guten" haben.)

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

  • Bsp.


    // Header
    new Staatskasse;
    #define COLOR_GRAD1 0xB4B5B7FF
    #define COLOR_ROT 0xAA3333AA
    forward lohn();
    forward lohnsave();




    Unter OngameMode


    lohn();


    public lohn()
    {
    new arrCoords[1][64];
    new strFromFile2[128];
    new File: file = fopen("kasse.ini", io_read);
    if (file)
    {
    fread(file, strFromFile2);
    split(strFromFile2, arrCoords, ',');
    Staatskasse = strval(arrCoords[0]);
    fclose(file);
    return 1;
    }
    }


    public lohnsave()
    {
    new coordsstring[128];
    format(coordsstring, sizeof(coordsstring), "%d",Staatskasse);
    new File: file2 = fopen("kasse.ini", io_write);
    fwrite(file2, coordsstring);
    fclose(file2);
    return 1;
    }



    das währe bsp einfaches laden/speichern wo man auch kein gf für braucht , und wenn du bsp was zur staatskasse hinzufügen willst


    if(strcmp(cmd, "/spenden", true) == 0)
    {
    new betrag;
    new string[128];
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_ROT, "Verwendung: /spenden [betrag]");
    return 1;
    }
    betrag= strval(tmp);
    if(betrag< 0)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Das ist nicht genug.");
    return 1;
    }
    if(GetPlayerMoney(playerid) < betrag)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Du hast nicht soviel Geld.");
    return 1;
    }
    GivePlayerMoney(playerid, -betrag);
    Staatskasse += betrag;
    lohnsave();
    format(string, sizeof(string), "du hast %d $ Gespendet.", betrag);
    SendClientMessage(playerid, COLOR_GRAD1, string);
    return 1;
    }


    sry für die verrutschungen.

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

    2 Mal editiert, zuletzt von Dog ()

  • jo es gibt bestimmt auch noch kürzere wege :D dma oder bright werden die bestimmt wissen , und jeder hat auch seine eigende beste möglichkeit.

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

  • Also dieses Speicherproblem ist echt schlimm... Das TUT 10/10 ehrlich, doch es sollte sofort gespeichert werden.


    Wie kann ich das machen? Den bei mir verschwindet das Geld einfach des öfteren und das regt auf!


    Vielen Dank im Vorraus

  • Also dieses Speicherproblem ist echt schlimm... Das TUT 10/10 ehrlich, doch es sollte sofort gespeichert werden.


    Wie kann ich das machen? Den bei mir verschwindet das Geld einfach des öfteren und das regt auf!


    Vielen Dank im Vorraus


    Wenn du das einlesen der Datei bei OnGameModeInIt hast und das speichern bei OnGameModeExit, kann nichts verloren gehen, da solange das Geld in der Variable gespeichert wird.
    Ich kann den Fehler leider nicht produzieren bei mir.
    Mein Vorschlag und mein Angebot wäre jetzt über dein Script drüberzuschauen und nach dem Fehler zu suchen. Wie gesagt ich habe die Codes so wie sie hier stehen bei mehreren Leuten eingebaut ohne fortführende Bugs / Probleme. Darauf habe ich vor dem Posten geachtet.



    @ mR_FatJoe<3 danke =)