Bei Fragen zu MySQL bzw Problemen beim Auslesen kann die Tabellenstruktur nie Schaden,also poste sie bitte.
Beiträge von Goldkiller
-
-
Also bitte,als ob sich Jemand die Mühe macht und den Kompletten Code im Kopf durchtestet... .
Hier mal der Code in besserer Übersicht,
http://pastebin.com/7XXe07d0Zurück zum Thema.Den Fehler wird sicherlich keiner auf Anhieb finden, es ist einfach zu viel Code den man überprüfen könnte.
Versuch es mit Debuggen, hier Link zu einem Tutorial.
Der Fehler wird sicherlich irgendwo mit killerid 0xFFFF zusammenhängen und ein "Array Index out of Bounce" hervorrufen. Alternativ kannst du auch das crashdetect Plugin benutzen, da bekommst du direkt die Zeile im Quelltext wo sich der Fehler befindet der den Crash hervorruft. -
Bei einem Befehl, der /machmichblau heißt eine playerid als Parameter anzugeben ist irgendwie unlogisch,meint ihr nicht ?
Die Fehlermeldung hat man sich wohl auch nicht durchgelesen,ZitatC:\Users\Kokosnuss\Desktop\Feuerwehr Server\gamemodes\GermanJust2Kill.pwn(385) : error 035: argument type mismatch (argument 1)
C:\Users\Kokosnuss\Desktop\Feuerwehr Server\gamemodes\GermanJust2Kill.pwn(386) : error 017: undefined symbol "COLOR_AQUABLUE"
C:\Users\Kokosnuss\Desktop\Feuerwehr Server\gamemodes\GermanJust2Kill.pwn(387) : error 017: undefined symbol "COLOR_AQUABLUE"#define COLOR_AQUABLUE 0x00FFFFFF
ocmd:machmichblau(playerid,params[])
{
if(IsPlayerAnPremium(playerid,1))
{
new string[128],/*pID,*/name[MAX_PLAYER_NAME]; // pID brauchst du nicht, da du /MACHMICHBLAU sowieso nur an dir selber anwendest,oder :-O?
GetPlayerName(playerid, name, sizeof(name));
if(sscanf(params,"u",pID))return GameTextForPlayer(playerid,"~b~/machmichblau", 3000, 4);// < Diese Zeile kann KOMPLETT weg!
format(string,sizeof(string),"%s hat sich Blau Makiert!! (PREMIUM)",name);
GameTextForAll(string, 5000, 3 );
SetPlayerMarkerForPlayer(playerid,COLOR_AQUABLUE);
SetPlayerColor(playerid,COLOR_AQUABLUE);
}
return 1;
} -
Das sollte eigentlich nicht passieren,vllt benutzt du die Funktion noch irgendwo Anders im Script ?
Ich weiss nicht ob ich dich richtig verstanden habe, wäre es aber nicht auch einfach möglich,die Funktion "MoneyHacker" bei "LoginTimer" aufzurufen ?
Noch etwas Anderes,
forward MoneyHacker(playerid);
public MoneyHacker(playerid)
{
LoginPerson[playerid] = 1;
// Sicher mit der Variable ? Die Namen passen irgendwie bei mir nicht zueinander :-O.
// Die Variable würde für mich eher bei 'LoginTimer' passen.
return 1;
} -
[...]
ocmd ist immer besser
Totaler Blödsinn,hat Neumaner aber auch schon geschrieben. ZCMD ist das Orginal,OCMD nur eine Kopie die hier im Forum stark verbreitet wird. Wie auch immer,zurück zum Thema.Füg mal Debugnachricht bei SpielerSpeichern ein:
stock SpielerSpeichern(playerid)
{
printf("Start: SpielerSpeichern(%d)",playerid);
new sname[MAX_PLAYER_NAME];
GetPlayerName(playerid,sname,sizeof(sname));
format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",sname);
printf("SpielerSpeichern: Spielerdatei -> '%s'",Spielerdatei);
dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid));
dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
dini_IntSet(Spielerdatei,"Adminlevel",GetPVarInt(playerid,"Adminlevel"));
dini_IntSet(Spielerdatei,"Baned",GetPVarInt(playerid,"Baned"));
GetAdminRank(playerid); // <- wozu isn das hier überhaupt gut :-O ?
printf("Ende: SpielerSpeichern(%d)",playerid);
return 1;
}
Poste mal die Ausgabe.Eventuell liegt es auch am Usernamen,falls dort Sonderzeichen vorhanden sind ( War früher jedenfalls so). -
[...]
Bischen mehr Code / Informationen schaden nie.
Steht denn in der Userdatei,dass der Spieler gebannt ist ( falls du ihn wirklich bannst ) ?
Du solltest den Fehler Rückwärts suchen.Am einfachstem geht es über Debuggen und du lernst deine Fehler selbstständig zu finden :-O. -
if(GetPVarInt(playerid,"Baned")==1)
{
SendClientMessage(playerid,ROT,"Du bist permanent vom Server gebannt");
Kick(playerid);
}
Lädst du denn vorher auch den Wert für die PVar "Baned" aus der Userdatei ? Denn PVars werden NICHT auf dem Server gespeichert, sie sind ungültig sobald der Spieler den Server verlässt. Bischen mehr Code / Informationen schaden nie.
Steht denn in der Userdatei,dass der Spieler gebannt ist ( falls du ihn wirklich bannst ) ? -
Da muss wohl Jemand nochmal etwas über sscanf lesen.
tutorials/5303-commands-mit-parametern/a) Du hast keine Variable für den Platzhalter "s", sondern nur für "u" pID.
b) Der Platzhalter "s" ist unnötig,da du keinen String/Text nach dem Spielernamen / ID haben möchtest.b wird wohl bei dir passen ;).
-
if(sscanf(params,"us",pID))
Da fehlt doch etwas nach pID , oder ? Der Tipp wäre in diesem Fall "s". -
Ok, dann erklär ich mal den Fehler.
Du benutzt im Befehl eine Schleife.Bei jedem Durchgang überprüfst du, ob der Spieler in der nähe einer Tankstelle ist. Ist er nicht in der nähe einer Tankstellen, beendest du die Schleife bzw den Befehl mit einem return. Heisst also,wenn beim 1 Durchgang der Schleife NICHT die passende Tankstelle gefunden wurde,wird immer die Meldung "Nicht in der nähe einer Tankstelle ausgegeben".Du müsstest den Teil mit der Schleife + Positionsüberprüfung zuerst machen und DANACH an Hand der korrekten tankstelle den Rest ( Kauf usw. ).
new tankstelle = -1; // -1 damit markieren wir als ungültig bzw kein Treffer.
for(new ti = 0; ti < MAX_TANKSTELLEN; ti++)
{
new dataFile[256], Float:tX, Float:tY, Float:tZ;
format(dataFile, sizeof(dataFile),"/Tankstellen/TS_%d.ini", ti);
tX = dini_Float(dataFile, "tX");
tY = dini_Float(dataFile, "tY");
tZ = dini_Float(dataFile, "tZ");
if( IsPlayerInRangeOfPoint(playerid, 3.0, tX, tY, tZ)) { // Achtung, ! Entfernt.
tankstelle = i;
}
}
if( tankstelle == -1 ) {
// Wir haben keine Tankstelle gefunden!
return 1;
}
// Den Rest ab hier abwickeln an "tankstelle".
Verständlich,oder ;-O ?Vorausgesetzt die Dateien existieren und es werden korrekte Daten ausgelesen ;).
//Edit: Eventuell beginnen bei dir die Tankstellen erst bei /Tankstellen/TS_1.ini und nicht 0 ?
-
Hmpf,komisch.
Würde jetzt mal testweise den Account löschen und mal schauen ob dann alles gespeichert wird oder nicht. Probier das am Besten mal aus und poste den Inhalt der Userdatei.
Änder auch mal folgendes ab:
printf("Versuche zu speichern");
if(gPlayerLogged[playerid] == 1 && INI_Exist(accFormat))
{
printf("LoggedIN && INI_Exist");
if(INI_Open(accFormat))
{
printf("INI_Open");
Wird alles korrekt über print in der Konsole / server_log ausgegeben? -
Befürchte es liegt an der Größe das Caches. Da SII mit einem Cache System arbeitet,muss dieser entsprechend der Anzahl der Zeilen von Dateien angepasst werden ( Komischer Satz :\ )
Öffne mal die sii.inc und suche nach INI_MAX_LINES.
Meine in der Originaldatei war es früher auf 50 gestellt.Erhöhe die Zahl einfach auf 80.Dann solltest du genug Platz haben für Einträge ;). -
-
sscanf erwartet als 1 Parameter ein Array / String.
Params ist bei dir aber kein Array bzw String.
Der Fehler liegt hier:
ocmd:veh(playerid,params)
Du musst aus params ein Array / String machen.//Edit: @SunRise, ... hab extra die Lösung nicht gepostet.
-
Edit: "Dabei wurden 10 mal 100 Einträge hintereinander in eine Datei geschrieben und wieder ausgelesen." Sagt doch aus, dass hintereinander 100 Einträge geschrieben wurden.
Wo liegt denn nun das Problem?
Das ließt definitiv der Großteil aller Leute so:
for(new i = 0 ; i < 10 ; i++) {
hsa_write("bla1","irgendwas");
hsa_write("bla2","irgendwas");
...
hsa_write("bla99","irgendwas");
hsa_write("bla100","irgendwas");
}
Steht ja auch dort so :-O!//Edit:
Bin hier fertig. Hier dreht man sich jetzt sowieso nur noch im Kreis :p. -
Das ist doch bescheuert.Der Test von BlackAce hat doch eindeutig bewiesen,dass SII selbst schneller ist als HSA.
Der Vergleich mit Bus und Auto hingt auch hinterher. Um es mit Auto und Bus zu vergleichen,streichen wir den Bus.Wir haben Auto A ( HSA ) und Auto B ( SII ).
Auto A fährt jeden Fahrgast einzelnt zum Ziel. Auto B dagegen fährt alle Gäste zusammen zum Ziel. Auto A wird höchstwahrscheinlich für den Fall von 1 Gast schneller sein. Natürlich ist der 1 Fahrgast deutlich eher dort,als jeder der Gäste von Auto B. Es wird aber niemals der Fall sein,dass Auto B langsamer alle Gäste befördert als Auto A jeden Gast einzelnt .//Edit:
Dann solltest du aber auch im Startpost hinzufügen,dass der Test nur gilt für das Schreiben von einzelnen Einträgen. Jetzt glauben sowieso schon zu viele,es wäre schneller als SII, was ja nicht unbedingt stimmt. Für einen Sonderfall ist es schneller, nicht für den normalen gebrauch. Denn du weisst sicherlich selber, wie oft speicherst du einen Einzelnen Eintrag ? -
Das soll der Test sein ? Der ist nicht gerade Aussagekräftig :\.
Ich mach mir einen eigenen Test fertig und behaupte jetzt schon mal,dass SII mit Abstand schneller sein wird ;). -
Kannst du die Beispielcodes zeigen, mit denen du die SII und HSA Testläufe gemacht hast?
Würde mich auch interessieren. Glaube nicht,dass SII wirklich langsamer sein soll als deins. Daher wäre es wirklich gut,mal den Testcode zu sehen ;).Wenn Speed wirklich so wichtig ist,dann schaut auch Y_INIan ( Y_Less ) oder DOF2 ( Double-O-7 ) im offiziellem Forum.Letzteres benutzt sogar hashing, um die Einträge schneller zu finden.
-
Dann musst du return 1; beim beenden des Befehls haben ( Die Letzte Zeile des Befehls,also nach SendClientMessage ) .Sonst ist bei dir wohl return 0, weshalb die Nachricht "Unkown Command" ausgibt.
http://wiki.sa-mp.com/wiki/OnPlayerCommandText
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/help", true))
{
SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: This is the /help command!");
return 1;
// Returning 1 informs the server that the command has been processed.
// OnPlayerCommandText won't be called in other scripts.
}
return 0;
// Returning 0 informs the server that the command hasn't been processed by this script.
// OnPlayerCommandText will be called in other scripts until one returns 1.
// If no scripts return 1, the 'SERVER: Unknown Command' message will be shown.
} -
Das kommt wenn zum Beispiel bei dem Platzhalter %s ein Zahlenwert kommt,bei %d eine Gleitkommazahl usw. Sprich,falscher Parameter für den Platzhalter.
Zeig mal die Funktion mysql_SetInt und die deklaration von Tankstelle.