Da sehe ich keinen Fehler, kannst du mal den ganzen Gamemode posten? Wenn du willst kannst du mir es auch per PN schicken.
EDIT:
In ~Zeile 20:
new sscanf
for(new i; i< MAX_PLAYERS; i++)
Das muss weg.
Stattdessen brauchst du:
#include <sscanf2>
Da sehe ich keinen Fehler, kannst du mal den ganzen Gamemode posten? Wenn du willst kannst du mir es auch per PN schicken.
EDIT:
In ~Zeile 20:
new sscanf
for(new i; i< MAX_PLAYERS; i++)
Das muss weg.
Stattdessen brauchst du:
#include <sscanf2>
Poste bitte die zwei Codes, jeweils mit ein paar Zeilen drum herum, Zeile 22 und 92.
Das in Zeile 28 kannst du auch weg machen.
So wie es aussieht fehlt dir auch die sscanf Include.
Mach das weg:
#if Gamemode
Poste mal die ersten 20 Zeilen von deinem Code, möglicherweise liegt es an dem ersten Error, oder ggf gleich den ganzen Code.
Hast du die neueste ocmd Include heruntergeladen und damit mal deinen Code kompiliert?
[ INCLUDE ] ocmd 2.1.1 [ Update 3.11.2013 ]
Ja, das kannst du machen.
Arbeite dazu mit einer Spielervariable, die du bei jeder Transaktion um eins erhöhst, also beispielsweise:
SetPVarInt(playerid, "TransaktionID", GetPVarInt(playerid, "TransaktionID") + 1);
Dann fragst du beim speichern in die Datenbank ab, ob das größer als 10 ist, falls ja machst du ein Update, ansonsten ein Insert.
new id = GetPVarInt(playerid, "TransaktionID")-1;
if(id >= 10)
{
format(query, sizeof(query), "UPDATE tabelle SET datum = '%s', empfaenger = '%s' WHERE id = '%d' and name = '%s'", datum, empf, (id%10)+1, SpielerName(playerid));
//Das id%10 ist Modulo 10, also nur Werte zwischen 1 und 10.
}
else
{
format(query, sizeof(query), "INSERT INTO tabelle (id, datum, empfaenger, name) VALUES ('%d', '%s', '%s', '%s')", id+1, datum, empf, SpielerName(playerid));
}
Alternativ kannst du es auch so machen, dass du immer weiter hoch zählst und die löschst, die älter als die 10 neusten sind:
new id = GetPVarInt(playerid, "TransaktionID");
format(query, sizeof(query), "DELETE FROM tabelle WHERE id <= '%d' and name = '%s'", id-10, SpielerName(playerid));
format(query, sizeof(query), "INSERT INTO tabelle (id, datum, empfaenger, name) VALUES ('%d', '%s', '%s', '%s')", id+1, datum, empf, SpielerName(playerid));
Ist eben nicht ganz so performant, das macht hier aber keinen Unterschied.
PermanenT:
Wenn, dann so:
if(sscanf(inputtext,"u",pID))
s steht für Strings
u steht für das von dir Beschriebene ![]()
Schreibe es so:
Dafür gibt es die expander. ![]()
Schreibe es so:
if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
{
for(new i=0; i<sizeof(fcInfo); i++)
{
printf("DEBUG 1: vID: %d | i: %d | id_x: %d",vID,i,cInfo[i][id_x]);
if(fcInfo[i][id_x] != vID) continue;
printf("fc_id: %d",fcInfo[i][fc_id]);
if(fcInfo[i][fc_id] !=5) continue;
new string[128];
format(string,128,"Produkte kaufen");
ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
print("ENDE");
DisablePlayerCheckpoint(playerid);
return 1;
}
return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
}
Weil du "pickupid" in OnPlayerKeyStateChange nicht verwenden kannst.
Wenn du abfragen willst, ob der Spieler im Pickup ist, dann musst du das mit IsPlayerInRangeOfPoint machen.
Pascal.:
Debugge es so:
if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
{
for(new i=0; i<sizeof(fcInfo); i++)
{
printf("DEBUG 1: mID: %d | i: %d | id_x: %d",mID,i,cInfo[i][id_x]);
if(fcInfo[i][id_x] != mID) continue;
printf("fc_id: %d",fcInfo[i][fc_id]);
if(fcInfo[i][fc_id] !=5) continue;
new string[128];
format(string,128,"Produkte kaufen");
ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
print("ENDE");
DisablePlayerCheckpoint(playerid);
return 1;
}
return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
}
Was steht im Log?
[BE]axi92: Das ist ein optionaler Integer Parameter mit dem default Wert 0.
Bei beiden Codes musst du natürlich auch
i<MaxVeh[playerid];
Zu
i<3;
ändern, bzw zu MAX_PLVEHS, je nach dem wie du es gemacht hast.
Ist ja vom Prinzip her das gleiche, nur dass der Zähler dieses mal ein i ist.
Sorry für die späte Antwort.
Durch die returns bewirkst du, dass bei der ersten nicht Übereinstimmung gleich beendet wird. Schreibe es so:
if(IsPlayerInRangeOfPoint(playerid,range,2219.5276,-2228.8760,13.5469))
{
for(new i=0; i<sizeof(fcInfo); i++)
{
printf("DEBUG 1: Vehicle: %d | fcInfo[%i][fc_id] !=vID[%i]",vID,i,vID);
if(fcInfo[i][id_x] !=mID) continue;
printf("DEBUG 2: Vehicle: %d | vID[%i] != fcInfo[%i][fc_id]",vID,vID,i);
if(fcInfo[i][fc_id] !=5) continue;
new string[128];
format(string,128,"Produkte kaufen");
ShowPlayerDialog(playerid,DIALOG_BUYPRODS,DIALOG_STYLE_LIST,"Produkte",string,"Wählen","Abbrechen");
print("ENDE");
DisablePlayerCheckpoint(playerid);
return 1;
}
return SCM(playerid,COLOR_GRAU,"Fahre mit ein Fahrzeug deiner Fraktion zum Checkpoint.");;
}
Übrigens, Debug Meldungen setzt man vor die Abfrage, sonst weißt du ja nicht was die Werte sind, die geprüft werden. ![]()
Und wenn du vor den Aufruf der Funktion einen Print setzt? Ansonsten poste bitte mal den Code.
Was passiert, wenn du die Funktion im Aufruf einfach mal auskommmentierst?
//Fight_Init();
Vielleicht liegt es auch daran, dass du die 0.3d Version von sscanf auf einem 0.3z Server laufen lässt, aktualisiere die ggf mal.
Nicht danach, sondern in der Fight_Init Funktion. Also vom Anfang bis zum Ende der Fight_Init Funktion.
So wie die ini/txt/... Datei heißen soll, die hat ja einen Namen. Ich weiß ja noch wie du den vergibst, generell würde es auch einfach so gehen:
format(Banklog, sizeof(Banklog), "/SanAndreas-Bank/BankTransferLog.txt");
Beachte aber, dass der Ordner SanAndreas-Bank existieren muss, sollte klar sein, wenn der im Pfad steht.
Füge das ganz unten in deinen Gamemode ein:
forward SaveToFile(filepath[],text[]);
public SaveToFile(filepath[],text[])
{
new File:wFile, string[512], year,month,day, hour,minute,second;
getdate(year,month,day);
gettime(hour,minute,second);
wFile = fopen(filepath,io_append);
format(string,sizeof(string),"[%02d.%02d.%02d %02d:%02d:%02d] %s\r\n",day,month,year,hour,minute,second,text);
fwrite(wFile,string);
fclose(wFile);
return 1;
}
und dann dort wo du den Text speichern willst:
format(Banklog, sizeof(Banklog), "/SanAndreas-Bank/%s.ini", dateiname);
format(string2, sizeof(string2), "[Überweisung]: %s hat %s %d$ auf sein Konto überwiesen.", SpielerName(playerid), SpielerName(pID), strval(inputtext));
SaveToFile(Banklog, string2);
Dann bleibt dir leider nur noch das händische debuggen übrig, indem du am besten hier anfängst:
Fight_Init
Einfach zwischen jede Zeile einen print setzen, damit du anhand des Logs dann weißt, vor welcher Zeile der Code stoppt.
Wenn du die Zeile gefunden hast, und den Fehler nicht erkennst, poste sie hier.
Debugge es einfach so:
//Code...
printf("1");
//Code
printf("2");
...
Schreibe das so:
stock KillFrakCar(id)
{
DestroyVehicle(FrakCarInfo[id][f_ID]);
FrakCarInfo[id][f_ID] = 0;
}
Und das:
if(FrakCarInfo[i][f_Fraktion] == GetPVarInt(playerid,"Fraktion"))
zu:
if(FrakCarInfo[i][f_Fraktion] == GetPVarInt(playerid,"Fraktion") && FrakCarInfo[i][f_ID] > 0)
EDIT:
shoxinat0r: Gerne, kein Problem. Freut mich ![]()