Wenn du nirgends einen Timer killst ist das Problem eigentlich nicht zu erklären, ich wüsste zumindest nicht, was die Ursache sonst sein könnte.
Ich würde es vorerst einfach so lassen, spielt ja keine Rolle. Vielleicht findet sich irgendwann der Fehler von selbst, und wenn nicht ist es auch nicht wirklich tragisch, sofern das das einzige Problem mit den Timern ist.
Beiträge von Jeffry
-
-
if(400 <= GetVehicleModel(GetPlayerVehicleID(playerid)) <= 410)
{
//Model ID des Fahrzeugs ist zwischen 400 und 410.
} -
Ich habe nirgendswo CloseTimer. das ist ja das komische
CloseTimer? Du meinst KillTimer. Such mal danach.
Möglicherweise in einer Include oder einem Filterscript?Funktioniert der Befehl denn, wenn du es so machst? Falls der Grund für den Fehler nicht auffindbar ist könntest du es dann ja so machen (im Endeffekt wird es der User nicht merken).
-
Kein Problem.
Gut, also das sieht mir stark danach aus. Beheben kannst du das nur, indem du den Code findest, der dir den Timer 4 stoppt, da müsstest du alle deine KillTimer's mal debuggen (print davor setzen und die Timer ID ausgeben lassen).
Wenn dir das zu viel Arbeit ist, könntest du es (gegebenenfalls übergangsweise) auch so umgehen:
if(strcmp(cmd, "/tor", true) == 0 || strcmp(cmd, "/gate", true) == 0)
{
SetTimerEx("CloseGateTimer",100, 0, "i",-1);
if(IsPlayerInRangeOfPoint(playerid, 10, -493.39999, -562.79999, 26.2))//Wheelmen Gate
{
if(PlayerInfo[playerid][pFraktion] != 8 && PlayerInfo[playerid][pAdmin] < 4)return SCM(playerid, COLOR_WHITE, #FEHLERTEXT"Du besitzt nicht die benötigten Rechte.");
MoveObject(Gate[0], -493.39999-8, -562.79999, 26.2, 1.0);//Wheelmen Links
MoveObject(Gate[1], -485.60001+8, -562.79999, 26.2, 1.0);//Wheelmen Rechts
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",1);
printf("Timer1 ID: %d", timer);
return 1;
}
if(IsPlayerInRangeOfPoint(playerid, 10, 1589.6, -1638.2, 14.6))
{
if(PlayerInfo[playerid][pFraktion] != 2 && PlayerInfo[playerid][pAdmin] < 4)return SCM(playerid, COLOR_WHITE, #FEHLERTEXT"Du besitzt nicht die benötigten Rechte.");
MoveObject(Gate[2],1589.6, -1638.2, 14.6-8,1.0);
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",2);
printf("Timer2 ID: %d", timer);
return 1;
}
if(IsPlayerInRangeOfPoint(playerid, 10, 1544.7, -1630.8, 13.1))
{
MoveObject(Gate[3], 1544.7, -1630.8, 13.1+0.1,1.0, 0, 0, 90);
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",3);
printf("Timer3 ID: %d", timer);
return 1;
}
return 1;
}
Das behebt das Problem zwar nicht im Ursprung, aber in der Ausführung. Falls nicht, poste nochmal die prints. -
poste dann was im Log steht, wenn du es das erste mal, das zweite mal und das dritte mal eingibst.
Du hast es nur einmal eingegeben. -
Ich gehe davon aus, dass du den Timer woanders im Code versehentlich killst (alter Wert in einer Variable?).
Füge die prints mal so hinzu und poste dann was im Log steht, wenn du es das erste mal, das zweite mal und das dritte mal eingibst.
if(strcmp(cmd, "/tor", true) == 0 || strcmp(cmd, "/gate", true) == 0)
{
if(IsPlayerInRangeOfPoint(playerid, 10, -493.39999, -562.79999, 26.2))//Wheelmen Gate
{
if(PlayerInfo[playerid][pFraktion] != 8 && PlayerInfo[playerid][pAdmin] < 4)return SCM(playerid, COLOR_WHITE, #FEHLERTEXT"Du besitzt nicht die benötigten Rechte.");
MoveObject(Gate[0], -493.39999-8, -562.79999, 26.2, 1.0);//Wheelmen Links
MoveObject(Gate[1], -485.60001+8, -562.79999, 26.2, 1.0);//Wheelmen Rechts
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",1);
printf("Timer1 ID: %d", timer);
return 1;
}
if(IsPlayerInRangeOfPoint(playerid, 10, 1589.6, -1638.2, 14.6))
{
if(PlayerInfo[playerid][pFraktion] != 2 && PlayerInfo[playerid][pAdmin] < 4)return SCM(playerid, COLOR_WHITE, #FEHLERTEXT"Du besitzt nicht die benötigten Rechte.");
MoveObject(Gate[2],1589.6, -1638.2, 14.6-8,1.0);
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",2);
printf("Timer2 ID: %d", timer);
return 1;
}
if(IsPlayerInRangeOfPoint(playerid, 10, 1544.7, -1630.8, 13.1))
{
MoveObject(Gate[3], 1544.7, -1630.8, 13.1+0.1,1.0, 0, 0, 90);
new timer = SetTimerEx("CloseGateTimer",5000, 0, "i",3);
printf("Timer3 ID: %d", timer);
return 1;
}
return 1;
} -
if(!strlen(inputtext) <4)
zu:
if(strlen(inputtext) < 4) -
Also, folgendermaßen dann, wenn du es mit der Include nicht hinbekommst.
Entferne das
#include <ForAllPlayers>
wieder.Dann schreibe unter den Includes irgendwo:
#define ForAllPlayers(%0) for(new index_%0=0,%0=ConnectedPlayerList[0]; index_%0<ConnectedPlayers; index_%0++,%0=ConnectedPlayerList[index_%0])
new ConnectedPlayers, ConnectedPlayerList[MAX_PLAYERS+1];Bei OnPlayerConnect fügst du das hinzu:
if(!IsPlayerNPC(playerid)) AddPlayer(playerid);Bei OnPlayerDisconnect das:
if(!IsPlayerNPC(playerid)) RemovePlayer(playerid);Und das hier fügst du ganz unten in deinen Gamemode ein:
stock AddPlayer(playerid){
if(ConnectedPlayers>=MAX_PLAYERS || playerid<0 || playerid>=MAX_PLAYERS) return 0;
ConnectedPlayerList[ConnectedPlayers++]=playerid;
return 1;
}stock RemovePlayer(playerid){
for(new i;i<ConnectedPlayers;i++){
if(ConnectedPlayerList[i]==playerid){
ConnectedPlayers--;
ConnectedPlayerList[i]=ConnectedPlayerList[ConnectedPlayers];
return 1;
}
}return 0;
} -
Davon gehe ich aus, ja. Am besten du probierst es aus, dann siehste ob es klappt.
-
-
#include <MD5>
Zu
#include <MD5>
#include <ForAllPlayers> -
Kopiere den Code, erstelle im /pawno/includes Ordner eine Datei ForAllPlayers.inc und füge dort den Code ein.
-
Du benötigst diese Include:
http://sampwbb3.bplaced.net/download/inc/ForAllPlayers.inc -
Zeile 1 und 26.
Oder alternativ unter den Includes das einfügen:
#define FACTION_CARS_LOCKABLE -
Suche nach den beiden Funktionen und entferne auch dort das #if und #endif Zeug.
-
Wie oft willst du das noch sagen? Das hab ich im ersten Post bereits dargestellt, daher verstehe ich nicht warum du so ein Drama darum machst. Natürlich ist das so, aber es ist nicht die beste Möglichkeit, daher ist sie, vor allem hinsichtlich dem was xMichael wissen wollte, nutzlos.
memcpy ist eine alternative zu strcat, aber die "löscht" dir auch nicht den string, sondern kopiert nur einen anderen String quasi darein.
Wenn man es richtig macht ist der Rest dahinter auch weg, bzw nicht mehr als das erkennbar was es mal war.
new x[] = "BlaBlub";
memcpy(x, "Noob", 0, 32); -
Ja, wie gesagt, das geht.
Es kommt nur darauf an, welche Daten du letztendlich darin speichern willst. -
Willkommen auf Breadfish!
Lade dir das crashdetect Plugin herunter und füge es in deinen Server ein. Dann poste was im Server Log steht, wenn der Server abstürzt.
http://forum.sa-mp.com/showthread.php?t=262796 -
Hi ich suche eine Polizei Cape. Und eine frage kann mann die Objekte vergrößern?
Objekt ID: 18636, 19161, 19162Ja, Objekte können mit SetPlayerAttachedObject skaliert werden.
-
So, nach Absprache konnte ich es auf seinem Server samt Code selbst testen. Der Fehler liegt hier:
forward GiveHandyNummer(playerid);
public GiveHandyNummer(playerid)
{
new string[50],string2[50],string3[50];
new handyn = randomEx(1000,999999);
new hn;
new aktion = 0;
format(string,sizeof(string),"157%d",handyn);
for(new x = 0; x < Handynummer+5; x++)
{
format(string3,sizeof(string3),"%d",x);
hn = mysql_GetInt("accounts", "pHandy", "id",string3);
format(string2,sizeof(string2),"%d",hn);
if (!strcmp(string2, string, true))
{
GiveHandyNummer(playerid);
aktion = 1;
break;
}
}
if(aktion == 1)
{
return 1;
}
SpielerInfo[playerid][pHandy] = strval(string);
return 1;
}
Handynummer hat den Wert von ~500000. Somit macht er 500000 Anfragen auf die Datenbank. Das ist natürlich zu viel (das erklärt warum es nach 5 Minuten wieder ging, da war er dann endlich durch).
CPU: (SA-MP ist Single-Core)
Quelle: Eigener ScreenshotSo muss der Code aussehen:
forward GiveHandyNummer(playerid, sec);
public GiveHandyNummer(playerid, sec)
{
new string[50];
//Nummer wird erstellt aus: 157 & LaufendeNr & RandomNr
format(string,sizeof(string),"157%d%d",Handynummer,randomEx(100,999));
//Prüft ob die Nummer bereits existiert (kann eigentlich nicht sein)
if(mysql_GetInt("accounts", "ID", "pHandy", string) != -1)
{
//Nummer existiert bereits (warum?!) -> Nochmal versuchen, bis zu 100 mal.
if(sec < 100) GiveHandyNummer(playerid, sec+1);
else format(SpielerInfo[playerid][pHandy], 32, "-1"); //Ein Fehler ist aufgetreten (das kann eigentlich niemals vorkommen)
return 1;
}
format(SpielerInfo[playerid][pHandy], 32, string);
return 1;
}Somit auch beim Registrieren des Spielers:
GiveHandyNummer(playerid);
zu:
GiveHandyNummer(playerid, 0);Weitere Anpassungen (wegen 32 Bit Limit):
pHandy,
zu:
pHandy[32],if(SpielerInfo[i][pHandy] == Zahl)
zu:
if(!strcmp(SpielerInfo[i][pHandy], inputtext))
und drei Zeilen drüber das hier entfernen:
new Zahl = strval(inputtext);if(SpielerInfo[playerid][pHandy] == Zahl)
zu:
if(!strcmp(SpielerInfo[playerid][pHandy], inputtext))SpielerInfo[playerid][pHandy] = mysql_GetInt("accounts", "pHandy", "Name", SpielerInfo[playerid][pName]);
zu:
format(SpielerInfo[playerid][pHandy], 32, mysql_GetString("accounts", "pHandy", "Name", SpielerInfo[playerid][pName]));mysql_SetInt("accounts", "pHandy", SpielerInfo[playerid][pHandy], "Name", SpielerInfo[playerid][pName]);
zu:
mysql_SetString("accounts", "pHandy", SpielerInfo[playerid][pHandy], "Name", SpielerInfo[playerid][pName]);Außerdem überall wo "pHandy" in Nachrichten verwendet wird: %d zu %s ändern.
Und natürlich in der Datenbank (wichtig!!) pHandy von INT zu VARCHAR (32) ändern.
Dann klappt alles.