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.
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.