Zeig mal wo und wie du den Timer startest (BusCountdown).
Zeig mal dein OnPlayerEnterCheckpoint callback, der Teil der das Eintreten des Checkpoints darstellt.
Deine Informationen sind sehr dürftig.
Zeig mal wo und wie du den Timer startest (BusCountdown).
Zeig mal dein OnPlayerEnterCheckpoint callback, der Teil der das Eintreten des Checkpoints darstellt.
Deine Informationen sind sehr dürftig.
Meine Glaskugel ist leider gerade kaputt.
Könntest du auch schildern, was genau nicht tut, bzw. was passiert wenn du was machst. Wird der Countdown angezeigt, kommt sonst irgendwas? Einfach alles was du weißt.
Wenn gar nichts passiert: Wird der Timer überhaupt aufgerufen?
Du hast
else if(buscd[playerid] == 2)
vergessen.
Nach 3 kommt bei dir 1, daher geht es nicht.
Den Chat kannst du mit 'return 0" in OnPlayerText verhindern zu senden.
Ein Tutorial für einen Admin Chat: http://forum.sa-mp.com/archive/index.php/t-134865.html
Das englisch ist zwar grausig, aber sollte trotzdem einigermaßen verständlich sein.
if(sInfo[playerid][Fraktion] == 1)
{
new string[200],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"%s funkt: %s",name,text);
scm(i,c_pd,string);
return 1;
}
zu
if(sInfo[i][Fraktion] == 1) //hier i
{
new string[200],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(string,sizeof(string),"%s funkt: %s",name,text);
scm(i,c_pd,string);
}
return 0;
Die null sagt hier, dass keine Chat Nachricht gesendet werden soll.
Außerdem muss sie aus der schleife raus, sonst zeigt es deinen funkspruch nur für eine Person an.
Und in der schleife musst du natürlich abfragen, ob i in der Fraktion ist, damit er die Nachricht bekommt, sonst bekommt sie jeder, da playerid ja zwangsläufig drinnen ist.
if(!GetPlayerMoney(playerid) < strval(inputtext))// Zeile 347
zu:
if(GetPlayerMoney(playerid) >= strval(inputtext))// Zeile 347
oder:
if(!(GetPlayerMoney(playerid) < strval(inputtext)))// Zeile 347
Beides geht.
Alle "inputtext" zu "strval(inputtext)"
if(!GetPlayerMoney(playerid) < strval(inputtext))// Zeile 347
{
new string[128];
new text[128];
format(string, sizeof string,"/Accounts/%s.ini",name(playerid));
dini_IntSet(string,"Bank",strval(inputtext)); // Zeile 352
format(text,sizeof text,"Sie haben erfolgreich %i$ eingezahlt !",strval(inputtext));
ShowPlayerDialog(playerid,ABHEBEN,DIALOG_STYLE_MSGBOX,"Einzahlung erfolgreich !",text,"Auf","Wiedersehen");
}
strval = der Zahlenwert eines Strings.
@TheBlueFireKing:
Ja.
Siehe: MYSQL Lädt falsche werte
Die format-Zeile ("format(string, sizeof(..." ) musst du eben auf dein dini_Get abändern.
Das wird ja immer schlimmer. ![]()
Der Grund für den Fehler ist, dass in einem enum dürfen keine Zahlen stehen, dort müssen "Variablen" (Definitionen) stehen.
Das kannst du so nicht machen.
Wenn du abfragen willst, ob der Spieler in einem Auto mit einer der obigen IDs ist, musst du ein Array erstellen:
new carIDs[] = {
400, 409, 415, 422, 434, 442, 459, 475, 482, 492,
401, 410, 418, 423, 436, 444, 466, 477, 483, 494,
402, 411, 419, 424, 438, 445, 467, 478, 489, 495,
404, 413, 420, 426, 439, 451, 470, 479, 490, 496,
405, 414, 421, 429, 440, 458, 474, 480, 491, 500,
502, 503, 504, 505, 506, 507, 516, 517, 518, 525,
526, 527, 528, 529, 532, 533, 534, 535, 536, 540,
541, 542, 543, 545, 546, 547, 549, 550, 551, 552,
554, 555, 556, 557, 558, 559, 560, 561, 562, 565,
566, 567, 568, 575, 576, 579, 580, 582, 585, 587,
589, 596, 597, 598, 599, 600, 601, 602, 603, 604,
605
};
Edit:
Noch die Abfrage gratis dazu:
stock IstInAuto(playerid)
{
new id = GetVehicleModel(GetPlayerVehicleID(playerid));
for(new i = 0; i<sizeof(carIDs); i++) if(id == carIDs[i]) return 1;
return 0;
}
Im Post unter mir:
@NeonReflexe: Man lernt, indem man liest. Du lernst ja in der Schule auch, indem du zuhörst, und nicht indem der Lehrer dir zuhört.
(PS: Bester Song ever, Wise Guys
).
Der rechnet meine ich das ganze mit Variablen und gettime aus. Ganz so übertrieben wird das bei den Timern nicht... du musst Timer bei manchen sachen benutzen und das würde heißen, dass jeder Server laggen wurde?!
Wer auch immer dir das erzählt hat, der wollte dich wohl auf den Arm nehmen und zwar gehörig. ![]()
Hier mal ein debug für dein "wait" stock:
stock wait(seconds)
{
new _newTime[4], _oldTime[4], i;
gettime(_oldTime[0], _oldTime[1], _oldTime[2]);
_oldTime[3] = _oldTime[2] + (_oldTime[1] * 60) + (_oldTime[0] * 600);
while(_newTime[3] != (_oldTime[3] + seconds))
{
gettime(_newTime[0], _newTime[1], _newTime[2]);
_newTime[3] = _newTime[2] + (_newTime[1] * 60) + (_newTime[0] * 600);
printf("Aufruf Nummer: %d", i);
i++;
}
}
wait(30);
Probiers bitte mal aus. Bei mir kam i bis zu 587723, bei 30 Sekunden, das heißt die Schleife wiederholt sich in 30 Sekunden 587724 mal (hat bei 0 angefangen zu zählen). In dieser Zeit geht gar nichts am Server, die CPU Leistung schießt auf 100% hoch. Wenn irgendein Server die Funktion verwendet, dann kann ich dir garantieren, dass dort keiner spielt.
ZitatAlles anzeigenSpoiler anzeigen [10/11/2013 00:00:00] Aufruf Nummer: 0
[10/11/2013 00:00:00] Aufruf Nummer: 1
[10/11/2013 00:00:00] Aufruf Nummer: 2
[10/11/2013 00:00:00] Aufruf Nummer: 3
[10/11/2013 00:00:00] Aufruf Nummer: 4
[10/11/2013 00:00:00] Aufruf Nummer: 5
[10/11/2013 00:00:00] Aufruf Nummer: 6
[10/11/2013 00:00:00] Aufruf Nummer: 7
[10/11/2013 00:00:00] Aufruf Nummer: 8
[10/11/2013 00:00:00] Aufruf Nummer: 9
[10/11/2013 00:00:00] Aufruf Nummer: 10
[10/11/2013 00:00:00] Aufruf Nummer: 11
[10/11/2013 00:00:00] Aufruf Nummer: 12
[10/11/2013 00:00:00] Aufruf Nummer: 13
(...)
[10/11/2013 00:00:29] Aufruf Nummer: 587716
[10/11/2013 00:00:29] Aufruf Nummer: 587717
[10/11/2013 00:00:29] Aufruf Nummer: 587718
[10/11/2013 00:00:29] Aufruf Nummer: 587719
[10/11/2013 00:00:29] Aufruf Nummer: 587720
[10/11/2013 00:00:29] Aufruf Nummer: 587721
[10/11/2013 00:00:30] Aufruf Nummer: 587722
[10/11/2013 00:00:30] Aufruf Nummer: 587723
In diesem Fall ist ein Timer angebracht.
new Float:Pos[3] = GetPlayerP(playerid); //Zeile 235
zu:
new Float:Pos[3];
Pos = GetPlayerP(playerid);
Da geht warscheinlich kein Weg an einem Timer vorbei :o Ich benutze bei so etwas gerne die funktion "wait".
Bloß nicht!!!!
Da kannste ja schonmal Gute Nach zu deinem Server sagen. Diese Funktion hängt den Server für X Skunden einfach auf, die CPU Leistung rast auf 100% hoch. Da ist so ziemlich das falscheste was man nur machen kann.
Das ist absolut falsch das hier zu verwenden.
------------------
Ganz einfach:
new pCar[MAX_PLAYERS] = {-1,...};
new pTimer[MAX_PLAYERS] = {-1,...};
OnPlayerStateChange
if(newstate == PLAYER_STATE_DRIVER) KillTimer(pTimer[playerid]), pTimer[playerid] = -1, pCar[playerid] = GetPlayerVehicleID(playerid);
if(oldstate == PLAYER_STATE_DRIVER && IsATutorialVehicle(pCar[playerid])) pTimer[playerid] = SetTimerEx("RemoveCar", 30000, 0, "dd", pCar[playerid],playerid), pCar[playerid] = -1;
forward RemoveCar(id,playerid);
public RemoveCar(id,playerid)
{
pTimer[playerid] = -1;
for(new i=0; i<MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == id && IsPlayerInAnyVehicle(i)) return 1; //Spieler im Auto
return SetVehicleToRespawn(id);
}
stock IsATutorialVehicle(id) //TutCar entsprechend der Variable für die Tutorial Autos.
{
for(new i=0; i<MAX_VEHICLES; i++) for(new t=0; t<MAX_TUT_CARS; t++) if(i == TutCar[t]) return 1;
return 0;
}
Einige teile werden bestimmt an deinen Code angepasst werden müssen, je nach dem wie dein Code aussieht.
Für jede Fraktion eine extra Tabelle. Das macht die ganze Sache strukturiert und übersichtlich.
new vehicleid;
zu:
new vehicleid = GetPlayerVehicleID(playerid);
Falls IsATutVeh nach der ModelID abfragt:
new vehicleid = GetVehicleModel(GetPlayerVehicleID(playerid));
Hast du denn kein Statistiken System mit dem dein Server die Spieler-Statistiken speichert?
Wenn doch, dann solltest du dir dort abschauen wie es dort gemacht wurde. Am besten wäre es natürlich, wenn du die Sache selbst gemacht hättest.
Einfach mal nachschauen wie z.B. Geld gespeichert wird. Das machst du dann genauso mit den beiden Variablen, jeweils.
Ach ja, das auch noch. Hatte ich gar nicht gesehen. Mensch != Kompiler ![]()
new fid[46];
fid = GetPVarInt(playerid,"Fraktion")
format(FrakDatei,sizeof(FrakDatei),"/Fraktionen/%s.txt",fid);
zu:
new fid;
fid = GetPVarInt(playerid,"Fraktion")
format(FrakDatei,sizeof(FrakDatei),"/Fraktionen/%i.txt",fid);
Das Gleiche hier, fid ist ein Interger.
Die Anzahl ist eine Zahl (Integer) und muss auch als solches deklariert und verwendet werden:
ocmd:storedrugs(playerid,params[])
{
new anzahl;
if(GetPVarInt(playerid,"Fraktion")==3)
{
if(sscanf(params,"i",anzahl))return SendClientMessage(playerid,blau,"Tippe: /storedrugs [Anzahl]");
if(IsPlayerInRangeOfPoint(playerid,6.0,-2714.7249, -314.5928, 6.6404))
{
if(GetPVarInt(playerid,"Drogen") < anzahl) return SendClientMessage(playerid,rot,"** Du hast nicht so viel Drogen bei dir.");
{
new FrakDatei[128];
new fid[46];
fid = GetPVarInt(playerid,"Fraktion")
format(FrakDatei,sizeof(FrakDatei),"/Fraktionen/%s.txt",fid);
dini_IntSet(FrakDatei,"Drogen",anzahl);
SetPVarInt(playerid,"Drogen",GetPVarInt(playerid,"Drogen")-anzahl);
}
}
}
}
Wenn du mir zeigst wie du sie speicherst, kann ich dir sagen warum das so ist.
Ich vermute mal, dass du versuchst einen String in ein Integer zu speichern.
Die rufst die Funktion nirgends auf.
Entweder löschen, an entsprechender Stelle hinzufügen ODER:
stock resetPlayer(playerid){ sInfo[playerid][level]=0; sInfo[playerid][eingeloggt]=0; sInfo[playerid][id]=0; return 1;}
Steht "stock" davor, so wird der Schnipsel so lange vom Compiler ignoriert, bis du ihn benutzt.
Ist doch schon gemacht. ![]()
Siehe hier:
format(string,sizeof(string),"Respektpunkte: %i/%i",GetPVarInt(i,"Respektpunkte"), GetPlayerScore(i)*8);
Da du dem Spieler 1 Score gibst wenn er ein neues Level erreicht, habe ich einfach GetPlayerScore genommen, und das mal 8 um das 8,16,24,... zu erreichen. Einfache Mathematik.