Da ist der Fehler.
Ändere es zu
mysql_function_query(dbhandle,query,true,"OnPlayerRegister","i", playerid);
Beiträge von Jeffry
-
-
-
Poste bitte den Code, mit dem du den Spieler registrierst, also den Teil mit INSERT INTO.
Dort stimmen die Parameter nicht.Zitat[13:03:14] [ERROR] mysql_tquery - callback parameter count does not match format specifier length
-
Schau mal, du startest beides mal die 1036. Deshalb kommt beides mal das gleiche.
Eine gute Zeit wäre die Zeit, die das Tor braucht um zu öffnen, allerdings kannst du dir den Timer sparen, wenn der Sound sich sowieso automatisch beendet, also lasse den Timer erst mal weg.
-
Dann schalte mal den MySQL Debug Modus an und poste was im Log steht, wenn du dich registrieren willst.
Wie du das machst siehst du hier: Tipps: Scripting-Probleme richtig erklären (Kapitel 1.4) -
Es wäre besser, wenn du den Tageswechsel nicht über Stunde und Minute prüfst, da es ja durchaus mal vorkommen kann, dass dein Server um genau 0 Uhr aus ist, warum auch immer.
Außerdem könnte es ja sein, dass der Timer zwei mal um 0:00 aufgerufen wird, dann würde es zwei mal die Steuern abziehen.Daher ist es besser, wenn du es so machst:
new newDay; //Diese beiden musst du natürlich bei OnGameModeInit aus der cfg Datei laden.
new oldDay;public OnServerTime(hours, minutes) //Brauchst du die Werte?
{
new y,m,d;
getdate(y,m,d);
if(d != oldDay) //Wenn es ein anderer Tag ist
{
oldDay = d;
new timestamp = gettime() - 86400;
while(newDay <= timestamp) newDay += 86400; //Damit es immer den 0:00:00 Timestamp speichert.
new INI:config = INI_Open("NewDay.cfg");
INI_WriteInt(config, "Midnight", newDay);
INI_WriteInt(config, "oldDay", oldDay);
INI_Close(config);for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerOnline(i))
{
switch(pInfo[i][BankAccount])
{
case BANK_JUNIOR_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_JUNIOR_ACCOUNT;
case BANK_WORKER_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_WORKER_ACCOUNT;
case BANK_CHIEF_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_CHIEF_ACCOUNT;
case BANK_BUSINESS_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_BUSINESS_ACCOUNT;
}
}
}
}
return 1;
}Und dann eben noch beim Login prüfen, wie viele Tage zwischen newDay und dem Logout des Spielers liegen und entsprechend das Geld abziehen.
-
Die Funktionen an sich passen, allerdings stellt sich mir die Frage wo der Sinn ist, dass du StopSound nach 100ms aufrufst, das ist eine Zehntel Sekunde, da hörst du eigentlich gar nichts.
Poste mal den Code mit dem du den Sound für Tor und Türe starten lässt, also der Teil der SoundAbspielen aufruft.
Und erkläre bitte was du mit dem kurzen Timer bezwecken willst. -
Pascal.:
new geldweniger;
for(new i=0; i<sizeof(cInfo); i++)
{
if(!strcmp(cInfo[i][besitzer], SpielerName(playerid))) geldweniger += cInfo[i][csteuern];
}
GivePlayerMoney(playerid, payday - geldweniger);Schleife durch alle Fahrzeuge, wenn dem Spieler das Fahrzeug gehört wird der Steuerwert in die geldweniger Variable addiert. Am Ende wird ihm dann das geldweniger vom payday abgezogen.
Gegebenenfalls musst du den Code etwas anpassen, wenn du den PayPay in einer Schleife hast, aber das sollte kein Problem sein. -
Da hattest sehr viele Variablen durcheinander gebracht, das war einer der beiden Fehler, allerdings hat der sich über so ziemlich den ganzen Code gezogen.
Schau dir am besten meine und deine Version nebeneinander an und vergleiche sie, dann siehst du die genauen Unterschiede.Außerdem waren die SQL Queries falsch. Dazu habe ich dir ja denk Link gegeben, damit du die richtige Syntax dir mal anschaust und damit üben kannst.
-
Im Prinzip so:
ocmd:makeleader(playerid,params[])
{
new pID,string[128];
if(SpielerInfo[playerid][pAdminlevel] < 6) return SendClientMessage(playerid,Rot,"Möglich ab: "COLO" Adminrank 6");
if(sscanf(params,"us",pID,fname))return SendClientMessage(playerid,Rot,""COLO"Verwendung: "COLR"/makeleader [playerid][Fraktionsname]");
format(string,sizeof(string),""servertag" %s hat %s zum Leader gemacht!",GetName(playerid),GetName(pID));
SendClientMessageToAll(Rot,string);
//Hier musst du dann noch das Level des Spielers setzen etc...
new query[256];
format(query,sizeof(query),"UPDATE fraktionen SET `Leader` = '%s' WHERE fname = '%s'",GetName(pID),fname);
mysql_query(query);
return 1;
}
ocmd:invite(playerid,params[])
{
if(SpielerInfo[playerid][pLeader] == 0)return SendClientMessage(playerid,Rot,"Du bist kein Leader!");
new pID,string[128];
if(sscanf(params,"u",pID))return SendClientMessage(playerid,Rot,""COLO"Verwendung: "COLR"/invite [playerid]");
if(pID == playerid)return SendClientMessage(playerid,Rot,"Du kannst dich nicht selbst inviten!");
if(pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,Rot,"Keiner mit dieser ID Online!");
if(SpielerInfo[pID][pFraktion] !=0)return SendClientMessage(playerid,Rot,"Spieler ist bereits in einer Fraktion!");
new fID = SpielerInfo[playerid][pFraktion];
format(string,sizeof(string),"Du wurdest zur Fraktion %s invited!\n Bestätige oder brech es ab!",FDaten[fID][fName]);
ShowPlayerDialog(pID,DIALOG_INVITE,DIALOG_STYLE_MSGBOX,"Fraktions Invite",string,"Annehmen","Abbrechen");
SetPVarInt(pID,"inv_fraktid",fID);
SetPVarInt(pID,"inv_inviter",playerid);
return 1;
}if(dialogid == DIALOG_INVITE)
{
if(response)
{
new query[256];
new i = GetPVarInt(playerid, "inv_fraktid");
format(query, sizeof(query), "UPDATE spieler SET fraktion = '%d' WHERE name = '%s'",i, GetName(playerid));
mysql_query(query);
SendClientMessage(playerid,Rot,"Du hast die Einladung angenommen!");
SetPlayerPos(playerid,FDaten[i][fSpawnX],FDaten[i][fSpawnY],FDaten[i][fSpawnZ]);
SetPlayerInterior(playerid,FDaten[i][fSpawnI]);
SetPVarInt(playerid,"inv_fraktid",0);
}
else
{
SendClientMessage(playerid,Rot,"Einladung abgebrochen!");
SetPVarInt(playerid,"inv_fraktid",0);
}
}
Die Variablen bzw die SQL Daten musst du ggf anpassen.Übrigens, wenn du schon mit MySQL arbeitest, dann solltest du dich über die Syntax informieren und nicht einfach nur etwas hinschreiben was keinen Sinn gibt.
Da kann ich dir w3schools empfehlen: http://www.w3schools.com/sql/default.asp
Arbeite das mal durch. -
Am besten du änderst den Code:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
printf("playerid: %d, newkeys: %d | %d", playerid, newkeys, newkeys & KEY_YES);
if(newkeys & KEY_YES)
{
printf("Key erkannt, state: %d", GetPlayerState(playerid));
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid,COLOR_GRAU,"Du bist kein Fahrer eines Fahrzeuges");
new vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
printf("vehicleid: %d, engine: %d", vehicleid, engine);
if(engine != 0)
{
printf("Aus");
engine = 0;
SendClientMessage(playerid,COLOR_WHITE,"Info: Der Motor wurde ausgeschaltet.");
}
else
{
printf("Ein");
engine = 1;
SendClientMessage(playerid,COLOR_WHITE,"Info: Der Motor wurde eingeschaltet.");
}
printf("Fertig");
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
printf("Ende");
return 1;
}Dann geht es.
-
Du drückst die falsche Taste.
Laut http://wiki.sa-mp.com/wiki/Keys drückst du KEY_SPRINT.Dort muss 65536 als newkeys stehen, sofern du keine anderen Tasten drückst.
-
Was steht im Server Log, wenn du die Taste drückst und das hier einfügst?
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
printf("playerid: %d, newkeys: %d | %d", playerid, newkeys, newkeys & KEY_YES);
if(newkeys & KEY_YES)
{
printf("Key erkannt, state: %d", GetPlayerState(playerid));
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid,COLOR_GRAU,"Du bist kein Fahrer eines Fahrzeuges");
new vehicleid;
vehicleid = GetPlayerVehicleID(playerid);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
printf("vehicleid: %d, engine: %d", vehicleid, engine);
if(engine == 1)
{
printf("Aus");
engine = 0;
SendClientMessage(playerid,COLOR_WHITE,"Info: Der Motor wurde ausgeschaltet.");
}
else if(engine == 0)
{
printf("Ein");
engine = 1;
SendClientMessage(playerid,COLOR_WHITE,"Info: Der Motor wurde eingeschaltet.");
}
printf("Fertig");
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
printf("Ende");
return 1;
} -
Dann poste bitte mal dein gesamtes OnPlayerKeyStateChange.
-
Hast du denn schon einen Befehl bzw. eine Möglichkeit mit dem man einer Fraktion beitreten kann?
Wenn nein, dann solltest du erst das machen, da du dies als Grundlage brauchst, du kannst ja erst zum Leader einer Fraktion werden, wenn du in einer Fraktion bist.Außerdem:
INSERT INTO erstellt eine neue Zeile in der Datenbank, das machst du NUR beim erstellen der Fraktion.
Du musst hier UPDATE nutzen. -
Kommt eine Nachricht, wenn du in keinem Fahrzeug bist?
Wenn nein, welche Taste drückst du? -
Also, jetzt fangen wir nochmal von vorne an.
Du kaufst das Fahrzeug und gibst dann /carkey ein? Und dann ist es dort nicht?
Ist das so korrekt?
Wenn ja, dann poste bitte die aktuelle Version des /buycar und des /carkey Befehls.
Falls da Logs dabei sind, poste diese auch gleich.Und bitte nur erst mal das, die anderen Probleme beheben wir danach, sofern sie noch bestehen.
-
Probiere es doch bitte einmal selbst aus, wir können dir ja schlecht das ganze System schreiben, so sieht es nämlich grade aus.
Schau dir vielleicht vom Prinzip her mal dieses Tutorial an: http://forum.sa-mp.com/showthread.php?t=390214Wenn du am Code hängst kannst du den ja posten und erklären wo du hängst, aber fange wenigstens mal an.
-
Streamer Include und Streamer Plugin passen nicht zusammen.
=> Code mit dem zum Plugin passenden Include kompilieren, oder das zum Code passende Plugin einfügen.
-
Less bitte denn Thread durch, um sowelche Beiträge zuvermeiden.
Schick mir bitte auf 17:30 deine TeamViewer Daten, ich wüsste nicht was ich dich noch fragen soll. Muss das mal anschauen.EDIT:
Problem wurde behoben.
Grund waren zwei Änderungen, die hier nicht bekannt waren.Einmal war in der Schleife zum Einlösen des Codes eine return-Zeile mit einer continue-Zeile vertauscht, und zum anderen hat die Funktion die die ID nach dem eintragen in die Datenbank übergibt gelöscht, deshalb hat es mit der ID nie geklappt. Da kann man sich natürlich zu Tode suchen.

Funktioniert jetzt alles.